@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,79 @@
1
+ /**
2
+ * Public barrel for the Kokoro-82M TTS adapter.
3
+ *
4
+ * External callers (the engine layer, the bench harness, tests) should
5
+ * import from `./kokoro` rather than reaching into individual files. The
6
+ * internal layout may change; this surface is stable.
7
+ */
8
+
9
+ export type { KokoroTtsBackendDeps } from "./kokoro-backend";
10
+ export { KokoroTtsBackend } from "./kokoro-backend";
11
+ export type { KokoroFfiRuntimeOptions } from "./kokoro-ffi-runtime";
12
+ export { KokoroFfiRuntime } from "./kokoro-ffi-runtime";
13
+ export type {
14
+ KokoroMockRuntimeOptions,
15
+ KokoroPythonRuntimeOptions,
16
+ KokoroRuntime,
17
+ KokoroRuntimeChunk,
18
+ KokoroRuntimeInputs,
19
+ } from "./kokoro-runtime";
20
+ export {
21
+ KOKORO_GGUF_REL_PATH,
22
+ KokoroMockRuntime,
23
+ KokoroPythonRuntime,
24
+ } from "./kokoro-runtime";
25
+ export type {
26
+ PhonemeStreamWindow,
27
+ StreamPhonemesOptions,
28
+ } from "./phoneme-stream";
29
+
30
+ export {
31
+ phonemizePhrase,
32
+ streamPhonemes,
33
+ } from "./phoneme-stream";
34
+ export {
35
+ FallbackG2PPhonemizer,
36
+ KOKORO_PAD_ID,
37
+ NpmPhonemizePhonemizer,
38
+ resolvePhonemizer,
39
+ } from "./phonemizer";
40
+ export type {
41
+ KokoroBackendDecision,
42
+ KokoroBackendId,
43
+ KokoroBackendInputs,
44
+ } from "./pick-runtime";
45
+ export {
46
+ pickKokoroRuntimeBackend,
47
+ readKokoroBackendFromEnv,
48
+ } from "./pick-runtime";
49
+ export type {
50
+ VoiceBackendChoice,
51
+ VoiceBackendDecision,
52
+ VoiceBackendInputs,
53
+ VoiceBackendMode,
54
+ } from "./runtime-selection";
55
+ export {
56
+ readVoiceBackendModeFromEnv,
57
+ selectVoiceBackend,
58
+ } from "./runtime-selection";
59
+ export type {
60
+ KokoroBackendOptions,
61
+ KokoroModelLayout,
62
+ KokoroPhonemeSequence,
63
+ KokoroPhonemizer,
64
+ KokoroVoiceId,
65
+ KokoroVoicePack,
66
+ } from "./types";
67
+ export {
68
+ KokoroModelMissingError,
69
+ KokoroPhonemizerError,
70
+ } from "./types";
71
+ export {
72
+ findKokoroVoice,
73
+ KOKORO_DEFAULT_VOICE_ID,
74
+ KOKORO_VOICE_PACKS,
75
+ listKokoroVoiceIds,
76
+ listKokoroVoicesByLang,
77
+ listKokoroVoicesByTag,
78
+ resolveKokoroVoiceOrDefault,
79
+ } from "./voices";
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Kokoro-82M TTS backend.
3
+ *
4
+ * Implements the same `OmniVoiceBackend + StreamingTtsBackend` seam that
5
+ * `FfiOmniVoiceBackend` (the OmniVoice path) satisfies, so a
6
+ * `VoiceScheduler` instance does not need to know which TTS family it is
7
+ * driving. The runtime selection layer (`runtime-selection.ts`) picks
8
+ * between this and `FfiOmniVoiceBackend` based on hardware tier and the
9
+ * caller's first-audio-latency target.
10
+ *
11
+ * The actual model inference is delegated to a `KokoroRuntime` instance
12
+ * (GGUF / mock) — this class owns:
13
+ * - phonemizer resolution + per-phrase phonemize call,
14
+ * - voice-pack resolution against `SpeakerPreset.voiceId`,
15
+ * - streaming-protocol bookkeeping (cancel signal polling, final tail).
16
+ *
17
+ * No fallback sludge: if the runtime is unavailable, the backend throws
18
+ * on first synthesis rather than emitting silent zero PCM (AGENTS.md §3).
19
+ */
20
+ import type { AudioChunk, OmniVoiceBackend, Phrase, SpeakerPreset, StreamingTtsBackend, TtsPcmChunk } from "../types";
21
+ import type { KokoroRuntime } from "./kokoro-runtime";
22
+ import type { KokoroBackendOptions } from "./types";
23
+ export interface KokoroTtsBackendDeps extends KokoroBackendOptions {
24
+ /** The concrete model runner. Wire `KokoroFfiRuntime` (in-process fused
25
+ * libelizainference) in production and `KokoroMockRuntime` in tests. */
26
+ runtime: KokoroRuntime;
27
+ }
28
+ /**
29
+ * `KokoroTtsBackend` is a streaming-only TTS backend. The model produces
30
+ * the full waveform in one forward, but we surface it as one body chunk +
31
+ * tail so the scheduler protocol is identical for both backends.
32
+ */
33
+ export declare class KokoroTtsBackend implements OmniVoiceBackend, StreamingTtsBackend {
34
+ readonly id: "kokoro";
35
+ private readonly runtime;
36
+ private readonly defaultVoiceId;
37
+ private readonly streamingChunkSamples;
38
+ private phonemizer;
39
+ private readonly phonemizerOverride?;
40
+ constructor(deps: KokoroTtsBackendDeps);
41
+ /** Native sample rate of the model output (24 kHz for Kokoro v1.0). */
42
+ get sampleRate(): number;
43
+ /** Always true — `KokoroTtsBackend` satisfies `StreamingTtsBackend`. */
44
+ supportsStreamingTts(): boolean;
45
+ /**
46
+ * One-shot synthesis. Drives the streaming path internally and
47
+ * concatenates chunks. Cancellation observed at chunk boundaries.
48
+ */
49
+ synthesize(args: {
50
+ phrase: Phrase;
51
+ preset: SpeakerPreset;
52
+ cancelSignal: {
53
+ cancelled: boolean;
54
+ };
55
+ onKernelTick?: () => void;
56
+ }): Promise<AudioChunk>;
57
+ synthesizeStream(args: {
58
+ phrase: Phrase;
59
+ preset: SpeakerPreset;
60
+ cancelSignal: {
61
+ cancelled: boolean;
62
+ };
63
+ onChunk: (chunk: TtsPcmChunk) => boolean | undefined;
64
+ onKernelTick?: () => void;
65
+ }): Promise<{
66
+ cancelled: boolean;
67
+ }>;
68
+ dispose(): void;
69
+ private resolveVoice;
70
+ private ensurePhonemizer;
71
+ }
72
+ //# sourceMappingURL=kokoro-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro-backend.d.ts","sourceRoot":"","sources":["kokoro-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACX,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,KAAK,EACX,oBAAoB,EAGpB,MAAM,SAAS,CAAC;AAGjB,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IACjE;6EACyE;IACzE,OAAO,EAAE,aAAa,CAAC;CACvB;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB,EAAE,mBAAmB;IAC7E,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAmB;gBAE3C,IAAI,EAAE,oBAAoB;IAQtC,uEAAuE;IACvE,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,wEAAwE;IACxE,oBAAoB,IAAI,OAAO;IAI/B;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,aAAa,CAAC;QACtB,YAAY,EAAE;YAAE,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC,UAAU,CAAC;IAgCjB,gBAAgB,CAAC,IAAI,EAAE;QAC5B,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,aAAa,CAAC;QACtB,YAAY,EAAE;YAAE,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;QACrC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,GAAG,SAAS,CAAC;QACrD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;KAC1B,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAkEnC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,YAAY;YASN,gBAAgB;CAM9B"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Kokoro-82M TTS backend.
3
+ *
4
+ * Implements the same `OmniVoiceBackend + StreamingTtsBackend` seam that
5
+ * `FfiOmniVoiceBackend` (the OmniVoice path) satisfies, so a
6
+ * `VoiceScheduler` instance does not need to know which TTS family it is
7
+ * driving. The runtime selection layer (`runtime-selection.ts`) picks
8
+ * between this and `FfiOmniVoiceBackend` based on hardware tier and the
9
+ * caller's first-audio-latency target.
10
+ *
11
+ * The actual model inference is delegated to a `KokoroRuntime` instance
12
+ * (GGUF / mock) — this class owns:
13
+ * - phonemizer resolution + per-phrase phonemize call,
14
+ * - voice-pack resolution against `SpeakerPreset.voiceId`,
15
+ * - streaming-protocol bookkeeping (cancel signal polling, final tail).
16
+ *
17
+ * No fallback sludge: if the runtime is unavailable, the backend throws
18
+ * on first synthesis rather than emitting silent zero PCM (AGENTS.md §3).
19
+ */
20
+
21
+ import type {
22
+ AudioChunk,
23
+ OmniVoiceBackend,
24
+ Phrase,
25
+ SpeakerPreset,
26
+ StreamingTtsBackend,
27
+ TtsPcmChunk,
28
+ } from "../types";
29
+ import type { KokoroRuntime } from "./kokoro-runtime";
30
+ import { resolvePhonemizer } from "./phonemizer";
31
+ import type {
32
+ KokoroBackendOptions,
33
+ KokoroPhonemizer,
34
+ KokoroVoicePack,
35
+ } from "./types";
36
+ import { resolveKokoroVoiceOrDefault } from "./voices";
37
+
38
+ export interface KokoroTtsBackendDeps extends KokoroBackendOptions {
39
+ /** The concrete model runner. Wire `KokoroFfiRuntime` (in-process fused
40
+ * libelizainference) in production and `KokoroMockRuntime` in tests. */
41
+ runtime: KokoroRuntime;
42
+ }
43
+
44
+ /**
45
+ * `KokoroTtsBackend` is a streaming-only TTS backend. The model produces
46
+ * the full waveform in one forward, but we surface it as one body chunk +
47
+ * tail so the scheduler protocol is identical for both backends.
48
+ */
49
+ export class KokoroTtsBackend implements OmniVoiceBackend, StreamingTtsBackend {
50
+ readonly id = "kokoro" as const;
51
+ private readonly runtime: KokoroRuntime;
52
+ private readonly defaultVoiceId: string;
53
+ private readonly streamingChunkSamples: number;
54
+ private phonemizer: KokoroPhonemizer | null = null;
55
+ private readonly phonemizerOverride?: KokoroPhonemizer;
56
+
57
+ constructor(deps: KokoroTtsBackendDeps) {
58
+ this.runtime = deps.runtime;
59
+ this.defaultVoiceId = deps.defaultVoiceId;
60
+ this.streamingChunkSamples =
61
+ deps.streamingChunkSamples ?? Math.floor(deps.layout.sampleRate / 4);
62
+ this.phonemizerOverride = deps.phonemizer;
63
+ }
64
+
65
+ /** Native sample rate of the model output (24 kHz for Kokoro v1.0). */
66
+ get sampleRate(): number {
67
+ return this.runtime.sampleRate;
68
+ }
69
+
70
+ /** Always true — `KokoroTtsBackend` satisfies `StreamingTtsBackend`. */
71
+ supportsStreamingTts(): boolean {
72
+ return true;
73
+ }
74
+
75
+ /**
76
+ * One-shot synthesis. Drives the streaming path internally and
77
+ * concatenates chunks. Cancellation observed at chunk boundaries.
78
+ */
79
+ async synthesize(args: {
80
+ phrase: Phrase;
81
+ preset: SpeakerPreset;
82
+ cancelSignal: { cancelled: boolean };
83
+ onKernelTick?: () => void;
84
+ }): Promise<AudioChunk> {
85
+ const collected: Float32Array[] = [];
86
+ let total = 0;
87
+ await this.synthesizeStream({
88
+ phrase: args.phrase,
89
+ preset: args.preset,
90
+ cancelSignal: args.cancelSignal,
91
+ onKernelTick: args.onKernelTick,
92
+ onChunk: ({ pcm, isFinal }) => {
93
+ args.onKernelTick?.();
94
+ if (!isFinal && pcm.length > 0) {
95
+ collected.push(pcm);
96
+ total += pcm.length;
97
+ }
98
+ return args.cancelSignal.cancelled;
99
+ },
100
+ });
101
+ const merged = new Float32Array(total);
102
+ let off = 0;
103
+ for (const part of collected) {
104
+ merged.set(part, off);
105
+ off += part.length;
106
+ }
107
+ return {
108
+ phraseId: args.phrase.id,
109
+ fromIndex: args.phrase.fromIndex,
110
+ toIndex: args.phrase.toIndex,
111
+ pcm: merged,
112
+ sampleRate: this.runtime.sampleRate,
113
+ };
114
+ }
115
+
116
+ async synthesizeStream(args: {
117
+ phrase: Phrase;
118
+ preset: SpeakerPreset;
119
+ cancelSignal: { cancelled: boolean };
120
+ onChunk: (chunk: TtsPcmChunk) => boolean | undefined;
121
+ onKernelTick?: () => void;
122
+ }): Promise<{ cancelled: boolean }> {
123
+ const voice = this.resolveVoice(args.preset);
124
+ const phonemizer = await this.ensurePhonemizer();
125
+ args.onKernelTick?.();
126
+ const phonemes = await phonemizer.phonemize(args.phrase.text, voice.lang);
127
+ if (args.cancelSignal.cancelled) {
128
+ args.onChunk({
129
+ pcm: new Float32Array(0),
130
+ sampleRate: this.runtime.sampleRate,
131
+ isFinal: true,
132
+ });
133
+ return { cancelled: true };
134
+ }
135
+
136
+ // The runtime emits one (or a few) body chunks. We re-chunk to
137
+ // `streamingChunkSamples` so the scheduler's ring buffer sees a
138
+ // continuous trickle even when ONNX returns the whole waveform at
139
+ // once — this is how Kokoro's ~97ms TTFB becomes audible to the
140
+ // listener before the full phrase finishes decoding.
141
+ const limit = this.streamingChunkSamples;
142
+ let cancelled = false;
143
+ const result = await this.runtime.synthesize({
144
+ phonemes,
145
+ voice,
146
+ cancelSignal: args.cancelSignal,
147
+ onChunk: ({ pcm, isFinal }) => {
148
+ args.onKernelTick?.();
149
+ if (cancelled || args.cancelSignal.cancelled) {
150
+ cancelled = true;
151
+ return true;
152
+ }
153
+ if (pcm.length === 0) {
154
+ // Pass through tail markers from the runtime — the final tail is
155
+ // emitted by us below, so swallow runtime-side finals to avoid
156
+ // double-tails.
157
+ if (!isFinal) return false;
158
+ return false;
159
+ }
160
+ for (let off = 0; off < pcm.length; off += limit) {
161
+ if (args.cancelSignal.cancelled) {
162
+ cancelled = true;
163
+ return true;
164
+ }
165
+ const end = Math.min(pcm.length, off + limit);
166
+ const slice = pcm.subarray(off, end);
167
+ const want = args.onChunk({
168
+ pcm: slice,
169
+ sampleRate: this.runtime.sampleRate,
170
+ isFinal: false,
171
+ });
172
+ if (want === true || args.cancelSignal.cancelled) {
173
+ cancelled = true;
174
+ return true;
175
+ }
176
+ }
177
+ return false;
178
+ },
179
+ });
180
+ args.onChunk({
181
+ pcm: new Float32Array(0),
182
+ sampleRate: this.runtime.sampleRate,
183
+ isFinal: true,
184
+ });
185
+ return { cancelled: cancelled || result.cancelled };
186
+ }
187
+
188
+ dispose(): void {
189
+ this.runtime.dispose();
190
+ }
191
+
192
+ private resolveVoice(preset: SpeakerPreset): KokoroVoicePack {
193
+ // The scheduler's `SpeakerPreset.voiceId` is the canonical caller
194
+ // hook for picking a Kokoro voice; an unknown id falls back to the
195
+ // configured default rather than throwing (so OmniVoice-authored
196
+ // presets still produce audio when routed through Kokoro).
197
+ const id = preset.voiceId || this.defaultVoiceId;
198
+ return resolveKokoroVoiceOrDefault(id);
199
+ }
200
+
201
+ private async ensurePhonemizer(): Promise<KokoroPhonemizer> {
202
+ if (this.phonemizer) return this.phonemizer;
203
+ this.phonemizer = await resolvePhonemizer(this.phonemizerOverride);
204
+ console.info(`[kokoro] using phonemizer=${this.phonemizer.id}`);
205
+ return this.phonemizer;
206
+ }
207
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * On-disk discovery for the Kokoro-only voice mode. Probes
3
+ * `<stateDir>/local-inference/models/kokoro/` (or `$ELIZA_KOKORO_MODEL_DIR`)
4
+ * for a Kokoro GGUF model file plus at least one voice `.bin` under
5
+ * `voices/`. Callers can pass an explicit model root to probe bundle-local
6
+ * Kokoro artifacts first. Returns null when anything is missing — no
7
+ * auto-download (AGENTS.md §3). GGUF-only: the ONNX path has been retired
8
+ * (see `runtimeKind` below).
9
+ *
10
+ * TRANSPORT NOTE — Kokoro synthesizes in-process through the fused
11
+ * `libelizainference` handle (ABI v10 `eliza_inference_kokoro_*`), the same
12
+ * dlopen()-ed lib as OmniVoice. The fork links Kokoro's native engine
13
+ * (`tools/kokoro/kokoro_lib`, its own GGUF reader + iSTFT decoder) into the
14
+ * fused build, and `KokoroFfiRuntime` drives it via `kokoroLoad` /
15
+ * `kokoroSynthesize`. This is the canonical path on every platform and the
16
+ * only one that ships on iOS / Google Play (those forbid the app opening a
17
+ * local TCP socket). The legacy `KokoroGgufRuntime` — POST `/v1/audio/speech`
18
+ * on a Kokoro-capable llama-server (the MTP gateway launched with
19
+ * `--kokoro-model`) — stays as an explicit dev/desktop opt-in
20
+ * (`KOKORO_BACKEND=fork`) and is never resolved on the mobile path. The GGUF
21
+ * is produced by the fork's `tools/kokoro/convert_kokoro_pth_to_gguf.py`.
22
+ *
23
+ * Env overrides:
24
+ * ELIZA_KOKORO_MODEL_DIR — directory root
25
+ * ELIZA_KOKORO_MODEL_FILE — exact filename inside the root
26
+ * (ONNX or GGUF; the loader auto-detects)
27
+ * ELIZA_KOKORO_DEFAULT_VOICE_ID — default voice id (e.g. `af_same`, `af_bella`)
28
+ */
29
+ import type { KokoroModelLayout } from "./types";
30
+ /** Canonical Kokoro v1.0 output sample rate. */
31
+ export declare const KOKORO_DEFAULT_SAMPLE_RATE = 24000;
32
+ /** True iff the candidate filename routes to the fused GGUF path. */
33
+ export declare function isKokoroGgufFile(filename: string): boolean;
34
+ export interface KokoroEngineDiscoveryResult {
35
+ layout: KokoroModelLayout;
36
+ /**
37
+ * Resolved default voice id. Prefers the catalog default
38
+ * (`KOKORO_DEFAULT_VOICE_ID` = `af_same`, Samantha) when its preset is on
39
+ * disk; falls back loudly to `KOKORO_FALLBACK_VOICE_ID` (`af_bella`) when
40
+ * Samantha's preset has not been produced yet; otherwise picks the first
41
+ * voice pack whose `.bin` is actually staged.
42
+ */
43
+ defaultVoiceId: string;
44
+ /**
45
+ * Resolved runtime kind. Always `"gguf"` — only GGUF model files are
46
+ * accepted by the discovery (ONNX paths have been retired).
47
+ */
48
+ runtimeKind: "gguf";
49
+ }
50
+ /** Returns the on-disk directory the discovery probes. */
51
+ export declare function kokoroEngineModelDir(rootOverride?: string): string;
52
+ /**
53
+ * Probe disk for a usable Kokoro layout. Returns null when any required
54
+ * piece is missing — the engine then falls back to its existing behaviour
55
+ * (fused omnivoice or `StubOmniVoiceBackend`).
56
+ */
57
+ export declare function resolveKokoroEngineConfig(rootOverride?: string): KokoroEngineDiscoveryResult | null;
58
+ //# sourceMappingURL=kokoro-engine-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro-engine-discovery.d.ts","sourceRoot":"","sources":["kokoro-engine-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,SAAS,CAAC;AAOlE,gDAAgD;AAChD,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAiBjD,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,MAAM,WAAW,2BAA2B;IAC3C,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,YAAY,CAAC,EAAE,MAAM,GACnB,2BAA2B,GAAG,IAAI,CAuBpC"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * On-disk discovery for the Kokoro-only voice mode. Probes
3
+ * `<stateDir>/local-inference/models/kokoro/` (or `$ELIZA_KOKORO_MODEL_DIR`)
4
+ * for a Kokoro GGUF model file plus at least one voice `.bin` under
5
+ * `voices/`. Callers can pass an explicit model root to probe bundle-local
6
+ * Kokoro artifacts first. Returns null when anything is missing — no
7
+ * auto-download (AGENTS.md §3). GGUF-only: the ONNX path has been retired
8
+ * (see `runtimeKind` below).
9
+ *
10
+ * TRANSPORT NOTE — Kokoro synthesizes in-process through the fused
11
+ * `libelizainference` handle (ABI v10 `eliza_inference_kokoro_*`), the same
12
+ * dlopen()-ed lib as OmniVoice. The fork links Kokoro's native engine
13
+ * (`tools/kokoro/kokoro_lib`, its own GGUF reader + iSTFT decoder) into the
14
+ * fused build, and `KokoroFfiRuntime` drives it via `kokoroLoad` /
15
+ * `kokoroSynthesize`. This is the canonical path on every platform and the
16
+ * only one that ships on iOS / Google Play (those forbid the app opening a
17
+ * local TCP socket). The legacy `KokoroGgufRuntime` — POST `/v1/audio/speech`
18
+ * on a Kokoro-capable llama-server (the MTP gateway launched with
19
+ * `--kokoro-model`) — stays as an explicit dev/desktop opt-in
20
+ * (`KOKORO_BACKEND=fork`) and is never resolved on the mobile path. The GGUF
21
+ * is produced by the fork's `tools/kokoro/convert_kokoro_pth_to_gguf.py`.
22
+ *
23
+ * Env overrides:
24
+ * ELIZA_KOKORO_MODEL_DIR — directory root
25
+ * ELIZA_KOKORO_MODEL_FILE — exact filename inside the root
26
+ * (ONNX or GGUF; the loader auto-detects)
27
+ * ELIZA_KOKORO_DEFAULT_VOICE_ID — default voice id (e.g. `af_same`, `af_bella`)
28
+ */
29
+
30
+ import { existsSync, readdirSync } from "node:fs";
31
+ import path from "node:path";
32
+ import { elizaModelsDir } from "../../paths";
33
+ import type { KokoroModelLayout, KokoroVoicePack } from "./types";
34
+ import {
35
+ KOKORO_DEFAULT_VOICE_ID,
36
+ KOKORO_FALLBACK_VOICE_ID,
37
+ KOKORO_VOICE_PACKS,
38
+ } from "./voice-presets";
39
+
40
+ /** Canonical Kokoro v1.0 output sample rate. */
41
+ export const KOKORO_DEFAULT_SAMPLE_RATE = 24_000;
42
+
43
+ /**
44
+ * Filenames the loader will accept if `ELIZA_KOKORO_MODEL_FILE` is unset.
45
+ * Order is preference-first: a fused-GGUF beats an ONNX of the same
46
+ * quantization tier, and within ONNX the int8 export beats fp32.
47
+ *
48
+ * The Q4_K_M GGUF is what the elizaOS/llama.cpp fork's
49
+ * `tools/kokoro/convert_kokoro_pth_to_gguf.py` produces for shipping
50
+ * tiers; `kokoro-82m-v1_0.gguf` is the unquantized canonical filename
51
+ * the runtime documents at `kokoro-runtime.ts:KOKORO_GGUF_REL_PATH`.
52
+ */
53
+ const CANDIDATE_MODEL_FILES: ReadonlyArray<string> = [
54
+ "kokoro-82m-v1_0-Q4_K_M.gguf",
55
+ "kokoro-82m-v1_0.gguf",
56
+ ];
57
+
58
+ /** True iff the candidate filename routes to the fused GGUF path. */
59
+ export function isKokoroGgufFile(filename: string): boolean {
60
+ return /\.gguf$/i.test(filename);
61
+ }
62
+
63
+ export interface KokoroEngineDiscoveryResult {
64
+ layout: KokoroModelLayout;
65
+ /**
66
+ * Resolved default voice id. Prefers the catalog default
67
+ * (`KOKORO_DEFAULT_VOICE_ID` = `af_same`, Samantha) when its preset is on
68
+ * disk; falls back loudly to `KOKORO_FALLBACK_VOICE_ID` (`af_bella`) when
69
+ * Samantha's preset has not been produced yet; otherwise picks the first
70
+ * voice pack whose `.bin` is actually staged.
71
+ */
72
+ defaultVoiceId: string;
73
+ /**
74
+ * Resolved runtime kind. Always `"gguf"` — only GGUF model files are
75
+ * accepted by the discovery (ONNX paths have been retired).
76
+ */
77
+ runtimeKind: "gguf";
78
+ }
79
+
80
+ /** Returns the on-disk directory the discovery probes. */
81
+ export function kokoroEngineModelDir(rootOverride?: string): string {
82
+ const explicit = rootOverride?.trim();
83
+ if (explicit) return explicit;
84
+ const env = process.env.ELIZA_KOKORO_MODEL_DIR?.trim();
85
+ if (env) return env;
86
+ return path.join(elizaModelsDir(), "kokoro");
87
+ }
88
+
89
+ /**
90
+ * Probe disk for a usable Kokoro layout. Returns null when any required
91
+ * piece is missing — the engine then falls back to its existing behaviour
92
+ * (fused omnivoice or `StubOmniVoiceBackend`).
93
+ */
94
+ export function resolveKokoroEngineConfig(
95
+ rootOverride?: string,
96
+ ): KokoroEngineDiscoveryResult | null {
97
+ const root = kokoroEngineModelDir(rootOverride);
98
+ if (!existsSync(root)) return null;
99
+
100
+ const modelFile = resolveModelFile(root);
101
+ if (!modelFile) return null;
102
+
103
+ const voicesDir = path.join(root, "voices");
104
+ if (!existsSync(voicesDir)) return null;
105
+
106
+ const defaultVoiceId = resolveDefaultVoiceId(voicesDir);
107
+ if (!defaultVoiceId) return null;
108
+
109
+ return {
110
+ layout: {
111
+ root,
112
+ modelFile,
113
+ voicesDir,
114
+ sampleRate: KOKORO_DEFAULT_SAMPLE_RATE,
115
+ },
116
+ defaultVoiceId,
117
+ runtimeKind: "gguf",
118
+ };
119
+ }
120
+
121
+ function resolveModelFile(root: string): string | null {
122
+ const env = process.env.ELIZA_KOKORO_MODEL_FILE?.trim();
123
+ if (env) {
124
+ return existsSync(path.join(root, env)) ? env : null;
125
+ }
126
+ for (const candidate of CANDIDATE_MODEL_FILES) {
127
+ if (existsSync(path.join(root, candidate))) return candidate;
128
+ }
129
+ return null;
130
+ }
131
+
132
+ function resolveDefaultVoiceId(voicesDir: string): string | null {
133
+ const env = process.env.ELIZA_KOKORO_DEFAULT_VOICE_ID?.trim();
134
+ if (env) {
135
+ const pack = findVoicePack(env);
136
+ if (pack && existsSync(path.join(voicesDir, pack.file))) return pack.id;
137
+ return null;
138
+ }
139
+ // Prefer the catalog default (Samantha) when its file is staged.
140
+ const defaultPack = findVoicePack(KOKORO_DEFAULT_VOICE_ID);
141
+ if (defaultPack && existsSync(path.join(voicesDir, defaultPack.file))) {
142
+ return defaultPack.id;
143
+ }
144
+ // Samantha preset bytes not staged — fall back to the bundled fallback
145
+ // voice (af_bella). This MUST be loud so operators see the degradation:
146
+ // the canonical default is Samantha and we only land here when the LoRA
147
+ // pipeline has not produced a real `af_same.bin` yet.
148
+ const fallbackPack = findVoicePack(KOKORO_FALLBACK_VOICE_ID);
149
+ if (fallbackPack && existsSync(path.join(voicesDir, fallbackPack.file))) {
150
+ // eslint-disable-next-line no-console -- this is the one place where
151
+ // the runtime must surface the fallback to the operator console; the
152
+ // structured logger is unavailable at discovery time.
153
+ console.warn(
154
+ `[kokoro] default voice ${KOKORO_DEFAULT_VOICE_ID} preset not staged at ${path.join(voicesDir, defaultPack?.file ?? `${KOKORO_DEFAULT_VOICE_ID}.bin`)} — falling back to ${KOKORO_FALLBACK_VOICE_ID}. Run packages/training/scripts/voice/samantha_lora/RUNBOOK.md to produce a real Samantha preset, or regenerate via plugins/plugin-local-inference/scripts/regenerate-samantha-preset.mjs.`,
155
+ );
156
+ return fallbackPack.id;
157
+ }
158
+ // Otherwise pick the first catalog voice whose file is on disk. This
159
+ // lets operators stage a single voice (any voice) and have it just work.
160
+ const staged = listStagedVoiceIds(voicesDir);
161
+ return staged[0] ?? null;
162
+ }
163
+
164
+ function findVoicePack(id: string): KokoroVoicePack | null {
165
+ return KOKORO_VOICE_PACKS.find((v) => v.id === id) ?? null;
166
+ }
167
+
168
+ function listStagedVoiceIds(voicesDir: string): string[] {
169
+ try {
170
+ const present = new Set(readdirSync(voicesDir));
171
+ return KOKORO_VOICE_PACKS.filter((v) => present.has(v.file)).map(
172
+ (v) => v.id,
173
+ );
174
+ } catch {
175
+ return [];
176
+ }
177
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * In-process Kokoro-82M runtime over the fused `libelizainference` FFI
3
+ * (the `eliza_inference_kokoro_*` exports — introduced at ABI v10; the fused
4
+ * library is currently ABI v11, which adds EOT on top, so these symbols are
5
+ * present in every current build — see `ELIZA_INFERENCE_ABI_VERSION` in
6
+ * ffi-bindings.ts).
7
+ *
8
+ * This is the canonical Kokoro execution path on every platform. It replaces
9
+ * the local-TCP `KokoroGgufRuntime` (POST `/v1/audio/speech` on a running
10
+ * llama-server) for the mobile case — iOS and Google Play forbid the app
11
+ * opening a local TCP socket, so the HTTP→llama-server route cannot ship there.
12
+ * Kokoro synthesizes through the same dlopen()-ed handle as OmniVoice: the
13
+ * fused build links Eliza-1's Kokoro engine (its own GGUF reader + iSTFT
14
+ * decoder) behind `eliza_inference_kokoro_supported/load/synthesize/sample_rate`.
15
+ *
16
+ * Ownership: this runtime owns its own FFI handle + context. The context is
17
+ * created with `create(bundleRoot)` anchored at the bundle root (or the Kokoro
18
+ * model root when there is no Eliza-1 bundle), mirroring how the desktop fused
19
+ * text runtime obtains its ctx. The GGUF + the active voice `.bin` are loaded
20
+ * once via `kokoroLoad` and reloaded only when the requested voice changes.
21
+ *
22
+ * No silent fallback (AGENTS.md §3): when the loaded library does not export
23
+ * the Kokoro symbols (`kokoroSupported() === false`) or the model/voice files
24
+ * are missing, construction / first synthesis throws a structured
25
+ * `VoiceLifecycleError` rather than dropping back to the TCP route.
26
+ */
27
+ import { type ElizaInferenceContextHandle, type ElizaInferenceFfi } from "../ffi-bindings";
28
+ import type { KokoroRuntime, KokoroRuntimeInputs } from "./kokoro-runtime";
29
+ import type { KokoroModelLayout } from "./types";
30
+ export interface KokoroFfiRuntimeOptions {
31
+ /** Resolved on-disk Kokoro layout (GGUF filename + voices dir + root). */
32
+ layout: KokoroModelLayout;
33
+ /**
34
+ * Directory the FFI context anchors at (`create(bundleRoot)`). Defaults to
35
+ * the Kokoro model root, which is sufficient for the standalone Kokoro
36
+ * engine — it loads the GGUF + voice `.bin` by explicit absolute path, not
37
+ * by bundle convention.
38
+ */
39
+ bundleRoot?: string;
40
+ /**
41
+ * Inject a pre-loaded FFI handle (the desktop fused engine already owns one).
42
+ * When omitted the runtime loads its own via `resolveFusedLibraryPath`.
43
+ */
44
+ ffi?: ElizaInferenceFfi;
45
+ /**
46
+ * Inject a context to reuse. When omitted the runtime creates its own with
47
+ * `ffi.create(bundleRoot)` and destroys it on `dispose`.
48
+ */
49
+ ctx?: ElizaInferenceContextHandle;
50
+ }
51
+ export declare class KokoroFfiRuntime implements KokoroRuntime {
52
+ readonly id: "gguf";
53
+ readonly sampleRate: number;
54
+ private readonly layout;
55
+ private readonly ffi;
56
+ private readonly ownsFfi;
57
+ private readonly ctx;
58
+ private readonly ownsCtx;
59
+ /** Voice id currently resident on the ctx (null until first load). */
60
+ private loadedVoiceId;
61
+ private disposed;
62
+ constructor(opts: KokoroFfiRuntimeOptions);
63
+ synthesize(args: KokoroRuntimeInputs): Promise<{
64
+ cancelled: boolean;
65
+ }>;
66
+ dispose(): void;
67
+ /**
68
+ * Load the GGUF + the requested voice `.bin` into the ctx, reloading only
69
+ * when the voice changes (Kokoro keeps the model resident; swapping voices
70
+ * is a cheap re-load of the 256-float style tensor).
71
+ */
72
+ private ensureVoiceLoaded;
73
+ private kokoroSynthesize;
74
+ }
75
+ //# sourceMappingURL=kokoro-ffi-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kokoro-ffi-runtime.d.ts","sourceRoot":"","sources":["kokoro-ffi-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,OAAO,EACN,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EAEtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAcjD,MAAM,WAAW,uBAAuB;IACvC,0EAA0E;IAC1E,MAAM,EAAE,iBAAiB,CAAC;IAC1B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB;;;OAGG;IACH,GAAG,CAAC,EAAE,2BAA2B,CAAC;CAClC;AAED,qBAAa,gBAAiB,YAAW,aAAa;IACrD,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,sEAAsE;IACtE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;gBAEb,IAAI,EAAE,uBAAuB;IA4CnC,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IA4C5E,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,gBAAgB;CASxB"}