comfyui-mcp 0.48.21 → 0.48.23

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 (252) hide show
  1. package/README.md +2 -2
  2. package/dist/comfyui/client.js +46 -6
  3. package/dist/comfyui/client.js.map +1 -1
  4. package/dist/config.js +15 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/orchestrator/error-text.js +29 -1
  7. package/dist/orchestrator/error-text.js.map +1 -1
  8. package/dist/orchestrator/error-text.test.js +28 -0
  9. package/dist/orchestrator/error-text.test.js.map +1 -1
  10. package/dist/orchestrator/index.js +331 -56
  11. package/dist/orchestrator/index.js.map +1 -1
  12. package/dist/orchestrator/panel-agent.js +122 -31
  13. package/dist/orchestrator/panel-agent.js.map +1 -1
  14. package/dist/orchestrator/panel-tools.js +1256 -198
  15. package/dist/orchestrator/panel-tools.js.map +1 -1
  16. package/dist/orchestrator/ready-banner.js +70 -0
  17. package/dist/orchestrator/ready-banner.js.map +1 -0
  18. package/dist/orchestrator/session-store.js +163 -28
  19. package/dist/orchestrator/session-store.js.map +1 -1
  20. package/dist/services/api-nodes.js +5 -7
  21. package/dist/services/api-nodes.js.map +1 -1
  22. package/dist/services/download-cache.js +126 -18
  23. package/dist/services/download-cache.js.map +1 -1
  24. package/dist/services/download-jobs.js +463 -14
  25. package/dist/services/download-jobs.js.map +1 -1
  26. package/dist/services/download-progress.js +252 -3
  27. package/dist/services/download-progress.js.map +1 -1
  28. package/dist/services/env-capabilities.js +80 -9
  29. package/dist/services/env-capabilities.js.map +1 -1
  30. package/dist/services/generate-audio.js +16 -0
  31. package/dist/services/generate-audio.js.map +1 -1
  32. package/dist/services/local-models-fallback.js +7 -3
  33. package/dist/services/local-models-fallback.js.map +1 -1
  34. package/dist/services/manifest.js +180 -65
  35. package/dist/services/manifest.js.map +1 -1
  36. package/dist/services/model-resolver.js +267 -11
  37. package/dist/services/model-resolver.js.map +1 -1
  38. package/dist/services/node-management.js +179 -45
  39. package/dist/services/node-management.js.map +1 -1
  40. package/dist/services/output-dir.js +33 -3
  41. package/dist/services/output-dir.js.map +1 -1
  42. package/dist/services/panel-secrets.js +19 -7
  43. package/dist/services/panel-secrets.js.map +1 -1
  44. package/dist/services/process-control.js +107 -8
  45. package/dist/services/process-control.js.map +1 -1
  46. package/dist/services/queue-monitor.js +45 -2
  47. package/dist/services/queue-monitor.js.map +1 -1
  48. package/dist/services/queue-monitor.stall.test.js +78 -0
  49. package/dist/services/queue-monitor.stall.test.js.map +1 -0
  50. package/dist/services/secure-bridge.js +84 -0
  51. package/dist/services/secure-bridge.js.map +1 -1
  52. package/dist/services/storage/azure-blob.js +8 -3
  53. package/dist/services/storage/azure-blob.js.map +1 -1
  54. package/dist/services/storage/index.js +3 -3
  55. package/dist/services/storage/index.js.map +1 -1
  56. package/dist/services/storage/s3.js +9 -3
  57. package/dist/services/storage/s3.js.map +1 -1
  58. package/dist/services/ui-bridge.js +341 -24
  59. package/dist/services/ui-bridge.js.map +1 -1
  60. package/dist/services/workflow-converter.js +767 -72
  61. package/dist/services/workflow-converter.js.map +1 -1
  62. package/dist/services/workflow-deps.js +20 -1
  63. package/dist/services/workflow-deps.js.map +1 -1
  64. package/dist/services/workflow-lock.js +127 -27
  65. package/dist/services/workflow-lock.js.map +1 -1
  66. package/dist/services/workflow-target-store.js +7 -3
  67. package/dist/services/workflow-target-store.js.map +1 -1
  68. package/dist/services/workspace-env.js +48 -0
  69. package/dist/services/workspace-env.js.map +1 -1
  70. package/dist/tools/diagnostics.js +10 -1
  71. package/dist/tools/diagnostics.js.map +1 -1
  72. package/dist/tools/generate-audio.js +44 -0
  73. package/dist/tools/generate-audio.js.map +1 -1
  74. package/dist/tools/model-explorer.js +85 -5
  75. package/dist/tools/model-explorer.js.map +1 -1
  76. package/dist/tools/model-extras.js +24 -4
  77. package/dist/tools/model-extras.js.map +1 -1
  78. package/dist/tools/model-management.js +124 -14
  79. package/dist/tools/model-management.js.map +1 -1
  80. package/dist/tools/report-issue.js +220 -66
  81. package/dist/tools/report-issue.js.map +1 -1
  82. package/dist/tools/report-issue.test.js +223 -83
  83. package/dist/tools/report-issue.test.js.map +1 -1
  84. package/dist/tools/skills-access.js +7 -2
  85. package/dist/tools/skills-access.js.map +1 -1
  86. package/dist/tools/template-schema.js +5 -5
  87. package/dist/tools/template-schema.js.map +1 -1
  88. package/dist/tools/workflow-compose.js +18 -3
  89. package/dist/tools/workflow-compose.js.map +1 -1
  90. package/dist/tools/workflow-visualize.js +1 -1
  91. package/dist/tools/workflow-visualize.js.map +1 -1
  92. package/package.json +1 -1
  93. package/packs/anima/install-runpod.sh +0 -1
  94. package/packs/anima/install-windows.bat +0 -1
  95. package/packs/anima/manifest.yaml +0 -1
  96. package/packs/anima-img2img/install-runpod.sh +0 -1
  97. package/packs/anima-img2img/install-windows.bat +0 -1
  98. package/packs/anima-img2img/manifest.yaml +0 -1
  99. package/packs/anima-inpaint/install-runpod.sh +0 -1
  100. package/packs/anima-inpaint/install-windows.bat +0 -1
  101. package/packs/anima-inpaint/manifest.yaml +0 -1
  102. package/packs/anima-txt2img/install-runpod.sh +0 -1
  103. package/packs/anima-txt2img/install-windows.bat +0 -1
  104. package/packs/anima-txt2img/manifest.yaml +0 -1
  105. package/packs/artokun-flow/install-runpod.sh +0 -1
  106. package/packs/artokun-flow/install-windows.bat +0 -1
  107. package/packs/artokun-flow/manifest.yaml +0 -1
  108. package/packs/ernie/install-runpod.sh +0 -1
  109. package/packs/ernie/install-windows.bat +0 -1
  110. package/packs/ernie/manifest.yaml +0 -1
  111. package/packs/ernie-combo/install-runpod.sh +0 -1
  112. package/packs/ernie-combo/install-windows.bat +0 -1
  113. package/packs/ernie-combo/manifest.yaml +0 -1
  114. package/packs/ernie-img2img/install-runpod.sh +0 -1
  115. package/packs/ernie-img2img/install-windows.bat +0 -1
  116. package/packs/ernie-img2img/manifest.yaml +0 -1
  117. package/packs/ernie-txt2img/install-runpod.sh +0 -1
  118. package/packs/ernie-txt2img/install-windows.bat +0 -1
  119. package/packs/ernie-txt2img/manifest.yaml +0 -1
  120. package/packs/ideogram/install-runpod.sh +0 -1
  121. package/packs/ideogram/install-windows.bat +0 -1
  122. package/packs/ideogram/manifest.yaml +0 -1
  123. package/packs/ideogram-img2img/install-runpod.sh +0 -1
  124. package/packs/ideogram-img2img/install-windows.bat +0 -1
  125. package/packs/ideogram-img2img/manifest.yaml +0 -1
  126. package/packs/ideogram-txt2img/install-runpod.sh +0 -1
  127. package/packs/ideogram-txt2img/install-windows.bat +0 -1
  128. package/packs/ideogram-txt2img/manifest.yaml +0 -1
  129. package/packs/ltx-2.3/install-runpod.sh +0 -1
  130. package/packs/ltx-2.3/install-windows.bat +0 -1
  131. package/packs/ltx-2.3/manifest.yaml +0 -1
  132. package/packs/ltx-2.3-extender/install-runpod.sh +0 -1
  133. package/packs/ltx-2.3-extender/install-windows.bat +0 -1
  134. package/packs/ltx-2.3-extender/manifest.yaml +0 -1
  135. package/packs/ltx-2.3-extender-no-audio/install-runpod.sh +0 -1
  136. package/packs/ltx-2.3-extender-no-audio/install-windows.bat +0 -1
  137. package/packs/ltx-2.3-extender-no-audio/manifest.yaml +0 -1
  138. package/packs/ltx-2.3-flf/install-runpod.sh +0 -1
  139. package/packs/ltx-2.3-flf/install-windows.bat +0 -1
  140. package/packs/ltx-2.3-flf/manifest.yaml +0 -1
  141. package/packs/ltx-2.3-img2vid/install-runpod.sh +0 -1
  142. package/packs/ltx-2.3-img2vid/install-windows.bat +0 -1
  143. package/packs/ltx-2.3-img2vid/manifest.yaml +3 -4
  144. package/packs/ltx-2.3-txt2vid/install-runpod.sh +0 -1
  145. package/packs/ltx-2.3-txt2vid/install-windows.bat +0 -1
  146. package/packs/ltx-2.3-txt2vid/manifest.yaml +3 -4
  147. package/packs/ltx-2.3-xy-plot/install-runpod.sh +0 -1
  148. package/packs/ltx-2.3-xy-plot/install-windows.bat +0 -1
  149. package/packs/ltx-2.3-xy-plot/manifest.yaml +0 -1
  150. package/packs/ltx23-distill-3stage/install-runpod.sh +0 -1
  151. package/packs/ltx23-distill-3stage/install-windows.bat +0 -1
  152. package/packs/ltx23-distill-3stage/manifest.yaml +0 -1
  153. package/packs/qwen-image/install-runpod.sh +0 -1
  154. package/packs/qwen-image/install-windows.bat +0 -1
  155. package/packs/qwen-image/manifest.yaml +0 -1
  156. package/packs/qwen-image-edit/install-runpod.sh +0 -1
  157. package/packs/qwen-image-edit/install-windows.bat +0 -1
  158. package/packs/qwen-image-edit/manifest.yaml +0 -1
  159. package/packs/qwen-image-edit-edit/install-runpod.sh +0 -1
  160. package/packs/qwen-image-edit-edit/install-windows.bat +0 -1
  161. package/packs/qwen-image-edit-edit/manifest.yaml +0 -1
  162. package/packs/wan-animate/install-runpod.sh +0 -1
  163. package/packs/wan-animate/install-windows.bat +0 -1
  164. package/packs/wan-animate/manifest.yaml +0 -1
  165. package/packs/wan-animate-character/install-runpod.sh +0 -1
  166. package/packs/wan-animate-character/install-windows.bat +0 -1
  167. package/packs/wan-animate-character/manifest.yaml +0 -1
  168. package/packs/wan-animate-ofm/install-runpod.sh +0 -1
  169. package/packs/wan-animate-ofm/install-windows.bat +0 -1
  170. package/packs/wan-animate-ofm/manifest.yaml +0 -1
  171. package/packs/wan-longer-videos/install-runpod.sh +0 -1
  172. package/packs/wan-longer-videos/install-windows.bat +0 -1
  173. package/packs/wan-longer-videos/manifest.yaml +0 -1
  174. package/packs/wan-longer-videos-i2v/install-runpod.sh +0 -1
  175. package/packs/wan-longer-videos-i2v/install-windows.bat +0 -1
  176. package/packs/wan-longer-videos-i2v/manifest.yaml +0 -1
  177. package/packs/wan-longer-videos-i2v-96gb/install-runpod.sh +0 -1
  178. package/packs/wan-longer-videos-i2v-96gb/install-windows.bat +0 -1
  179. package/packs/wan-longer-videos-i2v-96gb/manifest.yaml +0 -1
  180. package/packs/wan-longer-videos-t2v/install-runpod.sh +0 -1
  181. package/packs/wan-longer-videos-t2v/install-windows.bat +0 -1
  182. package/packs/wan-longer-videos-t2v/manifest.yaml +0 -1
  183. package/packs/wan-longer-videos-t2v-96gb/install-runpod.sh +0 -1
  184. package/packs/wan-longer-videos-t2v-96gb/install-windows.bat +0 -1
  185. package/packs/wan-longer-videos-t2v-96gb/manifest.yaml +0 -1
  186. package/packs/wan-longer-videos-v2v/install-runpod.sh +0 -1
  187. package/packs/wan-longer-videos-v2v/install-windows.bat +0 -1
  188. package/packs/wan-longer-videos-v2v/manifest.yaml +0 -1
  189. package/packs/wan-longer-videos-v2v-96gb/install-runpod.sh +0 -1
  190. package/packs/wan-longer-videos-v2v-96gb/install-windows.bat +0 -1
  191. package/packs/wan-longer-videos-v2v-96gb/manifest.yaml +0 -1
  192. package/packs/wan-multitalk/install-runpod.sh +0 -1
  193. package/packs/wan-multitalk/install-windows.bat +0 -1
  194. package/packs/wan-multitalk/manifest.yaml +0 -1
  195. package/packs/wan-pusa-extend/install-runpod.sh +0 -1
  196. package/packs/wan-pusa-extend/install-windows.bat +0 -1
  197. package/packs/wan-pusa-extend/manifest.yaml +0 -1
  198. package/packs/wan-transparent/install-runpod.sh +0 -1
  199. package/packs/wan-transparent/install-windows.bat +0 -1
  200. package/packs/wan-transparent/manifest.yaml +0 -1
  201. package/packs/wan-transparent-img2vid/install-runpod.sh +0 -1
  202. package/packs/wan-transparent-img2vid/install-windows.bat +0 -1
  203. package/packs/wan-transparent-img2vid/manifest.yaml +0 -1
  204. package/packs/wan-transparent-img2vid-96gb/install-runpod.sh +0 -1
  205. package/packs/wan-transparent-img2vid-96gb/install-windows.bat +0 -1
  206. package/packs/wan-transparent-img2vid-96gb/manifest.yaml +0 -1
  207. package/packs/z-image-base/install-runpod.sh +0 -1
  208. package/packs/z-image-base/install-windows.bat +0 -1
  209. package/packs/z-image-base/manifest.yaml +0 -1
  210. package/packs/z-image-base-combo/install-runpod.sh +0 -1
  211. package/packs/z-image-base-combo/install-windows.bat +0 -1
  212. package/packs/z-image-base-combo/manifest.yaml +0 -1
  213. package/packs/z-image-base-controlnet/install-runpod.sh +0 -1
  214. package/packs/z-image-base-controlnet/install-windows.bat +0 -1
  215. package/packs/z-image-base-controlnet/manifest.yaml +0 -1
  216. package/packs/z-image-base-img2img/install-runpod.sh +0 -1
  217. package/packs/z-image-base-img2img/install-windows.bat +0 -1
  218. package/packs/z-image-base-img2img/manifest.yaml +0 -1
  219. package/packs/z-image-base-inpaint/install-runpod.sh +0 -1
  220. package/packs/z-image-base-inpaint/install-windows.bat +0 -1
  221. package/packs/z-image-base-inpaint/manifest.yaml +0 -1
  222. package/packs/z-image-base-txt2img/install-runpod.sh +0 -1
  223. package/packs/z-image-base-txt2img/install-windows.bat +0 -1
  224. package/packs/z-image-base-txt2img/manifest.yaml +0 -1
  225. package/packs/z-image-turbo/install-runpod.sh +0 -1
  226. package/packs/z-image-turbo/install-windows.bat +0 -1
  227. package/packs/z-image-turbo/manifest.yaml +0 -1
  228. package/packs/z-image-turbo-combo/install-runpod.sh +0 -1
  229. package/packs/z-image-turbo-combo/install-windows.bat +0 -1
  230. package/packs/z-image-turbo-combo/manifest.yaml +0 -1
  231. package/packs/z-image-turbo-controlnet/install-runpod.sh +0 -1
  232. package/packs/z-image-turbo-controlnet/install-windows.bat +0 -1
  233. package/packs/z-image-turbo-controlnet/manifest.yaml +0 -1
  234. package/packs/z-image-turbo-detail-daemon/install-runpod.sh +0 -1
  235. package/packs/z-image-turbo-detail-daemon/install-windows.bat +0 -1
  236. package/packs/z-image-turbo-detail-daemon/manifest.yaml +0 -1
  237. package/packs/z-image-turbo-img2img/install-runpod.sh +0 -1
  238. package/packs/z-image-turbo-img2img/install-windows.bat +0 -1
  239. package/packs/z-image-turbo-img2img/manifest.yaml +0 -1
  240. package/packs/z-image-turbo-inpainting/install-runpod.sh +0 -1
  241. package/packs/z-image-turbo-inpainting/install-windows.bat +0 -1
  242. package/packs/z-image-turbo-inpainting/manifest.yaml +0 -1
  243. package/packs/z-image-turbo-txt2img/install-runpod.sh +0 -1
  244. package/packs/z-image-turbo-txt2img/install-windows.bat +0 -1
  245. package/packs/z-image-turbo-txt2img/manifest.yaml +0 -1
  246. package/packs/z-image-xy-plot/install-runpod.sh +0 -1
  247. package/packs/z-image-xy-plot/install-windows.bat +0 -1
  248. package/packs/z-image-xy-plot/manifest.yaml +0 -1
  249. package/plugin/skills/flux-txt2img/SKILL.md +9 -4
  250. package/plugin/skills/wan-scail-replacement/SKILL.md +95 -0
  251. package/scripts/sync-agents.mjs +18 -8
  252. package/scripts/test-packs.sh +8 -3
@@ -2,69 +2,204 @@ import { readFileSync, writeFileSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { logger } from "../utils/logger.js";
5
- /**
6
- * Durable per-tab SDK session ids, so an agent's memory survives the orchestrator
7
- * PROCESS dying — a wedge auto-restart, a crash, an OOM — not just a soft reload.
8
- *
9
- * The panel also persists the session id (onSession → a `session` frame → the
10
- * panel's localStorage), and resumes by re-sending it on reconnect. But that path
11
- * is the PANEL's: if the orchestrator is killed and a fresh one comes up before the
12
- * panel re-sends `hello.resume` — or the panel never sends it — the conversation is
13
- * silently lost (P0: the agent "forgets everything" after an auto-restart). This is
14
- * the orchestrator's own belt-and-suspenders copy: written when the agent reports
15
- * its session id, read as the resume fallback when a tab first spawns. Keyed by the
16
- * bridge port so two ComfyUI instances on one machine never cross-resume.
17
- */
18
5
  export class SessionStore {
6
+ /** Entries untouched for longer than this are pruned on load. Resumes are
7
+ * same-day / few-days in practice; three weeks is a generous ceiling that still
8
+ * bounds growth (stale test + reloaded-`tmp:` keys never accumulate forever). */
9
+ static GC_TTL_MS = 21 * 24 * 60 * 60 * 1000;
19
10
  path;
20
- map;
11
+ sessions;
12
+ stable;
21
13
  constructor(port) {
22
14
  this.path = join(tmpdir(), `comfyui-mcp-panel-sessions-${port}.json`);
23
- this.map = this.read();
15
+ const loaded = this.read();
16
+ this.sessions = loaded.sessions;
17
+ this.stable = loaded.stable;
18
+ // If load had to SANITIZE the file (migrate the legacy format, GC an expired
19
+ // entry, clamp a corrupt future timestamp), persist the cleaned version NOW.
20
+ // Otherwise a clamped-in-memory-only future timestamp survives on disk and is
21
+ // re-clamped to "now" on every load — immortal, never aging out (#570 P3).
22
+ if (loaded.dirty)
23
+ this.flush();
24
+ }
25
+ now() {
26
+ return Date.now();
24
27
  }
25
28
  read() {
29
+ const empty = { sessions: {}, stable: {}, dirty: false };
26
30
  try {
27
31
  const parsed = JSON.parse(readFileSync(this.path, "utf8"));
28
- if (parsed && typeof parsed === "object") {
29
- // Keep only string→string entries — never trust the file blindly.
32
+ if (!parsed || typeof parsed !== "object")
33
+ return empty;
34
+ const obj = parsed;
35
+ const cutoff = this.now() - SessionStore.GC_TTL_MS;
36
+ // `dirty` = the on-disk bytes no longer match what we hold, so the constructor
37
+ // must re-flush (drop GC'd/malformed rows, persist a clamped timestamp, migrate).
38
+ let dirty = false;
39
+ // Coerce an untrusted map into {key -> Entry}, dropping malformed/expired rows.
40
+ const coerce = (raw) => {
30
41
  const out = {};
31
- for (const [k, v] of Object.entries(parsed)) {
32
- if (typeof v === "string")
33
- out[k] = v;
42
+ if (raw === undefined)
43
+ return out; // absent field — canonicalized on next write
44
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
45
+ dirty = true; // malformed container → rewrite as a canonical {} on load
46
+ return out;
47
+ }
48
+ const nowMs = this.now();
49
+ for (const [k, v] of Object.entries(raw)) {
50
+ if (!v || typeof v !== "object") {
51
+ dirty = true;
52
+ continue;
53
+ }
54
+ const e = v;
55
+ if (typeof e.s !== "string") {
56
+ dirty = true;
57
+ continue;
58
+ }
59
+ // Sanitize the timestamp. A corrupt `1e999` parses as Infinity and would
60
+ // slip past `t < cutoff` forever (never GC'd, never refreshed); a finite
61
+ // FUTURE value (e.g. 1e100) likewise never ages out and makes touch() a
62
+ // no-op. Non-finite → epoch 0 (pruned as too old); future → clamped to now
63
+ // so the TTL is measured from load like any other entry.
64
+ const rawT = typeof e.t === "number" && Number.isFinite(e.t) ? e.t : 0;
65
+ let t = rawT;
66
+ if (t > nowMs)
67
+ t = nowMs;
68
+ if (t !== rawT)
69
+ dirty = true; // clamp/coerce must be persisted (P3)
70
+ if (t < cutoff) {
71
+ dirty = true; // GC drop must be persisted
72
+ continue;
73
+ }
74
+ const entry = { s: e.s, t };
75
+ if (typeof e.o === "string")
76
+ entry.o = e.o;
77
+ if (e.p === true)
78
+ entry.p = true;
79
+ out[k] = entry;
34
80
  }
35
81
  return out;
82
+ };
83
+ if (obj.v === 2) {
84
+ const sessions = coerce(obj.sessions);
85
+ const stable = coerce(obj.stable);
86
+ return { sessions, stable, dirty };
87
+ }
88
+ // LEGACY flat format (Record<string,string>) — migrate. Stamp `now` so the
89
+ // migration itself never trips GC (a live install's keys stay resumable).
90
+ const sessions = {};
91
+ for (const [k, v] of Object.entries(obj)) {
92
+ if (typeof v === "string")
93
+ sessions[k] = { s: v, t: this.now() };
36
94
  }
95
+ return { sessions, stable: {}, dirty: true }; // format upgrade → re-flush as v2
37
96
  }
38
97
  catch {
39
98
  // Missing or corrupt — start empty. Resume falls back to a fresh session.
40
99
  }
41
- return {};
100
+ return empty;
42
101
  }
43
102
  flush() {
44
103
  try {
45
- writeFileSync(this.path, JSON.stringify(this.map));
104
+ const payload = { v: 2, sessions: this.sessions, stable: this.stable };
105
+ writeFileSync(this.path, JSON.stringify(payload));
46
106
  }
47
107
  catch (err) {
48
108
  logger.debug(`[session-store] write failed: ${String(err)}`);
49
109
  }
50
110
  }
111
+ /** Touch an entry's timestamp on a resume hit so an actively-used session never
112
+ * ages out of the store. GC only ever reclaims a key that hasn't been RESUMED
113
+ * (spawned) within the TTL — i.e. a genuinely idle tab. Debounced (1h) so the
114
+ * per-spawn read doesn't churn the disk. */
115
+ touch(map, key) {
116
+ const e = map[key];
117
+ if (!e)
118
+ return;
119
+ const now = this.now();
120
+ if (now - e.t < 60 * 60 * 1000)
121
+ return;
122
+ e.t = now;
123
+ this.flush();
124
+ }
51
125
  /** The persisted session id to resume for a tab, if any. */
52
126
  get(tabId) {
53
- return this.map[tabId];
127
+ const s = this.sessions[tabId]?.s;
128
+ if (s !== undefined)
129
+ this.touch(this.sessions, tabId);
130
+ return s;
54
131
  }
55
132
  /** Record (and persist) a tab's current session id. No-op if unchanged. */
56
133
  set(tabId, sessionId) {
57
- if (this.map[tabId] === sessionId)
58
- return;
59
- this.map[tabId] = sessionId;
134
+ if (this.sessions[tabId]?.s === sessionId) {
135
+ // Same id — refresh the timestamp so an actively-used session never GCs out,
136
+ // but skip the disk write when the timestamp is already recent.
137
+ const existing = this.sessions[tabId];
138
+ if (existing && this.now() - existing.t < 60 * 60 * 1000)
139
+ return;
140
+ }
141
+ this.sessions[tabId] = { s: sessionId, t: this.now() };
60
142
  this.flush();
61
143
  }
62
144
  /** Forget a tab's session — called when the panel starts a NEW chat, so the
63
145
  * disk fallback never resurrects a deliberately-reset conversation. */
64
146
  clear(tabId) {
65
- if (!(tabId in this.map))
147
+ if (!(tabId in this.sessions))
148
+ return;
149
+ delete this.sessions[tabId];
150
+ this.flush();
151
+ }
152
+ /** The resume session id for a STABLE identity (survives a panel reload for an
153
+ * unsaved workflow), if any. A POISONED key (two tabs contended — see setStable)
154
+ * returns undefined, so a collision degrades to a fresh session, never a resume of
155
+ * the WRONG conversation. See the class docstring. */
156
+ getStable(stableKey) {
157
+ const e = this.stable[stableKey];
158
+ if (!e || e.p)
159
+ return undefined;
160
+ this.touch(this.stable, stableKey);
161
+ return e.s;
162
+ }
163
+ /** Record (and persist) the session id under a STABLE identity, so a reloaded
164
+ * unsaved-workflow tab (new `tmp:` id) can still resume it. `owner` is the panel
165
+ * tab writing it — the collision discriminator.
166
+ *
167
+ * The stable key (origin+title+backend) is NOT unique: two unsaved tabs with the
168
+ * same default title collide. If a DIFFERENT owner writes a DIFFERENT session
169
+ * under an existing key, that key is POISONED — neither tab may resume it, so a
170
+ * fresh sibling can never inherit the other's conversation. The SAME owner writing
171
+ * a new session (a rewind/fork) is NOT a collision; a reloaded tab writing the
172
+ * SAME (resumed) session under a new owner just refreshes it. */
173
+ setStable(stableKey, sessionId, owner) {
174
+ const existing = this.stable[stableKey];
175
+ if (existing?.p)
176
+ return; // already poisoned — stays refused until clearStable
177
+ if (existing &&
178
+ existing.s !== sessionId &&
179
+ existing.o !== undefined &&
180
+ owner !== undefined &&
181
+ existing.o !== owner) {
182
+ // Two different tabs, two different sessions, one non-unique key → poison it.
183
+ this.stable[stableKey] = { s: "", t: this.now(), p: true };
184
+ this.flush();
185
+ return;
186
+ }
187
+ if (existing && existing.s === sessionId && existing.o === owner) {
188
+ // Unchanged — refresh the timestamp (debounced) so an active session doesn't GC.
189
+ if (this.now() - existing.t < 60 * 60 * 1000)
190
+ return;
191
+ }
192
+ const entry = { s: sessionId, t: this.now() };
193
+ if (owner !== undefined)
194
+ entry.o = owner;
195
+ this.stable[stableKey] = entry;
196
+ this.flush();
197
+ }
198
+ /** Forget a stable identity's session (a deliberate NEW chat on that tab). */
199
+ clearStable(stableKey) {
200
+ if (!(stableKey in this.stable))
66
201
  return;
67
- delete this.map[tabId];
202
+ delete this.stable[stableKey];
68
203
  this.flush();
69
204
  }
70
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACN,IAAI,CAAS;IACtB,GAAG,CAAyB;IAEpC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,IAAI,OAAO,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAEO,IAAI;QACV,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACzC,kEAAkE;gBAClE,MAAM,GAAG,GAA2B,EAAE,CAAC;gBACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;oBACvE,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK;QACX,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,2EAA2E;IAC3E,GAAG,CAAC,KAAa,EAAE,SAAiB;QAClC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS;YAAE,OAAO;QAC1C,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;4EACwE;IACxE,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
1
+ {"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/orchestrator/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoD5C,MAAM,OAAO,YAAY;IACvB;;sFAEkF;IAClF,MAAM,CAAU,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEpC,IAAI,CAAS;IACtB,QAAQ,CAAwB;IAChC,MAAM,CAAwB;IAEtC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,IAAI,OAAO,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,6EAA6E;QAC7E,6EAA6E;QAC7E,8EAA8E;QAC9E,2EAA2E;QAC3E,IAAI,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAEO,GAAG;QACT,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAEO,IAAI;QACV,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACxD,MAAM,GAAG,GAAG,MAAiC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC;YACnD,+EAA+E;YAC/E,kFAAkF;YAClF,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,gFAAgF;YAChF,MAAM,MAAM,GAAG,CAAC,GAAY,EAAyB,EAAE;gBACrD,MAAM,GAAG,GAA0B,EAAE,CAAC;gBACtC,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,GAAG,CAAC,CAAC,6CAA6C;gBAChF,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClE,KAAK,GAAG,IAAI,CAAC,CAAC,0DAA0D;oBACxE,OAAO,GAAG,CAAC;gBACb,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;oBACpE,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAChC,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,GAAG,CAA2D,CAAC;oBACtE,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC5B,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS;oBACX,CAAC;oBACD,yEAAyE;oBACzE,yEAAyE;oBACzE,wEAAwE;oBACxE,2EAA2E;oBAC3E,yDAAyD;oBACzD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvE,IAAI,CAAC,GAAG,IAAI,CAAC;oBACb,IAAI,CAAC,GAAG,KAAK;wBAAE,CAAC,GAAG,KAAK,CAAC;oBACzB,IAAI,CAAC,KAAK,IAAI;wBAAE,KAAK,GAAG,IAAI,CAAC,CAAC,sCAAsC;oBACpE,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;wBACf,KAAK,GAAG,IAAI,CAAC,CAAC,4BAA4B;wBAC1C,SAAS;oBACX,CAAC;oBACD,MAAM,KAAK,GAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;wBAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC3C,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;wBAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;oBACjC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBACjB,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACrC,CAAC;YACD,2EAA2E;YAC3E,0EAA0E;YAC1E,MAAM,QAAQ,GAA0B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACnE,CAAC;YACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,kCAAkC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK;QACX,IAAI,CAAC;YACH,MAAM,OAAO,GAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACpF,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,iCAAiC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED;;;iDAG6C;IACrC,KAAK,CAAC,GAA0B,EAAE,GAAW;QACnD,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YAAE,OAAO;QACvC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACV,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,KAAa;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,2EAA2E;IAC3E,GAAG,CAAC,KAAa,EAAE,SAAiB;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,6EAA6E;YAC7E,gEAAgE;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;gBAAE,OAAO;QACnE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;4EACwE;IACxE,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;;2DAGuD;IACvD,SAAS,CAAC,SAAiB;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED;;;;;;;;;sEASkE;IAClE,SAAS,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAc;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YAAE,OAAO,CAAC,qDAAqD;QAC9E,IACE,QAAQ;YACR,QAAQ,CAAC,CAAC,KAAK,SAAS;YACxB,QAAQ,CAAC,CAAC,KAAK,SAAS;YACxB,KAAK,KAAK,SAAS;YACnB,QAAQ,CAAC,CAAC,KAAK,KAAK,EACpB,CAAC;YACD,8EAA8E;YAC9E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACjE,iFAAiF;YACjF,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;gBAAE,OAAO;QACvD,CAAC;QACD,MAAM,KAAK,GAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,8EAA8E;IAC9E,WAAW,CAAC,SAAiB;QAC3B,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC"}
@@ -137,12 +137,7 @@ export function extractWorkflowClassTypes(graph) {
137
137
  }
138
138
  return [...out];
139
139
  }
140
- /**
141
- * Classify a workflow's runtime (local-GPU vs paid API nodes) by scanning its
142
- * node class_types against the connected ComfyUI's /object_info (the same signal
143
- * isApiNode uses). Works on UI or API/prompt format graphs.
144
- */
145
- export async function checkWorkflowRuntime(graph, deps = defaultDeps) {
140
+ export async function checkWorkflowRuntime(graph, deps = defaultDeps, opts = {}) {
146
141
  const classTypes = extractWorkflowClassTypes(graph);
147
142
  const objectInfo = await deps.getObjectInfo();
148
143
  const apiNodes = [];
@@ -165,13 +160,16 @@ export async function checkWorkflowRuntime(graph, deps = defaultDeps) {
165
160
  runtime = apiNodes.length >= classifiable && classifiable > 0 ? "api" : "mixed";
166
161
  usesApiNodes = true;
167
162
  }
168
- else if (unknownNodes.length > 0) {
163
+ else if (unknownNodes.length > 0 && !opts.bundledLocalPack) {
169
164
  // No recognized API nodes, but some class_types aren't in /object_info — they
170
165
  // COULD be paid API/partner nodes the server doesn't expose. Don't claim free.
171
166
  runtime = "unknown";
172
167
  usesApiNodes = null;
173
168
  }
174
169
  else {
170
+ // Either everything classified as local, OR this is a bundled pack (declared
171
+ // local/free) whose only unclassifiable nodes are its own uninstalled custom
172
+ // nodes — never API nodes. Trust the pack's local guarantee (#464).
175
173
  runtime = "local";
176
174
  usesApiNodes = false;
177
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api-nodes.js","sourceRoot":"","sources":["../../src/services/api-nodes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-nodes.js","sourceRoot":"","sources":["../../src/services/api-nodes.ts"],"names":[],"mappings":"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"}
@@ -709,7 +709,13 @@ onResume,
709
709
  * validated as a real model — an HTML/JSON auth/error body is rejected rather
710
710
  * than finalized as a corrupt model under a false success (#473). Empty ⇒ no
711
711
  * payload validation (unknown/non-model destination). */
712
- modelExt = "") {
712
+ modelExt = "",
713
+ /** Per-download abort signal (#515): passed to fetch AND the write pipeline so a
714
+ * cancel aborts the in-flight transfer promptly; the partial is left on disk. */
715
+ signal) {
716
+ // Fail fast if we were cancelled before any bytes moved — no request, no partial.
717
+ if (signal?.aborted)
718
+ throw new DOMException("The download was cancelled.", "AbortError");
713
719
  if (supportsCloudDownload(url)) {
714
720
  // Cloud downloaders (S3/Azure) don't range-resume — they overwrite the target.
715
721
  // If a partial exists it's being discarded; surface that (#467) instead of a
@@ -730,7 +736,14 @@ modelExt = "") {
730
736
  `re-downloading in full.`, { url: logUrl, discardedBytes: resumeFromBytes });
731
737
  onResume?.({ outcome: "declined:full-response", discardedBytes: resumeFromBytes, discarded: true });
732
738
  }
733
- await downloadCloudUrlToFile(url, targetPath, storageAuth);
739
+ await downloadCloudUrlToFile(url, targetPath, storageAuth, signal);
740
+ // INTEGRITY BACKSTOP (#515): the S3/Azure SDKs may not honor the abort promptly
741
+ // (or at all), so a cancel that arrived mid-transfer could let the cloud download
742
+ // run to completion. If we were cancelled, throw BEFORE the size/payload checks
743
+ // and the caller's rename/materialize — so a cancelled cloud transfer is NEVER
744
+ // finalized as a complete file (the partial is left in the cache dir, unrenamed).
745
+ if (signal?.aborted)
746
+ throw new DOMException("The download was cancelled.", "AbortError");
734
747
  // #343 edge: the S3/Azure path bypasses the HTTP size gate below. The cloud
735
748
  // downloaders verify their own Content-Length (truncation), but a stream
736
749
  // that yielded ZERO bytes can still resolve cleanly — backstop it here so a
@@ -855,7 +868,7 @@ modelExt = "") {
855
868
  let redirectSize;
856
869
  let res;
857
870
  for (let redirectCount = 0;; redirectCount += 1) {
858
- res = await fetchOrThrow(currentUrl, { headers: currentHeaders, redirect: "manual" }, currentUrl === url ? logUrl : redactUrlForLogs(currentUrl));
871
+ res = await fetchOrThrow(currentUrl, { headers: currentHeaders, redirect: "manual", signal }, currentUrl === url ? logUrl : redactUrlForLogs(currentUrl));
859
872
  if (res.status < 300 || res.status >= 400)
860
873
  break;
861
874
  // Capture the content-addressed resume validator off the redirect itself.
@@ -1235,7 +1248,7 @@ modelExt = "") {
1235
1248
  });
1236
1249
  // No progress wanted (internal/cache caller, or not under the panel) → straight pipe.
1237
1250
  if (!progress) {
1238
- await pipeline(nodeStream, fileStream);
1251
+ await pipeline(nodeStream, fileStream, { signal });
1239
1252
  await assertComplete();
1240
1253
  await assertModelPayload();
1241
1254
  // Complete: the validator sidecar is only needed to guard a resume, so drop it.
@@ -1266,7 +1279,7 @@ modelExt = "") {
1266
1279
  },
1267
1280
  });
1268
1281
  try {
1269
- await pipeline(nodeStream, counter, fileStream);
1282
+ await pipeline(nodeStream, counter, fileStream, { signal });
1270
1283
  await assertComplete();
1271
1284
  await assertModelPayload();
1272
1285
  if (resumable)
@@ -1276,11 +1289,16 @@ modelExt = "") {
1276
1289
  return responseContentType;
1277
1290
  }
1278
1291
  catch (err) {
1279
- emit("error", true);
1292
+ // On a user cancel (#515) the abort left a resumable .partial on disk. Do NOT emit
1293
+ // an "error" row for it, and do NOT clear the row here: this cache layer has no
1294
+ // registry context, and a coalesced sibling may share this progress row. The JOB
1295
+ // layer (finalizeCancelled) clears it registry-aware. Only a genuine failure emits.
1296
+ if (!signal?.aborted)
1297
+ emit("error", true);
1280
1298
  throw err;
1281
1299
  }
1282
1300
  }
1283
- async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progress, onResume, modelExt = "") {
1301
+ async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progress, onResume, modelExt = "", signal) {
1284
1302
  // Representation-aware identity (#467): a same-URL download with different HTTP
1285
1303
  // auth headers OR different cloud (S3/Azure) credentials gets its OWN cache file,
1286
1304
  // partial and in-flight slot — never coalesced onto another caller's stream.
@@ -1291,6 +1309,21 @@ async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progres
1291
1309
  // of its own — the decision is reported to the job that actually runs the
1292
1310
  // stream (#467). This is inherent to the callback model: onResume is not passed
1293
1311
  // to the shared promise, so a coalesced caller simply awaits the same result.
1312
+ //
1313
+ // CANCEL SEMANTICS across coalescing (#515): two DIFFERENT-destination jobs for the
1314
+ // same URL+auth are distinct jobs (distinct AbortControllers) but share ONE physical
1315
+ // stream here (the first caller's, keyed by cache identity). This shared stream binds
1316
+ // the FIRST caller's signal. Integrity is preserved in every case:
1317
+ // - Cancelling the stream OWNER aborts the shared stream; the other (uncancelled)
1318
+ // caller's promise rejects, and since ITS signal is not aborted, downloadWithCache
1319
+ // falls back to a fresh direct download and still completes correctly.
1320
+ // - Cancelling a COALESCED caller does not abort the shared stream (it keeps running
1321
+ // for the owner), but that caller's own commit guard (its aborted signal, checked
1322
+ // in downloadModel before the done row / return) refuses to finalize — so it is
1323
+ // never reported as complete.
1324
+ // The deliberate trade-off is prompt stream-abort for the common SOLE-caller case at
1325
+ // the cost of a rare redundant re-download when a shared owner is cancelled; no caller
1326
+ // can ever false-complete or be corrupted by another's cancel.
1294
1327
  if (existing)
1295
1328
  return existing;
1296
1329
  const promise = (async () => {
@@ -1386,7 +1419,7 @@ async function downloadIntoCache(url, headers, logUrl, storageAuth = {}, progres
1386
1419
  }
1387
1420
  try {
1388
1421
  const contentType = await streamUrlToFile(url, partial, headers, logUrl, storageAuth, resumeFromBytes, progress, true, // resumable: cache partials use the .partial + If-Range resume handshake
1389
- onResume, modelExt);
1422
+ onResume, modelExt, signal);
1390
1423
  await downloadCacheFs.rename(partial, target);
1391
1424
  await touch(target);
1392
1425
  // Persist the response Content-Type beside the cache file so a later cache-HIT /
@@ -1470,9 +1503,24 @@ function isHardlinkUnsupported(code) {
1470
1503
  * EEXIST — ONLY then do we move the destination ASIDE and swap. Any OTHER rename
1471
1504
  * error (ENOENT, EIO, EXDEV, …) must NOT touch a valid existing destination (#467):
1472
1505
  * clean our temp and propagate. */
1473
- async function renameTempOverDestination(tmp, targetPath) {
1506
+ async function renameTempOverDestination(tmp, targetPath,
1507
+ /** Fired SYNCHRONOUSLY the instant the destination rename succeeds — BEFORE any
1508
+ * further await (e.g. Windows backup cleanup) — so the job can commit "done" with no
1509
+ * window where the file is at its destination yet the job still reads "downloading"
1510
+ * and a cancel could falsely mark it cancelled (#515). */
1511
+ onLanded,
1512
+ /** Abort signal (#515). Checked before the atomic replace AND (Windows path) after the
1513
+ * destination is moved aside but before the swap — so a cancel that lands during the
1514
+ * backup move restores the original and bails instead of swapping the temp in. */
1515
+ signal) {
1516
+ // Cancelled before the swap — leave the destination untouched (the temp is cleaned up).
1517
+ if (signal?.aborted) {
1518
+ await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
1519
+ throw new DOMException("The download was cancelled.", "AbortError");
1520
+ }
1474
1521
  try {
1475
1522
  await downloadCacheFs.rename(tmp, targetPath);
1523
+ onLanded?.(targetPath); // landed (POSIX atomic replace) — commit done before returning
1476
1524
  return;
1477
1525
  }
1478
1526
  catch (err) {
@@ -1496,8 +1544,29 @@ async function renameTempOverDestination(tmp, targetPath) {
1496
1544
  catch {
1497
1545
  /* destination may not exist — nothing to move aside */
1498
1546
  }
1547
+ // A cancel that landed WHILE we moved the old destination aside must NOT swap the
1548
+ // temp in — restore the original and bail, so a cancelled download never lands its
1549
+ // file over the destination (#515). The temp is cleaned up.
1550
+ if (signal?.aborted) {
1551
+ await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
1552
+ if (backedUp) {
1553
+ const restored = await downloadCacheFs
1554
+ .rename(backup, targetPath)
1555
+ .then(() => true)
1556
+ .catch(() => false);
1557
+ if (!restored) {
1558
+ throw new ModelError(`Download cancelled but the previous file could not be restored — it is PRESERVED at ` +
1559
+ `"${backup}"; move it back to "${targetPath}" manually.`, { url: targetPath });
1560
+ }
1561
+ }
1562
+ throw new DOMException("The download was cancelled.", "AbortError");
1563
+ }
1499
1564
  try {
1500
1565
  await downloadCacheFs.rename(tmp, targetPath);
1566
+ // Swapped in — the file is at its destination. Commit done NOW, before the backup
1567
+ // cleanup await, so a cancel during that await can't falsely mark a landed file
1568
+ // cancelled (#515).
1569
+ onLanded?.(targetPath);
1501
1570
  if (backedUp)
1502
1571
  await downloadCacheFs.rm(backup, { force: true }).catch(() => undefined);
1503
1572
  }
@@ -1519,9 +1588,13 @@ async function renameTempOverDestination(tmp, targetPath) {
1519
1588
  }
1520
1589
  }
1521
1590
  const MATERIALIZE_TEMP_ATTEMPTS = 5;
1522
- async function materializeCacheFile(cachePath, targetPath) {
1523
- if (resolve(cachePath) === resolve(targetPath))
1591
+ async function materializeCacheFile(cachePath, targetPath, signal, onLanded) {
1592
+ if (resolve(cachePath) === resolve(targetPath)) {
1593
+ // The download streamed directly to the destination (cache === target) — it is
1594
+ // already on disk; commit "done" synchronously (#515).
1595
+ onLanded?.(targetPath);
1524
1596
  return "hardlink";
1597
+ }
1525
1598
  // Materialize ATOMICALLY into an UNGUESSABLE, EXCLUSIVELY-created temp, then
1526
1599
  // rename over targetPath — never write directly at targetPath, and never reuse a
1527
1600
  // possibly-stale temp name (#467 P1-A). Two jobs materializing DIFFERENT
@@ -1561,7 +1634,19 @@ async function materializeCacheFile(cachePath, targetPath) {
1561
1634
  }
1562
1635
  mode = "copy";
1563
1636
  }
1564
- await renameTempOverDestination(tmp, targetPath);
1637
+ // FINAL CANCEL GUARD (#515): the temp is built but NOT yet swapped in. If this
1638
+ // caller was cancelled, remove the temp and bail WITHOUT replacing the destination
1639
+ // — so a cancelled download never lands its target even if the abort arrived during
1640
+ // materialization. (The cache entry itself is untouched — the temp was our own.)
1641
+ if (signal?.aborted) {
1642
+ await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);
1643
+ throw new DOMException("The download was cancelled.", "AbortError");
1644
+ }
1645
+ // onLanded fires INSIDE renameTempOverDestination the instant the destination rename
1646
+ // succeeds (before any Windows backup cleanup await), closing the landed→return
1647
+ // window entirely; the signal lets it also abort the Windows swap after the backup
1648
+ // move (#515).
1649
+ await renameTempOverDestination(tmp, targetPath, onLanded, signal);
1565
1650
  return mode;
1566
1651
  }
1567
1652
  }
@@ -1595,8 +1680,8 @@ async function evictLruIfNeeded() {
1595
1680
  break;
1596
1681
  }
1597
1682
  }
1598
- export async function downloadUrlToFile(url, targetPath, headers, logUrl, storageAuth = {}, progress, modelExt = extname(targetPath)) {
1599
- await streamUrlToFile(url, targetPath, headers, logUrl, storageAuth, 0, progress, false, undefined, modelExt);
1683
+ export async function downloadUrlToFile(url, targetPath, headers, logUrl, storageAuth = {}, progress, modelExt = extname(targetPath), signal) {
1684
+ await streamUrlToFile(url, targetPath, headers, logUrl, storageAuth, 0, progress, false, undefined, modelExt, signal);
1600
1685
  }
1601
1686
  export async function downloadWithCache(options) {
1602
1687
  const logUrl = options.logUrl ?? redactUrlForLogs(options.url);
@@ -1606,7 +1691,14 @@ export async function downloadWithCache(options) {
1606
1691
  // body is checked against what the destination IS (a `.safetensors` etc.).
1607
1692
  const modelExt = extname(options.targetPath);
1608
1693
  try {
1609
- const cachePath = await downloadIntoCache(options.url, options.headers, logUrl, options.storageAuth, options.progress, options.onResume, modelExt);
1694
+ const cachePath = await downloadIntoCache(options.url, options.headers, logUrl, options.storageAuth, options.progress, options.onResume, modelExt, options.signal);
1695
+ // CANCEL GUARD (#515): a COALESCED caller (or a CACHE HIT) reaches here without
1696
+ // ever streaming — it awaited another job's shared physical download. If THIS
1697
+ // caller was cancelled meanwhile, it must NOT materialize its destination: bail
1698
+ // BEFORE validation/materialization so a cancelled download never lands a completed
1699
+ // file at its models path (which we'd then misreport as "cancelled, partial left").
1700
+ if (options.signal?.aborted)
1701
+ throw new DOMException("The download was cancelled.", "AbortError");
1610
1702
  // Validate the CACHE FILE itself before materializing it to this destination —
1611
1703
  // this is the authoritative per-caller gate (#473). It covers four cases the
1612
1704
  // stream-time check can't: (1) a CACHE HIT that skipped streaming entirely,
@@ -1639,7 +1731,7 @@ export async function downloadWithCache(options) {
1639
1731
  await safeRm(cacheCtSidecar(cachePath));
1640
1732
  },
1641
1733
  });
1642
- const materializedBy = await materializeCacheFile(cachePath, options.targetPath);
1734
+ const materializedBy = await materializeCacheFile(cachePath, options.targetPath, options.signal, options.onLanded);
1643
1735
  await evictLruIfNeeded();
1644
1736
  return {
1645
1737
  targetPath: options.targetPath,
@@ -1651,6 +1743,11 @@ export async function downloadWithCache(options) {
1651
1743
  catch (err) {
1652
1744
  if (err instanceof ModelError)
1653
1745
  throw err;
1746
+ // A user cancel (#515) aborted the transfer — do NOT fall back to a direct
1747
+ // download (it would immediately re-abort). Propagate so the job records a
1748
+ // clean cancellation; the resumable .partial is left in the cache dir.
1749
+ if (options.signal?.aborted)
1750
+ throw err;
1654
1751
  logger.warn("Download cache unavailable; falling back to direct download", {
1655
1752
  url: logUrl,
1656
1753
  error: err instanceof Error ? err.message : String(err),
@@ -1665,8 +1762,19 @@ export async function downloadWithCache(options) {
1665
1762
  // leaves the destination untouched.
1666
1763
  const tmp = await reserveExclusiveTemp(options.targetPath, "dl");
1667
1764
  try {
1668
- await downloadUrlToFile(options.url, tmp, options.headers, logUrl, options.storageAuth, options.progress, modelExt);
1669
- await renameTempOverDestination(tmp, options.targetPath);
1765
+ await downloadUrlToFile(options.url, tmp, options.headers, logUrl, options.storageAuth, options.progress, modelExt, options.signal);
1766
+ // PRE-RENAME CANCEL GUARD (#515), mirroring the cache-path materialize guard: a
1767
+ // cancel that arrived during the post-stream validation lets the stream return
1768
+ // normally, but we must NOT swap the temp into the destination — bail so a
1769
+ // cancelled download never lands its target here either. (An abort DURING the
1770
+ // un-interruptible rename lands a complete, validated file → the job reports done,
1771
+ // consistent with the invariant.) The temp is removed by the catch below.
1772
+ if (options.signal?.aborted)
1773
+ throw new DOMException("The download was cancelled.", "AbortError");
1774
+ // onLanded fires inside renameTempOverDestination at the successful rename (before
1775
+ // any backup-cleanup await) — commits "done" with no landed→return window; the
1776
+ // signal also aborts the Windows swap after the backup move (#515).
1777
+ await renameTempOverDestination(tmp, options.targetPath, options.onLanded, options.signal);
1670
1778
  }
1671
1779
  catch (e) {
1672
1780
  await downloadCacheFs.rm(tmp, { force: true }).catch(() => undefined);