From d2e642ebeddbe6bf6d1863db699b48a4e95a756a Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Thu, 2 Jul 2026 07:59:36 +0300 Subject: [PATCH] editor: surface the disabled-built-in-pipeline state instead of hiding it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'No, I'll use my own pipeline' in the missing-nodes prompt silently PERSISTED disable_core on the project. From then on Engine settings… greyed out with no reason and Generate died with ComfyUI's raw "Prompt has no outputs" - both looked like breakage with no visible cause. - The setup prompt button now confirms first, spelling out what it disables, what Generate will need, and where to re-enable it. - Engine settings… never greys over pipeline state anymore: the modal itself already explains why knobs are unavailable and links to Models. - Builder: disable_core with NO output node in the graph is now a BLOCKING error with the fix in the message (wire 🌐 Global video output, or Models → Enable built-in pipeline) instead of letting ComfyUI reject the queue. - GEN_ERROR_MAP: prompt_no_outputs mapped to the same actionable text for custom pipelines that pass the builder but lack an output node. Co-Authored-By: Claude Fable 5 --- movie_editor/backend/builder.py | 20 ++++++++++++++++---- movie_editor/frontend/menubar.js | 5 ++++- movie_editor/frontend/pipeline_setup.js | 13 ++++++++++++- movie_editor/frontend/store.js | 2 ++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/movie_editor/backend/builder.py b/movie_editor/backend/builder.py index 740f1682..3e80f6f1 100644 --- a/movie_editor/backend/builder.py +++ b/movie_editor/backend/builder.py @@ -547,11 +547,23 @@ def build(object_info: dict, models_config: dict, params: dict, media: dict | No report["unsatisfied"].append(msg) # With the built-in pipeline disabled, the result must come from the global outputs (or a - # save node the user wired). Warn (non-blocking) if nothing will surface to the editor. + # save node the user wired). If NO output node exists at all this is BLOCKING: ComfyUI + # would reject the queue with a raw "Prompt has no outputs" — surface the real cause and + # the fix instead. If some output-capable node exists, keep it a non-blocking warning + # (the editor may still not see the result, but the run itself is valid). if disable_core and "global_out" not in graph: - report["unsatisfied"].append( - "Built-in pipeline is disabled and nothing is wired to the Global video output — " - "the editor may not show a result. Wire a final IMAGE output to 🌐 Global video output.") + has_output_node = any( + (object_info.get(n.get("class_type")) or {}).get("output_node") + for n in graph.values() + ) + msg = ( + "Built-in pipeline is disabled for this project and nothing is wired to the " + "🌐 Global video output. Wire a final IMAGE output to it, or re-enable the " + "built-in pipeline (Models → Enable built-in pipeline)." + ) + if not has_output_node: + report["blocking"].append(msg) + report["unsatisfied"].append(msg) return graph, report diff --git a/movie_editor/frontend/menubar.js b/movie_editor/frontend/menubar.js index a47d0568..2cd90010 100644 --- a/movie_editor/frontend/menubar.js +++ b/movie_editor/frontend/menubar.js @@ -220,7 +220,10 @@ ], Settings: [ { label: "Editor settings…", action: () => window.EditorSettingsModal.open() }, - { label: "Engine settings…", disabled: !hasProject() || (!studioOn && !chainOn), + // Never grey this out over pipeline state: the modal itself explains WHY Studio / + // Chain Sampler knobs are unavailable (built-in pipeline disabled, custom slots) + // and links to Models — a silently disabled item just looks broken. + { label: "Engine settings…", disabled: !hasProject(), action: () => window.EngineSettingsModal.open() }, { label: "Temp files…", action: () => window.TempBrowserModal.open() }, { sep: true }, diff --git a/movie_editor/frontend/pipeline_setup.js b/movie_editor/frontend/pipeline_setup.js index dc906c88..616681a8 100644 --- a/movie_editor/frontend/pipeline_setup.js +++ b/movie_editor/frontend/pipeline_setup.js @@ -232,7 +232,18 @@ } const ownBtn = el("button", "btn", "No, I'll use my own pipeline"); ownBtn.type = "button"; - ownBtn.onclick = () => useOwnPipeline(); + // This PERSISTS disable_core on the project — without a warning it read like a + // harmless "dismiss", then Generate failed ("no outputs") and Studio/Chain Sampler + // settings vanished with no visible cause. + ownBtn.onclick = () => { + if (!confirm( + "This DISABLES the built-in FunPack pipeline for this project and saves that choice.\n\n" + + "Generation will then run ONLY the nodes you wire yourself in Models — until you wire " + + "a final IMAGE to the 🌐 Global video output, Generate has nothing to run.\n\n" + + "You can re-enable it any time: Models → Enable built-in pipeline.\n\nContinue?" + )) return; + useOwnPipeline(); + }; foot.append(ownBtn); const dismissBtn = el("button", "btn ghost", "Close"); dismissBtn.type = "button"; diff --git a/movie_editor/frontend/store.js b/movie_editor/frontend/store.js index 2ded7578..d621fa2b 100644 --- a/movie_editor/frontend/store.js +++ b/movie_editor/frontend/store.js @@ -2758,6 +2758,8 @@ [/\.clip.*no source/i, "Missing text encoder — add a CLIP loader in Models."], [/not installed/i, "A configured node class is not installed in ComfyUI — check Models for details."], [/Node registry unavailable/i, "ComfyUI is offline or still starting up — wait a moment and try again."], + [/prompt_no_outputs|Prompt has no outputs/i, + "The graph reached ComfyUI without any output node. Usually the built-in pipeline is disabled for this project (Models → Enable built-in pipeline), or your custom pipeline needs a final IMAGE wired to the 🌐 Global video output."], [/HTTP 53[0-9]|HTTP 52[24]|HTTP 502|Failed to fetch|NetworkError|Load failed/i, "Cloudflare tunnel lost contact with the vast.ai instance. GPU work may still be running — wait, refresh, and check ComfyUI output. If it keeps failing, use vast.ai direct port access or restart the tunnel."], ];