comfyui-mcp 0.11.0 → 0.12.0

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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,83 @@ All notable changes to this project are documented here. This project adheres to
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## [0.12.0] - 2026-06-13
10
+
11
+ ### Fixed
12
+
13
+ - **Panel messages now push into Claude Code for real.** The server now
14
+ declares the experimental `claude/channel` capability and sends
15
+ `notifications/claude/channel` with the host's expected
16
+ `{ content, meta }` shape — previously the capability was missing and
17
+ the params were a flat custom object, so Claude Code silently dropped
18
+ every panel message and only `panel_inbox` polling worked.
19
+
20
+ ### Added
21
+
22
+ - **`civitai` plugin skill (16 skills total).** Pairs the official
23
+ [Civitai MCP](https://mcp.civitai.com/mcp) with comfyui-mcp instead of
24
+ proxying it: Claude discovers models on Civitai, hands the returned
25
+ model-version id to `download_civitai_model`, and installs/wires/generates
26
+ locally — falling back to HuggingFace search when the Civitai MCP isn't
27
+ connected. The `comfy-researcher` agent now prefers Civitai discovery for
28
+ model (not node-pack) requests when those tools are present. Docs gained a
29
+ "Pairs with the official Civitai MCP" section.
30
+ - **Multi-tab panel bridge.** Each ComfyUI browser tab now holds its own
31
+ identified bridge connection — the panel sends a `hello` frame with a
32
+ per-tab session id and the open workflow's title, `panel_status` lists
33
+ every connected tab, and all graph tools accept an optional `tab_id`
34
+ (full id or 8-char prefix). Routing default when omitted: the only
35
+ connected tab → the tab the user most recently typed in → an error
36
+ listing the tabs. `panel_say` broadcasts unless targeted; inbox entries
37
+ and channel notifications carry which tab/workflow spoke. Previously a
38
+ second tab silently stole the single connection.
39
+ - **`panel_clear` tool** — remove every node from the open graph in one
40
+ step; the whole wipe is a single Ctrl+Z undo (panel pack executes it
41
+ inside one `beforeChange`/`afterChange` pair).
42
+ - **Six more panel tools — full control of the open ComfyUI tab:**
43
+ `panel_move_node`, `panel_canvas` (fit / center-on-node / pan / zoom),
44
+ `panel_run` (queue the open workflow with live widget values),
45
+ `panel_get_errors` (last execution error + node validation errors),
46
+ `panel_save_workflow` (Ctrl+S or save-as/duplicate), and
47
+ `panel_get_subgraph` (drill into a subgraph node). `panel_get_graph` now
48
+ reports which graph the user is viewing and summarizes subgraph nodes
49
+ shallowly (boundary slots + inner count). Panel user messages carry the
50
+ opened subgraph in channel-event meta and inbox entries.
51
+ - **Panel v0.3 (in progress, [comfyui-mcp-panel](https://github.com/artokun/comfyui-mcp-panel)):**
52
+ native ComfyUI design-system restyle (PrimeVue semantic tokens, theme-
53
+ tracking), activity cards for every agent graph edit, empty-state
54
+ onboarding, "Claude is working…" typing indicator. Polished registry
55
+ release **coming soon**.
56
+
57
+ [0.12.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.12.0
58
+
59
+ ## [0.11.1] - 2026-06-12
60
+
61
+ ### Added
62
+
63
+ - **`model-registry` plugin skill** — one curated table of download URLs +
64
+ target `models/` subdirs for every model the skills reference (Flux, WAN,
65
+ LTX, Qwen, Z-Image, shared VAEs/text-encoders), consolidating rows that
66
+ were scattered across `model-settings.json` and individual skills. Grows
67
+ each release. Plugin is now **15 skills**.
68
+ - **Plugin ships channels mode by default** — `plugin/.mcp.json` now passes
69
+ `--channels`, so plugin users get the panel bridge + `panel_*` tools
70
+ automatically (pair with the
71
+ [comfyui-mcp-panel](https://github.com/artokun/comfyui-mcp-panel) pack).
72
+
73
+ ### Changed
74
+
75
+ - **Discoverability:** README leads with "the Claude Code plugin for
76
+ ComfyUI" and the real asset counts (88 tools / 15 skills / 11 commands /
77
+ 4 agents / 4 hooks — previously undersold as 6 skills / 10 commands);
78
+ corrected the plugin install command (`/plugin marketplace add` +
79
+ `/plugin install comfy`); npm description + keywords expanded; GitHub
80
+ repo topics added (both repos had zero); new docs page
81
+ [`/plugin`](https://comfyui-mcp.artokun.io/docs/plugin) documenting the
82
+ full skill/command/agent/hook surface.
83
+
84
+ ## [0.11.0] - 2026-06-12
85
+
9
86
  ### Added
10
87
 
11
88
  - **Channels mode (`--channels`) — your own agent session drives the ComfyUI
@@ -21,7 +98,6 @@ All notable changes to this project are documented here. This project adheres to
21
98
  events on hosts that surface them. Bridge design (rid-correlated
22
99
  request/reply, loopback-only, last-writer-wins) ported from the author's
23
100
  node-lab project. New dependency: `ws`.
24
-
25
101
  - **Live graph edits for the agent panel** (superseded same-day by channels
26
102
  mode above, retained as the legacy API-key path). The experimental
27
103
  `/api/chat` backend declares six client-side `graph_*` tools that the
@@ -31,6 +107,8 @@ All notable changes to this project are documented here. This project adheres to
31
107
  step 4, built on v1 LiteGraph shims instead of waiting for
32
108
  `@comfyorg/extension-api` v2.
33
109
 
110
+ ## [0.10.1] - 2026-06-12
111
+
34
112
  ### Fixed
35
113
 
36
114
  - **Long jobs no longer killed at 10 minutes.** The job watcher's completion
@@ -52,6 +130,8 @@ All notable changes to this project are documented here. This project adheres to
52
130
  unaffected. Idea from
53
131
  [josephoibrahim/comfy-cozy](https://github.com/josephoibrahim/comfy-cozy).
54
132
 
133
+ ## [0.10.0] - 2026-06-11
134
+
55
135
  ### Added
56
136
 
57
137
  - **`lock_workflow` + `verify_workflow_lock`** — provenance sidecars for
@@ -67,7 +147,6 @@ All notable changes to this project are documented here. This project adheres to
67
147
  bumps). Local install required for v1 (SHA-256 needs file bytes;
68
148
  commits come from `custom_nodes/*/.git/HEAD`). Idea from
69
149
  [josephoibrahim/comfy-cozy](https://github.com/josephoibrahim/comfy-cozy).
70
-
71
150
  - **Resumable model downloads.** Big-model fetches (10–40 GB checkpoints over
72
151
  flaky connections to HuggingFace / CivitAI / S3) used to start from byte 0
73
152
  every retry. The download cache now writes to a deterministic
@@ -432,6 +511,10 @@ subprocess fallback where the API can't do the job.
432
511
 
433
512
  Earlier releases predate this changelog.
434
513
 
514
+ [0.11.1]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.11.1
515
+ [0.11.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.11.0
516
+ [0.10.1]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.10.1
517
+ [0.10.0]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.10.0
435
518
  [0.9.5]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.9.5
436
519
  [0.9.4]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.9.4
437
520
  [0.9.3]: https://github.com/artokun/comfyui-mcp/releases/tag/v0.9.3
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # comfyui-mcp
1
+ # comfyui-mcp — the Claude Code plugin for ComfyUI
2
2
 
3
- **MCP server + Claude Code plugin for [ComfyUI](https://github.com/comfyanonymous/ComfyUI)** — execute workflows, generate images, visualize pipelines, manage models, control VRAM, and explore custom nodes, all from your AI coding assistant.
3
+ **Claude Code plugin + MCP server for [ComfyUI](https://github.com/comfyanonymous/ComfyUI)** — generate images and video, execute and author workflows, manage models and custom nodes, and **edit your live ComfyUI graph from your Claude session** ([sidebar panel](https://github.com/artokun/comfyui-mcp-panel), zero API keys).
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/comfyui-mcp)](https://www.npmjs.com/package/comfyui-mcp)
6
6
  [![Node.js](https://img.shields.io/badge/node-%3E%3D22.0.0-brightgreen)](https://nodejs.org)
@@ -12,7 +12,13 @@
12
12
 
13
13
  Works on **macOS**, **Linux**, and **Windows**. Auto-detects your ComfyUI installation and port.
14
14
 
15
- **80+ MCP tools** | **10 slash commands** | **6 knowledge skills** | **3 autonomous agents** | **3 hooks**
15
+ **88 MCP tools** | **16 AI skills** (Flux · WAN · LTX video · Qwen · Z-Image · model registry · Civitai · node authoring) | **11 slash commands** | **4 autonomous agents** | **4 hooks**
16
+
17
+ The plugin ships **expert skills that grow with every release** — model-specific generation guides with curated download URLs, workflow recipes, troubleshooting, and custom-node authoring — so Claude knows the right sampler, CFG, resolution, and model files for each architecture without trial and error.
18
+
19
+ > ### 🚧 Coming soon: the [ComfyUI MCP Panel](https://github.com/artokun/comfyui-mcp-panel) on ComfyUI-Manager & the Comfy Registry
20
+ > Claude in your ComfyUI sidebar — live graph edits, activity cards, multi-tab, zero API keys.
21
+ > v0.3 is in final testing. [Read more →](https://comfyui-mcp.artokun.io/docs/panel)
16
22
 
17
23
  📖 **Full documentation: [comfyui-mcp.artokun.io/docs](https://comfyui-mcp.artokun.io/docs)**
18
24
 
@@ -63,7 +69,9 @@ This package also ships as a **Claude Code plugin**, providing slash commands, s
63
69
  ### Install as a plugin
64
70
 
65
71
  ```bash
66
- claude plugin install comfyui-mcp
72
+ # In Claude Code
73
+ /plugin marketplace add artokun/comfyui-mcp
74
+ /plugin install comfy
67
75
  ```
68
76
 
69
77
  ### Slash commands
@@ -83,6 +91,8 @@ claude plugin install comfyui-mcp
83
91
 
84
92
  ### Built-in skills
85
93
 
94
+ 16 skills total — model-family guides (Flux, WAN, LTX, Qwen, Z-Image), the **model-registry** (curated download URLs), the **civitai** pairing skill, node authoring, and the core four below. Full list on the [plugin docs page](https://comfyui-mcp.artokun.io/docs/plugin).
95
+
86
96
  | Skill | Description |
87
97
  |-------|-------------|
88
98
  | **comfyui-core** | Workflow format, node types, data flow patterns, pipeline architecture, MCP tool usage guide |
package/dist/index.js CHANGED
@@ -23,20 +23,29 @@ function enableChannels(server) {
23
23
  bridge.onPanelMessage = (event) => {
24
24
  if (event.type !== "user_message" || typeof event.text !== "string")
25
25
  return;
26
- enqueuePanelMessage(event.text);
27
- // Echo into the panel feed so the user sees their message land.
28
- bridge.push({ type: "echo", text: event.text });
29
- // Best-effort push into the agent session. Unknown notification methods
30
- // are ignored by hosts that don't support them; panel_inbox remains the
31
- // pull path either way.
26
+ enqueuePanelMessage(event.text, {
27
+ tab_id: event.tab_id,
28
+ title: event.title,
29
+ subgraph: event.context?.subgraph,
30
+ });
31
+ // Echo into the originating tab so the user sees their message land.
32
+ bridge.push({ type: "echo", text: event.text }, event.tab_id);
33
+ // Push into the agent session as a channel event. Requires the
34
+ // `claude/channel` experimental capability declared at construction;
35
+ // the host injects { content, meta } as a <channel> block in the
36
+ // prompt. panel_inbox remains the pull fallback for other hosts.
32
37
  void server.server
33
38
  .notification({
34
39
  method: "notifications/claude/channel",
35
40
  params: {
36
- source: "comfyui-panel",
37
- kind: "user_message",
38
- text: event.text,
39
- ts: new Date().toISOString(),
41
+ content: event.text,
42
+ meta: {
43
+ source: "comfyui-panel",
44
+ kind: "user_message",
45
+ ...(event.tab_id ? { tab_id: event.tab_id } : {}),
46
+ ...(event.title ? { workflow: event.title } : {}),
47
+ ...(event.context?.subgraph ? { subgraph: event.context.subgraph } : {}),
48
+ },
40
49
  },
41
50
  })
42
51
  .catch((err) => {
@@ -59,7 +68,22 @@ async function createConfiguredServer(channels = false) {
59
68
  // expose resources or prompts today; advertising them is spec-correct
60
69
  // when paired with a list handler that returns the empty set.
61
70
  // Reported by @ductiletoaster in #29.
62
- capabilities: { tools: {}, resources: {}, prompts: {} },
71
+ capabilities: {
72
+ tools: {},
73
+ resources: {},
74
+ prompts: {},
75
+ // Channels mode: declaring the experimental `claude/channel`
76
+ // capability is what makes Claude Code surface our
77
+ // `notifications/claude/channel` pushes (panel user messages) as
78
+ // <channel> events in the agent's prompt. Without it the host
79
+ // silently drops them.
80
+ ...(channels ? { experimental: { "claude/channel": {} } } : {}),
81
+ },
82
+ ...(channels
83
+ ? {
84
+ instructions: 'Messages the user types into the ComfyUI sidebar panel arrive as <channel source="comfyui-panel" kind="user_message"> events (with the tab_id and workflow title in meta). Act on them and reply with the panel_say tool — that is the only way your words reach the panel. panel_inbox is the pull fallback on hosts without channel support.',
85
+ }
86
+ : {}),
63
87
  });
64
88
  await registerAllTools(server);
65
89
  server.server.setRequestHandler(ListResourcesRequestSchema, async () => ({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -3,25 +3,29 @@
3
3
  // panel's rid-correlated reply — the user's own Claude Code session drives the
4
4
  // live ComfyUI graph through its MCP connection, with zero LLM API keys.
5
5
  //
6
- // Design ported from node-lab's mcp/bridge.ts (same author): every request is
7
- // `{ rid, cmd, ...args }`; the panel replies `{ rid, ok, result }` or
8
- // `{ rid, ok: false, error }`. One panel connection at a time (last writer
9
- // wins). If the port is taken, another comfyui-mcp session owns the panel and
10
- // tools surface a clear, actionable error.
6
+ // MULTI-TAB: each ComfyUI browser tab holds its own connection, identified by
7
+ // a per-tab session id the panel sends in its `hello` frame (plus the open
8
+ // workflow's title, so the agent can tell tabs apart). Commands route by:
9
+ // explicit tab_id the only connected tab the tab the user most recently
10
+ // typed in error listing connected tabs. Workflows are per-tab in ComfyUI,
11
+ // so there is no cross-tab state sync — just per-tab routing.
11
12
  //
12
- // Inbound frames WITHOUT a rid are panel-initiated events (e.g.
13
- // `{ type: "user_message", text }`) and are forwarded to `onPanelMessage` —
14
- // the channels half of the design (see registerChannels in index.ts).
13
+ // Wire design ported from node-lab's mcp/bridge.ts (same author): every
14
+ // request is `{ rid, cmd, ...args }`; the panel replies `{ rid, ok, result }`
15
+ // or `{ rid, ok: false, error }`. Frames WITHOUT a rid are panel-initiated
16
+ // events (`hello`, `user_message`) and flow to `onPanelMessage`.
15
17
  import { randomUUID } from "node:crypto";
16
18
  import { WebSocketServer, WebSocket } from "ws";
17
19
  import { logger } from "../utils/logger.js";
18
20
  export const DEFAULT_BRIDGE_PORT = 9101;
19
21
  export class UiBridge {
20
22
  wss = null;
21
- sock = null;
23
+ conns = new Map(); // tabId -> connection
22
24
  pending = new Map();
23
25
  portInUse = false;
24
26
  port;
27
+ /** Tab the user most recently typed in — the default command target. */
28
+ lastActiveTabId = null;
25
29
  /** Called for panel-initiated frames (no rid): user messages, hellos. */
26
30
  onPanelMessage = null;
27
31
  constructor(port = DEFAULT_BRIDGE_PORT) {
@@ -41,59 +45,157 @@ export class UiBridge {
41
45
  }
42
46
  });
43
47
  wss.on("connection", (sock) => {
44
- // Last writer wins: a reconnecting panel replaces the stale socket.
45
- if (this.sock && this.sock !== sock) {
48
+ // The connection is anonymous until its hello frame names a tab id.
49
+ let tabId = null;
50
+ sock.on("message", (buf) => {
51
+ const raw = buf.toString();
52
+ let msg;
46
53
  try {
47
- this.sock.close();
54
+ msg = JSON.parse(raw);
48
55
  }
49
56
  catch {
50
- // Already gone.
57
+ logger.warn("[ui-bridge] dropping malformed frame from panel");
58
+ return;
51
59
  }
52
- }
53
- this.sock = sock;
54
- logger.info("[ui-bridge] panel connected");
55
- sock.on("message", (buf) => this.onMessage(buf.toString()));
56
- sock.on("close", () => {
57
- if (this.sock === sock)
58
- this.sock = null;
59
- // Fail in-flight commands immediately rather than letting them hang
60
- // to timeout.
61
- for (const [rid, p] of this.pending) {
60
+ // Hello: register (or refresh) this connection under its tab id.
61
+ if (msg.type === "hello" && typeof msg.tab_id === "string") {
62
+ tabId = msg.tab_id;
63
+ const existing = this.conns.get(tabId);
64
+ if (existing && existing.sock !== sock) {
65
+ // Same tab reconnected (reload) supersede the stale socket.
66
+ try {
67
+ existing.sock.close();
68
+ }
69
+ catch {
70
+ // Already gone.
71
+ }
72
+ }
73
+ this.conns.set(tabId, {
74
+ sock,
75
+ tabId,
76
+ title: typeof msg.title === "string" && msg.title ? msg.title : "untitled",
77
+ connectedAt: existing?.connectedAt ?? new Date().toISOString(),
78
+ });
79
+ logger.info(`[ui-bridge] panel tab connected: ${tabId.slice(0, 8)} (“${this.conns.get(tabId)?.title}”) — ${this.conns.size} tab(s) total`);
80
+ this.onPanelMessage?.(msg);
81
+ return;
82
+ }
83
+ const rid = typeof msg.rid === "string" ? msg.rid : undefined;
84
+ if (rid) {
85
+ const p = this.pending.get(rid);
86
+ if (!p)
87
+ return; // late reply for a timed-out command
62
88
  clearTimeout(p.timer);
63
- p.reject(new Error("panel disconnected mid-command"));
64
89
  this.pending.delete(rid);
90
+ if (msg.ok) {
91
+ p.resolve(msg.result);
92
+ }
93
+ else {
94
+ p.reject(new Error(String(msg.error ?? "panel reported an error")));
95
+ }
96
+ return;
97
+ }
98
+ // Panel-initiated event. Stamp the tab and track activity.
99
+ if (typeof msg.type === "string") {
100
+ if (tabId) {
101
+ msg.tab_id = tabId;
102
+ msg.title = this.conns.get(tabId)?.title;
103
+ if (msg.type === "user_message")
104
+ this.lastActiveTabId = tabId;
105
+ }
106
+ this.onPanelMessage?.(msg);
107
+ }
108
+ });
109
+ sock.on("close", () => {
110
+ if (tabId && this.conns.get(tabId)?.sock === sock) {
111
+ this.conns.delete(tabId);
112
+ if (this.lastActiveTabId === tabId)
113
+ this.lastActiveTabId = null;
114
+ logger.info(`[ui-bridge] panel tab disconnected: ${tabId.slice(0, 8)} — ${this.conns.size} tab(s) remain`);
115
+ }
116
+ // Reject any in-flight commands that were bound to this socket.
117
+ for (const [rid, p] of this.pending) {
118
+ if (p.sock === sock) {
119
+ clearTimeout(p.timer);
120
+ p.reject(new Error("panel tab disconnected mid-command"));
121
+ this.pending.delete(rid);
122
+ }
65
123
  }
66
- logger.info("[ui-bridge] panel disconnected");
67
124
  });
68
125
  });
69
126
  this.wss = wss;
70
127
  logger.info(`[ui-bridge] listening on ws://127.0.0.1:${this.port}`);
71
128
  }
72
129
  connected() {
73
- return !!this.sock && this.sock.readyState === WebSocket.OPEN;
130
+ return this.conns.size > 0;
131
+ }
132
+ /** All currently connected tabs, most recent hello last. */
133
+ tabs() {
134
+ return Array.from(this.conns.values()).map((c) => ({
135
+ tab_id: c.tabId,
136
+ title: c.title,
137
+ connected_at: c.connectedAt,
138
+ }));
74
139
  }
75
140
  status() {
76
141
  if (this.portInUse) {
77
142
  return `port ${this.port} is held by another comfyui-mcp session — close it or free the port (lsof -ti:${this.port} | xargs kill)`;
78
143
  }
79
- return this.connected()
80
- ? "panel connected"
81
- : "no panel connected — open ComfyUI with the comfyui-mcp-panel pack installed and check the Agent sidebar tab";
144
+ if (this.conns.size === 0) {
145
+ return "no panel connected — open ComfyUI with the comfyui-mcp-panel pack installed and check the Agent sidebar tab";
146
+ }
147
+ const lines = this.tabs().map((t) => `- tab ${t.tab_id.slice(0, 8)} “${t.title}”${t.tab_id === this.lastActiveTabId ? " (last active)" : ""}`);
148
+ return `${this.conns.size} panel tab(s) connected:\n${lines.join("\n")}`;
82
149
  }
83
- send(cmd, timeoutMs = 6000) {
84
- if (!this.connected()) {
85
- return Promise.reject(new Error(`Panel not reachable: ${this.status()}`));
150
+ /** Resolve which tab a command should go to. */
151
+ resolveTarget(tabId) {
152
+ if (tabId) {
153
+ // Accept full ids or unambiguous prefixes (status shows 8-char ids).
154
+ const exact = this.conns.get(tabId);
155
+ if (exact)
156
+ return exact;
157
+ const prefixed = Array.from(this.conns.values()).filter((c) => c.tabId.startsWith(tabId));
158
+ if (prefixed.length === 1)
159
+ return prefixed[0];
160
+ throw new Error(prefixed.length > 1
161
+ ? `tab_id "${tabId}" is ambiguous — matches ${prefixed.length} tabs`
162
+ : `no connected tab with id "${tabId}". Connected: ${this.tabs()
163
+ .map((t) => `${t.tab_id.slice(0, 8)} (“${t.title}”)`)
164
+ .join(", ") || "none"}`);
165
+ }
166
+ if (this.conns.size === 1) {
167
+ return this.conns.values().next().value;
168
+ }
169
+ if (this.lastActiveTabId && this.conns.has(this.lastActiveTabId)) {
170
+ return this.conns.get(this.lastActiveTabId);
171
+ }
172
+ if (this.conns.size === 0) {
173
+ throw new Error(`Panel not reachable: ${this.status()}`);
174
+ }
175
+ throw new Error(`Multiple panel tabs are connected and none is "last active" — pass tab_id. ${this.status()}`);
176
+ }
177
+ send(cmd, opts = {}) {
178
+ const timeoutMs = opts.timeoutMs ?? 6000;
179
+ let conn;
180
+ try {
181
+ conn = this.resolveTarget(opts.tabId);
182
+ }
183
+ catch (err) {
184
+ return Promise.reject(err instanceof Error ? err : new Error(String(err)));
185
+ }
186
+ if (conn.sock.readyState !== WebSocket.OPEN) {
187
+ return Promise.reject(new Error(`Panel tab ${conn.tabId.slice(0, 8)} is not open`));
86
188
  }
87
189
  const rid = randomUUID();
88
- const sock = this.sock;
89
190
  return new Promise((resolve, reject) => {
90
191
  const timer = setTimeout(() => {
91
192
  this.pending.delete(rid);
92
- reject(new Error(`Panel did not reply to "${cmd.cmd}" within ${timeoutMs} ms — the ComfyUI tab may be backgrounded or frozen`));
193
+ reject(new Error(`Panel tab ${conn.tabId.slice(0, 8)} did not reply to "${cmd.cmd}" within ${timeoutMs} ms — the ComfyUI tab may be backgrounded or frozen`));
93
194
  }, timeoutMs);
94
- this.pending.set(rid, { resolve, reject, timer });
195
+ const pending = { resolve, reject, timer, sock: conn.sock };
196
+ this.pending.set(rid, pending);
95
197
  try {
96
- sock.send(JSON.stringify({ rid, ...cmd }));
198
+ conn.sock.send(JSON.stringify({ rid, ...cmd }));
97
199
  }
98
200
  catch (err) {
99
201
  clearTimeout(timer);
@@ -102,45 +204,24 @@ export class UiBridge {
102
204
  }
103
205
  });
104
206
  }
105
- onMessage(raw) {
106
- let msg;
107
- try {
108
- msg = JSON.parse(raw);
109
- }
110
- catch {
111
- logger.warn("[ui-bridge] dropping malformed frame from panel");
112
- return;
113
- }
114
- const rid = typeof msg.rid === "string" ? msg.rid : undefined;
115
- if (rid) {
116
- const p = this.pending.get(rid);
117
- if (!p)
118
- return; // late reply for a timed-out command
119
- clearTimeout(p.timer);
120
- this.pending.delete(rid);
121
- if (msg.ok) {
122
- p.resolve(msg.result);
207
+ /** Push a fire-and-forget frame. Targeted when tabId given, else broadcast. */
208
+ push(frame, tabId) {
209
+ let sent = 0;
210
+ const targets = tabId
211
+ ? [this.resolveTarget(tabId)]
212
+ : Array.from(this.conns.values());
213
+ for (const conn of targets) {
214
+ if (conn.sock.readyState !== WebSocket.OPEN)
215
+ continue;
216
+ try {
217
+ conn.sock.send(JSON.stringify(frame));
218
+ sent += 1;
123
219
  }
124
- else {
125
- p.reject(new Error(String(msg.error ?? "panel reported an error")));
220
+ catch {
221
+ // Tab mid-disconnect drop.
126
222
  }
127
- return;
128
- }
129
- // Panel-initiated event (user message, hello, etc.).
130
- if (typeof msg.type === "string") {
131
- this.onPanelMessage?.(msg);
132
- }
133
- }
134
- /** Push a fire-and-forget frame to the panel (no reply expected). */
135
- push(frame) {
136
- if (!this.connected())
137
- return;
138
- try {
139
- this.sock?.send(JSON.stringify(frame));
140
- }
141
- catch {
142
- // Panel mid-disconnect — drop.
143
223
  }
224
+ return sent;
144
225
  }
145
226
  async stop() {
146
227
  for (const [rid, p] of this.pending) {
@@ -148,8 +229,15 @@ export class UiBridge {
148
229
  p.reject(new Error("bridge stopped"));
149
230
  this.pending.delete(rid);
150
231
  }
151
- this.sock?.close();
152
- this.sock = null;
232
+ for (const conn of this.conns.values()) {
233
+ try {
234
+ conn.sock.close();
235
+ }
236
+ catch {
237
+ // Already gone.
238
+ }
239
+ }
240
+ this.conns.clear();
153
241
  await new Promise((resolve) => {
154
242
  if (!this.wss)
155
243
  return resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"ui-bridge.js","sourceRoot":"","sources":["../../src/services/ui-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-bridge.js","sourceRoot":"","sources":["../../src/services/ui-bridge.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,+EAA+E;AAC/E,yEAAyE;AACzE,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,wEAAwE;AACxE,8EAA8E;AAC9E,2EAA2E;AAC3E,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAoCxC,MAAM,OAAO,QAAQ;IACX,GAAG,GAA2B,IAAI,CAAC;IACnC,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC,CAAC,sBAAsB;IACvD,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;IACrC,SAAS,GAAG,KAAK,CAAC;IAClB,IAAI,CAAS;IACrB,wEAAwE;IAChE,eAAe,GAAkB,IAAI,CAAC;IAE9C,yEAAyE;IACzE,cAAc,GAAyC,IAAI,CAAC;IAE5D,YAAY,IAAI,GAAG,mBAAmB;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK;QACH,uEAAuE;QACvE,0BAA0B;QAC1B,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACxE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,MAAM,CAAC,IAAI,CACT,oBAAoB,IAAI,CAAC,IAAI,6DAA6D,CAC3F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5B,oEAAoE;YACpE,IAAI,KAAK,GAAkB,IAAI,CAAC;YAEhC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC3B,IAAI,GAA4B,CAAC;gBACjC,IAAI,CAAC;oBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;gBACnD,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;oBAC/D,OAAO;gBACT,CAAC;gBAED,iEAAiE;gBACjE,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC3D,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;oBACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;wBACvC,8DAA8D;wBAC9D,IAAI,CAAC;4BACH,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;wBACxB,CAAC;wBAAC,MAAM,CAAC;4BACP,gBAAgB;wBAClB,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE;wBACpB,IAAI;wBACJ,KAAK;wBACL,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;wBAC1E,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBAC/D,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CACT,oCAAoC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,eAAe,CAC9H,CAAC;oBACF,IAAI,CAAC,cAAc,EAAE,CAAC,GAAiB,CAAC,CAAC;oBACzC,OAAO;gBACT,CAAC;gBAED,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9D,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChC,IAAI,CAAC,CAAC;wBAAE,OAAO,CAAC,qCAAqC;oBACrD,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACtB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACzB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;wBACX,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;yBAAM,CAAC;wBACN,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,yBAAyB,CAAC,CAAC,CAAC,CAAC;oBACtE,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACjC,IAAI,KAAK,EAAE,CAAC;wBACV,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;wBACnB,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;wBACzC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;4BAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAChE,CAAC;oBACD,IAAI,CAAC,cAAc,EAAE,CAAC,GAAiB,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACzB,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK;wBAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAChE,MAAM,CAAC,IAAI,CACT,uCAAuC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAC9F,CAAC;gBACJ,CAAC;gBACD,gEAAgE;gBAChE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACpC,IAAK,CAAoC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;wBACxD,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBACtB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;wBAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,2CAA2C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,4DAA4D;IAC5D,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjD,MAAM,EAAE,CAAC,CAAC,KAAK;YACf,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EAAE,CAAC,CAAC,WAAW;SAC5B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,QAAQ,IAAI,CAAC,IAAI,iFAAiF,IAAI,CAAC,IAAI,gBAAgB,CAAC;QACrI,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,6GAA6G,CAAC;QACvH,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3G,CAAC;QACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,6BAA6B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,gDAAgD;IACxC,aAAa,CAAC,KAAc;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,qEAAqE;YACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5D,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAC1B,CAAC;YACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjB,CAAC,CAAC,WAAW,KAAK,4BAA4B,QAAQ,CAAC,MAAM,OAAO;gBACpE,CAAC,CAAC,6BAA6B,KAAK,iBAAiB,IAAI,CAAC,IAAI,EAAE;qBAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;qBACpD,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAC9B,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAa,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAS,CAAC;QACtD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,8EAA8E,IAAI,CAAC,MAAM,EAAE,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAkB,EAAE,OAA+C,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;QACzC,IAAI,IAAU,CAAC;QACf,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,MAAM,CACJ,IAAI,KAAK,CACP,aAAa,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,sBAAsB,GAAG,CAAC,GAAG,YAAY,SAAS,qDAAqD,CAC3I,CACF,CAAC;YACJ,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,MAAM,OAAO,GAAmC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC,KAA8B,EAAE,KAAc;QACjD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,SAAS;YACtD,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,IAAI,IAAI,CAAC,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;CACF;AAED,iEAAiE;AACjE,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,QAAQ,CAC3B,IAAI;YACF,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,mBAAmB,CAAC,CACvE,CAAC;QACF,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -9,6 +9,13 @@ import { z } from "zod";
9
9
  import { getUiBridge } from "../services/ui-bridge.js";
10
10
  import { errorToToolResult, ComfyUIError } from "../utils/errors.js";
11
11
  const slotRef = z.union([z.string(), z.number().int().min(0)]);
12
+ // Multi-tab: every graph tool accepts an optional tab_id (full id or the
13
+ // 8-char prefix panel_status shows). Routing default when omitted:
14
+ // the only connected tab → the tab the user last typed in → error.
15
+ const tabIdParam = z
16
+ .string()
17
+ .optional()
18
+ .describe("Target panel tab (full id or 8-char prefix from panel_status). Optional when one tab is connected or the user recently typed in a tab.");
12
19
  function bridge() {
13
20
  const b = getUiBridge();
14
21
  if (!b) {
@@ -27,7 +34,7 @@ function textResult(value) {
27
34
  };
28
35
  }
29
36
  export function registerPanelTools(server) {
30
- server.tool("panel_status", "Check whether the ComfyUI MCP Panel (the sidebar pack in the user's browser) is connected to this server's bridge. Call this before any other panel_* tool when a command fails it distinguishes 'panel tab not open' from 'another comfyui-mcp session owns the port'. Read-only.", {}, async () => {
37
+ server.tool("panel_status", "List the ComfyUI MCP Panel tabs connected to this server's bridge — each browser tab holds its own connection with its own open workflow (id + workflow title shown). Call this before other panel_* tools when a command fails, and to get tab_ids when multiple ComfyUI tabs are open. Read-only.", {}, async () => {
31
38
  try {
32
39
  return textResult(bridge().status());
33
40
  }
@@ -35,9 +42,9 @@ export function registerPanelTools(server) {
35
42
  return errorToToolResult(err);
36
43
  }
37
44
  });
38
- server.tool("panel_get_graph", "Read the user's currently-open ComfyUI graph through the sidebar panel: node ids, types, titles, widget values, and connections. ALWAYS call this before your first edit so node ids, widget names, and slot names are accurate. Requires the comfyui-mcp-panel pack connected (check panel_status). Read-only.", {}, async () => {
45
+ server.tool("panel_get_graph", "Read the graph the user is currently viewing (root graph or an opened subgraph — 'viewing' says which): node ids, types, titles, widget values, and connections. Subgraph nodes are summarized SHALLOWLY (boundary inputs/outputs/widgets + inner node count) — drill in with panel_get_subgraph. ALWAYS call this before your first edit so ids and slot names are accurate. Read-only.", { tab_id: tabIdParam }, async (args) => {
39
46
  try {
40
- return textResult(await bridge().send({ cmd: "graph_get_state" }));
47
+ return textResult(await bridge().send({ cmd: "graph_get_state" }, { tabId: args.tab_id }));
41
48
  }
42
49
  catch (err) {
43
50
  return errorToToolResult(err);
@@ -50,9 +57,11 @@ export function registerPanelTools(server) {
50
57
  .optional()
51
58
  .describe("Canvas [x, y]. Auto-placed beside existing nodes when omitted."),
52
59
  title: z.string().optional().describe("Optional custom node title."),
60
+ tab_id: tabIdParam,
53
61
  }, async (args) => {
54
62
  try {
55
- return textResult(await bridge().send({ cmd: "graph_add_node", ...args }));
63
+ const { tab_id, ...cmdArgs } = args;
64
+ return textResult(await bridge().send({ cmd: "graph_add_node", ...cmdArgs }, { tabId: tab_id }));
56
65
  }
57
66
  catch (err) {
58
67
  return errorToToolResult(err);
@@ -60,9 +69,19 @@ export function registerPanelTools(server) {
60
69
  });
61
70
  server.tool("panel_remove_node", "Remove a node (and its connections) from the user's open graph by id. Undoable with Ctrl+Z. Requires the panel connected.", {
62
71
  node_id: z.number().int().describe("Node id from panel_get_graph."),
72
+ tab_id: tabIdParam,
63
73
  }, async (args) => {
64
74
  try {
65
- return textResult(await bridge().send({ cmd: "graph_remove_node", ...args }));
75
+ const { tab_id, ...cmdArgs } = args;
76
+ return textResult(await bridge().send({ cmd: "graph_remove_node", ...cmdArgs }, { tabId: tab_id }));
77
+ }
78
+ catch (err) {
79
+ return errorToToolResult(err);
80
+ }
81
+ });
82
+ server.tool("panel_clear", "Remove EVERY node from the user's open ComfyUI graph in one step — use when the user asks to clear/reset/empty the canvas. The whole wipe is a single Ctrl+Z undo. Requires the panel connected.", { tab_id: tabIdParam }, async (args) => {
83
+ try {
84
+ return textResult(await bridge().send({ cmd: "graph_clear" }, { tabId: args.tab_id }));
66
85
  }
67
86
  catch (err) {
68
87
  return errorToToolResult(err);
@@ -73,9 +92,11 @@ export function registerPanelTools(server) {
73
92
  from_output: slotRef.optional().describe("Source output slot name or index (default 0)."),
74
93
  to_node_id: z.number().int().describe("Target node id."),
75
94
  to_input: slotRef.optional().describe("Target input slot name or index (default 0)."),
95
+ tab_id: tabIdParam,
76
96
  }, async (args) => {
77
97
  try {
78
- return textResult(await bridge().send({ cmd: "graph_connect", ...args }));
98
+ const { tab_id, ...cmdArgs } = args;
99
+ return textResult(await bridge().send({ cmd: "graph_connect", ...cmdArgs }, { tabId: tab_id }));
79
100
  }
80
101
  catch (err) {
81
102
  return errorToToolResult(err);
@@ -84,9 +105,11 @@ export function registerPanelTools(server) {
84
105
  server.tool("panel_disconnect", "Disconnect an input slot of a node in the user's open graph. Undoable with Ctrl+Z. Requires the panel connected.", {
85
106
  node_id: z.number().int().describe("Node id whose input to disconnect."),
86
107
  input: slotRef.optional().describe("Input slot name or index (default 0)."),
108
+ tab_id: tabIdParam,
87
109
  }, async (args) => {
88
110
  try {
89
- return textResult(await bridge().send({ cmd: "graph_disconnect", ...args }));
111
+ const { tab_id, ...cmdArgs } = args;
112
+ return textResult(await bridge().send({ cmd: "graph_disconnect", ...cmdArgs }, { tabId: tab_id }));
90
113
  }
91
114
  catch (err) {
92
115
  return errorToToolResult(err);
@@ -98,26 +121,107 @@ export function registerPanelTools(server) {
98
121
  value: z
99
122
  .union([z.string(), z.number(), z.boolean()])
100
123
  .describe("New value. Must match the widget's expected type."),
124
+ tab_id: tabIdParam,
125
+ }, async (args) => {
126
+ try {
127
+ const { tab_id, ...cmdArgs } = args;
128
+ return textResult(await bridge().send({ cmd: "graph_set_widget", ...cmdArgs }, { tabId: tab_id }));
129
+ }
130
+ catch (err) {
131
+ return errorToToolResult(err);
132
+ }
133
+ });
134
+ server.tool("panel_get_subgraph", "Read INSIDE a subgraph node: ids, types, widget values, and connections of its inner nodes. Use after panel_get_graph shows a node with is_subgraph=true and you need detail (e.g. to diagnose an error inside it). Read-only.", {
135
+ node_id: z.number().int().describe("Subgraph node id (is_subgraph=true in panel_get_graph)."),
136
+ tab_id: tabIdParam,
137
+ }, async (args) => {
138
+ try {
139
+ const { tab_id, ...cmdArgs } = args;
140
+ return textResult(await bridge().send({ cmd: "graph_get_subgraph", ...cmdArgs }, { tabId: tab_id }));
141
+ }
142
+ catch (err) {
143
+ return errorToToolResult(err);
144
+ }
145
+ });
146
+ server.tool("panel_move_node", "Move a node to a new canvas position [x, y] in the user's open graph. Undoable with Ctrl+Z. Use panel_get_graph first for current ids.", {
147
+ node_id: z.number().int().describe("Node id from panel_get_graph."),
148
+ pos: z.tuple([z.number(), z.number()]).describe("New canvas [x, y]."),
149
+ tab_id: tabIdParam,
150
+ }, async (args) => {
151
+ try {
152
+ const { tab_id, ...cmdArgs } = args;
153
+ return textResult(await bridge().send({ cmd: "graph_move_node", ...cmdArgs }, { tabId: tab_id }));
154
+ }
155
+ catch (err) {
156
+ return errorToToolResult(err);
157
+ }
158
+ });
159
+ server.tool("panel_canvas", "Control the user's canvas view: 'fit' frames the whole graph, 'center_on_node' jumps to a node (give node_id), 'pan' shifts by dx/dy graph units, 'zoom' sets an absolute scale. View-only — does not change the graph.", {
160
+ action: z.enum(["fit", "center_on_node", "pan", "zoom"]),
161
+ node_id: z.number().int().optional().describe("Required for center_on_node."),
162
+ dx: z.number().optional().describe("Pan delta x (graph units)."),
163
+ dy: z.number().optional().describe("Pan delta y (graph units)."),
164
+ scale: z.number().optional().describe("Absolute zoom for 'zoom' (0.05–4, 1 = 100%)."),
165
+ tab_id: tabIdParam,
166
+ }, async (args) => {
167
+ try {
168
+ const { tab_id, ...cmdArgs } = args;
169
+ return textResult(await bridge().send({ cmd: "graph_canvas", ...cmdArgs }, { tabId: tab_id }));
170
+ }
171
+ catch (err) {
172
+ return errorToToolResult(err);
173
+ }
174
+ });
175
+ server.tool("panel_run", "Queue the workflow the user has OPEN (exactly like them pressing Queue Prompt — current widget values, live graph). Returns queued:true, or queued:false with node_errors when frontend validation fails — fix those and retry. For headless API-format workflows use enqueue_workflow instead.", {
176
+ batch_count: z.number().int().min(1).max(100).optional().describe("Times to queue (default 1)."),
177
+ tab_id: tabIdParam,
178
+ }, async (args) => {
179
+ try {
180
+ const { tab_id, ...cmdArgs } = args;
181
+ return textResult(await bridge().send({ cmd: "graph_run", ...cmdArgs }, { tabId: tab_id, timeoutMs: 20000 }));
182
+ }
183
+ catch (err) {
184
+ return errorToToolResult(err);
185
+ }
186
+ });
187
+ server.tool("panel_get_errors", "Read the most recent execution error and per-node validation errors from the user's open ComfyUI tab. Check this when the user says their workflow failed, or after panel_run reports node_errors. Read-only.", { tab_id: tabIdParam }, async (args) => {
188
+ try {
189
+ return textResult(await bridge().send({ cmd: "graph_get_errors" }, { tabId: args.tab_id }));
190
+ }
191
+ catch (err) {
192
+ return errorToToolResult(err);
193
+ }
194
+ });
195
+ server.tool("panel_save_workflow", "Save the user's open workflow. Without a name: same as Ctrl+S (may open ComfyUI's save dialog for never-saved workflows). With a name: saves a copy to workflows/<name>.json — use this to DUPLICATE the current workflow.", {
196
+ name: z
197
+ .string()
198
+ .optional()
199
+ .describe("Save-as/duplicate target name (no .json needed). Omit for plain save."),
200
+ tab_id: tabIdParam,
101
201
  }, async (args) => {
102
202
  try {
103
- return textResult(await bridge().send({ cmd: "graph_set_widget", ...args }));
203
+ const cmd = args.name
204
+ ? { cmd: "workflow_save_as", name: args.name }
205
+ : { cmd: "workflow_save" };
206
+ return textResult(await bridge().send(cmd, { tabId: args.tab_id, timeoutMs: 15000 }));
104
207
  }
105
208
  catch (err) {
106
209
  return errorToToolResult(err);
107
210
  }
108
211
  });
109
- server.tool("panel_say", "Post a message into the panel's chat feed in the user's ComfyUI sidebar. Use this to narrate what you changed, confirm completion, or ask the user a question — it's the ONLY way your words reach the panel UI. Supports plain text with simple markdown (bold, code).", {
212
+ server.tool("panel_say", "Post a message into the panel's chat feed in the user's ComfyUI sidebar. Use this to narrate what you changed, confirm completion, or ask the user a question — it's the ONLY way your words reach the panel UI. Broadcasts to every connected tab unless tab_id targets one. Supports plain text with simple markdown (bold, code).", {
110
213
  text: z.string().min(1).describe("The message to show in the panel chat feed."),
214
+ tab_id: tabIdParam,
111
215
  }, async (args) => {
112
216
  try {
113
- bridge().push({ type: "say", text: args.text });
114
- return textResult("delivered");
217
+ const n = bridge().push({ type: "say", text: args.text }, args.tab_id);
218
+ return textResult(`delivered to ${n} tab(s)`);
115
219
  }
116
220
  catch (err) {
117
221
  return errorToToolResult(err);
118
222
  }
119
223
  });
120
- server.tool("panel_inbox", "Drain user messages typed into the panel chat since the last call. Returns an array of { text, ts }. Use when the user says they'll talk to you through the ComfyUI panel — poll this after each action, and reply with panel_say. (When channel notifications are enabled, new messages also arrive as session events and polling is unnecessary.)", {}, async () => {
224
+ server.tool("panel_inbox", "Drain user messages typed into the panel chat since the last call. Returns an array of { text, ts, tab_id, title } — title is the workflow open in the tab the user typed in. Use when the user says they'll talk to you through the ComfyUI panel — poll this after each action, and reply with panel_say. (When channel notifications are enabled, new messages also arrive as session events and polling is unnecessary.)", {}, async () => {
121
225
  try {
122
226
  bridge(); // throw early if no bridge
123
227
  return textResult(drainInbox());
@@ -134,8 +238,8 @@ export function registerPanelTools(server) {
134
238
  // ---------------------------------------------------------------------------
135
239
  const MAX_INBOX = 200;
136
240
  const inbox = [];
137
- export function enqueuePanelMessage(text) {
138
- inbox.push({ text, ts: new Date().toISOString() });
241
+ export function enqueuePanelMessage(text, meta = {}) {
242
+ inbox.push({ text, ts: new Date().toISOString(), ...meta });
139
243
  if (inbox.length > MAX_INBOX)
140
244
  inbox.splice(0, inbox.length - MAX_INBOX);
141
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/tools/panel.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,qEAAqE;AACrE,mEAAmE;AACnE,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAErE,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/D,SAAS,MAAM;IACb,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;IACxB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,YAAY,CACpB,gGAAgG,EAChG,oBAAoB,CACrB,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACzE;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,sRAAsR,EACtR,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,iTAAiT,EACjT,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,uPAAuP,EACvP;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QAC3E,GAAG,EAAE,CAAC;aACH,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;aAC/B,QAAQ,EAAE;aACV,QAAQ,CAAC,gEAAgE,CAAC;QAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KACrE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,2HAA2H,EAC3H;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KACpE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mQAAmQ,EACnQ;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC1D,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACzF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KACtF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kHAAkH,EAClH;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACxE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KAC5E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,+LAA+L,EAC/L;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACzE,KAAK,EAAE,CAAC;aACL,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aAC5C,QAAQ,CAAC,mDAAmD,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,WAAW,EACX,yQAAyQ,EACzQ;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAChF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,qVAAqV,EACrV,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,CAAC,2BAA2B;YACrC,OAAO,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAC3E,sEAAsE;AACtE,8EAA8E;AAE9E,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,KAAK,GAAwC,EAAE,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS;QAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/tools/panel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "comfyui-mcp",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "mcpName": "io.github.artokun/comfyui-mcp",
5
- "description": "MCP server for ComfyUI workflow execution, visualization, composition, registry, and skill generation",
5
+ "description": "Claude Code plugin + MCP server for ComfyUI - 88 tools, 16 AI skills (Flux, WAN, LTX video, Qwen, Civitai), live graph editing from your Claude session. Generate images & video, manage models and custom nodes.",
6
6
  "homepage": "https://comfyui-mcp.artokun.io/docs",
7
7
  "type": "module",
8
8
  "main": "dist/index.js",
@@ -61,11 +61,22 @@
61
61
  "keywords": [
62
62
  "comfyui",
63
63
  "mcp",
64
+ "mcp-server",
64
65
  "model-context-protocol",
66
+ "claude-code",
67
+ "claude-plugin",
68
+ "claude-skills",
69
+ "agent-skills",
65
70
  "stable-diffusion",
66
71
  "image-generation",
67
- "claude-code",
68
- "claude-plugin"
72
+ "video-generation",
73
+ "text-to-image",
74
+ "flux",
75
+ "wan",
76
+ "ltx-video",
77
+ "ai-agent",
78
+ "comfyui-extension",
79
+ "workflow-automation"
69
80
  ],
70
81
  "author": "artokun",
71
82
  "license": "MIT",
package/plugin/.mcp.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "comfyui": {
3
3
  "command": "npx",
4
- "args": ["-y", "comfyui-mcp"],
4
+ "args": ["-y", "comfyui-mcp", "--channels"],
5
5
  "env": {
6
6
  "CIVITAI_API_TOKEN": ""
7
7
  }