From fecc44c6946e133ff40e4746068eafc8d7d0335e Mon Sep 17 00:00:00 2001 From: Thomas Date: Sun, 10 May 2026 19:46:00 +0200 Subject: [PATCH] fix: explicit api.nodeDefs reset before re-fetching definitions --- .../comfyui-bridge/web/downloader.js | 41 +++++++++++++++++-- web/downloader.js | 41 +++++++++++++++++-- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/main/resources/comfyui-bridge/web/downloader.js b/src/main/resources/comfyui-bridge/web/downloader.js index 875dacc..9ef2b4f 100644 --- a/src/main/resources/comfyui-bridge/web/downloader.js +++ b/src/main/resources/comfyui-bridge/web/downloader.js @@ -26,19 +26,52 @@ const initializeExtension = async () => { }; showToast("🔄 Lade Node-Definitionen neu..."); - // WICHTIG: Das ist der Gamechanger! Löscht den Frontend-Cache von ComfyUI. - // Ohne das hier lädt ComfyUI immer die alten Modell-Listen aus dem Browser-RAM. + // 🔥 DER GAMECHANGER: Killt den Frontend-Cache von ComfyUI! api.nodeDefs = null; // Gib dem Windows-Dateisystem kurz Zeit, die kopierten/verschobenen Dateien zu registrieren await new Promise(r => setTimeout(r, 800)); - // Ruft die offizielle ComfyUI Refresh-Funktion auf (das entspricht exakt dem Klick auf "Refresh" im Menü) - // app.refresh() zieht sich automatisch die neuen nodeDefs vom Server und "heilt" fehlerhafte Nodes. + // 1. Hole frische Definitionen vom Server (triggert jetzt wirklich /object_info) + console.log("[Model-Downloader] Re-fetching node definitions from server..."); + const nodeDefs = await api.getNodeDefs(); + + // 2. Falls ComfyUI-Manager installiert ist, auch dessen Custom Nodes aktualisieren + if (api.getCustomNodes) await api.getCustomNodes(); + + // 3. Ruft die offizielle ComfyUI Refresh-Funktion auf (aktualisiert Sidebars, etc.) if (app.refresh) { await app.refresh(); } + // 4. Jede Node auf dem Canvas zwingen, ihre Widgets neu zu evaluieren (Deep-Update) + if (app.graph && app.graph._nodes) { + for (const node of app.graph._nodes) { + const def = nodeDefs[node.type]; + if (def?.input?.required) { + for (const widgetName in def.input.required) { + const inputDef = def.input.required[widgetName]; + if (Array.isArray(inputDef[0])) { // Dropdown / Combo + const newValues = inputDef[0]; + const widget = node.widgets?.find(w => w.name === widgetName); + if (widget && widget.type === "combo") { + widget.options.values = newValues; + // Heilung bei Modell-Wiederherstellung + if (newValues.includes(widget.value)) { + if (node.color === "#322" || node.color === "#a22") { + node.color = ""; + node.bgcolor = ""; + } + } + } + } + } + } + if (node.onRefresh) node.onRefresh(); + } + if (app.graph.refreshNodes) app.graph.refreshNodes(); + } + // Canvas zwingen, sich neu zu zeichnen app.graph.setDirtyCanvas(true, true); console.log("[Model-Downloader] Sync erfolgreich abgeschlossen."); diff --git a/web/downloader.js b/web/downloader.js index 875dacc..9ef2b4f 100644 --- a/web/downloader.js +++ b/web/downloader.js @@ -26,19 +26,52 @@ const initializeExtension = async () => { }; showToast("🔄 Lade Node-Definitionen neu..."); - // WICHTIG: Das ist der Gamechanger! Löscht den Frontend-Cache von ComfyUI. - // Ohne das hier lädt ComfyUI immer die alten Modell-Listen aus dem Browser-RAM. + // 🔥 DER GAMECHANGER: Killt den Frontend-Cache von ComfyUI! api.nodeDefs = null; // Gib dem Windows-Dateisystem kurz Zeit, die kopierten/verschobenen Dateien zu registrieren await new Promise(r => setTimeout(r, 800)); - // Ruft die offizielle ComfyUI Refresh-Funktion auf (das entspricht exakt dem Klick auf "Refresh" im Menü) - // app.refresh() zieht sich automatisch die neuen nodeDefs vom Server und "heilt" fehlerhafte Nodes. + // 1. Hole frische Definitionen vom Server (triggert jetzt wirklich /object_info) + console.log("[Model-Downloader] Re-fetching node definitions from server..."); + const nodeDefs = await api.getNodeDefs(); + + // 2. Falls ComfyUI-Manager installiert ist, auch dessen Custom Nodes aktualisieren + if (api.getCustomNodes) await api.getCustomNodes(); + + // 3. Ruft die offizielle ComfyUI Refresh-Funktion auf (aktualisiert Sidebars, etc.) if (app.refresh) { await app.refresh(); } + // 4. Jede Node auf dem Canvas zwingen, ihre Widgets neu zu evaluieren (Deep-Update) + if (app.graph && app.graph._nodes) { + for (const node of app.graph._nodes) { + const def = nodeDefs[node.type]; + if (def?.input?.required) { + for (const widgetName in def.input.required) { + const inputDef = def.input.required[widgetName]; + if (Array.isArray(inputDef[0])) { // Dropdown / Combo + const newValues = inputDef[0]; + const widget = node.widgets?.find(w => w.name === widgetName); + if (widget && widget.type === "combo") { + widget.options.values = newValues; + // Heilung bei Modell-Wiederherstellung + if (newValues.includes(widget.value)) { + if (node.color === "#322" || node.color === "#a22") { + node.color = ""; + node.bgcolor = ""; + } + } + } + } + } + } + if (node.onRefresh) node.onRefresh(); + } + if (app.graph.refreshNodes) app.graph.refreshNodes(); + } + // Canvas zwingen, sich neu zu zeichnen app.graph.setDirtyCanvas(true, true); console.log("[Model-Downloader] Sync erfolgreich abgeschlossen.");