comfyui-mcp 0.52.34 → 0.52.35

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.
@@ -1,17 +1,23 @@
1
1
  /**
2
- * #1877 — panel_create_group can wrap a collapsed node and still report it
3
- * missing.
2
+ * #1877 / #1921 — panel_create_group auto-bounds from live `pos`/`size` can
3
+ * miss a requested node whose origin is already inside the box.
4
4
  *
5
- * The panel sizes the box from live `pos`/`size`. A collapsed node often has
6
- * `size[1] === 0` (title-chip only), so the box is ~100px tall around the
7
- * node's origin. Membership then tests the CENTRE of a boundingRect rebuilt
8
- * with the panel's `finiteExtent` fallback (0 is not a usable height, so the
9
- * body becomes 100px plus a 30px title). That centre sits a few pixels below
10
- * the box, so the group is empty even though the node's coordinates are inside.
5
+ * #1877: a collapsed node often has `size[1] === 0` (title-chip only), so the
6
+ * box is ~100px tall around the origin. Membership then tests the CENTRE of a
7
+ * boundingRect rebuilt with the panel's `finiteExtent` fallback (0 is not a
8
+ * usable height, so the body becomes 100px plus a 30px title). That centre
9
+ * sits a few pixels below the box, so the group is empty even though the
10
+ * node's coordinates are inside.
11
+ *
12
+ * #1921: SaveImage / other DOM-preview nodes start compact (`size[1] === 58`)
13
+ * and rehydrate to ~326px after the image widget mounts (save/reopen). The
14
+ * compact auto-box still reports them as members; after rehydrate their centre
15
+ * drops below the persisted bottom and they fall out.
11
16
  *
12
17
  * These helpers expand a created group's bounds just enough to contain every
13
18
  * membership-plausible centre of a requested node whose origin is already in
14
- * the box — then the caller writes those bounds with graph_edit_group.
19
+ * the box — including the stable full-height centre of a DOM-preview node —
20
+ * then the caller writes those bounds with graph_edit_group.
15
21
  *
16
22
  * Constants match comfyui-mcp-panel `web/js/lib/group-geometry.js`
17
23
  * (`COLLAPSED_TITLE_HEIGHT`, `COLLAPSED_PILL_WIDTH`, `finiteExtent` fallbacks)
@@ -21,6 +27,18 @@ export const NODE_TITLE_HEIGHT = 30;
21
27
  export const COLLAPSED_PILL_WIDTH = 80;
22
28
  export const DEFAULT_NODE_WIDTH = 200;
23
29
  export const DEFAULT_NODE_BODY_HEIGHT = 100;
30
+ /** Compact SaveImage body is ~58px; after the image-preview DOM widget mounts it is 326px (#1921). */
31
+ export const DOM_PREVIEW_NODE_MIN_BODY_HEIGHT = 326;
32
+ /** Node types whose LiteGraph size grows when a DOM/preview widget rehydrates. */
33
+ export const DOM_PREVIEW_NODE_TYPES = new Set([
34
+ "SaveImage",
35
+ "PreviewImage",
36
+ "LoadImage",
37
+ "LoadImageMask",
38
+ "SaveVideo",
39
+ "VHS_LoadVideo",
40
+ "VHS_VideoCombine",
41
+ ]);
24
42
  function finiteExtent(value, fallback) {
25
43
  const n = Number(value);
26
44
  return Number.isFinite(n) && n > 0 ? n : fallback;
@@ -38,9 +56,12 @@ export function nodePosInsideGroupBounds(pos, bounds) {
38
56
  // top-left origin sitting on or inside the box, not a centre test.
39
57
  return x >= gx && x <= gx + gw && y >= gy && y <= gy + gh;
40
58
  }
59
+ export function isDomPreviewNodeType(type) {
60
+ return typeof type === "string" && DOM_PREVIEW_NODE_TYPES.has(type);
61
+ }
41
62
  /**
42
63
  * Centres LiteGraph / the panel might use for containsCentre, given only the
43
- * geometry panel_query_graph actually returns (pos, size, collapsed, full_height).
64
+ * geometry panel_query_graph actually returns (pos, size, type, collapsed, full_height).
44
65
  */
45
66
  export function membershipCandidateCenters(node) {
46
67
  const x = node.pos[0];
@@ -49,7 +70,7 @@ export function membershipCandidateCenters(node) {
49
70
  const fullW = finiteExtent(node.size[0], DEFAULT_NODE_WIDTH);
50
71
  const fullH = finiteExtent(node.size[1], DEFAULT_NODE_BODY_HEIGHT);
51
72
  const chipH = finiteExtent(node.full_height, NODE_TITLE_HEIGHT);
52
- return [
73
+ const points = [
53
74
  // Collapsed title-chip (syncNodeArea without forceCollapsed).
54
75
  { x: x + pillW / 2, y: y - NODE_TITLE_HEIGHT + chipH / 2 },
55
76
  // forceCollapsed wantedNodeArea: size[1]===0 falls back to DEFAULT_NODE_BODY_HEIGHT.
@@ -57,6 +78,15 @@ export function membershipCandidateCenters(node) {
57
78
  // Raw pos + stored size (degenerate when size[1] is 0 — origin itself).
58
79
  { x: x + fullW / 2, y: y + (node.size[1] > 0 ? node.size[1] : 0) / 2 },
59
80
  ];
81
+ // #1921 — expanded DOM-preview body after widget rehydrate. Collapsed chips stay chips.
82
+ if (!node.collapsed && isDomPreviewNodeType(node.type)) {
83
+ const previewH = Math.max(fullH, DOM_PREVIEW_NODE_MIN_BODY_HEIGHT);
84
+ if (previewH > fullH) {
85
+ points.push({ x: x + fullW / 2, y: y + previewH / 2 });
86
+ points.push({ x: x + fullW / 2, y: y - NODE_TITLE_HEIGHT + (previewH + NODE_TITLE_HEIGHT) / 2 });
87
+ }
88
+ }
89
+ return points;
60
90
  }
61
91
  /** Grow `bounds` so every point is a containsCentre member (max edge exclusive). */
62
92
  export function expandBoundsToContainCenters(bounds, points) {
@@ -159,6 +189,8 @@ export function parseDetailNodesFromQueryText(text) {
159
189
  if (![x, y, w, h].every(Number.isFinite))
160
190
  continue;
161
191
  const geom = { id, pos: [x, y], size: [w, h] };
192
+ if (typeof row.type === "string" && row.type)
193
+ geom.type = row.type;
162
194
  if (row.collapsed === true)
163
195
  geom.collapsed = true;
164
196
  if (typeof row.full_height === "number" && Number.isFinite(row.full_height)) {
@@ -199,9 +231,10 @@ function quadsEqual(a, b) {
199
231
  return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];
200
232
  }
201
233
  /**
202
- * After graph_create_group, if requested ids are missing AND their origin sits
203
- * inside the new box, expand the box so those centres are members and rewrite
204
- * the reply. Never throws: a failed repair returns the original create result.
234
+ * After graph_create_group, query the requested nodes and expand the box so
235
+ * every origin-inside node stays a containsCentre member including collapsed
236
+ * fallback centres (#1877) and DOM-preview full height after rehydrate (#1921).
237
+ * Never throws: a failed repair returns the original create result.
205
238
  */
206
239
  export async function includeRequestedCreateGroupMembers(created, requestedIds, call) {
207
240
  try {
@@ -219,23 +252,16 @@ export async function includeRequestedCreateGroupMembers(created, requestedIds,
219
252
  const bounds = finiteQuad(group.bounding);
220
253
  if (!bounds)
221
254
  return created;
222
- const live = asIdList(group.node_ids);
223
- const reportedMissing = asIdList(group.missing_node_ids);
224
- const missing = reportedMissing.length
225
- ? reportedMissing.filter((id) => requested.some((r) => idKey(r) === idKey(id)))
226
- : classifyRequestedMembership(requested, live).missing;
227
- if (!missing.length)
228
- return created;
229
255
  const query = await call({
230
256
  cmd: "graph_query",
231
- ids: missing,
257
+ ids: requested,
232
258
  fields: "detail",
233
- limit: Math.min(Math.max(missing.length, 1), 200),
259
+ limit: Math.min(Math.max(requested.length, 1), 200),
234
260
  }, 8000);
235
261
  if (query.isError)
236
262
  return created;
237
263
  const qPayload = parseToolJson(query);
238
- const nodes = parseDetailNodesFromQueryText(qPayload?.text).filter((n) => missing.some((id) => idKey(id) === idKey(n.id)));
264
+ const nodes = parseDetailNodesFromQueryText(qPayload?.text).filter((n) => requested.some((id) => idKey(id) === idKey(n.id)));
239
265
  const repairable = nodes.filter((n) => nodePosInsideGroupBounds(n.pos, bounds));
240
266
  if (!repairable.length)
241
267
  return created;
@@ -1 +1 @@
1
- {"version":3,"file":"create-group-membership.js","sourceRoot":"","sources":["../../src/orchestrator/create-group-membership.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-group-membership.js","sourceRoot":"","sources":["../../src/orchestrator/create-group-membership.ts"],"names":[],"mappings":"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"}
@@ -60,6 +60,14 @@ import { NO_ORIGIN_REMEDY } from "./fence-refusal.js";
60
60
  * labeled "foreign" and boundary sweeps could never close the ticket (codex
61
61
  * round 3, P1). Resolves the scope to the active tab; a real-tab ctx is
62
62
  * returned unchanged. */
63
+ function journalTabFor(ctx) {
64
+ if (!isScopeAddress(ctx.tabId))
65
+ return ctx.tabId;
66
+ // Pass the ctx's own (backend-qualified) scope address so the RIGHT
67
+ // conversation's in-flight-turn pin is consulted (#884 P0).
68
+ const b = ctx.bridge;
69
+ return b.resolveSharedTabId?.(ctx.tabId) ?? ctx.tabId;
70
+ }
63
71
  /**
64
72
  * #1917 — the CANONICAL tab id a SCOPE-addressed session's commands are dispatched
65
73
  * to right now: the in-flight turn's routing pin, resolved onward through any
@@ -89,13 +97,45 @@ function scopeRoutedTabId(ctx) {
89
97
  return undefined;
90
98
  }
91
99
  }
92
- function journalTabFor(ctx) {
100
+ /**
101
+ * #1917 — the two selectors a `mode:"current"` session routes by, WHEN THEY
102
+ * DISAGREE: the tab this conversation's in-flight turn pin is holding every graph
103
+ * command on, and the tab "current" would otherwise resolve to. Undefined when
104
+ * they agree, when either cannot be resolved, or for a real-tab ctx — i.e. the
105
+ * disclosure is made only on the evidence that supports it.
106
+ *
107
+ * Both sides are CANONICAL connection ids (`resolveSharedTabId` and
108
+ * `resolveActiveScopeTab` both answer with `conn.tabId`), so a pin that merely
109
+ * names a RETIRED per-workflow route id but still reaches the same live socket is
110
+ * NOT a split — otherwise this would fire on every healthy single-tab session that
111
+ * has run a `panel_open_workflow` (#640).
112
+ *
113
+ * An AMBIGUOUS pin (`null` from the resolver, a mixed-origin batch) resolves to
114
+ * undefined here and is deliberately not reported as a split: routing is refused
115
+ * outright on that shape, which is a different reply with a different remedy.
116
+ */
117
+ function turnPinRoutesElsewhereFor(ctx) {
93
118
  if (!isScopeAddress(ctx.tabId))
94
- return ctx.tabId;
95
- // Pass the ctx's own (backend-qualified) scope address so the RIGHT
96
- // conversation's in-flight-turn pin is consulted (#884 P0).
97
- const b = ctx.bridge;
98
- return b.resolveSharedTabId?.(ctx.tabId) ?? ctx.tabId;
119
+ return undefined;
120
+ const routedTab = scopeRoutedTabId(ctx);
121
+ const activeScopeTab = typeof ctx.bridge.resolveActiveScopeTab === "function"
122
+ ? ctx.bridge.resolveActiveScopeTab()
123
+ : undefined;
124
+ if (typeof routedTab !== "string" || typeof activeScopeTab !== "string")
125
+ return undefined;
126
+ return routedTab === activeScopeTab ? undefined : { routedTab, activeScopeTab };
127
+ }
128
+ /** #1917 — the split verdict, MACHINE-READABLE, so an agent never has to read
129
+ * "the two selectors disagree" out of prose. Shared by the tool that SETS the
130
+ * target and the tool that REPORTS it, so the two can never drift apart. */
131
+ function turnRoutingSplitFieldsFor(split) {
132
+ return split
133
+ ? {
134
+ turn_routing: "pinned_elsewhere",
135
+ turn_routing_tab: split.routedTab,
136
+ current_would_route_to: split.activeScopeTab,
137
+ }
138
+ : {};
99
139
  }
100
140
  /** #704 — the CONVERSATION a ticket belongs to: the backend-qualified agent key
101
141
  * (`orchestrator::<backend>`) this tool session is bound to. The tab a run was
@@ -643,10 +683,14 @@ export const __panelToolsTestHooks = {
643
683
  setRetrySettleMs(ms) {
644
684
  retrySettleMsOverride = ms;
645
685
  },
646
- /** Inject fast reconnect-wait timing so #400/#402 tests don't wait the real ~20s. */
686
+ /** Inject fast reconnect-wait timing so #400/#402 tests don't wait the real ~35s. */
647
687
  setReconnectWaitTiming(timing) {
648
688
  reconnectWaitTimingOverride = timing;
649
689
  },
690
+ /** The reconnect wait the tools actually use (env/default, or the test override). */
691
+ getReconnectWaitTiming() {
692
+ return reconnectWaitTiming();
693
+ },
650
694
  /** Shrink the #1175 late-acknowledgement grace so a reconcile test doesn't wait 10s. */
651
695
  setRunLateAckGraceMs(ms) {
652
696
  runLateAckGraceMsOverride = ms;
@@ -1088,11 +1132,16 @@ let reconnectWaitTimingOverride = null;
1088
1132
  /** Hard ceiling on the reconnect wait so an oversized env value can never make a
1089
1133
  * tool block near/over the outer MCP tools/call deadline (~300s). */
1090
1134
  const RECONNECT_WAIT_MAX_MS = 60_000;
1135
+ /** Default seconds to wait for a tab re-hello after restart/reload.
1136
+ * 20s lost to ComfyUI Desktop recoveries of 26–28s after the server was already
1137
+ * healthy (panel#654): `panel_graph_outline` reported Connected: none and only a
1138
+ * hard refresh restored the tab. 35s covers those recoveries; the 60s ceiling stays. */
1139
+ const RECONNECT_WAIT_DEFAULT_S = 35;
1091
1140
  function reconnectWaitTiming() {
1092
1141
  if (reconnectWaitTimingOverride)
1093
1142
  return reconnectWaitTimingOverride;
1094
1143
  return {
1095
- budgetMs: Math.min(RECONNECT_WAIT_MAX_MS, Math.round(parsePositiveNumberEnv("COMFYUI_PANEL_RECONNECT_WAIT_S", 20) * 1000)),
1144
+ budgetMs: Math.min(RECONNECT_WAIT_MAX_MS, Math.round(parsePositiveNumberEnv("COMFYUI_PANEL_RECONNECT_WAIT_S", RECONNECT_WAIT_DEFAULT_S) * 1000)),
1096
1145
  intervalMs: Math.round(parsePositiveNumberEnv("COMFYUI_PANEL_RECONNECT_POLL_S", 0.5) * 1000),
1097
1146
  };
1098
1147
  }
@@ -12159,7 +12208,38 @@ export function buildPanelToolDefs() {
12159
12208
  def("panel_list_workflows", "List the user's OPEN workflow tabs and which one is active (path, filename, modified, persisted). Use this to know what's open before switching/renaming/closing. Read-only.", {}, async (_args, ctx) => ctx.call({ cmd: "workflow_list" })),
12160
12209
  def("panel_get_workflow_target", "Read which workflow this agent is bound to edit. mode 'current' means graph tools follow whatever tab the user is viewing; mode 'pinned' means edits are bound to the pinned workflow (which was the active canvas at pin time) — if the user later switches to another tab, your next graph call FAILS LOUDLY rather than silently editing the wrong graph. Call this when unsure which workflow your panel_* edits will affect.", {}, async (_args, ctx) => {
12161
12210
  const target = ctx.workflowTarget?.get(ctx.tabId) ?? { mode: "current" };
12162
- return ok(target);
12211
+ // #1917 — this tool's whole job is to answer "which workflow will my
12212
+ // panel_* edits affect?", and its own description answers `current` with
12213
+ // "graph tools follow whatever tab the user is viewing". That is the SAME
12214
+ // routing claim panel_set_workflow_target was making, so it is false in the
12215
+ // same state: when this conversation's in-flight turn pin is holding every
12216
+ // graph command on a different tab, the tab the user is viewing is NOT where
12217
+ // the edits land. An agent that is unsure enough to call this is exactly the
12218
+ // caller that must not be told the reassuring half.
12219
+ //
12220
+ // Only for `current`. A PIN makes no claim this could contradict — it travels
12221
+ // on graph commands as a GUARD and a mismatch fails loudly (#1912), so a
12222
+ // pinned session is left to that reply.
12223
+ const split = target.mode === "pinned" ? undefined : turnPinRoutesElsewhereFor(ctx);
12224
+ if (!split)
12225
+ return ok(target);
12226
+ return ok({
12227
+ ...target,
12228
+ ...turnRoutingSplitFieldsFor(split),
12229
+ note: `mode:"current" is the workflow TARGET, but it is NOT where graph commands ` +
12230
+ `are going right now. This conversation's IN-FLIGHT TURN is pinned to tab ` +
12231
+ `${shortTabId(split.routedTab)}, so every graph command — READS AND ` +
12232
+ `MUTATIONS ALIKE — is dispatched there, not to ` +
12233
+ `${shortTabId(split.activeScopeTab)}, which is the tab "current" would ` +
12234
+ `resolve to. TWO SELECTORS NAME DIFFERENT TABS. A pin that still reaches a ` +
12235
+ `live tab of this conversation is never displaced, however explicit the ` +
12236
+ `request (#884), so calling panel_set_workflow_target({mode:"current"}) ` +
12237
+ `will NOT move it. Work on tab ${shortTabId(split.routedTab)} (read it ` +
12238
+ `first with panel_graph_outline) if that is the workflow you mean; ` +
12239
+ `otherwise ask the user to send a message from the tab they want — the ` +
12240
+ `turn pin is released at the end of this turn and the next message's ` +
12241
+ `origin establishes routing.`,
12242
+ });
12163
12243
  }),
12164
12244
  def("panel_set_workflow_target", "Pin the agent to a specific open workflow tab (it must be the ACTIVE/in-view workflow at pin time), or release the pin to follow the user's current tab. The panel can only read or edit the workflow currently in view, so pinning to a background tab is REJECTED at pin time — to work on a different open workflow, switch to it first with panel_open_workflow (that makes it active), then pin. Pinning does NOT change the user's view; it binds your panel_* graph edits to that workflow and makes a later mismatch (e.g. the user switches away) fail loudly instead of silently editing the wrong graph. Set mode:'pinned' with path from panel_list_workflows; set mode:'current' (or omit path) to follow the active tab again. mode:'current' is ALSO the explicit RECOVERY signal: if your panel_* calls started failing with `no connected tab`, or with a `workflow instance mismatch` / out-of-sync-graph error, after ComfyUI reconnected, the panel reloaded, or the workflow on the canvas was switched or replaced, call this with mode:'current'. It rebinds this session onto the tab that's live now AND re-derives the workflow-instance fence your graph commands are stamped with from the panel's live active canvas — that second half is what clears an instance mismatch. It reports whether that actually worked: `graph_binding:\"bound\"` means graph tools are usable again, `\"reads_only\"` means reads work but mutations stay refused, `\"unverified\"` means the fence is set but readiness could not be confirmed (treat the next graph call as the test), and it FAILS (rather than reporting a hollow success) when the binding could not be restored, naming what to do instead.", {
12165
12245
  mode: z
@@ -12471,34 +12551,26 @@ export function buildPanelToolDefs() {
12471
12551
  // would re-aim an in-flight conversation's mutations at a tab it never
12472
12552
  // addressed. What changes is the CLAIM: when two selectors name different
12473
12553
  // tabs, say so and name both, rather than silently reporting one of them.
12474
- const routedTab = scopeRoutedTabId(ctx);
12475
- const activeScopeTab = typeof ctx.bridge.resolveActiveScopeTab === "function"
12476
- ? ctx.bridge.resolveActiveScopeTab()
12477
- : undefined;
12478
- // Compared as CANONICAL connection ids on both sides (resolveSharedTabId and
12479
- // resolveActiveScopeTab both answer with `conn.tabId`), so a pin that merely
12480
- // names a RETIRED per-workflow route id but still resolves onto the same live
12481
- // socket does not read as a split only a genuinely different tab does.
12482
- const turnPinRoutesElsewhere = mode === "current" &&
12483
- !currentModeTurnRepinned &&
12484
- isScopeAddress(ctx.tabId) &&
12485
- typeof routedTab === "string" &&
12486
- typeof activeScopeTab === "string" &&
12487
- routedTab !== activeScopeTab
12488
- ? { routedTab, activeScopeTab }
12554
+ // Compared as CANONICAL connection ids on both sides — see
12555
+ // turnPinRoutesElsewhereFor.
12556
+ //
12557
+ // `!currentModeTurnRepinned` is REDUNDANT on every ordinary path and is kept
12558
+ // deliberately: a repin moves the pin ONTO the active tab, so the equality
12559
+ // check inside the helper already returns undefined. It earns its place only
12560
+ // in the race where the active tab changes between the repin and this line —
12561
+ // there the helper WOULD report a split, and the note attached to it says
12562
+ // "that pin was NOT displaced", which had just stopped being true. Suppressing
12563
+ // it there keeps `turn_routing:"repinned"` and `"pinned_elsewhere"` mutually
12564
+ // exclusive and keeps the reply from contradicting itself. Staging that race
12565
+ // deterministically is not worth a test, so a mutation dropping this condition
12566
+ // survives the suite; that is a known and accepted gap, not an oversight.
12567
+ const turnPinRoutesElsewhere = mode === "current" && !currentModeTurnRepinned
12568
+ ? turnPinRoutesElsewhereFor(ctx)
12489
12569
  : undefined;
12490
12570
  // panel#1529's `pin_verified_active` rule, applied to the routing half: the
12491
12571
  // same verdict the note carries, MACHINE-READABLE, so an agent never has to
12492
- // read "the two selectors disagree" out of prose. `turn_routing:"repinned"`
12493
- // and `"pinned_elsewhere"` are mutually exclusive by construction — the
12494
- // predicate above requires `!currentModeTurnRepinned`.
12495
- const turnRoutingSplitFields = turnPinRoutesElsewhere
12496
- ? {
12497
- turn_routing: "pinned_elsewhere",
12498
- turn_routing_tab: turnPinRoutesElsewhere.routedTab,
12499
- current_would_route_to: turnPinRoutesElsewhere.activeScopeTab,
12500
- }
12501
- : {};
12572
+ // read "the two selectors disagree" out of prose.
12573
+ const turnRoutingSplitFields = turnRoutingSplitFieldsFor(turnPinRoutesElsewhere);
12502
12574
  const hint = target.mode === "pinned"
12503
12575
  ? pinVerifiedActive
12504
12576
  ? `Pinned to "${target.filename ?? target.path}". Graph tools will target that workflow without switching the user's view.`
@@ -12907,6 +12979,8 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
12907
12979
  },
12908
12980
  // #1877 — a collapsed node can sit inside the auto-fit box and still be
12909
12981
  // reported missing (size[1]===0 vs membership's 100px body fallback).
12982
+ // #1921 — SaveImage/preview nodes grow after DOM rehydration; expand
12983
+ // auto-bounds to the stable full height before persisting.
12910
12984
  async (args, ctx) => includeRequestedCreateGroupMembers(await ctx.call({
12911
12985
  cmd: "graph_create_group",
12912
12986
  title: args.title,