@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,58 @@
1
+ /**
2
+ * Local image-generation capability (WS3) — public entry point.
3
+ *
4
+ * This module is what `provider.ts` (`createImageGenerationHandler`),
5
+ * the UI image-gen action, and image-gen skill imports to
6
+ * register the capability with the WS1 MemoryArbiter.
7
+ *
8
+ * Wiring:
9
+ *
10
+ * const arbiter = service.getMemoryArbiter();
11
+ * const registration = createImageGenCapabilityRegistration({
12
+ * loader: createDefaultImageGenLoader({ ... }),
13
+ * });
14
+ * arbiter.registerCapability(registration);
15
+ *
16
+ * `createImageGenCapabilityRegistration` wraps the underlying backend
17
+ * so the arbiter's `run(request)` path:
18
+ *
19
+ * 1. Calls `backend.supports(request)`. If false, the arbiter throws
20
+ * `unsupported_request` so the caller can pick a different tier
21
+ * or surface a clear error.
22
+ * 2. Calls `backend.generate(request)` and returns the result.
23
+ *
24
+ * The capability registers with `residentRole: "vision"` so image-gen
25
+ * co-evicts with vision-describe — both are GPU-heavy weights with
26
+ * comparable RAM footprints, and the arbiter's existing one-model-per-
27
+ * role policy gives us free serialization. A vision-describe request
28
+ * arriving while image-gen is in flight will queue, wait for the
29
+ * generate to drain, then evict the diffusion weights and load the
30
+ * VL weights.
31
+ */
32
+ export { type AospImageGenBinding, type AospImageGenHandle, type LoadAospImageGenBackendOptions, loadAospImageGenBackend, } from "./aosp-unavailable";
33
+ export { type ImageGenBackendChoice, type ImageGenBackendId, type ImageGenRuntimeProfile, resolveDefaultImageGenModel, selectImageGenBackends, TIER_TO_DEFAULT_IMAGE_MODEL, } from "./backend-selector";
34
+ export { type CoreMlImageGenBridge, type LoadCoreMlImageGenBackendOptions, loadCoreMlImageGenBackend, } from "./coreml-unavailable";
35
+ export { ImageGenBackendUnavailableError, isImageGenUnavailable, } from "./errors";
36
+ export { loadMfluxImageGenBackend, type MfluxBackendOptions, } from "./mflux";
37
+ export { assertPngOutput, defaultSpawn, loadSdCppImageGenBackend, PNG_SIGNATURE, pickSeed, resolveSeed, type SdCppBackendOptions, type SdCppSpawnLike, } from "./sd-cpp";
38
+ export { loadTensorRtImageGenBackend, type TensorRtBackendOptions, } from "./tensorrt-unavailable";
39
+ export type { ImageGenBackend, ImageGenBackendLoader, ImageGenLoadArgs, ImageGenMimeType, ImageGenRequest, ImageGenResult, } from "./types";
40
+ import type { CapabilityRegistration } from "../memory-arbiter";
41
+ import type { ImageGenBackend, ImageGenBackendLoader, ImageGenRequest, ImageGenResult } from "./types";
42
+ export interface CreateImageGenCapabilityRegistrationOptions {
43
+ loader: ImageGenBackendLoader;
44
+ /**
45
+ * Best-effort RAM/VRAM footprint estimate for the loaded weights. The
46
+ * arbiter only uses this for telemetry; eviction is by priority. The
47
+ * default (3500 MB) matches Z-Image-Turbo Q4_K_M; small-tier SD 1.5
48
+ * loaders SHOULD pass ~1100.
49
+ */
50
+ estimatedMb?: number;
51
+ }
52
+ /**
53
+ * Build a `CapabilityRegistration` ready to feed to
54
+ * `arbiter.registerCapability()`. Mirrors
55
+ * `createVisionCapabilityRegistration` from WS2.
56
+ */
57
+ export declare function createImageGenCapabilityRegistration(opts: CreateImageGenCapabilityRegistrationOptions): CapabilityRegistration<ImageGenBackend, ImageGenRequest, ImageGenResult>;
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,uBAAuB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,2BAA2B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACN,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,yBAAyB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACN,+BAA+B,EAC/B,qBAAqB,GACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,wBAAwB,EACxB,KAAK,mBAAmB,GACxB,MAAM,SAAS,CAAC;AACjB,OAAO,EACN,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,QAAQ,EACR,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,2BAA2B,EAC3B,KAAK,sBAAsB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACX,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,GACd,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAEX,sBAAsB,EACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACX,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,2CAA2C;IAC3D,MAAM,EAAE,qBAAqB,CAAC;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CACnD,IAAI,EAAE,2CAA2C,GAC/C,sBAAsB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC,CA+B1E"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Local image-generation capability (WS3) — public entry point.
3
+ *
4
+ * This module is what `provider.ts` (`createImageGenerationHandler`),
5
+ * the UI image-gen action, and image-gen skill imports to
6
+ * register the capability with the WS1 MemoryArbiter.
7
+ *
8
+ * Wiring:
9
+ *
10
+ * const arbiter = service.getMemoryArbiter();
11
+ * const registration = createImageGenCapabilityRegistration({
12
+ * loader: createDefaultImageGenLoader({ ... }),
13
+ * });
14
+ * arbiter.registerCapability(registration);
15
+ *
16
+ * `createImageGenCapabilityRegistration` wraps the underlying backend
17
+ * so the arbiter's `run(request)` path:
18
+ *
19
+ * 1. Calls `backend.supports(request)`. If false, the arbiter throws
20
+ * `unsupported_request` so the caller can pick a different tier
21
+ * or surface a clear error.
22
+ * 2. Calls `backend.generate(request)` and returns the result.
23
+ *
24
+ * The capability registers with `residentRole: "vision"` so image-gen
25
+ * co-evicts with vision-describe — both are GPU-heavy weights with
26
+ * comparable RAM footprints, and the arbiter's existing one-model-per-
27
+ * role policy gives us free serialization. A vision-describe request
28
+ * arriving while image-gen is in flight will queue, wait for the
29
+ * generate to drain, then evict the diffusion weights and load the
30
+ * VL weights.
31
+ */
32
+
33
+ export {
34
+ type AospImageGenBinding,
35
+ type AospImageGenHandle,
36
+ type LoadAospImageGenBackendOptions,
37
+ loadAospImageGenBackend,
38
+ } from "./aosp-unavailable";
39
+ export {
40
+ type ImageGenBackendChoice,
41
+ type ImageGenBackendId,
42
+ type ImageGenRuntimeProfile,
43
+ resolveDefaultImageGenModel,
44
+ selectImageGenBackends,
45
+ TIER_TO_DEFAULT_IMAGE_MODEL,
46
+ } from "./backend-selector";
47
+ export {
48
+ type CoreMlImageGenBridge,
49
+ type LoadCoreMlImageGenBackendOptions,
50
+ loadCoreMlImageGenBackend,
51
+ } from "./coreml-unavailable";
52
+ export {
53
+ ImageGenBackendUnavailableError,
54
+ isImageGenUnavailable,
55
+ } from "./errors";
56
+ export {
57
+ loadMfluxImageGenBackend,
58
+ type MfluxBackendOptions,
59
+ } from "./mflux";
60
+ export {
61
+ assertPngOutput,
62
+ defaultSpawn,
63
+ loadSdCppImageGenBackend,
64
+ PNG_SIGNATURE,
65
+ pickSeed,
66
+ resolveSeed,
67
+ type SdCppBackendOptions,
68
+ type SdCppSpawnLike,
69
+ } from "./sd-cpp";
70
+ export {
71
+ loadTensorRtImageGenBackend,
72
+ type TensorRtBackendOptions,
73
+ } from "./tensorrt-unavailable";
74
+ export type {
75
+ ImageGenBackend,
76
+ ImageGenBackendLoader,
77
+ ImageGenLoadArgs,
78
+ ImageGenMimeType,
79
+ ImageGenRequest,
80
+ ImageGenResult,
81
+ } from "./types";
82
+
83
+ import type {
84
+ ArbiterCapability,
85
+ CapabilityRegistration,
86
+ } from "../memory-arbiter";
87
+ import { ImageGenBackendUnavailableError } from "./errors";
88
+ import type {
89
+ ImageGenBackend,
90
+ ImageGenBackendLoader,
91
+ ImageGenRequest,
92
+ ImageGenResult,
93
+ } from "./types";
94
+
95
+ export interface CreateImageGenCapabilityRegistrationOptions {
96
+ loader: ImageGenBackendLoader;
97
+ /**
98
+ * Best-effort RAM/VRAM footprint estimate for the loaded weights. The
99
+ * arbiter only uses this for telemetry; eviction is by priority. The
100
+ * default (3500 MB) matches Z-Image-Turbo Q4_K_M; small-tier SD 1.5
101
+ * loaders SHOULD pass ~1100.
102
+ */
103
+ estimatedMb?: number;
104
+ }
105
+
106
+ /**
107
+ * Build a `CapabilityRegistration` ready to feed to
108
+ * `arbiter.registerCapability()`. Mirrors
109
+ * `createVisionCapabilityRegistration` from WS2.
110
+ */
111
+ export function createImageGenCapabilityRegistration(
112
+ opts: CreateImageGenCapabilityRegistrationOptions,
113
+ ): CapabilityRegistration<ImageGenBackend, ImageGenRequest, ImageGenResult> {
114
+ const capability: ArbiterCapability = "image-gen";
115
+ const loader = opts.loader;
116
+ return {
117
+ capability,
118
+ // Co-evict with vision-describe. Both are GPU-heavy modalities
119
+ // with similar load times; sharing the `vision` slot keeps the
120
+ // resident-role table flat and lets the WS1 swap path handle
121
+ // vision-vs-image-gen contention with the existing queue.
122
+ residentRole: "vision",
123
+ estimatedMb: opts.estimatedMb ?? 3500,
124
+ async load(modelKey: string): Promise<ImageGenBackend> {
125
+ return await loader(modelKey);
126
+ },
127
+ async unload(backend: ImageGenBackend): Promise<void> {
128
+ await backend.dispose();
129
+ },
130
+ async run(
131
+ backend: ImageGenBackend,
132
+ request: ImageGenRequest,
133
+ ): Promise<ImageGenResult> {
134
+ if (!backend.supports(request)) {
135
+ throw new ImageGenBackendUnavailableError(
136
+ backend.id,
137
+ "unsupported_request",
138
+ `[imagegen] backend "${backend.id}" does not support this request (width=${request.width ?? "default"} height=${request.height ?? "default"} scheduler=${request.scheduler ?? "default"})`,
139
+ );
140
+ }
141
+ return await backend.generate(request);
142
+ },
143
+ };
144
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * MLX-mflux image-gen backend (WS3) — macOS Apple Silicon.
3
+ *
4
+ * `mflux` is the community MLX port of FLUX.1 with Z-Image-Turbo support
5
+ * (https://github.com/filipstrand/mflux). It's a Python package that
6
+ * ships a `mflux-generate` CLI; we shell out to it from a venv the
7
+ * bundle installer creates at `${MODELS_DIR}/mlx/mflux`.
8
+ *
9
+ * Why a venv (and not a Node MLX binding):
10
+ * - MLX Python is the canonical fast path on Apple Silicon — the
11
+ * mflux maintainers track upstream MLX optimizations directly.
12
+ * - There is no stable MLX Node binding today; writing one would
13
+ * duplicate MLX Python's surface for very little gain. Diffusion
14
+ * latency dominates the IPC cost.
15
+ * - The mflux CLI is stable, with `--model …`, `--prompt …`,
16
+ * `--steps …`, `--seed …`, `--output …`.
17
+ *
18
+ * Venv resolution:
19
+ * 1. `opts.binaryPath` (test injection).
20
+ * 2. `process.env.MFLUX_BIN` (operator override; usually the venv's
21
+ * `bin/mflux-generate`).
22
+ * 3. `${MODELS_DIR}/mlx/mflux/bin/mflux-generate`.
23
+ *
24
+ * Model resolution:
25
+ * mflux expects `--model` to be either a HuggingFace repo id
26
+ * (`black-forest-labs/FLUX.1-schnell`) or a local checkpoint
27
+ * directory. The bundle installer writes the local path; we pass it
28
+ * verbatim.
29
+ *
30
+ * GPU validation status:
31
+ * On Apple Silicon this hits the Metal Performance Shaders backend
32
+ * through MLX. We have no Mac on this host — see
33
+ * `__tests__/imagegen-handler.test.ts` notes for the on-device check
34
+ * (M2 / M3 Max smoke for Z-Image-Turbo 4-step <2s 1024×1024).
35
+ *
36
+ * Publishing pipeline (macOS Apple Silicon only — Intel Mac falls back to
37
+ * sd-cpp Metal, see `sd-cpp.ts`):
38
+ *
39
+ * Build:
40
+ * python3 -m venv ${MODELS_DIR}/mlx/mflux
41
+ * ${MODELS_DIR}/mlx/mflux/bin/pip install --upgrade pip
42
+ * ${MODELS_DIR}/mlx/mflux/bin/pip install mflux # arm64-only wheel
43
+ * Sign:
44
+ * codesign --force --options runtime --timestamp \
45
+ * --sign "Developer ID Application: Eliza Labs Inc." \
46
+ * ${MODELS_DIR}/mlx/mflux/bin/python3
47
+ * codesign --force --options runtime --timestamp \
48
+ * --sign "Developer ID Application: Eliza Labs Inc." \
49
+ * ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
50
+ * Notarize:
51
+ * ditto -c -k --keepParent ${MODELS_DIR}/mlx/mflux mflux-venv.zip
52
+ * xcrun notarytool submit mflux-venv.zip \
53
+ * --apple-id <ci-secret> --team-id <eliza-labs-team> --wait
54
+ * xcrun stapler staple ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
55
+ * Drop:
56
+ * releases.elizaos.ai/mflux/<version>/darwin-arm64/mflux-venv.tar.zst
57
+ * The bundle installer untars the venv into the user's `${MODELS_DIR}/
58
+ * mlx/mflux/` directory; the first launch runs `mflux-generate --help`
59
+ * to warm up the cache.
60
+ */
61
+ import { type SdCppSpawnLike } from "./sd-cpp";
62
+ import type { ImageGenBackend, ImageGenLoadArgs } from "./types";
63
+ export interface MfluxBackendOptions {
64
+ loadArgs: ImageGenLoadArgs;
65
+ modelKey: string;
66
+ binaryPath?: string;
67
+ outputDir?: string;
68
+ spawnImpl?: SdCppSpawnLike;
69
+ /** Test seam — when set, skips subprocess and writes these bytes. */
70
+ fakeImageBytes?: Uint8Array;
71
+ now?: () => number;
72
+ }
73
+ export declare function loadMfluxImageGenBackend(opts: MfluxBackendOptions): Promise<ImageGenBackend>;
74
+ //# sourceMappingURL=mflux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mflux.d.ts","sourceRoot":"","sources":["mflux.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AAMH,OAAO,EAIN,KAAK,cAAc,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACX,eAAe,EACf,gBAAgB,EAGhB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,qEAAqE;IACrE,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAID,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,mBAAmB,GACvB,OAAO,CAAC,eAAe,CAAC,CA8H1B"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * MLX-mflux image-gen backend (WS3) — macOS Apple Silicon.
3
+ *
4
+ * `mflux` is the community MLX port of FLUX.1 with Z-Image-Turbo support
5
+ * (https://github.com/filipstrand/mflux). It's a Python package that
6
+ * ships a `mflux-generate` CLI; we shell out to it from a venv the
7
+ * bundle installer creates at `${MODELS_DIR}/mlx/mflux`.
8
+ *
9
+ * Why a venv (and not a Node MLX binding):
10
+ * - MLX Python is the canonical fast path on Apple Silicon — the
11
+ * mflux maintainers track upstream MLX optimizations directly.
12
+ * - There is no stable MLX Node binding today; writing one would
13
+ * duplicate MLX Python's surface for very little gain. Diffusion
14
+ * latency dominates the IPC cost.
15
+ * - The mflux CLI is stable, with `--model …`, `--prompt …`,
16
+ * `--steps …`, `--seed …`, `--output …`.
17
+ *
18
+ * Venv resolution:
19
+ * 1. `opts.binaryPath` (test injection).
20
+ * 2. `process.env.MFLUX_BIN` (operator override; usually the venv's
21
+ * `bin/mflux-generate`).
22
+ * 3. `${MODELS_DIR}/mlx/mflux/bin/mflux-generate`.
23
+ *
24
+ * Model resolution:
25
+ * mflux expects `--model` to be either a HuggingFace repo id
26
+ * (`black-forest-labs/FLUX.1-schnell`) or a local checkpoint
27
+ * directory. The bundle installer writes the local path; we pass it
28
+ * verbatim.
29
+ *
30
+ * GPU validation status:
31
+ * On Apple Silicon this hits the Metal Performance Shaders backend
32
+ * through MLX. We have no Mac on this host — see
33
+ * `__tests__/imagegen-handler.test.ts` notes for the on-device check
34
+ * (M2 / M3 Max smoke for Z-Image-Turbo 4-step <2s 1024×1024).
35
+ *
36
+ * Publishing pipeline (macOS Apple Silicon only — Intel Mac falls back to
37
+ * sd-cpp Metal, see `sd-cpp.ts`):
38
+ *
39
+ * Build:
40
+ * python3 -m venv ${MODELS_DIR}/mlx/mflux
41
+ * ${MODELS_DIR}/mlx/mflux/bin/pip install --upgrade pip
42
+ * ${MODELS_DIR}/mlx/mflux/bin/pip install mflux # arm64-only wheel
43
+ * Sign:
44
+ * codesign --force --options runtime --timestamp \
45
+ * --sign "Developer ID Application: Eliza Labs Inc." \
46
+ * ${MODELS_DIR}/mlx/mflux/bin/python3
47
+ * codesign --force --options runtime --timestamp \
48
+ * --sign "Developer ID Application: Eliza Labs Inc." \
49
+ * ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
50
+ * Notarize:
51
+ * ditto -c -k --keepParent ${MODELS_DIR}/mlx/mflux mflux-venv.zip
52
+ * xcrun notarytool submit mflux-venv.zip \
53
+ * --apple-id <ci-secret> --team-id <eliza-labs-team> --wait
54
+ * xcrun stapler staple ${MODELS_DIR}/mlx/mflux/bin/mflux-generate
55
+ * Drop:
56
+ * releases.elizaos.ai/mflux/<version>/darwin-arm64/mflux-venv.tar.zst
57
+ * The bundle installer untars the venv into the user's `${MODELS_DIR}/
58
+ * mlx/mflux/` directory; the first launch runs `mflux-generate --help`
59
+ * to warm up the cache.
60
+ */
61
+
62
+ import { existsSync, promises as fs, mkdtempSync } from "node:fs";
63
+ import { tmpdir } from "node:os";
64
+ import { join } from "node:path";
65
+ import { ImageGenBackendUnavailableError } from "./errors";
66
+ import {
67
+ assertPngOutput,
68
+ defaultSpawn,
69
+ resolveSeed,
70
+ type SdCppSpawnLike,
71
+ } from "./sd-cpp";
72
+ import type {
73
+ ImageGenBackend,
74
+ ImageGenLoadArgs,
75
+ ImageGenRequest,
76
+ ImageGenResult,
77
+ } from "./types";
78
+
79
+ export interface MfluxBackendOptions {
80
+ loadArgs: ImageGenLoadArgs;
81
+ modelKey: string;
82
+ binaryPath?: string;
83
+ outputDir?: string;
84
+ spawnImpl?: SdCppSpawnLike;
85
+ /** Test seam — when set, skips subprocess and writes these bytes. */
86
+ fakeImageBytes?: Uint8Array;
87
+ now?: () => number;
88
+ }
89
+
90
+ const DEFAULT_BIN = "mflux-generate";
91
+
92
+ export async function loadMfluxImageGenBackend(
93
+ opts: MfluxBackendOptions,
94
+ ): Promise<ImageGenBackend> {
95
+ const binary = resolveBinary(opts.binaryPath);
96
+ const now = opts.now ?? Date.now;
97
+
98
+ if (!opts.fakeImageBytes) {
99
+ await assertBinaryAvailable(binary, opts.spawnImpl);
100
+ }
101
+
102
+ const outputDir = opts.outputDir ?? mkdtempSync(join(tmpdir(), "mflux-"));
103
+ let disposed = false;
104
+
105
+ return {
106
+ id: "mflux",
107
+ supports(req) {
108
+ // mflux supports flexible WxH but resolution must be a /16 multiple
109
+ // for FLUX. SD 1.5 in mflux (less common) needs /8. We round up,
110
+ // so accept anything reasonable.
111
+ const w = req.width ?? 1024;
112
+ const h = req.height ?? 1024;
113
+ if (w <= 0 || h <= 0) return false;
114
+ if (w > 2048 || h > 2048) return false;
115
+ return true;
116
+ },
117
+ async generate(req): Promise<ImageGenResult> {
118
+ if (disposed) {
119
+ throw new ImageGenBackendUnavailableError(
120
+ "mflux",
121
+ "subprocess_failed",
122
+ "[imagegen/mflux] generate called after dispose()",
123
+ );
124
+ }
125
+ if (!req.prompt.trim()) {
126
+ throw new ImageGenBackendUnavailableError(
127
+ "mflux",
128
+ "unsupported_request",
129
+ "[imagegen/mflux] prompt is empty",
130
+ );
131
+ }
132
+ const seed = resolveSeed(req.seed);
133
+ const width = req.width ?? 1024;
134
+ const height = req.height ?? 1024;
135
+ // FLUX schnell / Z-Image-Turbo are 4-step turbo models; default
136
+ // to 4 here when the caller didn't specify.
137
+ const steps = req.steps ?? 4;
138
+ // FLUX schnell is CFG-free; mflux ignores the value but we record
139
+ // it as 0 in metadata when the caller didn't ask for one.
140
+ const guidanceScale = req.guidanceScale ?? 0;
141
+ const outputPath = join(outputDir, `out-${seed}-${now()}.png`);
142
+ const startMs = now();
143
+
144
+ if (opts.fakeImageBytes) {
145
+ await fs.writeFile(outputPath, opts.fakeImageBytes);
146
+ const elapsed = Math.max(1, now() - startMs);
147
+ if (req.onProgressChunk)
148
+ req.onProgressChunk({ step: steps, total: steps });
149
+ return {
150
+ image: opts.fakeImageBytes,
151
+ mime: "image/png",
152
+ seed,
153
+ metadata: {
154
+ model: opts.modelKey,
155
+ prompt: req.prompt,
156
+ steps,
157
+ guidanceScale,
158
+ inferenceTimeMs: elapsed,
159
+ },
160
+ };
161
+ }
162
+
163
+ if (!existsSync(opts.loadArgs.modelPath)) {
164
+ throw new ImageGenBackendUnavailableError(
165
+ "mflux",
166
+ "model_missing",
167
+ `[imagegen/mflux] model not found: ${opts.loadArgs.modelPath}`,
168
+ );
169
+ }
170
+
171
+ const args: string[] = [
172
+ "--model",
173
+ opts.loadArgs.modelPath,
174
+ "--prompt",
175
+ req.prompt,
176
+ "--width",
177
+ String(width),
178
+ "--height",
179
+ String(height),
180
+ "--steps",
181
+ String(steps),
182
+ "--seed",
183
+ String(seed),
184
+ "--output",
185
+ outputPath,
186
+ ];
187
+ if (req.guidanceScale !== undefined) {
188
+ args.push("--guidance", String(req.guidanceScale));
189
+ }
190
+
191
+ await runMflux(binary, args, {
192
+ signal: req.signal,
193
+ spawnImpl: opts.spawnImpl,
194
+ onProgressChunk: req.onProgressChunk,
195
+ totalSteps: steps,
196
+ });
197
+
198
+ const bytes = new Uint8Array(await fs.readFile(outputPath));
199
+ assertPngOutput(bytes, "mflux", "subprocess_failed");
200
+ const elapsed = Math.max(1, now() - startMs);
201
+ return {
202
+ image: bytes,
203
+ mime: "image/png",
204
+ seed,
205
+ metadata: {
206
+ model: opts.modelKey,
207
+ prompt: req.prompt,
208
+ steps,
209
+ guidanceScale,
210
+ inferenceTimeMs: elapsed,
211
+ },
212
+ };
213
+ },
214
+ async dispose() {
215
+ if (disposed) return;
216
+ disposed = true;
217
+ await fs.rm(outputDir, { recursive: true, force: true }).catch(() => {});
218
+ },
219
+ };
220
+ }
221
+
222
+ function resolveBinary(override?: string): string {
223
+ if (override) return override;
224
+ const envBin = process.env.MFLUX_BIN;
225
+ if (envBin?.trim()) return envBin.trim();
226
+ return DEFAULT_BIN;
227
+ }
228
+
229
+ async function assertBinaryAvailable(
230
+ binary: string,
231
+ spawnImpl?: SdCppSpawnLike,
232
+ ): Promise<void> {
233
+ try {
234
+ const code = await new Promise<number | null>((resolve, reject) => {
235
+ const proc = defaultSpawn(spawnImpl)(binary, ["--help"]);
236
+ proc.on("error", (err: Error) => reject(err));
237
+ proc.on("exit", (c: number | null) => resolve(c));
238
+ });
239
+ // `mflux-generate --help` exits 0 on success. Tolerate code 2 in
240
+ // older mflux versions where --help is the default and exits non-zero.
241
+ if (code !== 0 && code !== 2) {
242
+ throw new ImageGenBackendUnavailableError(
243
+ "mflux",
244
+ "binary_version_mismatch",
245
+ `[imagegen/mflux] '${binary} --help' exited with code ${code}`,
246
+ );
247
+ }
248
+ } catch (err) {
249
+ if (err instanceof ImageGenBackendUnavailableError) throw err;
250
+ const message = err instanceof Error ? err.message : String(err);
251
+ throw new ImageGenBackendUnavailableError(
252
+ "mflux",
253
+ "binary_missing",
254
+ `[imagegen/mflux] cannot run '${binary} --help': ${message}. Set MFLUX_BIN or install the bundle's mflux venv at \${MODELS_DIR}/mlx/mflux.`,
255
+ { cause: err },
256
+ );
257
+ }
258
+ }
259
+
260
+ async function runMflux(
261
+ binary: string,
262
+ args: readonly string[],
263
+ opts: {
264
+ signal?: AbortSignal;
265
+ spawnImpl?: SdCppSpawnLike;
266
+ onProgressChunk?: ImageGenRequest["onProgressChunk"];
267
+ totalSteps: number;
268
+ },
269
+ ): Promise<void> {
270
+ await new Promise<void>((resolve, reject) => {
271
+ const proc = defaultSpawn(opts.spawnImpl)(binary, args, {
272
+ signal: opts.signal,
273
+ });
274
+ const stderr = proc.stderr;
275
+ if (
276
+ opts.onProgressChunk &&
277
+ stderr &&
278
+ typeof (stderr as NodeJS.ReadableStream).on === "function"
279
+ ) {
280
+ let leftover = "";
281
+ (stderr as NodeJS.ReadableStream).on("data", (chunk: Buffer | string) => {
282
+ const text =
283
+ leftover +
284
+ (typeof chunk === "string" ? chunk : chunk.toString("utf8"));
285
+ const lines = text.split(/\r?\n/);
286
+ leftover = lines.pop() ?? "";
287
+ for (const line of lines) {
288
+ // mflux prints `Step N/M` to stderr (tqdm-style).
289
+ const m = line.match(/step\s*(\d+)\s*\/\s*(\d+)/i);
290
+ if (!m) continue;
291
+ opts.onProgressChunk?.({
292
+ step: Number(m[1]),
293
+ total: Number(m[2]) || opts.totalSteps,
294
+ });
295
+ }
296
+ });
297
+ }
298
+ proc.on("error", (err: Error) => reject(err));
299
+ proc.on("exit", (code: number | null) => {
300
+ if (code === 0) {
301
+ resolve();
302
+ return;
303
+ }
304
+ reject(
305
+ new ImageGenBackendUnavailableError(
306
+ "mflux",
307
+ "subprocess_failed",
308
+ `[imagegen/mflux] mflux-generate exited with code ${code}`,
309
+ ),
310
+ );
311
+ });
312
+ });
313
+ }