comfyui-mcp 0.52.71 → 0.52.72
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.
|
@@ -14901,29 +14901,24 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
|
|
|
14901
14901
|
return out.via === "panel" ? out.value : ok(out.value);
|
|
14902
14902
|
}),
|
|
14903
14903
|
def("panel_list_nodes", "List the custom-node packs currently installed in the user's ComfyUI (via the built-in Manager). Read-only.", {}, async (_args, ctx) => ctx.call({ cmd: "nodes_list" }, 20000)),
|
|
14904
|
-
def("panel_install_node", "Install a custom-node pack into the user's ComfyUI
|
|
14905
|
-
|
|
14906
|
-
"RESOLVING BY NAME MEANS A SUCCESS CAN ALSO BE THE WRONG REPO, and for the names where that is MEASURED rather than hypothetical this tool now REFUSES instead of picking (#1616). 111 bare names resolve to different repositories depending on the channel — 60 of them disagree between 'default' and 'dev', and 28 are ambiguous inside ONE channel (two entries under one name collapse onto a single key and the survivor is upstream list order). If you pass a git URL whose bare name is one of those and you name no `channel`, the call is refused before dispatch and both candidate repositories are named for you. Naming a `channel` dispatches instead, with the concrete collision quoted — but read what it quotes before trusting it: for the 28 intra-channel names that argument selects NOTHING (both entries are in the one list, and v4 keeps whichever its order keeps), and no `channel` value can separate them. The bypass exists because Manager 3.x carries the URL in `files` and clones it as passed, which this check cannot distinguish since the panel picks the dialect after the request leaves the orchestrator; on v4, install_custom_node (source:'git') is what clones the URL you typed. Outside that measured set the hazard stands: if the channel lists your pack's name under someone else, THAT author's repository installs and the call still reports success — the queued reply names the owner you passed, so confirm with panel_list_nodes that it is what landed. " +
|
|
14907
|
-
"WHAT WAS OURS: this call used to ask the 'dev' channel, a ~1200-pack side list sharing 3 entries with the ~5900-pack 'default' list — so it could miss a pack panel_search_nodes had just returned to you (that search reads a channel-INDEPENDENT map, measured). It now asks 'default', the channel the registry-id path already used; pass `channel` to override. " +
|
|
14908
|
-
"STILL NOT GUARANTEED, and do not read the fix as one: it depends on HOW Manager was installed. A Manager cloned into custom_nodes fetches the channel's real list, where 'default' carries ~5900 packs — there this works. A PIP/Desktop Manager (`is_manager_pip_package()` is just 'not inside a custom_nodes tree') never fetches: it reads a per-channel-URL cache or, failing that, the ~3600-pack snapshot bundled in the package, so `mode` is inert and packs added since that snapshot resolve on NEITHER channel. Measured: the only cache a stock host writes at startup is for a DIFFERENT URL than the name 'default' resolves to, so a pip host serves the bundled list. The fix is an improvement there only in the sense of doing no harm — old 'dev' and new 'default' both land on that same file. Whether a listed repo then always installs was not measured either. " +
|
|
14909
|
-
"A NOT-FOUND RULES OUT ONE CHANNEL, NOT THE PACK. The channels are near-disjoint (default ~5900 packs, dev ~1200, sharing 3), so a miss says the pack is absent from the channel THIS CALL ASKED and nothing more — try an explicit `channel` (e.g. 'dev') before concluding it does not exist. This tool will NOT retry another channel for you: v4 resolves by BARE REPO NAME and clones the URL in the channel's entry rather than the one you passed, and 60 names sit in 'default' and 'dev' under DIFFERENT repositories, so a silent retry could install a repo you never named. (That is also why you should confirm with panel_list_nodes that what landed is the repo you meant.) Once the channels that could plausibly carry it are ruled out, clone it into custom_nodes yourself and restart, or use install_custom_node (source:'git'), which needs a LOCAL ComfyUI because it clones onto THIS machine's filesystem — not necessarily the one the panel drives. On Manager 3.x we send a DIFFERENT request shape that carries the URL directly (that much is our own code); whether 3.x then installs an unlisted repo was NOT measured here, so treat 'it worked before on 3.x' as unverified rather than as a regression on our side. " +
|
|
14910
|
-
"A ComfyUI restart (panel_restart_comfyui) is usually required afterward to load the nodes — poll panel_node_queue_status first. Prefer this over the headless install_custom_node tool. " +
|
|
14911
|
-
"⚠️ QUEUE-DONE IS NOT INSTALLED: Manager marks a task 'done' (queue drained) even when the git clone produced NOTHING — an empty dir, a transient git failure, or a repo not in its registry. So after the queue is idle you MUST VERIFY with panel_list_nodes that each pack actually appears before you restart or report success; a pack you installed that is absent from that list did NOT install (retry it, or install it from its git `repository` URL — but see the v4 note above: on Manager v4 that retry resolves against ONE channel's list, so re-running the identical call fails identically every time — change the `channel` first, and clone it yourself only once the plausible channels are ruled out). " +
|
|
14912
|
-
"Install packs ONE AT A TIME and confirm each populated before the next — batching several installs then restarting is exactly how you end up with empty dirs and a broken restart.", {
|
|
14913
|
-
id: z.string().optional().describe("Registry id or 'author/repo'."),
|
|
14904
|
+
def("panel_install_node", "Install a custom-node pack into the user's ComfyUI through the BUILT-IN Manager. Registry ids are supported: pass an id from panel_search_nodes (or another known registry id), then poll panel_node_queue_status and verify with panel_list_nodes before restarting. The panel runtime refuses Git URLs before Manager v4 queueing because v4 ignores the supplied repository and resolves by bare name, so a URL is not a successful v4 from-source install. Use an id from panel_search_nodes; use install_custom_node(source:'git') only when its local target is the same ComfyUI as this panel. If the panel drives another machine, install the repository on the ComfyUI host instead. The repository input remains normalized for legacy Manager 3.x direct-URL routing, but that compatibility path is not a v4 guarantee. The channel input can select a Manager channel for a supported registry-id install; it does not bypass the v4 Git-URL refusal. Install packs one at a time and confirm each is present before restarting.", {
|
|
14905
|
+
id: z.string().optional().describe("Registry id returned by panel_search_nodes."),
|
|
14914
14906
|
repository: z
|
|
14915
14907
|
.string()
|
|
14916
14908
|
.optional()
|
|
14917
|
-
.describe("Git URL
|
|
14918
|
-
version: z.string().optional().describe("Specific version; default 'latest'
|
|
14919
|
-
channel: z.string().optional().describe("Manager channel
|
|
14920
|
-
mode: z.enum(["remote", "local", "cache"]).optional().describe("DB source (default 'remote').
|
|
14909
|
+
.describe("Git URL for legacy Manager 3.x direct-URL routing only. The panel runtime refuses arbitrary Git URLs before Manager v4 queueing because v4 ignores the supplied repository and resolves by bare name; this is not a successful v4 from-source install. Use an id from panel_search_nodes, or install_custom_node(source:'git') only when the local target is the same ComfyUI; otherwise install on the ComfyUI host."),
|
|
14910
|
+
version: z.string().optional().describe("Specific registry version; default 'latest'."),
|
|
14911
|
+
channel: z.string().optional().describe("Optional Manager channel for a supported registry-id install. It does not bypass Manager v4's refusal of arbitrary Git URLs."),
|
|
14912
|
+
mode: z.enum(["remote", "local", "cache"]).optional().describe("DB source (default 'remote')."),
|
|
14921
14913
|
}, async (args, ctx) => {
|
|
14922
14914
|
// The panel pack is installable like any other, and this path has NO
|
|
14923
14915
|
// on-disk verification and never saw the version pin. Refuse both
|
|
14924
14916
|
// spellings (registry id and git URL) — see panel-pin-guard.
|
|
14925
14917
|
assertPanelNotTargetedUnverifiable("panel_install_node", args.id);
|
|
14926
14918
|
assertPanelNotTargetedUnverifiable("panel_install_node", args.repository);
|
|
14919
|
+
// The panel owns dialect detection and enforces the v4 Git-URL refusal;
|
|
14920
|
+
// these normalized fields remain here so legacy Manager 3.x can receive
|
|
14921
|
+
// its direct `files:[url]` request shape.
|
|
14927
14922
|
// #789 — a search result whose `id` is a repository URL (the Manager's
|
|
14928
14923
|
// legacy/repository-style entries) cannot install as id+"latest": the
|
|
14929
14924
|
// Manager resolves that as a registry version and rejects it ("not
|
|
@@ -14940,14 +14935,14 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
|
|
|
14940
14935
|
incarnation: panelIncarnation(ctx, ctx.tabId),
|
|
14941
14936
|
};
|
|
14942
14937
|
const res = await ctx.call({ cmd: "nodes_install", ...cmdArgs }, 30000);
|
|
14943
|
-
// #1129 — settle BEFORE
|
|
14944
|
-
// the JSON body, which makes the payload unparseable as JSON, so a probe
|
|
14945
|
-
// running afterwards reads `null`, concludes the panel never claimed a
|
|
14946
|
-
//
|
|
14947
|
-
//
|
|
14948
|
-
//
|
|
14938
|
+
// #1129 — settle BEFORE any supplemental note is appended. The note is glued on
|
|
14939
|
+
// after the JSON body, which makes the payload unparseable as JSON, so a probe
|
|
14940
|
+
// running afterwards reads `null`, concludes the panel never claimed a queue,
|
|
14941
|
+
// and silently does nothing. Git notes describe v4 bare-name resolution, but
|
|
14942
|
+
// v4 Git requests now fail before this point and legacy 3.x receives files:[url]
|
|
14943
|
+
// directly; appending that v4 note to a legacy success would be false.
|
|
14949
14944
|
const settled = await settleDroppedEnqueue(ctx, res, dispatch);
|
|
14950
|
-
if (note) {
|
|
14945
|
+
if (note && !cmdArgs.repository) {
|
|
14951
14946
|
const text = settled.content.find((c) => c.type === "text");
|
|
14952
14947
|
if (text && text.type === "text") {
|
|
14953
14948
|
text.text += `\n\nNOTE: ${note}`;
|