@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,40 @@
1
+ import type { AudioSink } from "./types";
2
+ export interface PcmRingBufferOptions {
3
+ /**
4
+ * Fired when the buffer is full and a write overwrites unread samples.
5
+ * Reports the count of dropped samples in this write call. Schedulers
6
+ * should use this signal to apply backpressure upstream — silent
7
+ * overwrites produce audible glitches.
8
+ */
9
+ onOverflow?: (droppedSamples: number) => void;
10
+ }
11
+ export declare class PcmRingBuffer {
12
+ private readonly capacity;
13
+ private readonly sampleRate;
14
+ private readonly sink;
15
+ private readonly buf;
16
+ private readPos;
17
+ private writePos;
18
+ private filled;
19
+ private readonly onOverflow?;
20
+ constructor(capacity: number, sampleRate: number, sink: AudioSink, options?: PcmRingBufferOptions);
21
+ write(pcm: Float32Array): void;
22
+ /** Fill ratio in [0, 1]. Schedulers can throttle TTS dispatches as this approaches 1. */
23
+ pressure(): number;
24
+ flushToSink(): number;
25
+ drain(): void;
26
+ size(): number;
27
+ capacityHint(): number;
28
+ }
29
+ export declare class InMemoryAudioSink implements AudioSink {
30
+ readonly chunks: Array<{
31
+ pcm: Float32Array;
32
+ sampleRate: number;
33
+ }>;
34
+ private buffered;
35
+ write(pcm: Float32Array, sampleRate: number): void;
36
+ drain(): void;
37
+ bufferedSamples(): number;
38
+ totalWritten(): number;
39
+ }
40
+ //# sourceMappingURL=ring-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["ring-buffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACpC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,qBAAa,aAAa;IAQxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IATtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAmC;gBAG7C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,EAChC,OAAO,GAAE,oBAAyB;IASnC,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAiB9B,yFAAyF;IACzF,QAAQ,IAAI,MAAM;IAIlB,WAAW,IAAI,MAAM;IAarB,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,MAAM;IAId,YAAY,IAAI,MAAM;CAGtB;AAED,qBAAa,iBAAkB,YAAW,SAAS;IAClD,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAM;IACvE,OAAO,CAAC,QAAQ,CAAK;IAErB,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAKlD,KAAK,IAAI,IAAI;IAIb,eAAe,IAAI,MAAM;IAIzB,YAAY,IAAI,MAAM;CAKtB"}
@@ -0,0 +1,105 @@
1
+ import type { AudioSink } from "./types";
2
+
3
+ export interface PcmRingBufferOptions {
4
+ /**
5
+ * Fired when the buffer is full and a write overwrites unread samples.
6
+ * Reports the count of dropped samples in this write call. Schedulers
7
+ * should use this signal to apply backpressure upstream — silent
8
+ * overwrites produce audible glitches.
9
+ */
10
+ onOverflow?: (droppedSamples: number) => void;
11
+ }
12
+
13
+ export class PcmRingBuffer {
14
+ private readonly buf: Float32Array;
15
+ private readPos = 0;
16
+ private writePos = 0;
17
+ private filled = 0;
18
+ private readonly onOverflow?: (droppedSamples: number) => void;
19
+
20
+ constructor(
21
+ private readonly capacity: number,
22
+ private readonly sampleRate: number,
23
+ private readonly sink: AudioSink,
24
+ options: PcmRingBufferOptions = {},
25
+ ) {
26
+ if (capacity <= 0) {
27
+ throw new Error("PcmRingBuffer: capacity must be positive");
28
+ }
29
+ this.buf = new Float32Array(capacity);
30
+ this.onOverflow = options.onOverflow;
31
+ }
32
+
33
+ write(pcm: Float32Array): void {
34
+ let dropped = 0;
35
+ for (let i = 0; i < pcm.length; i++) {
36
+ this.buf[this.writePos] = pcm[i];
37
+ this.writePos = (this.writePos + 1) % this.capacity;
38
+ if (this.filled < this.capacity) {
39
+ this.filled++;
40
+ } else {
41
+ this.readPos = (this.readPos + 1) % this.capacity;
42
+ dropped++;
43
+ }
44
+ }
45
+ if (dropped > 0 && this.onOverflow) {
46
+ this.onOverflow(dropped);
47
+ }
48
+ }
49
+
50
+ /** Fill ratio in [0, 1]. Schedulers can throttle TTS dispatches as this approaches 1. */
51
+ pressure(): number {
52
+ return this.filled / this.capacity;
53
+ }
54
+
55
+ flushToSink(): number {
56
+ if (this.filled === 0) return 0;
57
+ const out = new Float32Array(this.filled);
58
+ for (let i = 0; i < this.filled; i++) {
59
+ out[i] = this.buf[(this.readPos + i) % this.capacity];
60
+ }
61
+ const n = this.filled;
62
+ this.readPos = this.writePos;
63
+ this.filled = 0;
64
+ this.sink.write(out, this.sampleRate);
65
+ return n;
66
+ }
67
+
68
+ drain(): void {
69
+ this.readPos = this.writePos;
70
+ this.filled = 0;
71
+ this.sink.drain();
72
+ }
73
+
74
+ size(): number {
75
+ return this.filled;
76
+ }
77
+
78
+ capacityHint(): number {
79
+ return this.capacity;
80
+ }
81
+ }
82
+
83
+ export class InMemoryAudioSink implements AudioSink {
84
+ readonly chunks: Array<{ pcm: Float32Array; sampleRate: number }> = [];
85
+ private buffered = 0;
86
+
87
+ write(pcm: Float32Array, sampleRate: number): void {
88
+ this.chunks.push({ pcm, sampleRate });
89
+ this.buffered += pcm.length;
90
+ }
91
+
92
+ drain(): void {
93
+ this.buffered = 0;
94
+ }
95
+
96
+ bufferedSamples(): number {
97
+ return this.buffered;
98
+ }
99
+
100
+ totalWritten(): number {
101
+ let n = 0;
102
+ for (const c of this.chunks) n += c.pcm.length;
103
+ return n;
104
+ }
105
+ }
@@ -0,0 +1,24 @@
1
+ import type { Phrase, RejectedTokenRange } from "./types";
2
+ type PhraseState = "queued" | "synthesizing" | "ringbuffered" | "played";
3
+ export interface RollbackEvent {
4
+ phraseId: number;
5
+ reason: "rejected-tokens";
6
+ rejectedRange: RejectedTokenRange;
7
+ }
8
+ export declare class RollbackQueue {
9
+ private readonly tracked;
10
+ track(phrase: Phrase): void;
11
+ markSynthesizing(phraseId: number): void;
12
+ markRingBuffered(phraseId: number): void;
13
+ markPlayed(phraseId: number): void;
14
+ drop(phraseId: number): void;
15
+ onRejected(range: RejectedTokenRange): RollbackEvent[];
16
+ snapshot(): ReadonlyArray<{
17
+ phrase: Phrase;
18
+ state: PhraseState;
19
+ }>;
20
+ private requireEntry;
21
+ private overlaps;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=rollback-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback-queue.d.ts","sourceRoot":"","sources":["rollback-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE1D,KAAK,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,QAAQ,CAAC;AAOzE,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,aAAa,EAAE,kBAAkB,CAAC;CAClC;AAED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAE5D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI3B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5B,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,EAAE;IAetD,QAAQ,IAAI,aAAa,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAA;KAAE,CAAC;IAIjE,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,QAAQ;CAKhB"}
@@ -0,0 +1,74 @@
1
+ import type { Phrase, RejectedTokenRange } from "./types";
2
+
3
+ type PhraseState = "queued" | "synthesizing" | "ringbuffered" | "played";
4
+
5
+ interface TrackedPhrase {
6
+ phrase: Phrase;
7
+ state: PhraseState;
8
+ }
9
+
10
+ export interface RollbackEvent {
11
+ phraseId: number;
12
+ reason: "rejected-tokens";
13
+ rejectedRange: RejectedTokenRange;
14
+ }
15
+
16
+ export class RollbackQueue {
17
+ private readonly tracked = new Map<number, TrackedPhrase>();
18
+
19
+ track(phrase: Phrase): void {
20
+ this.tracked.set(phrase.id, { phrase, state: "queued" });
21
+ }
22
+
23
+ markSynthesizing(phraseId: number): void {
24
+ const entry = this.requireEntry(phraseId);
25
+ entry.state = "synthesizing";
26
+ }
27
+
28
+ markRingBuffered(phraseId: number): void {
29
+ const entry = this.requireEntry(phraseId);
30
+ entry.state = "ringbuffered";
31
+ }
32
+
33
+ markPlayed(phraseId: number): void {
34
+ const entry = this.requireEntry(phraseId);
35
+ entry.state = "played";
36
+ }
37
+
38
+ drop(phraseId: number): void {
39
+ this.tracked.delete(phraseId);
40
+ }
41
+
42
+ onRejected(range: RejectedTokenRange): RollbackEvent[] {
43
+ const events: RollbackEvent[] = [];
44
+ for (const entry of this.tracked.values()) {
45
+ if (entry.state === "played") continue;
46
+ if (this.overlaps(entry.phrase, range)) {
47
+ events.push({
48
+ phraseId: entry.phrase.id,
49
+ reason: "rejected-tokens",
50
+ rejectedRange: range,
51
+ });
52
+ }
53
+ }
54
+ return events;
55
+ }
56
+
57
+ snapshot(): ReadonlyArray<{ phrase: Phrase; state: PhraseState }> {
58
+ return Array.from(this.tracked.values()).map((e) => ({ ...e }));
59
+ }
60
+
61
+ private requireEntry(phraseId: number): TrackedPhrase {
62
+ const entry = this.tracked.get(phraseId);
63
+ if (!entry) {
64
+ throw new Error(`RollbackQueue: unknown phraseId ${phraseId}`);
65
+ }
66
+ return entry;
67
+ }
68
+
69
+ private overlaps(phrase: Phrase, range: RejectedTokenRange): boolean {
70
+ return (
71
+ phrase.toIndex >= range.fromIndex && phrase.fromIndex <= range.toIndex
72
+ );
73
+ }
74
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Samantha-preset placeholder detection + on-the-fly regeneration.
3
+ *
4
+ * Background: the canonical default voice (Samantha, `af_same`) ships with
5
+ * the Eliza-1 bundle as `cache/voice-preset-default.bin` (ELZ1 format).
6
+ * The first I-wave shipped a 1052-byte zero-filled placeholder before the
7
+ * real preset bytes were produced — the runtime treats this placeholder as
8
+ * "not yet generated" and synthesises a fresh preset on first boot via the
9
+ * fused OmniVoice TTS (Path A).
10
+ *
11
+ * The detection rule is intentionally narrow: only an ELZ1 v1/v2 file whose
12
+ * (a) speaker embedding is exactly zero AND (b) ref_audio_tokens / ref_text
13
+ * are empty AND (c) phrase-cache seed is empty counts as a placeholder. Any
14
+ * file that has even one non-zero region is considered real and is left
15
+ * alone — the runtime never silently overwrites operator-supplied presets.
16
+ *
17
+ * The fallback chain executed by `EngineVoiceBridge.start()`:
18
+ *
19
+ * 1. If `cache/voice-preset-default.bin` is missing → throw (existing
20
+ * behaviour, the bundle is malformed).
21
+ * 2. If the file exists and is NOT a placeholder → load it as-is.
22
+ * 3. If it IS a placeholder AND the OmniVoice reference-encode FFI is
23
+ * available → regenerate the preset using the bundled Samantha
24
+ * reference clip + transcript, write the new bytes back to disk,
25
+ * then load.
26
+ * 4. If it IS a placeholder AND OmniVoice reference-encode is unavailable
27
+ * → log a loud warning and fall through to the bundled Kokoro default
28
+ * voice (`kokoro.defaultVoiceId`) by re-pointing the discovery layer.
29
+ */
30
+ /** The exact byte-length the I-wave placeholder shipped at. Used as a fast
31
+ * pre-check before the more expensive structural parse — files of any
32
+ * other size cannot be the placeholder. */
33
+ export declare const SAMANTHA_PLACEHOLDER_BYTE_LENGTH = 1052;
34
+ /** Reasons `detectSamanthaPlaceholder` returns. Each is structurally
35
+ * distinct so the caller can branch without re-parsing. */
36
+ export type SamanthaPlaceholderState = {
37
+ kind: "missing";
38
+ } | {
39
+ kind: "real-preset";
40
+ reason: string;
41
+ } | {
42
+ kind: "placeholder";
43
+ } | {
44
+ kind: "unreadable";
45
+ reason: string;
46
+ };
47
+ /**
48
+ * Inspect `presetPath` and report whether it is the I-wave zero-fill
49
+ * placeholder, a real preset, missing, or unreadable. Pure I/O — no
50
+ * mutation of the file.
51
+ */
52
+ export declare function detectSamanthaPlaceholder(presetPath: string): SamanthaPlaceholderState;
53
+ /**
54
+ * The text the on-the-fly regeneration uses as the Samantha reference
55
+ * transcript. Stable across versions so the produced preset is
56
+ * deterministic — pinning the prompt is part of the cacheability contract
57
+ * (same inputs -> same output bytes for byte-for-byte comparison).
58
+ */
59
+ export declare const SAMANTHA_REFERENCE_TRANSCRIPT = "Hi, I'm Samantha. It's nice to finally talk to you about something real.";
60
+ /**
61
+ * The closed-vocabulary VoiceDesign instruct string baked into the
62
+ * regenerated Samantha preset. Mirrors the publish-time freeze CLI's
63
+ * settings so the runtime regen and a future operator-built preset land on
64
+ * the same surface. Pinned for deterministic regeneration.
65
+ */
66
+ export declare const SAMANTHA_INSTRUCT = "female, american accent, young adult, moderate pitch";
67
+ //# sourceMappingURL=samantha-preset-placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samantha-preset-placeholder.d.ts","sourceRoot":"","sources":["samantha-preset-placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAaH;;4CAE4C;AAC5C,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAErD;4DAC4D;AAC5D,MAAM,MAAM,wBAAwB,GACjC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,MAAM,GAChB,wBAAwB,CAoE1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,6EACiC,CAAC;AAE5E;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,yDACyB,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+
6
+ import {
7
+ detectSamanthaPlaceholder,
8
+ SAMANTHA_PLACEHOLDER_BYTE_LENGTH,
9
+ } from "./samantha-preset-placeholder";
10
+ import {
11
+ VOICE_PRESET_MAGIC,
12
+ VOICE_PRESET_VERSION_V1,
13
+ writeVoicePresetFileV2,
14
+ } from "./voice-preset-format";
15
+
16
+ function writeLegacyV1Placeholder(): Uint8Array {
17
+ const blob = new Uint8Array(SAMANTHA_PLACEHOLDER_BYTE_LENGTH);
18
+ const view = new DataView(blob.buffer);
19
+ view.setUint32(0, VOICE_PRESET_MAGIC, true);
20
+ view.setUint32(4, VOICE_PRESET_VERSION_V1, true);
21
+ view.setUint32(8, 24, true);
22
+ view.setUint32(12, 256 * 4, true);
23
+ view.setUint32(16, 24 + 256 * 4, true);
24
+ view.setUint32(20, 4, true);
25
+ view.setUint32(24 + 256 * 4, 0, true);
26
+ return blob;
27
+ }
28
+
29
+ describe("detectSamanthaPlaceholder", () => {
30
+ let dir: string;
31
+ beforeEach(() => {
32
+ dir = mkdtempSync(path.join(os.tmpdir(), "samantha-placeholder-test-"));
33
+ });
34
+ afterEach(() => {
35
+ rmSync(dir, { recursive: true, force: true });
36
+ });
37
+
38
+ it("reports `missing` when the file does not exist", () => {
39
+ const out = detectSamanthaPlaceholder(path.join(dir, "absent.bin"));
40
+ expect(out.kind).toBe("missing");
41
+ });
42
+
43
+ it("reports `real-preset` for files of the wrong byte length", () => {
44
+ const p = path.join(dir, "tiny.bin");
45
+ writeFileSync(p, Buffer.alloc(64));
46
+ const out = detectSamanthaPlaceholder(p);
47
+ expect(out.kind).toBe("real-preset");
48
+ if (out.kind === "real-preset") {
49
+ expect(out.reason).toMatch(/byte-length/);
50
+ }
51
+ });
52
+
53
+ it("does not report a differently-shaped v2 zero preset as the shipped placeholder", () => {
54
+ // Current v2 serialization has a different byte layout than the
55
+ // 1052-byte I-wave placeholder staged in installed bundles.
56
+ const blob = writeVoicePresetFileV2({
57
+ embedding: new Float32Array(256), // all zeros
58
+ phrases: [],
59
+ });
60
+ expect(blob.byteLength).not.toBe(SAMANTHA_PLACEHOLDER_BYTE_LENGTH);
61
+ const p = path.join(dir, "voice-preset-default.bin");
62
+ writeFileSync(p, blob);
63
+ const out = detectSamanthaPlaceholder(p);
64
+ expect(out.kind).toBe("real-preset");
65
+ });
66
+
67
+ it("reports `placeholder` for the legacy v1 zero-fill blob staged in current bundles", () => {
68
+ const blob = writeLegacyV1Placeholder();
69
+ expect(blob.byteLength).toBe(SAMANTHA_PLACEHOLDER_BYTE_LENGTH);
70
+ const p = path.join(dir, "legacy-v1-placeholder.bin");
71
+ writeFileSync(p, blob);
72
+ const out = detectSamanthaPlaceholder(p);
73
+ expect(out.kind).toBe("placeholder");
74
+ });
75
+
76
+ it("reports `real-preset` when the embedding has any non-zero sample", () => {
77
+ const emb = new Float32Array(256);
78
+ emb[42] = 0.001;
79
+ const blob = writeVoicePresetFileV2({ embedding: emb, phrases: [] });
80
+ const p = path.join(dir, "almost.bin");
81
+ writeFileSync(p, blob);
82
+ const out = detectSamanthaPlaceholder(p);
83
+ expect(out.kind).toBe("real-preset");
84
+ });
85
+
86
+ it("reports `real-preset` when ref_audio_tokens or ref_text are populated", () => {
87
+ const blob = writeVoicePresetFileV2({
88
+ embedding: new Float32Array(256),
89
+ phrases: [],
90
+ refText: "Hello there.",
91
+ });
92
+ const p = path.join(dir, "with-ref.bin");
93
+ writeFileSync(p, blob);
94
+ const out = detectSamanthaPlaceholder(p);
95
+ expect(out.kind).toBe("real-preset");
96
+ });
97
+ });
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Samantha-preset placeholder detection + on-the-fly regeneration.
3
+ *
4
+ * Background: the canonical default voice (Samantha, `af_same`) ships with
5
+ * the Eliza-1 bundle as `cache/voice-preset-default.bin` (ELZ1 format).
6
+ * The first I-wave shipped a 1052-byte zero-filled placeholder before the
7
+ * real preset bytes were produced — the runtime treats this placeholder as
8
+ * "not yet generated" and synthesises a fresh preset on first boot via the
9
+ * fused OmniVoice TTS (Path A).
10
+ *
11
+ * The detection rule is intentionally narrow: only an ELZ1 v1/v2 file whose
12
+ * (a) speaker embedding is exactly zero AND (b) ref_audio_tokens / ref_text
13
+ * are empty AND (c) phrase-cache seed is empty counts as a placeholder. Any
14
+ * file that has even one non-zero region is considered real and is left
15
+ * alone — the runtime never silently overwrites operator-supplied presets.
16
+ *
17
+ * The fallback chain executed by `EngineVoiceBridge.start()`:
18
+ *
19
+ * 1. If `cache/voice-preset-default.bin` is missing → throw (existing
20
+ * behaviour, the bundle is malformed).
21
+ * 2. If the file exists and is NOT a placeholder → load it as-is.
22
+ * 3. If it IS a placeholder AND the OmniVoice reference-encode FFI is
23
+ * available → regenerate the preset using the bundled Samantha
24
+ * reference clip + transcript, write the new bytes back to disk,
25
+ * then load.
26
+ * 4. If it IS a placeholder AND OmniVoice reference-encode is unavailable
27
+ * → log a loud warning and fall through to the bundled Kokoro default
28
+ * voice (`kokoro.defaultVoiceId`) by re-pointing the discovery layer.
29
+ */
30
+
31
+ import { readFileSync, statSync } from "node:fs";
32
+ import {
33
+ readVoicePresetFile,
34
+ VOICE_PRESET_HEADER_BYTES_V1,
35
+ VOICE_PRESET_MAGIC,
36
+ VOICE_PRESET_VERSION_V1,
37
+ VOICE_PRESET_VERSION_V2,
38
+ type VoicePresetFile,
39
+ VoicePresetFormatError,
40
+ } from "./voice-preset-format";
41
+
42
+ /** The exact byte-length the I-wave placeholder shipped at. Used as a fast
43
+ * pre-check before the more expensive structural parse — files of any
44
+ * other size cannot be the placeholder. */
45
+ export const SAMANTHA_PLACEHOLDER_BYTE_LENGTH = 1052;
46
+
47
+ /** Reasons `detectSamanthaPlaceholder` returns. Each is structurally
48
+ * distinct so the caller can branch without re-parsing. */
49
+ export type SamanthaPlaceholderState =
50
+ | { kind: "missing" }
51
+ | { kind: "real-preset"; reason: string }
52
+ | { kind: "placeholder" }
53
+ | { kind: "unreadable"; reason: string };
54
+
55
+ /**
56
+ * Inspect `presetPath` and report whether it is the I-wave zero-fill
57
+ * placeholder, a real preset, missing, or unreadable. Pure I/O — no
58
+ * mutation of the file.
59
+ */
60
+ export function detectSamanthaPlaceholder(
61
+ presetPath: string,
62
+ ): SamanthaPlaceholderState {
63
+ let bytes: Uint8Array;
64
+ try {
65
+ const stat = statSync(presetPath);
66
+ if (!stat.isFile()) {
67
+ return { kind: "unreadable", reason: "path is not a regular file" };
68
+ }
69
+ bytes = new Uint8Array(readFileSync(presetPath));
70
+ } catch (err) {
71
+ const code = (err as NodeJS.ErrnoException).code;
72
+ if (code === "ENOENT") return { kind: "missing" };
73
+ return {
74
+ kind: "unreadable",
75
+ reason: (err as Error).message ?? String(err),
76
+ };
77
+ }
78
+
79
+ // Fast path: only the exact placeholder byte-length is a candidate.
80
+ if (bytes.byteLength !== SAMANTHA_PLACEHOLDER_BYTE_LENGTH) {
81
+ return { kind: "real-preset", reason: "byte-length mismatch" };
82
+ }
83
+
84
+ // Structural path: must parse as ELZ1 v1/v2 with all-zero embedding and
85
+ // empty ref/phrase sections.
86
+ if (bytes.byteLength < VOICE_PRESET_HEADER_BYTES_V1) {
87
+ return { kind: "real-preset", reason: "too short for v1 header" };
88
+ }
89
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
90
+ if (view.getUint32(0, true) !== VOICE_PRESET_MAGIC) {
91
+ return { kind: "real-preset", reason: "magic mismatch" };
92
+ }
93
+ const version = view.getUint32(4, true);
94
+ if (
95
+ version !== VOICE_PRESET_VERSION_V1 &&
96
+ version !== VOICE_PRESET_VERSION_V2
97
+ ) {
98
+ return { kind: "real-preset", reason: "version mismatch" };
99
+ }
100
+
101
+ let parsed: VoicePresetFile;
102
+ try {
103
+ parsed = readVoicePresetFile(bytes);
104
+ } catch (err) {
105
+ // Malformed v2 file — not a placeholder we own; surface as
106
+ // real-preset so the loader's existing error path runs.
107
+ if (err instanceof VoicePresetFormatError) {
108
+ return { kind: "real-preset", reason: `parse failed: ${err.code}` };
109
+ }
110
+ throw err;
111
+ }
112
+
113
+ if (parsed.embedding.length === 0) {
114
+ return { kind: "real-preset", reason: "empty embedding section" };
115
+ }
116
+ if (!parsed.embedding.every((v) => v === 0)) {
117
+ return { kind: "real-preset", reason: "non-zero embedding sample" };
118
+ }
119
+ if (parsed.refAudioTokens.tokens.length !== 0) {
120
+ return { kind: "real-preset", reason: "ref_audio_tokens populated" };
121
+ }
122
+ if (parsed.refText.length !== 0) {
123
+ return { kind: "real-preset", reason: "ref_text populated" };
124
+ }
125
+ if (parsed.phrases.length !== 0) {
126
+ return { kind: "real-preset", reason: "phrase-cache seed populated" };
127
+ }
128
+
129
+ return { kind: "placeholder" };
130
+ }
131
+
132
+ /**
133
+ * The text the on-the-fly regeneration uses as the Samantha reference
134
+ * transcript. Stable across versions so the produced preset is
135
+ * deterministic — pinning the prompt is part of the cacheability contract
136
+ * (same inputs -> same output bytes for byte-for-byte comparison).
137
+ */
138
+ export const SAMANTHA_REFERENCE_TRANSCRIPT =
139
+ "Hi, I'm Samantha. It's nice to finally talk to you about something real.";
140
+
141
+ /**
142
+ * The closed-vocabulary VoiceDesign instruct string baked into the
143
+ * regenerated Samantha preset. Mirrors the publish-time freeze CLI's
144
+ * settings so the runtime regen and a future operator-built preset land on
145
+ * the same surface. Pinned for deterministic regeneration.
146
+ */
147
+ export const SAMANTHA_INSTRUCT =
148
+ "female, american accent, young adult, moderate pitch";
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Samantha-preset on-the-fly regeneration via the fused OmniVoice FFI.
3
+ *
4
+ * Path A from W3-11: when the bundle ships the I-wave zero-fill placeholder
5
+ * for `cache/voice-preset-default.bin`, the runtime synthesises a real
6
+ * preset by encoding the bundled Samantha reference clip through the FFI's
7
+ * `eliza_inference_encode_reference` entrypoint and writing the resulting
8
+ * `ref_audio_tokens` + canonical instruct/refText into a v2 preset blob.
9
+ *
10
+ * Determinism contract:
11
+ * - The reference clip bytes (24 kHz mono fp32 WAV) are pinned in the
12
+ * bundle.
13
+ * - The reference transcript (`SAMANTHA_REFERENCE_TRANSCRIPT`) is pinned.
14
+ * - The instruct string (`SAMANTHA_INSTRUCT`) is pinned.
15
+ * - The OmniVoice encode entrypoint does not consume randomness (the
16
+ * HuBERT semantic + RVQ codec passes are pure functions of the input
17
+ * PCM + the model weights).
18
+ * Therefore the produced preset bytes are reproducible byte-for-byte across
19
+ * boots given the same FFI library + bundle.
20
+ */
21
+ /** Outcome of `ensureSamanthaPresetReady`. Distinct kinds let the caller
22
+ * log the right thing at the right level without re-doing detection. */
23
+ export type EnsureSamanthaPresetOutcome = {
24
+ kind: "real-preset";
25
+ } | {
26
+ kind: "missing-bundle-preset";
27
+ } | {
28
+ kind: "regenerated";
29
+ bytes: number;
30
+ K: number;
31
+ refT: number;
32
+ } | {
33
+ kind: "placeholder-no-regen";
34
+ reason: "missing-reference-wav" | "missing-ffi-library" | "ffi-no-encode-reference" | "encode-reference-failed";
35
+ detail: string;
36
+ };
37
+ export interface RegenerateOptions {
38
+ bundleRoot: string;
39
+ /** Absolute path the regenerated preset bytes should target. The caller
40
+ * performs the write — this function only produces the bytes + metadata. */
41
+ presetPath: string;
42
+ /** Override path to the Samantha reference WAV. Defaults to the bundle's
43
+ * `tts/omnivoice/samantha-ref.wav`. */
44
+ referenceWav?: string;
45
+ /** Override the canonical reference transcript. Defaults to the pinned
46
+ * `SAMANTHA_REFERENCE_TRANSCRIPT`. */
47
+ referenceText?: string;
48
+ }
49
+ export interface RegenerateResult {
50
+ bytes: Uint8Array;
51
+ K: number;
52
+ refT: number;
53
+ embeddingDim: number;
54
+ }
55
+ /**
56
+ * Decode a 24 kHz mono Float32 LE WAV file into a Float32Array of PCM
57
+ * samples. Refuses anything that is not the canonical OmniVoice reference
58
+ * format — encoders happily accept stereo / 16-bit / 48 kHz inputs and
59
+ * silently degrade, which is exactly the kind of fallback sludge AGENTS.md
60
+ * §3 forbids. We require the file be in the right format up front.
61
+ */
62
+ export declare function decodeMonoFloat32Wav24kHz(bytes: Uint8Array): Float32Array;
63
+ /**
64
+ * Run the on-the-fly regeneration. Loads the bundle's OmniVoice FFI, calls
65
+ * `encodeReference` against the Samantha reference clip, and serialises the
66
+ * result into an ELZ1 v2 preset blob. The caller writes the bytes to disk.
67
+ */
68
+ export declare function regenerateSamanthaPresetFromBundle(opts: RegenerateOptions): Promise<RegenerateResult>;
69
+ /**
70
+ * Pre-flight: detect a placeholder preset at the bundle's canonical path
71
+ * and regenerate it via OmniVoice when possible. Called by the engine's
72
+ * `ensureActiveBundleVoiceReady()` before the synchronous preset load.
73
+ *
74
+ * Outcomes:
75
+ *
76
+ * - `real-preset` — nothing to do; the file is a real preset.
77
+ * - `missing-bundle-preset` — file does not exist; the engine's existing
78
+ * error path runs (loud failure).
79
+ * - `regenerated` — preset bytes were generated and written.
80
+ * - `placeholder-no-regen` — placeholder detected but regen could not
81
+ * run (FFI missing, reference clip missing,
82
+ * etc.). Returned for the caller to log; the
83
+ * engine then falls through to the bundled
84
+ * Kokoro default voice.
85
+ */
86
+ export declare function ensureSamanthaPresetReady(bundleRoot: string): Promise<EnsureSamanthaPresetOutcome>;
87
+ //# sourceMappingURL=samantha-preset-regenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samantha-preset-regenerator.d.ts","sourceRoot":"","sources":["samantha-preset-regenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAgBH;yEACyE;AACzE,MAAM,MAAM,2BAA2B,GACpC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/D;IACA,IAAI,EAAE,sBAAsB,CAAC;IAC7B,MAAM,EACH,uBAAuB,GACvB,qBAAqB,GACrB,yBAAyB,GACzB,yBAAyB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CACd,CAAC;AAEL,MAAM,WAAW,iBAAiB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB;iFAC6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB;4CACwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;2CACuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,UAAU,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACrB;AAqCD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAsEzE;AAED;;;;GAIG;AACH,wBAAsB,kCAAkC,CACvD,IAAI,EAAE,iBAAiB,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAmH3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,yBAAyB,CAC9C,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,CAAC,CAgEtC"}