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.
- package/dist/orchestrator/agent-backend.js +8 -0
- package/dist/orchestrator/agent-backend.js.map +1 -1
- package/dist/orchestrator/codex-backend.js +49 -0
- package/dist/orchestrator/codex-backend.js.map +1 -1
- package/dist/orchestrator/grok-backend.js +5 -0
- package/dist/orchestrator/grok-backend.js.map +1 -1
- package/dist/orchestrator/index.js +317 -22
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/ollama-backend.js +11 -2
- package/dist/orchestrator/ollama-backend.js.map +1 -1
- package/dist/orchestrator/panel-agent.js +591 -67
- package/dist/orchestrator/panel-agent.js.map +1 -1
- package/dist/orchestrator/panel-tools.js +518 -65
- package/dist/orchestrator/panel-tools.js.map +1 -1
- package/dist/orchestrator/run-completion-journal.js +914 -0
- package/dist/orchestrator/run-completion-journal.js.map +1 -0
- package/dist/orchestrator/session-store.js +11 -3
- package/dist/orchestrator/session-store.js.map +1 -1
- package/dist/services/asset-reconcile.js +83 -0
- package/dist/services/asset-reconcile.js.map +1 -0
- package/dist/services/asset-registry.js +9 -2
- package/dist/services/asset-registry.js.map +1 -1
- package/dist/services/download-jobs.js +178 -14
- package/dist/services/download-jobs.js.map +1 -1
- package/dist/services/download-progress.js +16 -18
- package/dist/services/download-progress.js.map +1 -1
- package/dist/services/extra-paths.js +61 -9
- package/dist/services/extra-paths.js.map +1 -1
- package/dist/services/hello-retarget.js +165 -0
- package/dist/services/hello-retarget.js.map +1 -0
- package/dist/services/job-history.js +50 -0
- package/dist/services/job-history.js.map +1 -1
- package/dist/services/job-watcher.js +38 -7
- package/dist/services/job-watcher.js.map +1 -1
- package/dist/services/manifest.js +92 -9
- package/dist/services/manifest.js.map +1 -1
- package/dist/services/model-resolver.js +616 -17
- package/dist/services/model-resolver.js.map +1 -1
- package/dist/services/output-dir.js +63 -15
- package/dist/services/output-dir.js.map +1 -1
- package/dist/services/panel-pin-guard.js +6 -62
- package/dist/services/panel-pin-guard.js.map +1 -1
- package/dist/services/ui-bridge.js +111 -14
- package/dist/services/ui-bridge.js.map +1 -1
- package/dist/services/workspace-env.js +179 -3
- package/dist/services/workspace-env.js.map +1 -1
- package/dist/tools/assets.js +34 -2
- package/dist/tools/assets.js.map +1 -1
- package/dist/tools/extra-paths.js +6 -4
- package/dist/tools/extra-paths.js.map +1 -1
- package/dist/tools/model-extras.js +26 -7
- package/dist/tools/model-extras.js.map +1 -1
- package/dist/tools/model-management.js +36 -8
- package/dist/tools/model-management.js.map +1 -1
- package/dist/tools/report-issue.js +12 -2
- package/dist/tools/report-issue.js.map +1 -1
- package/dist/tools/vocabulary.js +21 -0
- package/dist/tools/vocabulary.js.map +1 -1
- package/package.json +1 -1
- package/scripts/gen-tool-docs.ts +138 -4
- 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
|
|
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.
|
|
170
|
-
//
|
|
171
|
-
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,SAAS,EACT,eAAe,EACf,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,GAIzB,MAAM,kBAAkB,CAAC;AA2D1B,0EAA0E;AAE1E,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;AAClE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAErD,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,sEAAsE;AACtE,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,CAAC,CAAC;IACnE,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,0EAA0E;AAE1E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEvD,0EAA0E;AAE1E,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,oBAAoB;IACjC,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,aAAa,CACpB,QAAgB,EAChB,SAAiB,EACjB,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,WAAW,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,aAAa,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,GAAG,iBAAiB,EAAE,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC5D,CAAC;AAYD,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,QAAQ,GAAI,KAAgC,CAAC,QAAQ,CAAC;IAC5D,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAAgB,EAChB,KAAmB,EACnB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAE5C,SAAS;IACT,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,mBAAmB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAClE,CAAC;IACF,MAAM,OAAO,GAAI,QAAQ,EAAE,CAAC,CAAC,CAA4B,EAAE,SAAS,CAAC;IACrE,MAAM,KAAK,GAAI,MAAM,EAAE,CAAC,CAAC,CAA4B,EAAE,SAAS,CAAC;IACjE,MAAM,UAAU,GACd,QAAQ,CAAC,eAAe,EAAE,iBAAiB;QAC3C,CAAC,OAAO,IAAI,KAAK;YACf,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,iCAAiC;YAC5D,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IAE9B,SAAS;IACT,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,uBAAuB,CAAC,CAAC;IAC5E,IAAI,MAAM,GAAqC,SAAS,CAAC;IACzD,IAAI,QAAQ;QAAE,MAAM,GAAG,OAAO,CAAC;SAC1B,IAAI,YAAY;QAAE,MAAM,GAAG,aAAa,CAAC;IAE9C,gBAAgB;IAChB,MAAM,KAAK,GAAsC,QAAQ;QACvD,CAAC,CAAC,QAAQ,CAAC,KAAK;QAChB,CAAC,CAAC,SAAS,CAAC;IAEd,eAAe;IACf,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC;IACpE,MAAM,cAAc,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/C,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC;IAEP,2BAA2B;IAC3B,MAAM,OAAO,GAAsC,EAAE,CAAC;IACtD,MAAM,aAAa,GAA4C,EAAE,CAAC;IAElE,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;YAAE,SAAS;QAC5D,MAAM,GAAG,GAAG,UAAqC,CAAC;QAElD,uEAAuE;QACvE,yEAAyE;QACzE,0DAA0D;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAI,GAAG,CAAC,MAAoB;iBACrC,MAAM,CAAC,iBAAiB,CAAC;iBACzB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACb,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;gBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;gBAC1B,GAAG,EAAE,aAAa,CAChB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,SAAS,IAAI,EAAE,EACnB,GAAG,CAAC,IAAI,IAAI,QAAQ,CACrB;aACF,CAAC,CAAC,CAAC;YACN,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,2EAA2E;QAC3E,sEAAsE;QACtE,yEAAyE;QACzE,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,KAAK,MAAM,QAAQ,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAU,EAAE,CAAC;YAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;gBAAE,SAAS;YACxC,KAAK,MAAM,GAAG,IAAK,SAAuB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrE,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;oBAC9B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,QAAQ;oBAC1B,GAAG,EAAE,aAAa,CAChB,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,SAAS,IAAI,EAAE,EACnB,GAAG,CAAC,IAAI,IAAI,QAAQ,CACrB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ;QACnB,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,OAAO;QACP,aAAa;QACb,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,YAAY,EAAE,WAAW;QACzB,eAAe,EAAE,QAAQ,CAAC,eAAe;KAC1C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,QAAgB,EAChB,KAAmB,EACnB,UAAyB;IAEzB,2CAA2C;IAC3C,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO;IAC5B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IAEvB,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,2BAA2B,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE9E,8BAA8B;IAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;IAEf,kEAAkE;IAClE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,0CAA0C;IAC1C,IAAI,KAA+B,CAAC;IACpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3C,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,KAAK,EAAE,MAAM,CAAC,SAAS;gBAAE,MAAM;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,GAAG,CAAC,SAAS,EAAE;gBACzD,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;aAChD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE;YACxD,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,2BAA2B,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAEnF,uEAAuE;QACvE,0EAA0E;QAC1E,0EAA0E;QAC1E,sEAAsE;QACtE,yEAAyE;QACzE,0EAA0E;QAC1E,kEAAkE;QAClE,sEAAsE;QACtE,sEAAsE;QACtE,oEAAoE;QACpE,IAAI,2BAA2B,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,qEAAqE;gBACrE,qEAAqE;gBACrE,mEAAmE;gBACnE,6CAA6C;gBAC7C,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC;oBACrC,QAAQ;oBACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxC,OAAO,EAAE,CAAC,CAAC,OAAO;wBAClB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;4BAC7B,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,SAAS,EAAE,GAAG,CAAC,SAAS;4BACxB,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,GAAG,EAAE,GAAG,CAAC,GAAG;yBACb,CAAC,CAAC;qBACJ,CAAC,CAAC;oBACH,SAAS,EAAE,UAAU,IAAI,gBAAgB;oBACzC,eAAe,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;iBACnE,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CACtF,CAAC;gBACF,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;wBAC7E,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAC5B,IAAI,EAAE;4BAAE,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC;oBAC5B,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;oBAC3C,SAAS,EAAE,QAAQ;oBACnB,KAAK,EAAE,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,oBAAoB,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YACrC,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACrE,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAC7B,CAAC,CACF;YACD,UAAU,EAAE,YAAY,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC9C,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;SAChD,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,OAAO,CAAC,KAAmB;IAClC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;IACjC,CAAC;AACH,CAAC;AAED,0EAA0E;AAE1E,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;;;;OAIG;IACH,KAAK,CAAC,QAAgB,EAAE,QAAuB;QAC7C,qBAAqB;QACrB,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAiB;YAC1B,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,KAAK;YAChB,QAAQ;SACT,CAAC;QACF,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEpC,yDAAyD;QACzD,wEAAwE;QACxE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE;gBAC3D,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC;gBAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,KAAK,CAAC,SAAS,GAAG,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE;wBAC3D,UAAU,EAAE,GAAG,EAAE;4BACf,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACpD,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gCAC1C,SAAS,EAAE,QAAQ;gCACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;6BAChD,CAAC,CACH,CAAC;wBACJ,CAAC;wBACD,OAAO,EAAE,GAAG,EAAE;4BACZ,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACpD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gCACrC,SAAS,EAAE,QAAQ;gCACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;6BAChD,CAAC,CACH,CAAC;wBACJ,CAAC;qBACF,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;wBACjD,SAAS,EAAE,QAAQ;qBACpB,CAAC,CAAC;oBACH,8CAA8C;oBAC9C,eAAe,EAAE,CAAC,IAAI,CACpB,CAAC,MAAM,EAAE,EAAE;wBACT,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;4BACrB,KAAK,CAAC,SAAS,GAAG,wBAAwB,CAAC,MAAM,EAAE,QAAQ,EAAE;gCAC3D,UAAU,EAAE,GAAG,EAAE;oCACf,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gCAC1D,CAAC;gCACD,OAAO,EAAE,GAAG,EAAE;oCACZ,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gCAC1D,CAAC;6BACF,CAAC,CAAC;4BACH,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gCACxC,SAAS,EAAE,QAAQ;6BACpB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,EACD,GAAG,EAAE;wBACH,gDAAgD;oBAClD,CAAC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;oBAChD,SAAS,EAAE,QAAQ;iBACpB,CAAC,CAAC;YACL,CAAC;QAED,sBAAsB;QACtB,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO;YAC5B,UAAU,CAAC,QAAQ,CAAC;iBACjB,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;gBAChB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC5B,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACtD,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;wBAC5C,SAAS,EAAE,QAAQ;wBACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;qBAChD,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;oBACnC,SAAS,EAAE,QAAQ;oBACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;iBAChD,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAErB,gBAAgB;QAChB,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;oBAC1C,SAAS,EAAE,QAAQ;oBACnB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS;oBACxC,UAAU,EAAE,gBAAgB,EAAE;iBAC/B,CAAC,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAgB;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,GAAG,CAAC,CAAC;YAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAAE,SAAS;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAClC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,mBAAmB,EAAE,CAAC;wBAC7C,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACvB,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,0CAA0C;gBAC5C,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,uBAAuB,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,IAAI,eAAe;QACjB,OAAO,eAAe,CAAC;IACzB,CAAC;CACF,CAAC"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
731
|
-
//
|
|
732
|
-
//
|
|
733
|
-
|
|
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
|
};
|