@atomic-chat/core 0.13.2 → 0.17.0

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 (377) hide show
  1. package/README.md +1 -1
  2. package/dist/backend/advisor/advisor.d.ts +8 -7
  3. package/dist/backend/advisor/advisor.js +17 -25
  4. package/dist/backend/advisor/advisor.js.map +1 -1
  5. package/dist/backend/catalog/index.d.ts +4 -2
  6. package/dist/backend/catalog/index.js +4 -2
  7. package/dist/backend/catalog/index.js.map +1 -1
  8. package/dist/backend/catalog/manifest.d.ts +5 -51
  9. package/dist/backend/catalog/manifest.js +5 -93
  10. package/dist/backend/catalog/manifest.js.map +1 -1
  11. package/dist/backend/catalog/upstream-releases-baseline.d.ts +2 -0
  12. package/dist/backend/catalog/upstream-releases-baseline.js +12 -0
  13. package/dist/backend/catalog/upstream-releases-baseline.js.map +1 -0
  14. package/dist/backend/catalog/upstream-releases-baseline.json +101 -0
  15. package/dist/backend/catalog/upstream-releases-catalog.d.ts +54 -0
  16. package/dist/backend/catalog/upstream-releases-catalog.js +148 -0
  17. package/dist/backend/catalog/upstream-releases-catalog.js.map +1 -0
  18. package/dist/backend/catalog/upstream-releases.d.ts +75 -0
  19. package/dist/backend/catalog/upstream-releases.js +155 -0
  20. package/dist/backend/catalog/upstream-releases.js.map +1 -0
  21. package/dist/backend/install/service.d.ts +7 -4
  22. package/dist/backend/install/service.js +4 -4
  23. package/dist/backend/install/service.js.map +1 -1
  24. package/dist/cli/commands/serve.js +10 -28
  25. package/dist/cli/commands/serve.js.map +1 -1
  26. package/dist/cli/main.d.ts +1 -1
  27. package/dist/cli/main.js +0 -1
  28. package/dist/cli/main.js.map +1 -1
  29. package/dist/client/control-client.d.ts +7 -19
  30. package/dist/client/control-client.js +9 -29
  31. package/dist/client/control-client.js.map +1 -1
  32. package/dist/cloud/registry.d.ts +14 -1
  33. package/dist/cloud/registry.js +73 -2
  34. package/dist/cloud/registry.js.map +1 -1
  35. package/dist/config/paths.d.ts +4 -3
  36. package/dist/config/paths.js +15 -14
  37. package/dist/config/paths.js.map +1 -1
  38. package/dist/contracts/diffusion.d.ts +45 -18
  39. package/dist/contracts/diffusion.js +1 -1
  40. package/dist/contracts/diffusion.js.map +1 -1
  41. package/dist/contracts/engines.d.ts +1 -1
  42. package/dist/contracts/engines.js +2 -0
  43. package/dist/contracts/engines.js.map +1 -1
  44. package/dist/contracts/errors.d.ts +1 -3
  45. package/dist/contracts/errors.js +16 -0
  46. package/dist/contracts/errors.js.map +1 -1
  47. package/dist/contracts/events.d.ts +11 -6
  48. package/dist/contracts/index.d.ts +1 -1
  49. package/dist/contracts/index.js +1 -1
  50. package/dist/contracts/index.js.map +1 -1
  51. package/dist/contracts/media.d.ts +186 -0
  52. package/dist/contracts/media.js +55 -0
  53. package/dist/contracts/media.js.map +1 -0
  54. package/dist/contracts/session.d.ts +10 -1
  55. package/dist/contracts/session.js +10 -0
  56. package/dist/contracts/session.js.map +1 -1
  57. package/dist/contracts/settings.d.ts +36 -1
  58. package/dist/contracts/settings.js.map +1 -1
  59. package/dist/core/atomic-core.d.ts +7 -5
  60. package/dist/core/atomic-core.js +1 -0
  61. package/dist/core/atomic-core.js.map +1 -1
  62. package/dist/core/create.js +48 -58
  63. package/dist/core/create.js.map +1 -1
  64. package/dist/core/managed-engines.js +2 -0
  65. package/dist/core/managed-engines.js.map +1 -1
  66. package/dist/core/prism.d.ts +23 -6
  67. package/dist/core/prism.js +45 -0
  68. package/dist/core/prism.js.map +1 -1
  69. package/dist/core/public-server.js +3 -2
  70. package/dist/core/public-server.js.map +1 -1
  71. package/dist/core/types.d.ts +11 -0
  72. package/dist/core/types.js.map +1 -1
  73. package/dist/decision/process.d.ts +4 -0
  74. package/dist/decision/process.js +10 -1
  75. package/dist/decision/process.js.map +1 -1
  76. package/dist/diffusion/args.d.ts +3 -2
  77. package/dist/diffusion/args.js +21 -4
  78. package/dist/diffusion/args.js.map +1 -1
  79. package/dist/diffusion/compat.d.ts +1 -1
  80. package/dist/diffusion/compat.js +6 -2
  81. package/dist/diffusion/compat.js.map +1 -1
  82. package/dist/diffusion/gallery.d.ts +24 -3
  83. package/dist/diffusion/gallery.js +151 -21
  84. package/dist/diffusion/gallery.js.map +1 -1
  85. package/dist/diffusion/index.d.ts +3 -0
  86. package/dist/diffusion/index.js +3 -0
  87. package/dist/diffusion/index.js.map +1 -1
  88. package/dist/diffusion/jobs.d.ts +6 -1
  89. package/dist/diffusion/jobs.js +10 -1
  90. package/dist/diffusion/jobs.js.map +1 -1
  91. package/dist/diffusion/media-header.d.ts +22 -0
  92. package/dist/diffusion/media-header.js +149 -0
  93. package/dist/diffusion/media-header.js.map +1 -0
  94. package/dist/diffusion/parse.d.ts +3 -1
  95. package/dist/diffusion/parse.js +36 -0
  96. package/dist/diffusion/parse.js.map +1 -1
  97. package/dist/diffusion/recipe.d.ts +10 -1
  98. package/dist/diffusion/recipe.js +85 -21
  99. package/dist/diffusion/recipe.js.map +1 -1
  100. package/dist/diffusion/remote-job.d.ts +76 -0
  101. package/dist/diffusion/remote-job.js +643 -0
  102. package/dist/diffusion/remote-job.js.map +1 -0
  103. package/dist/diffusion/remote-store.d.ts +38 -0
  104. package/dist/diffusion/remote-store.js +91 -0
  105. package/dist/diffusion/remote-store.js.map +1 -0
  106. package/dist/diffusion/service.d.ts +9 -1
  107. package/dist/diffusion/service.js +49 -9
  108. package/dist/diffusion/service.js.map +1 -1
  109. package/dist/diffusion/state.d.ts +13 -1
  110. package/dist/diffusion/state.js +8 -0
  111. package/dist/diffusion/state.js.map +1 -1
  112. package/dist/diffusion/tracker.d.ts +6 -0
  113. package/dist/diffusion/tracker.js +11 -0
  114. package/dist/diffusion/tracker.js.map +1 -1
  115. package/dist/diffusion/validate.js +2 -2
  116. package/dist/diffusion/validate.js.map +1 -1
  117. package/dist/diffusion/video-gallery.d.ts +11 -4
  118. package/dist/diffusion/video-gallery.js +62 -25
  119. package/dist/diffusion/video-gallery.js.map +1 -1
  120. package/dist/diffusion/video-history.js +4 -1
  121. package/dist/diffusion/video-history.js.map +1 -1
  122. package/dist/diffusion/video-recipe.js +58 -25
  123. package/dist/diffusion/video-recipe.js.map +1 -1
  124. package/dist/diffusion/wiring.d.ts +3 -0
  125. package/dist/diffusion/wiring.js +1 -0
  126. package/dist/diffusion/wiring.js.map +1 -1
  127. package/dist/diffusion/workflow.d.ts +8 -2
  128. package/dist/diffusion/workflow.js +13 -5
  129. package/dist/diffusion/workflow.js.map +1 -1
  130. package/dist/downloads/downloader.d.ts +6 -1
  131. package/dist/downloads/downloader.js +12 -1
  132. package/dist/downloads/downloader.js.map +1 -1
  133. package/dist/embedding/process.d.ts +4 -0
  134. package/dist/embedding/process.js +10 -1
  135. package/dist/embedding/process.js.map +1 -1
  136. package/dist/media/adapters/a1111.d.ts +32 -0
  137. package/dist/media/adapters/a1111.js +207 -0
  138. package/dist/media/adapters/a1111.js.map +1 -0
  139. package/dist/media/adapters/aimlapi-videos.d.ts +34 -0
  140. package/dist/media/adapters/aimlapi-videos.js +172 -0
  141. package/dist/media/adapters/aimlapi-videos.js.map +1 -0
  142. package/dist/media/adapters/dashscope-image.d.ts +26 -0
  143. package/dist/media/adapters/dashscope-image.js +160 -0
  144. package/dist/media/adapters/dashscope-image.js.map +1 -0
  145. package/dist/media/adapters/dashscope-video.d.ts +47 -0
  146. package/dist/media/adapters/dashscope-video.js +251 -0
  147. package/dist/media/adapters/dashscope-video.js.map +1 -0
  148. package/dist/media/adapters/gemini-image.d.ts +27 -0
  149. package/dist/media/adapters/gemini-image.js +181 -0
  150. package/dist/media/adapters/gemini-image.js.map +1 -0
  151. package/dist/media/adapters/gemini-veo.d.ts +39 -0
  152. package/dist/media/adapters/gemini-veo.js +196 -0
  153. package/dist/media/adapters/gemini-veo.js.map +1 -0
  154. package/dist/media/adapters/hf-images.d.ts +85 -0
  155. package/dist/media/adapters/hf-images.js +439 -0
  156. package/dist/media/adapters/hf-images.js.map +1 -0
  157. package/dist/media/adapters/hf-videos.d.ts +44 -0
  158. package/dist/media/adapters/hf-videos.js +265 -0
  159. package/dist/media/adapters/hf-videos.js.map +1 -0
  160. package/dist/media/adapters/minimax-image.d.ts +26 -0
  161. package/dist/media/adapters/minimax-image.js +111 -0
  162. package/dist/media/adapters/minimax-image.js.map +1 -0
  163. package/dist/media/adapters/minimax-video-v2.d.ts +34 -0
  164. package/dist/media/adapters/minimax-video-v2.js +191 -0
  165. package/dist/media/adapters/minimax-video-v2.js.map +1 -0
  166. package/dist/media/adapters/minimax-video.d.ts +28 -0
  167. package/dist/media/adapters/minimax-video.js +155 -0
  168. package/dist/media/adapters/minimax-video.js.map +1 -0
  169. package/dist/media/adapters/mistral-agent-image.d.ts +33 -0
  170. package/dist/media/adapters/mistral-agent-image.js +108 -0
  171. package/dist/media/adapters/mistral-agent-image.js.map +1 -0
  172. package/dist/media/adapters/nvidia-genai.d.ts +28 -0
  173. package/dist/media/adapters/nvidia-genai.js +182 -0
  174. package/dist/media/adapters/nvidia-genai.js.map +1 -0
  175. package/dist/media/adapters/openai-images.d.ts +23 -0
  176. package/dist/media/adapters/openai-images.js +164 -0
  177. package/dist/media/adapters/openai-images.js.map +1 -0
  178. package/dist/media/adapters/openai-videos.d.ts +34 -0
  179. package/dist/media/adapters/openai-videos.js +175 -0
  180. package/dist/media/adapters/openai-videos.js.map +1 -0
  181. package/dist/media/adapters/openrouter-images.d.ts +25 -0
  182. package/dist/media/adapters/openrouter-images.js +161 -0
  183. package/dist/media/adapters/openrouter-images.js.map +1 -0
  184. package/dist/media/adapters/openrouter-videos.d.ts +43 -0
  185. package/dist/media/adapters/openrouter-videos.js +208 -0
  186. package/dist/media/adapters/openrouter-videos.js.map +1 -0
  187. package/dist/media/adapters/registry.d.ts +7 -0
  188. package/dist/media/adapters/registry.js +45 -0
  189. package/dist/media/adapters/registry.js.map +1 -0
  190. package/dist/media/adapters/types.d.ts +133 -0
  191. package/dist/media/adapters/types.js +15 -0
  192. package/dist/media/adapters/types.js.map +1 -0
  193. package/dist/media/adapters/xai-images.d.ts +19 -0
  194. package/dist/media/adapters/xai-images.js +83 -0
  195. package/dist/media/adapters/xai-images.js.map +1 -0
  196. package/dist/media/adapters/xai-videos.d.ts +29 -0
  197. package/dist/media/adapters/xai-videos.js +148 -0
  198. package/dist/media/adapters/xai-videos.js.map +1 -0
  199. package/dist/media/catalog-baseline.d.ts +2 -0
  200. package/dist/media/catalog-baseline.js +10 -0
  201. package/dist/media/catalog-baseline.js.map +1 -0
  202. package/dist/media/catalog-baseline.json +1819 -0
  203. package/dist/media/catalog-service.d.ts +42 -0
  204. package/dist/media/catalog-service.js +111 -0
  205. package/dist/media/catalog-service.js.map +1 -0
  206. package/dist/media/catalog.d.ts +50 -0
  207. package/dist/media/catalog.js +315 -0
  208. package/dist/media/catalog.js.map +1 -0
  209. package/dist/media/http.d.ts +125 -0
  210. package/dist/media/http.js +308 -0
  211. package/dist/media/http.js.map +1 -0
  212. package/dist/media/index.d.ts +14 -0
  213. package/dist/media/index.js +15 -0
  214. package/dist/media/index.js.map +1 -0
  215. package/dist/media/mask.d.ts +12 -0
  216. package/dist/media/mask.js +57 -0
  217. package/dist/media/mask.js.map +1 -0
  218. package/dist/media/service.d.ts +42 -0
  219. package/dist/media/service.js +144 -0
  220. package/dist/media/service.js.map +1 -0
  221. package/dist/models/compatibility/inspect.d.ts +11 -2
  222. package/dist/models/compatibility/inspect.js +44 -13
  223. package/dist/models/compatibility/inspect.js.map +1 -1
  224. package/dist/models/compatibility/service.d.ts +3 -0
  225. package/dist/models/compatibility/service.js +1 -0
  226. package/dist/models/compatibility/service.js.map +1 -1
  227. package/dist/models/gguf/tensors.d.ts +1 -0
  228. package/dist/models/gguf/tensors.js +4 -1
  229. package/dist/models/gguf/tensors.js.map +1 -1
  230. package/dist/models/hf.d.ts +3 -16
  231. package/dist/models/hf.js +4 -42
  232. package/dist/models/hf.js.map +1 -1
  233. package/dist/router/resolve.d.ts +15 -4
  234. package/dist/router/resolve.js +25 -3
  235. package/dist/router/resolve.js.map +1 -1
  236. package/dist/runtime/environment/linux-provisioner.js +7 -67
  237. package/dist/runtime/environment/linux-provisioner.js.map +1 -1
  238. package/dist/runtime/environment/runtime-removal-plan.d.ts +19 -0
  239. package/dist/runtime/environment/runtime-removal-plan.js +74 -0
  240. package/dist/runtime/environment/runtime-removal-plan.js.map +1 -0
  241. package/dist/runtime/environment/windows-provisioner.js +20 -4
  242. package/dist/runtime/environment/windows-provisioner.js.map +1 -1
  243. package/dist/runtime/managed-engines/spec.d.ts +2 -2
  244. package/dist/runtime/managed-engines/spec.js +6 -0
  245. package/dist/runtime/managed-engines/spec.js.map +1 -1
  246. package/dist/runtime/managed-models/compatibility.d.ts +10 -0
  247. package/dist/runtime/managed-models/compatibility.js +18 -0
  248. package/dist/runtime/managed-models/compatibility.js.map +1 -1
  249. package/dist/runtime/managed-text/adapter.d.ts +17 -0
  250. package/dist/runtime/managed-text/adapter.js.map +1 -1
  251. package/dist/runtime/managed-text/lifecycle.d.ts +8 -0
  252. package/dist/runtime/managed-text/lifecycle.js +38 -1
  253. package/dist/runtime/managed-text/lifecycle.js.map +1 -1
  254. package/dist/runtime/managed-text/readiness.d.ts +21 -1
  255. package/dist/runtime/managed-text/readiness.js +64 -0
  256. package/dist/runtime/managed-text/readiness.js.map +1 -1
  257. package/dist/runtime/managed-text/request-rules.d.ts +9 -7
  258. package/dist/runtime/managed-text/request-rules.js +58 -2
  259. package/dist/runtime/managed-text/request-rules.js.map +1 -1
  260. package/dist/runtime/managed-text/setting-values.d.ts +9 -0
  261. package/dist/runtime/managed-text/setting-values.js +44 -0
  262. package/dist/runtime/managed-text/setting-values.js.map +1 -0
  263. package/dist/runtime/sglang/adapter.d.ts +50 -0
  264. package/dist/runtime/sglang/adapter.js +393 -0
  265. package/dist/runtime/sglang/adapter.js.map +1 -0
  266. package/dist/runtime/sglang/engine.d.ts +16 -0
  267. package/dist/runtime/sglang/engine.js +38 -0
  268. package/dist/runtime/sglang/engine.js.map +1 -0
  269. package/dist/runtime/sglang/index.d.ts +11 -0
  270. package/dist/runtime/sglang/index.js +12 -0
  271. package/dist/runtime/sglang/index.js.map +1 -0
  272. package/dist/runtime/sglang/memory.d.ts +64 -0
  273. package/dist/runtime/sglang/memory.js +90 -0
  274. package/dist/runtime/sglang/memory.js.map +1 -0
  275. package/dist/runtime/sglang/settings.d.ts +49 -0
  276. package/dist/runtime/sglang/settings.js +118 -0
  277. package/dist/runtime/sglang/settings.js.map +1 -0
  278. package/dist/runtime/shared/external-sessions.js +1 -0
  279. package/dist/runtime/shared/external-sessions.js.map +1 -1
  280. package/dist/runtime/shared/ports.d.ts +10 -0
  281. package/dist/runtime/shared/ports.js +30 -0
  282. package/dist/runtime/shared/ports.js.map +1 -1
  283. package/dist/runtime/tensorrt-llm/adapter.d.ts +1 -4
  284. package/dist/runtime/tensorrt-llm/adapter.js +28 -11
  285. package/dist/runtime/tensorrt-llm/adapter.js.map +1 -1
  286. package/dist/runtime/tensorrt-llm/check.js +1 -0
  287. package/dist/runtime/tensorrt-llm/check.js.map +1 -1
  288. package/dist/runtime/tensorrt-llm/compatibility.d.ts +30 -6
  289. package/dist/runtime/tensorrt-llm/compatibility.js +41 -9
  290. package/dist/runtime/tensorrt-llm/compatibility.js.map +1 -1
  291. package/dist/runtime/tensorrt-llm/cuda-graphs.d.ts +32 -0
  292. package/dist/runtime/tensorrt-llm/cuda-graphs.js +33 -0
  293. package/dist/runtime/tensorrt-llm/cuda-graphs.js.map +1 -0
  294. package/dist/runtime/tensorrt-llm/engine.js +11 -5
  295. package/dist/runtime/tensorrt-llm/engine.js.map +1 -1
  296. package/dist/runtime/tensorrt-llm/kv-cache.d.ts +16 -0
  297. package/dist/runtime/tensorrt-llm/kv-cache.js +21 -1
  298. package/dist/runtime/tensorrt-llm/kv-cache.js.map +1 -1
  299. package/dist/runtime/vllm/adapter.js +2 -47
  300. package/dist/runtime/vllm/adapter.js.map +1 -1
  301. package/dist/runtime/vllm/memory.js +3 -16
  302. package/dist/runtime/vllm/memory.js.map +1 -1
  303. package/dist/runtime/vllm/settings.d.ts +7 -0
  304. package/dist/runtime/vllm/settings.js +2 -30
  305. package/dist/runtime/vllm/settings.js.map +1 -1
  306. package/dist/server/control/router.js +5 -4
  307. package/dist/server/control/router.js.map +1 -1
  308. package/dist/server/control/routes/media.d.ts +9 -0
  309. package/dist/server/control/routes/media.js +24 -0
  310. package/dist/server/control/routes/media.js.map +1 -0
  311. package/dist/server/control/routes/model-compatibility.d.ts +9 -0
  312. package/dist/server/control/routes/model-compatibility.js +31 -0
  313. package/dist/server/control/routes/model-compatibility.js.map +1 -0
  314. package/dist/server/control/types.d.ts +18 -20
  315. package/dist/server/http.js +15 -2
  316. package/dist/server/http.js.map +1 -1
  317. package/dist/server/public/gates.d.ts +6 -1
  318. package/dist/server/public/gates.js +7 -3
  319. package/dist/server/public/gates.js.map +1 -1
  320. package/dist/server/public/images-params.js +18 -1
  321. package/dist/server/public/images-params.js.map +1 -1
  322. package/dist/server/public/images.d.ts +11 -2
  323. package/dist/server/public/images.js +73 -9
  324. package/dist/server/public/images.js.map +1 -1
  325. package/dist/server/public/index.d.ts +1 -0
  326. package/dist/server/public/index.js +16 -7
  327. package/dist/server/public/index.js.map +1 -1
  328. package/dist/server/public/listing.js +1 -0
  329. package/dist/server/public/listing.js.map +1 -1
  330. package/dist/server/public/remote-media.d.ts +51 -0
  331. package/dist/server/public/remote-media.js +225 -0
  332. package/dist/server/public/remote-media.js.map +1 -0
  333. package/dist/server/public/responses.js +4 -2
  334. package/dist/server/public/responses.js.map +1 -1
  335. package/dist/server/public/static-assets.generated.js +1 -1
  336. package/dist/server/public/static-assets.generated.js.map +1 -1
  337. package/dist/server/public/trace.js +2 -0
  338. package/dist/server/public/trace.js.map +1 -1
  339. package/dist/server/public/types.d.ts +12 -1
  340. package/dist/server/public/videos-params.js +13 -3
  341. package/dist/server/public/videos-params.js.map +1 -1
  342. package/dist/server/public/videos.d.ts +1 -0
  343. package/dist/server/public/videos.js +21 -3
  344. package/dist/server/public/videos.js.map +1 -1
  345. package/dist/settings/schema/llamacpp-upstream.json +9 -0
  346. package/dist/settings/schema/sglang.json +251 -0
  347. package/dist/settings/schema.js +27 -1
  348. package/dist/settings/schema.js.map +1 -1
  349. package/dist/version.d.ts +1 -1
  350. package/dist/version.js +1 -1
  351. package/package.json +2 -6
  352. package/src/settings/schema/llamacpp-upstream.json +9 -0
  353. package/src/settings/schema/sglang.json +251 -0
  354. package/dist/backend/catalog/bundled-manifest-baseline.d.ts +0 -2
  355. package/dist/backend/catalog/bundled-manifest-baseline.js +0 -65
  356. package/dist/backend/catalog/bundled-manifest-baseline.js.map +0 -1
  357. package/dist/contracts/model-setup.d.ts +0 -115
  358. package/dist/contracts/model-setup.js +0 -33
  359. package/dist/contracts/model-setup.js.map +0 -1
  360. package/dist/core/model-setup/index.d.ts +0 -4
  361. package/dist/core/model-setup/index.js +0 -5
  362. package/dist/core/model-setup/index.js.map +0 -1
  363. package/dist/core/model-setup/plan.d.ts +0 -56
  364. package/dist/core/model-setup/plan.js +0 -158
  365. package/dist/core/model-setup/plan.js.map +0 -1
  366. package/dist/core/model-setup/service.d.ts +0 -92
  367. package/dist/core/model-setup/service.js +0 -329
  368. package/dist/core/model-setup/service.js.map +0 -1
  369. package/dist/core/model-setup/store.d.ts +0 -29
  370. package/dist/core/model-setup/store.js +0 -116
  371. package/dist/core/model-setup/store.js.map +0 -1
  372. package/dist/core/model-setup/wiring.d.ts +0 -59
  373. package/dist/core/model-setup/wiring.js +0 -132
  374. package/dist/core/model-setup/wiring.js.map +0 -1
  375. package/dist/server/control/routes/model-setups.d.ts +0 -11
  376. package/dist/server/control/routes/model-setups.js +0 -55
  377. package/dist/server/control/routes/model-setups.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ /**
2
+ * How every media adapter talks to a provider: the request context, the provider's own headers, one
3
+ * call shape that turns a non-2xx answer into a `REMOTE_*` error, and the download of a file a
4
+ * provider pointed at. Two rules hold for every adapter:
5
+ *
6
+ * - every request to the provider goes to a URL derived from the registered `base_url` in code; the
7
+ * catalog never names a host, so it can never send a key anywhere new;
8
+ * - a file the provider points at is fetched with the provider's key and custom headers only on the
9
+ * provider's own origin; anywhere else it goes bare, and only over https.
10
+ */
11
+ import type { AtomicCoreError } from '../contracts/index.js';
12
+ import type { DiffusionErrorCode } from '../contracts/index.js';
13
+ /** A generated image larger than this is not one. */
14
+ export declare const MAX_IMAGE_BYTES: number;
15
+ /** A clip larger than this is refused rather than held in memory. */
16
+ export declare const MAX_VIDEO_BYTES: number;
17
+ /** A generation call that answers with the result (images): the slowest providers take minutes. */
18
+ export declare const GENERATE_TIMEOUT_MS: number;
19
+ /** Listing, submitting and polling. */
20
+ export declare const SHORT_TIMEOUT_MS = 60000;
21
+ /** Redirects a download may follow. */
22
+ export declare const MAX_REDIRECTS = 5;
23
+ export type MediaLog = (level: 'info' | 'warn' | 'debug', message: string) => void;
24
+ /** What every adapter call gets: who the provider is, how to reach it, and when to stop. */
25
+ export interface MediaContext {
26
+ provider: string;
27
+ /** The registered base URL without a trailing slash, e.g. `https://api.openai.com/v1`. */
28
+ baseUrl: string;
29
+ apiKey: string | null;
30
+ customHeaders: ReadonlyArray<{
31
+ header: string;
32
+ value: string;
33
+ }>;
34
+ /** Fires when the job is cancelled; every request and wait of the call stops with it. */
35
+ signal: AbortSignal;
36
+ fetch: typeof fetch;
37
+ now: () => number;
38
+ /** Waits `ms`, or rejects with `CANCELLED` when `signal` fires first. */
39
+ sleep: (ms: number) => Promise<void>;
40
+ log: MediaLog;
41
+ }
42
+ /** How a provider takes its key: `Authorization: Bearer`, Google's `x-goog-api-key`, or not at all. */
43
+ export type AuthStyle = 'bearer' | 'goog' | 'none';
44
+ export declare function remoteError(code: DiffusionErrorCode, message: string, details?: string): AtomicCoreError;
45
+ /** The base URL without a trailing slash, joined to `path` (which starts with `/`). */
46
+ export declare function joinUrl(base: string, path: string): string;
47
+ /** `scheme://host[:port]` of an absolute URL, or `undefined` when it is not one. */
48
+ export declare function originOf(url: string): string | undefined;
49
+ /** The headers of a request to the provider itself: its custom headers, then its key. */
50
+ export declare function providerHeaders(ctx: Pick<MediaContext, 'apiKey' | 'customHeaders'>, auth?: AuthStyle, extra?: Record<string, string>): Headers;
51
+ /** The provider's own words out of an error body, whatever shape it uses. */
52
+ export declare function providerMessage(body: unknown, text?: string): string | undefined;
53
+ /** A provider's non-2xx answer as the closest `REMOTE_*` code, with its words in the message. */
54
+ export declare function remoteHttpError(provider: string, status: number, body: unknown, text?: string): AtomicCoreError;
55
+ /** A request that never got an answer: cancelled, timed out, or the provider unreachable. */
56
+ export declare function networkError(ctx: Pick<MediaContext, 'provider' | 'signal'>, error: unknown): AtomicCoreError;
57
+ export interface CallOptions {
58
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
59
+ /** A JSON body. */
60
+ json?: unknown;
61
+ /** A multipart body; the boundary is set by `fetch`. */
62
+ form?: FormData;
63
+ auth?: AuthStyle;
64
+ headers?: Record<string, string>;
65
+ timeoutMs?: number;
66
+ /** Statuses outside 2xx answered as they are instead of thrown (a 202 poll, a 404 that means "gone"). */
67
+ accept?: readonly number[];
68
+ }
69
+ export interface CallAnswer {
70
+ status: number;
71
+ headers: Headers;
72
+ text: string;
73
+ /** The body as JSON, or `undefined` when it is not JSON. */
74
+ json: unknown;
75
+ }
76
+ /**
77
+ * One request to the provider. A 2xx (or a status in `accept`) is answered; anything else is thrown
78
+ * as a `REMOTE_*` error carrying the provider's words.
79
+ */
80
+ export declare function callProvider(ctx: MediaContext, url: string, options?: CallOptions): Promise<CallAnswer>;
81
+ export interface DownloadOptions {
82
+ maxBytes: number;
83
+ /** How the key goes along when the file is on the provider's own origin. */
84
+ auth?: AuthStyle;
85
+ timeoutMs?: number;
86
+ /** What the file is, for messages: `image`, `video`. */
87
+ what?: string;
88
+ }
89
+ /**
90
+ * Fetch a file the provider pointed at. Redirects are followed by hand so the key never follows one
91
+ * off the provider's origin; a URL off that origin must be https.
92
+ */
93
+ export declare function downloadResult(ctx: MediaContext, url: string, options: DownloadOptions): Promise<{
94
+ bytes: Buffer;
95
+ mime: string;
96
+ }>;
97
+ /** What the first bytes of an image say it is. */
98
+ export declare function sniffImageMime(bytes: Buffer): string | undefined;
99
+ /** What the first bytes of a clip say it is. */
100
+ export declare function sniffVideoMime(bytes: Buffer): string | undefined;
101
+ /** Base64 or a data URL as bytes and the type the bytes themselves say. */
102
+ export declare function decodeBase64Image(payload: string, what?: string): {
103
+ bytes: Buffer;
104
+ mime: string;
105
+ };
106
+ export declare function toDataUrl(bytes: Buffer, mime: string): string;
107
+ /** `'1024x768'` → its dimensions; anything else (`auto`, a tier) → `undefined`. */
108
+ export declare function parseWxH(size: string | undefined): {
109
+ width: number;
110
+ height: number;
111
+ } | undefined;
112
+ export interface PollOptions {
113
+ /** The first wait, and the wait between attempts until backoff grows it. */
114
+ intervalMs: number;
115
+ /** The wait never grows past this. */
116
+ maxIntervalMs?: number;
117
+ /** Give up with `REMOTE_TIMEOUT` after this long. */
118
+ timeoutMs: number;
119
+ }
120
+ /**
121
+ * Ask `step` until it answers something, waiting in between (growing by half each time up to
122
+ * `maxIntervalMs`). Stops with `CANCELLED` when the job is cancelled, `REMOTE_TIMEOUT` past
123
+ * `timeoutMs`. For adapters whose image API is a job to poll.
124
+ */
125
+ export declare function pollUntil<T>(ctx: MediaContext, step: () => Promise<T | undefined>, options: PollOptions): Promise<T>;
@@ -0,0 +1,308 @@
1
+ /**
2
+ * How every media adapter talks to a provider: the request context, the provider's own headers, one
3
+ * call shape that turns a non-2xx answer into a `REMOTE_*` error, and the download of a file a
4
+ * provider pointed at. Two rules hold for every adapter:
5
+ *
6
+ * - every request to the provider goes to a URL derived from the registered `base_url` in code; the
7
+ * catalog never names a host, so it can never send a key anywhere new;
8
+ * - a file the provider points at is fetched with the provider's key and custom headers only on the
9
+ * provider's own origin; anywhere else it goes bare, and only over https.
10
+ */
11
+ import { diffusionError } from '../diffusion/index.js';
12
+ /** A generated image larger than this is not one. */
13
+ export const MAX_IMAGE_BYTES = 64 * 1024 * 1024;
14
+ /** A clip larger than this is refused rather than held in memory. */
15
+ export const MAX_VIDEO_BYTES = 1024 * 1024 * 1024;
16
+ /** A generation call that answers with the result (images): the slowest providers take minutes. */
17
+ export const GENERATE_TIMEOUT_MS = 10 * 60_000;
18
+ /** Listing, submitting and polling. */
19
+ export const SHORT_TIMEOUT_MS = 60_000;
20
+ /** Redirects a download may follow. */
21
+ export const MAX_REDIRECTS = 5;
22
+ export function remoteError(code, message, details) {
23
+ return diffusionError(code, message, details);
24
+ }
25
+ /** The base URL without a trailing slash, joined to `path` (which starts with `/`). */
26
+ export function joinUrl(base, path) {
27
+ return `${base.replace(/\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
28
+ }
29
+ /** `scheme://host[:port]` of an absolute URL, or `undefined` when it is not one. */
30
+ export function originOf(url) {
31
+ try {
32
+ return new URL(url).origin;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ /** The headers of a request to the provider itself: its custom headers, then its key. */
39
+ export function providerHeaders(ctx, auth = 'bearer', extra = {}) {
40
+ const headers = new Headers();
41
+ for (const { header, value } of ctx.customHeaders)
42
+ headers.set(header, value);
43
+ const key = ctx.apiKey?.trim();
44
+ // A custom `Authorization` (basic auth in front of a self-hosted server) is the provider's own.
45
+ if (key && auth === 'bearer' && !headers.has('authorization'))
46
+ headers.set('Authorization', `Bearer ${key}`);
47
+ if (key && auth === 'goog')
48
+ headers.set('x-goog-api-key', key);
49
+ for (const [name, value] of Object.entries(extra))
50
+ headers.set(name, value);
51
+ return headers;
52
+ }
53
+ /** The provider's own words out of an error body, whatever shape it uses. */
54
+ export function providerMessage(body, text = '') {
55
+ const pick = (value) => typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;
56
+ if (body && typeof body === 'object' && !Array.isArray(body)) {
57
+ const fields = body;
58
+ const error = fields['error'];
59
+ if (error && typeof error === 'object' && !Array.isArray(error)) {
60
+ const inner = error;
61
+ const said = pick(inner['message']) ?? pick(inner['msg']);
62
+ if (said)
63
+ return said;
64
+ }
65
+ const said = pick(error) ??
66
+ pick(fields['message']) ??
67
+ pick(fields['detail']) ??
68
+ pick(fields['msg']) ??
69
+ pick(fields['status_msg']);
70
+ if (said)
71
+ return said;
72
+ const detail = fields['detail'];
73
+ if (Array.isArray(detail) && detail.length > 0) {
74
+ const first = detail[0];
75
+ const message = pick(first?.['msg']);
76
+ if (message)
77
+ return message;
78
+ }
79
+ const base = fields['base_resp'];
80
+ if (base && typeof base === 'object') {
81
+ const message = pick(base['status_msg']);
82
+ if (message)
83
+ return message;
84
+ }
85
+ }
86
+ const trimmed = text.trim();
87
+ return trimmed === '' ? undefined : trimmed.slice(0, 500);
88
+ }
89
+ const BLOCKED = /moderation|content[ _-]?polic|safety|nsfw|sensitive|prohibited|blocked by|flagged/i;
90
+ /** A provider's non-2xx answer as the closest `REMOTE_*` code, with its words in the message. */
91
+ export function remoteHttpError(provider, status, body, text = '') {
92
+ const said = providerMessage(body, text);
93
+ const details = `HTTP ${status}${said ? `: ${said}` : ''}`;
94
+ if (status === 401 || status === 403)
95
+ return remoteError('REMOTE_AUTH_FAILED', `${provider} refused the API key or the model.`, details);
96
+ if (status === 402)
97
+ return remoteError('REMOTE_QUOTA', `${provider} says the account is out of credit.`, details);
98
+ if (status === 429)
99
+ return remoteError('REMOTE_RATE_LIMITED', `${provider} is rate-limiting requests.`, details);
100
+ if (status === 408 || status === 504)
101
+ return remoteError('REMOTE_TIMEOUT', `${provider} took too long to answer.`, details);
102
+ if (status >= 500)
103
+ return remoteError('REMOTE_UNAVAILABLE', `${provider} failed to answer.`, details);
104
+ if (said && BLOCKED.test(said))
105
+ return remoteError('REMOTE_CONTENT_BLOCKED', `${provider} refused the request: ${said}`, details);
106
+ return remoteError('REMOTE_REJECTED', said ? `${provider}: ${said}` : `${provider} refused the request.`, details);
107
+ }
108
+ /** A request that never got an answer: cancelled, timed out, or the provider unreachable. */
109
+ export function networkError(ctx, error) {
110
+ if (ctx.signal.aborted)
111
+ return diffusionError('CANCELLED', 'Generation was cancelled.');
112
+ const message = error instanceof Error ? error.message : String(error);
113
+ if (error instanceof Error && (error.name === 'TimeoutError' || error.name === 'AbortError'))
114
+ return remoteError('REMOTE_TIMEOUT', `${ctx.provider} took too long to answer.`, message);
115
+ return remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} could not be reached.`, message);
116
+ }
117
+ function parseJson(text) {
118
+ if (text.trim() === '')
119
+ return undefined;
120
+ try {
121
+ return JSON.parse(text);
122
+ }
123
+ catch {
124
+ return undefined;
125
+ }
126
+ }
127
+ /** The job's signal and a timeout as one. */
128
+ function deadline(ctx, timeoutMs) {
129
+ return AbortSignal.any([ctx.signal, AbortSignal.timeout(timeoutMs)]);
130
+ }
131
+ /**
132
+ * One request to the provider. A 2xx (or a status in `accept`) is answered; anything else is thrown
133
+ * as a `REMOTE_*` error carrying the provider's words.
134
+ */
135
+ export async function callProvider(ctx, url, options = {}) {
136
+ const extra = { Accept: 'application/json', ...options.headers };
137
+ let body;
138
+ if (options.json !== undefined) {
139
+ extra['Content-Type'] = 'application/json';
140
+ body = JSON.stringify(options.json);
141
+ }
142
+ else if (options.form !== undefined)
143
+ body = options.form;
144
+ const headers = providerHeaders(ctx, options.auth ?? 'bearer', extra);
145
+ let response;
146
+ try {
147
+ response = await ctx.fetch(url, {
148
+ method: options.method ?? (body === undefined ? 'GET' : 'POST'),
149
+ headers,
150
+ ...(body === undefined ? {} : { body }),
151
+ signal: deadline(ctx, options.timeoutMs ?? SHORT_TIMEOUT_MS),
152
+ });
153
+ }
154
+ catch (error) {
155
+ throw networkError(ctx, error);
156
+ }
157
+ let text;
158
+ try {
159
+ text = await response.text();
160
+ }
161
+ catch (error) {
162
+ throw networkError(ctx, error);
163
+ }
164
+ const json = parseJson(text);
165
+ const ok = response.status >= 200 && response.status < 300;
166
+ if (!ok && !(options.accept ?? []).includes(response.status))
167
+ throw remoteHttpError(ctx.provider, response.status, json, text);
168
+ return { status: response.status, headers: response.headers, text, json };
169
+ }
170
+ /** Read a body into memory, refusing it once it passes `maxBytes`. */
171
+ async function readCapped(response, maxBytes, what) {
172
+ const declared = Number(response.headers.get('content-length') ?? '');
173
+ if (Number.isFinite(declared) && declared > maxBytes)
174
+ throw diffusionError('INVALID_OUTPUT', `The provider's ${what} is larger than the core accepts.`, `${declared} bytes`);
175
+ if (!response.body)
176
+ return Buffer.from(await response.arrayBuffer());
177
+ const chunks = [];
178
+ let total = 0;
179
+ const reader = response.body.getReader();
180
+ for (;;) {
181
+ const { done, value } = await reader.read();
182
+ if (done)
183
+ break;
184
+ total += value.byteLength;
185
+ if (total > maxBytes) {
186
+ // Not awaited: a body teed elsewhere only settles its cancel once every branch is cancelled.
187
+ void reader.cancel().catch(() => undefined);
188
+ throw diffusionError('INVALID_OUTPUT', `The provider's ${what} is larger than the core accepts.`, `over ${maxBytes} bytes`);
189
+ }
190
+ chunks.push(Buffer.from(value));
191
+ }
192
+ return Buffer.concat(chunks);
193
+ }
194
+ /**
195
+ * Fetch a file the provider pointed at. Redirects are followed by hand so the key never follows one
196
+ * off the provider's origin; a URL off that origin must be https.
197
+ */
198
+ export async function downloadResult(ctx, url, options) {
199
+ const home = originOf(ctx.baseUrl);
200
+ const what = options.what ?? 'file';
201
+ let target = url;
202
+ for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
203
+ const origin = originOf(target);
204
+ if (!origin)
205
+ throw remoteError('REMOTE_REJECTED', `${ctx.provider} pointed at an invalid ${what} URL.`, target);
206
+ const own = origin === home;
207
+ if (!own && !target.startsWith('https://'))
208
+ throw remoteError('REMOTE_REJECTED', `${ctx.provider} pointed at a ${what} over plain http.`, origin);
209
+ const headers = own ? providerHeaders(ctx, options.auth ?? 'bearer') : new Headers();
210
+ let response;
211
+ try {
212
+ response = await ctx.fetch(target, {
213
+ headers,
214
+ redirect: 'manual',
215
+ signal: deadline(ctx, options.timeoutMs ?? GENERATE_TIMEOUT_MS),
216
+ });
217
+ }
218
+ catch (error) {
219
+ throw networkError(ctx, error);
220
+ }
221
+ if (response.status >= 300 && response.status < 400) {
222
+ const next = response.headers.get('location');
223
+ await response.body?.cancel().catch(() => undefined);
224
+ if (!next)
225
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} redirected without a location.`);
226
+ target = new URL(next, target).toString();
227
+ continue;
228
+ }
229
+ if (response.status < 200 || response.status >= 300) {
230
+ const text = await response.text().catch(() => '');
231
+ throw remoteHttpError(ctx.provider, response.status, parseJson(text), text);
232
+ }
233
+ try {
234
+ const bytes = await readCapped(response, options.maxBytes, what);
235
+ return { bytes, mime: (response.headers.get('content-type') ?? '').split(';')[0]?.trim() ?? '' };
236
+ }
237
+ catch (error) {
238
+ if (error && typeof error === 'object' && 'code' in error)
239
+ throw error;
240
+ throw networkError(ctx, error);
241
+ }
242
+ }
243
+ throw remoteError('REMOTE_UNAVAILABLE', `${ctx.provider} redirected the ${what} too many times.`);
244
+ }
245
+ /** What the first bytes of an image say it is. */
246
+ export function sniffImageMime(bytes) {
247
+ if (bytes.length >= 8 &&
248
+ bytes.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])))
249
+ return 'image/png';
250
+ if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff)
251
+ return 'image/jpeg';
252
+ if (bytes.length >= 12 &&
253
+ bytes.toString('latin1', 0, 4) === 'RIFF' &&
254
+ bytes.toString('latin1', 8, 12) === 'WEBP')
255
+ return 'image/webp';
256
+ if (bytes.length >= 6 && /^GIF8[79]a$/.test(bytes.toString('latin1', 0, 6)))
257
+ return 'image/gif';
258
+ return undefined;
259
+ }
260
+ /** What the first bytes of a clip say it is. */
261
+ export function sniffVideoMime(bytes) {
262
+ if (bytes.length >= 12 && bytes.toString('latin1', 4, 8) === 'ftyp')
263
+ return 'video/mp4';
264
+ if (bytes.length >= 4 && bytes.subarray(0, 4).equals(Buffer.from([0x1a, 0x45, 0xdf, 0xa3])))
265
+ return 'video/webm';
266
+ return undefined;
267
+ }
268
+ /** Base64 or a data URL as bytes and the type the bytes themselves say. */
269
+ export function decodeBase64Image(payload, what = 'image') {
270
+ const comma = payload.startsWith('data:') ? payload.indexOf(',') : -1;
271
+ const raw = (comma >= 0 ? payload.slice(comma + 1) : payload).trim();
272
+ const bytes = Buffer.from(raw, 'base64');
273
+ const mime = sniffImageMime(bytes);
274
+ if (bytes.length === 0 || !mime)
275
+ throw diffusionError('INVALID_OUTPUT', `The provider returned a ${what} that is not an image.`);
276
+ return { bytes, mime };
277
+ }
278
+ export function toDataUrl(bytes, mime) {
279
+ return `data:${mime};base64,${bytes.toString('base64')}`;
280
+ }
281
+ /** `'1024x768'` → its dimensions; anything else (`auto`, a tier) → `undefined`. */
282
+ export function parseWxH(size) {
283
+ const match = /^(\d+)\s*[xX*]\s*(\d+)$/.exec(size?.trim() ?? '');
284
+ if (!match)
285
+ return undefined;
286
+ const width = Number(match[1]);
287
+ const height = Number(match[2]);
288
+ return width > 0 && height > 0 ? { width, height } : undefined;
289
+ }
290
+ /**
291
+ * Ask `step` until it answers something, waiting in between (growing by half each time up to
292
+ * `maxIntervalMs`). Stops with `CANCELLED` when the job is cancelled, `REMOTE_TIMEOUT` past
293
+ * `timeoutMs`. For adapters whose image API is a job to poll.
294
+ */
295
+ export async function pollUntil(ctx, step, options) {
296
+ const started = ctx.now();
297
+ let wait = options.intervalMs;
298
+ for (;;) {
299
+ const answer = await step();
300
+ if (answer !== undefined)
301
+ return answer;
302
+ if (ctx.now() - started > options.timeoutMs)
303
+ throw remoteError('REMOTE_TIMEOUT', `${ctx.provider} did not finish in time.`, `${options.timeoutMs} ms`);
304
+ await ctx.sleep(wait);
305
+ wait = Math.min(Math.round(wait * 1.5), options.maxIntervalMs ?? wait);
306
+ }
307
+ }
308
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/media/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Remote media: the image and video models cloud providers and self-hosted servers offer through the
3
+ * core (ADR 2026-10-13-remote-media-shares-the-diffusion-job-table). The catalog (conf
4
+ * `providers/media.json`), one adapter per provider media API, and the service that resolves a
5
+ * provider's model for the job runner in `src/diffusion/remote-job.ts`.
6
+ */
7
+ export * from './adapters/types.js';
8
+ export * from './catalog.js';
9
+ export * from './catalog-baseline.js';
10
+ export * from './catalog-service.js';
11
+ export * from './http.js';
12
+ export * from './mask.js';
13
+ export * from './service.js';
14
+ export * from './adapters/registry.js';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Remote media: the image and video models cloud providers and self-hosted servers offer through the
3
+ * core (ADR 2026-10-13-remote-media-shares-the-diffusion-job-table). The catalog (conf
4
+ * `providers/media.json`), one adapter per provider media API, and the service that resolves a
5
+ * provider's model for the job runner in `src/diffusion/remote-job.ts`.
6
+ */
7
+ export * from './adapters/types.js';
8
+ export * from './catalog.js';
9
+ export * from './catalog-baseline.js';
10
+ export * from './catalog-service.js';
11
+ export * from './http.js';
12
+ export * from './mask.js';
13
+ export * from './service.js';
14
+ export * from './adapters/registry.js';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/media/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Masks between the core's convention and a provider's. The Images page and the control API send a
3
+ * PNG that is white where the model repaints (sd.cpp's and Automatic1111's convention); OpenAI's
4
+ * Images API wants the opposite carrier: a transparent pixel is the one to repaint.
5
+ */
6
+ /** White-means-repaint PNG → an RGBA PNG whose alpha is 0 where the model repaints, 255 elsewhere. */
7
+ export declare function maskToAlpha(png: Buffer): Promise<Buffer>;
8
+ /**
9
+ * An OpenAI-style mask (transparent where the model repaints) → the core's white-means-repaint PNG.
10
+ * A mask without an alpha channel is taken to be white-means-repaint already and kept as it is.
11
+ */
12
+ export declare function alphaMaskToWhite(png: Buffer): Promise<Buffer>;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Masks between the core's convention and a provider's. The Images page and the control API send a
3
+ * PNG that is white where the model repaints (sd.cpp's and Automatic1111's convention); OpenAI's
4
+ * Images API wants the opposite carrier: a transparent pixel is the one to repaint.
5
+ */
6
+ import { decodePng, encodePng } from '../diffusion/index.js';
7
+ import { remoteError } from './http.js';
8
+ /** A pixel this bright (every channel) is "repaint". */
9
+ const WHITE_THRESHOLD = 128;
10
+ /** White-means-repaint PNG → an RGBA PNG whose alpha is 0 where the model repaints, 255 elsewhere. */
11
+ export async function maskToAlpha(png) {
12
+ let image;
13
+ try {
14
+ image = await decodePng(png);
15
+ }
16
+ catch (error) {
17
+ throw remoteError('REMOTE_UNSUPPORTED', 'The mask could not be read.', error instanceof Error ? error.message : String(error));
18
+ }
19
+ const { width, height, channels, data } = image;
20
+ const out = Buffer.alloc(width * height * 4);
21
+ for (let i = 0, o = 0; i < data.length; i += channels, o += 4) {
22
+ const r = data[i];
23
+ const g = data[i + 1];
24
+ const b = data[i + 2];
25
+ const repaint = r >= WHITE_THRESHOLD && g >= WHITE_THRESHOLD && b >= WHITE_THRESHOLD;
26
+ out[o] = 0;
27
+ out[o + 1] = 0;
28
+ out[o + 2] = 0;
29
+ out[o + 3] = repaint ? 0 : 255;
30
+ }
31
+ return encodePng({ width, height, channels: 4, data: out });
32
+ }
33
+ /**
34
+ * An OpenAI-style mask (transparent where the model repaints) → the core's white-means-repaint PNG.
35
+ * A mask without an alpha channel is taken to be white-means-repaint already and kept as it is.
36
+ */
37
+ export async function alphaMaskToWhite(png) {
38
+ let image;
39
+ try {
40
+ image = await decodePng(png);
41
+ }
42
+ catch (error) {
43
+ throw remoteError('REMOTE_UNSUPPORTED', 'The mask could not be read.', error instanceof Error ? error.message : String(error));
44
+ }
45
+ if (image.channels !== 4)
46
+ return png;
47
+ const { width, height, data } = image;
48
+ const out = Buffer.alloc(width * height * 3);
49
+ for (let i = 0, o = 0; i < data.length; i += 4, o += 3) {
50
+ const value = data[i + 3] < 128 ? 255 : 0;
51
+ out[o] = value;
52
+ out[o + 1] = value;
53
+ out[o + 2] = value;
54
+ }
55
+ return encodePng({ width, height, channels: 3, data: out });
56
+ }
57
+ //# sourceMappingURL=mask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/media/mask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * The remote media service: what the control routes answer (the catalog, a provider's models) and
3
+ * what the job runner resolves a target with (`RemoteMediaGateway`). A provider is usable here once
4
+ * the app registered it (`cloud.routing()`, which already drops a key bound to another URL); its
5
+ * adapter is the registration's own (a custom server) or the catalog's.
6
+ */
7
+ import type { ImageModelDescriptor, MediaCatalogView, MediaDialect, MediaKind, MediaProviderModels, MediaTarget, VideoModelDescriptor } from '../contracts/index.js';
8
+ import type { RemoteMediaGateway, ResolvedRemote } from '../diffusion/index.js';
9
+ import type { RemoteProvider } from '../router/index.js';
10
+ import type { ImageAdapter, MediaAdapter, VideoAdapter } from './adapters/types.js';
11
+ import type { MediaCatalogService } from './catalog-service.js';
12
+ import type { MediaContext, MediaLog } from './http.js';
13
+ export interface MediaServiceDeps {
14
+ catalog: MediaCatalogService;
15
+ /** The registered providers, as the router sees them. */
16
+ providers: () => ReadonlyMap<string, RemoteProvider>;
17
+ adapters: Partial<Record<MediaDialect, MediaAdapter>>;
18
+ fetch: typeof fetch;
19
+ now?: () => number;
20
+ log: MediaLog;
21
+ }
22
+ /** A wait that ends early, with `CANCELLED`, when `signal` fires. */
23
+ export declare function abortableSleep(ms: number, signal: AbortSignal): Promise<void>;
24
+ export declare class MediaService implements RemoteMediaGateway {
25
+ private readonly deps;
26
+ constructor(deps: MediaServiceDeps);
27
+ /** `GET /media/catalog`. */
28
+ catalogView(): Promise<MediaCatalogView>;
29
+ private provider;
30
+ /** A context for `provider`'s adapter calls under `signal`. */
31
+ context(provider: RemoteProvider, signal: AbortSignal): MediaContext;
32
+ private dialectOf;
33
+ private resolve;
34
+ image(target: MediaTarget): Promise<ResolvedRemote<ImageModelDescriptor, ImageAdapter>>;
35
+ video(target: MediaTarget): Promise<ResolvedRemote<VideoModelDescriptor, VideoAdapter>>;
36
+ find(model: string, kind: MediaKind): MediaTarget | undefined;
37
+ /**
38
+ * `GET /media/providers/:provider/models?kind=`: the catalog's models of the provider, then what its
39
+ * live listing adds. A listing that fails still answers the catalog's models, with the error.
40
+ */
41
+ providerModels(name: string, kind: MediaKind): Promise<MediaProviderModels>;
42
+ }