When a Saver's load_saved / prompt_lists were promoted to subgraph inputs,
changing them on the subgraph node never ran the Saver's callbacks: the
prompt didn't load, the list didn't refilter, and the outer dropdowns kept
a stale snapshot of the options.
- Add js/subgraph_widgets.js (pure module): find the widget that supplies
a value through nested subgraphs, and hook the subgraph node's outer
widget callbacks to forward changes to opted-in nodes inside. Re-hooks
on widget-promoted and when the frontend silently rebuilds an outer
widget (input._widget slot watcher).
- Saver mirrors the outer widgets: outer changes run the normal callbacks;
inner values and option lists are pushed back out, including to a
Primitive feeding the subgraph node. Unchanged values are ignored so a
Primitive's per-queue re-apply doesn't reset the selection.
- Save / Delete / load use the outer list name when promoted.
- Add plain Node tests (tests/), a mock workflow loader and the bug-report
workflow as a fixture.
- Rename AGENT.md to AGENTS.md; document promoted widgets, testing and
README style.
- Bump version to 1.8.1.
- True runs remember captured text per (tab path, node) with a token.
Off runs whose widget hadn't received it use the remembered text and
update the embedded metadata. IS_CHANGED includes the carried token, so
prompts queued ahead pick it up
- Scope pushed prompt updates to the tab the run was queued from, fixing
captured text overwriting a same-id node in another open workflow
- Nodes fetch missed text when a workflow loads or its tab is re-opened
- In-memory only; tokens are compared by equality, so restarts are safe
- Saver and Passthrough get hidden stash_tab/stash_token inputs (appended
last, no socket or widget, not saved in widgets_values)
Add PromptStashEveryNthQueue, a BOOLEAN node that outputs True once every
N queued runs. The countdown is stored only in the frontend
(node.properties) and resolved in a widget beforeQueued hook into a hidden
`value` widget, so the backend sees just a constant. Off runs share one
cache key, so nothing downstream re-runs. The node has a status line
("True next run" / "True in N runs") and Next / Delay +1 / Reset buttons.
Partial runs don't advance the countdown, and muted or bypassed nodes are
skipped.
Saver and Passthrough now follow a linked use_input_text to constant
boolean sources (Every Nth Queue, core PrimitiveBoolean) via
resolveConstantBool. When the value is false they strip the unused lazy
`text` link, keeping upstream nodes out of the cache key.
The queue-time strip of the unused lazy "text" link read the canvas widget for
use_input_text. When use_input_text was linked to an external node, that widget
held a stale value, so the link could be stripped while the backend still
requested "text", raising NodeInputError.
- Decide from the API prompt itself: strip only when use_input_text is the
literal false; keep the link when it is a link (value unknown until runtime).
- Match prompt entries by class_type instead of mapping canvas nodes to ids.
- check_lazy_status now raises a clear error when use_input_text is on but
nothing is connected to "text", instead of the cryptic NodeInputError.
- Applies to both Prompt Stash Saver and Passthrough.
- Manager: add "Sort A-Z" button that sorts the selected list's prompts
case-insensitively and persists the new order (closes#20)
- Saver: add second "meta" STRING output with JSON describing the prompt
(prompt_name, list_name, source, etc.) for downstream nodes (closes#19)
- Saver: include save_as_key/load_saved/prompt_lists in IS_CHANGED so a
cached meta output stays accurate
- All nodes: only apply default widget labels when the user hasn't set a
custom one, so renames survive reload (#13)
- Bump version to 1.7.0
ComfyUI frontend 1.46 (PR #13085) brands LGraphNode.id as a string, so
node.id is "5" where it used to be 5. nodeMatchesUniqueId() strict-compared
the backend UNIQUE_ID as a Number against node.id and therefore returned
false for every node, silently dropping all events routed through it:
- prompt-stash-update-prompt: prompt_text never updated in the node when
Use Input ran (execution was unaffected, only the widget was)
- prompt-stash-set-continue: the Continue button never appeared, leaving
Pause to Edit stuck until "Clear All Paused"
Compare ids as strings and stop Number-mapping the subgraph path; object
key lookup coerces to string, so getNodeById() still resolves on both old
and new frontends.
Also replace the four `this.id === -1` guards, dead for the same reason,
with a shared isUnassignedNode() helper.
Backward compatible with frontends before 1.46.
Extend the graphToPrompt cache-invalidation workaround (previously
only on PromptStashPassthrough) to PromptStashSaver. When
use_input_text is false, the lazy "text" input is ignored by
check_lazy_status but still folds into ComfyUI's output cache key,
causing spurious invalidation of the node and everything downstream
whenever the upstream value changes (Comfy-Org/ComfyUI#11744).
We remove the dead "text" link from the API prompt at queue time,
matching how core drops orphaned links in graphToPrompt. The link is
left intact when use_input_text is true, preserving correct caching.
Declare the combos as COMBO inputs so they get connectable sockets, expose
their live options to Primitives via a runtime GET_CONFIG override, and
sync/re-render connected Primitives (including a Nodes 2.0 reactivity nudge)
on list change, server update, and refresh.