@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,569 @@
1
+ // Runtime validator and capability-check helpers for Eliza-1 manifests.
2
+ //
3
+ // Two layers of validation:
4
+ //
5
+ // 1. Schema validation (Zod) — shape + types + per-field invariants.
6
+ // 2. Contract validation (this file) — cross-field rules from
7
+ // packages/inference/AGENTS.md §3 + §6:
8
+ // - required-kernel set per tier is satisfied,
9
+ // - long-context bundles (ctx > 64k) require `turbo3_tcq`,
10
+ // - structural bundle invariants (voice-preset cache present, lineage
11
+ // ↔ files consistency, base-v1 provenance coverage),
12
+ // - and — for a *production* release only (`base-v1` / `finetuned-v2` /
13
+ // `final`, or any `defaultEligible: true` manifest) — every supported
14
+ // backend kernel-verified `pass` and every eval green. A
15
+ // candidate/staging release (`base-v1-candidate` / `local-standin` /
16
+ // `upload-candidate`) is publishable + installable on a device whose
17
+ // backend it verified, but is not held to the full bar; its
18
+ // `defaultEligible` must stay false.
19
+ //
20
+ // `defaultEligible: true` is the strongest claim a manifest can make. The
21
+ // validator REFUSES the combination of `defaultEligible: true` and any
22
+ // failing contract rule. This mirrors the publish-side gate in
23
+ // `packages/training/scripts/manifest/eliza1_manifest.py`.
24
+
25
+ import {
26
+ Eliza1ManifestSchema,
27
+ EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD,
28
+ EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT,
29
+ EMOTION_CLASSIFIER_MELD_F1_THRESHOLD,
30
+ REQUIRED_KERNELS_BY_TIER,
31
+ SUPPORTED_BACKENDS_BY_TIER,
32
+ TURN_DETECTOR_F1_THRESHOLD,
33
+ TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT,
34
+ VOICE_PRESET_CACHE_PATH,
35
+ } from "./schema";
36
+ import type {
37
+ Eliza1Backend,
38
+ Eliza1DeviceCaps,
39
+ Eliza1Kernel,
40
+ Eliza1Manifest,
41
+ Eliza1Tier,
42
+ } from "./types";
43
+
44
+ export interface ValidationOk {
45
+ ok: true;
46
+ manifest: Eliza1Manifest;
47
+ }
48
+
49
+ export interface ValidationErr {
50
+ ok: false;
51
+ errors: ReadonlyArray<string>;
52
+ }
53
+
54
+ export type ValidationResult = ValidationOk | ValidationErr;
55
+
56
+ /**
57
+ * Schema + contract validation. Returns a Result-shaped object so callers
58
+ * can inspect every error rather than catching the first thrown one.
59
+ *
60
+ * Throws nothing for invalid input — invalid manifests are reported via
61
+ * `{ ok: false, errors }`. Truly exceptional cases (non-object input)
62
+ * surface as Zod issues, not exceptions.
63
+ */
64
+ export function validateManifest(input: unknown): ValidationResult {
65
+ const parsed = Eliza1ManifestSchema.safeParse(input);
66
+ if (!parsed.success) {
67
+ return {
68
+ ok: false,
69
+ errors: parsed.error.issues.map(
70
+ (i) => `${i.path.join(".") || "<root>"}: ${i.message}`,
71
+ ),
72
+ };
73
+ }
74
+
75
+ const errors = collectContractErrors(parsed.data, {
76
+ allowVersionStaging: true,
77
+ });
78
+ if (errors.length > 0) {
79
+ return { ok: false, errors };
80
+ }
81
+ return { ok: true, manifest: parsed.data };
82
+ }
83
+
84
+ /**
85
+ * Throws on invalid input. Use this from boot paths where a structured
86
+ * error is already attached at the boundary. Internal use only — UI
87
+ * code should prefer `validateManifest`.
88
+ */
89
+ export function parseManifestOrThrow(input: unknown): Eliza1Manifest {
90
+ const result = validateManifest(input);
91
+ if (result.ok === false) {
92
+ throw new Error(
93
+ `Invalid Eliza-1 manifest:\n - ${result.errors.join("\n - ")}`,
94
+ );
95
+ }
96
+ return result.manifest;
97
+ }
98
+
99
+ /**
100
+ * `canSetAsDefault` is the recommendation-engine gate. A manifest that
101
+ * passes this is allowed to fill an empty default slot for the device:
102
+ *
103
+ * - the manifest is contract-valid (every required kernel declared, every
104
+ * required eval green for a strict release, lineage/files consistent),
105
+ * - the device RAM meets the manifest's `ramBudgetMb.min` floor,
106
+ * - the device exposes at least one backend the manifest verified `pass`
107
+ * on out of the tier's supported set.
108
+ *
109
+ * A `defaultEligible: true` manifest is the strict release: every supported
110
+ * backend kernel-verified `pass`, every required eval green. A
111
+ * `defaultEligible: false` manifest with an explicit candidate/staging
112
+ * `releaseState` (`base-v1-candidate`, `local-standin`, `upload-candidate`)
113
+ * is still permitted to fill an empty default slot **when this device can
114
+ * run it** — the recommender prefers a strict release over a candidate when
115
+ * both are installed (see `isStrictReleaseManifest`). Version-only staging
116
+ * stamps such as `1.0.0-weights-staged.2` are accepted by the install parser
117
+ * so QA bundles can be materialized, but they do not get this auto-default
118
+ * relaxation unless the manifest also carries an explicit staging
119
+ * `releaseState`.
120
+ *
121
+ * The device-caps check rejects "this device has Vulkan only but the
122
+ * manifest only verified Metal/CUDA" — a manifest may be contract-valid
123
+ * but not runnable on this device.
124
+ */
125
+ export function canSetAsDefault(
126
+ manifest: Eliza1Manifest,
127
+ device: Eliza1DeviceCaps,
128
+ ): boolean {
129
+ if (
130
+ collectContractErrors(manifest, { allowVersionStaging: false }).length > 0
131
+ ) {
132
+ return false;
133
+ }
134
+ if (manifest.ramBudgetMb.min > device.ramMb) return false;
135
+
136
+ // The device must expose at least one backend that the manifest verified
137
+ // pass on. Pre-check against the tier's supported set so we don't accept
138
+ // a tier-server bundle on a Mac via the cpu fallback alone.
139
+ const supported = new Set<Eliza1Backend>(
140
+ SUPPORTED_BACKENDS_BY_TIER[manifest.tier],
141
+ );
142
+ const overlapping = device.availableBackends.filter(
143
+ (b) =>
144
+ supported.has(b) &&
145
+ manifest.kernels.verifiedBackends[b].status === "pass",
146
+ );
147
+ return overlapping.length > 0;
148
+ }
149
+
150
+ /**
151
+ * Strict release identifier: a `defaultEligible: true` manifest. The
152
+ * recommender uses this to prefer a strict release over a candidate
153
+ * bundle when both are installed and contract-valid. Mirrors the
154
+ * publish-side `eliza1_gates.yaml` strict bar.
155
+ */
156
+ export function isStrictReleaseManifest(manifest: Eliza1Manifest): boolean {
157
+ return manifest.defaultEligible === true;
158
+ }
159
+
160
+ // ---------------------------------------------------------------------------
161
+ // Internal: contract rules from AGENTS.md §3 + §6
162
+ // ---------------------------------------------------------------------------
163
+
164
+ // Release states that make the full "production" claim: every supported
165
+ // backend kernel-verified `pass`, every eval green. `base-v1` / `finetuned-v2`
166
+ // / `final` are published releases; `defaultEligible: true` always implies it
167
+ // (it is the device auto-default). A manifest with no `provenance` block is
168
+ // treated as production too — that was the only behaviour before this guard,
169
+ // so back-compat holds. `base-v1-candidate` / `local-standin` /
170
+ // `upload-candidate` are publishable + installable on a device whose backend
171
+ // they *did* verify, but are not held to the full bar — their `defaultEligible`
172
+ // must stay false (the schema's `releaseChannel=base-v1 → defaultEligible:false`
173
+ // refinement already enforces that for the base-v1 channel; the validator now
174
+ // honours the release-state vocabulary instead of applying the auto-default
175
+ // bar to every manifest).
176
+ const STRICT_RELEASE_STATES: ReadonlySet<string> = new Set([
177
+ "base-v1",
178
+ "finetuned-v2",
179
+ "final",
180
+ ]);
181
+
182
+ const VISION_TIERS: ReadonlySet<Eliza1Tier> = new Set([
183
+ "0_8b",
184
+ "2b",
185
+ "4b",
186
+ "9b",
187
+ "27b",
188
+ "27b-256k",
189
+ ]);
190
+
191
+ const MTP_TIERS: ReadonlySet<Eliza1Tier> = new Set([
192
+ "0_8b",
193
+ "2b",
194
+ "4b",
195
+ "9b",
196
+ "27b",
197
+ "27b-256k",
198
+ ]);
199
+
200
+ const MIN_TEXT_CONTEXT = 131072;
201
+
202
+ const STAGING_VERSION_TOKENS: ReadonlySet<string> = new Set([
203
+ "candidate",
204
+ "staged",
205
+ "dev",
206
+ "local",
207
+ ]);
208
+
209
+ function isStagingManifestVersion(version: string): boolean {
210
+ const prerelease = version.match(
211
+ /^[0-9]+\.[0-9]+\.[0-9]+-([^+]+)(?:\+.*)?$/,
212
+ )?.[1];
213
+ if (!prerelease) return false;
214
+ return prerelease
215
+ .split(/[.-]/)
216
+ .some((token) => STAGING_VERSION_TOKENS.has(token.toLowerCase()));
217
+ }
218
+
219
+ function collectContractErrors(
220
+ m: Eliza1Manifest,
221
+ options: { allowVersionStaging?: boolean } = {},
222
+ ): string[] {
223
+ const errors: string[] = [];
224
+
225
+ const releaseState = m.provenance?.releaseState;
226
+ const strictRelease =
227
+ m.defaultEligible === true ||
228
+ (releaseState === undefined &&
229
+ !(
230
+ options.allowVersionStaging === true &&
231
+ isStagingManifestVersion(m.version)
232
+ )) ||
233
+ (releaseState !== undefined && STRICT_RELEASE_STATES.has(releaseState));
234
+
235
+ // Required-kernel coverage.
236
+ const declaredRequired = new Set<Eliza1Kernel>(m.kernels.required);
237
+ const tierRequired = REQUIRED_KERNELS_BY_TIER[m.tier];
238
+ for (const k of tierRequired) {
239
+ if (!declaredRequired.has(k)) {
240
+ errors.push(
241
+ `kernels.required: missing required kernel for tier ${m.tier}: ${k}`,
242
+ );
243
+ }
244
+ }
245
+
246
+ for (const [i, entry] of m.files.text.entries()) {
247
+ if (typeof entry.ctx !== "number") {
248
+ errors.push(`files.text[${i}].ctx: required for text GGUFs`);
249
+ } else if (entry.ctx < MIN_TEXT_CONTEXT) {
250
+ errors.push(
251
+ `files.text[${i}].ctx: ${entry.ctx} is below the 128k text GGUF floor`,
252
+ );
253
+ }
254
+ if (/-(32k|64k)\.gguf$/i.test(entry.path)) {
255
+ errors.push(
256
+ `files.text[${i}].path: 32k/64k text GGUFs are below the Eliza-1 release floor`,
257
+ );
258
+ }
259
+ }
260
+
261
+ // Long-context tiers MUST require turbo3_tcq once any text variant has
262
+ // ctx > 64k. AGENTS.md §3 Required for desktop/pro/server (#6).
263
+ const hasLongContextVariant = m.files.text.some(
264
+ (f) => typeof f.ctx === "number" && f.ctx > 65536,
265
+ );
266
+ if (hasLongContextVariant) {
267
+ if (!declaredRequired.has("turbo3_tcq")) {
268
+ errors.push(
269
+ "kernels.required: text variant with ctx > 64k requires turbo3_tcq",
270
+ );
271
+ }
272
+ }
273
+
274
+ const visionEnabled = VISION_TIERS.has(m.tier);
275
+ if (visionEnabled) {
276
+ if (m.files.vision.length === 0) {
277
+ errors.push(`files.vision: required for vision-enabled tier ${m.tier}`);
278
+ }
279
+ } else if (m.files.vision.length > 0) {
280
+ errors.push(`files.vision: unsupported for non-vision tier ${m.tier}`);
281
+ }
282
+
283
+ const mtpEnabled = MTP_TIERS.has(m.tier);
284
+ if (mtpEnabled) {
285
+ if (m.files.mtp.length === 0) {
286
+ errors.push(`files.mtp: required for MTP-enabled tier ${m.tier}`);
287
+ }
288
+ if (!m.lineage.drafter) {
289
+ errors.push(`lineage.drafter: required for MTP-enabled tier ${m.tier}`);
290
+ }
291
+ if (!m.evals.mtp) {
292
+ errors.push(`evals.mtp: required for MTP-enabled tier ${m.tier}`);
293
+ } else {
294
+ if (
295
+ m.evals.mtp.passed &&
296
+ (m.evals.mtp.acceptanceRate == null || m.evals.mtp.speedup == null)
297
+ ) {
298
+ errors.push(
299
+ "evals.mtp.passed: cannot be true when acceptanceRate or speedup is null (needs-hardware bench)",
300
+ );
301
+ }
302
+ if (strictRelease && !m.evals.mtp.passed) {
303
+ errors.push("evals.mtp.passed: false");
304
+ }
305
+ }
306
+ } else if (m.files.mtp.length > 0) {
307
+ errors.push(`files.mtp: unsupported for non-MTP tier ${m.tier}`);
308
+ }
309
+
310
+ // Backend kernel-verify coverage. A production release must verify every
311
+ // backend the tier supports; a candidate/staging bundle need only verify at
312
+ // least one supported backend (the device-side `canSetAsDefault` /
313
+ // installability check then matches the device's available backends against
314
+ // the verified-`pass` set, so a CUDA-only candidate installs on CUDA hosts
315
+ // and is rejected on a Mac whose Metal it never verified).
316
+ const supportedBackends = SUPPORTED_BACKENDS_BY_TIER[m.tier];
317
+ if (strictRelease) {
318
+ for (const b of supportedBackends) {
319
+ const status = m.kernels.verifiedBackends[b].status;
320
+ if (status !== "pass") {
321
+ errors.push(
322
+ `kernels.verifiedBackends.${b}: status is "${status}", expected "pass" for tier ${m.tier}`,
323
+ );
324
+ }
325
+ }
326
+ } else if (
327
+ !supportedBackends.some(
328
+ (b) => m.kernels.verifiedBackends[b].status === "pass",
329
+ )
330
+ ) {
331
+ errors.push(
332
+ `kernels.verifiedBackends: a publishable bundle must report status="pass" on at least one supported backend for tier ${m.tier} (got [${supportedBackends
333
+ .map((b) => `${b}:${m.kernels.verifiedBackends[b].status}`)
334
+ .join(", ")}])`,
335
+ );
336
+ }
337
+
338
+ // The precomputed default-voice speaker preset (`cache/voice-preset-default.bin`)
339
+ // is a mandatory bundle artifact — `EngineVoiceBridge.start()` hard-fails
340
+ // without it (AGENTS.md §4 / inference/AGENTS.md §2). It must be listed in
341
+ // `files.cache` so the downloader fetches it, and when the manifest declares
342
+ // a `voice` block its `cache.speakerPreset` must point at the same path.
343
+ if (!m.files.cache.some((f) => f.path === VOICE_PRESET_CACHE_PATH)) {
344
+ errors.push(`files.cache: missing required ${VOICE_PRESET_CACHE_PATH}`);
345
+ }
346
+ if (m.voice && m.voice.cache.speakerPreset !== VOICE_PRESET_CACHE_PATH) {
347
+ errors.push(
348
+ `voice.cache.speakerPreset: must be ${VOICE_PRESET_CACHE_PATH}, got ${m.voice.cache.speakerPreset}`,
349
+ );
350
+ }
351
+
352
+ // Eval gates. Enforced as pass/fail only for a production release; a
353
+ // candidate/staging bundle still carries the eval blobs (Zod-shape-checked,
354
+ // measured-or-`not-run`) but a non-green eval does not block publish/install
355
+ // — only `defaultEligible` promotion (which requires `strictRelease`).
356
+ if (strictRelease) {
357
+ if (!m.evals.textEval.passed) errors.push("evals.textEval.passed: false");
358
+ if (!m.evals.voiceRtf.passed) errors.push("evals.voiceRtf.passed: false");
359
+ if (!m.evals.e2eLoopOk) errors.push("evals.e2eLoopOk: false");
360
+ if (!m.evals.thirtyTurnOk) errors.push("evals.thirtyTurnOk: false");
361
+ }
362
+
363
+ // Optional component slots must be internally consistent: a shipped
364
+ // component needs auditable lineage, and lineage may not point at a
365
+ // component absent from the bundle. Components that affect runtime quality
366
+ // also require their own publish gate to pass.
367
+ if (m.defaultEligible) {
368
+ if (m.files.asr.length === 0) {
369
+ errors.push(
370
+ "files.asr: required for defaultEligible local voice bundles",
371
+ );
372
+ }
373
+ if ((m.files.vad ?? []).length === 0) {
374
+ errors.push(
375
+ "files.vad: required for defaultEligible local voice bundles",
376
+ );
377
+ }
378
+ }
379
+
380
+ for (const slot of [
381
+ "asr",
382
+ "embedding",
383
+ "imagegen",
384
+ "vision",
385
+ "vad",
386
+ "wakeword",
387
+ "turn",
388
+ "emotion",
389
+ ] as const) {
390
+ const files = m.files[slot] ?? [];
391
+ const lineage = m.lineage[slot];
392
+ if (files.length > 0 && !lineage) {
393
+ errors.push(`lineage.${slot}: required when files.${slot} is non-empty`);
394
+ }
395
+ if (lineage && files.length === 0) {
396
+ errors.push(`files.${slot}: required when lineage.${slot} is present`);
397
+ }
398
+ }
399
+ if (m.lineage.drafter && m.files.mtp.length === 0) {
400
+ errors.push("files.mtp: required when lineage.drafter is present");
401
+ }
402
+
403
+ if (m.files.asr.length > 0) {
404
+ if (!m.evals.asrWer) {
405
+ errors.push("evals.asrWer: required when files.asr is non-empty");
406
+ } else if (strictRelease && !m.evals.asrWer.passed) {
407
+ errors.push("evals.asrWer.passed: false");
408
+ }
409
+ }
410
+ if ((m.files.embedding ?? []).length > 0) {
411
+ if (!m.evals.embedMteb) {
412
+ errors.push(
413
+ "evals.embedMteb: required when files.embedding is non-empty",
414
+ );
415
+ } else if (strictRelease && !m.evals.embedMteb.passed) {
416
+ errors.push("evals.embedMteb.passed: false");
417
+ }
418
+ }
419
+ if ((m.files.vad ?? []).length > 0) {
420
+ if (!m.evals.vadLatencyMs) {
421
+ errors.push("evals.vadLatencyMs: required when files.vad is non-empty");
422
+ } else if (strictRelease && !m.evals.vadLatencyMs.passed) {
423
+ errors.push("evals.vadLatencyMs.passed: false");
424
+ }
425
+ }
426
+ // Voice Wave 2 (2026-05-14): turn-detector eval gate. When the bundle
427
+ // ships `files.turn` (the LiveKit/Turnsense ONNX) the manifest MUST
428
+ // declare a `turnDetector` eval block; a strict release additionally
429
+ // requires `passed=true` AND the precomputed `passed` field to be
430
+ // internally consistent with the threshold constants.
431
+ if ((m.files.turn ?? []).length > 0) {
432
+ const td = m.evals.turnDetector;
433
+ if (!td) {
434
+ errors.push("evals.turnDetector: required when files.turn is non-empty");
435
+ } else {
436
+ const gateMet =
437
+ td.f1 >= TURN_DETECTOR_F1_THRESHOLD &&
438
+ td.meanLatencyMs <= TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT;
439
+ if (td.passed !== gateMet) {
440
+ errors.push(
441
+ `evals.turnDetector.passed: ${td.passed} disagrees with measured gate (f1=${td.f1} ≥ ${TURN_DETECTOR_F1_THRESHOLD} && meanLatencyMs=${td.meanLatencyMs} ≤ ${TURN_DETECTOR_MEAN_LATENCY_MS_LIMIT} → ${gateMet})`,
442
+ );
443
+ }
444
+ if (strictRelease && !td.passed) {
445
+ errors.push("evals.turnDetector.passed: false");
446
+ }
447
+ }
448
+ }
449
+ const expressiveVoice =
450
+ m.voice?.capabilities.includes("emotion-tags") ||
451
+ m.voice?.capabilities.includes("singing");
452
+ if (expressiveVoice) {
453
+ if (!m.evals.expressive) {
454
+ errors.push(
455
+ "evals.expressive: required when voice capabilities include emotion-tags or singing",
456
+ );
457
+ } else if (strictRelease && !m.evals.expressive.passed) {
458
+ errors.push("evals.expressive.passed: false");
459
+ }
460
+ }
461
+
462
+ // Voice Wave 2 (2026-05-14): acoustic-emotion classifier eval gate. Same
463
+ // shape as `turnDetector`: a bundle that ships `files.emotion` MUST
464
+ // declare a precomputed `emotionClassifier` block; a strict release
465
+ // additionally requires `passed=true` and internal consistency with the
466
+ // threshold constants. The MELD bar is intentionally low (~0.35) per
467
+ // R3-emotion §6 — refusing to publish a real improvement is worse than
468
+ // admitting 7-class conversational SER is hard.
469
+ if ((m.files.emotion ?? []).length > 0) {
470
+ const ec = m.evals.emotionClassifier;
471
+ if (!ec) {
472
+ errors.push(
473
+ "evals.emotionClassifier: required when files.emotion is non-empty",
474
+ );
475
+ } else {
476
+ const gateMet =
477
+ ec.macroF1Meld >= EMOTION_CLASSIFIER_MELD_F1_THRESHOLD &&
478
+ ec.macroF1Iemocap >= EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD &&
479
+ ec.meanLatencyMs <= EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT;
480
+ if (ec.passed !== gateMet) {
481
+ errors.push(
482
+ `evals.emotionClassifier.passed: ${ec.passed} disagrees with measured gate (` +
483
+ `macroF1Meld=${ec.macroF1Meld} ≥ ${EMOTION_CLASSIFIER_MELD_F1_THRESHOLD} && ` +
484
+ `macroF1Iemocap=${ec.macroF1Iemocap} ≥ ${EMOTION_CLASSIFIER_IEMOCAP_F1_THRESHOLD} && ` +
485
+ `meanLatencyMs=${ec.meanLatencyMs} ≤ ${EMOTION_CLASSIFIER_MEAN_LATENCY_MS_LIMIT} → ${gateMet})`,
486
+ );
487
+ }
488
+ if (strictRelease && !ec.passed) {
489
+ errors.push("evals.emotionClassifier.passed: false");
490
+ }
491
+ }
492
+ }
493
+
494
+ // base-v1 provenance coverage. A `base-v1` manifest (the upstream base
495
+ // models, GGUF-converted + fully optimized, NOT fine-tuned) MUST record
496
+ // where every shipped component comes from — that is the whole point of
497
+ // the release state.
498
+ if (m.provenance) {
499
+ if (
500
+ m.provenance.releaseState === "base-v1" &&
501
+ m.provenance.finetuned !== false
502
+ ) {
503
+ errors.push(
504
+ "provenance.finetuned: must be false for releaseState=base-v1",
505
+ );
506
+ }
507
+ if (m.provenance.releaseState === "base-v1") {
508
+ const requiredSlots: Array<keyof typeof m.provenance.sourceModels> = [
509
+ "text",
510
+ "voice",
511
+ ];
512
+ for (const slot of ["asr", "vad", "embedding", "vision"] as const) {
513
+ if ((m.files[slot] ?? []).length > 0) requiredSlots.push(slot);
514
+ }
515
+ if (m.files.mtp.length > 0) {
516
+ requiredSlots.push("drafter");
517
+ }
518
+ if ((m.files.imagegen ?? []).length > 0) {
519
+ requiredSlots.push("imagegen");
520
+ }
521
+ for (const slot of requiredSlots) {
522
+ if (!m.provenance.sourceModels[slot]) {
523
+ errors.push(
524
+ `provenance.sourceModels.${slot}: required for releaseState=base-v1 (component is in files.${slot})`,
525
+ );
526
+ }
527
+ }
528
+ }
529
+ }
530
+
531
+ // EAGLE3 bench metadata is always optional. When
532
+ // present, it may record a not-run/failure state; only a passing claim must
533
+ // include measured acceptance/speedup values.
534
+ if (m.evals.eagle3) {
535
+ const eagle3Passed = m.evals.eagle3.passed ?? m.evals.eagle3.pass;
536
+ if (
537
+ eagle3Passed === true &&
538
+ (m.evals.eagle3.acceptanceRate == null || m.evals.eagle3.speedup == null)
539
+ ) {
540
+ errors.push(
541
+ "evals.eagle3: passed=true requires measured acceptanceRate and speedup",
542
+ );
543
+ }
544
+ }
545
+
546
+ // The strongest claim: defaultEligible. If anything above failed, this
547
+ // flag must be false. (Contract errors are already accumulated; we add
548
+ // an explicit message so callers can identify the violation cleanly.)
549
+ if (m.defaultEligible && errors.length > 0) {
550
+ errors.unshift(
551
+ "defaultEligible: true requires all required kernels, supported backends, and evals to pass",
552
+ );
553
+ }
554
+
555
+ return errors;
556
+ }
557
+
558
+ /**
559
+ * Convenience: list missing required kernels for a tier without doing
560
+ * full validation. Used by the recommendation engine when surfacing
561
+ * "this bundle is broken" diagnostics.
562
+ */
563
+ export function missingRequiredKernels(
564
+ tier: Eliza1Tier,
565
+ declaredRequired: ReadonlyArray<Eliza1Kernel>,
566
+ ): ReadonlyArray<Eliza1Kernel> {
567
+ const declared = new Set(declaredRequired);
568
+ return REQUIRED_KERNELS_BY_TIER[tier].filter((k) => !declared.has(k));
569
+ }