Patch release for the two dynamic input fixes that landed after 2.2.0:
clearing a key/value pair corrupting the node, and workflows recreated from
a produced image/video losing their extra pairs. The changelog section
doubles as the release notes for the Comfy registry, which the publish
workflow extracts from CHANGELOG.md.
ComfyUI embeds a differently serialized copy of the workflow into the
images/videos a prompt produces: graphToPrompt() runs
compressWidgetInputSlots() on it, which removes every widget input slot
that has no link and no label - a leftover from legacy widget conversion.
For the dynamic nodes of this pack, key_1/value_1/key_2/... only exist
because the JS created those slots, so they were stripped while their
values stayed in widgets_values. On reload only the connected slots
survived, the node was rebuilt as key_0/value_0/value_2 plus one fresh
empty pair, and the positional widget restoration shifted every value
into the wrong widget - the DICT came back with only its first key.
Label dynamically created widget inputs with their own name, so they are
kept in the compressed workflow. This is a visual no-op, as the widget
shows its name anyway. Workflows saved before the label existed carry
none, so onConfigure stamps it on every restored dynamic widget input.
Renumbering now keeps input and widget labels in sync with the new name.
Verified in ComfyUI 0.43 (frontend 1.57.4): loading the PNG produced by
the minimal workflow of the report restores all key/value pairs, that
recreated workflow runs, and clearing a pair still renumbers correctly.
Removing an empty dynamic input pair spliced node.widgets directly, which
left the old entries in ComfyUI's widget value store. renumberDynamicInputs
then renamed the inputs, but renaming the widgets silently failed because
the target id was still taken by the orphaned entry. Input names and widget
names drifted apart: the prompt was built from the stale widget names
(key_1..value_2), so DictCreate.create() never found key_0 and returned {},
and the connected input link was drawn next to the wrong widget row.
Remove widgets through node.removeWidget() so the store entry is deleted
too, falling back to an array splice on older litegraph builds.
Verified in ComfyUI 0.43 (frontend 1.57.4): clearing a pair now keeps
inputs and widgets in sync, the link stays on its own row and the node
returns the remaining pairs.
- Data List and LIST: new "filter empty" node that removes every empty entry
(`None`, empty STRING, empty LIST/DICT/SET, ...); `0` and `False` are kept.
An optional boolean switch also treats a STRING consisting only of whitespace
as empty.
- Critical change that ensures reliablity and **should** have no bad side
effects, but when you see any, please report:
DICT, LIST, SET and Data List nodes (plus the DICT/LIST-taking STRING nodes)
now degrade gracefully when their data source is not connected (`None`) instead
of raising: read/query nodes return their natural "no data" result (the `get`
default, an empty list, `False`, `0`, `None`), and transform nodes behave as if
given an empty container.
- Add a "continue if not empty" flow-control node: it passes a value through
unchanged when it is non-empty, and blocks execution (via an execution blocker)
when the value is empty. It is list-aware (`INPUT_IS_LIST` / `OUTPUT_IS_LIST`),
so it is immune to ComfyUI's empty-input batching crash and passes data lists
through unchanged. By default the block is silent; an optional `message` can be
set to show a dialog. Use it before nodes that cannot handle an empty input
(e.g. a node receiving an empty Data List) to stop execution instead of failing.
- "save IMAGE to file" and "save IMAGE+MASK to file": `format` is now a dropdown
(still connectable as a STRING) whose entries are derived from the formats the
installed Pillow/image plugins can actually write (RGB node offers them all,
IMAGE+MASK only alpha-capable ones); every batch frame is written instead of
only the first; and `path` can be switched to ComfyUI-style `filename_prefix`
mode via a toggle, resolved through ComfyUI's own folder/file helpers
(auto-numbered under the output dir); both modes accept ComfyUI templates such
as `%date:yyyy-MM-dd%`