@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,222 @@
1
+ /**
2
+ * V1 / V4 — fast-endpoint and adaptive-hangover VAD tests.
3
+ *
4
+ * V1: when `fastEndpointEnabled` is true, the detector uses
5
+ * `fastPauseHangoverMs` instead of the conservative 220 ms default.
6
+ *
7
+ * V4: with `adaptiveHangoverScaleOnDrop` set, a sharp downward RMS
8
+ * trajectory (energy trailing off) collapses the pause hangover to the
9
+ * configured floor — the detector decides "you stopped talking" sooner
10
+ * when the audio confirms it.
11
+ */
12
+
13
+ import { describe, expect, it } from "vitest";
14
+ import type { PcmFrame, VadEvent } from "./types";
15
+ import { VadDetector, type VadLike } from "./vad";
16
+
17
+ const SR = 16_000;
18
+ const FRAME = 512;
19
+ const FRAME_MS = (FRAME / SR) * 1000; // 32 ms
20
+
21
+ /**
22
+ * Scripted Silero whose speech probability AND the input PCM RMS are
23
+ * scripted in lockstep. The V4 path reads `rms(window)` from the
24
+ * detector — so the input pcm samples must produce the desired RMS.
25
+ */
26
+ class ScriptedSileroWithEnergy implements VadLike {
27
+ readonly sampleRate = SR;
28
+ readonly windowSamples = FRAME;
29
+ resets = 0;
30
+ private idx = 0;
31
+ constructor(private readonly probs: readonly number[]) {}
32
+ async process(_window: Float32Array): Promise<number> {
33
+ const p = this.probs[this.idx] ?? this.probs[this.probs.length - 1] ?? 0;
34
+ this.idx++;
35
+ return p;
36
+ }
37
+ reset(): void {
38
+ this.resets++;
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Build a frame whose RMS is approximately `targetRms`. A constant-value
44
+ * PCM block has RMS = |value| — easiest scriptable shape.
45
+ */
46
+ function frameWithRms(targetRms: number, ts: number): PcmFrame {
47
+ const pcm = new Float32Array(FRAME);
48
+ for (let i = 0; i < FRAME; i++) pcm[i] = targetRms;
49
+ return { pcm, sampleRate: SR, timestampMs: ts };
50
+ }
51
+
52
+ async function runScript(
53
+ det: VadDetector,
54
+ rmsScript: readonly number[],
55
+ ): Promise<VadEvent[]> {
56
+ const events: VadEvent[] = [];
57
+ det.onVadEvent((e) => events.push(e));
58
+ let ts = 1000;
59
+ for (const r of rmsScript) {
60
+ await det.pushFrame(frameWithRms(r, ts));
61
+ ts += FRAME_MS;
62
+ }
63
+ await det.flush();
64
+ return events;
65
+ }
66
+
67
+ describe("V1 — fast-endpoint pause hangover", () => {
68
+ it("uses fastPauseHangoverMs when fastEndpointEnabled=true", async () => {
69
+ // 3 speech windows, then silence. With fast=100 ms and FRAME=32 ms,
70
+ // pause fires after ceil(100/32) ≈ 4 silence windows.
71
+ const probs = [
72
+ 0.9, 0.9, 0.9, 0.9, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
73
+ ];
74
+ const det = new VadDetector(new ScriptedSileroWithEnergy(probs), {
75
+ onsetThreshold: 0.5,
76
+ pauseHangoverMs: 220,
77
+ fastPauseHangoverMs: 100,
78
+ fastEndpointEnabled: true,
79
+ endHangoverMs: 700,
80
+ minSpeechMs: 1,
81
+ activeHeartbeatMs: 10_000,
82
+ // Disable V4 so this test isolates V1.
83
+ adaptiveHangoverScaleOnDrop: 1,
84
+ });
85
+ const events = await runScript(
86
+ det,
87
+ [
88
+ 0.4, 0.4, 0.4, 0.4, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
89
+ 0.001,
90
+ ],
91
+ );
92
+ const pauseIndex = events.findIndex((e) => e.type === "speech-pause");
93
+ expect(pauseIndex).toBeGreaterThanOrEqual(0);
94
+ const pause = events[pauseIndex];
95
+ if (pause.type !== "speech-pause") throw new Error("type narrow failed");
96
+ // Pause fired after ~4 silence windows (~128 ms), well under the
97
+ // legacy 220 ms hangover.
98
+ expect(pause.pauseDurationMs).toBeLessThan(200);
99
+ expect(pause.pauseDurationMs).toBeGreaterThan(80);
100
+ });
101
+
102
+ it("uses the conservative pauseHangoverMs when fastEndpointEnabled=false", async () => {
103
+ const probs = [
104
+ 0.9, 0.9, 0.9, 0.9, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
105
+ 0.05,
106
+ ];
107
+ const det = new VadDetector(new ScriptedSileroWithEnergy(probs), {
108
+ onsetThreshold: 0.5,
109
+ pauseHangoverMs: 220,
110
+ fastPauseHangoverMs: 100,
111
+ fastEndpointEnabled: false,
112
+ endHangoverMs: 700,
113
+ minSpeechMs: 1,
114
+ activeHeartbeatMs: 10_000,
115
+ adaptiveHangoverScaleOnDrop: 1,
116
+ });
117
+ const events = await runScript(
118
+ det,
119
+ [
120
+ 0.4, 0.4, 0.4, 0.4, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
121
+ 0.001, 0.001, 0.001,
122
+ ],
123
+ );
124
+ const pause = events.find((e) => e.type === "speech-pause");
125
+ expect(pause).toBeDefined();
126
+ if (pause?.type !== "speech-pause") throw new Error("missing");
127
+ // Pause fired only after >= 220 ms (7 silence windows = ~224 ms).
128
+ expect(pause.pauseDurationMs).toBeGreaterThanOrEqual(220);
129
+ });
130
+ });
131
+
132
+ describe("V4 — adaptive hangover on sharp RMS drop", () => {
133
+ it("collapses the pause hangover when RMS trails off sharply", async () => {
134
+ // Probability tells the speech state machine "still speaking" /
135
+ // "below offset"; the RMS shape decides whether V4 fires. Probs:
136
+ // start speaking, three windows below offset threshold (so the
137
+ // detector enters its "trailing off" window). RMS shape: high, high,
138
+ // high, then a sharp drop across the last three windows.
139
+ const probs = [0.9, 0.9, 0.9, 0.3, 0.3, 0.3, 0.05, 0.05, 0.05, 0.05];
140
+ const det = new VadDetector(new ScriptedSileroWithEnergy(probs), {
141
+ onsetThreshold: 0.5,
142
+ offsetThreshold: 0.35,
143
+ pauseHangoverMs: 400, // conservative; V4 should shorten it
144
+ fastEndpointEnabled: false,
145
+ endHangoverMs: 1500,
146
+ minSpeechMs: 1,
147
+ activeHeartbeatMs: 10_000,
148
+ adaptiveHangoverScaleOnDrop: 0.25, // collapse to 25% of base
149
+ adaptiveHangoverFloorMs: 50,
150
+ adaptiveHangoverDropThreshold: -0.02,
151
+ });
152
+ // RMS script — sharp drop across last three windows so the rolling
153
+ // window slope is well below -0.02.
154
+ const rmsScript = [
155
+ 0.3, 0.3, 0.3, 0.3, 0.2, 0.05, 0.001, 0.001, 0.001, 0.001,
156
+ ];
157
+ const events = await runScript(det, rmsScript);
158
+ const pause = events.find((e) => e.type === "speech-pause");
159
+ expect(pause).toBeDefined();
160
+ if (pause?.type !== "speech-pause") throw new Error("missing");
161
+ // Without V4 the pause would not fire until 400 ms (~12.5 windows).
162
+ // With V4 shortening to 100 ms (25% of 400), pause fires after ~3-4
163
+ // silence windows.
164
+ expect(pause.pauseDurationMs).toBeLessThan(400);
165
+ });
166
+
167
+ it("disables adaptive hangover when scaleOnDrop is 1.0", async () => {
168
+ // 3 speech windows + many silence windows — pause must wait the full
169
+ // 400 ms conservative hangover (≈13 silence windows at 32 ms each).
170
+ const probs = [
171
+ 0.9, 0.9, 0.9, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05,
172
+ 0.05, 0.05, 0.05, 0.05, 0.05,
173
+ ];
174
+ const det = new VadDetector(new ScriptedSileroWithEnergy(probs), {
175
+ onsetThreshold: 0.5,
176
+ offsetThreshold: 0.35,
177
+ pauseHangoverMs: 400,
178
+ fastEndpointEnabled: false,
179
+ endHangoverMs: 1500,
180
+ minSpeechMs: 1,
181
+ activeHeartbeatMs: 10_000,
182
+ // Adaptive disabled — pause must wait the full conservative 400 ms.
183
+ adaptiveHangoverScaleOnDrop: 1,
184
+ });
185
+ const rmsScript = [
186
+ 0.3, 0.3, 0.3, 0.2, 0.05, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
187
+ 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
188
+ ];
189
+ const events = await runScript(det, rmsScript);
190
+ const pause = events.find((e) => e.type === "speech-pause");
191
+ expect(pause).toBeDefined();
192
+ if (pause?.type !== "speech-pause") throw new Error("missing");
193
+ expect(pause.pauseDurationMs).toBeGreaterThanOrEqual(400);
194
+ });
195
+
196
+ it("respects the adaptiveHangoverFloorMs", async () => {
197
+ const probs = [0.9, 0.9, 0.9, 0.3, 0.3, 0.3, 0.05, 0.05, 0.05, 0.05];
198
+ const det = new VadDetector(new ScriptedSileroWithEnergy(probs), {
199
+ onsetThreshold: 0.5,
200
+ offsetThreshold: 0.35,
201
+ pauseHangoverMs: 400,
202
+ fastEndpointEnabled: false,
203
+ endHangoverMs: 1500,
204
+ minSpeechMs: 1,
205
+ activeHeartbeatMs: 10_000,
206
+ // Tiny scale + a floor — the effective hangover must be at least
207
+ // the floor.
208
+ adaptiveHangoverScaleOnDrop: 0.1,
209
+ adaptiveHangoverFloorMs: 64,
210
+ adaptiveHangoverDropThreshold: -0.02,
211
+ });
212
+ const rmsScript = [
213
+ 0.3, 0.3, 0.3, 0.3, 0.2, 0.05, 0.001, 0.001, 0.001, 0.001,
214
+ ];
215
+ const events = await runScript(det, rmsScript);
216
+ const pause = events.find((e) => e.type === "speech-pause");
217
+ expect(pause).toBeDefined();
218
+ if (pause?.type !== "speech-pause") throw new Error("missing");
219
+ // Floor is 64 ms (~2 windows). Pause shouldn't fire before that.
220
+ expect(pause.pauseDurationMs).toBeGreaterThanOrEqual(64);
221
+ });
222
+ });
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Voice-budget allocator — single arbiter of the co-resident memory budget
3
+ * for the whole voice + text bundle (text LM, drafter, ASR, TTS, embedding,
4
+ * VAD, wake-word, turn-detector, emotion classifier, speaker encoder).
5
+ *
6
+ * Today's `ram-budget.ts` is per-tier: it decides whether ONE text bundle
7
+ * fits a host. `voice-budget.ts` is the cross-model layer the brief
8
+ * mandated in `.swarm/VOICE_WAVE_2.md` §H4 and R9 §4 — every model loader
9
+ * calls `reserve()` before it loads weights, releases on unload, and
10
+ * `reserve()` walks the residents under contention by eviction priority
11
+ * (cold → warm → hot) until the requested amount fits.
12
+ *
13
+ * Priorities (from R9 §4.1, mapped to `ResidentModelRole`):
14
+ *
15
+ * - **hot** (priority ≥ 40): `text-target`, `tts`, `asr` — never load
16
+ * on demand, never evicted before pressure-of-last-resort.
17
+ * - **warm** (priority 25–35): `vad`, `embedding` — may be evicted but
18
+ * reload is expensive.
19
+ * - **cold** (priority ≤ 20): `speaker-id` (18), `emotion` (15),
20
+ * `vision` (20), `drafter` (10) — load-on-demand; first to evict.
21
+ *
22
+ * Eviction policy: walk ascending priority (cheapest first) until enough
23
+ * memory has been reclaimed. The text target evicts only when it is
24
+ * literally the only resident role and pressure persists (matches
25
+ * `SharedResourceRegistry.evictLowestPriorityRole` semantics).
26
+ *
27
+ * The allocator is **memory-only** — it does not load weights. The caller
28
+ * (TTS engine, ASR loader, etc.) holds the typed reservation and runs
29
+ * `release()` on unload.
30
+ *
31
+ * Wire-up plan (handed to follow-up commits, NOT done by I9):
32
+ * - `ffi-streaming-backend.ts` → `reserve(role="text-target")` + `reserve(role="drafter")` at spawn.
33
+ * - `voice/pipeline.ts` → `reserve(role="tts", bytes=transientPeakMb*MB)` per synth.
34
+ * - `voice/wake-word.ts`, `vad.ts`, `eot-classifier.ts` → reserve at session arm.
35
+ * - I2/I3 add `emotion` + `speaker-id` reservations when those models register.
36
+ *
37
+ * NOTE: the wire-up is intentionally separate from the allocator
38
+ * implementation because the in-flight I-agents (I1/I2/I3/I5) own those
39
+ * loader files and we must not race their edits. The allocator + the
40
+ * `evictionPriority` hooks are in place; the loaders adopt it as they
41
+ * land.
42
+ */
43
+ import { type DeviceTier, type DeviceTierAssessment } from "../device-tier";
44
+ import type { HardwareProbe } from "../types";
45
+ import { type ResidentModelRole } from "./shared-resources";
46
+ /** Coarse priority class consumed by `reserve()`. Internally we map this
47
+ * back to the per-role priority number in `RESIDENT_ROLE_PRIORITY`. */
48
+ export type AllocationPriority = "hot" | "warm" | "cold";
49
+ export declare function priorityClassForRole(role: ResidentModelRole): AllocationPriority;
50
+ export interface BudgetReservation {
51
+ readonly id: string;
52
+ readonly role: ResidentModelRole;
53
+ readonly bytes: number;
54
+ readonly priority: AllocationPriority;
55
+ /** Per-role priority number (R9 §4.1 / `RESIDENT_ROLE_PRIORITY`). */
56
+ readonly priorityRank: number;
57
+ /** Idempotent. Multi-release is a no-op (release happens from teardown
58
+ * paths that may race). */
59
+ release(): void;
60
+ }
61
+ /** Diagnostic snapshot row for `VoiceBudget.snapshot()`. */
62
+ export interface ReservationSnapshot {
63
+ id: string;
64
+ role: ResidentModelRole;
65
+ bytes: number;
66
+ priority: AllocationPriority;
67
+ priorityRank: number;
68
+ }
69
+ export declare class BudgetExhaustedError extends Error {
70
+ readonly code = "voice-budget-exhausted";
71
+ readonly details: {
72
+ requestedBytes: number;
73
+ freeBytes: number;
74
+ totalBytes: number;
75
+ role: ResidentModelRole;
76
+ priority: AllocationPriority;
77
+ evictedRoles: ReadonlyArray<ResidentModelRole>;
78
+ evictionCandidate: ResidentModelRole | null;
79
+ };
80
+ constructor(details: BudgetExhaustedError["details"]);
81
+ }
82
+ export interface VoiceBudget {
83
+ /**
84
+ * Reserve `bytes` for `modelId` with `priority`. Returns a handle the
85
+ * caller MUST `.release()` to give the memory back. Throws
86
+ * `BudgetExhaustedError` when the requested amount cannot fit even after
87
+ * evicting every available lower-priority reservation.
88
+ *
89
+ * `evictHook` is optional: when present, the allocator will call it for
90
+ * each role that needs to be evicted (one at a time, ascending priority)
91
+ * before recording the new reservation. When omitted, the allocator just
92
+ * walks its own internal table — the caller is expected to drive the
93
+ * actual weight unload (the loader/eviction path lives in the model's
94
+ * own service, not here).
95
+ */
96
+ reserve(args: {
97
+ modelId: string;
98
+ role: ResidentModelRole;
99
+ bytes: number;
100
+ /** Optional; defaults to `priorityClassForRole(role)`. */
101
+ priority?: AllocationPriority;
102
+ /** Optional eviction callback. When provided, called once per evicted
103
+ * role in ascending-priority order before the new reservation is
104
+ * recorded. The callback should drop the weights and return the
105
+ * bytes actually reclaimed (must be >= the reservation's recorded
106
+ * bytes). When omitted, the allocator only drops the internal
107
+ * reservation entry (eviction-by-accounting). */
108
+ evictHook?: (role: ResidentModelRole, id: string) => Promise<number>;
109
+ }): Promise<BudgetReservation>;
110
+ /** Best-effort current free budget, in bytes. */
111
+ freeBytes(): number;
112
+ /** Total budget on this device, in bytes. */
113
+ totalBytes(): number;
114
+ /** All current reservations, ordered by priority ascending. */
115
+ snapshot(): ReadonlyArray<ReservationSnapshot>;
116
+ /** The tier this budget was sized to. */
117
+ tier(): DeviceTier;
118
+ /** The original assessment. */
119
+ assessment(): DeviceTierAssessment;
120
+ }
121
+ /**
122
+ * Co-resident voice-ensemble RSS estimate in MB. Sourced from R9 §2.3,
123
+ * keyed off the LM-tier slot (the text model that anchors the bundle).
124
+ *
125
+ * Each row is the steady-state weights + KV at default context for the
126
+ * whole voice + text bundle running at once:
127
+ *
128
+ * LM + LM KV + drafter + TTS (omnivoice base + tokenizer or kokoro-q8) +
129
+ * ASR + ASR mmproj + embedding + VAD + wake-word + turn-detector +
130
+ * emotion classifier + speaker encoder.
131
+ *
132
+ * The `transientTtsBufferMb` field is the OmniVoice MaskGIT decode peak
133
+ * (~1.17 GB measured on Metal). Backends that don't run OmniVoice locally
134
+ * (kokoro-only, cloud TTS) have a much smaller transient — kept at 100 MB
135
+ * to leave room for kokoro's ONNX compute path. Mobile defaults to no
136
+ * local TTS, so transient = 0.
137
+ *
138
+ * The figures are MEASURED on-disk (Q4_K_M GGUFs in
139
+ * `<stateDir>/local-inference/models/eliza-1-{0_8b,2b}.bundle/`) plus
140
+ * model-card sizes for VAD, wake-word, turn-detector, emotion, speaker-id.
141
+ * See R9 §2.1 + §2.2 + §2.3 for the per-component breakdown.
142
+ */
143
+ export interface VoiceEnsembleBudget {
144
+ readonly tierSlot: VoiceTierSlot;
145
+ readonly lmMb: number;
146
+ readonly lmKvMb: number;
147
+ readonly drafterMb: number;
148
+ readonly ttsMb: number;
149
+ readonly asrMb: number;
150
+ readonly asrMmprojMb: number;
151
+ readonly embeddingMb: number;
152
+ readonly vadMb: number;
153
+ readonly wakeWordMb: number;
154
+ readonly turnDetectorMb: number;
155
+ readonly emotionMb: number;
156
+ readonly speakerEncoderMb: number;
157
+ readonly transientTtsBufferMb: number;
158
+ /** Sum of weights + KV (steady-state). Excludes transient TTS buffer. */
159
+ readonly steadyStateMb: number;
160
+ /** Sum of steady-state + transient TTS peak. */
161
+ readonly peakMb: number;
162
+ }
163
+ /**
164
+ * The voice ensemble's LM tier slot. We key the table off the LM size +
165
+ * the surrounding voice profile (mobile-cloud vs desktop-omnivoice) since
166
+ * the largest co-resident knob is the LM itself.
167
+ */
168
+ export type VoiceTierSlot = "mobile-0_8b" | "desktop-0_8b" | "desktop-2b" | "desktop-4b" | "workstation-9b" | "workstation-27b";
169
+ /** R9 §2.3 — measured co-resident bundle for every supported tier slot. */
170
+ export declare const VOICE_ENSEMBLE_BUDGETS: Readonly<Record<VoiceTierSlot, VoiceEnsembleBudget>>;
171
+ /**
172
+ * Estimate the full voice ensemble's peak resident MB for a tier slot.
173
+ * `assertVoiceBundleFitsHost` consults this against the device's host RAM.
174
+ */
175
+ export declare function voiceEnsemblePeakMb(slot: VoiceTierSlot): number;
176
+ /** Sum of weights + KV (steady-state, excludes transient TTS buffer). */
177
+ export declare function voiceEnsembleSteadyStateMb(slot: VoiceTierSlot): number;
178
+ /**
179
+ * Pick the canonical voice-tier slot for an installed text model + device
180
+ * tier. The LM size anchors the slot (`eliza-1-0_8b` → `0_8b`, `2b` → `2b`,
181
+ * …) and the device tier picks `mobile-` vs `desktop-` vs `workstation-`
182
+ * for the voice surrounding it. Mobile always pulls the `mobile-0_8b` slot
183
+ * because the brief defaults mobile to cloud TTS+ASR; only the 0.8B local
184
+ * LM stays available there.
185
+ */
186
+ export declare function pickVoiceTierSlot(args: {
187
+ textModelId: string;
188
+ deviceTier: DeviceTier;
189
+ mobile?: boolean;
190
+ }): VoiceTierSlot;
191
+ /**
192
+ * Decision returned by `assertVoiceBundleFitsHost`. Mirrors the shape of
193
+ * `RamFitDecision` in `ram-budget.ts` but at the bundle level.
194
+ */
195
+ export interface VoiceBundleFitDecision {
196
+ tierSlot: VoiceTierSlot;
197
+ deviceTier: DeviceTier;
198
+ /** Steady-state weights + KV, MB. */
199
+ steadyStateMb: number;
200
+ /** Steady-state + transient TTS peak, MB. */
201
+ peakMb: number;
202
+ /** RAM available to the bundle (host MB - OS reserve). */
203
+ usableMb: number;
204
+ /** True iff `peakMb <= usableMb` AND `steadyStateMb <= usableMb`. */
205
+ fits: boolean;
206
+ /** "fits" when peak fits, "tight" when only steady-state fits, "wontfit"
207
+ * when not even steady-state fits. */
208
+ level: "fits" | "tight" | "wontfit";
209
+ }
210
+ /** Default OS reserve subtracted from the host before the bundle check. */
211
+ export declare const DEFAULT_VOICE_BUNDLE_RESERVE_MB = 1536;
212
+ /**
213
+ * Decide whether the whole voice ensemble fits a host. Used by the runtime
214
+ * at voice-session-start to refuse local-voice entry rather than start it
215
+ * and watch `MemoryMonitor` evict the loaders mid-session.
216
+ *
217
+ * `assertVoiceBundleFitsHost` (in `active-model.ts`) wraps this with a
218
+ * typed error. This function returns the raw decision so callers that want
219
+ * to degrade silently can do so. R9 §1.4 spec.
220
+ */
221
+ export declare function assessVoiceBundleFits(args: {
222
+ tierSlot: VoiceTierSlot;
223
+ deviceTier: DeviceTier;
224
+ hostRamMb: number;
225
+ reserveMb?: number;
226
+ }): VoiceBundleFitDecision;
227
+ /** Public factory. */
228
+ export declare function createVoiceBudget(args: {
229
+ probe: HardwareProbe;
230
+ /** Optional user override for the budget cap, in MB. Default: tier
231
+ * natural total. Clamped to the device's effective model memory. */
232
+ maxRamMb?: number;
233
+ /** Optional pre-computed assessment (avoid double classification). */
234
+ assessment?: DeviceTierAssessment;
235
+ }): VoiceBudget;
236
+ /** Test seam — construct a budget with explicit total bytes + assessment. */
237
+ export declare function createVoiceBudgetForTest(args: {
238
+ totalBytes: number;
239
+ assessment: DeviceTierAssessment;
240
+ }): VoiceBudget;
241
+ //# sourceMappingURL=voice-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-budget.d.ts","sourceRoot":"","sources":["voice-budget.ts"],"names":[],"mappings":"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"}