comfyui-mcp 0.49.2 → 0.49.4

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 (61) hide show
  1. package/dist/orchestrator/agent-backend.js +8 -0
  2. package/dist/orchestrator/agent-backend.js.map +1 -1
  3. package/dist/orchestrator/codex-backend.js +49 -0
  4. package/dist/orchestrator/codex-backend.js.map +1 -1
  5. package/dist/orchestrator/grok-backend.js +5 -0
  6. package/dist/orchestrator/grok-backend.js.map +1 -1
  7. package/dist/orchestrator/index.js +317 -22
  8. package/dist/orchestrator/index.js.map +1 -1
  9. package/dist/orchestrator/ollama-backend.js +11 -2
  10. package/dist/orchestrator/ollama-backend.js.map +1 -1
  11. package/dist/orchestrator/panel-agent.js +591 -67
  12. package/dist/orchestrator/panel-agent.js.map +1 -1
  13. package/dist/orchestrator/panel-tools.js +518 -65
  14. package/dist/orchestrator/panel-tools.js.map +1 -1
  15. package/dist/orchestrator/run-completion-journal.js +914 -0
  16. package/dist/orchestrator/run-completion-journal.js.map +1 -0
  17. package/dist/orchestrator/session-store.js +11 -3
  18. package/dist/orchestrator/session-store.js.map +1 -1
  19. package/dist/services/asset-reconcile.js +83 -0
  20. package/dist/services/asset-reconcile.js.map +1 -0
  21. package/dist/services/asset-registry.js +9 -2
  22. package/dist/services/asset-registry.js.map +1 -1
  23. package/dist/services/download-jobs.js +178 -14
  24. package/dist/services/download-jobs.js.map +1 -1
  25. package/dist/services/download-progress.js +16 -18
  26. package/dist/services/download-progress.js.map +1 -1
  27. package/dist/services/extra-paths.js +61 -9
  28. package/dist/services/extra-paths.js.map +1 -1
  29. package/dist/services/hello-retarget.js +165 -0
  30. package/dist/services/hello-retarget.js.map +1 -0
  31. package/dist/services/job-history.js +50 -0
  32. package/dist/services/job-history.js.map +1 -1
  33. package/dist/services/job-watcher.js +38 -7
  34. package/dist/services/job-watcher.js.map +1 -1
  35. package/dist/services/manifest.js +92 -9
  36. package/dist/services/manifest.js.map +1 -1
  37. package/dist/services/model-resolver.js +616 -17
  38. package/dist/services/model-resolver.js.map +1 -1
  39. package/dist/services/output-dir.js +63 -15
  40. package/dist/services/output-dir.js.map +1 -1
  41. package/dist/services/panel-pin-guard.js +6 -62
  42. package/dist/services/panel-pin-guard.js.map +1 -1
  43. package/dist/services/ui-bridge.js +111 -14
  44. package/dist/services/ui-bridge.js.map +1 -1
  45. package/dist/services/workspace-env.js +179 -3
  46. package/dist/services/workspace-env.js.map +1 -1
  47. package/dist/tools/assets.js +34 -2
  48. package/dist/tools/assets.js.map +1 -1
  49. package/dist/tools/extra-paths.js +6 -4
  50. package/dist/tools/extra-paths.js.map +1 -1
  51. package/dist/tools/model-extras.js +26 -7
  52. package/dist/tools/model-extras.js.map +1 -1
  53. package/dist/tools/model-management.js +36 -8
  54. package/dist/tools/model-management.js.map +1 -1
  55. package/dist/tools/report-issue.js +12 -2
  56. package/dist/tools/report-issue.js.map +1 -1
  57. package/dist/tools/vocabulary.js +21 -0
  58. package/dist/tools/vocabulary.js.map +1 -1
  59. package/package.json +1 -1
  60. package/scripts/gen-tool-docs.ts +138 -4
  61. package/scripts/tool-doc-examples.ts +794 -0
@@ -0,0 +1,165 @@
1
+ // Panel-`hello` ComfyUI-target retarget policy (#303 zombie-tab guard + #756
2
+ // restart-window fix + the codex-gate trust model), extracted from the
3
+ // orchestrator so the decision is unit-testable. Pure decision logic — the
4
+ // probe is injected, so no I/O lives here.
5
+ //
6
+ // Background: a panel tab's hello carries the ComfyUI URL the browser was
7
+ // SERVED from (window.location), and the orchestrator retargets to it — that
8
+ // is the auto-point-at-whatever-ComfyUI-the-user-has-open mechanism, and the
9
+ // ONLY refresh of the connected target after a ComfyUI restart (a connected
10
+ // panel never re-hellos). #303 added a liveness veto: probe the hello URL's
11
+ // /system_stats first and drop the retarget when it doesn't answer, because a
12
+ // STALE browser tab on a DEAD instance kept dragging the target to a corpse.
13
+ // #756: the veto was UNCONDITIONAL — it also dropped the correction back to a
14
+ // LOCAL target when that hello raced the local ComfyUI's own restart window,
15
+ // pinning a stale (possibly REMOTE) target forever.
16
+ //
17
+ // TRUST MODEL (codex gate on #756): hello.comfyui_url is page-JS-writable —
18
+ // a stale, confused, or malicious tab can CLAIM any instance. The ONLY
19
+ // unspoofable proof of which ComfyUI a real browser tab fronts is the
20
+ // server-observed WebSocket handshake Origin (ui-bridge's serverOrigin: the
21
+ // browser sets it and forbids page scripts from overriding it). So the
22
+ // decision is two-tiered:
23
+ //
24
+ // TRUSTED (handshake origin canonically matches the claimed URL): the tab
25
+ // provably fronts what it names. All #303/#756 semantics apply — the
26
+ // same-target no-probe shortcut, the RunPod-proxy skip (booting pods answer
27
+ // late), the healthy-current veto, and the #756 both-dead recovery.
28
+ //
29
+ // UNTRUSTED (origin mismatches, or absent — a non-browser/relay client):
30
+ // NOTHING is taken on the claim's word. No no-probe shortcut (the
31
+ // same-target comparison keys on the observed origin, never the bare
32
+ // claim), no proxy skip, and NO both-dead recovery — applying a
33
+ // wrong-host retarget to an unverifiable claim is the wrong-workflow
34
+ // hazard the gate closed. The claim may still apply on EVIDENCE: probe
35
+ // the claimed instance, and a live, answering one earns the retarget; a
36
+ // dead one fails closed.
37
+ //
38
+ // Locality is always classified from the target URL's host (durable), never
39
+ // from a probe reading (transient).
40
+ /**
41
+ * Canonical form for same-target comparisons — scheme-aware but
42
+ * DEFAULT-PORT-INSENSITIVE: strip only the scheme's actual default (:443 for
43
+ * https, :80 for http); http://h:443 and http://h are NOT the same endpoint.
44
+ * Trailing slashes stripped. Unparseable input is returned slash-stripped.
45
+ * This is the single implementation the orchestrator's target dedupe and this
46
+ * module's same-target check share, so the two can never drift apart.
47
+ */
48
+ export function canonComfyuiTargetUrl(u) {
49
+ try {
50
+ const p = new URL(u);
51
+ if ((p.protocol === "https:" && p.port === "443") || (p.protocol === "http:" && p.port === "80"))
52
+ p.port = "";
53
+ return p.toString().replace(/\/+$/, "");
54
+ }
55
+ catch {
56
+ return u.replace(/\/+$/, "");
57
+ }
58
+ }
59
+ /** Loopback family canonicalization, mirroring loopbackFamily in
60
+ * orchestrator/panel-tools.ts (kept local so this leaf module doesn't import
61
+ * the heavyweight panel-tools unit): every IPv4-family loopback literal
62
+ * (127.0.0.1 / the 0.0.0.0 wildcard) → 127.0.0.1; every IPv6-family literal
63
+ * (::1 / the :: wildcard) → ::1. The families stay DISTINCT — a v4 and a v6
64
+ * instance at the same port are different instances — and `localhost` is
65
+ * deliberately NOT canonicalized: a DNS-ambiguous name can't be pinned to a
66
+ * family, so it never aliases a concrete loopback literal. */
67
+ function loopbackFamilyKey(host) {
68
+ const h = host.toLowerCase().replace(/^\[|\]$/g, "");
69
+ if (h === "127.0.0.1" || h === "0.0.0.0")
70
+ return "127.0.0.1";
71
+ if (h === "::1" || h === "::" || h === "0000:0000:0000:0000:0000:0000:0000:0000")
72
+ return "::1";
73
+ return null;
74
+ }
75
+ /**
76
+ * Canonical scheme://host:port key of a ComfyUI URL for instance-identity
77
+ * comparison — path ignored (the WebSocket handshake Origin carries none; a
78
+ * basePath on the claim is a mount on the proven instance), default ports made
79
+ * explicit, loopback hosts family-canonicalized. null when unparseable.
80
+ * Mirrors httpOriginOf in orchestrator/panel-tools.ts.
81
+ */
82
+ export function comfyuiOriginKey(rawUrl) {
83
+ try {
84
+ const u = new URL(rawUrl);
85
+ const port = u.port || (u.protocol === "https:" ? "443" : "80");
86
+ const host = u.hostname.toLowerCase();
87
+ return `${u.protocol}//${loopbackFamilyKey(host) ?? host}:${port}`;
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Decide whether a panel hello's `comfyui_url` should be applied as the new
95
+ * ComfyUI target.
96
+ *
97
+ * `observedOrigin` is the SERVER-OBSERVED WebSocket handshake Origin of the
98
+ * tab that sent the hello (ui-bridge's tabServerOrigin) — the ONLY unspoofable
99
+ * corroboration of the claim. Undefined for non-browser/relay clients, whose
100
+ * claims are therefore always probed, never trusted.
101
+ *
102
+ * `probe` answers whether a given /system_stats URL responds (the caller
103
+ * supplies the timeout); it must never throw — a probe failure reads as
104
+ * unreachable.
105
+ */
106
+ export async function judgeHelloRetarget(opts) {
107
+ const { helloUrl, currentUrl, probe } = opts;
108
+ const observedOrigin = opts.observedOrigin?.trim() || undefined;
109
+ if (typeof helloUrl !== "string")
110
+ return { apply: false, reason: "not-a-url", trusted: false };
111
+ const base = helloUrl.trim().replace(/\/+$/, "");
112
+ if (!base)
113
+ return { apply: false, reason: "not-a-url", trusted: false };
114
+ // TRUST: the claim is page-JS-writable; only the browser-set handshake
115
+ // Origin (unforgeable by page JS) proves which instance the tab fronts.
116
+ // Compared canonically at origin granularity — the Origin carries no path.
117
+ const claimKey = comfyuiOriginKey(base);
118
+ const originKey = observedOrigin ? comfyuiOriginKey(observedOrigin) : null;
119
+ const trusted = claimKey !== null && originKey !== null && claimKey === originKey;
120
+ if (!trusted) {
121
+ // Nothing is taken on the claim's word: no no-probe shortcut (the
122
+ // same-target comparison keys on the observed origin, never the bare
123
+ // claim — and a trusted same-target claim implies the observed origin
124
+ // fronts the current target, so no trusted case is lost here), no RunPod
125
+ // skip, and NO #756 both-dead recovery. The claim may apply on EVIDENCE
126
+ // only: a live, answering instance earns the retarget; a dead or
127
+ // unreachable one fails closed (#303's zombie-tab hazard in its general
128
+ // form — a wrong-host retarget is a wrong-workflow hazard regardless of
129
+ // adversary framing).
130
+ if (await probe(`${base}/system_stats`)) {
131
+ return { apply: true, reason: "healthy-untrusted", base, trusted };
132
+ }
133
+ return { apply: false, reason: "vetoed-untrusted", base, trusted };
134
+ }
135
+ // TRUSTED claim: the tab provably fronts the instance it names.
136
+ // Same-target hello — the corroborated claim IS the current target, so the
137
+ // observed origin fronts it too: a no-op retarget that must not stall on
138
+ // probes during the target's own restart window.
139
+ if (canonComfyuiTargetUrl(base) === canonComfyuiTargetUrl(currentUrl)) {
140
+ return { apply: true, reason: "same-target", base, trusted };
141
+ }
142
+ // RunPod proxies skip the probe: a booting pod answers late — readiness is
143
+ // the connector's job (#303). Trust-gated: the tab fronts the pod it names.
144
+ if (/\.proxy\.runpod\.net/i.test(base)) {
145
+ return { apply: true, reason: "runpod-proxy", base, trusted };
146
+ }
147
+ if (await probe(`${base}/system_stats`)) {
148
+ return { apply: true, reason: "healthy", base, trusted };
149
+ }
150
+ // The claimed instance doesn't answer. Veto ONLY while the current target
151
+ // is healthy (#303's zombie-tab guard: a stale tab on a dead instance must
152
+ // not steal a GOOD target). When the current target doesn't answer EITHER,
153
+ // both reads are dead — trust the live tab's corroborated hello: applying
154
+ // keys locality on the claim's durable host (never on a transient probe)
155
+ // and is the self-healing direction. #756: vetoing the LOCAL hello during
156
+ // the ComfyUI restart window pinned a stale REMOTE target forever — a
157
+ // connected panel never re-hellos — leaving every tool misclassified as
158
+ // remote.
159
+ const currentBase = currentUrl.trim().replace(/\/+$/, "");
160
+ if (currentBase && (await probe(`${currentBase}/system_stats`))) {
161
+ return { apply: false, reason: "vetoed-unreachable", base, trusted };
162
+ }
163
+ return { apply: true, reason: "current-also-unreachable", base, trusted };
164
+ }
165
+ //# sourceMappingURL=hello-retarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-retarget.js","sourceRoot":"","sources":["../../src/services/hello-retarget.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,55 @@
1
1
  import { z } from "zod";
2
2
  export const TRACEBACK_MAX_CHARS = 2000;
3
+ /**
4
+ * Affirmative-success test for a history entry — the ONE eligibility gate both
5
+ * asset-registration paths (JobWatcher.handleCompletion and the list_assets
6
+ * history reconcile) share, so a run can never become an asset without real
7
+ * success evidence (#751 codex gate r3).
8
+ *
9
+ * It deliberately does NOT trust buildCompletionNotification's derived status:
10
+ * that derivation defaults to "success" whenever messages carry no well-formed
11
+ * execution_error/interrupted event, which silently promotes a run ComfyUI
12
+ * marked status_str:"error" (or any entry with missing/malformed status or
13
+ * messages) to "success". Here the entry's OWN status_str must affirm success
14
+ * AND no error/interrupt message may exist; anything short fails toward NOT
15
+ * registering.
16
+ */
17
+ export function hasAffirmativeSuccessStatus(entry) {
18
+ if (entry?.status?.status_str !== "success")
19
+ return false;
20
+ const messages = normalizeHistoryMessages(entry);
21
+ return !messages.some((m) => m[0] === "execution_error" || m[0] === "execution_interrupted");
22
+ }
23
+ /** ComfyUI history timestamps are epoch seconds or milliseconds depending on
24
+ * version — infer from magnitude, mirroring durationMs below. */
25
+ function normalizeEpochMs(ts) {
26
+ if (typeof ts !== "number" || !Number.isFinite(ts))
27
+ return undefined;
28
+ if (ts > 1_000_000_000_000)
29
+ return ts; // epoch ms
30
+ if (ts > 1_000_000_000)
31
+ return ts * 1000; // epoch s
32
+ return undefined;
33
+ }
34
+ /**
35
+ * The run's real completion time (ms epoch), taken ONLY from the
36
+ * execution_success message — the one truthful completion timestamp recorded
37
+ * by ComfyUI. execution_start is deliberately not a fallback: it is start
38
+ * time, and using it would backdate a long render past the TTL / a `since`
39
+ * boundary and hide it. Values implausibly far in the future (clock skew,
40
+ * non-epoch garbage) are rejected. Returns undefined when history carries no
41
+ * trustworthy value — the caller must then use its own truthful observation
42
+ * time (watched path) or skip the record (reconcile path). Shared by both
43
+ * asset-registration paths so "real completion time" means the same thing on
44
+ * each (#751 codex gate r4).
45
+ */
46
+ export function historyCompletionTimeMs(entry, now) {
47
+ const success = normalizeHistoryMessages(entry).find((m) => m[0] === "execution_success");
48
+ const ms = normalizeEpochMs(success?.[1]?.timestamp);
49
+ if (ms === undefined || ms > now + 60_000)
50
+ return undefined;
51
+ return ms;
52
+ }
3
53
  const executionErrorSchema = z.object({
4
54
  node_id: z.union([z.string(), z.number()]).optional(),
5
55
  node_type: z.string().optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"job-history.js","sourceRoot":"","sources":["../../src/services/job-history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-history.js","sourceRoot":"","sources":["../../src/services/job-history.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { getCloudUrl, getComfyUIBaseUrl, isCloudMode, } from "../config.js";
6
6
  import { attachExecutionListeners } from "../comfyui/events.js";
7
7
  import { logger } from "../utils/logger.js";
8
8
  import { AssetRegistry } from "./asset-registry.js";
9
- import { analyzeHistoryEntry, normalizeHistoryMessages, } from "./job-history.js";
9
+ import { analyzeHistoryEntry, hasAffirmativeSuccessStatus, historyCompletionTimeMs, normalizeHistoryMessages, } from "./job-history.js";
10
10
  // ── Constants ──────────────────────────────────────────────────────────
11
11
  const COMPLETIONS_DIR = join(tmpdir(), "comfyui-mcp-completions");
12
12
  const HISTORY_FLUSH_DELAY_MS = 500;
@@ -41,6 +41,12 @@ function buildImageUrl(filename, subfolder, type) {
41
41
  }
42
42
  return `${getComfyUIBaseUrl()}/view?${params.toString()}`;
43
43
  }
44
+ function isHistoryMediaRef(value) {
45
+ if (value === null || typeof value !== "object")
46
+ return false;
47
+ const filename = value.filename;
48
+ return typeof filename === "string" && filename.length > 0;
49
+ }
44
50
  export function buildCompletionNotification(promptId, entry, startTime) {
45
51
  const messages = normalizeHistoryMessages(entry);
46
52
  const analysis = analyzeHistoryEntry(entry);
@@ -78,9 +84,13 @@ export function buildCompletionNotification(promptId, entry, startTime) {
78
84
  if (!nodeOutput || typeof nodeOutput !== "object")
79
85
  continue;
80
86
  const out = nodeOutput;
81
- // Extract image outputs (SaveImage, PreviewImage)
87
+ // Extract image outputs (SaveImage, PreviewImage) — malformed refs are
88
+ // filtered BEFORE any use, so a bad /history entry can neither crash the
89
+ // parse nor surface as an output with filename=undefined.
82
90
  if (Array.isArray(out.images)) {
83
- const images = out.images.map((img) => ({
91
+ const images = out.images
92
+ .filter(isHistoryMediaRef)
93
+ .map((img) => ({
84
94
  filename: img.filename,
85
95
  subfolder: img.subfolder ?? "",
86
96
  type: img.type ?? "output",
@@ -99,7 +109,7 @@ export function buildCompletionNotification(promptId, entry, startTime) {
99
109
  const videoData = out[videoKey];
100
110
  if (!Array.isArray(videoData))
101
111
  continue;
102
- for (const vid of videoData) {
112
+ for (const vid of videoData.filter(isHistoryMediaRef)) {
103
113
  videos.push({
104
114
  filename: vid.filename,
105
115
  subfolder: vid.subfolder ?? "",
@@ -130,6 +140,13 @@ async function handleCompletion(promptId, state, detectedBy) {
130
140
  if (state.completed)
131
141
  return;
132
142
  state.completed = true;
143
+ // The watch's OWN observed finish time: the moment this watcher detected
144
+ // the completion (WS event or poll tick). For a live-watched job this is a
145
+ // real, truthful observation — within one poll interval / WS latency of the
146
+ // actual finish — and serves as the createdAt fallback when the history
147
+ // entry carries no usable execution_success timestamp (never the registry's
148
+ // silent default-now; provenance is recorded on the record, #751 r4 gate).
149
+ const observedFinishAt = Date.now();
133
150
  logger.info(`Completion detected via ${detectedBy}`, { prompt_id: promptId });
134
151
  // Stop both monitoring tracks
135
152
  cleanup(state);
@@ -166,10 +183,22 @@ async function handleCompletion(promptId, state, detectedBy) {
166
183
  try {
167
184
  const notification = buildCompletionNotification(promptId, entry, state.startTime);
168
185
  // Register outputs with the AssetRegistry so they can be referenced by
169
- // asset_id for view_image / regenerate. Only register on successful
170
- // completion with a stored workflow snapshot.
171
- if (notification.status === "success" && state.workflow) {
186
+ // asset_id for view_image / regenerate. Registration requires AFFIRMATIVE
187
+ // success evidence — the shared predicate (job-history) both registration
188
+ // paths use. The live watch only detects "finished" (WS and poll both
189
+ // route success AND error to this handler), and notification.status is a
190
+ // derivation that defaults to success when messages are absent/malformed;
191
+ // the history entry's own status_str + messages are therefore the
192
+ // AUTHORITATIVE status source for registration on this path too. (The
193
+ // derived status still drives the completion FILE, where presenting a
194
+ // best-effort outcome is a display matter, not an asset guarantee.)
195
+ if (hasAffirmativeSuccessStatus(entry) && state.workflow) {
172
196
  try {
197
+ // createdAt is a REAL time, never the registry's silent default-now:
198
+ // prefer the entry's recorded execution_success timestamp; fall back
199
+ // to this watcher's own observed finish time — distinguishable via
200
+ // createdAtSource ("history" vs "observed").
201
+ const recordedAt = historyCompletionTimeMs(entry, observedFinishAt);
173
202
  const records = AssetRegistry.register({
174
203
  promptId,
175
204
  workflow: state.workflow,
@@ -182,6 +211,8 @@ async function handleCompletion(promptId, state, detectedBy) {
182
211
  url: img.url,
183
212
  })),
184
213
  })),
214
+ createdAt: recordedAt ?? observedFinishAt,
215
+ createdAtSource: recordedAt !== undefined ? "history" : "observed",
185
216
  });
186
217
  const idByKey = new Map(records.map((r) => [`${r.nodeId}|${r.filename}|${r.subfolder}|${r.type}`, r.assetId]));
187
218
  for (const output of notification.outputs) {
@@ -1 +1 @@
1
- {"version":3,"file":"job-watcher.js","sourceRoot":"","sources":["../../src/services/job-watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job-watcher.js","sourceRoot":"","sources":["../../src/services/job-watcher.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,8 @@ import { z } from "zod";
8
8
  import { config, isRemoteMode } from "../config.js";
9
9
  import { installCustomNode, installModelViaManager, listInstalledNodes, } from "./node-management.js";
10
10
  import { targetsPanelPackExactly } from "./panel-pin-guard.js";
11
- import { listLocalModels, resolveExistingModelFile, managerModelDestination, MODEL_SUBDIRS, } from "./model-resolver.js";
12
- import { startDownloadJob } from "./download-jobs.js";
11
+ import { listLocalModels, liveListingHasEntry, liveListingHasBasename, isUnderLiveModelRoots, currentLiveModelsRoot, resolveExistingModelFile, managerModelDestination, MODEL_SUBDIRS, } from "./model-resolver.js";
12
+ import { startDownloadJob, describePlacement } from "./download-jobs.js";
13
13
  import { resolveModelsDir } from "./output-dir.js";
14
14
  import { getSavedDefaultWorkspaceSync, resolveInstallInterpreter, resolveLiveComfyUIBase, } from "./workspace-env.js";
15
15
  import { ValidationError } from "../utils/errors.js";
@@ -675,13 +675,75 @@ async function applyManifestSections(manifest, localBase) {
675
675
  // Panel tray: watch the canonical category for the file to land (#143).
676
676
  trayCategory: category,
677
677
  });
678
- results.push(report("model", item, "applied", res.message));
678
+ // A Manager dispatch is ACCEPTED, not landed — Manager reports its queue task
679
+ // done even on failure, and there is no local file to verify. Reporting that
680
+ // as "applied" is the same fabricated success #369 is about, so it is PENDING
681
+ // with the caveat spelled out (codex gate, round 2).
682
+ results.push(report("model", item, "pending", `${res.message} NOTE: the dispatch was ACCEPTED, NOT verified as landed — ` +
683
+ "ComfyUI-Manager reports its queue task 'done' even on failure. Confirm with " +
684
+ "list_local_models before relying on it."));
679
685
  continue;
680
686
  }
681
687
  const target = await resolveLocalModelPath(model);
682
688
  const existing = await findExistingModel(target);
683
689
  if (existing) {
684
- results.push(report("model", item, "skipped", `Model already exists at ${existing}.`));
690
+ // "Already exists" is only a legitimate SKIP if the running ComfyUI can
691
+ // actually load it. On a locally-configured (non-live-resolved) models root
692
+ // an old file in a STALE install would otherwise satisfy the manifest while
693
+ // the live server has never seen it — the #369 failure, reached through the
694
+ // existing-file shortcut instead of a download (codex gate, round 3).
695
+ // Prefer the DECISIVE test when it is available: is the file we found
696
+ // physically inside a tree the running server reads? A name-only listing
697
+ // check cannot tell a stale `C:\Stale\...\x.safetensors` from the live
698
+ // server's own `D:\Live\...\x.safetensors` (codex gate, round 5).
699
+ // ONLY a positive containment result licenses the skip. A name-only listing
700
+ // hit cannot tell a stale `C:\Stale\...\x.safetensors` from the live server's
701
+ // OWN `D:\Live\...\x.safetensors`, so it may never promote an unconfirmed
702
+ // answer to "installed" (codex gate, round 8) — it is reported as a
703
+ // diagnostic on the pending item instead.
704
+ const visible = (await isUnderLiveModelRoots(existing, target.targetSubfolder.split(/[\\/]+/).filter(Boolean)[0])).inRoots;
705
+ if (visible === false) {
706
+ results.push(report("model", item, "failed", `A file exists at ${existing}, but it is NOT in any directory the connected ` +
707
+ "ComfyUI reads models from — it belongs to an install the running server does " +
708
+ "not use. Point COMFYUI_PATH at the ComfyUI that is actually running, or " +
709
+ "launch it with an absolute --base-directory."));
710
+ continue;
711
+ }
712
+ if (visible === undefined) {
713
+ // We could not establish that the running server reads from this path, so
714
+ // "already exists" is an UNVERIFIED claim. Report it as pending, never as
715
+ // a satisfied item (codex gate, rounds 4 and 8).
716
+ const listed = await liveListingHasEntry(target.targetSubfolder, target.filename);
717
+ results.push(report("model", item, "pending", `A file exists at ${existing}, but it could NOT be established that the ` +
718
+ "connected ComfyUI reads models from there (its install root could only be " +
719
+ "inferred from local configuration), so this is not confirmed as installed." +
720
+ (listed === true
721
+ ? ` The server does list "${target.filename}" under "${target.targetSubfolder}", but that may be its OWN copy elsewhere.`
722
+ : listed === false
723
+ ? ` The server does NOT list "${target.filename}" under "${target.targetSubfolder}".`
724
+ : "") +
725
+ " Check list_local_models."));
726
+ continue;
727
+ }
728
+ // Containment can still be satisfied by a HOST path that merely shares its
729
+ // name with the server's — a container reporting `--models-directory /models`
730
+ // while this host has its own unrelated `/models` (codex gate, round 15). So
731
+ // a SKIP additionally requires the running server to really serve a file of
732
+ // that name in the category. Matched by BASENAME, because findExistingModel
733
+ // accepts a nested hit within the served category and an exact-path check
734
+ // would fail legitimate installs.
735
+ const servedByLive = await liveListingHasBasename(target.targetSubfolder, target.filename);
736
+ results.push(servedByLive === true
737
+ ? report("model", item, "skipped", `Model already exists at ${existing}.`)
738
+ : servedByLive === false
739
+ ? report("model", item, "failed", `A file exists at ${existing}, but the connected ComfyUI does not list ` +
740
+ `"${target.filename}" under "${target.targetSubfolder}" at all — the models ` +
741
+ "directory it reported is not the one this file is in (this happens when " +
742
+ "ComfyUI runs in a container or behind a port-forward and its path also " +
743
+ "exists on this host). Confirm with list_local_models.")
744
+ : report("model", item, "pending", `A file exists at ${existing}, but the connected ComfyUI could not be asked ` +
745
+ `whether it serves "${target.filename}", so this is not confirmed as ` +
746
+ "installed. Check list_local_models."));
685
747
  continue;
686
748
  }
687
749
  const { job, settled } = await startDownloadJob(model.url, target.targetSubfolder, target.filename);
@@ -704,12 +766,28 @@ async function applyManifestSections(manifest, localBase) {
704
766
  ]);
705
767
  if (graceTimer)
706
768
  clearTimeout(graceTimer);
769
+ // ONE resolution for the batch: a verdict made against a DIFFERENT ComfyUI than
770
+ // the one connected now must not be re-asserted as an apply (#369).
771
+ const liveRootNow = await currentLiveModelsRoot();
707
772
  for (const { item, job } of enqueued) {
708
773
  if (job.status === "error") {
709
774
  results.push(report("model", item, "failed", job.error ?? "Model download failed."));
710
775
  }
711
776
  else if (job.status === "done") {
712
- results.push(report("model", item, "applied", `Model downloaded to ${job.path}.`));
777
+ // "applied" must mean the running ComfyUI can actually load it (#369). Same
778
+ // shared placement policy as download_model: an unconfirmed or demonstrably
779
+ // wrong placement is reported as such, never as a clean apply.
780
+ const placement = describePlacement(job, { liveModelsDir: liveRootNow });
781
+ results.push(
782
+ // "applied" must mean the running ComfyUI can actually load it (#369) —
783
+ // that is the whole failure, just wearing a manifest's clothes. A
784
+ // demonstrably unreadable placement is a FAILURE; an unconfirmed one is
785
+ // PENDING (the transfer finished, the placement has not been established).
786
+ placement.confirmed
787
+ ? report("model", item, "applied", `Model downloaded to ${job.path}${placement.pathQualifier}.`)
788
+ : placement.wrongPlace
789
+ ? report("model", item, "failed", `Model ${placement.pathLabel} ${job.path}, but it is NOT usable by the connected ComfyUI: ${placement.warning}`)
790
+ : report("model", item, "pending", `Model ${placement.pathLabel} ${job.path}. ${placement.warning}`));
713
791
  }
714
792
  else {
715
793
  results.push(report("model", item, "pending", `Model download is RUNNING in the background (job ${job.id}) — NOT yet complete, ` +
@@ -727,10 +805,15 @@ async function applyManifestSections(manifest, localBase) {
727
805
  for (const result of results)
728
806
  summary[result.status]++;
729
807
  return {
730
- // A still-running (pending) download is not a failure; success reflects only
731
- // that nothing FAILED. Pending items are reported separately so the caller
732
- // knows the apply isn't fully settled and must poll download_status.
733
- success: summary.failed === 0,
808
+ // `success` means the manifest is APPLIED AND VERIFIED — nothing failed AND
809
+ // nothing is still unsettled. A pending item is a real "not done": a transfer
810
+ // still running, a ComfyUI-Manager dispatch that was accepted but not verified
811
+ // as landed, or an existing file whose placement could not be established. All
812
+ // three used to fold into a `true` here, which is the same fabricate-success
813
+ // shape #369 is about, one level up (codex gate, round 15). Callers that only
814
+ // care about hard failures read `summary.failed`; the per-item results say
815
+ // exactly what is outstanding and how to confirm it.
816
+ success: summary.failed === 0 && summary.pending === 0,
734
817
  summary,
735
818
  results,
736
819
  };