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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/package.json +82 -15
  4. package/src/actions/generate-media.d.ts +59 -0
  5. package/src/actions/generate-media.d.ts.map +1 -0
  6. package/src/actions/generate-media.ts +647 -0
  7. package/src/actions/identify-speaker.d.ts +23 -0
  8. package/src/actions/identify-speaker.d.ts.map +1 -0
  9. package/src/actions/identify-speaker.ts +171 -0
  10. package/src/actions/transcription-control.d.ts +29 -0
  11. package/src/actions/transcription-control.d.ts.map +1 -0
  12. package/src/actions/transcription-control.test.ts +100 -0
  13. package/src/actions/transcription-control.ts +127 -0
  14. package/src/adapters/capacitor-llama/__tests__/compat-behavior.test.ts +218 -0
  15. package/src/adapters/capacitor-llama/__tests__/index.test.ts +68 -0
  16. package/src/adapters/capacitor-llama/__tests__/structured-output.test.ts +215 -0
  17. package/src/adapters/capacitor-llama/__tests__/text-streaming.test.ts +174 -0
  18. package/src/adapters/capacitor-llama/environment.ts +71 -0
  19. package/src/adapters/capacitor-llama/index.browser.ts +83 -0
  20. package/src/adapters/capacitor-llama/index.ts +807 -0
  21. package/src/adapters/capacitor-llama/loader.ts +109 -0
  22. package/src/adapters/capacitor-llama/structured-output.ts +165 -0
  23. package/src/adapters/capacitor-llama/text-streaming.ts +227 -0
  24. package/src/adapters/capacitor-llama/types.ts +374 -0
  25. package/src/backends/apple-foundation.ts +127 -0
  26. package/src/index.d.ts +8 -0
  27. package/src/index.d.ts.map +1 -0
  28. package/src/index.ts +62 -0
  29. package/src/local-inference-routes.d.ts +38 -0
  30. package/src/local-inference-routes.d.ts.map +1 -0
  31. package/src/local-inference-routes.test.ts +344 -0
  32. package/src/local-inference-routes.ts +1543 -0
  33. package/src/provider.d.ts +21 -0
  34. package/src/provider.d.ts.map +1 -0
  35. package/src/provider.ts +1082 -0
  36. package/src/routes/compat-helpers.d.ts +18 -0
  37. package/src/routes/compat-helpers.d.ts.map +1 -0
  38. package/src/routes/compat-helpers.ts +274 -0
  39. package/src/routes/family-member-route.d.ts +62 -0
  40. package/src/routes/family-member-route.d.ts.map +1 -0
  41. package/src/routes/family-member-route.ts +353 -0
  42. package/src/routes/index.d.ts +19 -0
  43. package/src/routes/index.d.ts.map +1 -0
  44. package/src/routes/index.ts +60 -0
  45. package/src/routes/live-diarization-route.d.ts +26 -0
  46. package/src/routes/live-diarization-route.d.ts.map +1 -0
  47. package/src/routes/live-diarization-route.test.ts +213 -0
  48. package/src/routes/live-diarization-route.ts +122 -0
  49. package/src/routes/local-inference-asr-route.d.ts +4 -0
  50. package/src/routes/local-inference-asr-route.d.ts.map +1 -0
  51. package/src/routes/local-inference-asr-route.test.ts +205 -0
  52. package/src/routes/local-inference-asr-route.ts +163 -0
  53. package/src/routes/local-inference-asr-transcribe.d.ts +20 -0
  54. package/src/routes/local-inference-asr-transcribe.d.ts.map +1 -0
  55. package/src/routes/local-inference-asr-transcribe.test.ts +118 -0
  56. package/src/routes/local-inference-asr-transcribe.ts +97 -0
  57. package/src/routes/local-inference-compat-routes.d.ts +16 -0
  58. package/src/routes/local-inference-compat-routes.d.ts.map +1 -0
  59. package/src/routes/local-inference-compat-routes.test.ts +485 -0
  60. package/src/routes/local-inference-compat-routes.ts +808 -0
  61. package/src/routes/local-inference-tts-route.d.ts +7 -0
  62. package/src/routes/local-inference-tts-route.d.ts.map +1 -0
  63. package/src/routes/local-inference-tts-route.test.ts +179 -0
  64. package/src/routes/local-inference-tts-route.ts +230 -0
  65. package/src/routes/transcript-audio-store.d.ts +15 -0
  66. package/src/routes/transcript-audio-store.d.ts.map +1 -0
  67. package/src/routes/transcript-audio-store.ts +27 -0
  68. package/src/routes/transcripts-routes.d.ts +36 -0
  69. package/src/routes/transcripts-routes.d.ts.map +1 -0
  70. package/src/routes/transcripts-routes.test.ts +144 -0
  71. package/src/routes/transcripts-routes.ts +159 -0
  72. package/src/routes/voice-first-run-routes.d.ts +62 -0
  73. package/src/routes/voice-first-run-routes.d.ts.map +1 -0
  74. package/src/routes/voice-first-run-routes.ts +524 -0
  75. package/src/routes/voice-models-routes.d.ts +62 -0
  76. package/src/routes/voice-models-routes.d.ts.map +1 -0
  77. package/src/routes/voice-models-routes.ts +554 -0
  78. package/src/routes/voice-profile-plugin-routes.d.ts +19 -0
  79. package/src/routes/voice-profile-plugin-routes.d.ts.map +1 -0
  80. package/src/routes/voice-profile-plugin-routes.ts +138 -0
  81. package/src/routes/voice-profiles-management-routes.d.ts +52 -0
  82. package/src/routes/voice-profiles-management-routes.d.ts.map +1 -0
  83. package/src/routes/voice-profiles-management-routes.ts +476 -0
  84. package/src/routes/voice-speaker-profile-routes.d.ts +57 -0
  85. package/src/routes/voice-speaker-profile-routes.d.ts.map +1 -0
  86. package/src/routes/voice-speaker-profile-routes.ts +199 -0
  87. package/src/runtime/aosp-llama-loader-selection.test.ts +80 -0
  88. package/src/runtime/capacitor-llama.d.ts +25 -0
  89. package/src/runtime/embedding-manager-support.d.ts +77 -0
  90. package/src/runtime/embedding-manager-support.d.ts.map +1 -0
  91. package/src/runtime/embedding-manager-support.ts +497 -0
  92. package/src/runtime/embedding-presets.d.ts +16 -0
  93. package/src/runtime/embedding-presets.d.ts.map +1 -0
  94. package/src/runtime/embedding-presets.ts +81 -0
  95. package/src/runtime/embedding-warmup-policy.d.ts +14 -0
  96. package/src/runtime/embedding-warmup-policy.d.ts.map +1 -0
  97. package/src/runtime/embedding-warmup-policy.test.ts +53 -0
  98. package/src/runtime/embedding-warmup-policy.ts +48 -0
  99. package/src/runtime/ensure-local-inference-handler.d.ts +62 -0
  100. package/src/runtime/ensure-local-inference-handler.d.ts.map +1 -0
  101. package/src/runtime/ensure-local-inference-handler.test.ts +528 -0
  102. package/src/runtime/ensure-local-inference-handler.ts +1448 -0
  103. package/src/runtime/index.d.ts +15 -0
  104. package/src/runtime/index.d.ts.map +1 -0
  105. package/src/runtime/index.ts +33 -0
  106. package/src/runtime/mobile-local-inference-gate.d.ts +31 -0
  107. package/src/runtime/mobile-local-inference-gate.d.ts.map +1 -0
  108. package/src/runtime/mobile-local-inference-gate.test.ts +69 -0
  109. package/src/runtime/mobile-local-inference-gate.ts +44 -0
  110. package/src/runtime/voice-entity-binding.d.ts +103 -0
  111. package/src/runtime/voice-entity-binding.d.ts.map +1 -0
  112. package/src/runtime/voice-entity-binding.transcript.test.ts +69 -0
  113. package/src/runtime/voice-entity-binding.ts +328 -0
  114. package/src/services/README.md +71 -0
  115. package/src/services/__tests__/backend-selector.test.ts +101 -0
  116. package/src/services/__tests__/checkpoint-manager.test.ts +376 -0
  117. package/src/services/__tests__/gpu-autotune.test.ts +400 -0
  118. package/src/services/__tests__/llm-streaming-binding.test.ts +85 -0
  119. package/src/services/__tests__/planner-grammar.test.ts +372 -0
  120. package/src/services/__tests__/runtime-target.test.ts +176 -0
  121. package/src/services/active-model-switch-rollback.test.ts +183 -0
  122. package/src/services/active-model.d.ts +282 -0
  123. package/src/services/active-model.d.ts.map +1 -0
  124. package/src/services/active-model.ts +1213 -0
  125. package/src/services/assignments.d.ts +71 -0
  126. package/src/services/assignments.d.ts.map +1 -0
  127. package/src/services/assignments.test.ts +80 -0
  128. package/src/services/assignments.ts +230 -0
  129. package/src/services/backend-selector.ts +95 -0
  130. package/src/services/backend.d.ts +346 -0
  131. package/src/services/backend.d.ts.map +1 -0
  132. package/src/services/backend.ts +612 -0
  133. package/src/services/bionic-host-loader.d.ts +46 -0
  134. package/src/services/bionic-host-loader.d.ts.map +1 -0
  135. package/src/services/bionic-host-loader.test.ts +133 -0
  136. package/src/services/bionic-host-loader.ts +180 -0
  137. package/src/services/bundled-models.d.ts +34 -0
  138. package/src/services/bundled-models.d.ts.map +1 -0
  139. package/src/services/bundled-models.ts +129 -0
  140. package/src/services/cache-bridge.d.ts +206 -0
  141. package/src/services/cache-bridge.d.ts.map +1 -0
  142. package/src/services/cache-bridge.test.ts +516 -0
  143. package/src/services/cache-bridge.ts +423 -0
  144. package/src/services/catalog.d.ts +10 -0
  145. package/src/services/catalog.d.ts.map +1 -0
  146. package/src/services/catalog.test.ts +238 -0
  147. package/src/services/catalog.ts +27 -0
  148. package/src/services/checkpoint-client.d.ts +109 -0
  149. package/src/services/checkpoint-client.d.ts.map +1 -0
  150. package/src/services/checkpoint-client.ts +258 -0
  151. package/src/services/checkpoint-manager.ts +474 -0
  152. package/src/services/cloud-fallback.d.ts +102 -0
  153. package/src/services/cloud-fallback.d.ts.map +1 -0
  154. package/src/services/cloud-fallback.ts +230 -0
  155. package/src/services/conversation-registry.d.ts +142 -0
  156. package/src/services/conversation-registry.d.ts.map +1 -0
  157. package/src/services/conversation-registry.test.ts +235 -0
  158. package/src/services/conversation-registry.ts +264 -0
  159. package/src/services/desktop-fused-ffi-backend-runtime.d.ts +95 -0
  160. package/src/services/desktop-fused-ffi-backend-runtime.d.ts.map +1 -0
  161. package/src/services/desktop-fused-ffi-backend-runtime.ts +339 -0
  162. package/src/services/device-bridge.d.ts +188 -0
  163. package/src/services/device-bridge.d.ts.map +1 -0
  164. package/src/services/device-bridge.ts +1237 -0
  165. package/src/services/device-resource-metrics.d.ts +149 -0
  166. package/src/services/device-resource-metrics.d.ts.map +1 -0
  167. package/src/services/device-resource-metrics.test.ts +98 -0
  168. package/src/services/device-resource-metrics.ts +346 -0
  169. package/src/services/device-tier.d.ts +115 -0
  170. package/src/services/device-tier.d.ts.map +1 -0
  171. package/src/services/device-tier.test.ts +371 -0
  172. package/src/services/device-tier.ts +410 -0
  173. package/src/services/downloader.d.ts +82 -0
  174. package/src/services/downloader.d.ts.map +1 -0
  175. package/src/services/downloader.test.ts +747 -0
  176. package/src/services/downloader.ts +925 -0
  177. package/src/services/engine-direct-bundle.test.ts +58 -0
  178. package/src/services/engine-streaming.test.ts +80 -0
  179. package/src/services/engine.d.ts +540 -0
  180. package/src/services/engine.d.ts.map +1 -0
  181. package/src/services/engine.ts +1909 -0
  182. package/src/services/ensure-local-artifacts.integration.test.ts +273 -0
  183. package/src/services/ensure-local-artifacts.test.ts +368 -0
  184. package/src/services/ensure-local-artifacts.ts +351 -0
  185. package/src/services/external-scanner.d.ts +17 -0
  186. package/src/services/external-scanner.d.ts.map +1 -0
  187. package/src/services/external-scanner.ts +312 -0
  188. package/src/services/ffi-llm-mock.ts +354 -0
  189. package/src/services/ffi-llm-streaming-abi.ts +442 -0
  190. package/src/services/ffi-streaming-backend.d.ts +180 -0
  191. package/src/services/ffi-streaming-backend.d.ts.map +1 -0
  192. package/src/services/ffi-streaming-backend.ts +382 -0
  193. package/src/services/ffi-streaming-runner.d.ts +122 -0
  194. package/src/services/ffi-streaming-runner.d.ts.map +1 -0
  195. package/src/services/ffi-streaming-runner.test.ts +60 -0
  196. package/src/services/ffi-streaming-runner.ts +354 -0
  197. package/src/services/ffi-unload-ordering.test.ts +162 -0
  198. package/src/services/gpu-autotune.ts +534 -0
  199. package/src/services/gpu-detect.d.ts +56 -0
  200. package/src/services/gpu-detect.d.ts.map +1 -0
  201. package/src/services/gpu-detect.ts +139 -0
  202. package/src/services/handler-registry.d.ts +72 -0
  203. package/src/services/handler-registry.d.ts.map +1 -0
  204. package/src/services/handler-registry.ts +240 -0
  205. package/src/services/hardware.d.ts +63 -0
  206. package/src/services/hardware.d.ts.map +1 -0
  207. package/src/services/hardware.test.ts +231 -0
  208. package/src/services/hardware.ts +410 -0
  209. package/src/services/hf-search.d.ts +26 -0
  210. package/src/services/hf-search.d.ts.map +1 -0
  211. package/src/services/hf-search.test.ts +69 -0
  212. package/src/services/hf-search.ts +420 -0
  213. package/src/services/image-description-runtime.d.ts +14 -0
  214. package/src/services/image-description-runtime.d.ts.map +1 -0
  215. package/src/services/image-description-runtime.test.ts +61 -0
  216. package/src/services/image-description-runtime.ts +118 -0
  217. package/src/services/imagegen/aosp-unavailable.d.ts +134 -0
  218. package/src/services/imagegen/aosp-unavailable.d.ts.map +1 -0
  219. package/src/services/imagegen/aosp-unavailable.ts +229 -0
  220. package/src/services/imagegen/backend-selector.d.ts +118 -0
  221. package/src/services/imagegen/backend-selector.d.ts.map +1 -0
  222. package/src/services/imagegen/backend-selector.ts +277 -0
  223. package/src/services/imagegen/coreml-unavailable.d.ts +105 -0
  224. package/src/services/imagegen/coreml-unavailable.d.ts.map +1 -0
  225. package/src/services/imagegen/coreml-unavailable.ts +237 -0
  226. package/src/services/imagegen/errors.d.ts +16 -0
  227. package/src/services/imagegen/errors.d.ts.map +1 -0
  228. package/src/services/imagegen/errors.ts +40 -0
  229. package/src/services/imagegen/index.d.ts +58 -0
  230. package/src/services/imagegen/index.d.ts.map +1 -0
  231. package/src/services/imagegen/index.ts +144 -0
  232. package/src/services/imagegen/mflux.d.ts +74 -0
  233. package/src/services/imagegen/mflux.d.ts.map +1 -0
  234. package/src/services/imagegen/mflux.ts +313 -0
  235. package/src/services/imagegen/sd-cpp.d.ts +180 -0
  236. package/src/services/imagegen/sd-cpp.d.ts.map +1 -0
  237. package/src/services/imagegen/sd-cpp.ts +718 -0
  238. package/src/services/imagegen/tensorrt-unavailable.d.ts +83 -0
  239. package/src/services/imagegen/tensorrt-unavailable.d.ts.map +1 -0
  240. package/src/services/imagegen/tensorrt-unavailable.ts +295 -0
  241. package/src/services/imagegen/types.d.ts +181 -0
  242. package/src/services/imagegen/types.d.ts.map +1 -0
  243. package/src/services/imagegen/types.ts +193 -0
  244. package/src/services/index.d.ts +29 -0
  245. package/src/services/index.d.ts.map +1 -0
  246. package/src/services/index.ts +211 -0
  247. package/src/services/inference-capabilities.d.ts +132 -0
  248. package/src/services/inference-capabilities.d.ts.map +1 -0
  249. package/src/services/inference-capabilities.test.ts +75 -0
  250. package/src/services/inference-capabilities.ts +204 -0
  251. package/src/services/inference-telemetry.d.ts +59 -0
  252. package/src/services/inference-telemetry.d.ts.map +1 -0
  253. package/src/services/inference-telemetry.ts +143 -0
  254. package/src/services/ios-llama-streaming.ts +248 -0
  255. package/src/services/kv-spill.d.ts +189 -0
  256. package/src/services/kv-spill.d.ts.map +1 -0
  257. package/src/services/kv-spill.test.ts +222 -0
  258. package/src/services/kv-spill.ts +356 -0
  259. package/src/services/latency-trace.d.ts +346 -0
  260. package/src/services/latency-trace.d.ts.map +1 -0
  261. package/src/services/latency-trace.test.ts +266 -0
  262. package/src/services/latency-trace.ts +844 -0
  263. package/src/services/llama-server-metrics.ts +304 -0
  264. package/src/services/llm-streaming-binding.d.ts +96 -0
  265. package/src/services/llm-streaming-binding.d.ts.map +1 -0
  266. package/src/services/llm-streaming-binding.ts +136 -0
  267. package/src/services/load-args.d.ts +82 -0
  268. package/src/services/load-args.d.ts.map +1 -0
  269. package/src/services/load-args.ts +81 -0
  270. package/src/services/manifest/eliza-1.manifest.v1.json +708 -0
  271. package/src/services/manifest/index.d.ts +4 -0
  272. package/src/services/manifest/index.d.ts.map +1 -0
  273. package/src/services/manifest/index.ts +66 -0
  274. package/src/services/manifest/manifest.test.ts +689 -0
  275. package/src/services/manifest/schema.d.ts +713 -0
  276. package/src/services/manifest/schema.d.ts.map +1 -0
  277. package/src/services/manifest/schema.ts +653 -0
  278. package/src/services/manifest/types.d.ts +30 -0
  279. package/src/services/manifest/types.d.ts.map +1 -0
  280. package/src/services/manifest/types.ts +55 -0
  281. package/src/services/manifest/validator.d.ts +66 -0
  282. package/src/services/manifest/validator.d.ts.map +1 -0
  283. package/src/services/manifest/validator.ts +567 -0
  284. package/src/services/memory-arbiter.d.ts +318 -0
  285. package/src/services/memory-arbiter.d.ts.map +1 -0
  286. package/src/services/memory-arbiter.test.ts +419 -0
  287. package/src/services/memory-arbiter.ts +925 -0
  288. package/src/services/memory-monitor.d.ts +122 -0
  289. package/src/services/memory-monitor.d.ts.map +1 -0
  290. package/src/services/memory-monitor.test.ts +208 -0
  291. package/src/services/memory-monitor.ts +297 -0
  292. package/src/services/memory-pressure.d.ts +130 -0
  293. package/src/services/memory-pressure.d.ts.map +1 -0
  294. package/src/services/memory-pressure.ts +414 -0
  295. package/src/services/mtp-doctor.d.ts +13 -0
  296. package/src/services/mtp-doctor.d.ts.map +1 -0
  297. package/src/services/mtp-doctor.ts +78 -0
  298. package/src/services/network-policy.d.ts +127 -0
  299. package/src/services/network-policy.d.ts.map +1 -0
  300. package/src/services/network-policy.ts +346 -0
  301. package/src/services/paths.d.ts +6 -0
  302. package/src/services/paths.d.ts.map +1 -0
  303. package/src/services/paths.ts +25 -0
  304. package/src/services/planner-skeleton.d.ts +124 -0
  305. package/src/services/planner-skeleton.d.ts.map +1 -0
  306. package/src/services/planner-skeleton.ts +175 -0
  307. package/src/services/providers.d.ts +38 -0
  308. package/src/services/providers.d.ts.map +1 -0
  309. package/src/services/providers.ts +507 -0
  310. package/src/services/ram-budget-cache.test.ts +163 -0
  311. package/src/services/ram-budget.d.ts +110 -0
  312. package/src/services/ram-budget.d.ts.map +1 -0
  313. package/src/services/ram-budget.ts +0 -0
  314. package/src/services/readiness.d.ts +9 -0
  315. package/src/services/readiness.d.ts.map +1 -0
  316. package/src/services/readiness.test.ts +87 -0
  317. package/src/services/readiness.ts +238 -0
  318. package/src/services/recommendation.d.ts +111 -0
  319. package/src/services/recommendation.d.ts.map +1 -0
  320. package/src/services/recommendation.ts +671 -0
  321. package/src/services/registry.d.ts +35 -0
  322. package/src/services/registry.d.ts.map +1 -0
  323. package/src/services/registry.ts +151 -0
  324. package/src/services/router-handler.d.ts +92 -0
  325. package/src/services/router-handler.d.ts.map +1 -0
  326. package/src/services/router-handler.test.ts +45 -0
  327. package/src/services/router-handler.ts +407 -0
  328. package/src/services/routing-policy.d.ts +69 -0
  329. package/src/services/routing-policy.d.ts.map +1 -0
  330. package/src/services/routing-policy.test.ts +164 -0
  331. package/src/services/routing-policy.ts +297 -0
  332. package/src/services/routing-preferences.d.ts +8 -0
  333. package/src/services/routing-preferences.d.ts.map +1 -0
  334. package/src/services/routing-preferences.ts +17 -0
  335. package/src/services/runtime-target.d.ts +98 -0
  336. package/src/services/runtime-target.d.ts.map +1 -0
  337. package/src/services/runtime-target.ts +154 -0
  338. package/src/services/service.d.ts +128 -0
  339. package/src/services/service.d.ts.map +1 -0
  340. package/src/services/service.test.ts +223 -0
  341. package/src/services/service.ts +735 -0
  342. package/src/services/session-pool.d.ts +72 -0
  343. package/src/services/session-pool.d.ts.map +1 -0
  344. package/src/services/session-pool.ts +153 -0
  345. package/src/services/structured-output/deterministic-repair.d.ts +23 -0
  346. package/src/services/structured-output/deterministic-repair.d.ts.map +1 -0
  347. package/src/services/structured-output/deterministic-repair.test.ts +169 -0
  348. package/src/services/structured-output/deterministic-repair.ts +443 -0
  349. package/src/services/structured-output/index.ts +4 -0
  350. package/src/services/structured-output.d.ts +311 -0
  351. package/src/services/structured-output.d.ts.map +1 -0
  352. package/src/services/structured-output.test.ts +483 -0
  353. package/src/services/structured-output.ts +712 -0
  354. package/src/services/system-memory.d.ts +33 -0
  355. package/src/services/system-memory.d.ts.map +1 -0
  356. package/src/services/system-memory.test.ts +47 -0
  357. package/src/services/system-memory.ts +67 -0
  358. package/src/services/transcription-priority.test.ts +211 -0
  359. package/src/services/types.d.ts +19 -0
  360. package/src/services/types.d.ts.map +1 -0
  361. package/src/services/types.ts +55 -0
  362. package/src/services/verify-on-device.d.ts +34 -0
  363. package/src/services/verify-on-device.d.ts.map +1 -0
  364. package/src/services/verify-on-device.test.ts +87 -0
  365. package/src/services/verify-on-device.ts +127 -0
  366. package/src/services/verify.d.ts +8 -0
  367. package/src/services/verify.d.ts.map +1 -0
  368. package/src/services/verify.ts +13 -0
  369. package/src/services/vision/aosp-unavailable.d.ts +115 -0
  370. package/src/services/vision/aosp-unavailable.d.ts.map +1 -0
  371. package/src/services/vision/aosp-unavailable.ts +163 -0
  372. package/src/services/vision/capacitor-llama.d.ts +99 -0
  373. package/src/services/vision/capacitor-llama.d.ts.map +1 -0
  374. package/src/services/vision/capacitor-llama.ts +255 -0
  375. package/src/services/vision/cloud-fallback.d.ts +47 -0
  376. package/src/services/vision/cloud-fallback.d.ts.map +1 -0
  377. package/src/services/vision/cloud-fallback.test.ts +243 -0
  378. package/src/services/vision/cloud-fallback.ts +268 -0
  379. package/src/services/vision/fallback-chain.test.ts +86 -0
  380. package/src/services/vision/hash.d.ts +71 -0
  381. package/src/services/vision/hash.d.ts.map +1 -0
  382. package/src/services/vision/hash.ts +157 -0
  383. package/src/services/vision/index.d.ts +95 -0
  384. package/src/services/vision/index.d.ts.map +1 -0
  385. package/src/services/vision/index.ts +251 -0
  386. package/src/services/vision/llama-server.d.ts +73 -0
  387. package/src/services/vision/llama-server.d.ts.map +1 -0
  388. package/src/services/vision/llama-server.ts +177 -0
  389. package/src/services/vision/types.d.ts +153 -0
  390. package/src/services/vision/types.d.ts.map +1 -0
  391. package/src/services/vision/types.ts +154 -0
  392. package/src/services/vision/vast-fallback.d.ts +18 -0
  393. package/src/services/vision/vast-fallback.d.ts.map +1 -0
  394. package/src/services/vision/vast-fallback.ts +127 -0
  395. package/src/services/vision-embedding-cache.d.ts +98 -0
  396. package/src/services/vision-embedding-cache.d.ts.map +1 -0
  397. package/src/services/vision-embedding-cache.ts +189 -0
  398. package/src/services/voice/VOICE_WORKBENCH.md +88 -0
  399. package/src/services/voice/__test-helpers__/fake-ffi.ts +94 -0
  400. package/src/services/voice/__test-helpers__/synthetic-speech.ts +124 -0
  401. package/src/services/voice/__tests__/checkpoint-manager.test.ts +241 -0
  402. package/src/services/voice/__tests__/checkpoint-policy.test.ts +270 -0
  403. package/src/services/voice/__tests__/eager-context-builder.test.ts +257 -0
  404. package/src/services/voice/__tests__/eliza1-eot-scorer.test.ts +288 -0
  405. package/src/services/voice/__tests__/eot-classifier.test.ts +431 -0
  406. package/src/services/voice/__tests__/optimistic-rollback.test.ts +312 -0
  407. package/src/services/voice/__tests__/prefill-client.test.ts +266 -0
  408. package/src/services/voice/__tests__/prefix-preserving-queue.test.ts +208 -0
  409. package/src/services/voice/__tests__/streaming-asr.test.ts +450 -0
  410. package/src/services/voice/__tests__/streaming-transcriber.test.ts +339 -0
  411. package/src/services/voice/__tests__/turn-detector-resolver.test.ts +195 -0
  412. package/src/services/voice/__tests__/voice-state-machine-prefill.test.ts +275 -0
  413. package/src/services/voice/__tests__/voice-state-machine.test.ts +354 -0
  414. package/src/services/voice/asr-timed.real.test.ts +141 -0
  415. package/src/services/voice/audio-frame-consumer.d.ts +212 -0
  416. package/src/services/voice/audio-frame-consumer.d.ts.map +1 -0
  417. package/src/services/voice/audio-frame-consumer.test.ts +343 -0
  418. package/src/services/voice/audio-frame-consumer.ts +491 -0
  419. package/src/services/voice/barge-in.d.ts +112 -0
  420. package/src/services/voice/barge-in.d.ts.map +1 -0
  421. package/src/services/voice/barge-in.test.ts +244 -0
  422. package/src/services/voice/barge-in.ts +336 -0
  423. package/src/services/voice/cancellation-coordinator.d.ts +127 -0
  424. package/src/services/voice/cancellation-coordinator.d.ts.map +1 -0
  425. package/src/services/voice/cancellation-coordinator.test.ts +196 -0
  426. package/src/services/voice/cancellation-coordinator.ts +269 -0
  427. package/src/services/voice/checkpoint-manager.d.ts +199 -0
  428. package/src/services/voice/checkpoint-manager.d.ts.map +1 -0
  429. package/src/services/voice/checkpoint-manager.ts +401 -0
  430. package/src/services/voice/checkpoint-policy.ts +336 -0
  431. package/src/services/voice/composite-eot-classifier.test.ts +59 -0
  432. package/src/services/voice/e2e-harness.test.ts +182 -0
  433. package/src/services/voice/e2e-harness.ts +743 -0
  434. package/src/services/voice/eager-context-builder.d.ts +170 -0
  435. package/src/services/voice/eager-context-builder.d.ts.map +1 -0
  436. package/src/services/voice/eager-context-builder.ts +262 -0
  437. package/src/services/voice/eliza1-eot-scorer.d.ts +124 -0
  438. package/src/services/voice/eliza1-eot-scorer.d.ts.map +1 -0
  439. package/src/services/voice/eliza1-eot-scorer.ts +242 -0
  440. package/src/services/voice/embedding-server.ts +200 -0
  441. package/src/services/voice/embedding.d.ts +133 -0
  442. package/src/services/voice/embedding.d.ts.map +1 -0
  443. package/src/services/voice/embedding.test.ts +131 -0
  444. package/src/services/voice/embedding.ts +243 -0
  445. package/src/services/voice/emotion-attribution.d.ts +68 -0
  446. package/src/services/voice/emotion-attribution.d.ts.map +1 -0
  447. package/src/services/voice/emotion-attribution.test.ts +129 -0
  448. package/src/services/voice/emotion-attribution.ts +361 -0
  449. package/src/services/voice/engine-bridge-cancellation.test.ts +422 -0
  450. package/src/services/voice/engine-bridge.d.ts +759 -0
  451. package/src/services/voice/engine-bridge.d.ts.map +1 -0
  452. package/src/services/voice/engine-bridge.test.ts +384 -0
  453. package/src/services/voice/engine-bridge.ts +2302 -0
  454. package/src/services/voice/eot-classifier-ggml.d.ts +179 -0
  455. package/src/services/voice/eot-classifier-ggml.d.ts.map +1 -0
  456. package/src/services/voice/eot-classifier-ggml.ts +566 -0
  457. package/src/services/voice/eot-classifier.d.ts +214 -0
  458. package/src/services/voice/eot-classifier.d.ts.map +1 -0
  459. package/src/services/voice/eot-classifier.ts +533 -0
  460. package/src/services/voice/errors.d.ts +20 -0
  461. package/src/services/voice/errors.d.ts.map +1 -0
  462. package/src/services/voice/errors.ts +32 -0
  463. package/src/services/voice/expressive-tags.d.ts +158 -0
  464. package/src/services/voice/expressive-tags.d.ts.map +1 -0
  465. package/src/services/voice/expressive-tags.ts +405 -0
  466. package/src/services/voice/ffi-bindings.d.ts +674 -0
  467. package/src/services/voice/ffi-bindings.d.ts.map +1 -0
  468. package/src/services/voice/ffi-bindings.test.ts +728 -0
  469. package/src/services/voice/ffi-bindings.ts +3225 -0
  470. package/src/services/voice/first-line-cache.d.ts +181 -0
  471. package/src/services/voice/first-line-cache.d.ts.map +1 -0
  472. package/src/services/voice/first-line-cache.ts +725 -0
  473. package/src/services/voice/fused-eot-scorer.d.ts +51 -0
  474. package/src/services/voice/fused-eot-scorer.d.ts.map +1 -0
  475. package/src/services/voice/fused-eot-scorer.ts +135 -0
  476. package/src/services/voice/index.d.ts +91 -0
  477. package/src/services/voice/index.d.ts.map +1 -0
  478. package/src/services/voice/index.ts +481 -0
  479. package/src/services/voice/kokoro/__tests__/kokoro-backend.test.ts +151 -0
  480. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.real.test.ts +151 -0
  481. package/src/services/voice/kokoro/__tests__/kokoro-engine-bridge.test.ts +60 -0
  482. package/src/services/voice/kokoro/__tests__/kokoro-engine-discovery.test.ts +277 -0
  483. package/src/services/voice/kokoro/__tests__/kokoro-ffi-runtime.test.ts +235 -0
  484. package/src/services/voice/kokoro/__tests__/kokoro-runtime.test.ts +95 -0
  485. package/src/services/voice/kokoro/__tests__/phonemizer.test.ts +53 -0
  486. package/src/services/voice/kokoro/__tests__/runtime-selection.test.ts +231 -0
  487. package/src/services/voice/kokoro/__tests__/voices.test.ts +57 -0
  488. package/src/services/voice/kokoro/index.ts +79 -0
  489. package/src/services/voice/kokoro/kokoro-backend.d.ts +72 -0
  490. package/src/services/voice/kokoro/kokoro-backend.d.ts.map +1 -0
  491. package/src/services/voice/kokoro/kokoro-backend.ts +207 -0
  492. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts +58 -0
  493. package/src/services/voice/kokoro/kokoro-engine-discovery.d.ts.map +1 -0
  494. package/src/services/voice/kokoro/kokoro-engine-discovery.ts +177 -0
  495. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts +75 -0
  496. package/src/services/voice/kokoro/kokoro-ffi-runtime.d.ts.map +1 -0
  497. package/src/services/voice/kokoro/kokoro-ffi-runtime.ts +233 -0
  498. package/src/services/voice/kokoro/kokoro-runtime.d.ts +100 -0
  499. package/src/services/voice/kokoro/kokoro-runtime.d.ts.map +1 -0
  500. package/src/services/voice/kokoro/kokoro-runtime.ts +170 -0
  501. package/src/services/voice/kokoro/phoneme-stream.ts +123 -0
  502. package/src/services/voice/kokoro/phonemizer.d.ts +50 -0
  503. package/src/services/voice/kokoro/phonemizer.d.ts.map +1 -0
  504. package/src/services/voice/kokoro/phonemizer.ts +344 -0
  505. package/src/services/voice/kokoro/pick-runtime.d.ts +61 -0
  506. package/src/services/voice/kokoro/pick-runtime.d.ts.map +1 -0
  507. package/src/services/voice/kokoro/pick-runtime.test.ts +91 -0
  508. package/src/services/voice/kokoro/pick-runtime.ts +130 -0
  509. package/src/services/voice/kokoro/runtime-selection.d.ts +92 -0
  510. package/src/services/voice/kokoro/runtime-selection.d.ts.map +1 -0
  511. package/src/services/voice/kokoro/runtime-selection.ts +237 -0
  512. package/src/services/voice/kokoro/types.d.ts +82 -0
  513. package/src/services/voice/kokoro/types.d.ts.map +1 -0
  514. package/src/services/voice/kokoro/types.ts +95 -0
  515. package/src/services/voice/kokoro/voice-presets.d.ts +23 -0
  516. package/src/services/voice/kokoro/voice-presets.d.ts.map +1 -0
  517. package/src/services/voice/kokoro/voice-presets.ts +129 -0
  518. package/src/services/voice/kokoro/voices.d.ts +30 -0
  519. package/src/services/voice/kokoro/voices.d.ts.map +1 -0
  520. package/src/services/voice/kokoro/voices.ts +64 -0
  521. package/src/services/voice/lifecycle.d.ts +135 -0
  522. package/src/services/voice/lifecycle.d.ts.map +1 -0
  523. package/src/services/voice/lifecycle.test.ts +315 -0
  524. package/src/services/voice/lifecycle.ts +301 -0
  525. package/src/services/voice/live-diarization-session.d.ts +96 -0
  526. package/src/services/voice/live-diarization-session.d.ts.map +1 -0
  527. package/src/services/voice/live-diarization-session.ts +289 -0
  528. package/src/services/voice/mic-source.d.ts +136 -0
  529. package/src/services/voice/mic-source.d.ts.map +1 -0
  530. package/src/services/voice/mic-source.test.ts +210 -0
  531. package/src/services/voice/mic-source.ts +503 -0
  532. package/src/services/voice/optimistic-policy.d.ts +109 -0
  533. package/src/services/voice/optimistic-policy.d.ts.map +1 -0
  534. package/src/services/voice/optimistic-policy.test.ts +101 -0
  535. package/src/services/voice/optimistic-policy.ts +192 -0
  536. package/src/services/voice/optimistic-rollback.ts +343 -0
  537. package/src/services/voice/partial-stabilizer.d.ts +73 -0
  538. package/src/services/voice/partial-stabilizer.d.ts.map +1 -0
  539. package/src/services/voice/partial-stabilizer.test.ts +68 -0
  540. package/src/services/voice/partial-stabilizer.ts +140 -0
  541. package/src/services/voice/phoneme-tokenizer.d.ts +49 -0
  542. package/src/services/voice/phoneme-tokenizer.d.ts.map +1 -0
  543. package/src/services/voice/phoneme-tokenizer.ts +158 -0
  544. package/src/services/voice/phrase-cache.d.ts +76 -0
  545. package/src/services/voice/phrase-cache.d.ts.map +1 -0
  546. package/src/services/voice/phrase-cache.test.ts +242 -0
  547. package/src/services/voice/phrase-cache.ts +186 -0
  548. package/src/services/voice/phrase-chunker.d.ts +62 -0
  549. package/src/services/voice/phrase-chunker.d.ts.map +1 -0
  550. package/src/services/voice/phrase-chunker.test.ts +239 -0
  551. package/src/services/voice/phrase-chunker.ts +281 -0
  552. package/src/services/voice/pipeline-impls.d.ts +151 -0
  553. package/src/services/voice/pipeline-impls.d.ts.map +1 -0
  554. package/src/services/voice/pipeline-impls.l6.test.ts +110 -0
  555. package/src/services/voice/pipeline-impls.test.ts +292 -0
  556. package/src/services/voice/pipeline-impls.ts +315 -0
  557. package/src/services/voice/pipeline.d.ts +216 -0
  558. package/src/services/voice/pipeline.d.ts.map +1 -0
  559. package/src/services/voice/pipeline.ts +505 -0
  560. package/src/services/voice/prefill-client.d.ts +123 -0
  561. package/src/services/voice/prefill-client.d.ts.map +1 -0
  562. package/src/services/voice/prefill-client.ts +316 -0
  563. package/src/services/voice/prefix-preserving-queue.d.ts +113 -0
  564. package/src/services/voice/prefix-preserving-queue.d.ts.map +1 -0
  565. package/src/services/voice/prefix-preserving-queue.ts +162 -0
  566. package/src/services/voice/profile-store.d.ts +248 -0
  567. package/src/services/voice/profile-store.d.ts.map +1 -0
  568. package/src/services/voice/profile-store.ts +887 -0
  569. package/src/services/voice/real-audio-decode.test.ts +148 -0
  570. package/src/services/voice/ring-buffer.d.ts +40 -0
  571. package/src/services/voice/ring-buffer.d.ts.map +1 -0
  572. package/src/services/voice/ring-buffer.test.ts +129 -0
  573. package/src/services/voice/ring-buffer.ts +123 -0
  574. package/src/services/voice/rollback-queue.d.ts +24 -0
  575. package/src/services/voice/rollback-queue.d.ts.map +1 -0
  576. package/src/services/voice/rollback-queue.ts +74 -0
  577. package/src/services/voice/samantha-preset-placeholder.d.ts +67 -0
  578. package/src/services/voice/samantha-preset-placeholder.d.ts.map +1 -0
  579. package/src/services/voice/samantha-preset-placeholder.test.ts +97 -0
  580. package/src/services/voice/samantha-preset-placeholder.ts +148 -0
  581. package/src/services/voice/samantha-preset-regenerator.d.ts +87 -0
  582. package/src/services/voice/samantha-preset-regenerator.d.ts.map +1 -0
  583. package/src/services/voice/samantha-preset-regenerator.ts +393 -0
  584. package/src/services/voice/scheduler.d.ts +146 -0
  585. package/src/services/voice/scheduler.d.ts.map +1 -0
  586. package/src/services/voice/scheduler.t2.test.ts +141 -0
  587. package/src/services/voice/scheduler.ts +927 -0
  588. package/src/services/voice/shared-resources.d.ts +190 -0
  589. package/src/services/voice/shared-resources.d.ts.map +1 -0
  590. package/src/services/voice/shared-resources.ts +320 -0
  591. package/src/services/voice/speaker/attribution-pipeline.d.ts +74 -0
  592. package/src/services/voice/speaker/attribution-pipeline.d.ts.map +1 -0
  593. package/src/services/voice/speaker/attribution-pipeline.ts +386 -0
  594. package/src/services/voice/speaker/diarizer-fused.d.ts +59 -0
  595. package/src/services/voice/speaker/diarizer-fused.d.ts.map +1 -0
  596. package/src/services/voice/speaker/diarizer-fused.real.test.ts +100 -0
  597. package/src/services/voice/speaker/diarizer-fused.ts +154 -0
  598. package/src/services/voice/speaker/diarizer.d.ts +75 -0
  599. package/src/services/voice/speaker/diarizer.d.ts.map +1 -0
  600. package/src/services/voice/speaker/diarizer.ts +218 -0
  601. package/src/services/voice/speaker/encoder-fused.d.ts +60 -0
  602. package/src/services/voice/speaker/encoder-fused.d.ts.map +1 -0
  603. package/src/services/voice/speaker/encoder-fused.real.test.ts +113 -0
  604. package/src/services/voice/speaker/encoder-fused.ts +138 -0
  605. package/src/services/voice/speaker/encoder-ggml.d.ts +33 -0
  606. package/src/services/voice/speaker/encoder-ggml.d.ts.map +1 -0
  607. package/src/services/voice/speaker/encoder-ggml.ts +79 -0
  608. package/src/services/voice/speaker/encoder.d.ts +37 -0
  609. package/src/services/voice/speaker/encoder.d.ts.map +1 -0
  610. package/src/services/voice/speaker/encoder.ts +105 -0
  611. package/src/services/voice/speaker-imprint.d.ts +83 -0
  612. package/src/services/voice/speaker-imprint.d.ts.map +1 -0
  613. package/src/services/voice/speaker-imprint.test.ts +185 -0
  614. package/src/services/voice/speaker-imprint.ts +312 -0
  615. package/src/services/voice/speaker-preset-cache.d.ts +77 -0
  616. package/src/services/voice/speaker-preset-cache.d.ts.map +1 -0
  617. package/src/services/voice/speaker-preset-cache.test.ts +154 -0
  618. package/src/services/voice/speaker-preset-cache.ts +195 -0
  619. package/src/services/voice/streaming-asr/streaming-pipeline-adapter.ts +292 -0
  620. package/src/services/voice/system-audio-sink.d.ts +73 -0
  621. package/src/services/voice/system-audio-sink.d.ts.map +1 -0
  622. package/src/services/voice/system-audio-sink.test.ts +29 -0
  623. package/src/services/voice/system-audio-sink.ts +366 -0
  624. package/src/services/voice/transcriber.d.ts +244 -0
  625. package/src/services/voice/transcriber.d.ts.map +1 -0
  626. package/src/services/voice/transcriber.test.ts +392 -0
  627. package/src/services/voice/transcriber.ts +704 -0
  628. package/src/services/voice/transcript-knowledge.d.ts +37 -0
  629. package/src/services/voice/transcript-knowledge.d.ts.map +1 -0
  630. package/src/services/voice/transcript-knowledge.test.ts +68 -0
  631. package/src/services/voice/transcript-knowledge.ts +75 -0
  632. package/src/services/voice/transcript-service.d.ts +41 -0
  633. package/src/services/voice/transcript-service.d.ts.map +1 -0
  634. package/src/services/voice/transcript-service.test.ts +137 -0
  635. package/src/services/voice/transcript-service.ts +141 -0
  636. package/src/services/voice/transcript-store.d.ts +53 -0
  637. package/src/services/voice/transcript-store.d.ts.map +1 -0
  638. package/src/services/voice/transcript-store.test.ts +153 -0
  639. package/src/services/voice/transcript-store.ts +132 -0
  640. package/src/services/voice/turn-controller.d.ts +183 -0
  641. package/src/services/voice/turn-controller.d.ts.map +1 -0
  642. package/src/services/voice/turn-controller.test.ts +575 -0
  643. package/src/services/voice/turn-controller.ts +596 -0
  644. package/src/services/voice/types.d.ts +643 -0
  645. package/src/services/voice/types.d.ts.map +1 -0
  646. package/src/services/voice/types.ts +699 -0
  647. package/src/services/voice/vad.d.ts +282 -0
  648. package/src/services/voice/vad.d.ts.map +1 -0
  649. package/src/services/voice/vad.test.ts +480 -0
  650. package/src/services/voice/vad.ts +827 -0
  651. package/src/services/voice/vad.v1-v4.test.ts +222 -0
  652. package/src/services/voice/voice-budget.d.ts +241 -0
  653. package/src/services/voice/voice-budget.d.ts.map +1 -0
  654. package/src/services/voice/voice-budget.test.ts +418 -0
  655. package/src/services/voice/voice-budget.ts +635 -0
  656. package/src/services/voice/voice-duet.test.ts +375 -0
  657. package/src/services/voice/voice-emotion-classifier.d.ts +95 -0
  658. package/src/services/voice/voice-emotion-classifier.d.ts.map +1 -0
  659. package/src/services/voice/voice-emotion-classifier.test.ts +210 -0
  660. package/src/services/voice/voice-emotion-classifier.ts +273 -0
  661. package/src/services/voice/voice-preset-format.d.ts +158 -0
  662. package/src/services/voice/voice-preset-format.d.ts.map +1 -0
  663. package/src/services/voice/voice-preset-format.ts +700 -0
  664. package/src/services/voice/voice-preset-generator.test.ts +89 -0
  665. package/src/services/voice/voice-profile-artifact.d.ts +116 -0
  666. package/src/services/voice/voice-profile-artifact.d.ts.map +1 -0
  667. package/src/services/voice/voice-profile-artifact.test.ts +138 -0
  668. package/src/services/voice/voice-profile-artifact.ts +518 -0
  669. package/src/services/voice/voice-profile-routes.d.ts +83 -0
  670. package/src/services/voice/voice-profile-routes.d.ts.map +1 -0
  671. package/src/services/voice/voice-profile-routes.test.ts +429 -0
  672. package/src/services/voice/voice-profile-routes.ts +425 -0
  673. package/src/services/voice/voice-scenario.ts +154 -0
  674. package/src/services/voice/voice-settings.d.ts +82 -0
  675. package/src/services/voice/voice-settings.d.ts.map +1 -0
  676. package/src/services/voice/voice-settings.ts +172 -0
  677. package/src/services/voice/voice-state-machine.d.ts +364 -0
  678. package/src/services/voice/voice-state-machine.d.ts.map +1 -0
  679. package/src/services/voice/voice-state-machine.ts +727 -0
  680. package/src/services/voice/voice-workbench-report.test.ts +168 -0
  681. package/src/services/voice/voice-workbench-report.ts +326 -0
  682. package/src/services/voice/voice-workbench.test.ts +158 -0
  683. package/src/services/voice/voice.test.ts +1070 -0
  684. package/src/services/voice/wake-word-ggml.d.ts +101 -0
  685. package/src/services/voice/wake-word-ggml.d.ts.map +1 -0
  686. package/src/services/voice/wake-word-ggml.ts +320 -0
  687. package/src/services/voice/wake-word.d.ts +255 -0
  688. package/src/services/voice/wake-word.d.ts.map +1 -0
  689. package/src/services/voice/wake-word.test.ts +298 -0
  690. package/src/services/voice/wake-word.ts +554 -0
  691. package/src/services/voice/wrap-with-first-line-cache.d.ts +70 -0
  692. package/src/services/voice/wrap-with-first-line-cache.d.ts.map +1 -0
  693. package/src/services/voice/wrap-with-first-line-cache.ts +267 -0
  694. package/src/services/voice-model-updater.d.ts +240 -0
  695. package/src/services/voice-model-updater.d.ts.map +1 -0
  696. package/src/services/voice-model-updater.ts +724 -0
  697. package/src/services/voice-prewarm.d.ts +3 -0
  698. package/src/services/voice-prewarm.d.ts.map +1 -0
  699. package/src/services/voice-prewarm.ts +51 -0
  700. package/dist/index.d.ts +0 -37
  701. package/dist/index.js +0 -1098
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Image-gen backend-pick logic (WS3).
3
+ *
4
+ * Given a runtime platform + accelerator hint, return the ordered list
5
+ * of backend ids to try. The arbiter walks this list at load time and
6
+ * stops at the first backend that resolves to a live handle. A backend
7
+ * that throws `ImageGenBackendUnavailableError` lets the selector fall
8
+ * through to the next.
9
+ *
10
+ * Per-platform policy:
11
+ *
12
+ * - **macOS Apple Silicon**: `mflux` (MLX) → `sd-cpp` (CPU fallback).
13
+ * mflux is Metal-accelerated through MLX; sd-cpp-CPU is the
14
+ * functional last-resort if the venv isn't installed.
15
+ * - **macOS Intel**: `sd-cpp` (Metal/CPU). MLX requires Apple Silicon;
16
+ * mflux is skipped on Intel Macs.
17
+ * - **iOS**: `coreml` only. There is no sd-cpp on iOS — Core ML is
18
+ * the only sanctioned acceleration path.
19
+ * - **Linux + NVIDIA**: `sd-cpp` CUDA only when the sd-cpp probe,
20
+ * binary manifest, help, or version output proves CUDA support.
21
+ * Otherwise use `sd-cpp` CPU and let the loader emit an explicit
22
+ * CUDA-missing fallback error if CUDA was requested elsewhere.
23
+ * - **Linux + AMD/Intel**: `sd-cpp --vulkan` → `sd-cpp` (CPU fallback).
24
+ * - **Linux + CPU**: `sd-cpp` (CPU).
25
+ * - **Windows + NVIDIA**: `tensorrt` → `sd-cpp` (CUDA) → `sd-cpp` (CPU).
26
+ * - **Windows + AMD/Intel**: `sd-cpp --vulkan` → `sd-cpp` (CPU).
27
+ * - **Android (AOSP)**: `aosp` (libeliza-llama-shim with Vulkan/OpenCL,
28
+ * handled by `plugin-aosp-local-inference`). No second backend on
29
+ * mobile — falling back to CPU sd-cpp on a phone is too slow to be
30
+ * useful and would just block the UI.
31
+ *
32
+ * The selector intentionally does NOT account for tier or model
33
+ * compatibility — that's the catalog's job. A 27B-tier user on a
34
+ * Vulkan-only Linux box doesn't change the selector; it just changes
35
+ * which model the chosen backend loads.
36
+ */
37
+
38
+ import type { ImageGenBackend } from "./types";
39
+
40
+ /** Per-platform runtime fingerprint the selector consumes. */
41
+ export interface ImageGenRuntimeProfile {
42
+ /** Node-style `process.platform`: `"linux" | "darwin" | "win32" | "android"`. */
43
+ platform: NodeJS.Platform | "android" | "ios";
44
+ /**
45
+ * `process.arch` (`"x64"` | `"arm64"`). Apple Silicon = `"arm64"` on
46
+ * `"darwin"`. Intel Mac = `"x64"` on `"darwin"`.
47
+ */
48
+ arch: NodeJS.Architecture | string;
49
+ /**
50
+ * GPU vendor hint, when detected. `"nvidia"` enables CUDA / TensorRT
51
+ * paths; `"amd"` and `"intel"` favour Vulkan. `"apple"` is implied by
52
+ * platform=darwin+arch=arm64.
53
+ */
54
+ gpu?: "nvidia" | "amd" | "intel" | "apple" | "none";
55
+ /**
56
+ * sd-cpp binary capability evidence gathered from the first-run probe,
57
+ * bundle manifest, or a loader-side help/version check. GPU vendor alone
58
+ * is not evidence that the installed `sd` binary was built with CUDA.
59
+ */
60
+ sdCpp?: {
61
+ accelerators?: readonly string[];
62
+ cudaCapable?: boolean;
63
+ };
64
+ /**
65
+ * Explicit accelerator requirement for release verification and operator
66
+ * smoke tests. When set, the selector returns only backends that can
67
+ * satisfy that accelerator, so CUDA/Vulkan evidence cannot be produced by
68
+ * silently falling through to CPU.
69
+ */
70
+ requiredAccelerator?:
71
+ | "cpu"
72
+ | "cuda"
73
+ | "vulkan"
74
+ | "metal"
75
+ | "coreml"
76
+ | "tensorrt";
77
+ /**
78
+ * True when running inside the iOS Capacitor shell. We can't infer
79
+ * from `process.platform` alone because Capacitor reports `"ios"`
80
+ * but Node's typings only know `darwin`/`linux`/etc.
81
+ */
82
+ isIos?: boolean;
83
+ /**
84
+ * True when running inside the Android Capacitor / `plugin-aosp-local-inference`
85
+ * shell. Node reports `"linux"` on AOSP, so we need an explicit signal.
86
+ */
87
+ isAndroid?: boolean;
88
+ }
89
+
90
+ export type ImageGenBackendId = ImageGenBackend["id"];
91
+
92
+ /**
93
+ * Ordered list of `(backendId, accelerator)` pairs to try. The caller
94
+ * picks the first one whose backend loader returns a live handle.
95
+ *
96
+ * Accelerator strings match `ImageGenLoadArgs.accelerator`.
97
+ */
98
+ export interface ImageGenBackendChoice {
99
+ backendId: ImageGenBackendId;
100
+ accelerator?:
101
+ | "auto"
102
+ | "cpu"
103
+ | "cuda"
104
+ | "vulkan"
105
+ | "metal"
106
+ | "coreml"
107
+ | "tensorrt";
108
+ }
109
+
110
+ export function selectImageGenBackends(
111
+ profile: ImageGenRuntimeProfile,
112
+ ): readonly ImageGenBackendChoice[] {
113
+ if (profile.requiredAccelerator) {
114
+ switch (profile.requiredAccelerator) {
115
+ case "coreml":
116
+ return [{ backendId: "coreml", accelerator: "coreml" }];
117
+ case "tensorrt":
118
+ return [{ backendId: "tensorrt", accelerator: "tensorrt" }];
119
+ case "metal":
120
+ return profile.platform === "darwin" && profile.arch === "arm64"
121
+ ? [{ backendId: "mflux", accelerator: "metal" }]
122
+ : [{ backendId: "sd-cpp", accelerator: "metal" }];
123
+ case "cuda":
124
+ return [{ backendId: "sd-cpp", accelerator: "cuda" }];
125
+ case "vulkan":
126
+ return [{ backendId: "sd-cpp", accelerator: "vulkan" }];
127
+ case "cpu":
128
+ return [{ backendId: "sd-cpp", accelerator: "cpu" }];
129
+ }
130
+ }
131
+ if (profile.isIos) {
132
+ // iOS Capacitor: Core ML only. No fallback — sd-cpp is not
133
+ // shipped on iOS and falling back to nothing surfaces a clean
134
+ // "unavailable on this device" error in the UI.
135
+ return [{ backendId: "coreml", accelerator: "coreml" }];
136
+ }
137
+ if (profile.isAndroid) {
138
+ // AOSP: libeliza-llama-shim with Vulkan/OpenCL. The JNI handles
139
+ // the acceleration path; from the JS side we just request "auto"
140
+ // and let the shim pick.
141
+ return [{ backendId: "aosp", accelerator: "auto" }];
142
+ }
143
+
144
+ if (profile.platform === "darwin") {
145
+ if (profile.arch === "arm64") {
146
+ // Apple Silicon: mflux (MLX/Metal) first; sd-cpp CPU as
147
+ // last resort if the venv isn't installed.
148
+ return [
149
+ { backendId: "mflux", accelerator: "metal" },
150
+ { backendId: "sd-cpp", accelerator: "cpu" },
151
+ ];
152
+ }
153
+ // Intel Mac. mflux requires Apple Silicon; sd-cpp Metal is the
154
+ // reasonable fast path. Builds for Intel Mac sd-cpp are sparse;
155
+ // CPU is the safe default.
156
+ return [
157
+ { backendId: "sd-cpp", accelerator: "auto" },
158
+ { backendId: "sd-cpp", accelerator: "cpu" },
159
+ ];
160
+ }
161
+
162
+ if (profile.platform === "win32") {
163
+ if (profile.gpu === "nvidia") {
164
+ return [
165
+ { backendId: "tensorrt", accelerator: "tensorrt" },
166
+ { backendId: "sd-cpp", accelerator: "cuda" },
167
+ { backendId: "sd-cpp", accelerator: "cpu" },
168
+ ];
169
+ }
170
+ if (profile.gpu === "amd" || profile.gpu === "intel") {
171
+ return [
172
+ { backendId: "sd-cpp", accelerator: "vulkan" },
173
+ { backendId: "sd-cpp", accelerator: "cpu" },
174
+ ];
175
+ }
176
+ return [{ backendId: "sd-cpp", accelerator: "cpu" }];
177
+ }
178
+
179
+ // Linux (and any other Unix the runtime reports). sd-cpp covers
180
+ // CUDA, Vulkan, and CPU through the same binary; we just pick the
181
+ // accelerator order.
182
+ if (profile.platform === "linux") {
183
+ if (profile.gpu === "nvidia") {
184
+ const sdCppCudaCapable =
185
+ profile.sdCpp?.cudaCapable === true ||
186
+ profile.sdCpp?.accelerators?.includes("cuda") === true;
187
+ return sdCppCudaCapable
188
+ ? [
189
+ { backendId: "sd-cpp", accelerator: "cuda" },
190
+ { backendId: "sd-cpp", accelerator: "cpu" },
191
+ ]
192
+ : [{ backendId: "sd-cpp", accelerator: "cpu" }];
193
+ }
194
+ if (profile.gpu === "amd" || profile.gpu === "intel") {
195
+ return [
196
+ { backendId: "sd-cpp", accelerator: "vulkan" },
197
+ { backendId: "sd-cpp", accelerator: "cpu" },
198
+ ];
199
+ }
200
+ return [{ backendId: "sd-cpp", accelerator: "cpu" }];
201
+ }
202
+
203
+ // Unknown platform — try sd-cpp CPU and fail cleanly if it isn't
204
+ // installed.
205
+ return [{ backendId: "sd-cpp", accelerator: "cpu" }];
206
+ }
207
+
208
+ /**
209
+ * Tier → default image-gen model id. Mirrors
210
+ * `eliza/packages/chip/ELIZA_1_BUNDLE_EXTRAS.json` and the WS10 golden test's
211
+ * `PER_TIER_DEFAULT` map. Used by the WS3 capability registration to
212
+ * resolve the catalog's bare tier id into a concrete diffusion file.
213
+ */
214
+ export const TIER_TO_DEFAULT_IMAGE_MODEL: Readonly<
215
+ Record<
216
+ string,
217
+ {
218
+ modelId: string;
219
+ file: string;
220
+ splitDiffusionModel?: boolean;
221
+ vae?: string;
222
+ llm?: string;
223
+ }
224
+ >
225
+ > = {
226
+ "eliza-1-2b": {
227
+ modelId: "imagegen-sd-1_5-q5_0",
228
+ file: "imagegen/sd-1.5-Q5_0.gguf",
229
+ },
230
+ "eliza-1-4b": {
231
+ modelId: "imagegen-sd-1_5-q5_0",
232
+ file: "imagegen/sd-1.5-Q5_0.gguf",
233
+ },
234
+ "eliza-1-9b": {
235
+ modelId: "imagegen-z-image-turbo-q4_k_m",
236
+ file: "imagegen/z-image-turbo-Q4_K_M.gguf",
237
+ splitDiffusionModel: true,
238
+ vae: "imagegen/vae/ae.safetensors",
239
+ llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
240
+ },
241
+ "eliza-1-27b": {
242
+ modelId: "imagegen-z-image-turbo-q4_k_m",
243
+ file: "imagegen/z-image-turbo-Q4_K_M.gguf",
244
+ splitDiffusionModel: true,
245
+ vae: "imagegen/vae/ae.safetensors",
246
+ llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
247
+ },
248
+ "eliza-1-27b-256k": {
249
+ modelId: "imagegen-z-image-turbo-q4_k_m",
250
+ file: "imagegen/z-image-turbo-Q4_K_M.gguf",
251
+ splitDiffusionModel: true,
252
+ vae: "imagegen/vae/ae.safetensors",
253
+ llm: "imagegen/text-encoders/Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
254
+ },
255
+ };
256
+
257
+ /**
258
+ * Resolve a tier id (or raw model id) to its default image-gen model.
259
+ * Returns null when the input doesn't match any known tier — caller
260
+ * surfaces a clear error.
261
+ */
262
+ export function resolveDefaultImageGenModel(keyOrTier: string): {
263
+ modelId: string;
264
+ file: string;
265
+ splitDiffusionModel?: boolean;
266
+ vae?: string;
267
+ llm?: string;
268
+ } | null {
269
+ const direct = TIER_TO_DEFAULT_IMAGE_MODEL[keyOrTier];
270
+ if (direct) return direct;
271
+ // Allow callers to pass the bare model id straight through; if it
272
+ // matches a known model file in the per-tier map we echo it back.
273
+ for (const entry of Object.values(TIER_TO_DEFAULT_IMAGE_MODEL)) {
274
+ if (entry.modelId === keyOrTier) return entry;
275
+ }
276
+ return null;
277
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Core ML image-gen backend contract (WS3) — iOS via Capacitor bridge.
3
+ *
4
+ * The contract for the Swift side. The real implementation lives in
5
+ * `eliza/packages/app-core/platforms/ios/App/App/ImageGenBridge.swift`
6
+ * (skeleton written under `// MARK: - Contract`). At runtime the iOS
7
+ * plugin (`@elizaos/plugin-ios-local-inference`) registers a Capacitor
8
+ * service that exposes:
9
+ *
10
+ * await Capacitor.Plugins.ElizaImageGen.generateImage({
11
+ * modelKey: "imagegen-coreml-sd-1_5",
12
+ * prompt: "<text>",
13
+ * negativePrompt: "<text>", // optional
14
+ * width: 512,
15
+ * height: 512,
16
+ * steps: 20,
17
+ * guidanceScale: 7.5,
18
+ * seed: 42 // -1 = random
19
+ * })
20
+ * -> { png: "<base64>", seed: number, inferenceTimeMs: number }
21
+ *
22
+ * Swift side uses `apple/ml-stable-diffusion` Swift package directly;
23
+ * the `.mlpackage` directories are dropped into the app's Documents
24
+ * folder by the bundle installer.
25
+ *
26
+ * Until the Swift bridge is present and the Capacitor plugin exposes the
27
+ * binding, `loadCoreMlImageGenBackend` throws a structured
28
+ * `ImageGenBackendUnavailableError` so the selector can fall through
29
+ * — but on iOS there is no fall-through (sd-cpp doesn't run on iOS,
30
+ * mflux is macOS-only). A `coreml_unavailable` error there means
31
+ * "this device does not support image-gen yet."
32
+ *
33
+ * Publishing pipeline (iOS 17+ / iOS 26+):
34
+ *
35
+ * Build (.mlpackage per tier):
36
+ * git clone https://github.com/apple/ml-stable-diffusion && cd ml-stable-diffusion
37
+ * python3 -m venv venv && ./venv/bin/pip install -e .
38
+ * # SD 1.5 — 512x512, attention=SPLIT_EINSUM_V2 for ANE on iPhone 15+
39
+ * ./venv/bin/python -m python_coreml_stable_diffusion.torch2coreml \
40
+ * --convert-unet --convert-vae-encoder --convert-vae-decoder \
41
+ * --convert-text-encoder --bundle-resources-for-swift-cli \
42
+ * --attention-implementation SPLIT_EINSUM_V2 \
43
+ * --model-version runwayml/stable-diffusion-v1-5 \
44
+ * --output-dir build/sd-1.5-coreml-512
45
+ * # SDXL — 1024x1024, same pipeline at --model-version
46
+ * # stabilityai/sdxl-turbo for the iPhone 16 Pro / iPad M-class path.
47
+ * xcrun coremlc compile build/sd-1.5-coreml-512 build/sd-1.5-coreml-512-compiled
48
+ * Sign:
49
+ * codesign --force --options runtime --timestamp \
50
+ * --sign "Apple Distribution: Eliza Labs Inc." \
51
+ * build/sd-1.5-coreml-512/*.mlpackage
52
+ * Drop (into the Capacitor app bundle's on-demand resources):
53
+ * Tag with `nameOfResourcesODR=ImageGenSD15` so the App Store delivers
54
+ * the package only when the runtime requests it via `NSBundleResource
55
+ * Request`. Total compressed .mlpackage size is ~600 MB for SD 1.5
56
+ * at SPLIT_EINSUM_V2 and ~3 GB for SDXL-turbo.
57
+ * Notarize / submit:
58
+ * The .mlpackages ship inside the signed IPA; notarization is the
59
+ * standard `altool notarytool submit` step for the host IPA.
60
+ * iOS 26 (forward-compat note):
61
+ * iOS 26 adds the public `MLTensor` API and an updated ANE driver;
62
+ * re-build the .mlpackage with `--attention-implementation
63
+ * SPLIT_EINSUM_V2` on the iOS 26 SDK to pick up the latest ANE
64
+ * scheduling improvements. The Swift bridge code in
65
+ * `ImageGenBridge.swift` is the same across iOS 17/18/26.
66
+ */
67
+ import type { ImageGenBackend, ImageGenLoadArgs } from "./types";
68
+ /**
69
+ * The Capacitor bridge shape. The iOS plugin registers an instance
70
+ * under the runtime service name `"capacitor-image-gen"` once the
71
+ * Swift side ships.
72
+ */
73
+ export interface CoreMlImageGenBridge {
74
+ /**
75
+ * True when the Swift `ImageGenBridge.swift` is present AND a
76
+ * `.mlpackage` has been resolved for the active tier. False when
77
+ * either is missing — the backend throws on `generate` in
78
+ * that case rather than producing a synthetic PNG.
79
+ */
80
+ isAvailable(): boolean;
81
+ generateImage(args: {
82
+ modelKey: string;
83
+ prompt: string;
84
+ negativePrompt?: string;
85
+ width: number;
86
+ height: number;
87
+ steps: number;
88
+ guidanceScale: number;
89
+ seed: number;
90
+ signal?: AbortSignal;
91
+ }): Promise<{
92
+ /** Base64-encoded PNG. */
93
+ png: string;
94
+ seed: number;
95
+ inferenceTimeMs: number;
96
+ }>;
97
+ }
98
+ export interface LoadCoreMlImageGenBackendOptions {
99
+ loadArgs: ImageGenLoadArgs;
100
+ modelKey: string;
101
+ bridge?: CoreMlImageGenBridge;
102
+ now?: () => number;
103
+ }
104
+ export declare function loadCoreMlImageGenBackend(opts: LoadCoreMlImageGenBackendOptions): Promise<ImageGenBackend>;
105
+ //# sourceMappingURL=coreml-unavailable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreml-unavailable.d.ts","sourceRoot":"","sources":["coreml-unavailable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAIH,OAAO,KAAK,EACX,eAAe,EACf,gBAAgB,EAGhB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACpC;;;;;OAKG;IACH,WAAW,IAAI,OAAO,CAAC;IACvB,aAAa,CAAC,IAAI,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC;QACX,0BAA0B;QAC1B,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACH;AAED,MAAM,WAAW,gCAAgC;IAChD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,wBAAsB,yBAAyB,CAC9C,IAAI,EAAE,gCAAgC,GACpC,OAAO,CAAC,eAAe,CAAC,CA4F1B"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Core ML image-gen backend contract (WS3) — iOS via Capacitor bridge.
3
+ *
4
+ * The contract for the Swift side. The real implementation lives in
5
+ * `eliza/packages/app-core/platforms/ios/App/App/ImageGenBridge.swift`
6
+ * (skeleton written under `// MARK: - Contract`). At runtime the iOS
7
+ * plugin (`@elizaos/plugin-ios-local-inference`) registers a Capacitor
8
+ * service that exposes:
9
+ *
10
+ * await Capacitor.Plugins.ElizaImageGen.generateImage({
11
+ * modelKey: "imagegen-coreml-sd-1_5",
12
+ * prompt: "<text>",
13
+ * negativePrompt: "<text>", // optional
14
+ * width: 512,
15
+ * height: 512,
16
+ * steps: 20,
17
+ * guidanceScale: 7.5,
18
+ * seed: 42 // -1 = random
19
+ * })
20
+ * -> { png: "<base64>", seed: number, inferenceTimeMs: number }
21
+ *
22
+ * Swift side uses `apple/ml-stable-diffusion` Swift package directly;
23
+ * the `.mlpackage` directories are dropped into the app's Documents
24
+ * folder by the bundle installer.
25
+ *
26
+ * Until the Swift bridge is present and the Capacitor plugin exposes the
27
+ * binding, `loadCoreMlImageGenBackend` throws a structured
28
+ * `ImageGenBackendUnavailableError` so the selector can fall through
29
+ * — but on iOS there is no fall-through (sd-cpp doesn't run on iOS,
30
+ * mflux is macOS-only). A `coreml_unavailable` error there means
31
+ * "this device does not support image-gen yet."
32
+ *
33
+ * Publishing pipeline (iOS 17+ / iOS 26+):
34
+ *
35
+ * Build (.mlpackage per tier):
36
+ * git clone https://github.com/apple/ml-stable-diffusion && cd ml-stable-diffusion
37
+ * python3 -m venv venv && ./venv/bin/pip install -e .
38
+ * # SD 1.5 — 512x512, attention=SPLIT_EINSUM_V2 for ANE on iPhone 15+
39
+ * ./venv/bin/python -m python_coreml_stable_diffusion.torch2coreml \
40
+ * --convert-unet --convert-vae-encoder --convert-vae-decoder \
41
+ * --convert-text-encoder --bundle-resources-for-swift-cli \
42
+ * --attention-implementation SPLIT_EINSUM_V2 \
43
+ * --model-version runwayml/stable-diffusion-v1-5 \
44
+ * --output-dir build/sd-1.5-coreml-512
45
+ * # SDXL — 1024x1024, same pipeline at --model-version
46
+ * # stabilityai/sdxl-turbo for the iPhone 16 Pro / iPad M-class path.
47
+ * xcrun coremlc compile build/sd-1.5-coreml-512 build/sd-1.5-coreml-512-compiled
48
+ * Sign:
49
+ * codesign --force --options runtime --timestamp \
50
+ * --sign "Apple Distribution: Eliza Labs Inc." \
51
+ * build/sd-1.5-coreml-512/*.mlpackage
52
+ * Drop (into the Capacitor app bundle's on-demand resources):
53
+ * Tag with `nameOfResourcesODR=ImageGenSD15` so the App Store delivers
54
+ * the package only when the runtime requests it via `NSBundleResource
55
+ * Request`. Total compressed .mlpackage size is ~600 MB for SD 1.5
56
+ * at SPLIT_EINSUM_V2 and ~3 GB for SDXL-turbo.
57
+ * Notarize / submit:
58
+ * The .mlpackages ship inside the signed IPA; notarization is the
59
+ * standard `altool notarytool submit` step for the host IPA.
60
+ * iOS 26 (forward-compat note):
61
+ * iOS 26 adds the public `MLTensor` API and an updated ANE driver;
62
+ * re-build the .mlpackage with `--attention-implementation
63
+ * SPLIT_EINSUM_V2` on the iOS 26 SDK to pick up the latest ANE
64
+ * scheduling improvements. The Swift bridge code in
65
+ * `ImageGenBridge.swift` is the same across iOS 17/18/26.
66
+ */
67
+
68
+ import { ImageGenBackendUnavailableError } from "./errors";
69
+ import { PNG_SIGNATURE, resolveSeed } from "./sd-cpp";
70
+ import type {
71
+ ImageGenBackend,
72
+ ImageGenLoadArgs,
73
+ ImageGenRequest,
74
+ ImageGenResult,
75
+ } from "./types";
76
+
77
+ /**
78
+ * The Capacitor bridge shape. The iOS plugin registers an instance
79
+ * under the runtime service name `"capacitor-image-gen"` once the
80
+ * Swift side ships.
81
+ */
82
+ export interface CoreMlImageGenBridge {
83
+ /**
84
+ * True when the Swift `ImageGenBridge.swift` is present AND a
85
+ * `.mlpackage` has been resolved for the active tier. False when
86
+ * either is missing — the backend throws on `generate` in
87
+ * that case rather than producing a synthetic PNG.
88
+ */
89
+ isAvailable(): boolean;
90
+ generateImage(args: {
91
+ modelKey: string;
92
+ prompt: string;
93
+ negativePrompt?: string;
94
+ width: number;
95
+ height: number;
96
+ steps: number;
97
+ guidanceScale: number;
98
+ seed: number;
99
+ signal?: AbortSignal;
100
+ }): Promise<{
101
+ /** Base64-encoded PNG. */
102
+ png: string;
103
+ seed: number;
104
+ inferenceTimeMs: number;
105
+ }>;
106
+ }
107
+
108
+ export interface LoadCoreMlImageGenBackendOptions {
109
+ loadArgs: ImageGenLoadArgs;
110
+ modelKey: string;
111
+ bridge?: CoreMlImageGenBridge;
112
+ now?: () => number;
113
+ }
114
+
115
+ export async function loadCoreMlImageGenBackend(
116
+ opts: LoadCoreMlImageGenBackendOptions,
117
+ ): Promise<ImageGenBackend> {
118
+ const { bridge, modelKey } = opts;
119
+ const now = opts.now ?? Date.now;
120
+
121
+ if (!bridge?.isAvailable()) {
122
+ throw new ImageGenBackendUnavailableError(
123
+ "coreml",
124
+ "binding_unavailable",
125
+ "[imagegen/coreml] Capacitor ElizaImageGen plugin is not available. Wire ImageGenBridge.swift to apple/ml-stable-diffusion and ship a tier-matched .mlpackage. Until then, iOS image-gen is unavailable.",
126
+ );
127
+ }
128
+
129
+ let disposed = false;
130
+
131
+ return {
132
+ id: "coreml",
133
+ supports(req: ImageGenRequest) {
134
+ if (disposed) return false;
135
+ // Core ML compiles to a fixed input shape per `.mlpackage`.
136
+ // SD 1.5 stock packages target 512×512; SDXL packages target
137
+ // 1024×1024. We accept the catalog defaults; explicit asks
138
+ // outside the package's shape are rejected so the caller can
139
+ // see a clear error rather than the runtime cropping/upsampling.
140
+ const w = req.width ?? 512;
141
+ const h = req.height ?? 512;
142
+ if (w !== 512 && w !== 768 && w !== 1024) return false;
143
+ if (h !== 512 && h !== 768 && h !== 1024) return false;
144
+ return true;
145
+ },
146
+ async generate(req: ImageGenRequest): Promise<ImageGenResult> {
147
+ if (disposed) {
148
+ throw new ImageGenBackendUnavailableError(
149
+ "coreml",
150
+ "binding_unavailable",
151
+ "[imagegen/coreml] generate called after dispose()",
152
+ );
153
+ }
154
+ if (!req.prompt.trim()) {
155
+ throw new ImageGenBackendUnavailableError(
156
+ "coreml",
157
+ "unsupported_request",
158
+ "[imagegen/coreml] prompt is empty",
159
+ );
160
+ }
161
+ const seed = resolveSeed(req.seed);
162
+ const width = req.width ?? 512;
163
+ const height = req.height ?? 512;
164
+ const steps = req.steps ?? 20;
165
+ const guidanceScale = req.guidanceScale ?? 7.5;
166
+ const startMs = now();
167
+ const result = await bridge.generateImage({
168
+ modelKey,
169
+ prompt: req.prompt,
170
+ negativePrompt: req.negativePrompt,
171
+ width,
172
+ height,
173
+ steps,
174
+ guidanceScale,
175
+ seed,
176
+ signal: req.signal,
177
+ });
178
+ const elapsed =
179
+ typeof result.inferenceTimeMs === "number" && result.inferenceTimeMs > 0
180
+ ? result.inferenceTimeMs
181
+ : Math.max(1, now() - startMs);
182
+ const bytes = decodeBase64Png(result.png);
183
+ // Core ML batch path doesn't surface per-step progress; emit a
184
+ // single completion event when the caller asked for one.
185
+ if (req.onProgressChunk) {
186
+ req.onProgressChunk({ step: steps, total: steps });
187
+ }
188
+ return {
189
+ image: bytes,
190
+ mime: "image/png",
191
+ seed: typeof result.seed === "number" ? result.seed : seed,
192
+ metadata: {
193
+ model: modelKey,
194
+ prompt: req.prompt,
195
+ steps,
196
+ guidanceScale,
197
+ inferenceTimeMs: elapsed,
198
+ },
199
+ };
200
+ },
201
+ async dispose() {
202
+ if (disposed) return;
203
+ disposed = true;
204
+ // Capacitor plugin owns the Swift-side handle's lifetime; nothing
205
+ // to free from JS. The bundle installer is responsible for the
206
+ // `.mlpackage` cleanup if the user deletes a tier.
207
+ },
208
+ };
209
+ }
210
+
211
+ function decodeBase64Png(base64: string): Uint8Array {
212
+ if (typeof base64 !== "string" || !base64) {
213
+ throw new ImageGenBackendUnavailableError(
214
+ "coreml",
215
+ "unsupported_request",
216
+ "[imagegen/coreml] Capacitor bridge returned empty base64 payload",
217
+ );
218
+ }
219
+ const buf = Buffer.from(base64, "base64");
220
+ if (buf.length < PNG_SIGNATURE.length) {
221
+ throw new ImageGenBackendUnavailableError(
222
+ "coreml",
223
+ "unsupported_request",
224
+ `[imagegen/coreml] base64 payload too short (${buf.length} bytes); not a PNG`,
225
+ );
226
+ }
227
+ for (let i = 0; i < PNG_SIGNATURE.length; i += 1) {
228
+ if (buf[i] !== PNG_SIGNATURE[i]) {
229
+ throw new ImageGenBackendUnavailableError(
230
+ "coreml",
231
+ "unsupported_request",
232
+ "[imagegen/coreml] base64 payload missing PNG signature",
233
+ );
234
+ }
235
+ }
236
+ return new Uint8Array(buf);
237
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Structured error every WS3 backend throws when it can't serve a
3
+ * request. Mirrors `VisionBackendUnavailableError` so the arbiter / WS3
4
+ * provider handler can surface a single typed failure mode upward.
5
+ */
6
+ export declare class ImageGenBackendUnavailableError extends Error {
7
+ readonly backendId: string;
8
+ readonly reason: "binary_missing" | "binary_version_mismatch" | "cuda_binary_missing" | "vulkan_binary_missing" | "metal_binary_missing" | "cuda_unavailable" | "model_missing" | "binding_unavailable" | "unsupported_runtime" | "unsupported_request" | "subprocess_failed";
9
+ readonly code = "IMAGE_GEN_BACKEND_UNAVAILABLE";
10
+ constructor(backendId: string, reason: "binary_missing" | "binary_version_mismatch" | "cuda_binary_missing" | "vulkan_binary_missing" | "metal_binary_missing" | "cuda_unavailable" | "model_missing" | "binding_unavailable" | "unsupported_runtime" | "unsupported_request" | "subprocess_failed", message: string, options?: {
11
+ cause?: unknown;
12
+ });
13
+ }
14
+ /** Tells callers whether a thrown error came from a backend availability check. */
15
+ export declare function isImageGenUnavailable(err: unknown): err is ImageGenBackendUnavailableError;
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;IAGxD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,EACZ,gBAAgB,GAChB,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB;IAdvB,QAAQ,CAAC,IAAI,mCAAmC;gBAEtC,SAAS,EAAE,MAAM,EACjB,MAAM,EACZ,gBAAgB,GAChB,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,qBAAqB,GACrB,qBAAqB,GACrB,mBAAmB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK9B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,OAAO,GACV,GAAG,IAAI,+BAA+B,CAOxC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Structured error every WS3 backend throws when it can't serve a
3
+ * request. Mirrors `VisionBackendUnavailableError` so the arbiter / WS3
4
+ * provider handler can surface a single typed failure mode upward.
5
+ */
6
+ export class ImageGenBackendUnavailableError extends Error {
7
+ readonly code = "IMAGE_GEN_BACKEND_UNAVAILABLE";
8
+ constructor(
9
+ readonly backendId: string,
10
+ readonly reason:
11
+ | "binary_missing"
12
+ | "binary_version_mismatch"
13
+ | "cuda_binary_missing"
14
+ | "vulkan_binary_missing"
15
+ | "metal_binary_missing"
16
+ | "cuda_unavailable"
17
+ | "model_missing"
18
+ | "binding_unavailable"
19
+ | "unsupported_runtime"
20
+ | "unsupported_request"
21
+ | "subprocess_failed",
22
+ message: string,
23
+ options?: { cause?: unknown },
24
+ ) {
25
+ super(message, options);
26
+ this.name = "ImageGenBackendUnavailableError";
27
+ }
28
+ }
29
+
30
+ /** Tells callers whether a thrown error came from a backend availability check. */
31
+ export function isImageGenUnavailable(
32
+ err: unknown,
33
+ ): err is ImageGenBackendUnavailableError {
34
+ return (
35
+ err instanceof ImageGenBackendUnavailableError ||
36
+ (typeof err === "object" &&
37
+ err !== null &&
38
+ (err as { code?: unknown }).code === "IMAGE_GEN_BACKEND_UNAVAILABLE")
39
+ );
40
+ }