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.
@@ -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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"}