@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,21 @@
1
+ /**
2
+ * Typed unavailability error for ASR backends. Mirrors
3
+ * `ImageGenBackendUnavailableError` from `../imagegen/errors`.
4
+ *
5
+ * Backends throw this to signal that a specific request cannot be served
6
+ * (`unsupported_request`, `model_missing`, `load_failed`, ...) so the
7
+ * arbiter / caller can surface an actionable message rather than a generic
8
+ * "transcription failed".
9
+ */
10
+ export type AsrUnavailableReason = "unsupported_request" | "model_missing" | "load_failed" | "decode_failed" | "aborted";
11
+ export declare class AsrBackendUnavailableError extends Error {
12
+ readonly backendId: string;
13
+ readonly reason: AsrUnavailableReason;
14
+ readonly code = "ASR_BACKEND_UNAVAILABLE";
15
+ constructor(backendId: string, reason: AsrUnavailableReason, message: string, options?: {
16
+ cause?: unknown;
17
+ });
18
+ toJSON(): Record<string, string>;
19
+ }
20
+ export declare function isAsrBackendUnavailable(err: unknown): err is AsrBackendUnavailableError;
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,oBAAoB,GAC7B,qBAAqB,GACrB,eAAe,GACf,aAAa,GACb,eAAe,GACf,SAAS,CAAC;AAEb,qBAAa,0BAA2B,SAAQ,KAAK;IAInD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IAJtC,QAAQ,CAAC,IAAI,6BAA6B;gBAGhC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,oBAAoB,EACrC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAM9B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQhC;AAED,wBAAgB,uBAAuB,CACtC,GAAG,EAAE,OAAO,GACV,GAAG,IAAI,0BAA0B,CAOnC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Typed unavailability error for ASR backends. Mirrors
3
+ * `ImageGenBackendUnavailableError` from `../imagegen/errors`.
4
+ *
5
+ * Backends throw this to signal that a specific request cannot be served
6
+ * (`unsupported_request`, `model_missing`, `load_failed`, ...) so the
7
+ * arbiter / caller can surface an actionable message rather than a generic
8
+ * "transcription failed".
9
+ */
10
+
11
+ export type AsrUnavailableReason =
12
+ | "unsupported_request"
13
+ | "model_missing"
14
+ | "load_failed"
15
+ | "decode_failed"
16
+ | "aborted";
17
+
18
+ export class AsrBackendUnavailableError extends Error {
19
+ readonly code = "ASR_BACKEND_UNAVAILABLE";
20
+
21
+ constructor(
22
+ readonly backendId: string,
23
+ readonly reason: AsrUnavailableReason,
24
+ message: string,
25
+ options?: { cause?: unknown },
26
+ ) {
27
+ super(message, options);
28
+ this.name = "AsrBackendUnavailableError";
29
+ }
30
+
31
+ toJSON(): Record<string, string> {
32
+ return {
33
+ code: this.code,
34
+ backendId: this.backendId,
35
+ reason: this.reason,
36
+ message: this.message,
37
+ };
38
+ }
39
+ }
40
+
41
+ export function isAsrBackendUnavailable(
42
+ err: unknown,
43
+ ): err is AsrBackendUnavailableError {
44
+ return (
45
+ err instanceof AsrBackendUnavailableError ||
46
+ (typeof err === "object" &&
47
+ err !== null &&
48
+ (err as { code?: unknown }).code === "ASR_BACKEND_UNAVAILABLE")
49
+ );
50
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Content-hash keys for the ASR transcript cache.
3
+ *
4
+ * The arbiter caches `AsrResult.text` by the SHA-256 of the
5
+ * sample-rate-normalized PCM bytes. The hash is fast (one pass over the
6
+ * fp32 buffer + a 4-byte sample-rate prefix) and stable across runs, so a
7
+ * caller who re-issues the same WAV gets the cached transcript without
8
+ * re-running the backend.
9
+ *
10
+ * We hash the underlying byte view of the Float32Array, not a re-quantized
11
+ * representation, so caller-supplied PCM that came from a 16-bit WAV
12
+ * decode (the common case from the `runtime.useModel(TRANSCRIPTION, ...)`
13
+ * path) deduplicates correctly with caller-supplied PCM that came from a
14
+ * fp32 mic capture.
15
+ */
16
+ import type { AsrRequest } from "./types";
17
+ /**
18
+ * Hash a PCM buffer + sample rate into a stable cache key. The output is
19
+ * `<modelFamily>::sha256(<sampleRateLE><pcmBytes>)`.
20
+ *
21
+ * - `sampleRateLE`: 4-byte little-endian uint32 prefix so 16 kHz / 24 kHz
22
+ * inputs of the same float samples produce different keys.
23
+ * - `pcmBytes`: the raw fp32 view (`pcm.buffer.slice(pcm.byteOffset, pcm.byteOffset + pcm.byteLength)`).
24
+ *
25
+ * Returns the hex digest namespaced by family.
26
+ */
27
+ export declare function hashAsrInput(req: AsrRequest, family?: string): string;
28
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAerE"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Content-hash keys for the ASR transcript cache.
3
+ *
4
+ * The arbiter caches `AsrResult.text` by the SHA-256 of the
5
+ * sample-rate-normalized PCM bytes. The hash is fast (one pass over the
6
+ * fp32 buffer + a 4-byte sample-rate prefix) and stable across runs, so a
7
+ * caller who re-issues the same WAV gets the cached transcript without
8
+ * re-running the backend.
9
+ *
10
+ * We hash the underlying byte view of the Float32Array, not a re-quantized
11
+ * representation, so caller-supplied PCM that came from a 16-bit WAV
12
+ * decode (the common case from the `runtime.useModel(TRANSCRIPTION, ...)`
13
+ * path) deduplicates correctly with caller-supplied PCM that came from a
14
+ * fp32 mic capture.
15
+ */
16
+
17
+ import { createHash } from "node:crypto";
18
+
19
+ import type { AsrRequest } from "./types";
20
+
21
+ /** Family namespace prepended to every hash so caches scoped to different ASR families don't collide. */
22
+ const HASH_FAMILY_DEFAULT = "qwen3-asr";
23
+
24
+ /**
25
+ * Hash a PCM buffer + sample rate into a stable cache key. The output is
26
+ * `<modelFamily>::sha256(<sampleRateLE><pcmBytes>)`.
27
+ *
28
+ * - `sampleRateLE`: 4-byte little-endian uint32 prefix so 16 kHz / 24 kHz
29
+ * inputs of the same float samples produce different keys.
30
+ * - `pcmBytes`: the raw fp32 view (`pcm.buffer.slice(pcm.byteOffset, pcm.byteOffset + pcm.byteLength)`).
31
+ *
32
+ * Returns the hex digest namespaced by family.
33
+ */
34
+ export function hashAsrInput(req: AsrRequest, family?: string): string {
35
+ const hasher = createHash("sha256");
36
+ const rateBuf = new ArrayBuffer(4);
37
+ new DataView(rateBuf).setUint32(
38
+ 0,
39
+ Math.max(0, Math.floor(req.sampleRateHz)),
40
+ true,
41
+ );
42
+ hasher.update(new Uint8Array(rateBuf));
43
+ const pcm = req.pcm;
44
+ const bytes = new Uint8Array(pcm.buffer, pcm.byteOffset, pcm.byteLength);
45
+ hasher.update(bytes);
46
+ if (req.language) hasher.update(`lang:${req.language}`);
47
+ const fam = req.modelFamily ?? family ?? HASH_FAMILY_DEFAULT;
48
+ return `${fam}::${hasher.digest("hex")}`;
49
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Local ASR (transcription) capability — public entry point.
3
+ *
4
+ * This module is what `provider.ts` (`createTranscriptionHandler`), the
5
+ * voice pipeline bridge, and additional ASR consumers import to register the
6
+ * capability with the WS1 MemoryArbiter.
7
+ *
8
+ * Wiring:
9
+ *
10
+ * const arbiter = service.getMemoryArbiter();
11
+ * const registration = createAsrCapabilityRegistration({
12
+ * loader: createDefaultAsrLoader({ ... }),
13
+ * transcriptCache: arbiter,
14
+ * });
15
+ * arbiter.registerCapability(registration);
16
+ *
17
+ * `createAsrCapabilityRegistration` wraps the underlying backend so the
18
+ * arbiter's `run(request)` path:
19
+ *
20
+ * 1. Calls `backend.supports(request)`. If false, the arbiter throws
21
+ * `AsrBackendUnavailableError` with `unsupported_request`.
22
+ * 2. Hashes the request's PCM bytes (sample-rate-normalized) and looks
23
+ * it up in the optional `transcriptCache`. On a hit, the backend is
24
+ * skipped entirely and the cached text is returned.
25
+ * 3. On a miss, calls `backend.transcribe(request)`, stores the
26
+ * transcript under the same hash, and returns the result.
27
+ *
28
+ * The capability registers with `residentRole: "asr"` — distinct from the
29
+ * `vision` slot that `vision-describe` and `image-gen` co-evict in.
30
+ * Qwen-ASR cohabits comfortably with text on most desktops (≈600 MB for
31
+ * Q4_K_M Qwen3-ASR-0.6B), but on a 6 GB iPhone / 8 GB low-tier Android
32
+ * the arbiter's resident-role priority still lets a text-large request
33
+ * evict the ASR handle when memory is tight. See `memory-arbiter.ts`
34
+ * `RESIDENT_ROLE_PRIORITY`.
35
+ */
36
+ export { AsrBackendUnavailableError, type AsrUnavailableReason, isAsrBackendUnavailable, } from "./errors";
37
+ export { hashAsrInput } from "./hash";
38
+ export type { AsrBackend, AsrBackendLoader, AsrLoadArgs, AsrRequest, AsrResult, } from "./types";
39
+ import type { CapabilityRegistration } from "../memory-arbiter";
40
+ import type { AsrBackend, AsrBackendLoader, AsrRequest, AsrResult } from "./types";
41
+ /**
42
+ * Minimal cache shape the registration accepts. Lets tests inject a fake
43
+ * cache without pulling in the whole MemoryArbiter. The arbiter
44
+ * implements this surface (see `memory-arbiter.ts` `getCachedAsrTranscript`
45
+ * / `setCachedAsrTranscript`).
46
+ */
47
+ export interface AsrTranscriptCacheLike {
48
+ getCachedAsrTranscript(hash: string): {
49
+ text: string;
50
+ live?: boolean;
51
+ } | null;
52
+ setCachedAsrTranscript(hash: string, entry: {
53
+ text: string;
54
+ }, ttlMs?: number): void;
55
+ }
56
+ export interface CreateAsrCapabilityRegistrationOptions {
57
+ loader: AsrBackendLoader;
58
+ /** Optional content-hash cache. When provided, identical PCM inputs skip the backend. */
59
+ transcriptCache?: AsrTranscriptCacheLike;
60
+ /** Default model family for the cache key. Defaults to `qwen3-asr`. */
61
+ modelFamily?: string;
62
+ /**
63
+ * Best-effort RAM footprint estimate for the loaded weights. The
64
+ * arbiter only uses this for telemetry; eviction is by priority. The
65
+ * default (600 MB) matches Q4_K_M Qwen3-ASR-0.6B; larger ASR models
66
+ * SHOULD pass a higher estimate.
67
+ */
68
+ estimatedMb?: number;
69
+ }
70
+ /**
71
+ * Build a `CapabilityRegistration` ready to feed to
72
+ * `arbiter.registerCapability()`. Mirrors `createVisionCapabilityRegistration`
73
+ * (WS2) and `createImageGenCapabilityRegistration` (WS3).
74
+ */
75
+ export declare function createAsrCapabilityRegistration(opts: CreateAsrCapabilityRegistrationOptions): CapabilityRegistration<AsrBackend, AsrRequest, AsrResult>;
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EACN,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,uBAAuB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,YAAY,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,SAAS,GACT,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAEX,sBAAsB,EACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EACX,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,MAAM,SAAS,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACtC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9E,sBAAsB,CACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EACvB,KAAK,CAAC,EAAE,MAAM,GACZ,IAAI,CAAC;CACR;AAED,MAAM,WAAW,sCAAsC;IACtD,MAAM,EAAE,gBAAgB,CAAC;IACzB,yFAAyF;IACzF,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,sCAAsC,GAC1C,sBAAsB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CA6E3D"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Local ASR (transcription) capability — public entry point.
3
+ *
4
+ * This module is what `provider.ts` (`createTranscriptionHandler`), the
5
+ * voice pipeline bridge, and additional ASR consumers import to register the
6
+ * capability with the WS1 MemoryArbiter.
7
+ *
8
+ * Wiring:
9
+ *
10
+ * const arbiter = service.getMemoryArbiter();
11
+ * const registration = createAsrCapabilityRegistration({
12
+ * loader: createDefaultAsrLoader({ ... }),
13
+ * transcriptCache: arbiter,
14
+ * });
15
+ * arbiter.registerCapability(registration);
16
+ *
17
+ * `createAsrCapabilityRegistration` wraps the underlying backend so the
18
+ * arbiter's `run(request)` path:
19
+ *
20
+ * 1. Calls `backend.supports(request)`. If false, the arbiter throws
21
+ * `AsrBackendUnavailableError` with `unsupported_request`.
22
+ * 2. Hashes the request's PCM bytes (sample-rate-normalized) and looks
23
+ * it up in the optional `transcriptCache`. On a hit, the backend is
24
+ * skipped entirely and the cached text is returned.
25
+ * 3. On a miss, calls `backend.transcribe(request)`, stores the
26
+ * transcript under the same hash, and returns the result.
27
+ *
28
+ * The capability registers with `residentRole: "asr"` — distinct from the
29
+ * `vision` slot that `vision-describe` and `image-gen` co-evict in.
30
+ * Qwen-ASR cohabits comfortably with text on most desktops (≈600 MB for
31
+ * Q4_K_M Qwen3-ASR-0.6B), but on a 6 GB iPhone / 8 GB low-tier Android
32
+ * the arbiter's resident-role priority still lets a text-large request
33
+ * evict the ASR handle when memory is tight. See `memory-arbiter.ts`
34
+ * `RESIDENT_ROLE_PRIORITY`.
35
+ */
36
+
37
+ export {
38
+ AsrBackendUnavailableError,
39
+ type AsrUnavailableReason,
40
+ isAsrBackendUnavailable,
41
+ } from "./errors";
42
+ export { hashAsrInput } from "./hash";
43
+ export type {
44
+ AsrBackend,
45
+ AsrBackendLoader,
46
+ AsrLoadArgs,
47
+ AsrRequest,
48
+ AsrResult,
49
+ } from "./types";
50
+
51
+ import type {
52
+ ArbiterCapability,
53
+ CapabilityRegistration,
54
+ } from "../memory-arbiter";
55
+ import { AsrBackendUnavailableError } from "./errors";
56
+ import { hashAsrInput } from "./hash";
57
+ import type {
58
+ AsrBackend,
59
+ AsrBackendLoader,
60
+ AsrRequest,
61
+ AsrResult,
62
+ } from "./types";
63
+
64
+ /**
65
+ * Minimal cache shape the registration accepts. Lets tests inject a fake
66
+ * cache without pulling in the whole MemoryArbiter. The arbiter
67
+ * implements this surface (see `memory-arbiter.ts` `getCachedAsrTranscript`
68
+ * / `setCachedAsrTranscript`).
69
+ */
70
+ export interface AsrTranscriptCacheLike {
71
+ getCachedAsrTranscript(hash: string): { text: string; live?: boolean } | null;
72
+ setCachedAsrTranscript(
73
+ hash: string,
74
+ entry: { text: string },
75
+ ttlMs?: number,
76
+ ): void;
77
+ }
78
+
79
+ export interface CreateAsrCapabilityRegistrationOptions {
80
+ loader: AsrBackendLoader;
81
+ /** Optional content-hash cache. When provided, identical PCM inputs skip the backend. */
82
+ transcriptCache?: AsrTranscriptCacheLike;
83
+ /** Default model family for the cache key. Defaults to `qwen3-asr`. */
84
+ modelFamily?: string;
85
+ /**
86
+ * Best-effort RAM footprint estimate for the loaded weights. The
87
+ * arbiter only uses this for telemetry; eviction is by priority. The
88
+ * default (600 MB) matches Q4_K_M Qwen3-ASR-0.6B; larger ASR models
89
+ * SHOULD pass a higher estimate.
90
+ */
91
+ estimatedMb?: number;
92
+ }
93
+
94
+ /**
95
+ * Build a `CapabilityRegistration` ready to feed to
96
+ * `arbiter.registerCapability()`. Mirrors `createVisionCapabilityRegistration`
97
+ * (WS2) and `createImageGenCapabilityRegistration` (WS3).
98
+ */
99
+ export function createAsrCapabilityRegistration(
100
+ opts: CreateAsrCapabilityRegistrationOptions,
101
+ ): CapabilityRegistration<AsrBackend, AsrRequest, AsrResult> {
102
+ const capability: ArbiterCapability = "transcribe";
103
+ const loader = opts.loader;
104
+ const cache = opts.transcriptCache;
105
+ const family = opts.modelFamily ?? "qwen3-asr";
106
+ return {
107
+ capability,
108
+ // "asr" is its own resident-role slot in RESIDENT_ROLE_PRIORITY.
109
+ // Qwen-ASR doesn't coexist in the same VRAM band as vision/image-gen
110
+ // — the arbiter only evicts ASR when a higher-priority role
111
+ // (text-target, text-drafter) needs the budget back.
112
+ residentRole: "asr",
113
+ estimatedMb: opts.estimatedMb ?? 600,
114
+ async load(modelKey: string): Promise<AsrBackend> {
115
+ return await loader(modelKey);
116
+ },
117
+ async unload(backend: AsrBackend): Promise<void> {
118
+ await backend.dispose();
119
+ },
120
+ async run(backend: AsrBackend, request: AsrRequest): Promise<AsrResult> {
121
+ if (!(request.pcm instanceof Float32Array) || request.pcm.length === 0) {
122
+ throw new AsrBackendUnavailableError(
123
+ backend.id,
124
+ "unsupported_request",
125
+ `[asr] backend "${backend.id}" requires non-empty Float32Array pcm`,
126
+ );
127
+ }
128
+ if (!Number.isFinite(request.sampleRateHz) || request.sampleRateHz <= 0) {
129
+ throw new AsrBackendUnavailableError(
130
+ backend.id,
131
+ "unsupported_request",
132
+ `[asr] backend "${backend.id}" requires a positive sampleRateHz; got ${request.sampleRateHz}`,
133
+ );
134
+ }
135
+ if (!backend.supports(request)) {
136
+ throw new AsrBackendUnavailableError(
137
+ backend.id,
138
+ "unsupported_request",
139
+ `[asr] backend "${backend.id}" does not support this request (sampleRateHz=${request.sampleRateHz} pcmSamples=${request.pcm.length})`,
140
+ );
141
+ }
142
+ // Content-hash cache lookup. Honour `signal` between cache + backend.
143
+ if (request.signal?.aborted) {
144
+ throw request.signal.reason instanceof Error
145
+ ? request.signal.reason
146
+ : new DOMException("Aborted", "AbortError");
147
+ }
148
+ let hash: string | null = null;
149
+ if (cache) {
150
+ try {
151
+ hash = hashAsrInput(request, family);
152
+ const hit = cache.getCachedAsrTranscript(hash);
153
+ if (hit && hit.live !== false) {
154
+ return { text: hit.text, cacheHit: true };
155
+ }
156
+ } catch {
157
+ // Hashing failed (zero-length pcm guarded above; this catches
158
+ // hash backend issues). Fall through to the backend.
159
+ hash = null;
160
+ }
161
+ }
162
+ const result = await backend.transcribe(request);
163
+ if (request.signal?.aborted) {
164
+ throw request.signal.reason instanceof Error
165
+ ? request.signal.reason
166
+ : new DOMException("Aborted", "AbortError");
167
+ }
168
+ if (cache && hash) {
169
+ try {
170
+ cache.setCachedAsrTranscript(hash, { text: result.text });
171
+ } catch {
172
+ // Caching is best-effort; never let a cache write fail a request.
173
+ }
174
+ }
175
+ return { ...result, cacheHit: false };
176
+ },
177
+ };
178
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Local ASR (transcription) types — mirrors the WS2 vision-describe and
3
+ * WS3 image-gen splits.
4
+ *
5
+ * Two layers live here:
6
+ *
7
+ * 1. The **request/result** contract every backend implements
8
+ * (`AsrRequest`, `AsrResult`). Callers pass mono 16 kHz fp32 PCM (or
9
+ * a sample rate the backend can resample from), backends return a
10
+ * transcript string plus optional token / segment metadata.
11
+ *
12
+ * 2. The **backend** interface (`AsrBackend`) the `MemoryArbiter`
13
+ * (WS1) registers as a capability handler. One backend per
14
+ * per-platform path:
15
+ *
16
+ * - `fused` — `eliza_inference_asr_*` ABI (Qwen3-ASR
17
+ * inside the fused libelizainference). The sole on-device ASR
18
+ * runtime: Linux / macOS / Windows desktop, AOSP system app via
19
+ * the same fused build.
20
+ * - `coreml` — Capacitor bridge to a Core ML ASR
21
+ * model on iOS (unavailable until the bridge ships).
22
+ * - `aosp-ffi` — bun:ffi shim around the AOSP NDK
23
+ * Qwen-ASR JNI handle (unavailable until the AOSP fused
24
+ * ASR symbols are exported).
25
+ * - `fake` — deterministic in-process backend used by tests.
26
+ *
27
+ * Cache contract:
28
+ *
29
+ * The arbiter caches transcript text by **content hash** of the input PCM
30
+ * (sample-rate-normalized to 16 kHz mono). The cache namespace is
31
+ * `asr-transcripts` — distinct from the WS2 vision-embedding cache
32
+ * (`vision-projector-tokens`) and the WS3 image-gen request key space.
33
+ * Re-transcribing the same audio is a fast text return; the backend
34
+ * never re-runs.
35
+ */
36
+ /** A request the ASR capability handler accepts. */
37
+ export interface AsrRequest {
38
+ /**
39
+ * Mono 32-bit float PCM samples. Range [-1, 1]. The backend will resample
40
+ * to 16 kHz internally if `sampleRateHz` is not 16000.
41
+ */
42
+ pcm: Float32Array;
43
+ /** Sample rate of `pcm`, in Hz. Common values: 16000, 24000, 48000. */
44
+ sampleRateHz: number;
45
+ /** Optional caller-supplied abort signal. Backends MUST honour it. */
46
+ signal?: AbortSignal;
47
+ /** Optional model family tag for cache scoping. Defaults to `qwen3-asr`. */
48
+ modelFamily?: string;
49
+ /** Optional BCP-47 language hint (e.g. `"en"`, `"zh"`). Backends may ignore. */
50
+ language?: string;
51
+ }
52
+ /** Backend response. The arbiter normalizes this back to a plain string for the model handler. */
53
+ export interface AsrResult {
54
+ /** Final transcript. Whitespace-trimmed. Never undefined; empty string is a real "no speech detected" result. */
55
+ text: string;
56
+ /** Optional per-segment timings. Backends that support diarization emit one segment per speaker turn. */
57
+ segments?: ReadonlyArray<{
58
+ text: string;
59
+ startMs: number;
60
+ endMs: number;
61
+ speaker?: string;
62
+ }>;
63
+ /** Optional Qwen2-BPE token ids — the fused build emits these so STT-finish token injection skips re-tokenization. */
64
+ tokens?: ReadonlyArray<number>;
65
+ /** Optional inference time in ms (wall clock, not GPU compute). */
66
+ inferenceTimeMs?: number;
67
+ /** True when the response came from the arbiter's content-hash cache. */
68
+ cacheHit?: boolean;
69
+ }
70
+ /** Arguments the arbiter passes to the loader. */
71
+ export interface AsrLoadArgs {
72
+ modelKey: string;
73
+ }
74
+ /** Backend contract. Every per-platform ASR runtime implements this. */
75
+ export interface AsrBackend {
76
+ /** Stable identifier for telemetry / errors (`"fused"`, `"coreml"`, `"aosp-ffi"`, ...). */
77
+ readonly id: string;
78
+ /**
79
+ * Whether this backend supports the request as-is. False → the arbiter
80
+ * throws `AsrBackendUnavailableError` with `unsupported_request`. Most
81
+ * backends return `true` for any non-empty PCM ≤ a hard length cap.
82
+ */
83
+ supports(req: AsrRequest): boolean;
84
+ /** Run a transcription. The backend MUST honour `req.signal`. */
85
+ transcribe(req: AsrRequest): Promise<AsrResult>;
86
+ /** Release native resources held by this backend handle. */
87
+ dispose(): Promise<void>;
88
+ }
89
+ /** Async loader the registration takes — invoked by the arbiter on first use of a given modelKey. */
90
+ export type AsrBackendLoader = (modelKey: string) => Promise<AsrBackend>;
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,oDAAoD;AACpD,MAAM,WAAW,UAAU;IAC1B;;;OAGG;IACH,GAAG,EAAE,YAAY,CAAC;IAClB,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,kGAAkG;AAClG,MAAM,WAAW,SAAS;IACzB,iHAAiH;IACjH,IAAI,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,QAAQ,CAAC,EAAE,aAAa,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,sHAAsH;IACtH,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,UAAU;IAC1B,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC;IACnC,iEAAiE;IACjE,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD,4DAA4D;IAC5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,qGAAqG;AACrG,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Local ASR (transcription) types — mirrors the WS2 vision-describe and
3
+ * WS3 image-gen splits.
4
+ *
5
+ * Two layers live here:
6
+ *
7
+ * 1. The **request/result** contract every backend implements
8
+ * (`AsrRequest`, `AsrResult`). Callers pass mono 16 kHz fp32 PCM (or
9
+ * a sample rate the backend can resample from), backends return a
10
+ * transcript string plus optional token / segment metadata.
11
+ *
12
+ * 2. The **backend** interface (`AsrBackend`) the `MemoryArbiter`
13
+ * (WS1) registers as a capability handler. One backend per
14
+ * per-platform path:
15
+ *
16
+ * - `fused` — `eliza_inference_asr_*` ABI (Qwen3-ASR
17
+ * inside the fused libelizainference). The sole on-device ASR
18
+ * runtime: Linux / macOS / Windows desktop, AOSP system app via
19
+ * the same fused build.
20
+ * - `coreml` — Capacitor bridge to a Core ML ASR
21
+ * model on iOS (unavailable until the bridge ships).
22
+ * - `aosp-ffi` — bun:ffi shim around the AOSP NDK
23
+ * Qwen-ASR JNI handle (unavailable until the AOSP fused
24
+ * ASR symbols are exported).
25
+ * - `fake` — deterministic in-process backend used by tests.
26
+ *
27
+ * Cache contract:
28
+ *
29
+ * The arbiter caches transcript text by **content hash** of the input PCM
30
+ * (sample-rate-normalized to 16 kHz mono). The cache namespace is
31
+ * `asr-transcripts` — distinct from the WS2 vision-embedding cache
32
+ * (`vision-projector-tokens`) and the WS3 image-gen request key space.
33
+ * Re-transcribing the same audio is a fast text return; the backend
34
+ * never re-runs.
35
+ */
36
+
37
+ /** A request the ASR capability handler accepts. */
38
+ export interface AsrRequest {
39
+ /**
40
+ * Mono 32-bit float PCM samples. Range [-1, 1]. The backend will resample
41
+ * to 16 kHz internally if `sampleRateHz` is not 16000.
42
+ */
43
+ pcm: Float32Array;
44
+ /** Sample rate of `pcm`, in Hz. Common values: 16000, 24000, 48000. */
45
+ sampleRateHz: number;
46
+ /** Optional caller-supplied abort signal. Backends MUST honour it. */
47
+ signal?: AbortSignal;
48
+ /** Optional model family tag for cache scoping. Defaults to `qwen3-asr`. */
49
+ modelFamily?: string;
50
+ /** Optional BCP-47 language hint (e.g. `"en"`, `"zh"`). Backends may ignore. */
51
+ language?: string;
52
+ }
53
+
54
+ /** Backend response. The arbiter normalizes this back to a plain string for the model handler. */
55
+ export interface AsrResult {
56
+ /** Final transcript. Whitespace-trimmed. Never undefined; empty string is a real "no speech detected" result. */
57
+ text: string;
58
+ /** Optional per-segment timings. Backends that support diarization emit one segment per speaker turn. */
59
+ segments?: ReadonlyArray<{
60
+ text: string;
61
+ startMs: number;
62
+ endMs: number;
63
+ speaker?: string;
64
+ }>;
65
+ /** Optional Qwen2-BPE token ids — the fused build emits these so STT-finish token injection skips re-tokenization. */
66
+ tokens?: ReadonlyArray<number>;
67
+ /** Optional inference time in ms (wall clock, not GPU compute). */
68
+ inferenceTimeMs?: number;
69
+ /** True when the response came from the arbiter's content-hash cache. */
70
+ cacheHit?: boolean;
71
+ }
72
+
73
+ /** Arguments the arbiter passes to the loader. */
74
+ export interface AsrLoadArgs {
75
+ modelKey: string;
76
+ }
77
+
78
+ /** Backend contract. Every per-platform ASR runtime implements this. */
79
+ export interface AsrBackend {
80
+ /** Stable identifier for telemetry / errors (`"fused"`, `"coreml"`, `"aosp-ffi"`, ...). */
81
+ readonly id: string;
82
+ /**
83
+ * Whether this backend supports the request as-is. False → the arbiter
84
+ * throws `AsrBackendUnavailableError` with `unsupported_request`. Most
85
+ * backends return `true` for any non-empty PCM ≤ a hard length cap.
86
+ */
87
+ supports(req: AsrRequest): boolean;
88
+ /** Run a transcription. The backend MUST honour `req.signal`. */
89
+ transcribe(req: AsrRequest): Promise<AsrResult>;
90
+ /** Release native resources held by this backend handle. */
91
+ dispose(): Promise<void>;
92
+ }
93
+
94
+ /** Async loader the registration takes — invoked by the arbiter on first use of a given modelKey. */
95
+ export type AsrBackendLoader = (modelKey: string) => Promise<AsrBackend>;