- Add paste handler (Ctrl+V) in Metadata tab for workflow JSON, images, and Civitai image URLs/HTML
- Resolve authentic .safetensors filenames and local ComfyUI model paths via Civitai modelVersionId
- Normalize prompt <lora:...> tags to authentic filenames and enrich transfer/loaded chip labels
- Enable multi-selection on model chips with click, Ctrl+click (toggle/add), Shift+click (range from anchor), and Ctrl+Shift+click.
- Add keyboard shortcuts: Ctrl+C to copy selected model tokens to clipboard with feedback, Ctrl+A to select all visible chips, and Escape to clear selection.
- Add a subtle green outline and background highlight for selected chips (.is-selected).
- Add a 'Selected' mode button to the copy toolbar that dynamically appears when chips are selected and syncs token count and preview text.
- Stop click event propagation on chips and clean up prior selection instances during tab switching and re-rendering to prevent ghost listeners and bubbling conflicts between tabs.
- Add comprehensive Node test suite covering selection operations, keyboard shortcuts, DOM rendering, and tab transitions.
Add frontend storage and restore flow for active backend downloads so
workflow context, missing model bindings, and queue UI state survive
browser refreshes.
- Add queue storage methods for loading/saving/removing active download
recovery entries with serializable metadata.
- Add restoreActiveDownloadsFromBackend and rebindActiveDownloadMissingModels
to resolve_download_methods.
- Hook restore and rebind into lifecycle graph methods.
- Add tests for recovery persistence and refresh restoration behavior.
- Replace full missing-models list rendering with virtual scroll container
- Improve splitter responsiveness by lowering layout frame stride to 1
- Add custom modal resize handle with pointer-event driven sizing
- Reduce live layout throttle from 40ms to 16ms
- Update related route assertions for new layout behavior
- Wrap node.widgets.splice in rgthree Power Lora Loader adapter so removals
made through the context menu trigger model resolution updates.
- Delay node context menu analysis when a workflow refresh is already
pending to avoid stale analysis.
- Extend workflow refresh retry logic to also retry when ComfyUI is still
serializing the previous workflow after a node widget change.
- Add tests for context menu removal detection, refresh retry behavior,
and deferred context analysis.
Apply the is-resizing class at resize start and remove it on end,
and raise the related resize overlay z-index so sibling content stays
visible underneath the resize indicator.
Allow dragging the docked Model Resolver dialog from its drag handle to
undock it into a floating window, with a live undock drop preview.
- Remember the dock container width and reuse it for the undock preview
- Restore the pre-dock floating size instead of falling back to defaults
- Restrict topbar drag while docked to the dedicated drag handle
- Update tests to cover the new docked drag lifecycle and preview markup
Replace graph reconfigure with targeted widget updates so applying resolved models does not re-trigger node context analysis or duplicate dialog refreshes. Add workflow refresh suppression state, defer ComfyUI model catalog refresh until after widget linking, and track missing-workflow signatures separately from general workflow changes.
- Skip fuzzy matching for already-resolved model references in the backend
- Keep existing nodes in their previous result positions during incremental workflow analysis
- Simplify frontend workflow sync and add a content-preserving refresh path
- Preserve scroll position and suppress progress overlay during background Missing/Loaded Models refresh
- Add backend and frontend tests for the new incremental refresh behavior
Queue workflow model reference selection requests in the dialog, wait for
workflow analysis to complete before attempting selection, and handle
superseded or timed-out requests gracefully.
- Track pending selection requests on the dialog with status fields
- Apply queued selections from lifecycle graph methods after analysis
- Await loadWorkflowData/loadLoadedModels so the caller can proceed
after tab content is actually ready
- Add timeout handling with user-visible warnings when selection cannot
complete
- Cover queueing, superseding, waiting, and completion in JS tests
- Propagate missing_search_key through resolution queue and download
resolution paths so cache lookups remain consistent after workflow
re-analysis or active searches.
- Set preserveSearchCacheAcrossNextWorkflowSync before reloading
workflow data following batch queue/resolve operations.
- Remember applied resolu tions (rememberAppliedResolvedSelections)
after both queue and direct downloads so alias tracking is not lost.
- getMissingSearchKey now short-circuits on missing_search_key and
search_key fields instead of always deriving from node identity,
fixing spurious cache misses.
- Guard settleInactiveSearchProgress so non-active workflow states
only update the cache when the active workflow hosts a matching
background search job.
- After workflow analysis, call applyResolvedSelectionAliases
so analysis data reflects user selections.
- When switching workflows, clone and merge the previous workflow
search-result cache and migrate background search jobs that are
still running, so active searches are not interrupted or dropped.
Replace scattered api.fetchApi(...) + response.ok + response.json() boilerplate
across all web/modules with a unified this.fetchJson() helper defined on the
base dialog class.
Changes:
- dialog.fetchJson(url, options, context) handles headers, status checks, and
JSON parsing in one place
- Extracts server-side error messages (errData.error) for better UX
- Optional silent flag suppresses notifications for background/refresh requests
- All callers simplified: async return, shorter bodies, consistent error handling
- BOM removed from workflow_update_methods.js and tabs_loaded_methods.js