comfyui-mcp 0.52.47 → 0.52.49

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.
Files changed (33) hide show
  1. package/README.md +1 -1
  2. package/dist/boot.js +5 -4
  3. package/dist/boot.js.map +1 -1
  4. package/dist/orchestrator/get-errors-audit.js +14 -7
  5. package/dist/orchestrator/get-errors-audit.js.map +1 -1
  6. package/dist/orchestrator/index.js +94 -298
  7. package/dist/orchestrator/index.js.map +1 -1
  8. package/dist/orchestrator/panel-mcp-http.js +2 -2
  9. package/dist/orchestrator/panel-mcp-http.js.map +1 -1
  10. package/dist/orchestrator/panel-tools.js +114 -7
  11. package/dist/orchestrator/panel-tools.js.map +1 -1
  12. package/dist/orchestrator/promoted-widget.js +49 -0
  13. package/dist/orchestrator/promoted-widget.js.map +1 -1
  14. package/dist/orchestrator/run-completion-journal.js +5 -0
  15. package/dist/orchestrator/run-completion-journal.js.map +1 -1
  16. package/dist/orchestrator/run-completion-watchdog.js +63 -14
  17. package/dist/orchestrator/run-completion-watchdog.js.map +1 -1
  18. package/dist/services/bridge-port-reclaim.js +340 -0
  19. package/dist/services/bridge-port-reclaim.js.map +1 -0
  20. package/dist/services/bridge-ports.js +78 -0
  21. package/dist/services/bridge-ports.js.map +1 -0
  22. package/dist/services/listener-ownership.js +30 -0
  23. package/dist/services/listener-ownership.js.map +1 -1
  24. package/dist/services/panel-launcher.js +20 -4
  25. package/dist/services/panel-launcher.js.map +1 -1
  26. package/dist/services/secure-bridge.js +8 -5
  27. package/dist/services/secure-bridge.js.map +1 -1
  28. package/dist/services/self-restart.js +24 -5
  29. package/dist/services/self-restart.js.map +1 -1
  30. package/dist/services/tunnel.js +11 -2
  31. package/dist/services/tunnel.js.map +1 -1
  32. package/docker/runpod/README.md +1 -1
  33. package/package.json +1 -1
@@ -56,7 +56,7 @@ function tabIdFromUrl(url) {
56
56
  * Start the loopback HTTP MCP server that exposes the panel_* tools to Codex,
57
57
  * routed by tab id. Returns once the port is bound (or rejects on bind failure).
58
58
  */
59
- export function startPanelMcpHttpServer(bridge, port, host = "127.0.0.1", workflowTargets) {
59
+ export function startPanelMcpHttpServer(bridge, port, host = "127.0.0.1", workflowTargets, onRunTicketOpened) {
60
60
  // tabId -> (sessionId -> Session). A tab can hold multiple Codex sessions
61
61
  // across reconnects; each is its own server+transport over the SAME tab ctx.
62
62
  const tabs = new Map();
@@ -74,7 +74,7 @@ export function startPanelMcpHttpServer(bridge, port, host = "127.0.0.1", workfl
74
74
  { instructions: PANEL_HANDSHAKE_INSTRUCTIONS });
75
75
  // Tab-bound context: every tool forwards to the bridge for THIS tab — the
76
76
  // same surface the Claude in-process server exposes (shared defs).
77
- registerPanelTools(server, makePanelToolCtx(bridge, tabId, workflowTargets));
77
+ registerPanelTools(server, makePanelToolCtx(bridge, tabId, workflowTargets, onRunTicketOpened));
78
78
  const transport = new StreamableHTTPServerTransport({
79
79
  sessionIdGenerator: () => randomUUID(),
80
80
  // Defense in depth against DNS rebinding (a malicious page resolving its own
@@ -1 +1 @@
1
- {"version":3,"file":"panel-mcp-http.js","sourceRoot":"","sources":["../../src/orchestrator/panel-mcp-http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"panel-mcp-http.js","sourceRoot":"","sources":["../../src/orchestrator/panel-mcp-http.ts"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ import { peekResolvedPanelBase, primePanelBase, verifiedPanelDiskVersion, } from
48
48
  import { conversationOfScopeAddress, isScopeAddress, shortTabId } from "../services/session-scope.js";
49
49
  import { NODE_ID_MESSAGE, NODE_ID_PATTERN, normalizeNodeId, PLAIN_NODE_ID_PATTERN, unionErrorFor, } from "./node-id.js";
50
50
  import { unrecognizedKeysError } from "./unrecognized-keys.js";
51
- import { addressedNodeMatchesPersistRemedy, parseContradictoryPromotedWidgetRefusal, parseUnpromotedControlPersistRemedy, resolveInnerPromotedTarget, } from "./promoted-widget.js";
51
+ import { addressedNodeMatchesPersistRemedy, parseAmbiguousPromotedWidgetRefusal, parseContradictoryPromotedWidgetRefusal, parseSubgraphScopeRefusal, parseUnpromotedControlPersistRemedy, resolveInnerPromotedTarget, } from "./promoted-widget.js";
52
52
  import { includeRequestedCreateGroupMembers } from "./create-group-membership.js";
53
53
  import { sizeForUncollapse } from "./edit-node-uncollapse.js";
54
54
  import { fastGroupsFilterPropertyNote, isFastGroupsFilterProperty, } from "./rgthree-fast-groups-property.js";
@@ -3797,6 +3797,57 @@ async function persistUnpromotedControlAfterGenerate(res, ctx, addressedNodeId)
3797
3797
  }
3798
3798
  return rewriteToolResultJson(res, pinnedControlPayload(payload, remedy, exits.failed ? exits.note : undefined));
3799
3799
  }
3800
+ function promotedWidgetCandidates(payload, nodeId, requestedWidget) {
3801
+ if (!payload || !Array.isArray(payload.nodes))
3802
+ return [];
3803
+ const node = payload.nodes.find((entry) => {
3804
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
3805
+ return false;
3806
+ return String(entry.id) === nodeId;
3807
+ });
3808
+ if (!node || typeof node !== "object" || Array.isArray(node))
3809
+ return [];
3810
+ const inputs = node.inputs;
3811
+ if (!Array.isArray(inputs))
3812
+ return [];
3813
+ const wanted = requestedWidget.toLowerCase();
3814
+ const candidates = [];
3815
+ for (let index = 0; index < inputs.length; index += 1) {
3816
+ const input = inputs[index];
3817
+ if (!input || typeof input !== "object" || Array.isArray(input))
3818
+ continue;
3819
+ const record = input;
3820
+ const name = typeof record.name === "string" ? record.name : null;
3821
+ if (!name)
3822
+ continue;
3823
+ const label = typeof record.label === "string" ? record.label : null;
3824
+ if (name.toLowerCase() !== wanted && label?.toLowerCase() !== wanted)
3825
+ continue;
3826
+ const rawSlot = record.slot;
3827
+ const slot = typeof rawSlot === "number" && Number.isSafeInteger(rawSlot) ? rawSlot : index;
3828
+ candidates.push({ slot, name, label });
3829
+ }
3830
+ return candidates;
3831
+ }
3832
+ async function explainAmbiguousPromotedWidgetRefusal(first, args, ctx) {
3833
+ const refusal = parseAmbiguousPromotedWidgetRefusal(textOfToolResult(first), String(args.widget), args.node_id);
3834
+ if (!refusal || String(refusal.nodeId) !== String(args.node_id))
3835
+ return first;
3836
+ const detail = await ctx.call({ cmd: "graph_query", ids: [args.node_id], fields: "detail", limit: 1 }, 8000);
3837
+ const candidates = promotedWidgetCandidates(parseToolResultJson(detail), refusal.nodeId, refusal.widget);
3838
+ const listed = candidates.length
3839
+ ? candidates
3840
+ .map((candidate) => `{slot:${candidate.slot}, name:${JSON.stringify(candidate.name)}, ` +
3841
+ `label:${JSON.stringify(candidate.label)}}`)
3842
+ .join("; ")
3843
+ : "unavailable (the node detail query did not expose promoted input names)";
3844
+ return appendToolResultText(first, `\n\n(The panel found ${refusal.matches} promoted inputs matching "${refusal.widget}". ` +
3845
+ `The write was refused and no second write was attempted. Candidate ` +
3846
+ `{slot,name,label} triples: ${listed}. ` +
3847
+ `Use an unambiguous promoted input name if one is available; the MCP layer ` +
3848
+ `cannot safely choose between a name and a label.)` +
3849
+ (detail.isError ? ` Detail query FAILED: ${textOfToolResult(detail)}` : ""));
3850
+ }
3800
3851
  // ---- #1658: Anima/Krea2 regional canvas prompt textareas --------------------------
3801
3852
  //
3802
3853
  // ComfyUI_LC123_nodes `web/inline_regional_canvas.js` hides the prompt widgets
@@ -8277,7 +8328,7 @@ export function resetAbandonedConfirmCards() {
8277
8328
  abandonedConfirmCards.clear();
8278
8329
  }
8279
8330
  /** Build a tab-bound execution context shared by both transports. */
8280
- export function makePanelToolCtx(bridge, tabId, workflowTargets) {
8331
+ export function makePanelToolCtx(bridge, tabId, workflowTargets, onRunTicketOpened) {
8281
8332
  // The routing tab id is held on the returned ctx object (NOT captured by
8282
8333
  // value) so an explicit rebind can re-point this session in place: call/
8283
8334
  // confirm and every handler read `ctx.tabId` LIVE. See rebindToActiveTab.
@@ -8285,6 +8336,7 @@ export function makePanelToolCtx(bridge, tabId, workflowTargets) {
8285
8336
  bridge,
8286
8337
  tabId,
8287
8338
  workflowTarget: workflowTargets,
8339
+ onRunTicketOpened,
8288
8340
  };
8289
8341
  // AUTO-HEAL an orphaned session in place. When THIS session's captured tabId no
8290
8342
  // longer reaches a live tab (a full ComfyUI restart/reconnect #178/#170, a
@@ -11630,6 +11682,42 @@ export function buildPanelToolDefs() {
11630
11682
  if (isObjectInfoStarvationRefusal(first)) {
11631
11683
  return appendToolResultText(first, objectInfoStarvationNote());
11632
11684
  }
11685
+ // #2015 — a panel pre-executor can reject an inner node because the
11686
+ // tab has fallen back to the root graph even though the caller already
11687
+ // entered that subgraph. The refusal contains the authoritative
11688
+ // panel_enter_subgraph route. Reassert that route once, then retry the
11689
+ // exact write; never infer an owner from an arbitrary node id.
11690
+ const scopeRefusal = parseSubgraphScopeRefusal(textOfToolResult(first), args.node_id);
11691
+ if (scopeRefusal) {
11692
+ const entered = [];
11693
+ for (const ownerNodeId of scopeRefusal.enterPath) {
11694
+ const step = await ctx.call({ cmd: "graph_enter_subgraph", node_id: ownerNodeId }, 15000);
11695
+ if (step.isError) {
11696
+ const exits = await exitSubgraphLevels(ctx, entered.length);
11697
+ return appendToolResultText(first, `\n\n(The panel said node ${scopeRefusal.nodeId} was outside the current ` +
11698
+ `subgraph. Re-entering panel_enter_subgraph(node_id=${ownerNodeId}) ` +
11699
+ `FAILED: ${textOfToolResult(step)}${exits.failed ? ` ${exits.note}` : ""}. ` +
11700
+ `The write was not retried.)`);
11701
+ }
11702
+ entered.push(ownerNodeId);
11703
+ }
11704
+ const retried = await write(args.node_id, args.widget);
11705
+ if (!retried.isError) {
11706
+ const persisted = await persistUnpromotedControlAfterGenerate(retried, ctx, args.node_id);
11707
+ return appendToolResultText(persisted, `\n\n(The panel reported node ${scopeRefusal.nodeId} outside the current ` +
11708
+ `graph, so its own panel_enter_subgraph route was re-entered and the ` +
11709
+ `write was retried once. The tab remains in that entered scope.)`);
11710
+ }
11711
+ return appendToolResultText(retried, `\n\n(The panel_enter_subgraph route was re-entered, but the exact write ` +
11712
+ `still failed on its one allowed retry: ${textOfToolResult(retried)})`);
11713
+ }
11714
+ // #2015 — the panel's name/label ambiguity is a correctness refusal.
11715
+ // Query detail only to expose the candidates; guessing a slot or
11716
+ // writing an inner node would risk changing a different promoted rail.
11717
+ const ambiguous = parseAmbiguousPromotedWidgetRefusal(textOfToolResult(first), args.widget, args.node_id);
11718
+ if (ambiguous && String(ambiguous.nodeId) === String(args.node_id)) {
11719
+ return explainAmbiguousPromotedWidgetRefusal(first, args, ctx);
11720
+ }
11633
11721
  // #1655 — the panel listed this widget as promoted while refusing it as
11634
11722
  // not promoted. The listing is node.widgets; the write looks up host
11635
11723
  // inputs. When those disagree, resolve the displayed name to the unique
@@ -11970,7 +12058,7 @@ export function buildPanelToolDefs() {
11970
12058
  // instant belongs to this run: the id did not exist before this call created
11971
12059
  // it. Without the timestamp the journal has no way to tell the agent's own
11972
12060
  // 0.1s render from a stranger's, and reported it as UNDETERMINED.
11973
- const runDispatchedAt = Date.now();
12061
+ let runDispatchedAt = Date.now();
11974
12062
  // #1175 — the rid of the dispatch we are about to make, so an unanswered
11975
12063
  // one can be reconciled against the panel's late acknowledgement. Rebound
11976
12064
  // by the re-issue below, deliberately: the entry that matters is always
@@ -12031,6 +12119,11 @@ export function buildPanelToolDefs() {
12031
12119
  // nothing more. A graph still moving after it (a user actively editing)
12032
12120
  // races again and is SURFACED, never re-raced.
12033
12121
  await sleep(retrySettleMs());
12122
+ // The retry is a new dispatch boundary. A watchdog arm observed after the
12123
+ // first certified refusal but before this re-issue belongs to neither
12124
+ // attempt; keep the ticket fence at the dispatch that actually minted its
12125
+ // prompt id rather than allowing that stale arm to be synthesized (#2021).
12126
+ runDispatchedAt = Date.now();
12034
12127
  res = await ctx.call(runCmd, 20000, observeRunRid);
12035
12128
  // #1175 — the re-issue can miss its window exactly as the first
12036
12129
  // dispatch can, and this is the one whose outcome is genuinely open
@@ -12132,9 +12225,20 @@ export function buildPanelToolDefs() {
12132
12225
  // Every id gets its own ticket. `correlatable` stays the promise the
12133
12226
  // anti-poll note is allowed to make — true only if at least one run can
12134
12227
  // actually be correlated back.
12228
+ const ticketedPromptIds = [];
12135
12229
  const correlatable = queuedIds.length === 0
12136
12230
  ? RunCompletions.openRun(undefined, ticketOpts)
12137
- : queuedIds.map((id) => RunCompletions.openRun(id, ticketOpts)).some(Boolean);
12231
+ : queuedIds.map((id) => {
12232
+ const opened = RunCompletions.openRun(id, ticketOpts);
12233
+ if (opened)
12234
+ ticketedPromptIds.push(id);
12235
+ return opened;
12236
+ }).some(Boolean);
12237
+ // A fast QueueMonitor observation can be held before the panel reply
12238
+ // returns. Promote that in-memory arm immediately after its journal
12239
+ // ticket opens, so a completion burst cannot evict this owed run.
12240
+ if (ticketedPromptIds.length)
12241
+ ctx.onRunTicketOpened?.(ticketedPromptIds);
12138
12242
  // Append anti-poll guidance: the agent should go idle after queuing so the
12139
12243
  // executed event auto-injects the output image, rather than busy-polling.
12140
12244
  //
@@ -12300,8 +12404,11 @@ export function buildPanelToolDefs() {
12300
12404
  // the file-probe cap and a failed /object_info lookup produce the same
12301
12405
  // false-clean payload with no flag at all. See get-errors-audit.ts.
12302
12406
  async (_args, ctx) => {
12303
- const primaryTabId = ctx.tabId;
12304
12407
  const primary = await ctx.call({ cmd: "graph_get_errors" }, OBJECT_INFO_REFRESH_ACK_TIMEOUT_MS);
12408
+ // ctx.call may self-heal a reconnect by rebinding the session while the
12409
+ // primary read is in flight. Capture the route that actually produced
12410
+ // this payload, not the stale id from before the retry.
12411
+ const primaryTabId = ctx.tabId;
12305
12412
  return withTruncationHints(await completeGetErrorsAudit(ctx, primary, GET_ERRORS_COMPLETION_BUDGET_MS, primaryTabId), [
12306
12413
  {
12307
12414
  flag: "truncated",
@@ -15939,8 +16046,8 @@ CHECKED FOR YOU: the graph read this message prescribes was just run, and it ` +
15939
16046
  * SHARED tool defs (buildPanelToolDefs) onto the Anthropic SDK server instead of
15940
16047
  * inlining them, so the Codex HTTP path reuses the exact same surface.
15941
16048
  */
15942
- export function createPanelMcpServer(bridge, tabId, workflowTargets) {
15943
- const ctx = makePanelToolCtx(bridge, tabId, workflowTargets);
16049
+ export function createPanelMcpServer(bridge, tabId, workflowTargets, onRunTicketOpened) {
16050
+ const ctx = makePanelToolCtx(bridge, tabId, workflowTargets, onRunTicketOpened);
15944
16051
  // #873 — THE SECOND PANEL REGISTRATION PATH. This one serves the Anthropic Agent SDK
15945
16052
  // (Claude backend, in-process transport); registerPanelTools serves the MCP SDK. They
15946
16053
  // build from the SAME buildPanelToolDefs(), so filtering only the other one left