comfyui-mcp 0.3.2 → 0.4.1
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/.beads/README.md +81 -0
- package/.beads/config.yaml +54 -0
- package/.beads/metadata.json +7 -0
- package/AGENTS.md +84 -0
- package/CLAUDE.md +48 -0
- package/README.md +26 -0
- package/dist/comfyui/client.d.ts +17 -0
- package/dist/comfyui/client.d.ts.map +1 -1
- package/dist/comfyui/client.js +39 -0
- package/dist/comfyui/client.js.map +1 -1
- package/dist/comfyui/types.d.ts +52 -0
- package/dist/comfyui/types.d.ts.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/asset-registry.d.ts +64 -0
- package/dist/services/asset-registry.d.ts.map +1 -0
- package/dist/services/asset-registry.js +118 -0
- package/dist/services/asset-registry.js.map +1 -0
- package/dist/services/defaults-manager.d.ts +31 -0
- package/dist/services/defaults-manager.d.ts.map +1 -0
- package/dist/services/defaults-manager.js +128 -0
- package/dist/services/defaults-manager.js.map +1 -0
- package/dist/services/generate-image.d.ts +35 -0
- package/dist/services/generate-image.d.ts.map +1 -0
- package/dist/services/generate-image.js +63 -0
- package/dist/services/generate-image.js.map +1 -0
- package/dist/services/image-management.d.ts +16 -0
- package/dist/services/image-management.d.ts.map +1 -1
- package/dist/services/image-management.js +32 -0
- package/dist/services/image-management.js.map +1 -1
- package/dist/services/job-watcher.d.ts +5 -1
- package/dist/services/job-watcher.d.ts.map +1 -1
- package/dist/services/job-watcher.js +42 -3
- package/dist/services/job-watcher.js.map +1 -1
- package/dist/services/process-control.js +2 -2
- package/dist/services/process-control.js.map +1 -1
- package/dist/services/view-image.d.ts +17 -0
- package/dist/services/view-image.d.ts.map +1 -0
- package/dist/services/view-image.js +36 -0
- package/dist/services/view-image.js.map +1 -0
- package/dist/services/workflow-autoload.d.ts +41 -0
- package/dist/services/workflow-autoload.d.ts.map +1 -0
- package/dist/services/workflow-autoload.js +172 -0
- package/dist/services/workflow-autoload.js.map +1 -0
- package/dist/services/workflow-converter.d.ts +15 -0
- package/dist/services/workflow-converter.d.ts.map +1 -1
- package/dist/services/workflow-converter.js +333 -5
- package/dist/services/workflow-converter.js.map +1 -1
- package/dist/services/workflow-executor.d.ts.map +1 -1
- package/dist/services/workflow-executor.js +4 -2
- package/dist/services/workflow-executor.js.map +1 -1
- package/dist/tools/assets.d.ts +3 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js +128 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/defaults.d.ts +3 -0
- package/dist/tools/defaults.d.ts.map +1 -0
- package/dist/tools/defaults.js +57 -0
- package/dist/tools/defaults.js.map +1 -0
- package/dist/tools/diagnostics.d.ts.map +1 -1
- package/dist/tools/diagnostics.js +14 -3
- package/dist/tools/diagnostics.js.map +1 -1
- package/dist/tools/generate-image.d.ts +3 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +61 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/image-management.d.ts.map +1 -1
- package/dist/tools/image-management.js +99 -11
- package/dist/tools/image-management.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +13 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/workflow-autoload.d.ts +9 -0
- package/dist/tools/workflow-autoload.d.ts.map +1 -0
- package/dist/tools/workflow-autoload.js +64 -0
- package/dist/tools/workflow-autoload.js.map +1 -0
- package/package.json +2 -1
- package/plugin/scripts/monitor-progress.mjs +9 -5
- package/server.json +21 -0
|
@@ -64,16 +64,344 @@ function getOrderedInputNames(def) {
|
|
|
64
64
|
}
|
|
65
65
|
return names;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Expand component/subgraph nodes by flattening their inner graphs into the
|
|
69
|
+
* outer workflow. Component nodes have a UUID `type` that matches a definition
|
|
70
|
+
* in `workflow.definitions.subgraphs`. Each inner node gets a unique ID to
|
|
71
|
+
* avoid collisions with outer nodes or other component instances.
|
|
72
|
+
*
|
|
73
|
+
* Handles nested components (component inside component) iteratively up to a
|
|
74
|
+
* maximum depth of 10.
|
|
75
|
+
*/
|
|
76
|
+
export function expandComponents(ui) {
|
|
77
|
+
const subgraphs = ui.definitions?.subgraphs;
|
|
78
|
+
if (!subgraphs || subgraphs.length === 0) {
|
|
79
|
+
return { expanded: ui, warnings: [] };
|
|
80
|
+
}
|
|
81
|
+
// Build subgraph lookup: UUID → definition
|
|
82
|
+
const sgMap = new Map();
|
|
83
|
+
for (const sg of subgraphs) {
|
|
84
|
+
sgMap.set(sg.id, sg);
|
|
85
|
+
}
|
|
86
|
+
// Deep-clone so we don't mutate the caller's data
|
|
87
|
+
let nodes = JSON.parse(JSON.stringify(ui.nodes));
|
|
88
|
+
let links = JSON.parse(JSON.stringify(ui.links));
|
|
89
|
+
const warnings = [];
|
|
90
|
+
// Find max IDs for safe remapping
|
|
91
|
+
let nextNodeId = 1;
|
|
92
|
+
let nextLinkId = 1;
|
|
93
|
+
for (const n of nodes)
|
|
94
|
+
nextNodeId = Math.max(nextNodeId, n.id + 1);
|
|
95
|
+
for (const l of links)
|
|
96
|
+
nextLinkId = Math.max(nextLinkId, l[0] + 1);
|
|
97
|
+
for (const sg of subgraphs) {
|
|
98
|
+
for (const n of sg.nodes)
|
|
99
|
+
nextNodeId = Math.max(nextNodeId, n.id + 1);
|
|
100
|
+
for (const l of sg.links)
|
|
101
|
+
nextLinkId = Math.max(nextLinkId, l.id + 1);
|
|
102
|
+
}
|
|
103
|
+
const MAX_DEPTH = 10;
|
|
104
|
+
for (let depth = 0; depth < MAX_DEPTH; depth++) {
|
|
105
|
+
const componentNodes = nodes.filter((n) => sgMap.has(n.type));
|
|
106
|
+
if (componentNodes.length === 0)
|
|
107
|
+
break;
|
|
108
|
+
for (const compNode of componentNodes) {
|
|
109
|
+
const sg = sgMap.get(compNode.type);
|
|
110
|
+
// Skip muted / bypassed component nodes
|
|
111
|
+
if (compNode.mode === 2 || compNode.mode === 4) {
|
|
112
|
+
warnings.push(`Component node ${compNode.id} ("${sg.name}") is muted/bypassed — skipping expansion.`);
|
|
113
|
+
// Remove it so the main converter doesn't warn about unknown type
|
|
114
|
+
nodes = nodes.filter((n) => n.id !== compNode.id);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const result = expandSingleComponent(compNode, sg, nodes, links, nextNodeId, nextLinkId);
|
|
118
|
+
nodes = result.nodes;
|
|
119
|
+
links = result.links;
|
|
120
|
+
nextNodeId = result.nextNodeId;
|
|
121
|
+
nextLinkId = result.nextLinkId;
|
|
122
|
+
warnings.push(...result.warnings);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const expanded = {
|
|
126
|
+
...ui,
|
|
127
|
+
nodes,
|
|
128
|
+
links,
|
|
129
|
+
};
|
|
130
|
+
return { expanded, warnings };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Expand a single component node, returning the modified nodes & links arrays.
|
|
134
|
+
*/
|
|
135
|
+
function expandSingleComponent(compNode, sg, outerNodes, outerLinks, nextNodeId, nextLinkId) {
|
|
136
|
+
const warnings = [];
|
|
137
|
+
const inputNodeId = sg.inputNode.id; // typically -10
|
|
138
|
+
const outputNodeId = sg.outputNode.id; // typically -20
|
|
139
|
+
// ── 1. Remap inner node IDs ──────────────────────────────────────────────
|
|
140
|
+
const nodeRemap = new Map(); // oldInner → newOuter
|
|
141
|
+
for (const inner of sg.nodes) {
|
|
142
|
+
nodeRemap.set(inner.id, nextNodeId++);
|
|
143
|
+
}
|
|
144
|
+
// ── 2. Remap inner link IDs ──────────────────────────────────────────────
|
|
145
|
+
const linkRemap = new Map();
|
|
146
|
+
for (const inner of sg.links) {
|
|
147
|
+
linkRemap.set(inner.id, nextLinkId++);
|
|
148
|
+
}
|
|
149
|
+
// ── 3. Build inner link lookup ───────────────────────────────────────────
|
|
150
|
+
const innerLinkById = new Map();
|
|
151
|
+
for (const l of sg.links)
|
|
152
|
+
innerLinkById.set(l.id, l);
|
|
153
|
+
// ── 4. Clone inner nodes with remapped IDs ──────────────────────────────
|
|
154
|
+
const newNodes = [];
|
|
155
|
+
for (const inner of sg.nodes) {
|
|
156
|
+
const cloned = JSON.parse(JSON.stringify(inner));
|
|
157
|
+
cloned.id = nodeRemap.get(inner.id);
|
|
158
|
+
// Remap link references in inputs
|
|
159
|
+
if (cloned.inputs) {
|
|
160
|
+
for (const inp of cloned.inputs) {
|
|
161
|
+
if (inp.link != null) {
|
|
162
|
+
inp.link = linkRemap.get(inp.link) ?? inp.link;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Remap link references in outputs
|
|
167
|
+
if (cloned.outputs) {
|
|
168
|
+
for (const out of cloned.outputs) {
|
|
169
|
+
if (out.links) {
|
|
170
|
+
out.links = out.links.map((lid) => linkRemap.get(lid) ?? lid);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
newNodes.push(cloned);
|
|
175
|
+
}
|
|
176
|
+
// ── 5. Convert inner links to outer array format ────────────────────────
|
|
177
|
+
// Skip links involving virtual input/output nodes — those get rewired.
|
|
178
|
+
const newLinks = [];
|
|
179
|
+
for (const il of sg.links) {
|
|
180
|
+
if (il.origin_id === inputNodeId || il.target_id === outputNodeId)
|
|
181
|
+
continue;
|
|
182
|
+
const newId = linkRemap.get(il.id);
|
|
183
|
+
const newSrc = nodeRemap.get(il.origin_id);
|
|
184
|
+
const newTgt = nodeRemap.get(il.target_id);
|
|
185
|
+
if (newSrc == null || newTgt == null) {
|
|
186
|
+
warnings.push(`Component "${sg.name}": inner link ${il.id} references unknown node — skipping.`);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
newLinks.push([newId, newSrc, il.origin_slot, newTgt, il.target_slot, il.type]);
|
|
190
|
+
}
|
|
191
|
+
// ── 6. Rewire external inputs (outer → component → inner) ──────────────
|
|
192
|
+
// Build outer link map for quick lookup
|
|
193
|
+
const outerLinkMap = new Map();
|
|
194
|
+
for (const ol of outerLinks)
|
|
195
|
+
outerLinkMap.set(ol[0], ol);
|
|
196
|
+
const linksToRemove = new Set(); // outer link IDs to remove
|
|
197
|
+
const linksToAdd = [];
|
|
198
|
+
if (compNode.inputs) {
|
|
199
|
+
for (let slotIdx = 0; slotIdx < compNode.inputs.length; slotIdx++) {
|
|
200
|
+
const compInput = compNode.inputs[slotIdx];
|
|
201
|
+
if (compInput.link == null)
|
|
202
|
+
continue;
|
|
203
|
+
const outerLink = outerLinkMap.get(compInput.link);
|
|
204
|
+
if (!outerLink)
|
|
205
|
+
continue;
|
|
206
|
+
const srcNodeId = outerLink[1];
|
|
207
|
+
const srcSlot = outerLink[2];
|
|
208
|
+
// Find the matching subgraph input by name
|
|
209
|
+
const sgInput = sg.inputs.find((inp) => inp.name === compInput.name);
|
|
210
|
+
if (!sgInput) {
|
|
211
|
+
warnings.push(`Component "${sg.name}": could not match input "${compInput.name}" — skipping rewire.`);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// For each inner link from the virtual input node, create a new outer link
|
|
215
|
+
for (const innerLinkId of sgInput.linkIds) {
|
|
216
|
+
const il = innerLinkById.get(innerLinkId);
|
|
217
|
+
if (!il || il.origin_id !== inputNodeId)
|
|
218
|
+
continue;
|
|
219
|
+
const remappedTarget = nodeRemap.get(il.target_id);
|
|
220
|
+
if (remappedTarget == null)
|
|
221
|
+
continue;
|
|
222
|
+
const newId = nextLinkId++;
|
|
223
|
+
linksToAdd.push([newId, srcNodeId, srcSlot, remappedTarget, il.target_slot, il.type]);
|
|
224
|
+
// Update the cloned inner node's input to point to the new link
|
|
225
|
+
const targetNode = newNodes.find((n) => n.id === remappedTarget);
|
|
226
|
+
if (targetNode?.inputs) {
|
|
227
|
+
for (const inp of targetNode.inputs) {
|
|
228
|
+
if (inp.link === linkRemap.get(innerLinkId)) {
|
|
229
|
+
inp.link = newId;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
linksToRemove.add(compInput.link);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ── 7. Rewire external outputs (inner → component → outer) ─────────────
|
|
238
|
+
if (compNode.outputs) {
|
|
239
|
+
for (let slotIdx = 0; slotIdx < compNode.outputs.length; slotIdx++) {
|
|
240
|
+
const compOutput = compNode.outputs[slotIdx];
|
|
241
|
+
if (!compOutput.links || compOutput.links.length === 0)
|
|
242
|
+
continue;
|
|
243
|
+
// Find the matching subgraph output by name
|
|
244
|
+
const sgOutput = sg.outputs.find((out) => out.name === compOutput.name);
|
|
245
|
+
if (!sgOutput) {
|
|
246
|
+
warnings.push(`Component "${sg.name}": could not match output "${compOutput.name}" — skipping rewire.`);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
// Find the inner node that produces this output
|
|
250
|
+
let innerSrcId = null;
|
|
251
|
+
let innerSrcSlot = 0;
|
|
252
|
+
for (const innerLinkId of sgOutput.linkIds) {
|
|
253
|
+
const il = innerLinkById.get(innerLinkId);
|
|
254
|
+
if (il && il.target_id === outputNodeId) {
|
|
255
|
+
innerSrcId = il.origin_id;
|
|
256
|
+
innerSrcSlot = il.origin_slot;
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (innerSrcId == null)
|
|
261
|
+
continue;
|
|
262
|
+
const remappedSrc = nodeRemap.get(innerSrcId);
|
|
263
|
+
if (remappedSrc == null)
|
|
264
|
+
continue;
|
|
265
|
+
// Rewire each outer link that consumes this component output
|
|
266
|
+
for (const outerLinkId of compOutput.links) {
|
|
267
|
+
const outerLink = outerLinkMap.get(outerLinkId);
|
|
268
|
+
if (!outerLink)
|
|
269
|
+
continue;
|
|
270
|
+
const tgtNodeId = outerLink[3];
|
|
271
|
+
const tgtSlot = outerLink[4];
|
|
272
|
+
const linkType = outerLink[5];
|
|
273
|
+
const newId = nextLinkId++;
|
|
274
|
+
linksToAdd.push([newId, remappedSrc, innerSrcSlot, tgtNodeId, tgtSlot, linkType]);
|
|
275
|
+
// Update the outer target node's input to reference the new link
|
|
276
|
+
const tgtNode = outerNodes.find((n) => n.id === tgtNodeId);
|
|
277
|
+
if (tgtNode?.inputs) {
|
|
278
|
+
for (const inp of tgtNode.inputs) {
|
|
279
|
+
if (inp.link === outerLinkId) {
|
|
280
|
+
inp.link = newId;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
linksToRemove.add(outerLinkId);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ── 8. Apply proxy widget values ────────────────────────────────────────
|
|
289
|
+
const proxyWidgets = compNode.properties?.proxyWidgets ?? [];
|
|
290
|
+
const widgetValues = compNode.widgets_values ?? [];
|
|
291
|
+
for (let i = 0; i < proxyWidgets.length; i++) {
|
|
292
|
+
const [innerNodeIdStr, widgetName] = proxyWidgets[i];
|
|
293
|
+
const value = i < widgetValues.length ? widgetValues[i] : undefined;
|
|
294
|
+
if (value === undefined || value === null)
|
|
295
|
+
continue;
|
|
296
|
+
const innerNodeIdNum = Number(innerNodeIdStr);
|
|
297
|
+
const remapped = nodeRemap.get(innerNodeIdNum);
|
|
298
|
+
if (remapped == null)
|
|
299
|
+
continue;
|
|
300
|
+
const targetNode = newNodes.find((n) => n.id === remapped);
|
|
301
|
+
if (!targetNode)
|
|
302
|
+
continue;
|
|
303
|
+
// Find the widget position in widgets_values by counting widget-type inputs
|
|
304
|
+
const widgetIdx = findWidgetIndex(targetNode, widgetName);
|
|
305
|
+
if (widgetIdx != null) {
|
|
306
|
+
if (!targetNode.widgets_values)
|
|
307
|
+
targetNode.widgets_values = [];
|
|
308
|
+
targetNode.widgets_values[widgetIdx] = value;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// ── 9. Resolve PrimitiveNode-type nodes inside the subgraph ─────────────
|
|
312
|
+
// PrimitiveNode/PrimitiveInt/PrimitiveFloat/PrimitiveBoolean/PrimitiveStringMultiline
|
|
313
|
+
// produce widget values but get skipped by the main converter. Resolve them
|
|
314
|
+
// by pushing their value onto the target node's widgets_values.
|
|
315
|
+
const PRIMITIVE_TYPES = new Set([
|
|
316
|
+
"PrimitiveNode", "PrimitiveInt", "PrimitiveFloat",
|
|
317
|
+
"PrimitiveBoolean", "PrimitiveStringMultiline", "CustomCombo",
|
|
318
|
+
]);
|
|
319
|
+
const primitiveNodeIds = new Set(newNodes.filter((n) => PRIMITIVE_TYPES.has(n.type)).map((n) => n.id));
|
|
320
|
+
if (primitiveNodeIds.size > 0) {
|
|
321
|
+
// For each new link FROM a primitive node, set the value on the target
|
|
322
|
+
for (const link of newLinks) {
|
|
323
|
+
const [, srcId, , tgtId, tgtSlot] = link;
|
|
324
|
+
if (!primitiveNodeIds.has(srcId))
|
|
325
|
+
continue;
|
|
326
|
+
const primNode = newNodes.find((n) => n.id === srcId);
|
|
327
|
+
const tgtNode = newNodes.find((n) => n.id === tgtId);
|
|
328
|
+
if (!primNode || !tgtNode)
|
|
329
|
+
continue;
|
|
330
|
+
const primValue = primNode.widgets_values && primNode.widgets_values.length > 0
|
|
331
|
+
? primNode.widgets_values[0]
|
|
332
|
+
: undefined;
|
|
333
|
+
if (primValue === undefined)
|
|
334
|
+
continue;
|
|
335
|
+
// Find the target input at tgtSlot that has a widget
|
|
336
|
+
if (tgtNode.inputs) {
|
|
337
|
+
const tgtInput = tgtNode.inputs.find((inp) => inp.link === link[0] && inp.widget);
|
|
338
|
+
if (tgtInput) {
|
|
339
|
+
const idx = findWidgetIndex(tgtNode, tgtInput.widget.name);
|
|
340
|
+
if (idx != null) {
|
|
341
|
+
if (!tgtNode.widgets_values)
|
|
342
|
+
tgtNode.widgets_values = [];
|
|
343
|
+
tgtNode.widgets_values[idx] = primValue;
|
|
344
|
+
}
|
|
345
|
+
// Clear the link so the main converter treats this as a widget value
|
|
346
|
+
tgtInput.link = null;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// ── 10. Assemble result ─────────────────────────────────────────────────
|
|
352
|
+
const resultNodes = [
|
|
353
|
+
...outerNodes.filter((n) => n.id !== compNode.id),
|
|
354
|
+
...newNodes,
|
|
355
|
+
];
|
|
356
|
+
const resultLinks = [
|
|
357
|
+
...outerLinks.filter((l) => !linksToRemove.has(l[0])),
|
|
358
|
+
...newLinks,
|
|
359
|
+
...linksToAdd,
|
|
360
|
+
];
|
|
361
|
+
return {
|
|
362
|
+
nodes: resultNodes,
|
|
363
|
+
links: resultLinks,
|
|
364
|
+
nextNodeId,
|
|
365
|
+
nextLinkId,
|
|
366
|
+
warnings,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Find the widgets_values index for a named widget on a UI node.
|
|
371
|
+
* Counts widget-type inputs (those with a `widget` property) in order.
|
|
372
|
+
*/
|
|
373
|
+
function findWidgetIndex(node, widgetName) {
|
|
374
|
+
if (!node.inputs)
|
|
375
|
+
return null;
|
|
376
|
+
// Widget inputs on a UiNode are entries in `inputs[]` that have a `widget` property.
|
|
377
|
+
// However, not all widgets appear in `inputs[]` — some are only in `widgets_values`.
|
|
378
|
+
// We count only the widget-inputs that appear in the node's inputs array,
|
|
379
|
+
// matching by the `widget.name` field.
|
|
380
|
+
let idx = 0;
|
|
381
|
+
for (const inp of node.inputs) {
|
|
382
|
+
if (inp.widget) {
|
|
383
|
+
if (inp.widget.name === widgetName)
|
|
384
|
+
return idx;
|
|
385
|
+
idx++;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// Fallback: if widget is not in inputs[] (pure widget, no link slot),
|
|
389
|
+
// it may be at a fixed position. Search widgets_values if we can match by name.
|
|
390
|
+
// For now, return null — the widget is likely at its default value.
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
67
393
|
/**
|
|
68
394
|
* Convert a ComfyUI UI-format workflow to API format.
|
|
69
395
|
* Requires objectInfo from /object_info to map widgets_values to named inputs.
|
|
70
396
|
*/
|
|
71
397
|
export function convertUiToApi(ui, objectInfo) {
|
|
398
|
+
// Expand component/subgraph nodes before conversion
|
|
399
|
+
const { expanded, warnings: expandWarnings } = expandComponents(ui);
|
|
72
400
|
const workflow = {};
|
|
73
|
-
const warnings = [];
|
|
401
|
+
const warnings = [...expandWarnings];
|
|
74
402
|
// Build link lookup: linkId → LinkInfo
|
|
75
403
|
const linkMap = new Map();
|
|
76
|
-
for (const link of
|
|
404
|
+
for (const link of expanded.links) {
|
|
77
405
|
if (!Array.isArray(link) || link.length < 6)
|
|
78
406
|
continue;
|
|
79
407
|
const [linkId, sourceNodeId, sourceSlot, targetNodeId, targetSlot, typeName] = link;
|
|
@@ -86,7 +414,7 @@ export function convertUiToApi(ui, objectInfo) {
|
|
|
86
414
|
});
|
|
87
415
|
}
|
|
88
416
|
// Build a set of node IDs for validating link targets
|
|
89
|
-
const nodeIdSet = new Set(
|
|
417
|
+
const nodeIdSet = new Set(expanded.nodes.map((n) => n.id));
|
|
90
418
|
// Node types that are purely visual/internal and have no API equivalent
|
|
91
419
|
const SKIP_TYPES = new Set(["Reroute", "Note", "PrimitiveNode", "MarkdownNote"]);
|
|
92
420
|
// Get/Set node types that need special handling (not in object_info)
|
|
@@ -94,7 +422,7 @@ export function convertUiToApi(ui, objectInfo) {
|
|
|
94
422
|
"GetNode", "SetNode", "PRO_GetNode", "PRO_SetNode",
|
|
95
423
|
"SetNode_GetNode", "SetNode_SetNode",
|
|
96
424
|
]);
|
|
97
|
-
for (const node of
|
|
425
|
+
for (const node of expanded.nodes) {
|
|
98
426
|
const nodeId = String(node.id);
|
|
99
427
|
const classType = node.type;
|
|
100
428
|
// Skip internal litegraph node types
|
|
@@ -190,7 +518,7 @@ export function convertUiToApi(ui, objectInfo) {
|
|
|
190
518
|
}
|
|
191
519
|
}
|
|
192
520
|
const nodeCount = Object.keys(workflow).length;
|
|
193
|
-
const skipped =
|
|
521
|
+
const skipped = expanded.nodes.length - nodeCount;
|
|
194
522
|
logger.info(`Converted UI workflow: ${nodeCount} nodes (${skipped} skipped)`);
|
|
195
523
|
return { workflow, warnings };
|
|
196
524
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-converter.js","sourceRoot":"","sources":["../../src/services/workflow-converter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflow-converter.js","sourceRoot":"","sources":["../../src/services/workflow-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-executor.d.ts","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAwBD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"workflow-executor.d.ts","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAwBD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB1D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAE1D"}
|
|
@@ -34,8 +34,10 @@ export async function enqueueWorkflow(workflowJson, options) {
|
|
|
34
34
|
prompt_id: result.prompt_id,
|
|
35
35
|
queue_remaining: result.queue_remaining,
|
|
36
36
|
});
|
|
37
|
-
// Start background watcher for completion detection
|
|
38
|
-
|
|
37
|
+
// Start background watcher for completion detection. Capture the workflow
|
|
38
|
+
// that was actually sent (post-seed-randomization) so the AssetRegistry can
|
|
39
|
+
// store an exact reproducible snapshot for `regenerate`.
|
|
40
|
+
JobWatcher.watch(result.prompt_id, workflow);
|
|
39
41
|
return result;
|
|
40
42
|
}
|
|
41
43
|
export async function getSystemInfo() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-executor.js","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,mBAAmB,EACpC,cAAc,IAAI,oBAAoB,GACvC,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C;;;;GAIG;AACH,SAAS,cAAc,CAAC,QAAsB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAiB,CAAC;IAClE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;gBACzC,IACE,GAAG,IAAI,IAAI,CAAC,MAAM;oBAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EACpC,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAA0B,EAC1B,OAAgC;IAEhC,MAAM,QAAQ,GAAG,OAAO,EAAE,mBAAmB;QAC3C,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAmC,CAAC,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC,CAAC;IAEH,
|
|
1
|
+
{"version":3,"file":"workflow-executor.js","sourceRoot":"","sources":["../../src/services/workflow-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,IAAI,mBAAmB,EACpC,cAAc,IAAI,oBAAoB,GACvC,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C;;;;GAIG;AACH,SAAS,cAAc,CAAC,QAAsB;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAiB,CAAC;IAClE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;gBACzC,IACE,GAAG,IAAI,IAAI,CAAC,MAAM;oBAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EACpC,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAA0B,EAC1B,OAAgC;IAEhC,MAAM,QAAQ,GAAG,OAAO,EAAE,mBAAmB;QAC3C,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAmC,CAAC,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC,CAAC;IAEH,0EAA0E;IAC1E,4EAA4E;IAC5E,yDAAyD;IACzD,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,oBAAoB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/tools/assets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwJ1D"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AssetRegistry, applyOverrides } from "../services/asset-registry.js";
|
|
3
|
+
import { enqueueWorkflow } from "../services/workflow-executor.js";
|
|
4
|
+
import { viewAssetImage } from "../services/view-image.js";
|
|
5
|
+
import { errorToToolResult } from "../utils/errors.js";
|
|
6
|
+
function summarizeRecord(record) {
|
|
7
|
+
if (!record)
|
|
8
|
+
return null;
|
|
9
|
+
return {
|
|
10
|
+
asset_id: record.assetId,
|
|
11
|
+
prompt_id: record.promptId,
|
|
12
|
+
node_id: record.nodeId,
|
|
13
|
+
filename: record.filename,
|
|
14
|
+
subfolder: record.subfolder,
|
|
15
|
+
type: record.type,
|
|
16
|
+
url: record.url,
|
|
17
|
+
created_at: new Date(record.createdAt).toISOString(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function registerAssetTools(server) {
|
|
21
|
+
server.tool("view_image", "Fetch a registered asset's bytes and return them as an inline image so the agent can see the result. Use this after enqueue_workflow completes (asset_id is included in the completion notification) to inspect, critique, or compare generated images. Only supports image mime types (PNG/JPEG/WebP); audio/video assets must be saved to disk via get_image.", {
|
|
22
|
+
asset_id: z.string().describe("Asset id returned by list_assets or job completion"),
|
|
23
|
+
}, async ({ asset_id }) => {
|
|
24
|
+
try {
|
|
25
|
+
const result = await viewAssetImage(asset_id);
|
|
26
|
+
return {
|
|
27
|
+
content: result.content.map((block) => block.type === "image"
|
|
28
|
+
? { type: "image", data: block.data, mimeType: block.mimeType }
|
|
29
|
+
: { type: "text", text: block.text }),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
return errorToToolResult(err);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.tool("list_assets", "List recently generated assets from the in-memory registry, newest-first. Assets are registered automatically when a workflow completes successfully. The registry is ephemeral and clears on server restart; records expire after COMFYUI_ASSET_TTL_HOURS (default 24h).", {
|
|
37
|
+
limit: z
|
|
38
|
+
.number()
|
|
39
|
+
.int()
|
|
40
|
+
.positive()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Max records to return (default: all)"),
|
|
43
|
+
since: z
|
|
44
|
+
.string()
|
|
45
|
+
.datetime()
|
|
46
|
+
.optional()
|
|
47
|
+
.describe("ISO timestamp — only return assets created at or after this time"),
|
|
48
|
+
}, async (args) => {
|
|
49
|
+
try {
|
|
50
|
+
const since = args.since ? Date.parse(args.since) : undefined;
|
|
51
|
+
const records = AssetRegistry.list({ limit: args.limit, since });
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: "text",
|
|
56
|
+
text: JSON.stringify({ count: records.length, assets: records.map(summarizeRecord) }, null, 2),
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
return errorToToolResult(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
server.tool("get_asset_metadata", "Get full provenance for a registered asset including the workflow snapshot that produced it. Use this to inspect the parameters that generated an image before calling regenerate with overrides.", {
|
|
66
|
+
asset_id: z.string().describe("Asset id returned by list_assets or job completion"),
|
|
67
|
+
}, async ({ asset_id }) => {
|
|
68
|
+
try {
|
|
69
|
+
const record = AssetRegistry.get(asset_id);
|
|
70
|
+
if (!record) {
|
|
71
|
+
return errorToToolResult(new Error(`No asset found for id "${asset_id}". It may have expired or never been registered.`));
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: "text",
|
|
77
|
+
text: JSON.stringify({
|
|
78
|
+
...summarizeRecord(record),
|
|
79
|
+
workflow: record.workflow,
|
|
80
|
+
}, null, 2),
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return errorToToolResult(err);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
server.tool("regenerate", "Re-enqueue the workflow that produced an existing asset, optionally applying parameter overrides. Overrides are applied to any node input matching the key name (e.g. cfg, steps, sampler_name, scheduler, seed, denoise, text). Seeds are re-randomized by default so each regenerate yields a fresh image unless seed is explicitly passed in overrides.", {
|
|
90
|
+
asset_id: z.string().describe("Asset id of the source generation"),
|
|
91
|
+
overrides: z
|
|
92
|
+
.record(z.string(), z.any())
|
|
93
|
+
.optional()
|
|
94
|
+
.describe("Map of input-name → new value applied to every node that already has that input. " +
|
|
95
|
+
"Common keys: cfg, steps, sampler_name, scheduler, seed, denoise, text."),
|
|
96
|
+
disable_random_seed: z
|
|
97
|
+
.boolean()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("If true, do not randomize seed fields. Combine with `overrides.seed` to reproduce the exact original image."),
|
|
100
|
+
}, async ({ asset_id, overrides, disable_random_seed }) => {
|
|
101
|
+
try {
|
|
102
|
+
const record = AssetRegistry.get(asset_id);
|
|
103
|
+
if (!record) {
|
|
104
|
+
return errorToToolResult(new Error(`No asset found for id "${asset_id}". It may have expired or never been registered.`));
|
|
105
|
+
}
|
|
106
|
+
const next = applyOverrides(record.workflow, overrides);
|
|
107
|
+
const result = await enqueueWorkflow(next, { disable_random_seed });
|
|
108
|
+
return {
|
|
109
|
+
content: [
|
|
110
|
+
{
|
|
111
|
+
type: "text",
|
|
112
|
+
text: JSON.stringify({
|
|
113
|
+
status: "enqueued",
|
|
114
|
+
prompt_id: result.prompt_id,
|
|
115
|
+
queue_remaining: result.queue_remaining,
|
|
116
|
+
source_asset_id: asset_id,
|
|
117
|
+
overrides_applied: overrides ?? {},
|
|
118
|
+
}, null, 2),
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
return errorToToolResult(err);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/tools/assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/tools/defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqE7D"}
|