comfyui-mcp 0.52.33 → 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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"}
@@ -68,6 +68,75 @@ function journalTabFor(ctx) {
68
68
  const b = ctx.bridge;
69
69
  return b.resolveSharedTabId?.(ctx.tabId) ?? ctx.tabId;
70
70
  }
71
+ /**
72
+ * #1917 — the CANONICAL tab id a SCOPE-addressed session's commands are dispatched
73
+ * to right now: the in-flight turn's routing pin, resolved onward through any
74
+ * same-socket migration alias, else the active-tab fallback when no turn is
75
+ * pinned. Undefined when nothing resolves — and, deliberately, for a REAL-TAB ctx,
76
+ * which routes by its own id and has no second selector to disagree with.
77
+ *
78
+ * Canonical on purpose: `resolveSharedTabId` answers with `conn.tabId`, the same
79
+ * value `resolveActiveScopeTab` answers with, so the two can be compared for
80
+ * "different TAB" rather than "different id string". A pin naming a retired
81
+ * `wf:<route>:<path>` id that still reaches the same live socket resolves to that
82
+ * socket's current canonical id and is therefore NOT a disagreement.
83
+ *
84
+ * Never throws: an unresolvable pin is the bridge's own loud failure at dispatch
85
+ * time, and a reporting helper must not turn it into a different one here.
86
+ */
87
+ function scopeRoutedTabId(ctx) {
88
+ if (!isScopeAddress(ctx.tabId))
89
+ return undefined;
90
+ const b = ctx.bridge;
91
+ if (typeof b.resolveSharedTabId !== "function")
92
+ return undefined;
93
+ try {
94
+ return b.resolveSharedTabId(ctx.tabId);
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
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) {
118
+ if (!isScopeAddress(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
+ : {};
139
+ }
71
140
  /** #704 — the CONVERSATION a ticket belongs to: the backend-qualified agent key
72
141
  * (`orchestrator::<backend>`) this tool session is bound to. The tab a run was
73
142
  * routed to is only its address and it churns across a panel reconnect (a new
@@ -614,10 +683,14 @@ export const __panelToolsTestHooks = {
614
683
  setRetrySettleMs(ms) {
615
684
  retrySettleMsOverride = ms;
616
685
  },
617
- /** 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. */
618
687
  setReconnectWaitTiming(timing) {
619
688
  reconnectWaitTimingOverride = timing;
620
689
  },
690
+ /** The reconnect wait the tools actually use (env/default, or the test override). */
691
+ getReconnectWaitTiming() {
692
+ return reconnectWaitTiming();
693
+ },
621
694
  /** Shrink the #1175 late-acknowledgement grace so a reconcile test doesn't wait 10s. */
622
695
  setRunLateAckGraceMs(ms) {
623
696
  runLateAckGraceMsOverride = ms;
@@ -1059,11 +1132,16 @@ let reconnectWaitTimingOverride = null;
1059
1132
  /** Hard ceiling on the reconnect wait so an oversized env value can never make a
1060
1133
  * tool block near/over the outer MCP tools/call deadline (~300s). */
1061
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;
1062
1140
  function reconnectWaitTiming() {
1063
1141
  if (reconnectWaitTimingOverride)
1064
1142
  return reconnectWaitTimingOverride;
1065
1143
  return {
1066
- 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)),
1067
1145
  intervalMs: Math.round(parsePositiveNumberEnv("COMFYUI_PANEL_RECONNECT_POLL_S", 0.5) * 1000),
1068
1146
  };
1069
1147
  }
@@ -12130,7 +12208,38 @@ export function buildPanelToolDefs() {
12130
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" })),
12131
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) => {
12132
12210
  const target = ctx.workflowTarget?.get(ctx.tabId) ?? { mode: "current" };
12133
- 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
+ });
12134
12243
  }),
12135
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.", {
12136
12245
  mode: z
@@ -12423,6 +12532,45 @@ export function buildPanelToolDefs() {
12423
12532
  // made only on the evidence that supports it; without that evidence the reply
12424
12533
  // says what IS true (the pin is set and acts as a GUARD) and hands back the
12425
12534
  // cheap read that settles it.
12535
+ //
12536
+ // #1917 — the SAME rule for the `mode:"current"` arm, which panel#1529's fix
12537
+ // deliberately did not take. "Following the user's current workflow tab." is
12538
+ // also a claim about ROUTING, and it was likewise unconditional. It is FALSE
12539
+ // whenever this conversation's in-flight turn pin is holding routing on a
12540
+ // different tab: `rebindToActiveTab` short-circuits for a scope ctx whose pin
12541
+ // still reaches a live tab (#884 — a live pin is never displaced) and returns
12542
+ // `{rebound:false}` with no `repinRefusal` at all, so nothing in the reply
12543
+ // mentioned the pin. Measured on clean main over a real bridge: with the pin
12544
+ // on the tab showing Basic_V37 and the active-scope resolution naming the tab
12545
+ // showing PHOTO, this call answered «Following the user's current workflow
12546
+ // tab.» with `graph_binding:"bound"`, and the next `panel_graph_outline` AND
12547
+ // the next `panel_remove_node` were both dispatched to Basic_V37.
12548
+ //
12549
+ // The pin is NOT moved to make the sentence true — that is #884's P0, and
12550
+ // widening "displace" from dead-or-ambiguous to dead-or-ambiguous-or-different
12551
+ // would re-aim an in-flight conversation's mutations at a tab it never
12552
+ // addressed. What changes is the CLAIM: when two selectors name different
12553
+ // tabs, say so and name both, rather than silently reporting one of them.
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)
12569
+ : undefined;
12570
+ // panel#1529's `pin_verified_active` rule, applied to the routing half: the
12571
+ // same verdict the note carries, MACHINE-READABLE, so an agent never has to
12572
+ // read "the two selectors disagree" out of prose.
12573
+ const turnRoutingSplitFields = turnRoutingSplitFieldsFor(turnPinRoutesElsewhere);
12426
12574
  const hint = target.mode === "pinned"
12427
12575
  ? pinVerifiedActive
12428
12576
  ? `Pinned to "${target.filename ?? target.path}". Graph tools will target that workflow without switching the user's view.`
@@ -12433,7 +12581,24 @@ export function buildPanelToolDefs() {
12433
12581
  // be a confident wrong diagnosis; what is true in all three is that the
12434
12582
  // check did not happen.
12435
12583
  : `Pinned to "${target.filename ?? target.path}" — but NOT CONFIRMED: the live canvas could not be read back to check this pin against it, so this call does NOT establish that graph tools will reach that workflow. The pin travels on graph commands as a GUARD: if the active canvas is a different workflow, the next graph call FAILS with a workflow mismatch rather than editing it. Settle it with one cheap read — panel_graph_outline — before relying on this.`
12436
- : "Following the user's current workflow tab.";
12584
+ : turnPinRoutesElsewhere
12585
+ ? `The workflow target is now mode:"current" — but graph tools will NOT ` +
12586
+ `follow the tab this session would otherwise resolve to. This ` +
12587
+ `conversation's IN-FLIGHT TURN is pinned to tab ` +
12588
+ `${shortTabId(turnPinRoutesElsewhere.routedTab)}, and that pin was NOT ` +
12589
+ `displaced: a pin that still reaches a live tab of this conversation is ` +
12590
+ `never displaced, however explicit the request (#884). So every graph ` +
12591
+ `command — READS AND MUTATIONS ALIKE — is dispatched to ` +
12592
+ `${shortTabId(turnPinRoutesElsewhere.routedTab)}, not to ` +
12593
+ `${shortTabId(turnPinRoutesElsewhere.activeScopeTab)}, which is where ` +
12594
+ `"current" would resolve. TWO SELECTORS NAME DIFFERENT TABS and this ` +
12595
+ `call moved neither, so do not read it as "graph tools now follow the ` +
12596
+ `user's current tab". WHAT TO DO: read the pinned tab first ` +
12597
+ `(panel_graph_outline) and work there if that is the workflow you mean; ` +
12598
+ `otherwise ask the user to send a message from the tab they want — the ` +
12599
+ `turn pin is released at the end of this turn and the next message's ` +
12600
+ `origin establishes routing. Retrying this tool will not move it.`
12601
+ : "Following the user's current workflow tab.";
12437
12602
  // #803 — this used to END here for every mode:"current" call, with the
12438
12603
  // unconditional "Following the user's current workflow tab." Reporters followed
12439
12604
  // that as the documented recovery, read it as success, and stayed wedged. The
@@ -12646,6 +12811,7 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
12646
12811
  graph_binding: "bound",
12647
12812
  ...(fenceRebind ? { graph_binding_status: fenceRebind.status } : {}),
12648
12813
  ...(currentModeTurnRepinned ? { turn_routing: "repinned" } : {}),
12814
+ ...turnRoutingSplitFields,
12649
12815
  note: hint +
12650
12816
  rebindNote +
12651
12817
  ` The graph binding was NOT re-derived (the panel's active reply could ` +
@@ -12691,6 +12857,7 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
12691
12857
  ...(typeof scopeRepin === "string" || currentModeTurnRepinned
12692
12858
  ? { turn_routing: "repinned" }
12693
12859
  : {}),
12860
+ ...turnRoutingSplitFields,
12694
12861
  note: hint + rebindNote + (fence?.note ?? "") + scopeRepinNote,
12695
12862
  });
12696
12863
  }),
@@ -12812,6 +12979,8 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
12812
12979
  },
12813
12980
  // #1877 — a collapsed node can sit inside the auto-fit box and still be
12814
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.
12815
12984
  async (args, ctx) => includeRequestedCreateGroupMembers(await ctx.call({
12816
12985
  cmd: "graph_create_group",
12817
12986
  title: args.title,