comfyui-mcp 0.52.50 → 0.52.51
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/dist/orchestrator/panel-arg-aliases.js +296 -0
- package/dist/orchestrator/panel-arg-aliases.js.map +1 -0
- package/dist/orchestrator/panel-tools.js +235 -36
- package/dist/orchestrator/panel-tools.js.map +1 -1
- package/dist/services/panel-graph-cmd-tools.js +14 -0
- package/dist/services/panel-graph-cmd-tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #1968 — the argument name an agent reaches for FIRST is accepted, and the
|
|
3
|
+
* canonical one stays canonical.
|
|
4
|
+
*
|
|
5
|
+
* The premise, from the report: if a capable model calls a tool with the obvious
|
|
6
|
+
* argument and gets a validation error, that is a naming/schema defect, not a
|
|
7
|
+
* caller error. The first guess is drawn from the tool's own name plus the
|
|
8
|
+
* conventions of its siblings, so a rejected first guess costs a full round trip
|
|
9
|
+
* AND teaches the caller to be tentative with a surface it should use fluently.
|
|
10
|
+
*
|
|
11
|
+
* This module is the ONE place an alias is resolved, so the three group tools and
|
|
12
|
+
* the todo/media tools cannot drift into disagreeing about which spelling wins.
|
|
13
|
+
*
|
|
14
|
+
* ALIAS, NEVER REPLACE. Every canonical key keeps working untouched and stays the
|
|
15
|
+
* name the tool DESCRIPTION teaches — one vocabulary to learn. The alias exists
|
|
16
|
+
* so a first call lands, not so there are two names to choose between. That is
|
|
17
|
+
* the same trade #1018 made for the todo STATUS synonyms (accept `in_progress`,
|
|
18
|
+
* document only `active`) and #845 made for string node ids.
|
|
19
|
+
*
|
|
20
|
+
* AN AMBIGUOUS PAIR IS REFUSED, NOT RESOLVED. When a caller supplies both the
|
|
21
|
+
* canonical key and its alias with DIFFERENT values there is no way to know which
|
|
22
|
+
* they meant, and picking one would apply an edit they did not ask for. Equal
|
|
23
|
+
* values are accepted (a caller belt-and-bracing both spellings is unambiguous);
|
|
24
|
+
* unequal ones get a refusal naming both, which is a read rather than a wrong
|
|
25
|
+
* mutation to undo.
|
|
26
|
+
*/
|
|
27
|
+
import { describeReceived } from "./node-id.js";
|
|
28
|
+
/** A group id as the graph readers print it. Integers only: the panel resolves a
|
|
29
|
+
* group with a strict `===` against `group.id` (resolveGroup), so a string that
|
|
30
|
+
* reached the wire would miss a group that exists and report "No group with id
|
|
31
|
+
* …" about one the caller is looking at. Coerced here instead. */
|
|
32
|
+
export const GROUP_ID_PATTERN = /^-?\d+$/;
|
|
33
|
+
export const GROUP_ID_MESSAGE = "a group id must be an integer (e.g. 2) — panel_query_graph's groups[] and panel_create_group both return it";
|
|
34
|
+
/**
|
|
35
|
+
* Normalize an accepted group id to the NUMBER the wire has always carried.
|
|
36
|
+
*
|
|
37
|
+
* Mirrors normalizeNodeId's contract minus the subgraph-qualified shape: a group
|
|
38
|
+
* id has no nested form, so unlike a node id there is nothing here that must pass
|
|
39
|
+
* through as a string.
|
|
40
|
+
*/
|
|
41
|
+
export function normalizeGroupId(v) {
|
|
42
|
+
return typeof v === "number" ? v : Number.parseInt(v, 10);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve a canonical key and its alias to one value.
|
|
46
|
+
*
|
|
47
|
+
* Equality is by JSON rather than `===` so an array/object argument (`items` vs
|
|
48
|
+
* `todos`) compares by CONTENT — two structurally identical checklists are not
|
|
49
|
+
* ambiguous just because they are different references. JSON.stringify can throw
|
|
50
|
+
* on a circular or BigInt value, so a comparison that cannot be made is treated
|
|
51
|
+
* as "not equal" (refuse) rather than as agreement: refusing an unreadable pair
|
|
52
|
+
* costs a round trip, silently picking one applies the wrong list.
|
|
53
|
+
*/
|
|
54
|
+
export function pickAlias(subject, canonical, alias) {
|
|
55
|
+
const hasCanonical = canonical.value !== undefined;
|
|
56
|
+
const hasAlias = alias.value !== undefined;
|
|
57
|
+
if (hasCanonical && hasAlias) {
|
|
58
|
+
if (!sameValue(canonical.value, alias.value)) {
|
|
59
|
+
return {
|
|
60
|
+
ok: false,
|
|
61
|
+
error: `${subject} got both \`${canonical.name}\` and \`${alias.name}\`, with different values ` +
|
|
62
|
+
`(${canonical.name}=${describeReceived(canonical.value)}, ${alias.name}=${describeReceived(alias.value)}). ` +
|
|
63
|
+
`They are the SAME argument — \`${alias.name}\` is an accepted alias for \`${canonical.name}\` — so this ` +
|
|
64
|
+
`call names one target twice and does not say which. Nothing was sent. Re-send with ONE of them.`,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, value: canonical.value };
|
|
68
|
+
}
|
|
69
|
+
if (hasCanonical)
|
|
70
|
+
return { ok: true, value: canonical.value };
|
|
71
|
+
if (hasAlias)
|
|
72
|
+
return { ok: true, value: alias.value };
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
error: `${subject} requires \`${canonical.name}\` (or its alias \`${alias.name}\`) — neither was supplied.`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Structural equality for the alias check. Never throws: an unstringifiable pair
|
|
79
|
+
* is reported as unequal so the caller gets the refusal, not a coin flip. */
|
|
80
|
+
function sameValue(a, b) {
|
|
81
|
+
if (a === b)
|
|
82
|
+
return true;
|
|
83
|
+
try {
|
|
84
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* #1968 — `panel_show_media` items: accept the ComfyUI output ref at the ITEM
|
|
92
|
+
* level and wrap it into `source`.
|
|
93
|
+
*
|
|
94
|
+
* The tool's OWN prose says "pass the output ref `{filename, subfolder, type}`",
|
|
95
|
+
* and that is exactly what the reporter passed — one level too shallow, because
|
|
96
|
+
* the schema wants it nested under `source`. A doc that describes the payload and
|
|
97
|
+
* a schema that wants it wrapped is a defect in the pair, not in the caller.
|
|
98
|
+
*
|
|
99
|
+
* Only ever ADDS the wrapper. An item that already carries `source` is returned
|
|
100
|
+
* untouched, so the canonical shape cannot be reinterpreted by this function.
|
|
101
|
+
*
|
|
102
|
+
* An item carrying NEITHER shape is refused here rather than passed on. The
|
|
103
|
+
* handler's first act on an item is `"path" in src`, which throws a TypeError on
|
|
104
|
+
* an absent source — turning a caller's misnamed key into an unhandled crash
|
|
105
|
+
* instead of a sentence they can act on.
|
|
106
|
+
*/
|
|
107
|
+
export function normalizeShowMediaItem(item, index) {
|
|
108
|
+
const { source, filename, subfolder, type, path, stage, label, caption, ...rest } = item;
|
|
109
|
+
const at = `panel_show_media items[${index}]`;
|
|
110
|
+
const out = { ...rest };
|
|
111
|
+
if (source !== undefined) {
|
|
112
|
+
// The canonical shape wins outright, but a flat ref sitting BESIDE it means
|
|
113
|
+
// the item names two different media and says which only by nesting depth.
|
|
114
|
+
if (filename !== undefined || path !== undefined) {
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
error: `${at} carries \`source\` AND a top-level ${filename !== undefined ? "`filename`" : "`path`"}. ` +
|
|
118
|
+
`The flat form is an accepted alias for \`source\`, so this item names its media twice. ` +
|
|
119
|
+
`Nothing was displayed. Send the ref in ONE place.`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// The ref's MODIFIERS — subfolder/type/stage — can arrive flat while the ref
|
|
123
|
+
// itself is nested. Before this alias existed zod stripped them from the item
|
|
124
|
+
// silently; now the schema ADVERTISES them, so dropping one would be a
|
|
125
|
+
// parameter that is accepted and does nothing. `stage` is the one that
|
|
126
|
+
// matters: it is the opt-in for a real disk write, so a caller who sets it
|
|
127
|
+
// and is ignored gets a refusal for an oversized file they thought they had
|
|
128
|
+
// handled. Fold each into `source` where it is absent, and refuse rather
|
|
129
|
+
// than overwrite where the two disagree.
|
|
130
|
+
const merged = { ...source };
|
|
131
|
+
for (const [key, value] of [
|
|
132
|
+
["subfolder", subfolder],
|
|
133
|
+
["type", type],
|
|
134
|
+
["stage", stage],
|
|
135
|
+
]) {
|
|
136
|
+
if (value === undefined)
|
|
137
|
+
continue;
|
|
138
|
+
if (merged[key] !== undefined && !sameValue(merged[key], value)) {
|
|
139
|
+
return {
|
|
140
|
+
ok: false,
|
|
141
|
+
error: `${at} sets \`${key}\` both inside \`source\` (${describeReceived(merged[key])}) and at item ` +
|
|
142
|
+
`level (${describeReceived(value)}). The flat key is an alias for the nested one, so this ` +
|
|
143
|
+
`says two things about one ref. Nothing was displayed. Set it in ONE place.`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
merged[key] = value;
|
|
147
|
+
}
|
|
148
|
+
out.source = merged;
|
|
149
|
+
}
|
|
150
|
+
else if (path !== undefined && filename !== undefined) {
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
error: `${at} carries both flat \`filename\` and \`path\`. ` +
|
|
154
|
+
`Those are two different members of the media-source union, so the item does not say which media to display. ` +
|
|
155
|
+
`Nothing was displayed. Send exactly one of them.`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
else if (path !== undefined) {
|
|
159
|
+
// The disk-path member of the same union, flattened the same way.
|
|
160
|
+
out.source = stage === undefined ? { path } : { path, stage };
|
|
161
|
+
}
|
|
162
|
+
else if (filename !== undefined) {
|
|
163
|
+
out.source = {
|
|
164
|
+
filename,
|
|
165
|
+
...(subfolder === undefined ? {} : { subfolder }),
|
|
166
|
+
...(type === undefined ? {} : { type }),
|
|
167
|
+
...(stage === undefined ? {} : { stage }),
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
error: `${at} has no media to show: it needs \`source\` — or, equivalently, a top-level \`filename\` ` +
|
|
174
|
+
`(a ComfyUI output ref: {filename, subfolder?, type?}) or \`path\` (an absolute disk path).`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// `caption` is and remains canonical (it has been the key since v0.19.0 — the
|
|
178
|
+
// report's claim that the tool "requires label" is the one row of its table
|
|
179
|
+
// that does not reproduce). `label` is accepted because a caller who guessed it
|
|
180
|
+
// once will guess it again, and a dropped caption is a silent loss: zod strips
|
|
181
|
+
// an unknown key from a NESTED object rather than refusing it, so the media
|
|
182
|
+
// would have rendered captionless with no error to read.
|
|
183
|
+
const text = pickAliasOptional(at, { name: "caption", value: caption }, { name: "label", value: label });
|
|
184
|
+
if (!text.ok)
|
|
185
|
+
return text;
|
|
186
|
+
if (text.value !== undefined)
|
|
187
|
+
out.caption = text.value;
|
|
188
|
+
return { ok: true, value: out };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* #1968 — `panel_set_todo` items: accept `content` for `text`.
|
|
192
|
+
*
|
|
193
|
+
* "todo" is in the tool's name and `content` is the key the analogous built-in
|
|
194
|
+
* TODO surface uses, so it is the first guess. It failed as a SECOND error after
|
|
195
|
+
* `todos`-for-`items` was fixed, because zod strips an unrecognized key from a
|
|
196
|
+
* nested object and then reports the canonical one missing — the caller pays two
|
|
197
|
+
* round trips for one misnamed pair.
|
|
198
|
+
*
|
|
199
|
+
* `text` is therefore OPTIONAL in the schema and required HERE, so that a missing
|
|
200
|
+
* step description is still refused — the alias widens which spelling lands, and
|
|
201
|
+
* must not quietly make the field itself skippable.
|
|
202
|
+
*/
|
|
203
|
+
export function normalizeTodoItemKeys(items) {
|
|
204
|
+
const out = [];
|
|
205
|
+
for (const [index, item] of items.entries()) {
|
|
206
|
+
if (!item || typeof item !== "object") {
|
|
207
|
+
return { ok: false, error: `panel_set_todo items[${index}] is not an object.` };
|
|
208
|
+
}
|
|
209
|
+
const { content, ...rest } = item;
|
|
210
|
+
const picked = pickAlias(`panel_set_todo items[${index}]`, { name: "text", value: rest.text }, { name: "content", value: content });
|
|
211
|
+
if (!picked.ok)
|
|
212
|
+
return picked;
|
|
213
|
+
out.push({ ...rest, text: picked.value });
|
|
214
|
+
}
|
|
215
|
+
return { ok: true, value: out };
|
|
216
|
+
}
|
|
217
|
+
/** pickAlias for a pair that is genuinely OPTIONAL: absent on both sides is a
|
|
218
|
+
* valid answer (undefined), while a conflicting pair is still refused. */
|
|
219
|
+
function pickAliasOptional(subject, canonical, alias) {
|
|
220
|
+
if (canonical.value === undefined && alias.value === undefined)
|
|
221
|
+
return { ok: true, value: undefined };
|
|
222
|
+
return pickAlias(subject, canonical, alias);
|
|
223
|
+
}
|
|
224
|
+
/** The projections `panel_find_nodes` offers, matching `panel_query_graph`'s
|
|
225
|
+
* `fields` exactly — same three names, same meanings, so one is learned once. */
|
|
226
|
+
export const FIND_NODES_FIELDS = ["ids", "compact", "detail"];
|
|
227
|
+
/**
|
|
228
|
+
* The default is `compact`, NOT `detail`, and that is a deliberate behaviour
|
|
229
|
+
* change (#1968).
|
|
230
|
+
*
|
|
231
|
+
* `find_nodes` had no verbosity control at all while its sibling `query_graph`
|
|
232
|
+
* defaulted to compact, so a search — the cheap orienting call — was the most
|
|
233
|
+
* expensive read on the surface. The reporter measured four matches on a
|
|
234
|
+
* TEN-node graph returning a very large payload; on a realistic 50-node graph
|
|
235
|
+
* with a common term that is a meaningful fraction of an agent's context spent
|
|
236
|
+
* on a lookup. Full detail is still one argument away and the reply says which
|
|
237
|
+
* projection it applied, so nothing is lost silently.
|
|
238
|
+
*/
|
|
239
|
+
export const FIND_NODES_DEFAULT_FIELDS = "compact";
|
|
240
|
+
/**
|
|
241
|
+
* The keys a `compact` match row keeps.
|
|
242
|
+
*
|
|
243
|
+
* Everything that says WHICH node this is and WHY it matched; nothing that
|
|
244
|
+
* re-describes the node's interior. The dropped keys are the bulk — `widgets`,
|
|
245
|
+
* `inputs` (each with its `connected_from`), `outputs`, and the node
|
|
246
|
+
* `description` — and every one of them is reachable per-node with
|
|
247
|
+
* panel_query_graph({ids:[id], fields:'detail'}) or by re-running with
|
|
248
|
+
* fields:'detail'.
|
|
249
|
+
*
|
|
250
|
+
* `matched_on` is KEPT on purpose even though it is a list: it is the answer to
|
|
251
|
+
* the question the caller asked (why is this node in my results?), and dropping
|
|
252
|
+
* it would make a compact result a worse search reply rather than a cheaper one.
|
|
253
|
+
*/
|
|
254
|
+
const COMPACT_MATCH_KEYS = [
|
|
255
|
+
"id",
|
|
256
|
+
"type",
|
|
257
|
+
"title",
|
|
258
|
+
"mode",
|
|
259
|
+
"is_output",
|
|
260
|
+
"is_subgraph",
|
|
261
|
+
"matched_on",
|
|
262
|
+
];
|
|
263
|
+
/**
|
|
264
|
+
* Project one match row. Unknown keys are DROPPED for compact, not carried:
|
|
265
|
+
* carrying them would make the bound depend on the panel build, and a projection
|
|
266
|
+
* that shrinks by an unpredictable amount is not a bound at all.
|
|
267
|
+
*/
|
|
268
|
+
function compactMatch(match) {
|
|
269
|
+
const out = {};
|
|
270
|
+
for (const key of COMPACT_MATCH_KEYS) {
|
|
271
|
+
if (match[key] !== undefined)
|
|
272
|
+
out[key] = match[key];
|
|
273
|
+
}
|
|
274
|
+
return out;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Apply a `fields` projection to a `graph_find_nodes` payload, IN PLACE on a copy.
|
|
278
|
+
*
|
|
279
|
+
* Returns null when there was nothing to project — no `matches` array, or
|
|
280
|
+
* `fields:'detail'`, which is today's behaviour byte for byte. A null return is
|
|
281
|
+
* how the caller knows NOT to stamp `fields` onto the reply: announcing a
|
|
282
|
+
* projection that did not run is the "schema says accept, not do" defect, and it
|
|
283
|
+
* would be indistinguishable from a real one to the agent reading it.
|
|
284
|
+
*/
|
|
285
|
+
export function projectFindNodesPayload(payload, fields) {
|
|
286
|
+
if (fields === "detail")
|
|
287
|
+
return null;
|
|
288
|
+
const matches = payload.matches;
|
|
289
|
+
if (!Array.isArray(matches))
|
|
290
|
+
return null;
|
|
291
|
+
const projected = fields === "ids"
|
|
292
|
+
? matches.map((m) => (m && typeof m === "object" ? m.id : m))
|
|
293
|
+
: matches.map((m) => m && typeof m === "object" ? compactMatch(m) : m);
|
|
294
|
+
return { ...payload, matches: projected, fields };
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=panel-arg-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel-arg-aliases.js","sourceRoot":"","sources":["../../src/orchestrator/panel-arg-aliases.ts"],"names":[],"mappings":"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"}
|