The page held four unrelated things, so each now lives where it is used:
the rail's Prompts entry (and the Ctrl+Shift+L shortcut) opens Prompt
Studio beside the canvas, where saved prompts are managed; the browser
comes back when the studio closes. Saved node values stay in Current
node, which can now delete them; moved whole workflows are no longer
offered there twice. Recent results, combos and whole workflows already
have their own homes.
Deleted ui_materials.js, ui_material_cards.js, ui_material_detail.js,
ui_material_application.js (its receipt is ui_apply_receipt.js) and
material_feedback.js, the recipe page's copy-to-library buttons and the
save_parameter_material route, with about 2,000 lines of CSS and 200 locale
keys. Words that said "material library" now say where things go.
Material files are untouched.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ComfyUI takes undo steps on mouse-up and key-up; a drag-and-drop ends in
neither, and writes made in click handlers or after a fetch landed in no
step, so Ctrl+Z could undo the step before instead. canvas_history.js asks
for a step after each write (applied values, drops, created or inserted
nodes, recipes, prompt notes).
A drop's receipt also pops up at the top right with Undo (shared with the
receipt's own button); prompt nodes made by a drop on empty canvas can be
undone there. canvas_undo.js keeps what each canvas activity entry did, in
full, while the page is open; the log offers Undo while nothing changed it
since. Entries that removed nodes or rewired existing ones, seeds, and
choices this computer no longer has are never offered.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Node Assistant becomes "Current node" (当前节点): one page instead of the
"actions" / "parameter sets" tabs, model actions on top, Parameters below.
- node_parameter_sets.js: the node type's saved values from the material
library and from recipes' parameter sets as one list; the same values
saved in both are one entry naming both sources. For the selected node,
exactly what an entry would change; seeds (and their after-run control),
model files and choices this computer lacks are kept.
- ui_node_parameters.js: the list, "apply these N" (one undo in the
receipt) and "save these values".
- api/node_material.py: POST /anomalous/save_node_material keeps one
node's values as a node_parameter_selection material, deduplicated by
type and values; the library lists it under parameters.
- Removed: ui_node_presets.js with its hover popovers, the beta notice and
their styles and strings. The panel and help texts use the new name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One module, prompt_boxes.js, now decides which boxes of a live node take a
prompt and whether each is positive or negative. A prompt box is a
multiline STRING input by the node's ComfyUI definition, not a widget
whose name looks right; its role is its own name (positive / negative) or
the wiring down to a sampler's positive / negative input, not the title.
- Material drops, Prompt Studio, the translator and recipe capture use it;
their name regexes and fallbacks ("any string widget") are gone.
- Prompt Studio's role detection read graph.links[id], which is a Map in
current ComfyUI, so it never followed a link; it uses the module now.
- Material writes call onWidgetChanged(name, ...) as ComfyUI expects.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keeps the planned All-in-One loader and cross-node prompt features but removes
the regressions they introduced:
- model references: one adapter table for verified layouts (easy a1111Loader,
easy fullLoader, Efficient Loader) shared by recipe_identity.js and
recipe_schema.py; native loaders keep their stored labels; no more guessing
categories from file names (a "...vae.safetensors" checkpoint was a VAE);
"None"/"Baked VAE" are never references
- recipe summary sync follows the extraction rules: only checkpoint/UNet
loaders or ckpt_name/unet_name set the base model (not an upscaler's
model_name), only sampler-like nodes set seed/steps/cfg, and LoRA edits
update the entry of the edited loader instead of falling back to loras[0]
- one LoRA entry per loader again (deduplication shifted entries)
- prompt injection never writes negative text into a positive slot or the
reverse; the block chooser follows the same rule
- material cards only accept cross-node drops that carry prompts; parameter
blocks stay same-type
- drop unused imports and the unused modelSpecs alias
Verified: regression cases added to tests/recipe_all_in_one_compatibility.mjs
and tests/material_prompt_cross_node.mjs (both fail on the previous commit),
new tests/test_recipe_model_references.py; all JS tests except the orphaned
material_parameter_cross_node.mjs and 95 Python tests pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W411Z69FC3em9CzpeqEub5