@atomic-chat/core 0.13.6 → 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 (342) 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 +5 -5
  60. package/dist/core/atomic-core.js.map +1 -1
  61. package/dist/core/create.js +43 -59
  62. package/dist/core/create.js.map +1 -1
  63. package/dist/core/managed-engines.js +2 -0
  64. package/dist/core/managed-engines.js.map +1 -1
  65. package/dist/core/prism.d.ts +21 -6
  66. package/dist/core/prism.js +44 -0
  67. package/dist/core/prism.js.map +1 -1
  68. package/dist/core/types.d.ts +0 -5
  69. package/dist/core/types.js.map +1 -1
  70. package/dist/diffusion/gallery.d.ts +24 -3
  71. package/dist/diffusion/gallery.js +151 -21
  72. package/dist/diffusion/gallery.js.map +1 -1
  73. package/dist/diffusion/index.d.ts +3 -0
  74. package/dist/diffusion/index.js +3 -0
  75. package/dist/diffusion/index.js.map +1 -1
  76. package/dist/diffusion/jobs.d.ts +6 -1
  77. package/dist/diffusion/jobs.js +6 -1
  78. package/dist/diffusion/jobs.js.map +1 -1
  79. package/dist/diffusion/media-header.d.ts +22 -0
  80. package/dist/diffusion/media-header.js +149 -0
  81. package/dist/diffusion/media-header.js.map +1 -0
  82. package/dist/diffusion/parse.d.ts +3 -1
  83. package/dist/diffusion/parse.js +36 -0
  84. package/dist/diffusion/parse.js.map +1 -1
  85. package/dist/diffusion/recipe.d.ts +10 -1
  86. package/dist/diffusion/recipe.js +85 -21
  87. package/dist/diffusion/recipe.js.map +1 -1
  88. package/dist/diffusion/remote-job.d.ts +76 -0
  89. package/dist/diffusion/remote-job.js +643 -0
  90. package/dist/diffusion/remote-job.js.map +1 -0
  91. package/dist/diffusion/remote-store.d.ts +38 -0
  92. package/dist/diffusion/remote-store.js +91 -0
  93. package/dist/diffusion/remote-store.js.map +1 -0
  94. package/dist/diffusion/service.d.ts +9 -1
  95. package/dist/diffusion/service.js +49 -9
  96. package/dist/diffusion/service.js.map +1 -1
  97. package/dist/diffusion/state.d.ts +13 -1
  98. package/dist/diffusion/state.js +8 -0
  99. package/dist/diffusion/state.js.map +1 -1
  100. package/dist/diffusion/video-gallery.d.ts +11 -4
  101. package/dist/diffusion/video-gallery.js +62 -25
  102. package/dist/diffusion/video-gallery.js.map +1 -1
  103. package/dist/diffusion/video-history.js +4 -1
  104. package/dist/diffusion/video-history.js.map +1 -1
  105. package/dist/diffusion/video-recipe.js +58 -25
  106. package/dist/diffusion/video-recipe.js.map +1 -1
  107. package/dist/diffusion/wiring.d.ts +3 -0
  108. package/dist/diffusion/wiring.js +1 -0
  109. package/dist/diffusion/wiring.js.map +1 -1
  110. package/dist/downloads/downloader.d.ts +1 -18
  111. package/dist/downloads/downloader.js +1 -45
  112. package/dist/downloads/downloader.js.map +1 -1
  113. package/dist/media/adapters/a1111.d.ts +32 -0
  114. package/dist/media/adapters/a1111.js +207 -0
  115. package/dist/media/adapters/a1111.js.map +1 -0
  116. package/dist/media/adapters/aimlapi-videos.d.ts +34 -0
  117. package/dist/media/adapters/aimlapi-videos.js +172 -0
  118. package/dist/media/adapters/aimlapi-videos.js.map +1 -0
  119. package/dist/media/adapters/dashscope-image.d.ts +26 -0
  120. package/dist/media/adapters/dashscope-image.js +160 -0
  121. package/dist/media/adapters/dashscope-image.js.map +1 -0
  122. package/dist/media/adapters/dashscope-video.d.ts +47 -0
  123. package/dist/media/adapters/dashscope-video.js +251 -0
  124. package/dist/media/adapters/dashscope-video.js.map +1 -0
  125. package/dist/media/adapters/gemini-image.d.ts +27 -0
  126. package/dist/media/adapters/gemini-image.js +181 -0
  127. package/dist/media/adapters/gemini-image.js.map +1 -0
  128. package/dist/media/adapters/gemini-veo.d.ts +39 -0
  129. package/dist/media/adapters/gemini-veo.js +196 -0
  130. package/dist/media/adapters/gemini-veo.js.map +1 -0
  131. package/dist/media/adapters/hf-images.d.ts +85 -0
  132. package/dist/media/adapters/hf-images.js +439 -0
  133. package/dist/media/adapters/hf-images.js.map +1 -0
  134. package/dist/media/adapters/hf-videos.d.ts +44 -0
  135. package/dist/media/adapters/hf-videos.js +265 -0
  136. package/dist/media/adapters/hf-videos.js.map +1 -0
  137. package/dist/media/adapters/minimax-image.d.ts +26 -0
  138. package/dist/media/adapters/minimax-image.js +111 -0
  139. package/dist/media/adapters/minimax-image.js.map +1 -0
  140. package/dist/media/adapters/minimax-video-v2.d.ts +34 -0
  141. package/dist/media/adapters/minimax-video-v2.js +191 -0
  142. package/dist/media/adapters/minimax-video-v2.js.map +1 -0
  143. package/dist/media/adapters/minimax-video.d.ts +28 -0
  144. package/dist/media/adapters/minimax-video.js +155 -0
  145. package/dist/media/adapters/minimax-video.js.map +1 -0
  146. package/dist/media/adapters/mistral-agent-image.d.ts +33 -0
  147. package/dist/media/adapters/mistral-agent-image.js +108 -0
  148. package/dist/media/adapters/mistral-agent-image.js.map +1 -0
  149. package/dist/media/adapters/nvidia-genai.d.ts +28 -0
  150. package/dist/media/adapters/nvidia-genai.js +182 -0
  151. package/dist/media/adapters/nvidia-genai.js.map +1 -0
  152. package/dist/media/adapters/openai-images.d.ts +23 -0
  153. package/dist/media/adapters/openai-images.js +164 -0
  154. package/dist/media/adapters/openai-images.js.map +1 -0
  155. package/dist/media/adapters/openai-videos.d.ts +34 -0
  156. package/dist/media/adapters/openai-videos.js +175 -0
  157. package/dist/media/adapters/openai-videos.js.map +1 -0
  158. package/dist/media/adapters/openrouter-images.d.ts +25 -0
  159. package/dist/media/adapters/openrouter-images.js +161 -0
  160. package/dist/media/adapters/openrouter-images.js.map +1 -0
  161. package/dist/media/adapters/openrouter-videos.d.ts +43 -0
  162. package/dist/media/adapters/openrouter-videos.js +208 -0
  163. package/dist/media/adapters/openrouter-videos.js.map +1 -0
  164. package/dist/media/adapters/registry.d.ts +7 -0
  165. package/dist/media/adapters/registry.js +45 -0
  166. package/dist/media/adapters/registry.js.map +1 -0
  167. package/dist/media/adapters/types.d.ts +133 -0
  168. package/dist/media/adapters/types.js +15 -0
  169. package/dist/media/adapters/types.js.map +1 -0
  170. package/dist/media/adapters/xai-images.d.ts +19 -0
  171. package/dist/media/adapters/xai-images.js +83 -0
  172. package/dist/media/adapters/xai-images.js.map +1 -0
  173. package/dist/media/adapters/xai-videos.d.ts +29 -0
  174. package/dist/media/adapters/xai-videos.js +148 -0
  175. package/dist/media/adapters/xai-videos.js.map +1 -0
  176. package/dist/media/catalog-baseline.d.ts +2 -0
  177. package/dist/media/catalog-baseline.js +10 -0
  178. package/dist/media/catalog-baseline.js.map +1 -0
  179. package/dist/media/catalog-baseline.json +1819 -0
  180. package/dist/media/catalog-service.d.ts +42 -0
  181. package/dist/media/catalog-service.js +111 -0
  182. package/dist/media/catalog-service.js.map +1 -0
  183. package/dist/media/catalog.d.ts +50 -0
  184. package/dist/media/catalog.js +315 -0
  185. package/dist/media/catalog.js.map +1 -0
  186. package/dist/media/http.d.ts +125 -0
  187. package/dist/media/http.js +308 -0
  188. package/dist/media/http.js.map +1 -0
  189. package/dist/media/index.d.ts +14 -0
  190. package/dist/media/index.js +15 -0
  191. package/dist/media/index.js.map +1 -0
  192. package/dist/media/mask.d.ts +12 -0
  193. package/dist/media/mask.js +57 -0
  194. package/dist/media/mask.js.map +1 -0
  195. package/dist/media/service.d.ts +42 -0
  196. package/dist/media/service.js +144 -0
  197. package/dist/media/service.js.map +1 -0
  198. package/dist/models/hf.d.ts +3 -16
  199. package/dist/models/hf.js +4 -42
  200. package/dist/models/hf.js.map +1 -1
  201. package/dist/router/resolve.d.ts +15 -4
  202. package/dist/router/resolve.js +25 -3
  203. package/dist/router/resolve.js.map +1 -1
  204. package/dist/runtime/environment/linux-provisioner.js +7 -67
  205. package/dist/runtime/environment/linux-provisioner.js.map +1 -1
  206. package/dist/runtime/environment/runtime-removal-plan.d.ts +19 -0
  207. package/dist/runtime/environment/runtime-removal-plan.js +74 -0
  208. package/dist/runtime/environment/runtime-removal-plan.js.map +1 -0
  209. package/dist/runtime/environment/windows-provisioner.js +20 -4
  210. package/dist/runtime/environment/windows-provisioner.js.map +1 -1
  211. package/dist/runtime/managed-engines/spec.d.ts +2 -2
  212. package/dist/runtime/managed-engines/spec.js +6 -0
  213. package/dist/runtime/managed-engines/spec.js.map +1 -1
  214. package/dist/runtime/managed-models/compatibility.d.ts +10 -0
  215. package/dist/runtime/managed-models/compatibility.js +18 -0
  216. package/dist/runtime/managed-models/compatibility.js.map +1 -1
  217. package/dist/runtime/managed-text/request-rules.d.ts +9 -7
  218. package/dist/runtime/managed-text/request-rules.js +58 -2
  219. package/dist/runtime/managed-text/request-rules.js.map +1 -1
  220. package/dist/runtime/managed-text/setting-values.d.ts +9 -0
  221. package/dist/runtime/managed-text/setting-values.js +44 -0
  222. package/dist/runtime/managed-text/setting-values.js.map +1 -0
  223. package/dist/runtime/sglang/adapter.d.ts +50 -0
  224. package/dist/runtime/sglang/adapter.js +393 -0
  225. package/dist/runtime/sglang/adapter.js.map +1 -0
  226. package/dist/runtime/sglang/engine.d.ts +16 -0
  227. package/dist/runtime/sglang/engine.js +38 -0
  228. package/dist/runtime/sglang/engine.js.map +1 -0
  229. package/dist/runtime/sglang/index.d.ts +11 -0
  230. package/dist/runtime/sglang/index.js +12 -0
  231. package/dist/runtime/sglang/index.js.map +1 -0
  232. package/dist/runtime/sglang/memory.d.ts +64 -0
  233. package/dist/runtime/sglang/memory.js +90 -0
  234. package/dist/runtime/sglang/memory.js.map +1 -0
  235. package/dist/runtime/sglang/settings.d.ts +49 -0
  236. package/dist/runtime/sglang/settings.js +118 -0
  237. package/dist/runtime/sglang/settings.js.map +1 -0
  238. package/dist/runtime/shared/external-sessions.js +1 -0
  239. package/dist/runtime/shared/external-sessions.js.map +1 -1
  240. package/dist/runtime/vllm/adapter.js +2 -47
  241. package/dist/runtime/vllm/adapter.js.map +1 -1
  242. package/dist/runtime/vllm/memory.js +3 -16
  243. package/dist/runtime/vllm/memory.js.map +1 -1
  244. package/dist/runtime/vllm/settings.d.ts +7 -0
  245. package/dist/runtime/vllm/settings.js +2 -30
  246. package/dist/runtime/vllm/settings.js.map +1 -1
  247. package/dist/server/control/router.js +4 -3
  248. package/dist/server/control/router.js.map +1 -1
  249. package/dist/server/control/routes/media.d.ts +9 -0
  250. package/dist/server/control/routes/media.js +24 -0
  251. package/dist/server/control/routes/media.js.map +1 -0
  252. package/dist/server/control/routes/model-compatibility.d.ts +9 -0
  253. package/dist/server/control/routes/model-compatibility.js +31 -0
  254. package/dist/server/control/routes/model-compatibility.js.map +1 -0
  255. package/dist/server/control/types.d.ts +14 -20
  256. package/dist/server/control/types.js.map +1 -1
  257. package/dist/server/http.js +15 -2
  258. package/dist/server/http.js.map +1 -1
  259. package/dist/server/public/images-params.js +18 -1
  260. package/dist/server/public/images-params.js.map +1 -1
  261. package/dist/server/public/images.d.ts +11 -2
  262. package/dist/server/public/images.js +73 -9
  263. package/dist/server/public/images.js.map +1 -1
  264. package/dist/server/public/index.js +7 -1
  265. package/dist/server/public/index.js.map +1 -1
  266. package/dist/server/public/listing.js +1 -0
  267. package/dist/server/public/listing.js.map +1 -1
  268. package/dist/server/public/remote-media.d.ts +51 -0
  269. package/dist/server/public/remote-media.js +225 -0
  270. package/dist/server/public/remote-media.js.map +1 -0
  271. package/dist/server/public/responses.js +4 -2
  272. package/dist/server/public/responses.js.map +1 -1
  273. package/dist/server/public/static-assets.generated.js +1 -1
  274. package/dist/server/public/static-assets.generated.js.map +1 -1
  275. package/dist/server/public/trace.js +2 -0
  276. package/dist/server/public/trace.js.map +1 -1
  277. package/dist/server/public/types.d.ts +5 -1
  278. package/dist/server/public/videos-params.js +13 -3
  279. package/dist/server/public/videos-params.js.map +1 -1
  280. package/dist/server/public/videos.d.ts +1 -0
  281. package/dist/server/public/videos.js +21 -3
  282. package/dist/server/public/videos.js.map +1 -1
  283. package/dist/settings/schema/llamacpp-upstream.json +9 -0
  284. package/dist/settings/schema/sglang.json +251 -0
  285. package/dist/settings/schema.js +27 -1
  286. package/dist/settings/schema.js.map +1 -1
  287. package/dist/version.d.ts +1 -1
  288. package/dist/version.js +1 -1
  289. package/package.json +1 -5
  290. package/src/settings/schema/llamacpp-upstream.json +9 -0
  291. package/src/settings/schema/sglang.json +251 -0
  292. package/dist/backend/catalog/bundled-manifest-baseline.d.ts +0 -2
  293. package/dist/backend/catalog/bundled-manifest-baseline.js +0 -65
  294. package/dist/backend/catalog/bundled-manifest-baseline.js.map +0 -1
  295. package/dist/contracts/model-setup.d.ts +0 -115
  296. package/dist/contracts/model-setup.js +0 -33
  297. package/dist/contracts/model-setup.js.map +0 -1
  298. package/dist/core/model-setup/index.d.ts +0 -4
  299. package/dist/core/model-setup/index.js +0 -5
  300. package/dist/core/model-setup/index.js.map +0 -1
  301. package/dist/core/model-setup/plan.d.ts +0 -56
  302. package/dist/core/model-setup/plan.js +0 -158
  303. package/dist/core/model-setup/plan.js.map +0 -1
  304. package/dist/core/model-setup/service.d.ts +0 -92
  305. package/dist/core/model-setup/service.js +0 -329
  306. package/dist/core/model-setup/service.js.map +0 -1
  307. package/dist/core/model-setup/store.d.ts +0 -29
  308. package/dist/core/model-setup/store.js +0 -116
  309. package/dist/core/model-setup/store.js.map +0 -1
  310. package/dist/core/model-setup/wiring.d.ts +0 -59
  311. package/dist/core/model-setup/wiring.js +0 -132
  312. package/dist/core/model-setup/wiring.js.map +0 -1
  313. package/dist/core/tensorrt-llm.d.ts +0 -169
  314. package/dist/core/tensorrt-llm.js +0 -428
  315. package/dist/core/tensorrt-llm.js.map +0 -1
  316. package/dist/downloads/segmented.d.ts +0 -40
  317. package/dist/downloads/segmented.js +0 -170
  318. package/dist/downloads/segmented.js.map +0 -1
  319. package/dist/runtime/tensorrt-llm/delete.d.ts +0 -15
  320. package/dist/runtime/tensorrt-llm/delete.js +0 -60
  321. package/dist/runtime/tensorrt-llm/delete.js.map +0 -1
  322. package/dist/runtime/tensorrt-llm/guest-files.d.ts +0 -8
  323. package/dist/runtime/tensorrt-llm/guest-files.js +0 -49
  324. package/dist/runtime/tensorrt-llm/guest-files.js.map +0 -1
  325. package/dist/runtime/tensorrt-llm/location.d.ts +0 -20
  326. package/dist/runtime/tensorrt-llm/location.js +0 -48
  327. package/dist/runtime/tensorrt-llm/location.js.map +0 -1
  328. package/dist/runtime/tensorrt-llm/model-dir.d.ts +0 -38
  329. package/dist/runtime/tensorrt-llm/model-dir.js +0 -137
  330. package/dist/runtime/tensorrt-llm/model-dir.js.map +0 -1
  331. package/dist/runtime/tensorrt-llm/quant-format.d.ts +0 -65
  332. package/dist/runtime/tensorrt-llm/quant-format.js +0 -189
  333. package/dist/runtime/tensorrt-llm/quant-format.js.map +0 -1
  334. package/dist/runtime/tensorrt-llm/registry.d.ts +0 -26
  335. package/dist/runtime/tensorrt-llm/registry.js +0 -68
  336. package/dist/runtime/tensorrt-llm/registry.js.map +0 -1
  337. package/dist/runtime/tensorrt-llm/runtime.d.ts +0 -130
  338. package/dist/runtime/tensorrt-llm/runtime.js +0 -395
  339. package/dist/runtime/tensorrt-llm/runtime.js.map +0 -1
  340. package/dist/server/control/routes/model-setups.d.ts +0 -11
  341. package/dist/server/control/routes/model-setups.js +0 -55
  342. package/dist/server/control/routes/model-setups.js.map +0 -1
@@ -1,428 +0,0 @@
1
- /**
2
- * Composition of the `tensorrt-llm` provider for `create.ts` (task 2.14): offered only on Linux, on
3
- * the managed-text lifecycle built over the core's one Docker executor and journal — the startup
4
- * handle the managed environment (task 2.6) wires, reconciles and hands its setup and removal too,
5
- * never a second pair — the desktop deployment, this scope's managed paths,
6
- * `selinuxDataRoot = <data>`, and the public server's live trusted-hosts array.
7
- *
8
- * What it shares with the managed environment rather than duplicating: the installation records
9
- * (`InstallationStore`, the one reader of that format), the Linux machine (`LinuxHost`, which is the
10
- * `ATOMIC_MANAGED_TEST_HOST` stand-in machine in the e2e suite, so that hook is read in one place),
11
- * and, the other way round, `unloadEngineSessions`: a removal of the engine holds its loads off and
12
- * unloads its loaded model first, through `tensorrtLlmSessionUnloader` and the facade's own unload.
13
- *
14
- * `wireTensorrtLlmModelCheck` (task 2.16) composes `POST /models/tensorrt-llm/check`'s deps
15
- * separately from the runtime above: it shares the installation records, the descriptor provider and
16
- * `LinuxHost.probeDeps`, but deliberately never touches `containers`/Docker (`check.ts`'s own file
17
- * banner explains why) and is offered even when the runtime itself would refuse every load.
18
- *
19
- * `tensorrtLlmModelDeleter` (task 2.24) is `DELETE /models/tensorrt-llm/:id`: the same hold-and-unload
20
- * through the facade as the engine removal's unloader, for one model, then its files.
21
- */
22
- import { AtomicCoreError } from '../contracts/index.js';
23
- import { RECONCILE_BUDGET_MS, RECONCILE_CALL_TIMEOUT_MS, RECONCILE_STARTUP_STOP_TIMEOUT_SECONDS, createDockerExec, guestRealpath, reconcileExecutions, } from '../runtime/container/index.js';
24
- import { guestProbeDeps, localhostForwardingError, parseWslConfig, TENSORRT_LLM_ENGINE_ID, } from '../runtime/environment/index.js';
25
- import { ManagedTextAdapterRegistry, ManagedTextLifecycle, createDesktopManagedDeployment, createWslManagedDeployment, } from '../runtime/managed-text/index.js';
26
- import { TensorrtLlmModelRegistry, TensorrtLlmRuntime, checkTensorrtLlmModel, containerPlatformFor, deleteTensorrtLlmModelFiles, guestModelFiles, guestModelsRoot, linuxModelLocation, probeTensorrtLlmGpus, probeTensorrtLlmGpusAndMemory, probeTensorrtLlmHost, readTensorrtLlmModel, resolveReadyInstallation, tensorrtLlmAdapter, windowsModelLocation, } from '../runtime/tensorrt-llm/index.js';
27
- import { ensureGuestScope, guestScopePaths, WSL_LOCALHOST_MOUNT, } from '../runtime/wsl/index.js';
28
- /** The recorded distribution and its transport; null before the import. */
29
- async function windowsDistribution(context) {
30
- const record = await context.records.read();
31
- return record === null ? null : { record, transport: context.wsl.distribution(record.distribution.name) };
32
- }
33
- async function windowsGuest(context, layout) {
34
- const record = await context.records.read();
35
- if (record === null)
36
- return null;
37
- const name = record.distribution.name;
38
- const key = await context.scopeKey();
39
- return {
40
- record,
41
- transport: context.wsl.distribution(name),
42
- key,
43
- paths: guestScopePaths(layout.managed, name, key, context.mount),
44
- modelsRoot: (context.mount ?? WSL_LOCALHOST_MOUNT).hostPath(name, guestModelsRoot(key)),
45
- };
46
- }
47
- const notImported = () => new AtomicCoreError('MANAGED_ADAPTER_UNAVAILABLE', 'TensorRT-LLM runs in Atomic Chat’s WSL distribution, which is not set up on this computer yet.');
48
- /** Windows on x64 only: no WSL GPU path for ARM (spec `tensorrt-llm-desktop`). */
49
- const windowsX64 = (platform, arch, context) => platform === 'win32' && arch === 'x64' && context !== undefined;
50
- /** The provider, or null where it is not offered: everywhere but Linux and Windows x64. */
51
- export function wireTensorrtLlm(options) {
52
- if (options.windows !== undefined && windowsX64(options.platform, options.arch, options.windows)) {
53
- return wireWindowsTensorrtLlm(options, options.windows);
54
- }
55
- if (options.platform !== 'linux')
56
- return null;
57
- const adapters = new ManagedTextAdapterRegistry();
58
- adapters.register(tensorrtLlmAdapter);
59
- const deployment = createDesktopManagedDeployment();
60
- /** The lifecycle and the executor it was built over: the load path's probe asks the same one. */
61
- let built = null;
62
- // Asked at every load, through the handle: a host with no docker CLI when core started gets one
63
- // from the setup's privileged step, and the next load finds it (the handle wires it then).
64
- const lifecycle = async () => {
65
- if (built !== null)
66
- return built.lifecycle;
67
- const containers = await options.containers.resolve();
68
- if (containers === null)
69
- return null;
70
- // Two loads that raced here built nothing twice: the first to resume assigns, the second reuses.
71
- built ??= {
72
- exec: containers.exec,
73
- lifecycle: new ManagedTextLifecycle({
74
- provider: 'tensorrt-llm',
75
- adapters,
76
- exec: containers.exec,
77
- deployment,
78
- journal: containers.journal,
79
- paths: options.layout.managed,
80
- instanceId: options.instanceId,
81
- scope: options.scope,
82
- allowedHosts: options.trustedHosts,
83
- selinuxDataRoot: options.layout.root,
84
- emit: options.emit,
85
- log: options.log,
86
- ...(options.containerUser === null ? {} : { containerUser: options.containerUser }),
87
- }),
88
- };
89
- return built.lifecycle;
90
- };
91
- const platform = containerPlatformFor(options.arch);
92
- return new TensorrtLlmRuntime({
93
- lifecycle,
94
- readyInstallation: () => resolveReadyInstallation({
95
- installations: options.installations,
96
- descriptors: options.descriptors,
97
- platform,
98
- }),
99
- // Probed fresh at every load, never read off the environment snapshot: that view is only as new
100
- // as the last setup or removal probe (and empty after a restart), while a card can disappear
101
- // between two loads (spec "Выбранная карта исчезла"). An unanswered `docker info` refuses the load.
102
- // Through the lifecycle's own executor: `TensorrtLlmRuntime` asks for host facts only once the
103
- // lifecycle resolved, so it is always there (final review T-288 removed a dead fallback).
104
- hostFacts: () => probeTensorrtLlmHost({
105
- exec: options.host.probeDeps.exec,
106
- docker: built.exec,
107
- nvidiaSmi: 'nvidia-smi',
108
- readFile: options.host.probeDeps.readFile,
109
- }),
110
- model: (modelId) => readTensorrtLlmModel(options.layout.provider('tensorrt-llm').modelsDir, modelId),
111
- settings: options.settings,
112
- ...(options.claimGpu ? { claimGpu: options.claimGpu } : {}),
113
- });
114
- }
115
- /**
116
- * The Windows provider (change `add-tensorrt-llm-windows`, tasks 2.6–2.8): the same lifecycle and
117
- * runtime as Linux, over the WSL guest — the core's one executor (the guest's docker, from the handle),
118
- * this scope's folder in the guest for heartbeats, caches and the watchdog, the WSL deployment (a port
119
- * Docker picks, forwarding checked), `realpath` in the guest, uid 1000 for the container, the
120
- * distribution held while a model loads or is loaded; the host facts of a load read in the guest
121
- * (its `nvidia-smi`, the VM's memory); models under the scope's guest root.
122
- */
123
- function wireWindowsTensorrtLlm(options, context) {
124
- const adapters = new ManagedTextAdapterRegistry();
125
- adapters.register(tensorrtLlmAdapter);
126
- let built = null;
127
- const lifecycle = async () => {
128
- if (built !== null)
129
- return built.lifecycle;
130
- const guest = await windowsGuest(context, options.layout);
131
- if (guest === null)
132
- throw notImported();
133
- const containers = await options.containers.resolve();
134
- if (containers === null)
135
- return null;
136
- await ensureGuestScope(guest.transport, guest.key);
137
- const deployment = windowsDeployment(context, guest, containers.exec);
138
- const name = guest.record.distribution.name;
139
- built ??= {
140
- exec: containers.exec,
141
- guest,
142
- lifecycle: new ManagedTextLifecycle({
143
- provider: 'tensorrt-llm',
144
- adapters,
145
- exec: containers.exec,
146
- deployment,
147
- journal: containers.journal,
148
- paths: guest.paths,
149
- instanceId: options.instanceId,
150
- scope: options.scope,
151
- allowedHosts: options.trustedHosts,
152
- // SELinux is not enforcing in Atomic Chat's Ubuntu guest; never used, but must be in the guest.
153
- selinuxDataRoot: guest.paths.root,
154
- emit: options.emit,
155
- log: options.log,
156
- createContainerDeps: { realpath: guestRealpath(guest.transport) },
157
- containerUser: { uid: 1000, gid: 1000 },
158
- keeper: context.keeper(name),
159
- }),
160
- };
161
- return built.lifecycle;
162
- };
163
- const platform = containerPlatformFor(options.arch);
164
- return new TensorrtLlmRuntime({
165
- lifecycle,
166
- readyInstallation: () => resolveReadyInstallation({
167
- installations: options.installations,
168
- descriptors: options.descriptors,
169
- platform,
170
- }),
171
- hostFacts: () => {
172
- const current = built;
173
- const deps = guestProbeDeps(current.guest.transport);
174
- return probeTensorrtLlmHost({
175
- exec: deps.exec,
176
- docker: current.exec,
177
- nvidiaSmi: 'nvidia-smi',
178
- readFile: deps.readFile,
179
- });
180
- },
181
- model: async (modelId) => {
182
- const guest = await windowsGuest(context, options.layout);
183
- if (guest === null)
184
- throw notImported();
185
- return readTensorrtLlmModel(guest.modelsRoot, modelId);
186
- },
187
- settings: options.settings,
188
- ...(options.claimGpu ? { claimGpu: options.claimGpu } : {}),
189
- });
190
- }
191
- /**
192
- * The WSL deployment of one guest (task 2.7): its mounts through the context's mount, the engine probed
193
- * inside the guest as root, and the forwarding error built from `.wslconfig` as it reads at that moment.
194
- */
195
- export function windowsDeployment(context, guest, exec) {
196
- return createWslManagedDeployment({
197
- distribution: guest.record.distribution.name,
198
- ...(context.mount === undefined ? {} : { mount: context.mount }),
199
- exec,
200
- runInGuest: (argv) => guest.transport.exec(argv, { user: 'root', timeoutMs: 10_000 }),
201
- forwardingError: async () => localhostForwardingError(parseWslConfig(await context.host.probeDeps.readWslConfig().catch(() => null))),
202
- });
203
- }
204
- /** The retried reconcile's executor where the wired one already is the guest's (Windows). */
205
- export const wiredExec = (wired) => wired.exec;
206
- /**
207
- * `GET /models/tensorrt-llm/location` (change `add-tensorrt-llm-windows`, task 2.8): `<data>/tensorrt-llm/models`
208
- * on Linux; the scope's folder in the WSL guest on Windows (`MANAGED_ADAPTER_UNAVAILABLE` before the import).
209
- */
210
- export function tensorrtLlmModelLocation(platform, layout, windows) {
211
- if (platform === 'win32' && windows !== undefined) {
212
- return () => windowsModelLocation({
213
- records: windows.records,
214
- scopeKey: windows.scopeKey,
215
- transport: (name) => windows.wsl.distribution(name),
216
- volumeFreeBytes: (path) => windows.host.freeDiskBytes(path),
217
- ...(windows.mount === undefined ? {} : { mount: windows.mount }),
218
- });
219
- }
220
- return () => linuxModelLocation(layout.provider('tensorrt-llm').modelsDir);
221
- }
222
- /** The `tensorrt-llm` model registry: the data folder's root on Linux, the guest root (once it exists) on Windows. */
223
- export function tensorrtLlmModelRegistry(platform, layout, windows) {
224
- if (platform === 'win32' && windows !== undefined) {
225
- return new TensorrtLlmModelRegistry(async () => (await windowsGuest(windows, layout))?.modelsRoot ?? null);
226
- }
227
- return new TensorrtLlmModelRegistry(layout.provider('tensorrt-llm').modelsDir);
228
- }
229
- /** `windowsModelFiles` bound to one context and layout: the deleter's `windowsFiles` on Windows. */
230
- export function windowsModelFilesFor(windows, layout) {
231
- return () => windowsModelFiles(windows, layout);
232
- }
233
- /** Windows: where a model's files and caches are, and how to size and remove them (in the guest). */
234
- export async function windowsModelFiles(windows, layout) {
235
- const guest = await windowsGuest(windows, layout);
236
- if (guest === null)
237
- throw notImported();
238
- return { paths: guest.paths, files: guestModelFiles(guest.transport, windows.mount) };
239
- }
240
- /**
241
- * `POST /models/tensorrt-llm/check` (task 2.16): `null` off Linux, where the provider is not offered
242
- * at all. Available even when the engine is not installed yet — the check falls back to the latest
243
- * cached descriptor itself (`check.ts`) — and never asks Docker anything, unlike `wireTensorrtLlm`'s
244
- * own `hostFacts` above.
245
- */
246
- export function wireTensorrtLlmModelCheck(platform, options) {
247
- const windows = options.windows;
248
- if (windows !== undefined && windowsX64(platform, options.arch ?? 'x64', windows)) {
249
- return (body) => checkTensorrtLlmModel(body, {
250
- installations: options.installations,
251
- descriptors: options.descriptors,
252
- // The guest's cards and the WSL VM's memory once the distribution exists (design D11); before
253
- // that, the cards Windows sees, with no memory to compare against.
254
- hostFacts: async () => {
255
- const guest = await windowsDistribution(windows);
256
- if (guest === null) {
257
- const gpus = await probeTensorrtLlmGpus({
258
- exec: windows.host.probeDeps.exec,
259
- nvidiaSmi: `${windows.host.probeDeps.systemRoot}\\System32\\nvidia-smi.exe`,
260
- });
261
- return { gpus, memory: { availableBytes: 0, totalBytes: 0 } };
262
- }
263
- const deps = guestProbeDeps(guest.transport);
264
- return probeTensorrtLlmGpusAndMemory({
265
- exec: deps.exec,
266
- nvidiaSmi: 'nvidia-smi',
267
- readFile: deps.readFile,
268
- });
269
- },
270
- settings: options.settings,
271
- wslVm: async () => ({
272
- memory_setting: parseWslConfig(await windows.host.probeDeps.readWslConfig().catch(() => null))
273
- .memory,
274
- }),
275
- });
276
- }
277
- if (platform !== 'linux')
278
- return null;
279
- return (body) => checkTensorrtLlmModel(body, {
280
- installations: options.installations,
281
- descriptors: options.descriptors,
282
- hostFacts: () => probeTensorrtLlmGpusAndMemory({
283
- exec: options.host.probeDeps.exec,
284
- nvidiaSmi: 'nvidia-smi',
285
- readFile: options.host.probeDeps.readFile,
286
- }),
287
- settings: options.settings,
288
- });
289
- }
290
- /**
291
- * What GPU residency must see of the containers a previous core left (task 2.15; carry-forward from
292
- * 2.12/2.14): startup reconcile could not confirm them stopped — the stop went unconfirmed, a docker
293
- * call failed, or its time budget ran out — so they may still be running and holding a GPU. Which one
294
- * is not recorded, so each holds every card, as `stop-unconfirmed`, under its engine id and container
295
- * id, with the remedy a refusal names. Evicting one runs the reconcile again, bounded like the startup
296
- * one (a short deadline per docker call, a short `--time`, a total budget), over this scope's journal
297
- * only — this instance's own records are never touched — and it is released only once Docker confirms
298
- * it gone.
299
- */
300
- export function leftoverContainers(options) {
301
- let latest = null;
302
- const unresolved = (result) => [
303
- ...result.unconfirmed,
304
- ...result.failed,
305
- ...result.skipped,
306
- ];
307
- const boundedExec = options.exec ??
308
- ((wired) => createDockerExec({
309
- dockerPath: wired.dockerPath,
310
- dockerConfigDir: options.dockerConfigDir,
311
- timeoutMs: RECONCILE_CALL_TIMEOUT_MS,
312
- }));
313
- const retry = async (wired) => {
314
- const budget = new AbortController();
315
- const budgetMs = options.budgetMs ?? RECONCILE_BUDGET_MS;
316
- if (budgetMs <= 0)
317
- budget.abort();
318
- const timer = setTimeout(() => budget.abort(), Math.max(budgetMs, 0));
319
- timer.unref?.();
320
- try {
321
- return await reconcileExecutions(wired.journal, options.instanceId, boundedExec(wired), options.log, RECONCILE_STARTUP_STOP_TIMEOUT_SECONDS, budget.signal);
322
- }
323
- finally {
324
- clearTimeout(timer);
325
- }
326
- };
327
- return () => {
328
- const wired = options.containers.current();
329
- if (wired === null)
330
- return [];
331
- return unresolved(latest ?? wired.reconciled).map((record) => ({
332
- provider: record.engine_id,
333
- model_id: record.container_id,
334
- cards: 'all',
335
- auxiliary: false,
336
- state: 'stop-unconfirmed',
337
- remedy: `Start Docker, or remove container ${record.container_id} yourself ` +
338
- `(docker rm -f ${record.container_id}); the next load retries the stop.`,
339
- evict: async () => {
340
- latest = await retry(wired);
341
- if (unresolved(latest).some((left) => left.container_id === record.container_id)) {
342
- throw new Error(`Docker did not confirm container ${record.container_id} stopped.`);
343
- }
344
- },
345
- }));
346
- };
347
- }
348
- /**
349
- * The managed environment's `unloadEngineSessions` (spec "Удаление при загруженной модели"): before
350
- * a removal touches the engine's image, loads of `tensorrt-llm` are held off (`holdOffLoads`) and
351
- * every model holding a card is unloaded with its container's stop confirmed — through the facade's
352
- * own `unload`, as a client's unload or GPU residency would, so each model's cross-process claim is
353
- * released and a load still pending is cancelled rather than queued behind (final review M-1). The
354
- * hold lasts until the removal calls `release`. An unconfirmed stop rejects with
355
- * `MANAGED_STOP_UNCONFIRMED`, which fails the removal with nothing removed, and lifts the hold at
356
- * once. `runtime` and `sessions` are read at removal time: the provider is registered after the
357
- * environment is wired, and the facade after both.
358
- */
359
- export function tensorrtLlmSessionUnloader(runtime, sessions) {
360
- return async (engineId) => {
361
- if (engineId !== TENSORRT_LLM_ENGINE_ID)
362
- return { unloaded: 0 };
363
- const provider = runtime();
364
- if (!(provider instanceof TensorrtLlmRuntime))
365
- return { unloaded: 0 };
366
- const release = provider.holdOffLoads();
367
- try {
368
- const facade = sessions();
369
- const models = provider.residentModels();
370
- for (const modelId of models) {
371
- facade.cancelLoad(TENSORRT_LLM_ENGINE_ID, modelId);
372
- const result = await facade.unload(TENSORRT_LLM_ENGINE_ID, modelId);
373
- if (!result.success) {
374
- throw new AtomicCoreError('MANAGED_STOP_UNCONFIRMED', result.error ?? `The unload of ${modelId} failed.`, modelId);
375
- }
376
- }
377
- return { unloaded: models.length, release };
378
- }
379
- catch (error) {
380
- release();
381
- throw error;
382
- }
383
- };
384
- }
385
- /**
386
- * `DELETE /models/tensorrt-llm/:id` (task 2.24, design D12a, spec `tensorrt-llm-models` "Модель
387
- * удаляется через core"). The id must be one the registry lists — exactly, never percent-decoded or
388
- * resolved as a path — else `MODEL_NOT_FOUND`: a client's wrong id is an error, not a success. Loads
389
- * of that model are held off for the whole deletion; a load in flight is cancelled and the model
390
- * unloaded through the facade, as a client's unload would be, so its cross-process claim is released.
391
- * Only once Docker confirmed the stop are the files touched; an unconfirmed stop rejects with
392
- * `MANAGED_STOP_UNCONFIRMED` and removes nothing.
393
- */
394
- export function tensorrtLlmModelDeleter(options) {
395
- return async (modelId) => {
396
- const provider = options.runtime();
397
- if (!(provider instanceof TensorrtLlmRuntime)) {
398
- throw new AtomicCoreError('PROVIDER_NOT_FOUND', 'tensorrt-llm is not available in this build.', TENSORRT_LLM_ENGINE_ID);
399
- }
400
- const model = (await options.registry.list()).find((entry) => entry.id === modelId);
401
- if (model === undefined) {
402
- throw new AtomicCoreError('MODEL_NOT_FOUND', `No tensorrt-llm model has the id '${modelId}'.`, modelId);
403
- }
404
- const release = provider.holdOffModel(modelId);
405
- try {
406
- const facade = options.sessions();
407
- const cancelled = facade.cancelLoad(TENSORRT_LLM_ENGINE_ID, modelId);
408
- const result = await facade.unload(TENSORRT_LLM_ENGINE_ID, modelId);
409
- if (!result.success || provider.residentModels().includes(modelId)) {
410
- throw new AtomicCoreError('MANAGED_STOP_UNCONFIRMED', result.error ?? `The container of ${modelId} did not confirm its stop; nothing was deleted.`, modelId);
411
- }
412
- const guest = options.windowsFiles === undefined ? null : await options.windowsFiles();
413
- const files = guest === null
414
- ? await deleteTensorrtLlmModelFiles(options.paths, model)
415
- : await deleteTensorrtLlmModelFiles(guest.paths, model, guest.files);
416
- return {
417
- model_id: modelId,
418
- was_loaded: cancelled || result.was_loaded === true,
419
- freed_bytes: files.freedBytes,
420
- engine_caches_removed: files.engineCachesRemoved,
421
- };
422
- }
423
- finally {
424
- release();
425
- }
426
- };
427
- }
428
- //# sourceMappingURL=tensorrt-llm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tensorrt-llm.js","sourceRoot":"","sources":["../../src/core/tensorrt-llm.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- /**
2
- * One large, hash-pinned file over several bounded byte ranges at once (`DownloaderDeps.streams`).
3
- * Each range is appended to its own file under `<save path>.segments/`, so an interrupted download
4
- * keeps what every range already has; the directory is reused only for the same URL, size, hash and
5
- * stream count. When every range is complete they are joined into `<save path>.tmp` and renamed into
6
- * place; the downloader verifies size and hash afterwards, as for any file.
7
- *
8
- * A server that does not answer a range with a matching 206 (a 200, a 416, a different
9
- * `Content-Range`, more bytes than asked for) makes the whole file fall back to one stream: the
10
- * function returns `false` and leaves nothing behind. Any other failure is retried per range with the
11
- * downloader's own backoff, the counter reset by fresh progress; a range that receives nothing for
12
- * `inactivityTimeoutMs` is retried as a stall.
13
- */
14
- /** The most ranges one file is fetched over, whatever is asked for. */
15
- export declare const MAX_DOWNLOAD_STREAMS = 4;
16
- /** Smallest file worth splitting: below this one stream is as fast and simpler. */
17
- export declare const SEGMENTED_MIN_BYTES: number;
18
- /** How long a range may receive nothing before it counts as stalled and is retried. */
19
- export declare const SEGMENT_INACTIVITY_TIMEOUT_MS = 120000;
20
- /** At most one progress report per this many milliseconds while ranges are flowing. */
21
- export declare const SEGMENT_PROGRESS_INTERVAL_MS = 200;
22
- export interface SegmentedDownload {
23
- url: string;
24
- /** Final path; `.segments/` and `.tmp` live beside it. */
25
- destination: string;
26
- size: number;
27
- sha256: string;
28
- streams: number;
29
- fetch: typeof fetch;
30
- headers: Record<string, string>;
31
- signal: AbortSignal;
32
- sleep: (ms: number, signal: AbortSignal) => Promise<void>;
33
- retryBaseMs: number;
34
- now: () => number;
35
- /** Bytes held across every range so far. */
36
- progress: (transferred: number) => void;
37
- inactivityTimeoutMs?: number;
38
- }
39
- /** `true` when the file is in place; `false` when the server cannot serve ranges. Throws the rest. */
40
- export declare function downloadSegments(o: SegmentedDownload): Promise<boolean>;
@@ -1,170 +0,0 @@
1
- /**
2
- * One large, hash-pinned file over several bounded byte ranges at once (`DownloaderDeps.streams`).
3
- * Each range is appended to its own file under `<save path>.segments/`, so an interrupted download
4
- * keeps what every range already has; the directory is reused only for the same URL, size, hash and
5
- * stream count. When every range is complete they are joined into `<save path>.tmp` and renamed into
6
- * place; the downloader verifies size and hash afterwards, as for any file.
7
- *
8
- * A server that does not answer a range with a matching 206 (a 200, a 416, a different
9
- * `Content-Range`, more bytes than asked for) makes the whole file fall back to one stream: the
10
- * function returns `false` and leaves nothing behind. Any other failure is retried per range with the
11
- * downloader's own backoff, the counter reset by fresh progress; a range that receives nothing for
12
- * `inactivityTimeoutMs` is retried as a stall.
13
- */
14
- import { createReadStream } from 'node:fs';
15
- import { mkdir, open, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
16
- import { join } from 'node:path';
17
- import { MAX_STREAM_RETRIES, RETRY_RESET_PROGRESS_BYTES, retryDelayMs } from './protocol.js';
18
- /** The most ranges one file is fetched over, whatever is asked for. */
19
- export const MAX_DOWNLOAD_STREAMS = 4;
20
- /** Smallest file worth splitting: below this one stream is as fast and simpler. */
21
- export const SEGMENTED_MIN_BYTES = 32 * 1024 * 1024;
22
- /** How long a range may receive nothing before it counts as stalled and is retried. */
23
- export const SEGMENT_INACTIVITY_TIMEOUT_MS = 120_000;
24
- /** At most one progress report per this many milliseconds while ranges are flowing. */
25
- export const SEGMENT_PROGRESS_INTERVAL_MS = 200;
26
- /** The server cannot serve this file in ranges; the caller downloads it in one stream instead. */
27
- class RangeUnavailable extends Error {
28
- }
29
- /** Stalled: the range received nothing for the inactivity timeout. Retried like any stream error. */
30
- class RangeStalled extends Error {
31
- }
32
- /** `true` when the file is in place; `false` when the server cannot serve ranges. Throws the rest. */
33
- export async function downloadSegments(o) {
34
- const count = Math.max(1, Math.min(MAX_DOWNLOAD_STREAMS, Math.floor(o.streams)));
35
- const chunk = Math.ceil(o.size / count);
36
- const directory = `${o.destination}.segments`;
37
- const identity = JSON.stringify([o.url, o.size, o.sha256, count]);
38
- if ((await readFile(join(directory, 'identity'), 'utf8').catch(() => '')) !== identity) {
39
- await rm(directory, { recursive: true, force: true });
40
- }
41
- await mkdir(directory, { recursive: true });
42
- await writeFile(join(directory, 'identity'), identity);
43
- // One range failing for good stops the others: the file cannot complete anyway.
44
- const stopAll = new AbortController();
45
- const signal = AbortSignal.any([o.signal, stopAll.signal]);
46
- const held = Array(count).fill(0);
47
- let reportedAt = Number.NEGATIVE_INFINITY;
48
- const report = (force = false) => {
49
- const now = o.now();
50
- if (!force && now - reportedAt < SEGMENT_PROGRESS_INTERVAL_MS)
51
- return;
52
- reportedAt = now;
53
- o.progress(held.reduce((a, b) => a + b, 0));
54
- };
55
- const inactivity = o.inactivityTimeoutMs ?? SEGMENT_INACTIVITY_TIMEOUT_MS;
56
- const transfer = async (i) => {
57
- const start = i * chunk;
58
- const end = Math.min(o.size, start + chunk) - 1;
59
- const length = end - start + 1;
60
- const path = join(directory, String(i));
61
- held[i] = Math.min(length, await stat(path).then((s) => s.size, () => 0));
62
- if (held[i] === length)
63
- return report(true);
64
- let retries = 0;
65
- let sinceReset = 0;
66
- for (;;) {
67
- signal.throwIfAborted();
68
- const attempt = new AbortController();
69
- let timer;
70
- const arm = () => {
71
- clearTimeout(timer);
72
- timer = setTimeout(() => attempt.abort(new RangeStalled(`no data received for ${inactivity / 1000} seconds`)), inactivity);
73
- };
74
- let response;
75
- try {
76
- const from = start + held[i];
77
- arm();
78
- response = await o.fetch(o.url, {
79
- headers: { ...o.headers, Range: `bytes=${from}-${end}` },
80
- signal: AbortSignal.any([signal, attempt.signal]),
81
- });
82
- if (response.status === 200 || response.status === 416) {
83
- throw new RangeUnavailable(`HTTP ${response.status} to a range request`);
84
- }
85
- if (response.status !== 206)
86
- throw new Error(`HTTP ${response.status}`);
87
- if (response.headers.get('content-range') !== `bytes ${from}-${end}/${o.size}`) {
88
- throw new RangeUnavailable('a Content-Range that does not match the request');
89
- }
90
- if (!response.body)
91
- throw new Error('no body');
92
- const file = await open(path, 'a', 0o600);
93
- const reader = response.body.getReader();
94
- try {
95
- for (;;) {
96
- arm();
97
- const { done, value } = await reader.read();
98
- if (done)
99
- break;
100
- if (held[i] + value.byteLength > length) {
101
- throw new RangeUnavailable('more bytes than the range asked for');
102
- }
103
- await file.writeFile(value);
104
- held[i] = held[i] + value.byteLength;
105
- sinceReset += value.byteLength;
106
- if (sinceReset >= RETRY_RESET_PROGRESS_BYTES) {
107
- retries = 0;
108
- sinceReset = 0;
109
- }
110
- report();
111
- }
112
- }
113
- finally {
114
- await reader.cancel().catch(() => { });
115
- await file.close();
116
- }
117
- if (held[i] !== length)
118
- throw new Error(`the range ended after ${held[i]} of ${length} bytes`);
119
- return report(true);
120
- }
121
- catch (error) {
122
- await response?.body?.cancel().catch(() => { });
123
- if (signal.aborted)
124
- throw signal.reason;
125
- const cause = attempt.signal.aborted ? attempt.signal.reason : error;
126
- if (cause instanceof RangeUnavailable || retries >= MAX_STREAM_RETRIES)
127
- throw cause;
128
- await o.sleep(retryDelayMs(retries++, o.retryBaseMs), signal);
129
- }
130
- finally {
131
- clearTimeout(timer);
132
- }
133
- }
134
- };
135
- const results = await Promise.allSettled(Array.from({ length: count }, (_, i) => transfer(i).catch((error) => {
136
- stopAll.abort(error);
137
- throw error;
138
- })));
139
- if (o.signal.aborted)
140
- throw o.signal.reason;
141
- const failed = results.find((r) => r.status === 'rejected');
142
- if (failed !== undefined) {
143
- // The first range to fail stopped the rest; its reason is the one that matters.
144
- const reason = stopAll.signal.reason ?? failed.reason;
145
- if (reason instanceof RangeUnavailable) {
146
- await rm(directory, { recursive: true, force: true });
147
- return false;
148
- }
149
- throw reason;
150
- }
151
- const temporary = `${o.destination}.tmp`;
152
- const output = await open(temporary, 'w', 0o600);
153
- try {
154
- for (let i = 0; i < count; i++) {
155
- for await (const buffer of createReadStream(join(directory, String(i)))) {
156
- o.signal.throwIfAborted();
157
- await output.writeFile(buffer);
158
- }
159
- }
160
- }
161
- finally {
162
- await output.close();
163
- }
164
- o.signal.throwIfAborted();
165
- await rename(temporary, o.destination);
166
- await rm(directory, { recursive: true, force: true });
167
- report(true);
168
- return true;
169
- }
170
- //# sourceMappingURL=segmented.js.map