@elizaos/plugin-local-inference 2.0.0-beta.1 → 2.0.3-beta.2

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 (701) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/package.json +82 -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/actions/transcription-control.d.ts +29 -0
  11. package/src/actions/transcription-control.d.ts.map +1 -0
  12. package/src/actions/transcription-control.test.ts +100 -0
  13. package/src/actions/transcription-control.ts +127 -0
  14. package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
  15. package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
  16. package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
  17. package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
  18. package/src/adapters/capacitor-llama/environment.ts +71 -0
  19. package/src/adapters/capacitor-llama/index.browser.ts +83 -0
  20. package/src/adapters/capacitor-llama/index.ts +807 -0
  21. package/src/adapters/capacitor-llama/loader.ts +109 -0
  22. package/src/adapters/capacitor-llama/structured-output.ts +165 -0
  23. package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
  24. package/src/adapters/capacitor-llama/types.ts +374 -0
  25. package/src/backends/apple-foundation.ts +127 -0
  26. package/src/index.d.ts +8 -0
  27. package/src/index.d.ts.map +1 -0
  28. package/src/index.ts +62 -0
  29. package/src/local-inference-routes.d.ts +38 -0
  30. package/src/local-inference-routes.d.ts.map +1 -0
  31. package/src/local-inference-routes.test.ts +344 -0
  32. package/src/local-inference-routes.ts +1543 -0
  33. package/src/provider.d.ts +21 -0
  34. package/src/provider.d.ts.map +1 -0
  35. package/src/provider.ts +1082 -0
  36. package/src/routes/compat-helpers.d.ts +18 -0
  37. package/src/routes/compat-helpers.d.ts.map +1 -0
  38. package/src/routes/compat-helpers.ts +274 -0
  39. package/src/routes/family-member-route.d.ts +62 -0
  40. package/src/routes/family-member-route.d.ts.map +1 -0
  41. package/src/routes/family-member-route.ts +353 -0
  42. package/src/routes/index.d.ts +19 -0
  43. package/src/routes/index.d.ts.map +1 -0
  44. package/src/routes/index.ts +60 -0
  45. package/src/routes/live-diarization-route.d.ts +26 -0
  46. package/src/routes/live-diarization-route.d.ts.map +1 -0
  47. package/src/routes/live-diarization-route.test.ts +213 -0
  48. package/src/routes/live-diarization-route.ts +122 -0
  49. package/src/routes/local-inference-asr-route.d.ts +4 -0
  50. package/src/routes/local-inference-asr-route.d.ts.map +1 -0
  51. package/src/routes/local-inference-asr-route.test.ts +205 -0
  52. package/src/routes/local-inference-asr-route.ts +163 -0
  53. package/src/routes/local-inference-asr-transcribe.d.ts +20 -0
  54. package/src/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  55. package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
  56. package/src/routes/local-inference-asr-transcribe.ts +97 -0
  57. package/src/routes/local-inference-compat-routes.d.ts +16 -0
  58. package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
  59. package/src/routes/local-inference-compat-routes.test.ts +485 -0
  60. package/src/routes/local-inference-compat-routes.ts +808 -0
  61. package/src/routes/local-inference-tts-route.d.ts +7 -0
  62. package/src/routes/local-inference-tts-route.d.ts.map +1 -0
  63. package/src/routes/local-inference-tts-route.test.ts +179 -0
  64. package/src/routes/local-inference-tts-route.ts +230 -0
  65. package/src/routes/transcript-audio-store.d.ts +15 -0
  66. package/src/routes/transcript-audio-store.d.ts.map +1 -0
  67. package/src/routes/transcript-audio-store.ts +27 -0
  68. package/src/routes/transcripts-routes.d.ts +36 -0
  69. package/src/routes/transcripts-routes.d.ts.map +1 -0
  70. package/src/routes/transcripts-routes.test.ts +144 -0
  71. package/src/routes/transcripts-routes.ts +159 -0
  72. package/src/routes/voice-first-run-routes.d.ts +62 -0
  73. package/src/routes/voice-first-run-routes.d.ts.map +1 -0
  74. package/src/routes/voice-first-run-routes.ts +524 -0
  75. package/src/routes/voice-models-routes.d.ts +62 -0
  76. package/src/routes/voice-models-routes.d.ts.map +1 -0
  77. package/src/routes/voice-models-routes.ts +554 -0
  78. package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
  79. package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  80. package/src/routes/voice-profile-plugin-routes.ts +138 -0
  81. package/src/routes/voice-profiles-management-routes.d.ts +52 -0
  82. package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
  83. package/src/routes/voice-profiles-management-routes.ts +476 -0
  84. package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
  85. package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  86. package/src/routes/voice-speaker-profile-routes.ts +199 -0
  87. package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
  88. package/src/runtime/capacitor-llama.d.ts +25 -0
  89. package/src/runtime/embedding-manager-support.d.ts +77 -0
  90. package/src/runtime/embedding-manager-support.d.ts.map +1 -0
  91. package/src/runtime/embedding-manager-support.ts +497 -0
  92. package/src/runtime/embedding-presets.d.ts +16 -0
  93. package/src/runtime/embedding-presets.d.ts.map +1 -0
  94. package/src/runtime/embedding-presets.ts +81 -0
  95. package/src/runtime/embedding-warmup-policy.d.ts +14 -0
  96. package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
  97. package/src/runtime/embedding-warmup-policy.test.ts +53 -0
  98. package/src/runtime/embedding-warmup-policy.ts +48 -0
  99. package/src/runtime/ensure-local-inference-handler.d.ts +62 -0
  100. package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  101. package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
  102. package/src/runtime/ensure-local-inference-handler.ts +1448 -0
  103. package/src/runtime/index.d.ts +15 -0
  104. package/src/runtime/index.d.ts.map +1 -0
  105. package/src/runtime/index.ts +33 -0
  106. package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
  107. package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  108. package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
  109. package/src/runtime/mobile-local-inference-gate.ts +44 -0
  110. package/src/runtime/voice-entity-binding.d.ts +103 -0
  111. package/src/runtime/voice-entity-binding.d.ts.map +1 -0
  112. package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
  113. package/src/runtime/voice-entity-binding.ts +328 -0
  114. package/src/services/README.md +71 -0
  115. package/src/services/__tests__/backend-selector.test.ts +101 -0
  116. package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
  117. package/src/services/__tests__/gpu-autotune.test.ts +400 -0
  118. package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
  119. package/src/services/__tests__/planner-grammar.test.ts +372 -0
  120. package/src/services/__tests__/runtime-target.test.ts +176 -0
  121. package/src/services/active-model-switch-rollback.test.ts +183 -0
  122. package/src/services/active-model.d.ts +282 -0
  123. package/src/services/active-model.d.ts.map +1 -0
  124. package/src/services/active-model.ts +1213 -0
  125. package/src/services/assignments.d.ts +71 -0
  126. package/src/services/assignments.d.ts.map +1 -0
  127. package/src/services/assignments.test.ts +80 -0
  128. package/src/services/assignments.ts +230 -0
  129. package/src/services/backend-selector.ts +95 -0
  130. package/src/services/backend.d.ts +346 -0
  131. package/src/services/backend.d.ts.map +1 -0
  132. package/src/services/backend.ts +612 -0
  133. package/src/services/bionic-host-loader.d.ts +46 -0
  134. package/src/services/bionic-host-loader.d.ts.map +1 -0
  135. package/src/services/bionic-host-loader.test.ts +133 -0
  136. package/src/services/bionic-host-loader.ts +180 -0
  137. package/src/services/bundled-models.d.ts +34 -0
  138. package/src/services/bundled-models.d.ts.map +1 -0
  139. package/src/services/bundled-models.ts +129 -0
  140. package/src/services/cache-bridge.d.ts +206 -0
  141. package/src/services/cache-bridge.d.ts.map +1 -0
  142. package/src/services/cache-bridge.test.ts +516 -0
  143. package/src/services/cache-bridge.ts +423 -0
  144. package/src/services/catalog.d.ts +10 -0
  145. package/src/services/catalog.d.ts.map +1 -0
  146. package/src/services/catalog.test.ts +238 -0
  147. package/src/services/catalog.ts +27 -0
  148. package/src/services/checkpoint-client.d.ts +109 -0
  149. package/src/services/checkpoint-client.d.ts.map +1 -0
  150. package/src/services/checkpoint-client.ts +258 -0
  151. package/src/services/checkpoint-manager.ts +474 -0
  152. package/src/services/cloud-fallback.d.ts +102 -0
  153. package/src/services/cloud-fallback.d.ts.map +1 -0
  154. package/src/services/cloud-fallback.ts +230 -0
  155. package/src/services/conversation-registry.d.ts +142 -0
  156. package/src/services/conversation-registry.d.ts.map +1 -0
  157. package/src/services/conversation-registry.test.ts +235 -0
  158. package/src/services/conversation-registry.ts +264 -0
  159. package/src/services/desktop-fused-ffi-backend-runtime.d.ts +95 -0
  160. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  161. package/src/services/desktop-fused-ffi-backend-runtime.ts +339 -0
  162. package/src/services/device-bridge.d.ts +188 -0
  163. package/src/services/device-bridge.d.ts.map +1 -0
  164. package/src/services/device-bridge.ts +1237 -0
  165. package/src/services/device-resource-metrics.d.ts +149 -0
  166. package/src/services/device-resource-metrics.d.ts.map +1 -0
  167. package/src/services/device-resource-metrics.test.ts +98 -0
  168. package/src/services/device-resource-metrics.ts +346 -0
  169. package/src/services/device-tier.d.ts +115 -0
  170. package/src/services/device-tier.d.ts.map +1 -0
  171. package/src/services/device-tier.test.ts +371 -0
  172. package/src/services/device-tier.ts +410 -0
  173. package/src/services/downloader.d.ts +82 -0
  174. package/src/services/downloader.d.ts.map +1 -0
  175. package/src/services/downloader.test.ts +747 -0
  176. package/src/services/downloader.ts +925 -0
  177. package/src/services/engine-direct-bundle.test.ts +58 -0
  178. package/src/services/engine-streaming.test.ts +80 -0
  179. package/src/services/engine.d.ts +540 -0
  180. package/src/services/engine.d.ts.map +1 -0
  181. package/src/services/engine.ts +1909 -0
  182. package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
  183. package/src/services/ensure-local-artifacts.test.ts +368 -0
  184. package/src/services/ensure-local-artifacts.ts +351 -0
  185. package/src/services/external-scanner.d.ts +17 -0
  186. package/src/services/external-scanner.d.ts.map +1 -0
  187. package/src/services/external-scanner.ts +312 -0
  188. package/src/services/ffi-llm-mock.ts +354 -0
  189. package/src/services/ffi-llm-streaming-abi.ts +442 -0
  190. package/src/services/ffi-streaming-backend.d.ts +180 -0
  191. package/src/services/ffi-streaming-backend.d.ts.map +1 -0
  192. package/src/services/ffi-streaming-backend.ts +382 -0
  193. package/src/services/ffi-streaming-runner.d.ts +122 -0
  194. package/src/services/ffi-streaming-runner.d.ts.map +1 -0
  195. package/src/services/ffi-streaming-runner.test.ts +60 -0
  196. package/src/services/ffi-streaming-runner.ts +354 -0
  197. package/src/services/ffi-unload-ordering.test.ts +162 -0
  198. package/src/services/gpu-autotune.ts +534 -0
  199. package/src/services/gpu-detect.d.ts +56 -0
  200. package/src/services/gpu-detect.d.ts.map +1 -0
  201. package/src/services/gpu-detect.ts +139 -0
  202. package/src/services/handler-registry.d.ts +72 -0
  203. package/src/services/handler-registry.d.ts.map +1 -0
  204. package/src/services/handler-registry.ts +240 -0
  205. package/src/services/hardware.d.ts +63 -0
  206. package/src/services/hardware.d.ts.map +1 -0
  207. package/src/services/hardware.test.ts +231 -0
  208. package/src/services/hardware.ts +410 -0
  209. package/src/services/hf-search.d.ts +26 -0
  210. package/src/services/hf-search.d.ts.map +1 -0
  211. package/src/services/hf-search.test.ts +69 -0
  212. package/src/services/hf-search.ts +420 -0
  213. package/src/services/image-description-runtime.d.ts +14 -0
  214. package/src/services/image-description-runtime.d.ts.map +1 -0
  215. package/src/services/image-description-runtime.test.ts +61 -0
  216. package/src/services/image-description-runtime.ts +118 -0
  217. package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
  218. package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  219. package/src/services/imagegen/aosp-unavailable.ts +229 -0
  220. package/src/services/imagegen/backend-selector.d.ts +118 -0
  221. package/src/services/imagegen/backend-selector.d.ts.map +1 -0
  222. package/src/services/imagegen/backend-selector.ts +277 -0
  223. package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
  224. package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  225. package/src/services/imagegen/coreml-unavailable.ts +237 -0
  226. package/src/services/imagegen/errors.d.ts +16 -0
  227. package/src/services/imagegen/errors.d.ts.map +1 -0
  228. package/src/services/imagegen/errors.ts +40 -0
  229. package/src/services/imagegen/index.d.ts +58 -0
  230. package/src/services/imagegen/index.d.ts.map +1 -0
  231. package/src/services/imagegen/index.ts +144 -0
  232. package/src/services/imagegen/mflux.d.ts +74 -0
  233. package/src/services/imagegen/mflux.d.ts.map +1 -0
  234. package/src/services/imagegen/mflux.ts +313 -0
  235. package/src/services/imagegen/sd-cpp.d.ts +180 -0
  236. package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
  237. package/src/services/imagegen/sd-cpp.ts +718 -0
  238. package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
  239. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  240. package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
  241. package/src/services/imagegen/types.d.ts +181 -0
  242. package/src/services/imagegen/types.d.ts.map +1 -0
  243. package/src/services/imagegen/types.ts +193 -0
  244. package/src/services/index.d.ts +29 -0
  245. package/src/services/index.d.ts.map +1 -0
  246. package/src/services/index.ts +211 -0
  247. package/src/services/inference-capabilities.d.ts +132 -0
  248. package/src/services/inference-capabilities.d.ts.map +1 -0
  249. package/src/services/inference-capabilities.test.ts +75 -0
  250. package/src/services/inference-capabilities.ts +204 -0
  251. package/src/services/inference-telemetry.d.ts +59 -0
  252. package/src/services/inference-telemetry.d.ts.map +1 -0
  253. package/src/services/inference-telemetry.ts +143 -0
  254. package/src/services/ios-llama-streaming.ts +248 -0
  255. package/src/services/kv-spill.d.ts +189 -0
  256. package/src/services/kv-spill.d.ts.map +1 -0
  257. package/src/services/kv-spill.test.ts +222 -0
  258. package/src/services/kv-spill.ts +356 -0
  259. package/src/services/latency-trace.d.ts +346 -0
  260. package/src/services/latency-trace.d.ts.map +1 -0
  261. package/src/services/latency-trace.test.ts +266 -0
  262. package/src/services/latency-trace.ts +844 -0
  263. package/src/services/llama-server-metrics.ts +304 -0
  264. package/src/services/llm-streaming-binding.d.ts +96 -0
  265. package/src/services/llm-streaming-binding.d.ts.map +1 -0
  266. package/src/services/llm-streaming-binding.ts +136 -0
  267. package/src/services/load-args.d.ts +82 -0
  268. package/src/services/load-args.d.ts.map +1 -0
  269. package/src/services/load-args.ts +81 -0
  270. package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
  271. package/src/services/manifest/index.d.ts +4 -0
  272. package/src/services/manifest/index.d.ts.map +1 -0
  273. package/src/services/manifest/index.ts +66 -0
  274. package/src/services/manifest/manifest.test.ts +689 -0
  275. package/src/services/manifest/schema.d.ts +713 -0
  276. package/src/services/manifest/schema.d.ts.map +1 -0
  277. package/src/services/manifest/schema.ts +653 -0
  278. package/src/services/manifest/types.d.ts +30 -0
  279. package/src/services/manifest/types.d.ts.map +1 -0
  280. package/src/services/manifest/types.ts +55 -0
  281. package/src/services/manifest/validator.d.ts +66 -0
  282. package/src/services/manifest/validator.d.ts.map +1 -0
  283. package/src/services/manifest/validator.ts +567 -0
  284. package/src/services/memory-arbiter.d.ts +318 -0
  285. package/src/services/memory-arbiter.d.ts.map +1 -0
  286. package/src/services/memory-arbiter.test.ts +419 -0
  287. package/src/services/memory-arbiter.ts +925 -0
  288. package/src/services/memory-monitor.d.ts +122 -0
  289. package/src/services/memory-monitor.d.ts.map +1 -0
  290. package/src/services/memory-monitor.test.ts +208 -0
  291. package/src/services/memory-monitor.ts +297 -0
  292. package/src/services/memory-pressure.d.ts +130 -0
  293. package/src/services/memory-pressure.d.ts.map +1 -0
  294. package/src/services/memory-pressure.ts +414 -0
  295. package/src/services/mtp-doctor.d.ts +13 -0
  296. package/src/services/mtp-doctor.d.ts.map +1 -0
  297. package/src/services/mtp-doctor.ts +78 -0
  298. package/src/services/network-policy.d.ts +127 -0
  299. package/src/services/network-policy.d.ts.map +1 -0
  300. package/src/services/network-policy.ts +346 -0
  301. package/src/services/paths.d.ts +6 -0
  302. package/src/services/paths.d.ts.map +1 -0
  303. package/src/services/paths.ts +25 -0
  304. package/src/services/planner-skeleton.d.ts +124 -0
  305. package/src/services/planner-skeleton.d.ts.map +1 -0
  306. package/src/services/planner-skeleton.ts +175 -0
  307. package/src/services/providers.d.ts +38 -0
  308. package/src/services/providers.d.ts.map +1 -0
  309. package/src/services/providers.ts +507 -0
  310. package/src/services/ram-budget-cache.test.ts +163 -0
  311. package/src/services/ram-budget.d.ts +110 -0
  312. package/src/services/ram-budget.d.ts.map +1 -0
  313. package/src/services/ram-budget.ts +0 -0
  314. package/src/services/readiness.d.ts +9 -0
  315. package/src/services/readiness.d.ts.map +1 -0
  316. package/src/services/readiness.test.ts +87 -0
  317. package/src/services/readiness.ts +238 -0
  318. package/src/services/recommendation.d.ts +111 -0
  319. package/src/services/recommendation.d.ts.map +1 -0
  320. package/src/services/recommendation.ts +671 -0
  321. package/src/services/registry.d.ts +35 -0
  322. package/src/services/registry.d.ts.map +1 -0
  323. package/src/services/registry.ts +151 -0
  324. package/src/services/router-handler.d.ts +92 -0
  325. package/src/services/router-handler.d.ts.map +1 -0
  326. package/src/services/router-handler.test.ts +45 -0
  327. package/src/services/router-handler.ts +407 -0
  328. package/src/services/routing-policy.d.ts +69 -0
  329. package/src/services/routing-policy.d.ts.map +1 -0
  330. package/src/services/routing-policy.test.ts +164 -0
  331. package/src/services/routing-policy.ts +297 -0
  332. package/src/services/routing-preferences.d.ts +8 -0
  333. package/src/services/routing-preferences.d.ts.map +1 -0
  334. package/src/services/routing-preferences.ts +17 -0
  335. package/src/services/runtime-target.d.ts +98 -0
  336. package/src/services/runtime-target.d.ts.map +1 -0
  337. package/src/services/runtime-target.ts +154 -0
  338. package/src/services/service.d.ts +128 -0
  339. package/src/services/service.d.ts.map +1 -0
  340. package/src/services/service.test.ts +223 -0
  341. package/src/services/service.ts +735 -0
  342. package/src/services/session-pool.d.ts +72 -0
  343. package/src/services/session-pool.d.ts.map +1 -0
  344. package/src/services/session-pool.ts +153 -0
  345. package/src/services/structured-output/deterministic-repair.d.ts +23 -0
  346. package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
  347. package/src/services/structured-output/deterministic-repair.test.ts +169 -0
  348. package/src/services/structured-output/deterministic-repair.ts +443 -0
  349. package/src/services/structured-output/index.ts +4 -0
  350. package/src/services/structured-output.d.ts +311 -0
  351. package/src/services/structured-output.d.ts.map +1 -0
  352. package/src/services/structured-output.test.ts +483 -0
  353. package/src/services/structured-output.ts +712 -0
  354. package/src/services/system-memory.d.ts +33 -0
  355. package/src/services/system-memory.d.ts.map +1 -0
  356. package/src/services/system-memory.test.ts +47 -0
  357. package/src/services/system-memory.ts +67 -0
  358. package/src/services/transcription-priority.test.ts +211 -0
  359. package/src/services/types.d.ts +19 -0
  360. package/src/services/types.d.ts.map +1 -0
  361. package/src/services/types.ts +55 -0
  362. package/src/services/verify-on-device.d.ts +34 -0
  363. package/src/services/verify-on-device.d.ts.map +1 -0
  364. package/src/services/verify-on-device.test.ts +87 -0
  365. package/src/services/verify-on-device.ts +127 -0
  366. package/src/services/verify.d.ts +8 -0
  367. package/src/services/verify.d.ts.map +1 -0
  368. package/src/services/verify.ts +13 -0
  369. package/src/services/vision/aosp-unavailable.d.ts +115 -0
  370. package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
  371. package/src/services/vision/aosp-unavailable.ts +163 -0
  372. package/src/services/vision/capacitor-llama.d.ts +99 -0
  373. package/src/services/vision/capacitor-llama.d.ts.map +1 -0
  374. package/src/services/vision/capacitor-llama.ts +255 -0
  375. package/src/services/vision/cloud-fallback.d.ts +47 -0
  376. package/src/services/vision/cloud-fallback.d.ts.map +1 -0
  377. package/src/services/vision/cloud-fallback.test.ts +243 -0
  378. package/src/services/vision/cloud-fallback.ts +268 -0
  379. package/src/services/vision/fallback-chain.test.ts +86 -0
  380. package/src/services/vision/hash.d.ts +71 -0
  381. package/src/services/vision/hash.d.ts.map +1 -0
  382. package/src/services/vision/hash.ts +157 -0
  383. package/src/services/vision/index.d.ts +95 -0
  384. package/src/services/vision/index.d.ts.map +1 -0
  385. package/src/services/vision/index.ts +251 -0
  386. package/src/services/vision/llama-server.d.ts +73 -0
  387. package/src/services/vision/llama-server.d.ts.map +1 -0
  388. package/src/services/vision/llama-server.ts +177 -0
  389. package/src/services/vision/types.d.ts +153 -0
  390. package/src/services/vision/types.d.ts.map +1 -0
  391. package/src/services/vision/types.ts +154 -0
  392. package/src/services/vision/vast-fallback.d.ts +18 -0
  393. package/src/services/vision/vast-fallback.d.ts.map +1 -0
  394. package/src/services/vision/vast-fallback.ts +127 -0
  395. package/src/services/vision-embedding-cache.d.ts +98 -0
  396. package/src/services/vision-embedding-cache.d.ts.map +1 -0
  397. package/src/services/vision-embedding-cache.ts +189 -0
  398. package/src/services/voice/VOICE_WORKBENCH.md +88 -0
  399. package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
  400. package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
  401. package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
  402. package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
  403. package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
  404. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
  405. package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
  406. package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
  407. package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
  408. package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
  409. package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
  410. package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
  411. package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
  412. package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
  413. package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
  414. package/src/services/voice/asr-timed.real.test.ts +141 -0
  415. package/src/services/voice/audio-frame-consumer.d.ts +212 -0
  416. package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
  417. package/src/services/voice/audio-frame-consumer.test.ts +343 -0
  418. package/src/services/voice/audio-frame-consumer.ts +491 -0
  419. package/src/services/voice/barge-in.d.ts +112 -0
  420. package/src/services/voice/barge-in.d.ts.map +1 -0
  421. package/src/services/voice/barge-in.test.ts +244 -0
  422. package/src/services/voice/barge-in.ts +336 -0
  423. package/src/services/voice/cancellation-coordinator.d.ts +127 -0
  424. package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
  425. package/src/services/voice/cancellation-coordinator.test.ts +196 -0
  426. package/src/services/voice/cancellation-coordinator.ts +269 -0
  427. package/src/services/voice/checkpoint-manager.d.ts +199 -0
  428. package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
  429. package/src/services/voice/checkpoint-manager.ts +401 -0
  430. package/src/services/voice/checkpoint-policy.ts +336 -0
  431. package/src/services/voice/composite-eot-classifier.test.ts +59 -0
  432. package/src/services/voice/e2e-harness.test.ts +182 -0
  433. package/src/services/voice/e2e-harness.ts +743 -0
  434. package/src/services/voice/eager-context-builder.d.ts +170 -0
  435. package/src/services/voice/eager-context-builder.d.ts.map +1 -0
  436. package/src/services/voice/eager-context-builder.ts +262 -0
  437. package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
  438. package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  439. package/src/services/voice/eliza1-eot-scorer.ts +242 -0
  440. package/src/services/voice/embedding-server.ts +200 -0
  441. package/src/services/voice/embedding.d.ts +133 -0
  442. package/src/services/voice/embedding.d.ts.map +1 -0
  443. package/src/services/voice/embedding.test.ts +131 -0
  444. package/src/services/voice/embedding.ts +243 -0
  445. package/src/services/voice/emotion-attribution.d.ts +68 -0
  446. package/src/services/voice/emotion-attribution.d.ts.map +1 -0
  447. package/src/services/voice/emotion-attribution.test.ts +129 -0
  448. package/src/services/voice/emotion-attribution.ts +361 -0
  449. package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
  450. package/src/services/voice/engine-bridge.d.ts +759 -0
  451. package/src/services/voice/engine-bridge.d.ts.map +1 -0
  452. package/src/services/voice/engine-bridge.test.ts +384 -0
  453. package/src/services/voice/engine-bridge.ts +2302 -0
  454. package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
  455. package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  456. package/src/services/voice/eot-classifier-ggml.ts +566 -0
  457. package/src/services/voice/eot-classifier.d.ts +214 -0
  458. package/src/services/voice/eot-classifier.d.ts.map +1 -0
  459. package/src/services/voice/eot-classifier.ts +533 -0
  460. package/src/services/voice/errors.d.ts +20 -0
  461. package/src/services/voice/errors.d.ts.map +1 -0
  462. package/src/services/voice/errors.ts +32 -0
  463. package/src/services/voice/expressive-tags.d.ts +158 -0
  464. package/src/services/voice/expressive-tags.d.ts.map +1 -0
  465. package/src/services/voice/expressive-tags.ts +405 -0
  466. package/src/services/voice/ffi-bindings.d.ts +674 -0
  467. package/src/services/voice/ffi-bindings.d.ts.map +1 -0
  468. package/src/services/voice/ffi-bindings.test.ts +728 -0
  469. package/src/services/voice/ffi-bindings.ts +3225 -0
  470. package/src/services/voice/first-line-cache.d.ts +181 -0
  471. package/src/services/voice/first-line-cache.d.ts.map +1 -0
  472. package/src/services/voice/first-line-cache.ts +725 -0
  473. package/src/services/voice/fused-eot-scorer.d.ts +51 -0
  474. package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
  475. package/src/services/voice/fused-eot-scorer.ts +135 -0
  476. package/src/services/voice/index.d.ts +91 -0
  477. package/src/services/voice/index.d.ts.map +1 -0
  478. package/src/services/voice/index.ts +481 -0
  479. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
  480. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
  481. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
  482. package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
  483. package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
  484. package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
  485. package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
  486. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
  487. package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
  488. package/src/services/voice/kokoro/index.ts +79 -0
  489. package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
  490. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  491. package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
  492. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
  493. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  494. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
  495. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
  496. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  497. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
  498. package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
  499. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  500. package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
  501. package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
  502. package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
  503. package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  504. package/src/services/voice/kokoro/phonemizer.ts +344 -0
  505. package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
  506. package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  507. package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
  508. package/src/services/voice/kokoro/pick-runtime.ts +130 -0
  509. package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
  510. package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  511. package/src/services/voice/kokoro/runtime-selection.ts +237 -0
  512. package/src/services/voice/kokoro/types.d.ts +82 -0
  513. package/src/services/voice/kokoro/types.d.ts.map +1 -0
  514. package/src/services/voice/kokoro/types.ts +95 -0
  515. package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
  516. package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  517. package/src/services/voice/kokoro/voice-presets.ts +129 -0
  518. package/src/services/voice/kokoro/voices.d.ts +30 -0
  519. package/src/services/voice/kokoro/voices.d.ts.map +1 -0
  520. package/src/services/voice/kokoro/voices.ts +64 -0
  521. package/src/services/voice/lifecycle.d.ts +135 -0
  522. package/src/services/voice/lifecycle.d.ts.map +1 -0
  523. package/src/services/voice/lifecycle.test.ts +315 -0
  524. package/src/services/voice/lifecycle.ts +301 -0
  525. package/src/services/voice/live-diarization-session.d.ts +96 -0
  526. package/src/services/voice/live-diarization-session.d.ts.map +1 -0
  527. package/src/services/voice/live-diarization-session.ts +289 -0
  528. package/src/services/voice/mic-source.d.ts +136 -0
  529. package/src/services/voice/mic-source.d.ts.map +1 -0
  530. package/src/services/voice/mic-source.test.ts +210 -0
  531. package/src/services/voice/mic-source.ts +503 -0
  532. package/src/services/voice/optimistic-policy.d.ts +109 -0
  533. package/src/services/voice/optimistic-policy.d.ts.map +1 -0
  534. package/src/services/voice/optimistic-policy.test.ts +101 -0
  535. package/src/services/voice/optimistic-policy.ts +192 -0
  536. package/src/services/voice/optimistic-rollback.ts +343 -0
  537. package/src/services/voice/partial-stabilizer.d.ts +73 -0
  538. package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
  539. package/src/services/voice/partial-stabilizer.test.ts +68 -0
  540. package/src/services/voice/partial-stabilizer.ts +140 -0
  541. package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
  542. package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  543. package/src/services/voice/phoneme-tokenizer.ts +158 -0
  544. package/src/services/voice/phrase-cache.d.ts +76 -0
  545. package/src/services/voice/phrase-cache.d.ts.map +1 -0
  546. package/src/services/voice/phrase-cache.test.ts +242 -0
  547. package/src/services/voice/phrase-cache.ts +186 -0
  548. package/src/services/voice/phrase-chunker.d.ts +62 -0
  549. package/src/services/voice/phrase-chunker.d.ts.map +1 -0
  550. package/src/services/voice/phrase-chunker.test.ts +239 -0
  551. package/src/services/voice/phrase-chunker.ts +281 -0
  552. package/src/services/voice/pipeline-impls.d.ts +151 -0
  553. package/src/services/voice/pipeline-impls.d.ts.map +1 -0
  554. package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
  555. package/src/services/voice/pipeline-impls.test.ts +292 -0
  556. package/src/services/voice/pipeline-impls.ts +315 -0
  557. package/src/services/voice/pipeline.d.ts +216 -0
  558. package/src/services/voice/pipeline.d.ts.map +1 -0
  559. package/src/services/voice/pipeline.ts +505 -0
  560. package/src/services/voice/prefill-client.d.ts +123 -0
  561. package/src/services/voice/prefill-client.d.ts.map +1 -0
  562. package/src/services/voice/prefill-client.ts +316 -0
  563. package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
  564. package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  565. package/src/services/voice/prefix-preserving-queue.ts +162 -0
  566. package/src/services/voice/profile-store.d.ts +248 -0
  567. package/src/services/voice/profile-store.d.ts.map +1 -0
  568. package/src/services/voice/profile-store.ts +887 -0
  569. package/src/services/voice/real-audio-decode.test.ts +148 -0
  570. package/src/services/voice/ring-buffer.d.ts +40 -0
  571. package/src/services/voice/ring-buffer.d.ts.map +1 -0
  572. package/src/services/voice/ring-buffer.test.ts +129 -0
  573. package/src/services/voice/ring-buffer.ts +123 -0
  574. package/src/services/voice/rollback-queue.d.ts +24 -0
  575. package/src/services/voice/rollback-queue.d.ts.map +1 -0
  576. package/src/services/voice/rollback-queue.ts +74 -0
  577. package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
  578. package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  579. package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
  580. package/src/services/voice/samantha-preset-placeholder.ts +148 -0
  581. package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
  582. package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  583. package/src/services/voice/samantha-preset-regenerator.ts +393 -0
  584. package/src/services/voice/scheduler.d.ts +146 -0
  585. package/src/services/voice/scheduler.d.ts.map +1 -0
  586. package/src/services/voice/scheduler.t2.test.ts +141 -0
  587. package/src/services/voice/scheduler.ts +927 -0
  588. package/src/services/voice/shared-resources.d.ts +190 -0
  589. package/src/services/voice/shared-resources.d.ts.map +1 -0
  590. package/src/services/voice/shared-resources.ts +320 -0
  591. package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
  592. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  593. package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
  594. package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
  595. package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  596. package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
  597. package/src/services/voice/speaker/diarizer-fused.ts +154 -0
  598. package/src/services/voice/speaker/diarizer.d.ts +75 -0
  599. package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
  600. package/src/services/voice/speaker/diarizer.ts +218 -0
  601. package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
  602. package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  603. package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
  604. package/src/services/voice/speaker/encoder-fused.ts +138 -0
  605. package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
  606. package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  607. package/src/services/voice/speaker/encoder-ggml.ts +79 -0
  608. package/src/services/voice/speaker/encoder.d.ts +37 -0
  609. package/src/services/voice/speaker/encoder.d.ts.map +1 -0
  610. package/src/services/voice/speaker/encoder.ts +105 -0
  611. package/src/services/voice/speaker-imprint.d.ts +83 -0
  612. package/src/services/voice/speaker-imprint.d.ts.map +1 -0
  613. package/src/services/voice/speaker-imprint.test.ts +185 -0
  614. package/src/services/voice/speaker-imprint.ts +312 -0
  615. package/src/services/voice/speaker-preset-cache.d.ts +77 -0
  616. package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
  617. package/src/services/voice/speaker-preset-cache.test.ts +154 -0
  618. package/src/services/voice/speaker-preset-cache.ts +195 -0
  619. package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
  620. package/src/services/voice/system-audio-sink.d.ts +73 -0
  621. package/src/services/voice/system-audio-sink.d.ts.map +1 -0
  622. package/src/services/voice/system-audio-sink.test.ts +29 -0
  623. package/src/services/voice/system-audio-sink.ts +366 -0
  624. package/src/services/voice/transcriber.d.ts +244 -0
  625. package/src/services/voice/transcriber.d.ts.map +1 -0
  626. package/src/services/voice/transcriber.test.ts +392 -0
  627. package/src/services/voice/transcriber.ts +704 -0
  628. package/src/services/voice/transcript-knowledge.d.ts +37 -0
  629. package/src/services/voice/transcript-knowledge.d.ts.map +1 -0
  630. package/src/services/voice/transcript-knowledge.test.ts +68 -0
  631. package/src/services/voice/transcript-knowledge.ts +75 -0
  632. package/src/services/voice/transcript-service.d.ts +41 -0
  633. package/src/services/voice/transcript-service.d.ts.map +1 -0
  634. package/src/services/voice/transcript-service.test.ts +137 -0
  635. package/src/services/voice/transcript-service.ts +141 -0
  636. package/src/services/voice/transcript-store.d.ts +53 -0
  637. package/src/services/voice/transcript-store.d.ts.map +1 -0
  638. package/src/services/voice/transcript-store.test.ts +153 -0
  639. package/src/services/voice/transcript-store.ts +132 -0
  640. package/src/services/voice/turn-controller.d.ts +183 -0
  641. package/src/services/voice/turn-controller.d.ts.map +1 -0
  642. package/src/services/voice/turn-controller.test.ts +575 -0
  643. package/src/services/voice/turn-controller.ts +596 -0
  644. package/src/services/voice/types.d.ts +643 -0
  645. package/src/services/voice/types.d.ts.map +1 -0
  646. package/src/services/voice/types.ts +699 -0
  647. package/src/services/voice/vad.d.ts +282 -0
  648. package/src/services/voice/vad.d.ts.map +1 -0
  649. package/src/services/voice/vad.test.ts +480 -0
  650. package/src/services/voice/vad.ts +827 -0
  651. package/src/services/voice/vad.v1-v4.test.ts +222 -0
  652. package/src/services/voice/voice-budget.d.ts +241 -0
  653. package/src/services/voice/voice-budget.d.ts.map +1 -0
  654. package/src/services/voice/voice-budget.test.ts +418 -0
  655. package/src/services/voice/voice-budget.ts +635 -0
  656. package/src/services/voice/voice-duet.test.ts +375 -0
  657. package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
  658. package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  659. package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
  660. package/src/services/voice/voice-emotion-classifier.ts +273 -0
  661. package/src/services/voice/voice-preset-format.d.ts +158 -0
  662. package/src/services/voice/voice-preset-format.d.ts.map +1 -0
  663. package/src/services/voice/voice-preset-format.ts +700 -0
  664. package/src/services/voice/voice-preset-generator.test.ts +89 -0
  665. package/src/services/voice/voice-profile-artifact.d.ts +116 -0
  666. package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
  667. package/src/services/voice/voice-profile-artifact.test.ts +138 -0
  668. package/src/services/voice/voice-profile-artifact.ts +518 -0
  669. package/src/services/voice/voice-profile-routes.d.ts +83 -0
  670. package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
  671. package/src/services/voice/voice-profile-routes.test.ts +429 -0
  672. package/src/services/voice/voice-profile-routes.ts +425 -0
  673. package/src/services/voice/voice-scenario.ts +154 -0
  674. package/src/services/voice/voice-settings.d.ts +82 -0
  675. package/src/services/voice/voice-settings.d.ts.map +1 -0
  676. package/src/services/voice/voice-settings.ts +172 -0
  677. package/src/services/voice/voice-state-machine.d.ts +364 -0
  678. package/src/services/voice/voice-state-machine.d.ts.map +1 -0
  679. package/src/services/voice/voice-state-machine.ts +727 -0
  680. package/src/services/voice/voice-workbench-report.test.ts +168 -0
  681. package/src/services/voice/voice-workbench-report.ts +326 -0
  682. package/src/services/voice/voice-workbench.test.ts +158 -0
  683. package/src/services/voice/voice.test.ts +1070 -0
  684. package/src/services/voice/wake-word-ggml.d.ts +101 -0
  685. package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
  686. package/src/services/voice/wake-word-ggml.ts +320 -0
  687. package/src/services/voice/wake-word.d.ts +255 -0
  688. package/src/services/voice/wake-word.d.ts.map +1 -0
  689. package/src/services/voice/wake-word.test.ts +298 -0
  690. package/src/services/voice/wake-word.ts +554 -0
  691. package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
  692. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  693. package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
  694. package/src/services/voice-model-updater.d.ts +240 -0
  695. package/src/services/voice-model-updater.d.ts.map +1 -0
  696. package/src/services/voice-model-updater.ts +724 -0
  697. package/src/services/voice-prewarm.d.ts +3 -0
  698. package/src/services/voice-prewarm.d.ts.map +1 -0
  699. package/src/services/voice-prewarm.ts +51 -0
  700. package/dist/index.d.ts +0 -37
  701. package/dist/index.js +0 -1098
@@ -0,0 +1,33 @@
1
+ /**
2
+ * System memory reader — the single source of "how much RAM can we actually
3
+ * allocate right now" for the local-inference memory arbiter and pressure
4
+ * sources.
5
+ *
6
+ * Node's `os.freemem()` returns the kernel's `MemFree` on Linux, which counts
7
+ * only never-touched pages and EXCLUDES reclaimable page cache + slab. On
8
+ * Android — where the app process runs under a large page cache — `MemFree`
9
+ * undercounts allocatable memory by gigabytes, so a `MemFree`-driven arbiter
10
+ * evicts models it didn't need to and refuses loads that would have fit.
11
+ *
12
+ * `/proc/meminfo`'s `MemAvailable` is the kernel's own estimate of how much
13
+ * memory is available for starting new applications without swapping (free +
14
+ * reclaimable cache/slab, minus the low watermark). That is exactly the number
15
+ * the arbiter wants. Read it on Linux/Android; fall back to `os.freemem()` /
16
+ * `os.totalmem()` everywhere else (macOS, Windows) or if `/proc/meminfo` is
17
+ * unreadable or pre-3.14 (no `MemAvailable`).
18
+ */
19
+ export interface SystemMemory {
20
+ freeBytes: number;
21
+ totalBytes: number;
22
+ }
23
+ /** Injectable for tests: returns the raw `/proc/meminfo` text, or null. */
24
+ export type MeminfoReader = () => string | null;
25
+ /**
26
+ * Read available + total system memory in bytes. Prefers `/proc/meminfo`
27
+ * `MemAvailable`/`MemTotal` on Linux; falls back to `os.freemem()/totalmem()`.
28
+ *
29
+ * @param read injectable meminfo reader (tests). Defaults to reading
30
+ * `/proc/meminfo` on Linux and returning null elsewhere.
31
+ */
32
+ export declare function readSystemMemory(read?: MeminfoReader): SystemMemory;
33
+ //# sourceMappingURL=system-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-memory.d.ts","sourceRoot":"","sources":["system-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,MAAM,WAAW,YAAY;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,2EAA2E;AAC3E,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAmBhD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,GAAE,aAAoC,GACxC,YAAY,CAUd"}
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { readSystemMemory } from "./system-memory.js";
3
+
4
+ const SAMPLE_MEMINFO = `MemTotal: 16277856 kB
5
+ MemFree: 812044 kB
6
+ MemAvailable: 10342988 kB
7
+ Buffers: 204512 kB
8
+ Cached: 7651200 kB
9
+ SwapTotal: 0 kB
10
+ `;
11
+
12
+ describe("readSystemMemory", () => {
13
+ it("prefers MemAvailable + MemTotal from /proc/meminfo", () => {
14
+ const mem = readSystemMemory(() => SAMPLE_MEMINFO);
15
+ expect(mem.totalBytes).toBe(16_277_856 * 1024);
16
+ // MemAvailable (10.3 GB), NOT MemFree (0.8 GB) — the whole point.
17
+ expect(mem.freeBytes).toBe(10_342_988 * 1024);
18
+ });
19
+
20
+ it("does not regress to MemFree when reclaimable cache is large", () => {
21
+ const mem = readSystemMemory(() => SAMPLE_MEMINFO);
22
+ const memFreeBytes = 812_044 * 1024;
23
+ expect(mem.freeBytes).toBeGreaterThan(memFreeBytes * 10);
24
+ });
25
+
26
+ it("falls back to os when the reader returns null (non-Linux)", () => {
27
+ const mem = readSystemMemory(() => null);
28
+ expect(mem.totalBytes).toBeGreaterThan(0);
29
+ expect(mem.freeBytes).toBeGreaterThan(0);
30
+ expect(mem.freeBytes).toBeLessThanOrEqual(mem.totalBytes);
31
+ });
32
+
33
+ it("falls back to os when MemAvailable is absent (pre-3.14 kernel)", () => {
34
+ const noAvail = "MemTotal: 16277856 kB\nMemFree: 812044 kB\n";
35
+ const mem = readSystemMemory(() => noAvail);
36
+ // No MemAvailable → os fallback, so freeBytes is the live os.freemem(),
37
+ // not the parsed MemFree.
38
+ expect(mem.totalBytes).toBeGreaterThan(0);
39
+ expect(mem.freeBytes).toBeGreaterThan(0);
40
+ });
41
+
42
+ it("falls back to os on malformed meminfo", () => {
43
+ const mem = readSystemMemory(() => "garbage\nnot meminfo\n");
44
+ expect(mem.totalBytes).toBeGreaterThan(0);
45
+ expect(mem.freeBytes).toBeGreaterThan(0);
46
+ });
47
+ });
@@ -0,0 +1,67 @@
1
+ /**
2
+ * System memory reader — the single source of "how much RAM can we actually
3
+ * allocate right now" for the local-inference memory arbiter and pressure
4
+ * sources.
5
+ *
6
+ * Node's `os.freemem()` returns the kernel's `MemFree` on Linux, which counts
7
+ * only never-touched pages and EXCLUDES reclaimable page cache + slab. On
8
+ * Android — where the app process runs under a large page cache — `MemFree`
9
+ * undercounts allocatable memory by gigabytes, so a `MemFree`-driven arbiter
10
+ * evicts models it didn't need to and refuses loads that would have fit.
11
+ *
12
+ * `/proc/meminfo`'s `MemAvailable` is the kernel's own estimate of how much
13
+ * memory is available for starting new applications without swapping (free +
14
+ * reclaimable cache/slab, minus the low watermark). That is exactly the number
15
+ * the arbiter wants. Read it on Linux/Android; fall back to `os.freemem()` /
16
+ * `os.totalmem()` everywhere else (macOS, Windows) or if `/proc/meminfo` is
17
+ * unreadable or pre-3.14 (no `MemAvailable`).
18
+ */
19
+
20
+ import { readFileSync } from "node:fs";
21
+ import os from "node:os";
22
+
23
+ export interface SystemMemory {
24
+ freeBytes: number;
25
+ totalBytes: number;
26
+ }
27
+
28
+ /** Injectable for tests: returns the raw `/proc/meminfo` text, or null. */
29
+ export type MeminfoReader = () => string | null;
30
+
31
+ const defaultMeminfoReader: MeminfoReader = () => {
32
+ if (os.platform() !== "linux") return null;
33
+ try {
34
+ return readFileSync("/proc/meminfo", "utf8");
35
+ } catch {
36
+ return null;
37
+ }
38
+ };
39
+
40
+ function parseMeminfoKb(text: string, key: string): number | null {
41
+ // Lines look like: "MemAvailable: 12345678 kB"
42
+ const match = new RegExp(`^${key}:\\s+(\\d+)\\s*kB`, "m").exec(text);
43
+ if (!match) return null;
44
+ const kb = Number.parseInt(match[1], 10);
45
+ return Number.isFinite(kb) ? kb : null;
46
+ }
47
+
48
+ /**
49
+ * Read available + total system memory in bytes. Prefers `/proc/meminfo`
50
+ * `MemAvailable`/`MemTotal` on Linux; falls back to `os.freemem()/totalmem()`.
51
+ *
52
+ * @param read injectable meminfo reader (tests). Defaults to reading
53
+ * `/proc/meminfo` on Linux and returning null elsewhere.
54
+ */
55
+ export function readSystemMemory(
56
+ read: MeminfoReader = defaultMeminfoReader,
57
+ ): SystemMemory {
58
+ const text = read();
59
+ if (text) {
60
+ const availKb = parseMeminfoKb(text, "MemAvailable");
61
+ const totalKb = parseMeminfoKb(text, "MemTotal");
62
+ if (availKb !== null && totalKb !== null && totalKb > 0) {
63
+ return { freeBytes: availKb * 1024, totalBytes: totalKb * 1024 };
64
+ }
65
+ }
66
+ return { freeBytes: os.freemem(), totalBytes: os.totalmem() };
67
+ }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Tests for the `TRANSCRIPTION` model handler priority + provider hint
3
+ * semantics on `AgentRuntime`. These exercise the same `registerModel`
4
+ * machinery used by plugin-elizacloud (remote OpenAI Whisper API) and the
5
+ * local fused Qwen3-ASR handler so callers know exactly:
6
+ *
7
+ * - which handler wins when priorities tie (first-registered),
8
+ * - how an explicit `priority` overrides that,
9
+ * - that a `provider` hint to `useModel` overrides priority entirely,
10
+ * - that the runtime does NOT auto-fall-through on handler errors,
11
+ * - and how a caller can implement an explicit try/catch fallback.
12
+ *
13
+ * The test is intentionally provider-agnostic — it registers fake handlers
14
+ * named "local" and "openai" so the contract is observable without booting
15
+ * any real ASR backend.
16
+ */
17
+
18
+ import { describe, expect, it } from "vitest";
19
+
20
+ import { InMemoryDatabaseAdapter } from "../../../../packages/core/src/database/inMemoryAdapter";
21
+ import { AgentRuntime } from "../../../../packages/core/src/runtime";
22
+ import { ModelType } from "../../../../packages/core/src/types";
23
+
24
+ interface TranscriptionParams {
25
+ audio?: Float32Array | Uint8Array | Buffer | string;
26
+ }
27
+
28
+ interface TestRuntimeCtx {
29
+ runtime: AgentRuntime;
30
+ calls: string[];
31
+ }
32
+
33
+ function makeRuntime(): TestRuntimeCtx {
34
+ const runtime = new AgentRuntime({
35
+ character: {
36
+ name: "TranscriptionPriorityTest",
37
+ bio: "asr-priority test",
38
+ settings: {},
39
+ } as never,
40
+ adapter: new InMemoryDatabaseAdapter(),
41
+ logLevel: "fatal",
42
+ });
43
+ const calls: string[] = [];
44
+ return { runtime, calls };
45
+ }
46
+
47
+ function makeHandler(
48
+ calls: string[],
49
+ label: string,
50
+ result: string | (() => string),
51
+ options: { throws?: boolean } = {},
52
+ ) {
53
+ return async (_runtime: unknown, _params: unknown): Promise<string> => {
54
+ calls.push(label);
55
+ if (options.throws) {
56
+ throw new Error(`${label} handler failed`);
57
+ }
58
+ return typeof result === "function" ? result() : result;
59
+ };
60
+ }
61
+
62
+ describe("TRANSCRIPTION handler priority on AgentRuntime", () => {
63
+ it("local Qwen3-ASR wins over remote OpenAI Whisper by registration order when priorities tie", async () => {
64
+ const { runtime, calls } = makeRuntime();
65
+ runtime.registerModel(
66
+ ModelType.TRANSCRIPTION,
67
+ makeHandler(calls, "local", "local transcript"),
68
+ "eliza-local-inference",
69
+ 0,
70
+ );
71
+ runtime.registerModel(
72
+ ModelType.TRANSCRIPTION,
73
+ makeHandler(calls, "openai", "openai transcript"),
74
+ "openai",
75
+ 0,
76
+ );
77
+
78
+ const text = await runtime.useModel(ModelType.TRANSCRIPTION, {
79
+ audio: new Float32Array(160),
80
+ } as TranscriptionParams as never);
81
+
82
+ expect(text).toBe("local transcript");
83
+ expect(calls).toEqual(["local"]);
84
+ });
85
+
86
+ it("explicit higher priority always wins regardless of registration order", async () => {
87
+ const { runtime, calls } = makeRuntime();
88
+ runtime.registerModel(
89
+ ModelType.TRANSCRIPTION,
90
+ makeHandler(calls, "remote", "remote transcript"),
91
+ "openai",
92
+ 100,
93
+ );
94
+ runtime.registerModel(
95
+ ModelType.TRANSCRIPTION,
96
+ makeHandler(calls, "local", "local transcript"),
97
+ "eliza-local-inference",
98
+ 0,
99
+ );
100
+
101
+ // Remote wins because priority 100 > 0.
102
+ let text = await runtime.useModel(ModelType.TRANSCRIPTION, {
103
+ audio: new Float32Array(160),
104
+ } as TranscriptionParams as never);
105
+ expect(text).toBe("remote transcript");
106
+ expect(calls).toEqual(["remote"]);
107
+
108
+ // Re-register local with a higher priority — now local wins.
109
+ runtime.registerModel(
110
+ ModelType.TRANSCRIPTION,
111
+ makeHandler(calls, "local-priority", "local-priority transcript"),
112
+ "eliza-local-inference",
113
+ 200,
114
+ );
115
+
116
+ text = await runtime.useModel(ModelType.TRANSCRIPTION, {
117
+ audio: new Float32Array(160),
118
+ } as TranscriptionParams as never);
119
+ expect(text).toBe("local-priority transcript");
120
+ expect(calls).toEqual(["remote", "local-priority"]);
121
+ });
122
+
123
+ it("provider hint to useModel overrides priority", async () => {
124
+ const { runtime, calls } = makeRuntime();
125
+ runtime.registerModel(
126
+ ModelType.TRANSCRIPTION,
127
+ makeHandler(calls, "local", "local transcript"),
128
+ "eliza-local-inference",
129
+ 200,
130
+ );
131
+ runtime.registerModel(
132
+ ModelType.TRANSCRIPTION,
133
+ makeHandler(calls, "openai", "openai transcript"),
134
+ "openai",
135
+ 0,
136
+ );
137
+
138
+ // Default useModel: local wins (priority 200 > 0).
139
+ let text = await runtime.useModel(ModelType.TRANSCRIPTION, {
140
+ audio: new Float32Array(160),
141
+ } as TranscriptionParams as never);
142
+ expect(text).toBe("local transcript");
143
+
144
+ // Explicit provider hint flips it to openai despite the priority gap.
145
+ text = await runtime.useModel(
146
+ ModelType.TRANSCRIPTION,
147
+ { audio: new Float32Array(160) } as TranscriptionParams as never,
148
+ "openai",
149
+ );
150
+ expect(text).toBe("openai transcript");
151
+ expect(calls).toEqual(["local", "openai"]);
152
+ });
153
+
154
+ it("runtime does NOT auto-fall-through on handler errors", async () => {
155
+ const { runtime, calls } = makeRuntime();
156
+ runtime.registerModel(
157
+ ModelType.TRANSCRIPTION,
158
+ makeHandler(calls, "local", "should never reach this", { throws: true }),
159
+ "eliza-local-inference",
160
+ 200,
161
+ );
162
+ runtime.registerModel(
163
+ ModelType.TRANSCRIPTION,
164
+ makeHandler(calls, "openai", "openai transcript"),
165
+ "openai",
166
+ 0,
167
+ );
168
+
169
+ await expect(
170
+ runtime.useModel(ModelType.TRANSCRIPTION, {
171
+ audio: new Float32Array(160),
172
+ } as TranscriptionParams as never),
173
+ ).rejects.toThrow(/local handler failed/);
174
+ // The remote handler should NOT have been invoked — there is no
175
+ // implicit fallback chain on the runtime.
176
+ expect(calls).toEqual(["local"]);
177
+ });
178
+
179
+ it("caller can implement fallback via try/catch + provider hint", async () => {
180
+ const { runtime, calls } = makeRuntime();
181
+ runtime.registerModel(
182
+ ModelType.TRANSCRIPTION,
183
+ makeHandler(calls, "local", "boom", { throws: true }),
184
+ "eliza-local-inference",
185
+ 200,
186
+ );
187
+ runtime.registerModel(
188
+ ModelType.TRANSCRIPTION,
189
+ makeHandler(calls, "openai", "openai transcript"),
190
+ "openai",
191
+ 0,
192
+ );
193
+
194
+ let result: string;
195
+ try {
196
+ result = (await runtime.useModel(ModelType.TRANSCRIPTION, {
197
+ audio: new Float32Array(160),
198
+ } as TranscriptionParams as never)) as string;
199
+ } catch {
200
+ // Caller-controlled fallback: explicit retry with provider hint.
201
+ result = (await runtime.useModel(
202
+ ModelType.TRANSCRIPTION,
203
+ { audio: new Float32Array(160) } as TranscriptionParams as never,
204
+ "openai",
205
+ )) as string;
206
+ }
207
+
208
+ expect(result).toBe("openai transcript");
209
+ expect(calls).toEqual(["local", "openai"]);
210
+ });
211
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Local inference type re-exports.
3
+ *
4
+ * The canonical definitions live in `@elizaos/shared/local-inference`.
5
+ * This shim preserves the historical import path
6
+ * `../services/local-inference/types` for server-side code.
7
+ */
8
+ export { type ActiveModelState, AGENT_MODEL_SLOTS, type AgentModelSlot, type CatalogModel, type CatalogQuantizationId, type CatalogQuantizationMatrix, type CatalogQuantizationVariant, type CpuFeatureProbe, type DownloadEvent, type DownloadJob, type DownloadState, type GpuProfile, type GpuProfileId, type HardwareFitLevel, type HardwareProbe, type InstalledModel, type KvCacheType, type LocalInferenceDownloadStatus, type LocalInferenceReadiness, type LocalInferenceSlotReadiness, type LocalRuntimeAcceleration, type LocalRuntimeBackend, type LocalRuntimeKernel, type LocalRuntimeOptimizations, type MobileHardwareProbe, type ModelAssignments, type ModelBucket, type ModelCategory, type ModelHubSnapshot, type OpenVinoDeviceKind, type OpenVinoHardwareProbe, TEXT_GENERATION_SLOTS, type TextGenerationSlot, type TokenizerFamily, } from "@elizaos/shared";
9
+ /** RAM requirements for a model bundle. */
10
+ export interface RamBudget {
11
+ /** Minimum RAM the bundle will boot under, in megabytes. */
12
+ minMb: number;
13
+ /** RAM the bundle expects for nominal workloads, in megabytes. */
14
+ recommendedMb: number;
15
+ /** Where the numbers came from. `manifest` only when both came from
16
+ * a validated `eliza-1.manifest.json` next to the installed bundle. */
17
+ source: "manifest" | "catalog";
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACN,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACpB,MAAM,iBAAiB,CAAC;AAEzB,2CAA2C;AAC3C,MAAM,WAAW,SAAS;IACzB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB;4EACwE;IACxE,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Local inference type re-exports.
3
+ *
4
+ * The canonical definitions live in `@elizaos/shared/local-inference`.
5
+ * This shim preserves the historical import path
6
+ * `../services/local-inference/types` for server-side code.
7
+ */
8
+
9
+ export {
10
+ type ActiveModelState,
11
+ AGENT_MODEL_SLOTS,
12
+ type AgentModelSlot,
13
+ type CatalogModel,
14
+ type CatalogQuantizationId,
15
+ type CatalogQuantizationMatrix,
16
+ type CatalogQuantizationVariant,
17
+ type CpuFeatureProbe,
18
+ type DownloadEvent,
19
+ type DownloadJob,
20
+ type DownloadState,
21
+ type GpuProfile,
22
+ type GpuProfileId,
23
+ type HardwareFitLevel,
24
+ type HardwareProbe,
25
+ type InstalledModel,
26
+ type KvCacheType,
27
+ type LocalInferenceDownloadStatus,
28
+ type LocalInferenceReadiness,
29
+ type LocalInferenceSlotReadiness,
30
+ type LocalRuntimeAcceleration,
31
+ type LocalRuntimeBackend,
32
+ type LocalRuntimeKernel,
33
+ type LocalRuntimeOptimizations,
34
+ type MobileHardwareProbe,
35
+ type ModelAssignments,
36
+ type ModelBucket,
37
+ type ModelCategory,
38
+ type ModelHubSnapshot,
39
+ type OpenVinoDeviceKind,
40
+ type OpenVinoHardwareProbe,
41
+ TEXT_GENERATION_SLOTS,
42
+ type TextGenerationSlot,
43
+ type TokenizerFamily,
44
+ } from "@elizaos/shared";
45
+
46
+ /** RAM requirements for a model bundle. */
47
+ export interface RamBudget {
48
+ /** Minimum RAM the bundle will boot under, in megabytes. */
49
+ minMb: number;
50
+ /** RAM the bundle expects for nominal workloads, in megabytes. */
51
+ recommendedMb: number;
52
+ /** Where the numbers came from. `manifest` only when both came from
53
+ * a validated `eliza-1.manifest.json` next to the installed bundle. */
54
+ source: "manifest" | "catalog";
55
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Engine-backed `verifyOnDevice` hook for the Eliza-1 downloader
3
+ * (`packages/inference/AGENTS.md` §7): after a bundle is materialized and
4
+ * every file's sha256 checks out, run one cold smoke pass —
5
+ *
6
+ * load → 1-token text generation → (if the bundle ships voice assets)
7
+ * 1-phrase voice generation → barge-in cancel → unload
8
+ *
9
+ * — before the bundle is allowed to auto-fill an empty default slot. The
10
+ * downloader stays decoupled from the engine: it only knows the
11
+ * {@link VerifyBundleOnDevice} shape; this module is the concrete
12
+ * implementation the service layer injects.
13
+ *
14
+ * Failure semantics: any error throws. The downloader catches it and leaves
15
+ * `bundleVerifiedAt` unset, so an unverified bundle is registered but does
16
+ * not become the recommended default. There is no "verified anyway" path —
17
+ * voice is mandatory for Eliza-1 voice tiers (AGENTS.md §3), so a bundle
18
+ * whose fused voice ABI is not loadable on this device legitimately fails
19
+ * verify until the fused build is present.
20
+ */
21
+ import fs from "node:fs/promises";
22
+ import type { VerifyBundleOnDevice } from "./downloader";
23
+ import { localInferenceEngine } from "./engine";
24
+ import { parseManifestOrThrow } from "./manifest";
25
+ type VerifyEngine = Pick<typeof localInferenceEngine, "load" | "generate" | "ensureActiveBundleVoiceReady" | "startVoice" | "armVoice" | "synthesizeSpeech" | "triggerBargeIn" | "stopVoice" | "unload">;
26
+ interface VerifyBundleOnDeviceDeps {
27
+ readonly engine: VerifyEngine;
28
+ readonly readFile: typeof fs.readFile;
29
+ readonly parseManifest: typeof parseManifestOrThrow;
30
+ }
31
+ export declare function createVerifyBundleOnDevice(deps?: Partial<VerifyBundleOnDeviceDeps>): VerifyBundleOnDevice;
32
+ export declare const verifyBundleOnDevice: VerifyBundleOnDevice;
33
+ export {};
34
+ //# sourceMappingURL=verify-on-device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-on-device.d.ts","sourceRoot":"","sources":["verify-on-device.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,KAAK,YAAY,GAAG,IAAI,CACvB,OAAO,oBAAoB,EACzB,MAAM,GACN,UAAU,GACV,8BAA8B,GAC9B,YAAY,GACZ,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,QAAQ,CACV,CAAC;AAEF,UAAU,wBAAwB;IACjC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,OAAO,oBAAoB,CAAC;CACpD;AAqDD,wBAAgB,0BAA0B,CACzC,IAAI,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAC1C,oBAAoB,CAoBtB;AAED,eAAO,MAAM,oBAAoB,EAAE,oBACN,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { createVerifyBundleOnDevice } from "./verify-on-device";
3
+
4
+ const engineMock = {
5
+ load: vi.fn(async () => {}),
6
+ generate: vi.fn(async () => "ok"),
7
+ ensureActiveBundleVoiceReady: vi.fn(async () => ({})),
8
+ startVoice: vi.fn(() => {}),
9
+ armVoice: vi.fn(async () => {}),
10
+ synthesizeSpeech: vi.fn(async () => new Uint8Array([1, 2, 3, 4])),
11
+ triggerBargeIn: vi.fn(() => {}),
12
+ stopVoice: vi.fn(async () => {}),
13
+ unload: vi.fn(async () => {}),
14
+ };
15
+
16
+ const manifestState: { voiceFiles: number } = { voiceFiles: 0 };
17
+
18
+ function verifier() {
19
+ const deps = {
20
+ engine: engineMock,
21
+ readFile: vi.fn(async () => "{}"),
22
+ parseManifest: () => ({
23
+ files: {
24
+ voice: Array.from({ length: manifestState.voiceFiles }, (_, i) => ({
25
+ path: `tts/v${i}.gguf`,
26
+ sha256: "x",
27
+ })),
28
+ },
29
+ }),
30
+ } as unknown as Parameters<typeof createVerifyBundleOnDevice>[0];
31
+ return createVerifyBundleOnDevice(deps);
32
+ }
33
+
34
+ const ARGS = {
35
+ modelId: "eliza-1-0_8b",
36
+ bundleRoot: "/tmp/bundle",
37
+ manifestPath: "/tmp/bundle/eliza-1.manifest.json",
38
+ textGgufPath: "/tmp/bundle/text/eliza-1-0_8b.gguf",
39
+ };
40
+
41
+ afterEach(() => {
42
+ vi.clearAllMocks();
43
+ manifestState.voiceFiles = 0;
44
+ });
45
+
46
+ describe("verifyBundleOnDevice", () => {
47
+ it("loads, runs a 1-token text gen, and unloads for a text-only bundle", async () => {
48
+ manifestState.voiceFiles = 0;
49
+ await verifier()(ARGS);
50
+ expect(engineMock.load).toHaveBeenCalledWith(ARGS.textGgufPath, {
51
+ modelPath: ARGS.textGgufPath,
52
+ modelId: ARGS.modelId,
53
+ });
54
+ expect(engineMock.generate).toHaveBeenCalledWith(
55
+ expect.objectContaining({ maxTokens: 1 }),
56
+ );
57
+ expect(engineMock.ensureActiveBundleVoiceReady).not.toHaveBeenCalled();
58
+ expect(engineMock.startVoice).not.toHaveBeenCalled();
59
+ expect(engineMock.unload).toHaveBeenCalled();
60
+ });
61
+
62
+ it("also runs a 1-phrase voice gen + barge-in cancel when the bundle ships voice", async () => {
63
+ manifestState.voiceFiles = 1;
64
+ await verifier()(ARGS);
65
+ expect(engineMock.ensureActiveBundleVoiceReady).toHaveBeenCalled();
66
+ expect(engineMock.startVoice).not.toHaveBeenCalled();
67
+ expect(engineMock.armVoice).not.toHaveBeenCalled();
68
+ expect(engineMock.synthesizeSpeech).toHaveBeenCalled();
69
+ expect(engineMock.triggerBargeIn).toHaveBeenCalled();
70
+ expect(engineMock.stopVoice).toHaveBeenCalled();
71
+ expect(engineMock.unload).toHaveBeenCalled();
72
+ });
73
+
74
+ it("rethrows verify failures and still unloads", async () => {
75
+ manifestState.voiceFiles = 0;
76
+ engineMock.generate.mockRejectedValueOnce(new Error("kernel missing"));
77
+ await expect(verifier()(ARGS)).rejects.toThrow("kernel missing");
78
+ expect(engineMock.unload).toHaveBeenCalled();
79
+ });
80
+
81
+ it("fails verify when voice synthesis yields no PCM", async () => {
82
+ manifestState.voiceFiles = 1;
83
+ engineMock.synthesizeSpeech.mockResolvedValueOnce(new Uint8Array(0));
84
+ await expect(verifier()(ARGS)).rejects.toThrow(/no PCM bytes/);
85
+ expect(engineMock.stopVoice).toHaveBeenCalled();
86
+ });
87
+ });