comfyui-mcp 0.48.8 → 0.48.10

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.
@@ -14,10 +14,37 @@
14
14
  * `enqueue_workflow` + `get_job_status`.
15
15
  */
16
16
  import { createHash } from "node:crypto";
17
- import { isRemoteMode } from "../config.js";
18
- import { downloadModel, resolveDownloadTarget } from "./model-resolver.js";
17
+ import { downloadModel, resolveDownloadTarget, shouldDispatchDownloadToManager, } from "./model-resolver.js";
19
18
  import { logger } from "../utils/logger.js";
19
+ // The in-flight registry is indexed under MULTIPLE keys per job so dedup is
20
+ // ROUTE-INDEPENDENT: a repeated request finds the in-flight job whether or not the
21
+ // Manager↔local route flipped between calls (#420 codex round 2). One Entry object
22
+ // is shared by all its keys.
20
23
  const jobs = new Map();
24
+ /**
25
+ * Point `key` at `entry`, ENTRY-SCOPED (#420 codex round 3, rule 2/3): never clobber
26
+ * a row currently owned by a DIFFERENT, still-in-flight writer — that would orphan a
27
+ * live download's index. Records the key on the entry so it can be retired later.
28
+ */
29
+ function registerKey(entry, key) {
30
+ const cur = jobs.get(key);
31
+ if (cur && cur !== entry && cur.job.status === "downloading")
32
+ return;
33
+ if (!entry.keys.includes(key))
34
+ entry.keys.push(key);
35
+ jobs.set(key, entry);
36
+ }
37
+ /**
38
+ * Retire a superseded (done/error) entry, ENTRY-SCOPED (#420 codex round 3, rule 2):
39
+ * only delete an index row that STILL points at THIS entry, so retiring an older job
40
+ * can never delete a key that has since been reassigned to a newer/live entry.
41
+ */
42
+ function retireEntry(entry) {
43
+ for (const key of entry.keys) {
44
+ if (jobs.get(key) === entry)
45
+ jobs.delete(key);
46
+ }
47
+ }
21
48
  /** The tray keys rows on a hash of the SOURCE URL; match it so both agree. */
22
49
  export function downloadIdFor(url) {
23
50
  return createHash("sha256").update(url).digest("hex").slice(0, 16);
@@ -33,14 +60,15 @@ export function downloadJobIdFor(targetPath) {
33
60
  return createHash("sha256").update(targetPath).digest("hex").slice(0, 16);
34
61
  }
35
62
  /**
36
- * REMOTE-mode id: there is NO local filesystem to resolve a targetPath from —
37
- * downloadModel dispatches to the ComfyUI host's Manager, which decides the
38
- * server-side destination. Key by a canonical, collision-safe JSON-encoded tuple
39
- * of {url, trimmed subfolder, filename} so field boundaries are unambiguous and a
40
- * repeated identical request still adopts the in-flight job. (We can't dedupe two
41
- * DIFFERENT urls aimed at one server-side dest here the server owns that.)
63
+ * ROUTE-INDEPENDENT request key: a canonical, collision-safe JSON-encoded tuple of
64
+ * {url, trimmed subfolder, filename}. Derived ONLY from the request inputs — never
65
+ * from the resolved destination or the chosen route — so a repeated call for the
66
+ * SAME request adopts the in-flight job regardless of a Manager↔local reachability
67
+ * flip between calls (#420 codex round 2). Every job is indexed under this key; a
68
+ * locally-resolvable job is ALSO indexed under its destination key (below) so the
69
+ * "two different URLs → one local destination → one writer" dedup still holds.
42
70
  */
43
- function remoteDownloadJobIdFor(url, targetSubfolder, filename) {
71
+ function requestDownloadKey(url, targetSubfolder, filename) {
44
72
  const canonical = JSON.stringify([
45
73
  url,
46
74
  String(targetSubfolder ?? "").trim(),
@@ -76,19 +104,76 @@ onComplete) {
76
104
  // there is NO local filesystem — downloadModel short-circuits to the Manager
77
105
  // dispatch, so resolving a local models dir would wrongly THROW (COMFYUI_PATH
78
106
  // unset). Key by a canonical remote identity instead and let downloadModel take
79
- // the Manager path.
80
- const id = isRemoteMode()
81
- ? remoteDownloadJobIdFor(url, targetSubfolder, filename)
82
- : downloadJobIdFor((await resolveDownloadTarget(url, targetSubfolder, filename)).targetPath);
107
+ // the Manager path. shouldDispatchDownloadToManager() also covers the #420
108
+ // reconnect case: a nominally-local session whose effective base was lost still
109
+ // routes through the connected Manager (and must NOT try to resolve a local
110
+ // targetPath, which would throw), keying by the same canonical remote identity.
111
+ //
112
+ // CRITICAL: evaluate the route EXACTLY ONCE and thread it into downloadModel
113
+ // below. The predicate awaits live /system_stats and reads mutable base config,
114
+ // so a reconnect/reachability flip between two evaluations would split the job —
115
+ // Manager-key + local-writer (or a duplicate job) for one request (#420 codex
116
+ // round 1). One decision keys the identity AND drives the writer.
117
+ const dispatchToManager = await shouldDispatchDownloadToManager();
118
+ // DEDUP INDEX (route-independent) vs WRITER ROUTE (the single decision above) are
119
+ // deliberately separated (#420 codex round 2). The in-flight lookup/registration
120
+ // is keyed by the REQUEST (url+subfolder+filename), which NEVER changes with the
121
+ // route — so two separate calls for one request with a Manager↔local flip between
122
+ // them still resolve to ONE job (no same-file double-write). When the request is
123
+ // locally resolvable we ALSO index the destination-path key, preserving the
124
+ // "two different URLs → same local destination → one writer" dedup (WS-4). An
125
+ // invalid filename/subfolder is REJECTED here (by resolveDownloadTarget), up
126
+ // front, exactly as the write would reject it.
127
+ const reqKey = requestDownloadKey(url, targetSubfolder, filename);
128
+ let destKey;
129
+ if (!dispatchToManager) {
130
+ const target = await resolveDownloadTarget(url, targetSubfolder, filename);
131
+ destKey = downloadJobIdFor(target.targetPath);
132
+ }
133
+ // The PUBLIC id (download_status handle): the destination key when we have one
134
+ // (so distinct destinations are separately pollable), else the request key.
135
+ const id = destKey ?? reqKey;
136
+ // This call's keys: the route-independent request key, plus the destination key
137
+ // when locally resolvable (two-URLs-one-dest dedup).
138
+ const lookupKeys = destKey ? [reqKey, destKey] : [reqKey];
83
139
  const trayId = downloadIdFor(url);
84
- const existing = jobs.get(id);
85
- if (existing && existing.job.status === "downloading") {
86
- logger.info(`Download already in flight, adopting it: ${id}`, {
140
+ // ADOPT ONLY AN IN-FLIGHT ENTRY (#420 codex round 3, rule 3): a FINISHED entry
141
+ // under any key is treated as absent — it must never shadow a currently-downloading
142
+ // writer reachable under another key, nor cause a retire that overwrites a live row.
143
+ // Scan every key and prefer an in-flight match.
144
+ let adopted;
145
+ for (const k of lookupKeys) {
146
+ const e = jobs.get(k);
147
+ if (e && e.job.status === "downloading") {
148
+ adopted = e;
149
+ break;
150
+ }
151
+ }
152
+ if (adopted) {
153
+ // Re-index THIS call's keys onto the adopted entry (#420 codex round 3, rule 1):
154
+ // when URL B adopts URL A's in-flight job by destination, B's request key must
155
+ // now point at the same entry too — otherwise a later repeat of B (especially
156
+ // after a local→Manager flip that drops the destination key) would miss it and
157
+ // start a second writer onto one file. Entry-scoped, so it can't steal a live row.
158
+ for (const k of lookupKeys)
159
+ registerKey(adopted, k);
160
+ logger.info(`Download already in flight, adopting it: ${adopted.job.id}`, {
87
161
  url,
88
162
  target_subfolder: targetSubfolder,
89
163
  filename,
90
164
  });
91
- return existing;
165
+ return adopted;
166
+ }
167
+ // No in-flight match. Retire any superseded (done/error) entries shadowing our keys
168
+ // — entry-scoped, so we only clear rows still pointing at that finished entry and
169
+ // never delete a row now owned by a different, live writer (rule 2).
170
+ const retired = new Set();
171
+ for (const k of lookupKeys) {
172
+ const e = jobs.get(k);
173
+ if (e && !retired.has(e)) {
174
+ retireEntry(e);
175
+ retired.add(e);
176
+ }
92
177
  }
93
178
  const job = {
94
179
  id,
@@ -101,7 +186,7 @@ onComplete) {
101
186
  };
102
187
  // The promise is stored, never left dangling — an unhandled rejection here
103
188
  // would take down the process on a simple 404.
104
- const settled = downloadModel(url, targetSubfolder, filename, auth)
189
+ const settled = downloadModel(url, targetSubfolder, filename, auth, dispatchToManager)
105
190
  .then(async (path) => {
106
191
  job.path = path;
107
192
  if (onComplete) {
@@ -125,19 +210,31 @@ onComplete) {
125
210
  job.error = err instanceof Error ? err.message : String(err);
126
211
  job.finished_at = Date.now();
127
212
  });
128
- const entry = { job, settled };
129
- jobs.set(id, entry);
213
+ // Index under EVERY key (deduped) so any of them adopts this one writer. Uses the
214
+ // entry-scoped registerKey guard so a fresh registration can never overwrite a row
215
+ // still owned by a different, live writer (rule 3).
216
+ const entry = { job, settled, keys: [] };
217
+ for (const k of new Set(lookupKeys))
218
+ registerKey(entry, k);
130
219
  return entry;
131
220
  }
132
221
  export function getDownloadJob(id) {
133
- // The registry is keyed by the distinct public id (URL+destination), so each
134
- // destination resolves to its own job.
222
+ // The registry indexes each job under its request key and (when local) its
223
+ // destination key; the public id is one of those, so a direct get resolves it.
135
224
  return jobs.get(id)?.job;
136
225
  }
137
226
  export function listDownloadJobs() {
138
- return [...jobs.values()]
139
- .map((e) => e.job)
140
- .sort((a, b) => b.started_at - a.started_at);
227
+ // One Entry is indexed under multiple keys — dedup by identity so a job appears
228
+ // once regardless of how many keys point at it.
229
+ const seen = new Set();
230
+ const out = [];
231
+ for (const e of jobs.values()) {
232
+ if (seen.has(e))
233
+ continue;
234
+ seen.add(e);
235
+ out.push(e.job);
236
+ }
237
+ return out.sort((a, b) => b.started_at - a.started_at);
141
238
  }
142
239
  /** Test seam — the registry is process-global otherwise. */
143
240
  export function resetDownloadJobs() {
@@ -1 +1 @@
1
- {"version":3,"file":"download-jobs.js","sourceRoot":"","sources":["../../src/services/download-jobs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"download-jobs.js","sourceRoot":"","sources":["../../src/services/download-jobs.ts"],"names":[],"mappings":"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"}
@@ -14,12 +14,16 @@
14
14
  // - formatEnvBlock(caps): a PURE function (stats object → compact string) that
15
15
  // is unit-tested and omits unknown fields cleanly.
16
16
  import { execFile } from "node:child_process";
17
- import { existsSync } from "node:fs";
18
17
  import { createRequire } from "node:module";
19
18
  import { comfyuiFetch } from "../comfyui/fetch.js";
20
19
  import { platform, release, totalmem, cpus } from "node:os";
21
- import { join } from "node:path";
22
20
  import { isForceRemoteFlagSet } from "../config.js";
21
+ import { resolveComfyuiPython } from "./workspace-env.js";
22
+ // The interpreter resolver lives in workspace-env (which owns ComfyUI-base
23
+ // resolution) so get_environment and this panel probe share ONE live-first
24
+ // implementation and can never disagree (#401 / PR #433). Re-export for
25
+ // back-compat with existing importers/tests.
26
+ export { resolveComfyuiPython };
23
27
  const IS_WIN = platform() === "win32";
24
28
  // ---------------------------------------------------------------------------
25
29
  // Small helpers
@@ -244,60 +248,12 @@ async function detectAttentionFromComfyLog(comfyuiUrl, timeoutMs) {
244
248
  // Triton + SageAttention detection (find the ComfyUI python, then import-probe)
245
249
  // ---------------------------------------------------------------------------
246
250
  /**
247
- * Locate the python that ComfyUI actually runs on, the way the
248
- * triton-sageattention skill describes: prefer the standalone-env / python_embeded
249
- * / .venv interpreter under COMFYUI_PATH (or the install root inferred from the
250
- * running server's argv main.py), then fall back to PATH python. Returns the
251
- * first candidate that exists on disk, or a PATH name as a last resort.
251
+ * Back-compat shim: returns just the interpreter path (LIVE-first resolution lives
252
+ * in workspace-env.resolveComfyuiPython). Prefer resolveComfyuiPython when the caller
253
+ * needs to know whether the interpreter is the LIVE server's own (issue #401).
252
254
  */
253
255
  export function findComfyuiPython(comfyuiPath, statsArgv) {
254
- const names = IS_WIN ? ["python.exe", "python"] : ["python3", "python"];
255
- const roots = [];
256
- if (comfyuiPath)
257
- roots.push(comfyuiPath);
258
- // Infer the install root from the running server's argv (…/main.py).
259
- if (Array.isArray(statsArgv)) {
260
- const mainPy = statsArgv.find((a) => typeof a === "string" && /main\.py$/i.test(a));
261
- if (mainPy) {
262
- const root = mainPy.replace(/[\\/]+main\.py$/i, "");
263
- if (root && !roots.includes(root))
264
- roots.push(root);
265
- }
266
- }
267
- const candidates = [];
268
- for (const root of roots) {
269
- if (IS_WIN) {
270
- candidates.push(join(root, "standalone-env", "python.exe"));
271
- candidates.push(join(root, "python_embeded", "python.exe"));
272
- candidates.push(join(root, ".venv", "Scripts", "python.exe"));
273
- candidates.push(join(root, "venv", "Scripts", "python.exe"));
274
- // Desktop app keeps the embedded python a level up beside the install.
275
- candidates.push(join(root, "..", "python_embeded", "python.exe"));
276
- }
277
- else {
278
- candidates.push(join(root, ".venv", "bin", "python3"));
279
- candidates.push(join(root, ".venv", "bin", "python"));
280
- candidates.push(join(root, "venv", "bin", "python3"));
281
- candidates.push(join(root, "venv", "bin", "python"));
282
- }
283
- }
284
- for (const c of candidates) {
285
- // Skip UNC / network roots (\\server\share) — a dead/slow network path makes
286
- // existsSync() block for seconds and we gather env at startup. Local drive
287
- // paths are instant. (Linux/Mac UNC isn't a thing; this is the Windows risk.)
288
- if (/^\\\\/.test(c))
289
- continue;
290
- try {
291
- if (existsSync(c))
292
- return c;
293
- }
294
- catch {
295
- // ignore and continue
296
- }
297
- }
298
- // Last resort: a PATH-resolved interpreter (may not be ComfyUI's, but better
299
- // than nothing for the import probe).
300
- return names[0];
256
+ return resolveComfyuiPython(comfyuiPath, statsArgv).python;
301
257
  }
302
258
  /**
303
259
  * Probe whether triton + sageattention are importable in the ComfyUI python.
@@ -313,8 +269,12 @@ export function probeTritonSage(pythonExe, timeoutMs = 5000) {
313
269
  return;
314
270
  }
315
271
  // Print a clear per-package marker so we can tell which imported, even if one
316
- // succeeds and the other fails (avoids an all-or-nothing answer).
317
- const code = "import importlib.util as u;" +
272
+ // succeeds and the other fails (avoids an all-or-nothing answer). Also print
273
+ // the interpreter's own major.minor so the caller can confirm we probed the
274
+ // SAME python the running ComfyUI reports (#401 — a mismatch means we're
275
+ // looking at the wrong environment and any negative is untrustworthy).
276
+ const code = "import importlib.util as u,sys;" +
277
+ "print('python', '%d.%d' % sys.version_info[:2]);" +
318
278
  "print('triton', u.find_spec('triton') is not None);" +
319
279
  "print('sageattention', u.find_spec('sageattention') is not None)";
320
280
  let done = false;
@@ -334,10 +294,15 @@ export function probeTritonSage(pythonExe, timeoutMs = 5000) {
334
294
  return "unknown";
335
295
  return m[1] === "True" ? "installed" : "not-installed";
336
296
  };
297
+ const pyMatch = out.match(/^python\s+(\d+\.\d+)/m);
337
298
  // If python ran but errored AFTER printing partial output, still trust
338
299
  // whatever lines we got; missing lines stay "unknown".
339
300
  void err;
340
- resolve({ triton: read("triton"), sageattention: read("sageattention") });
301
+ resolve({
302
+ triton: read("triton"),
303
+ sageattention: read("sageattention"),
304
+ pythonVersion: pyMatch ? pyMatch[1] : undefined,
305
+ });
341
306
  });
342
307
  child.on?.("error", () => {
343
308
  if (done)
@@ -347,6 +312,25 @@ export function probeTritonSage(pythonExe, timeoutMs = 5000) {
347
312
  });
348
313
  });
349
314
  }
315
+ /**
316
+ * Reconcile a raw import-probe tri-state against how much we trust the interpreter
317
+ * we probed (#401). A definitive "not-installed" is only believable when we probed
318
+ * ComfyUI's OWN python — i.e. the LIVE interpreter resolved from the running server's
319
+ * argv root, whose major.minor also matches what /system_stats reports. When the
320
+ * interpreter is NOT the live one (a bare PATH fallback, or a different/persisted
321
+ * workspace) or its version disagrees with the running ComfyUI, we are looking at the
322
+ * wrong environment, so a "not-installed" is downgraded to "unknown" rather than
323
+ * emitted as a false negative that would make an agent disable working acceleration.
324
+ * Positives pass through unchanged (a positive can't be a harmful false negative).
325
+ */
326
+ export function reconcileProbeState(state, opts) {
327
+ const s = state ?? "unknown";
328
+ const versionMismatch = !!(opts.runningPython &&
329
+ opts.probePython &&
330
+ opts.runningPython !== opts.probePython);
331
+ const trustworthy = opts.live && !versionMismatch;
332
+ return s === "not-installed" && !trustworthy ? "unknown" : s;
333
+ }
350
334
  // ---------------------------------------------------------------------------
351
335
  // Backend availability (active provider + whether the OTHER is resolvable)
352
336
  // ---------------------------------------------------------------------------
@@ -416,12 +400,38 @@ export async function gatherEnvCapabilities(opts) {
416
400
  if (opts.comfyuiUrl) {
417
401
  caps.manager = await withTimeout(probeManagerGeneration(opts.comfyuiUrl, opts.statsTimeoutMs ?? 4000), (opts.statsTimeoutMs ?? 4000) + 1000).then((m) => m ?? "unknown");
418
402
  }
419
- // --- triton + sageattention (find python, import-probe, ~5s cap) ---
420
- const python = findComfyuiPython(opts.comfyuiPath, statsArgv);
421
- const tritonTimeout = opts.tritonTimeoutMs ?? 5000;
422
- const ts = await withTimeout(probeTritonSage(python, tritonTimeout), tritonTimeout + 1000);
423
- caps.triton = ts?.triton ?? "unknown";
424
- caps.sageattention = ts?.sageattention ?? "unknown";
403
+ // --- triton + sageattention (resolve the LIVE python, import-probe, ~5s cap) ---
404
+ // In REMOTE mode the local python-import probe can't reach the server's host, and a
405
+ // coincident LOCAL path is NOT the remote interpreter — probing it risks BOTH a
406
+ // false negative and a false positive for the remote server. So skip the probe
407
+ // entirely and rely solely on the ComfyUI-log positive markers below (#401 round 3).
408
+ const remote = caps.location === "REMOTE";
409
+ let live = false;
410
+ let ts;
411
+ if (!remote) {
412
+ const resolved = resolveComfyuiPython(opts.comfyuiPath, statsArgv);
413
+ live = resolved.live;
414
+ const tritonTimeout = opts.tritonTimeoutMs ?? 5000;
415
+ ts = await withTimeout(probeTritonSage(resolved.python, tritonTimeout), tritonTimeout + 1000);
416
+ }
417
+ // Only trust a definitive "not-installed" when we probed the LIVE running server's
418
+ // OWN interpreter (#401). Otherwise it can be the WRONG python:
419
+ // 1. A bare PATH fallback (no on-disk venv/embedded interpreter found).
420
+ // 2. A different/persisted workspace that merely happens to have a venv — its
421
+ // negative would still be a false report about the running instance.
422
+ // 3. Its major.minor disagrees with what /system_stats reports.
423
+ // 4. REMOTE mode — no local interpreter is the server's (probe skipped above).
424
+ // In each case a "not-installed" is untrustworthy, so we degrade it to "unknown"
425
+ // rather than emit a false negative that makes an agent disable working
426
+ // acceleration. A positive ("installed") is still reported — it can't be a false
427
+ // negative, and the log-marker check below only ever reinforces a positive.
428
+ const reconcile = (state) => reconcileProbeState(state, {
429
+ live,
430
+ runningPython: caps.python,
431
+ probePython: ts?.pythonVersion,
432
+ });
433
+ caps.triton = reconcile(ts?.triton);
434
+ caps.sageattention = reconcile(ts?.sageattention);
425
435
  // A positive signal from the ComfyUI HOST's log wins over the local python probe:
426
436
  // in remote mode (pod) the probe can't reach the host, and even locally the log
427
437
  // reflects what ComfyUI is actually USING. So the agent sees the host's real
@@ -1 +1 @@
1
- {"version":3,"file":"env-capabilities.js","sourceRoot":"","sources":["../../src/services/env-capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env-capabilities.js","sourceRoot":"","sources":["../../src/services/env-capabilities.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
2
2
  import { readdir, stat, mkdir, readFile } from "node:fs/promises";
3
3
  import { join, basename, resolve, relative, sep, isAbsolute } from "node:path";
4
4
  import { config, isRemoteMode } from "../config.js";
5
- import { getClient } from "../comfyui/client.js";
5
+ import { getClient, getSystemStats } from "../comfyui/client.js";
6
6
  import { getExtraModelRoots } from "./extra-paths.js";
7
7
  import { resolveEffectiveComfyUIBase } from "./workspace-env.js";
8
8
  import { installModelViaManager } from "./node-management.js";
@@ -10,7 +10,7 @@ import { ModelError, ValidationError } from "../utils/errors.js";
10
10
  import { logger } from "../utils/logger.js";
11
11
  import { downloadWithCache } from "./download-cache.js";
12
12
  import { reportDownloadProgress } from "./download-progress.js";
13
- import { resolveModelsDir } from "./output-dir.js";
13
+ import { resolveModelsDir, parseModelsDirFromArgv } from "./output-dir.js";
14
14
  import { applyDownloadAuth, redactUrlForLogs, } from "./download-auth.js";
15
15
  export const MODEL_SUBDIRS = [
16
16
  "checkpoints",
@@ -558,7 +558,56 @@ async function downloadModelViaManagerRemote(url, targetSubfolder, filename, aut
558
558
  });
559
559
  return `${normalizedSubfolder}/${resolvedFilename} (dispatched to the remote ComfyUI via ComfyUI-Manager — download continues server-side; the file lists under /models when complete)${authWarning}`;
560
560
  }
561
- export async function downloadModel(url, targetSubfolder, filename, auth) {
561
+ /**
562
+ * Decide whether a model download must be handed to the CONNECTED ComfyUI's
563
+ * ComfyUI-Manager (a server-side fetch) instead of being streamed to local disk.
564
+ *
565
+ * Returns true when:
566
+ * - REMOTE mode — there is no local filesystem at all (the original behavior); OR
567
+ * - we are NOMINALLY LOCAL (loopback target) but have NO resolvable local base:
568
+ * COMFYUI_PATH is unset — or was LOST across a panel/orchestrator reconnect
569
+ * (#420) — and no default workspace is saved, AND the connected server did not
570
+ * advertise a discoverable `--base-directory` to stream into, YET a live server
571
+ * IS reachable to accept a Manager dispatch. This is exactly the reconnect
572
+ * failure in #420: the previous session downloaded fine, the reconnect dropped
573
+ * the effective base, and the local path then threw "no local ComfyUI path
574
+ * configured" instead of routing through the still-connected Manager (the same
575
+ * route list_local_models keeps using over HTTP). #418 fixed base resolution
576
+ * at START; this keeps downloads working when the base goes missing LATER.
577
+ *
578
+ * Stays LOCAL (false) whenever a local base is resolvable (resolveEffectiveComfyUIBase)
579
+ * OR the server reports a base/models dir we can write to directly; also false when
580
+ * no server is reachable, so the local resolver surfaces its clear, actionable error
581
+ * rather than silently succeeding.
582
+ */
583
+ export async function shouldDispatchDownloadToManager() {
584
+ if (isRemoteMode())
585
+ return true;
586
+ // A configured/auto-detected COMFYUI_PATH or saved default workspace → stream local.
587
+ if (resolveEffectiveComfyUIBase())
588
+ return false;
589
+ try {
590
+ const stats = await getSystemStats();
591
+ // Reachable server: stream locally only if it exposes a base/models dir we can
592
+ // write to; otherwise hand the fetch to its ComfyUI-Manager (reconnect-safe).
593
+ return !parseModelsDirFromArgv(stats.system?.argv);
594
+ }
595
+ catch {
596
+ // No reachable server → nothing to dispatch to. Let the local resolver throw.
597
+ return false;
598
+ }
599
+ }
600
+ export async function downloadModel(url, targetSubfolder, filename, auth,
601
+ /**
602
+ * The ALREADY-DECIDED route (Manager vs local disk). startDownloadJob computes
603
+ * shouldDispatchDownloadToManager() ONCE to key the job identity, then threads
604
+ * that same decision here so the writer can never diverge from the key — a
605
+ * reconnect/reachability flip BETWEEN two evaluations would otherwise split the
606
+ * job (Manager-key + local-writer, or a duplicate job) (#420 codex round 1).
607
+ * Omitted by direct callers (the download_model tool path without a job), which
608
+ * evaluate the predicate themselves.
609
+ */
610
+ dispatchToManager) {
562
611
  // Region flags (issue #127) applied at THE choke point every download path
563
612
  // funnels through (local disk AND the remote Manager dispatch below).
564
613
  const wasHfUrl = /^https?:\/\/huggingface\.co([/?#]|$)/i.test(url);
@@ -575,7 +624,12 @@ export async function downloadModel(url, targetSubfolder, filename, auth) {
575
624
  // can carry query params); header/basic/bearer auth can't be forwarded to
576
625
  // Manager, so those are surfaced as a clear warning rather than reported as a
577
626
  // clean success.
578
- if (isRemoteMode()) {
627
+ // Use the route the caller already decided (job path), else evaluate it now
628
+ // (direct callers). Never re-evaluate when a decision was threaded in — that is
629
+ // the split-brain guard: the writer must follow the SAME route the job id was
630
+ // keyed on, even if reachability/base config flipped since (#420 codex round 1).
631
+ const routeToManager = dispatchToManager ?? (await shouldDispatchDownloadToManager());
632
+ if (routeToManager) {
579
633
  return downloadModelViaManagerRemote(url, targetSubfolder, filename, auth);
580
634
  }
581
635
  // Root the destination at the LIVE server's models dir (its --base-directory),