comfyui-mcp 0.51.45 → 0.51.47
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.
|
@@ -3494,6 +3494,37 @@ async function unreadableOrHealed(ctx, before, detail) {
|
|
|
3494
3494
|
function panelTooOldNote(ctx) {
|
|
3495
3495
|
try {
|
|
3496
3496
|
const v = ctx.bridge?.panelTooOldForReplyUuid?.(ctx.tabId);
|
|
3497
|
+
// #1560 — A PANEL TOO OLD TO HELP IS ALSO TOO OLD TO SAY SO.
|
|
3498
|
+
//
|
|
3499
|
+
// The note below needs an advertised version, and `panel_version` has only
|
|
3500
|
+
// ridden the hello since panel v0.11.83. So the panels most likely to be
|
|
3501
|
+
// causing this deadlock — anything below 0.11.45 — cannot report it, and the
|
|
3502
|
+
// reporter of #1560 (on 0.11.37, after two Manager self-updates of the pack
|
|
3503
|
+
// crashed) got a bare "the panel did not answer" with nothing to act on.
|
|
3504
|
+
//
|
|
3505
|
+
// Deliberately WEAKER than the version case, and weaker still after review: an
|
|
3506
|
+
// absent version proves only "below 0.11.83", NOT "below the minimum". Panels
|
|
3507
|
+
// in 0.11.45–0.11.82 publish the reply uuid and simply predate version
|
|
3508
|
+
// advertisement, so this must read as SOMETHING TO CHECK and never as a finding
|
|
3509
|
+
// — naming a cause that is not theirs is the failure this whole cluster exists
|
|
3510
|
+
// to avoid.
|
|
3511
|
+
if (v?.neverAdvertised) {
|
|
3512
|
+
return (`
|
|
3513
|
+
|
|
3514
|
+
WORTH CHECKING — THE PANEL'S VERSION IS UNKNOWN HERE: this session's panel has never ` +
|
|
3515
|
+
`reported its version, and panels have advertised one on connect since 0.11.83, so ` +
|
|
3516
|
+
`this one is older than that. That does NOT by itself mean it is too old: a panel ` +
|
|
3517
|
+
`reports the new workflow's identity ON THE REPLY from ${v.needed} onwards, and ` +
|
|
3518
|
+
`0.11.45–0.11.82 do that while still not advertising a version. But if it IS below ` +
|
|
3519
|
+
`${v.needed}, that is the whole cause of this failure rather than anything about this ` +
|
|
3520
|
+
`workflow — on ${v.needed}+ the command that re-pointed the canvas repairs the fence ` +
|
|
3521
|
+
`from its own reply and never makes the read that just failed. ` +
|
|
3522
|
+
`Find out with install_comfyui (action:"panel", panel_action:"status"). If it is ` +
|
|
3523
|
+
`older, update with install_comfyui (action:"panel", panel_action:"sync"), restart ` +
|
|
3524
|
+
`ComfyUI, and HARD-REFRESH the browser tab (Ctrl+Shift+R) — a pack update that ` +
|
|
3525
|
+
`ComfyUI-Manager reported as FAILED leaves the old panel JS running in the open tab, ` +
|
|
3526
|
+
`so a restart alone does not pick it up.`);
|
|
3527
|
+
}
|
|
3497
3528
|
if (!v?.tooOld)
|
|
3498
3529
|
return "";
|
|
3499
3530
|
return (`
|
|
@@ -9902,11 +9933,16 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
|
|
|
9902
9933
|
def("panel_unpack_subgraph", "EXPAND / DISSOLVE a subgraph node on the user's open graph — inline its interior nodes back into the PARENT graph, rewire all external links to those now-inlined nodes, and remove the subgraph wrapper. This is the frontend's \"Unpack Subgraph\" (litegraph LGraph.unpackSubgraph) and the exact INVERSE of panel_create_subgraph. Use it to flatten a stage that was over-nested, or to edit interior nodes directly at the parent level. The interior nodes reappear on the parent canvas with their connections preserved. Undoable with Ctrl+Z.", { node_id: nodeId().describe("Subgraph node id to unpack/dissolve (is_subgraph=true, from panel_graph_outline / panel_query_graph).") }, async (args, ctx) => ctx.call({ cmd: "graph_unpack_subgraph", node_id: args.node_id }, 15000)),
|
|
9903
9934
|
def("panel_search_nodes", "Search installable custom-node packs via the user's BUILT-IN ComfyUI Manager (the same source the Manager UI uses). Returns matching packs {id, title, description}. Use the `id` with panel_install_node. Prefer this over the headless search_custom_nodes tool — it works against the user's actual (Desktop) Manager.", { query: z.string().describe("Search text, e.g. 'kjnodes', 'controlnet', 'ipadapter'."), limit: z.number().int().min(1).max(40).optional() }, async (args, ctx) => ctx.call({ cmd: "nodes_search", query: args.query, limit: args.limit }, 20000)),
|
|
9904
9935
|
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)),
|
|
9905
|
-
def("panel_install_node", "Install a custom-node pack into the user's ComfyUI via the BUILT-IN Manager (queues the install). Pass `id` (registry id like 'comfyui-kjnodes' or 'author/repo') from panel_search_nodes, or `repository` (git URL)
|
|
9906
|
-
"⚠️
|
|
9936
|
+
def("panel_install_node", "Install a custom-node pack into the user's ComfyUI via the BUILT-IN Manager (queues the install). Pass `id` (registry id like 'comfyui-kjnodes' or 'author/repo') from panel_search_nodes, or `repository` (git URL) to request a nightly/from-source install — see the v4 limit below before relying on it. A search result whose `id` IS a git URL (legacy/repository-style entries) is auto-routed to a from-source 'nightly' install — 'latest' cannot resolve for those. " +
|
|
9937
|
+
"⚠️ ON MANAGER v4, `repository` DOES NOT INSTALL A REPO THE MANAGER'S REGISTRY DOES NOT LIST (#1539) — being listed is necessary; whether it is sufficient was not measured. Measured against Manager V4.2.2: a request carrying `repository` AND `selected_version:'nightly'` — the exact combination Manager's own schema documents as 'repository required if selected_version is nightly' — is still resolved by `id` against its registry, and an unlisted repo fails with \"Node '<name>@nightly' not found in [ManagerChannel.dev, ManagerDatabaseSource.cache]\". The URL is sent and recorded; for an unlisted repo v4 never reaches a clone (only that case was probed). This is an UPSTREAM limitation, not a missing field on our side. 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. For an unlisted repo on v4, clone it into custom_nodes yourself and restart. " +
|
|
9938
|
+
"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. " +
|
|
9939
|
+
"⚠️ 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 fails for a repo its registry does not list, so clone it yourself instead of retrying). " +
|
|
9907
9940
|
"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.", {
|
|
9908
9941
|
id: z.string().optional().describe("Registry id or 'author/repo'."),
|
|
9909
|
-
repository: z
|
|
9942
|
+
repository: z
|
|
9943
|
+
.string()
|
|
9944
|
+
.optional()
|
|
9945
|
+
.describe("Git URL, to REQUEST a nightly/from-source install. On Manager v4 an install only proceeds for a repo the Manager's registry already lists — an unlisted URL is rejected by id lookup despite this field (#1539, measured on V4.2.2)."),
|
|
9910
9946
|
version: z.string().optional().describe("Specific version; default 'latest' (or 'nightly' with repository)."),
|
|
9911
9947
|
channel: z.string().optional().describe("Manager channel (default 'default')."),
|
|
9912
9948
|
mode: z.enum(["remote", "local", "cache"]).optional().describe("DB source (default 'remote')."),
|