@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,566 @@
1
+ /**
2
+ * LiveKit turn-detector — GGUF-backed binding (J1.d).
3
+ *
4
+ * The text-side turn-completion classifier formats the latest partial
5
+ * user transcript with the Qwen chat template, strips the trailing
6
+ * `<|im_end|>`, and reads `P(<|im_end|>)` from the next-token
7
+ * distribution. The upstream `livekit/turn-detector` ships an ONNX
8
+ * graph; this binding consumes the **GGUF** export published at
9
+ * `elizaos/eliza-1` under `voice/turn-detector/onnx/turn-detector-en-q8.gguf`
10
+ * (and the multilingual variant at
11
+ * `voice/turn/intl/turn-detector-intl-q8.gguf`), running through the
12
+ * canonical fork wrapper `capacitor-llama` (per
13
+ * `plugins/plugin-local-inference/native/AGENTS.md` §1 — the npm
14
+ * `capacitor-llama` dep is the elizaOS fork's republish, binding to the
15
+ * fork's `libllama`).
16
+ *
17
+ * Why this exists: per I1's single-runtime audit
18
+ * (`.swarm/impl/I1-single-runtime.md` §B), the turn-detector was the
19
+ * cheapest of the four remaining ONNX surfaces to retire — the GGUF
20
+ * artifact was already published by H4 (see commit history), and the
21
+ * detector's architecture (Qwen2-style small decoder + classification
22
+ * head on the `<|im_end|>` logit) is exactly what `LLM_ARCH_QWEN2`
23
+ * already implements in the fork. The work is wiring, not porting.
24
+ *
25
+ * No silent fallback (AGENTS.md §3): when `capacitor-llama` is
26
+ * unavailable, the GGUF is missing, or the model load fails, this
27
+ * class throws `EotGgmlUnavailableError` with a structured code. The
28
+ * resolver above this binding picks `HeuristicEotClassifier` or the
29
+ * legacy ONNX path; the binding itself never fabricates a probability.
30
+ *
31
+ * Tokenizer ownership: the GGUF carries its own tokenizer (BPE +
32
+ * special tokens, including `<|im_end|>`); this binding does NOT
33
+ * import `@huggingface/transformers`. The `apply_chat_template`
34
+ * formatting is re-implemented here using the same template upstream
35
+ * uses (single-turn user message wrapped in `<|im_start|>user\n... \n`)
36
+ * — see `applyQwenUserTemplate` below.
37
+ *
38
+ * --- Planned LoRA hot-swap path ---
39
+ *
40
+ * The LiveKit GGUF is a separate 66 MB (EN) or 396 MB (intl) resident
41
+ * model. The chat target model (eliza-1-{0_8b,2b,4b}) is already
42
+ * loaded for conversation — its next-token distribution after the
43
+ * chat-template-formatted partial transcript provides exactly the
44
+ * same `P(<|im_end|>)` signal. A LoRA adapter (rank 8, ~5-10 MB)
45
+ * trained on `(transcript, eot_label)` pairs can shape that signal
46
+ * to match or beat the LiveKit baseline.
47
+ *
48
+ * The training pipeline lives at
49
+ * `packages/training/scripts/voice/eot/RUNBOOK.md`. The publish gates
50
+ * (AUROC ≥ 0.85, ECE ≤ 0.05, p95 ≤ 50 ms) are in
51
+ * `packages/training/benchmarks/eot_gates.md`.
52
+ *
53
+ * Integration sketch (deferred — implement when an adapter ships):
54
+ *
55
+ * 1. Bundle ships `voice/eot-lora/eliza-1-<tier>-eot-lora.bin`
56
+ * alongside the chat target GGUF, with a manifest sidecar binding
57
+ * the adapter to the target's SHA256 (refuse to load if mismatched).
58
+ * 2. Runtime detects the adapter via the bundle catalog. When present
59
+ * AND the chat target is already loaded, the EOT resolver prefers
60
+ * LoRA hot-swap over standing up the LiveKit GGUF process.
61
+ * 3. The hot-swap path uses llama.cpp's `--lora` flag on the chat
62
+ * target. A single forward pass against the chat-template-formatted
63
+ * transcript yields the next-token logits; read `<|im_end|>`'s
64
+ * probability and return it.
65
+ * 4. Fail-closed: if adapter load fails or the SHA binding mismatches,
66
+ * throw `EotGgmlUnavailableError("model-load-failed", ...)`. No
67
+ * silent fallback to the un-adapted target (the un-adapted logits
68
+ * would be the chat-model's own prior, not a calibrated EOT
69
+ * classifier).
70
+ *
71
+ * Until that lands, this binding remains the canonical EOT path.
72
+ */
73
+
74
+ import { access } from "node:fs/promises";
75
+ import path from "node:path";
76
+ import { resolveStateDir } from "@elizaos/core";
77
+ import type { EotClassifier, VoiceTurnSignal } from "./eot-classifier";
78
+ import { turnSignalFromProbability } from "./eot-classifier";
79
+
80
+ // ---------------------------------------------------------------------------
81
+ // Errors
82
+ // ---------------------------------------------------------------------------
83
+
84
+ /** Raised when the GGUF binding cannot be loaded or scored. */
85
+ export class EotGgmlUnavailableError extends Error {
86
+ readonly code:
87
+ | "native-missing"
88
+ | "model-missing"
89
+ | "model-load-failed"
90
+ | "tokenizer-missing-im-end"
91
+ | "evaluate-failed"
92
+ | "invalid-input";
93
+ constructor(code: EotGgmlUnavailableError["code"], message: string) {
94
+ super(message);
95
+ this.name = "EotGgmlUnavailableError";
96
+ this.code = code;
97
+ }
98
+ }
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // HF asset constants
102
+ // ---------------------------------------------------------------------------
103
+
104
+ /** HF mono-repo holding every voice sub-model. */
105
+ export const LIVEKIT_TURN_DETECTOR_HF_REPO = "elizaos/eliza-1";
106
+
107
+ /** Canonical English GGUF asset path inside the bundle. */
108
+ export const DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_EN =
109
+ "voice/turn-detector/onnx/turn-detector-en-q8.gguf";
110
+
111
+ /** Canonical multilingual GGUF asset path inside the bundle. */
112
+ export const DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_INTL =
113
+ "voice/turn/intl/turn-detector-intl-q8.gguf";
114
+
115
+ /** Special-token literal the detector reads the probability of. */
116
+ export const LIVEKIT_IM_END_TOKEN = "<|im_end|>";
117
+
118
+ /**
119
+ * Default on-disk location for the staged GGUF. The bundle downloader
120
+ * materializes assets under `<stateDir>/local-inference/models/...`; this
121
+ * matches the bundle downloader's staged-asset path layout.
122
+ */
123
+ export const DEFAULT_LIVEKIT_TURN_DETECTOR_GGML_DIR = path.join(
124
+ resolveStateDir(),
125
+ "local-inference",
126
+ "models",
127
+ "turn-detector",
128
+ "livekit-turn-detector",
129
+ );
130
+
131
+ /**
132
+ * Resolve which GGUF variant a given Eliza-1 tier should bundle.
133
+ * Mirrors `turnDetectorRevisionForTier` in `eot-classifier.ts` —
134
+ * mobile tiers get the English-only ~40 MB Q8 GGUF, desktop tiers
135
+ * get the multilingual ~280 MB Q8 GGUF.
136
+ *
137
+ * Accepts both bare tier ids (`"4b"`) and prefixed catalog ids
138
+ * (`"eliza-1-4b"`).
139
+ */
140
+ export function turnDetectorGgufForTier(tierId: string): {
141
+ hfPath: string;
142
+ variant: "en" | "intl";
143
+ } {
144
+ const bare = tierId.startsWith("eliza-1-")
145
+ ? tierId.slice("eliza-1-".length)
146
+ : tierId;
147
+ if (bare === "0_8b" || bare === "2b") {
148
+ return {
149
+ hfPath: DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_EN,
150
+ variant: "en",
151
+ };
152
+ }
153
+ return {
154
+ hfPath: DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_INTL,
155
+ variant: "intl",
156
+ };
157
+ }
158
+
159
+ // ---------------------------------------------------------------------------
160
+ // Legacy llama.cpp controlled-evaluate surface (held over from the removed
161
+ // node-llama-cpp binding). The shapes below describe the API the GGUF-backed
162
+ // LiveKit detector needs (controlledEvaluate → next-token probability map).
163
+ // Until capacitor-llama / the bun:ffi shim expose an equivalent entry point,
164
+ // `loadNlc()` throws and the resolver above falls back to HeuristicEotClassifier.
165
+ // ---------------------------------------------------------------------------
166
+
167
+ interface NlcModule {
168
+ getLlama(opts?: {
169
+ gpu?: false | "auto" | "metal" | "cuda" | "vulkan";
170
+ logLevel?: string;
171
+ }): Promise<NlcLlama>;
172
+ }
173
+
174
+ interface NlcLlama {
175
+ loadModel(opts: {
176
+ modelPath: string;
177
+ gpuLayers?: number | "max" | "auto";
178
+ }): Promise<NlcLlamaModel>;
179
+ }
180
+
181
+ interface NlcLlamaModel {
182
+ tokenize(text: string, specialTokens?: boolean): number[];
183
+ detokenize(tokens: readonly number[], specialTokens?: boolean): string;
184
+ createContext(opts?: {
185
+ contextSize?: number | "auto";
186
+ batchSize?: number;
187
+ threads?: number;
188
+ }): Promise<NlcLlamaContext>;
189
+ dispose(): Promise<void>;
190
+ }
191
+
192
+ interface NlcLlamaContext {
193
+ getSequence(): NlcLlamaSequence;
194
+ dispose(): Promise<void>;
195
+ }
196
+
197
+ interface NlcControlledIndexOutput {
198
+ next: {
199
+ token?: number | null;
200
+ confidence?: number;
201
+ probabilities?: Map<number, number>;
202
+ };
203
+ }
204
+
205
+ interface NlcLlamaSequence {
206
+ controlledEvaluate(
207
+ input: ReadonlyArray<
208
+ | number
209
+ | [
210
+ number,
211
+ {
212
+ generateNext?: {
213
+ probabilities?: boolean;
214
+ confidence?: boolean;
215
+ token?: boolean;
216
+ };
217
+ },
218
+ ]
219
+ >,
220
+ opts?: unknown,
221
+ ): Promise<ReadonlyArray<NlcControlledIndexOutput | undefined>>;
222
+ clearHistory(): Promise<void>;
223
+ dispose?(): Promise<void>;
224
+ }
225
+
226
+ async function loadNlc(): Promise<NlcModule> {
227
+ // The legacy `node-llama-cpp` binding (now removed) exposed
228
+ // `LlamaContextSequence.controlledEvaluate({ generateNext: { probabilities:
229
+ // true } })` to read the next-token probability distribution after a
230
+ // truncated prompt. The current `capacitor-llama` adapter and the desktop
231
+ // bun:ffi shim do not expose an equivalent (both surface `completion()`,
232
+ // which consumes tokens rather than returning a logit map without sampling).
233
+ //
234
+ // The resolver above this binding (`tryBuildEliza1EotClassifier`) is gated
235
+ // on the dispatcher's active backend and model pointer, so this path is
236
+ // only reached if a caller bypasses the resolver. Throwing here
237
+ // keeps fail-closed semantics: the binding never fabricates a probability.
238
+ throw new EotGgmlUnavailableError(
239
+ "native-missing",
240
+ "[eot-ggml] the active llama.cpp adapter (capacitor-llama / bun:ffi shim) does not expose a controlled-evaluate API for next-token probabilities. Use HeuristicEotClassifier until the shim exposes `llama_get_logits_ith`.",
241
+ );
242
+ }
243
+
244
+ async function getLlama(): Promise<NlcLlama> {
245
+ // Unreachable while loadNlc() throws — kept so the signature still
246
+ // satisfies the call sites below.
247
+ await loadNlc();
248
+ throw new EotGgmlUnavailableError(
249
+ "native-missing",
250
+ "[eot-ggml] llama runtime unavailable",
251
+ );
252
+ }
253
+
254
+ // ---------------------------------------------------------------------------
255
+ // Construction options
256
+ // ---------------------------------------------------------------------------
257
+
258
+ export interface LiveKitGgmlTurnDetectorOptions {
259
+ /** Absolute path to the GGUF file. Required. */
260
+ ggufPath: string;
261
+ /**
262
+ * Upstream revision tag for telemetry only (`"v1.2.2-en"` /
263
+ * `"v0.4.1-intl"`). Does not affect inference.
264
+ */
265
+ revision?: string;
266
+ /** Max history tokens after Qwen-template wrapping. Default: 128. */
267
+ maxHistoryTokens?: number;
268
+ /** Optional model label for telemetry. */
269
+ model?: string;
270
+ /** Optional thread count for the context. Default: 2. */
271
+ threads?: number;
272
+ }
273
+
274
+ // ---------------------------------------------------------------------------
275
+ // Detector
276
+ // ---------------------------------------------------------------------------
277
+
278
+ /**
279
+ * Local GGUF-backed LiveKit turn-detector. Uses a `capacitor-llama`
280
+ * evaluation of the Qwen2-style decoder, reading `P(<|im_end|>)` from the
281
+ * next-token distribution after the truncated user-template prefix.
282
+ *
283
+ * One detector instance owns one `LlamaModel` + one `LlamaContext` +
284
+ * one `LlamaSequence`. `score()` resets the sequence between calls —
285
+ * the detector is intentionally stateless (no carried context across
286
+ * different user transcripts).
287
+ */
288
+ export class LiveKitGgmlTurnDetector implements EotClassifier {
289
+ readonly ggufPath: string;
290
+ private readonly maxHistoryTokens: number;
291
+ private readonly model: string;
292
+ private readonly revision: string | undefined;
293
+ private readonly threads: number;
294
+ private ready: Promise<{
295
+ llamaModel: NlcLlamaModel;
296
+ context: NlcLlamaContext;
297
+ sequence: NlcLlamaSequence;
298
+ imEndTokenId: number;
299
+ }> | null = null;
300
+
301
+ constructor(opts: LiveKitGgmlTurnDetectorOptions) {
302
+ if (typeof opts.ggufPath !== "string" || opts.ggufPath.length === 0) {
303
+ throw new EotGgmlUnavailableError(
304
+ "invalid-input",
305
+ "[eot-ggml] ggufPath is required",
306
+ );
307
+ }
308
+ this.ggufPath = opts.ggufPath;
309
+ this.maxHistoryTokens = opts.maxHistoryTokens ?? 128;
310
+ this.revision = opts.revision;
311
+ this.threads = opts.threads ?? 2;
312
+ this.model =
313
+ opts.model ??
314
+ (opts.revision
315
+ ? `${LIVEKIT_TURN_DETECTOR_HF_REPO}@${opts.revision}`
316
+ : LIVEKIT_TURN_DETECTOR_HF_REPO);
317
+ }
318
+
319
+ async score(partialTranscript: string): Promise<number> {
320
+ return (await this.signal(partialTranscript)).endOfTurnProbability;
321
+ }
322
+
323
+ async signal(partialTranscript: string): Promise<VoiceTurnSignal> {
324
+ const started = performance.now();
325
+ const loaded = await this.load();
326
+ const transcript = normalizeTurnDetectorText(partialTranscript);
327
+ // Tokenize the user-templated transcript WITHOUT the trailing
328
+ // `<|im_end|>` (the head must score that token as the next one).
329
+ // We do not pass `specialTokens=true` for the user text itself —
330
+ // only the template wrappers themselves are special tokens.
331
+ const promptText = applyQwenUserTemplate(transcript);
332
+
333
+ // Tokenize: the template wrappers are special tokens; the GGUF's
334
+ // BPE handles the inner text. Passing `true` tells the tokenizer
335
+ // to recognize the `<|im_start|>` / `\n` literals as the real
336
+ // special-token ids. Truncate from the LEFT so the recent text
337
+ // is preserved.
338
+ let tokens = loaded.llamaModel.tokenize(promptText, true);
339
+ if (tokens.length > this.maxHistoryTokens) {
340
+ tokens = tokens.slice(tokens.length - this.maxHistoryTokens);
341
+ }
342
+ if (tokens.length === 0) {
343
+ throw new EotGgmlUnavailableError(
344
+ "evaluate-failed",
345
+ "[eot-ggml] tokenizer produced empty token list for transcript",
346
+ );
347
+ }
348
+
349
+ // Clear the sequence before each evaluation — turn detection is
350
+ // stateless per transcript.
351
+ await loaded.sequence.clearHistory();
352
+
353
+ // Feed every token, asking for the probability distribution only
354
+ // on the LAST one. That gives us P(token=<|im_end|>) after the
355
+ // truncated template prefix.
356
+ const lastIdx = tokens.length - 1;
357
+ const input = tokens.map((tok, i) =>
358
+ i === lastIdx
359
+ ? ([tok, { generateNext: { probabilities: true } }] as [
360
+ number,
361
+ { generateNext: { probabilities: boolean } },
362
+ ])
363
+ : tok,
364
+ );
365
+ const results = await loaded.sequence.controlledEvaluate(input);
366
+ const last = results[lastIdx];
367
+ const probs = last?.next.probabilities;
368
+ if (!probs) {
369
+ throw new EotGgmlUnavailableError(
370
+ "evaluate-failed",
371
+ "[eot-ggml] controlledEvaluate did not return probabilities for the last token",
372
+ );
373
+ }
374
+ const imEndProb = probs.get(loaded.imEndTokenId) ?? 0;
375
+
376
+ return turnSignalFromProbability({
377
+ probability: imEndProb,
378
+ transcript,
379
+ source: "livekit-turn-detector",
380
+ model: this.model,
381
+ latencyMs: performance.now() - started,
382
+ });
383
+ }
384
+
385
+ /** Release the underlying GGUF + context. Idempotent. */
386
+ async dispose(): Promise<void> {
387
+ const r = this.ready;
388
+ this.ready = null;
389
+ if (!r) return;
390
+ const loaded = await r.catch(() => null);
391
+ if (!loaded) return;
392
+ await loaded.sequence.dispose?.().catch(() => undefined);
393
+ await loaded.context.dispose().catch(() => undefined);
394
+ await loaded.llamaModel.dispose().catch(() => undefined);
395
+ }
396
+
397
+ private load(): Promise<{
398
+ llamaModel: NlcLlamaModel;
399
+ context: NlcLlamaContext;
400
+ sequence: NlcLlamaSequence;
401
+ imEndTokenId: number;
402
+ }> {
403
+ this.ready ??= this.loadInner();
404
+ return this.ready;
405
+ }
406
+
407
+ private async loadInner(): Promise<{
408
+ llamaModel: NlcLlamaModel;
409
+ context: NlcLlamaContext;
410
+ sequence: NlcLlamaSequence;
411
+ imEndTokenId: number;
412
+ }> {
413
+ try {
414
+ await access(this.ggufPath);
415
+ } catch {
416
+ throw new EotGgmlUnavailableError(
417
+ "model-missing",
418
+ `[eot-ggml] GGUF not found at ${this.ggufPath}. Stage it via the bundle downloader from ${LIVEKIT_TURN_DETECTOR_HF_REPO}.`,
419
+ );
420
+ }
421
+
422
+ const llama = await getLlama();
423
+ let llamaModel: NlcLlamaModel;
424
+ try {
425
+ llamaModel = await llama.loadModel({
426
+ modelPath: this.ggufPath,
427
+ gpuLayers: 0,
428
+ });
429
+ } catch (err) {
430
+ throw new EotGgmlUnavailableError(
431
+ "model-load-failed",
432
+ `[eot-ggml] loadModel failed for ${this.ggufPath}: ${err instanceof Error ? err.message : String(err)}`,
433
+ );
434
+ }
435
+
436
+ // Resolve the <|im_end|> token id from the GGUF's BPE tokenizer.
437
+ // Passing `specialTokens=true` tells the tokenizer to recognize
438
+ // the literal as the corresponding special token.
439
+ const imEndTokens = llamaModel.tokenize(LIVEKIT_IM_END_TOKEN, true);
440
+ if (imEndTokens.length !== 1) {
441
+ await llamaModel.dispose().catch(() => undefined);
442
+ throw new EotGgmlUnavailableError(
443
+ "tokenizer-missing-im-end",
444
+ `[eot-ggml] tokenizer produced ${imEndTokens.length} tokens for <|im_end|>; expected exactly 1. The GGUF's special-token table is missing the expected entry.`,
445
+ );
446
+ }
447
+ const imEndTokenId = imEndTokens[0];
448
+
449
+ let context: NlcLlamaContext;
450
+ try {
451
+ context = await llamaModel.createContext({
452
+ contextSize: Math.max(this.maxHistoryTokens, 256),
453
+ threads: this.threads,
454
+ });
455
+ } catch (err) {
456
+ await llamaModel.dispose().catch(() => undefined);
457
+ throw new EotGgmlUnavailableError(
458
+ "model-load-failed",
459
+ `[eot-ggml] createContext failed: ${err instanceof Error ? err.message : String(err)}`,
460
+ );
461
+ }
462
+
463
+ const sequence = context.getSequence();
464
+ return { llamaModel, context, sequence, imEndTokenId };
465
+ }
466
+ }
467
+
468
+ // ---------------------------------------------------------------------------
469
+ // Resolver
470
+ // ---------------------------------------------------------------------------
471
+
472
+ /**
473
+ * Resolve a `LiveKitGgmlTurnDetector` against the bundle's on-disk
474
+ * staging directory. Search order:
475
+ *
476
+ * 1. Explicit `opts.ggufPath`.
477
+ * 2. `ELIZA_TURN_DETECTOR_GGUF` env var.
478
+ * 3. `<modelDir>/<en GGUF name>` (the canonical layout for the
479
+ * bundle's English variant).
480
+ * 4. `<modelDir>/<intl GGUF name>` (multilingual).
481
+ *
482
+ * Returns `null` if no GGUF is found alongside the directory — the
483
+ * caller falls back to `HeuristicEotClassifier`.
484
+ */
485
+ export async function createBundledLiveKitGgmlTurnDetector(
486
+ opts: {
487
+ ggufPath?: string;
488
+ modelDir?: string;
489
+ revision?: string;
490
+ maxHistoryTokens?: number;
491
+ threads?: number;
492
+ } = {},
493
+ ): Promise<LiveKitGgmlTurnDetector | null> {
494
+ const candidates: string[] = [];
495
+
496
+ const envOverride = process.env.ELIZA_TURN_DETECTOR_GGUF;
497
+ if (opts.ggufPath) candidates.push(opts.ggufPath);
498
+ if (envOverride) candidates.push(envOverride);
499
+
500
+ const modelDir =
501
+ opts.modelDir ??
502
+ process.env.ELIZA_TURN_DETECTOR_MODEL_DIR ??
503
+ DEFAULT_LIVEKIT_TURN_DETECTOR_GGML_DIR;
504
+
505
+ // The on-disk staging layout mirrors the HF asset path, so the bundle
506
+ // downloader will materialize the GGUF at one of these locations.
507
+ candidates.push(
508
+ path.join(modelDir, "turn-detector-en-q8.gguf"),
509
+ path.join(modelDir, "turn-detector-intl-q8.gguf"),
510
+ path.join(modelDir, "onnx", "turn-detector-en-q8.gguf"),
511
+ path.join(modelDir, DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_EN),
512
+ path.join(modelDir, DEFAULT_LIVEKIT_TURN_DETECTOR_GGUF_INTL),
513
+ );
514
+
515
+ for (const candidate of candidates) {
516
+ try {
517
+ await access(candidate);
518
+ return new LiveKitGgmlTurnDetector({
519
+ ggufPath: candidate,
520
+ ...(opts.revision ? { revision: opts.revision } : {}),
521
+ ...(opts.maxHistoryTokens !== undefined
522
+ ? { maxHistoryTokens: opts.maxHistoryTokens }
523
+ : {}),
524
+ ...(opts.threads !== undefined ? { threads: opts.threads } : {}),
525
+ });
526
+ } catch {
527
+ // try next
528
+ }
529
+ }
530
+ return null;
531
+ }
532
+
533
+ // ---------------------------------------------------------------------------
534
+ // Helpers
535
+ // ---------------------------------------------------------------------------
536
+
537
+ /**
538
+ * Mirror of `normalizeTurnDetectorText` in `eot-classifier.ts`. The
539
+ * upstream LiveKit detector lowercases + strips most punctuation
540
+ * before tokenizing; we do the same so the two paths produce
541
+ * comparable readings.
542
+ */
543
+ function normalizeTurnDetectorText(text: string): string {
544
+ return text
545
+ .normalize("NFKC")
546
+ .toLowerCase()
547
+ .replace(/[^\p{L}\p{N}'\-\s]/gu, " ")
548
+ .replace(/\s+/g, " ")
549
+ .trim();
550
+ }
551
+
552
+ /**
553
+ * Apply the single-turn user Qwen chat template, omitting the trailing
554
+ * `<|im_end|>` so the detector head scores it as the next token.
555
+ *
556
+ * Upstream `livekit/turn-detector` formats:
557
+ *
558
+ * <|im_start|>user\n{transcript}<|im_end|>\n
559
+ *
560
+ * The detector strips the trailing `<|im_end|>\n` and reads
561
+ * `P(<|im_end|>)` after the user content. We emit the prefix exactly,
562
+ * stopping where the `<|im_end|>` would go.
563
+ */
564
+ export function applyQwenUserTemplate(transcript: string): string {
565
+ return `<|im_start|>user\n${transcript}`;
566
+ }