@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,316 @@
1
+ /**
2
+ * Optimistic prefill client (C7) — implements `/v1/prefill` against the
3
+ * llama.cpp REST API in three phases:
4
+ *
5
+ * Phase 1 — `slot/save`: snapshot the pre-user-message KV state so a
6
+ * rollback can restore it if speech continues (SPEECH_ACTIVE_REBOUND).
7
+ *
8
+ * Phase 2 — `POST /completion` with stream=false + cache_prompt=true:
9
+ * run the model's prefill over `partialText` without sampling any
10
+ * output tokens. This warms the KV cache so the subsequent real
11
+ * generation can skip one full prefill RTT.
12
+ *
13
+ * Phase 3 — `slot/save` again: snapshot the post-prefill KV state under a
14
+ * separate name. The voice state machine passes this handle to the
15
+ * verifier so generation resumes from the prefilled position.
16
+ *
17
+ * The upstream `/v1/prefill` endpoint is absent — the fork PR that
18
+ * adds it is tracked in `docs/eliza-1-optimistic-rollback.md`. Until it
19
+ * lands, phases 1–3 are emulated via the existing slot-save REST path. When
20
+ * the upstream endpoint ships the body of `prefillOptimistic` switches to a
21
+ * single REST call — callers see no signature change.
22
+ *
23
+ * Upstream endpoint contract: replace phases 2+3 with a single
24
+ * `POST /v1/prefill { slotId, partialText, eotProb }` once llama.cpp exposes
25
+ * it. That call must run the model prefill against `slotId`, save the resulting
26
+ * KV checkpoint, and return `{ handle, eotProb }`.
27
+ */
28
+
29
+ import { logger } from "@elizaos/core";
30
+ import type {
31
+ CheckpointHandle,
32
+ CheckpointManagerLike,
33
+ } from "./checkpoint-manager";
34
+ import type { ContextPartial } from "./eager-context-builder";
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Public types — match the task spec so existing callers are unaffected
38
+ // ---------------------------------------------------------------------------
39
+
40
+ /**
41
+ * Input contract for the optimistic prefill call. `partialText` is the
42
+ * current partial transcript; `eotProb` is the caller's estimate that the
43
+ * user has stopped speaking (from VAD hangover progress or the EOT classifier).
44
+ */
45
+ export interface PrefillOptimisticArgs {
46
+ /** Base URL of the llama-server (`http://host:port`). */
47
+ baseUrl: string;
48
+ /** Slot id pinning this conversation. */
49
+ slotId: string;
50
+ /** Partial transcript to prefill against. Non-empty. */
51
+ partialText: string;
52
+ /**
53
+ * Probability the partial is end-of-turn (0..1). Today recorded as
54
+ * telemetry only; once `/v1/prefill` lands the server uses it to decide
55
+ * whether to also kick the drafter inline.
56
+ */
57
+ eotProb: number;
58
+ /**
59
+ * Deterministic context from `EagerContextBuilder` (C3). Used to build the
60
+ * system prompt passed to the prefill `/completion` call so the KV cache
61
+ * covers both the system prompt and the partial transcript. Optional — when
62
+ * absent, only the partial transcript is prefilled.
63
+ */
64
+ context?: ContextPartial;
65
+ }
66
+
67
+ export interface PrefillOptimisticResult {
68
+ /**
69
+ * Handle to the POST-prefill KV snapshot. Pass to
70
+ * `CheckpointManager.restoreCheckpoint` on SPEECH_END so the verifier
71
+ * resumes from the prefilled position.
72
+ */
73
+ checkpointHandle: CheckpointHandle;
74
+ /**
75
+ * Approximate token count of the prefilled text. Derived from a rough
76
+ * whitespace tokenizer since the REST emulation path doesn't return a token count;
77
+ * once the upstream endpoint lands, the server returns the real count.
78
+ */
79
+ tokenCount: number;
80
+ /**
81
+ * Wall-clock milliseconds the prefill round-trip took (phases 1–3).
82
+ */
83
+ prefillMs: number;
84
+ /**
85
+ * Backend label. `slot-save-emulation` = pre-upstream emulation path;
86
+ * `prefill-v1` = native `/v1/prefill` endpoint.
87
+ */
88
+ backend: "slot-save-emulation" | "prefill-v1";
89
+ /**
90
+ * End-of-turn probability echoed back from the server. Today equals the
91
+ * caller's `eotProb` (the emulation path has nothing to refine it with); once the
92
+ * upstream endpoint lands, the server returns its own model estimate.
93
+ */
94
+ eotProb: number;
95
+ }
96
+
97
+ export interface PrefillOptimisticOptions {
98
+ checkpointManager: CheckpointManagerLike;
99
+ /**
100
+ * Name to use for the PRE-prefill snapshot (C1 — used by the rollback path
101
+ * on SPEECH_ACTIVE_REBOUND). Defaults to `pre-prefill`.
102
+ */
103
+ preCheckpointName?: string;
104
+ /**
105
+ * Name to use for the POST-prefill snapshot (the one the verifier starts
106
+ * from on SPEECH_END). Defaults to `post-prefill`.
107
+ */
108
+ postCheckpointName?: string;
109
+ /**
110
+ * Optional fetch implementation for tests. Defaults to global `fetch`.
111
+ */
112
+ fetchImpl?: typeof fetch;
113
+ /**
114
+ * Request timeout for the `/completion` prefill call (ms). Default 5 000 ms.
115
+ * The call is a no-sample prefill-only pass, so it should complete in
116
+ * O(transcript_tokens / throughput) — typically well under 1 s for short
117
+ * partials.
118
+ */
119
+ prefillTimeoutMs?: number;
120
+ }
121
+
122
+ const DEFAULT_PRE_CHECKPOINT_NAME = "pre-prefill";
123
+ const DEFAULT_POST_CHECKPOINT_NAME = "post-prefill";
124
+ const DEFAULT_PREFILL_TIMEOUT_MS = 5_000;
125
+
126
+ // ---------------------------------------------------------------------------
127
+ // Main function
128
+ // ---------------------------------------------------------------------------
129
+
130
+ /**
131
+ * Run the three-phase optimistic prefill and return a checkpoint handle for
132
+ * the post-prefill KV state.
133
+ *
134
+ * Voice state machine wiring:
135
+ * - Call on `PAUSE_TENTATIVE` entry with `eotProb` from the EOT classifier.
136
+ * - On `SPEECH_ACTIVE_REBOUND` (within rollback window): restore to the
137
+ * PRE-prefill checkpoint (C1 saved in phase 1) via the checkpoint manager.
138
+ * The post-prefill handle returned here is no longer needed.
139
+ * - On `SPEECH_END`: pass `result.checkpointHandle` to the verifier so it
140
+ * can resume generation from the prefilled KV state, saving one full
141
+ * prefill RTT.
142
+ */
143
+ export async function prefillOptimistic(
144
+ args: PrefillOptimisticArgs,
145
+ opts: PrefillOptimisticOptions,
146
+ ): Promise<PrefillOptimisticResult> {
147
+ assertPartialText(args.partialText);
148
+ assertEotProb(args.eotProb);
149
+ assertBaseUrl(args.baseUrl);
150
+
151
+ const startMs = Date.now();
152
+ const fetchImpl = opts.fetchImpl ?? fetch;
153
+ const preName = opts.preCheckpointName ?? DEFAULT_PRE_CHECKPOINT_NAME;
154
+ const postName = opts.postCheckpointName ?? DEFAULT_POST_CHECKPOINT_NAME;
155
+ const timeoutMs = opts.prefillTimeoutMs ?? DEFAULT_PREFILL_TIMEOUT_MS;
156
+
157
+ // ------------------------------------------------------------------
158
+ // Phase 1: snapshot pre-user-message KV state (rollback target for
159
+ // SPEECH_ACTIVE_REBOUND).
160
+ // ------------------------------------------------------------------
161
+ await opts.checkpointManager.saveCheckpoint(args.slotId, preName);
162
+
163
+ // ------------------------------------------------------------------
164
+ // Phase 2: POST to /completion with the partial text to warm the KV
165
+ // cache. We request max_tokens=0 / stream=false so the server
166
+ // only runs the prefill pass without sampling any tokens.
167
+ //
168
+ // Upstream replacement: use a single POST /v1/prefill once
169
+ // llama.cpp exposes that endpoint.
170
+ // ------------------------------------------------------------------
171
+ await runPrefillCompletion({
172
+ baseUrl: args.baseUrl,
173
+ partialText: args.partialText,
174
+ context: args.context,
175
+ timeoutMs,
176
+ fetchImpl,
177
+ });
178
+
179
+ // ------------------------------------------------------------------
180
+ // Phase 3: snapshot post-prefill KV state (the handle the verifier
181
+ // resumes from on SPEECH_END).
182
+ // ------------------------------------------------------------------
183
+ const postHandle = await opts.checkpointManager.saveCheckpoint(
184
+ args.slotId,
185
+ postName,
186
+ );
187
+
188
+ const prefillMs = Date.now() - startMs;
189
+ const tokenCount = estimateTokenCount(args.partialText);
190
+
191
+ return {
192
+ checkpointHandle: postHandle,
193
+ tokenCount,
194
+ prefillMs,
195
+ backend: "slot-save-emulation",
196
+ eotProb: args.eotProb,
197
+ };
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // Phase 2 helper — no-sample /completion call
202
+ // ---------------------------------------------------------------------------
203
+
204
+ interface RunPrefillCompletionOpts {
205
+ baseUrl: string;
206
+ partialText: string;
207
+ context?: ContextPartial;
208
+ timeoutMs: number;
209
+ fetchImpl: typeof fetch;
210
+ }
211
+
212
+ /**
213
+ * POST to `/completion` with `max_tokens: 0` to prefill the KV cache without
214
+ * decoding any output tokens. The system prompt is prepended from the
215
+ * deterministic context half (C3) when available.
216
+ *
217
+ * On HTTP error or timeout we swallow and log a warning — a prefill failure
218
+ * means the verifier will run a regular (non-prefilled) generation, not a
219
+ * crash. The checkpoint state is still valid (phase 1 snapshot is intact).
220
+ */
221
+ async function runPrefillCompletion(
222
+ opts: RunPrefillCompletionOpts,
223
+ ): Promise<void> {
224
+ const { baseUrl, partialText, context, timeoutMs, fetchImpl } = opts;
225
+
226
+ // Build the prompt: deterministic system blocks (if any) + partial transcript.
227
+ const systemText = context?.systemBlocks.filter(Boolean).join("\n\n") ?? "";
228
+ const historyLines = (context?.historyBlocks ?? [])
229
+ .map((h) => `${h.role === "user" ? "User" : "Assistant"}: ${h.content}`)
230
+ .join("\n");
231
+
232
+ const promptParts: string[] = [];
233
+ if (systemText) promptParts.push(systemText);
234
+ if (historyLines) promptParts.push(historyLines);
235
+ promptParts.push(`User: ${partialText}`);
236
+ const prompt = promptParts.join("\n\n");
237
+
238
+ const url = `${baseUrl.replace(/\/$/, "")}/completion`;
239
+ const body = {
240
+ prompt,
241
+ // Zero tokens — prefill only, no decode.
242
+ n_predict: 0,
243
+ // Prefill into the cached slot.
244
+ cache_prompt: true,
245
+ // No sampling needed.
246
+ stream: false,
247
+ };
248
+
249
+ const controller = new AbortController();
250
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
251
+ try {
252
+ const resp = await fetchImpl(url, {
253
+ method: "POST",
254
+ headers: { "Content-Type": "application/json" },
255
+ body: JSON.stringify(body),
256
+ signal: controller.signal,
257
+ });
258
+ if (!resp.ok) {
259
+ // Non-200 — prefill attempt failed, but we continue (phase 3 still runs).
260
+ // In the real `/v1/prefill` path the server would surface a clear error;
261
+ // for the emulation path we tolerate it.
262
+ logger.warn(
263
+ { status: resp.status },
264
+ "[prefill-client] /completion returned non-200 — continuing without prefill warm",
265
+ );
266
+ }
267
+ } catch (err) {
268
+ // Timeout or network failure — swallow.
269
+ const reason =
270
+ err instanceof Error && err.name === "AbortError"
271
+ ? "timeout"
272
+ : String(err);
273
+ logger.warn(
274
+ { reason },
275
+ "[prefill-client] /completion prefill failed — continuing without prefill warm",
276
+ );
277
+ } finally {
278
+ clearTimeout(timer);
279
+ }
280
+ }
281
+
282
+ // ---------------------------------------------------------------------------
283
+ // Helpers
284
+ // ---------------------------------------------------------------------------
285
+
286
+ /**
287
+ * Rough token-count estimator — whitespace word count. Replaced by the
288
+ * server-reported count once the upstream `/v1/prefill` endpoint lands.
289
+ */
290
+ function estimateTokenCount(text: string): number {
291
+ return text.trim().split(/\s+/).filter(Boolean).length;
292
+ }
293
+
294
+ function assertPartialText(s: string): void {
295
+ if (typeof s !== "string" || s.trim().length === 0) {
296
+ throw new TypeError(
297
+ `[prefill-client] partialText must be a non-empty string (got ${JSON.stringify(s)})`,
298
+ );
299
+ }
300
+ }
301
+
302
+ function assertEotProb(p: number): void {
303
+ if (typeof p !== "number" || !Number.isFinite(p) || p < 0 || p > 1) {
304
+ throw new TypeError(
305
+ `[prefill-client] eotProb must be a finite number in [0, 1] (got ${p})`,
306
+ );
307
+ }
308
+ }
309
+
310
+ function assertBaseUrl(url: string): void {
311
+ if (typeof url !== "string" || url.trim().length === 0) {
312
+ throw new TypeError(
313
+ `[prefill-client] baseUrl must be a non-empty string (got ${JSON.stringify(url)})`,
314
+ );
315
+ }
316
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Prefix-preserving TTS rollback queue for barge-in handling.
3
+ *
4
+ * When the user barges in mid-response, the naive approach drops ALL
5
+ * in-flight audio chunks. This queue does better: it tags each audio
6
+ * chunk with the token range it covers, and on barge-in retains chunks
7
+ * whose token range ends at or before the divergence point (the last
8
+ * committed token index when the barge-in fires).
9
+ *
10
+ * If the new user utterance continues the topic, audio up to the
11
+ * divergence point plays smoothly. Chunks for tokens past the divergence
12
+ * are dropped.
13
+ *
14
+ * Data model:
15
+ *
16
+ * TaggedAudioChunk — a PCM buffer paired with [start, end] token indices
17
+ * (inclusive) and its duration in milliseconds.
18
+ *
19
+ * PrefixPreservingQueue — ordered queue of TaggedAudioChunk. On barge-in
20
+ * with a given divergencePoint:
21
+ * keep when chunk.tokenRange[1] <= divergencePoint
22
+ * drop when chunk.tokenRange[0] > divergencePoint
23
+ * trim when chunk straddles the point (tokenRange[0] <= point
24
+ * but tokenRange[1] > point) — kept whole; the scheduler
25
+ * treats sub-phrase granularity as a best-effort approximation.
26
+ *
27
+ * The old `handleBargeIn` path (ring-buffer drain + full stop) remains
28
+ * active as a fallback when the queue is not wired (e.g. the backend
29
+ * emits chunks without token-range tags). When the queue IS wired, the
30
+ * scheduler calls `rollbackAt(divergencePoint)` instead of a plain drain,
31
+ * and replays the retained prefix into the sink before resuming.
32
+ */
33
+ export interface TaggedAudioChunk {
34
+ pcm: Float32Array;
35
+ /**
36
+ * Inclusive token-index range the audio chunk covers.
37
+ * [start, end] where start <= end. Both values are in the
38
+ * scheduler's token-index space (same as `Phrase.fromIndex` /
39
+ * `Phrase.toIndex`).
40
+ */
41
+ tokenRange: [number, number];
42
+ /**
43
+ * Wall-clock duration of this chunk in milliseconds, computed from
44
+ * `pcm.length / sampleRate * 1000`. Stored here so the queue can
45
+ * report total retained duration to telemetry without knowing the
46
+ * sample rate.
47
+ */
48
+ durationMs: number;
49
+ }
50
+ export interface RollbackResult {
51
+ /** Chunks retained (token range ends at or before divergencePoint). */
52
+ retained: TaggedAudioChunk[];
53
+ /** Chunks dropped (token range starts after divergencePoint). */
54
+ dropped: TaggedAudioChunk[];
55
+ /**
56
+ * Chunks that straddled the divergence point
57
+ * (started at or before, ended after) — kept in `retained` at phrase
58
+ * granularity. Callers can inspect this for telemetry.
59
+ */
60
+ straddled: TaggedAudioChunk[];
61
+ /** Sum of retained chunk durations in milliseconds. */
62
+ retainedDurationMs: number;
63
+ /** Sum of dropped chunk durations in milliseconds. */
64
+ droppedDurationMs: number;
65
+ }
66
+ /**
67
+ * Prefix-preserving audio chunk queue.
68
+ *
69
+ * Usage:
70
+ * 1. On each audio chunk arriving from the TTS backend, call `enqueue`.
71
+ * 2. On barge-in, call `rollbackAt(divergencePoint)` — returns the
72
+ * partition of retained vs dropped chunks. The caller replays the
73
+ * retained prefix into the audio sink and discards the rest.
74
+ * 3. Call `clear()` to reset (e.g. on a new turn).
75
+ *
76
+ * Thread-safety: single-threaded JS — no locking needed.
77
+ */
78
+ export declare class PrefixPreservingQueue {
79
+ private readonly chunks;
80
+ /** Number of chunks currently in the queue. */
81
+ get size(): number;
82
+ /**
83
+ * Add a tagged audio chunk to the tail of the queue. Chunks MUST be
84
+ * enqueued in token-range order (ascending `tokenRange[0]`) — the queue
85
+ * does not sort. Violations produce unspecified rollback behaviour.
86
+ */
87
+ enqueue(chunk: TaggedAudioChunk): void;
88
+ /**
89
+ * Partition the queue at `divergencePoint` (the last committed token
90
+ * index). Clears the queue and returns the three-way split.
91
+ *
92
+ * Decision per chunk:
93
+ * chunk.tokenRange[1] <= divergencePoint → retained (prefix)
94
+ * chunk.tokenRange[0] > divergencePoint → dropped (post-divergence)
95
+ * otherwise (straddle) → retained (best-effort)
96
+ *
97
+ * After this call the queue is empty. Callers should replay `retained`
98
+ * into the audio sink.
99
+ */
100
+ rollbackAt(divergencePoint: number): RollbackResult;
101
+ /**
102
+ * Drop all queued chunks without replaying any of them. Used by the
103
+ * hard-stop / full-cancel path as a fallback when the new utterance
104
+ * does not continue the topic.
105
+ */
106
+ clear(): TaggedAudioChunk[];
107
+ /**
108
+ * Peek at the current queue without modifying it (snapshot for
109
+ * telemetry / tests).
110
+ */
111
+ snapshot(): ReadonlyArray<TaggedAudioChunk>;
112
+ }
113
+ //# sourceMappingURL=prefix-preserving-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix-preserving-queue.d.ts","sourceRoot":"","sources":["prefix-preserving-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,YAAY,CAAC;IAClB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC9B,uEAAuE;IACvE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,iEAAiE;IACjE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B;;;;OAIG;IACH,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,uDAAuD;IACvD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IAEjD,+CAA+C;IAC/C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAItC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,cAAc;IAmCnD;;;;OAIG;IACH,KAAK,IAAI,gBAAgB,EAAE;IAK3B;;;OAGG;IACH,QAAQ,IAAI,aAAa,CAAC,gBAAgB,CAAC;CAG3C"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Prefix-preserving TTS rollback queue for barge-in handling.
3
+ *
4
+ * When the user barges in mid-response, the naive approach drops ALL
5
+ * in-flight audio chunks. This queue does better: it tags each audio
6
+ * chunk with the token range it covers, and on barge-in retains chunks
7
+ * whose token range ends at or before the divergence point (the last
8
+ * committed token index when the barge-in fires).
9
+ *
10
+ * If the new user utterance continues the topic, audio up to the
11
+ * divergence point plays smoothly. Chunks for tokens past the divergence
12
+ * are dropped.
13
+ *
14
+ * Data model:
15
+ *
16
+ * TaggedAudioChunk — a PCM buffer paired with [start, end] token indices
17
+ * (inclusive) and its duration in milliseconds.
18
+ *
19
+ * PrefixPreservingQueue — ordered queue of TaggedAudioChunk. On barge-in
20
+ * with a given divergencePoint:
21
+ * keep when chunk.tokenRange[1] <= divergencePoint
22
+ * drop when chunk.tokenRange[0] > divergencePoint
23
+ * trim when chunk straddles the point (tokenRange[0] <= point
24
+ * but tokenRange[1] > point) — kept whole; the scheduler
25
+ * treats sub-phrase granularity as a best-effort approximation.
26
+ *
27
+ * The old `handleBargeIn` path (ring-buffer drain + full stop) remains
28
+ * active as a fallback when the queue is not wired (e.g. the backend
29
+ * emits chunks without token-range tags). When the queue IS wired, the
30
+ * scheduler calls `rollbackAt(divergencePoint)` instead of a plain drain,
31
+ * and replays the retained prefix into the sink before resuming.
32
+ */
33
+
34
+ export interface TaggedAudioChunk {
35
+ pcm: Float32Array;
36
+ /**
37
+ * Inclusive token-index range the audio chunk covers.
38
+ * [start, end] where start <= end. Both values are in the
39
+ * scheduler's token-index space (same as `Phrase.fromIndex` /
40
+ * `Phrase.toIndex`).
41
+ */
42
+ tokenRange: [number, number];
43
+ /**
44
+ * Wall-clock duration of this chunk in milliseconds, computed from
45
+ * `pcm.length / sampleRate * 1000`. Stored here so the queue can
46
+ * report total retained duration to telemetry without knowing the
47
+ * sample rate.
48
+ */
49
+ durationMs: number;
50
+ }
51
+
52
+ export interface RollbackResult {
53
+ /** Chunks retained (token range ends at or before divergencePoint). */
54
+ retained: TaggedAudioChunk[];
55
+ /** Chunks dropped (token range starts after divergencePoint). */
56
+ dropped: TaggedAudioChunk[];
57
+ /**
58
+ * Chunks that straddled the divergence point
59
+ * (started at or before, ended after) — kept in `retained` at phrase
60
+ * granularity. Callers can inspect this for telemetry.
61
+ */
62
+ straddled: TaggedAudioChunk[];
63
+ /** Sum of retained chunk durations in milliseconds. */
64
+ retainedDurationMs: number;
65
+ /** Sum of dropped chunk durations in milliseconds. */
66
+ droppedDurationMs: number;
67
+ }
68
+
69
+ /**
70
+ * Prefix-preserving audio chunk queue.
71
+ *
72
+ * Usage:
73
+ * 1. On each audio chunk arriving from the TTS backend, call `enqueue`.
74
+ * 2. On barge-in, call `rollbackAt(divergencePoint)` — returns the
75
+ * partition of retained vs dropped chunks. The caller replays the
76
+ * retained prefix into the audio sink and discards the rest.
77
+ * 3. Call `clear()` to reset (e.g. on a new turn).
78
+ *
79
+ * Thread-safety: single-threaded JS — no locking needed.
80
+ */
81
+ export class PrefixPreservingQueue {
82
+ private readonly chunks: TaggedAudioChunk[] = [];
83
+
84
+ /** Number of chunks currently in the queue. */
85
+ get size(): number {
86
+ return this.chunks.length;
87
+ }
88
+
89
+ /**
90
+ * Add a tagged audio chunk to the tail of the queue. Chunks MUST be
91
+ * enqueued in token-range order (ascending `tokenRange[0]`) — the queue
92
+ * does not sort. Violations produce unspecified rollback behaviour.
93
+ */
94
+ enqueue(chunk: TaggedAudioChunk): void {
95
+ this.chunks.push(chunk);
96
+ }
97
+
98
+ /**
99
+ * Partition the queue at `divergencePoint` (the last committed token
100
+ * index). Clears the queue and returns the three-way split.
101
+ *
102
+ * Decision per chunk:
103
+ * chunk.tokenRange[1] <= divergencePoint → retained (prefix)
104
+ * chunk.tokenRange[0] > divergencePoint → dropped (post-divergence)
105
+ * otherwise (straddle) → retained (best-effort)
106
+ *
107
+ * After this call the queue is empty. Callers should replay `retained`
108
+ * into the audio sink.
109
+ */
110
+ rollbackAt(divergencePoint: number): RollbackResult {
111
+ const retained: TaggedAudioChunk[] = [];
112
+ const dropped: TaggedAudioChunk[] = [];
113
+ const straddled: TaggedAudioChunk[] = [];
114
+ let retainedDurationMs = 0;
115
+ let droppedDurationMs = 0;
116
+
117
+ for (const chunk of this.chunks) {
118
+ const [start, end] = chunk.tokenRange;
119
+ if (end <= divergencePoint) {
120
+ // Fully before or at the divergence point — keep.
121
+ retained.push(chunk);
122
+ retainedDurationMs += chunk.durationMs;
123
+ } else if (start > divergencePoint) {
124
+ // Fully after the divergence point — drop.
125
+ dropped.push(chunk);
126
+ droppedDurationMs += chunk.durationMs;
127
+ } else {
128
+ // Straddles the divergence point — keep at phrase granularity.
129
+ retained.push(chunk);
130
+ straddled.push(chunk);
131
+ retainedDurationMs += chunk.durationMs;
132
+ }
133
+ }
134
+
135
+ this.chunks.length = 0;
136
+ return {
137
+ retained,
138
+ dropped,
139
+ straddled,
140
+ retainedDurationMs,
141
+ droppedDurationMs,
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Drop all queued chunks without replaying any of them. Used by the
147
+ * hard-stop / full-cancel path as a fallback when the new utterance
148
+ * does not continue the topic.
149
+ */
150
+ clear(): TaggedAudioChunk[] {
151
+ const all = this.chunks.splice(0);
152
+ return all;
153
+ }
154
+
155
+ /**
156
+ * Peek at the current queue without modifying it (snapshot for
157
+ * telemetry / tests).
158
+ */
159
+ snapshot(): ReadonlyArray<TaggedAudioChunk> {
160
+ return this.chunks.slice();
161
+ }
162
+ }