When the resolver dialog is already visible on the Missing Models tab,
showResolvedNodeModelInResolver now reuses the existing browser instead
of forcing a reload or requeuing the selection. This avoids unnecessary
UI refreshes and keeps the current view stable.
Changes:
- web/resolver/model_resolver.js: skip reopen/queue when the dialog is
already visible on the missing tab; prefer existing browser selection
- web/resolver/views/missing_browser_methods.js: support
preferExistingBrowser in selectWorkflowModelReference and center the
selected row instead of scrolling to nearest
- tests/test_downloads_tab_workflow_route.mjs: cover reuse behavior and
row-patching/centering
Remove the brittle is-detail-collapsed responsive behavior from the missing
browser. Replace the timeout-based width handler with requestAnimationFrame
split restoration, clamp the list min width to 340px, and drop the
collapsed-state guards so the detail pane, compositor preview, and Type
column remain usable regardless of container width.
- Add drag threshold and layout frame stride to splitter drag utility
- Use onPreview callback to animate splitter offset via translate3d during drag
- Simplify resize class and cleanup logic in missing browser methods
- Replace deferred release UI cleanup with direct activation/cleanup calls
- Update CSS to add resizing overlay and remove transition during resize
- Add test covering compositor preview behavior and CSS constraints
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
Backend:
- Move SHA256 normalization logic from path_utils._normalize_header_sha256
into core/type_utils.normalize_sha256, adding support for 0x-prefixed
hashes and unifying the normalization path used by
extract_safetensors_header_sha256.
- Add tests for the 0x prefix normalization cases.
Frontend:
- Introduce copyTextWithFeedback in web/resolver/utils/html_utils.js
as a shared clipboard helper with configurable feedback text, CSS class,
and duration, replacing repeated inline clipboard copy logic in
globals.js, model_info_methods.js, and the notification utility.
- Centralize showNotification on ResolverManagerDialog and remove the
duplicate implementation from missingBrowserMethods.
- Replace local const localStorage = safeStorage aliases in
model_info_methods.js, missing_browser_methods.js, and
options_methods.js with direct safeStorage usage.
Replace inline regex path/URL normalization in resolver.py and
missing_browser_methods.js with the existing shared helpers:
- core/resolver.py: normalize_workflow_download_url now uses
prepare_remote_size_probe_url from type_utils instead of a local
huggingface-specific regex substitution.
- web/resolver/views/missing_browser_methods.js: path identity
generation now uses normalizePathIdentity from html_utils.js rather
than ad hoc replace/trim/lowercase logic.
This keeps normalization behavior consistent across the codebase and
removes duplicated regex patterns.
Keep path-specific Local Matches for active downloads during refreshes,
URN search, and missing-model display so late hash-only lookups do not
overwrite them.
Remove cancelled download matches from missing-model UI and cached
analysis when a download is cancelled.
Previously, identify_missing_models grouped missing entries only by filename,
which could merge unrelated models from different categories that happen to
share a filename. This change deduplicates by (category, filename) and tracks
all_node_refs with a reference_count so the frontend can preserve one
resolution per node reference instead of collapsing duplicates.
Frontend changes in resolve_download_methods.js iterate over all_node_refs,
and missing_browser_methods.js now shows '+ N refs' in the missing-model
label and clarifies the locate tooltip when multiple workflow references
share the same missing model.
Replace duplicated filename-to-query logic with a single
\uild_filename_search_queries\ helper in matcher/civarchive/huggingface,
standardize Civitai URL generation in the frontend via \getCivitaiModelUrl\,
unify browser user-agent and response file-size extraction in the downloader
path, and derive workflow node-type category hints from widget categories
rather than maintaining a large static mapping.
Extract MODEL_EXTENSIONS and format_size_bytes into core/type_utils, removing duplicates from workflow_analyzer and downloader. Add getFilenameFromPath to render_format_methods and replace inline path-splitting logic across JS resolver actions, search, and views.
Replace duplicated inline drag handlers in queue_methods.js and
missing_browser_methods.js with a new startSplitterDrag() helper in
web/resolver/utils/splitter_drag.js.
The utility centralizes pointer/mouse event binding, RAF throttling,
and touch-cancellation cleanup, cutting net code across the two
callers while preserving existing behaviour (bounds, edge-open
threshold, collapse preview, and settle/cleanup timing).
Avoid full list re-render on row selection by passing selectionOnly flag
to displayMissingModels, which now selectively updates row classes and
detail pane instead of rebuilding the entire DOM. Also removed an eager
ensureLocalModelsThenPopulate('') call on combo list presence, and added
a click listener alongside focus so the combo list reliably populates on
both interaction types.
- Added CSS content-visibility and contain-intrinsic-size to list row
containers in resolver-main.css and resolver-shell.css for off-main-thread
rendering optimization.
- Deferred queue list panel split drag updates to requestAnimationFrame in
web/resolver/actions/queue_methods.js, reducing redundant DOM writes and
guarding against duplicate frames during split dragging.
- Deferred missing browser split drag updates to requestAnimationFrame in
web/resolver/views/missing_browser_methods.js with optional chaining on
split start values, preventing layout thrashing while dragging.
- Add PointerEvent support for queue toggle, edge drag, and splitter interactions
- Implement deferred queue panel reveal animation (mr-queue-opening class)
- Make queue panel updates demand-driven; skip refresh when panel is hidden
- Replace per-item remove listeners with event delegation on queue list
- Track queue split container width via ResizeObserver with safe fallbacks
- Centralize split flex application and persist queue width/collapsed state with debounce
- Fix missing browser split pane styles to use helper-track CSS variables
- Add deferred UI cleanup for missing browser split drag end
- Add prewarm frame fallback when ResizeObserver is unavailable
- Extend dynamic widget category hints to capture choice source (static/hybrid/folder_paths)
- Infer workflow schema model candidates from output category hints when widget values match known presets
- Surface auto_download_capable and auto_download_candidate flags in missing model data
- Merge these flags on duplicate missing model entries
- Add cloud-download badge UI with tooltip explaining auto-download context
- Update huggingface author index metadata timestamp
- Switch missing model row layout from grid to flex
- Add circleCheckBig SVG icon to icon_utils
- Replace green 'Resolved' text pill with inline checkmark icon
- Update CSS with resolved icon and model details wrapper styles
Move the .mr-missing-list-head element inside the scrollable .mr-missing-list
container and apply position: sticky so the column headers remain visible when
the list overflows. Adjust grid layout and row alignment rules to support the
new structure.
- Expand preferred categories to include clip_vision, ipadapter, sams, ultralytics
- Add clip_gguf alias for text_encoders in both backend and frontend
- Add explicit diffusion_models/text_encoders mappings in CATEGORY_MAP
- Refactor get_model_roots to skip custom_nodes/configs, use template key
aliases, accept new folder keys from known categories, and normalize
ultralytics paths (yolo/bbox, yolo/segm, yolo -> parent)
- Pass missing object through resolve_download_methods and search_panel
so category selection can use widget hints
- Refactor frontend download target resolution:
- getMissingSupportedDownloadCategories respects widget/type hints
- getNodeTypeDownloadCategory splits exact-node map and adds
normalizeNodeCategoryToken / getNodeTypeDownloadCategoryFromTokens
for GGUF and future node families
- getSourceResultDownloadCategory and _sourceSupportLevel accept
missing for unified logic
- Prioritize dynamic widget category hints in workflow analyzer and
include category_hints/folder_key_hints on all model refs
- Add folder count badges and path normalization in missing browser
(normalizeMissingFolderRootPath handles category suffixes / bbox/segm)
Add a /model_resolver/search-cancel/{progress_id} endpoint with a
SearchCancelled exception so in-flight source searches abort cleanly on
batch cancel. Track sourceProgressIds alongside sourceControllers so the
frontend can cancel backend progress polls. Rework CivArchive extraction
with robust __NEXT_DATA__ parsing, hash-page file resolution, model-link
scraping, confidence-based candidate filtering, and expanded type maps.
Add conftest.py for pytest path setup, update .gitignore for scratch/,
and refresh huggingface-author-index.json.
Extract repeated path normalization and identity logic from __init__.py,
core/resolver.py, core/downloader.py, and core/scanner.py into a shared
core/path_utils module. Also add a loading state to the local model picker
so it waits for models to load before rendering options.
- Moved formatting helpers (formatBytes, formatDuration, getDownloadEtaText,
formatDownloadProgressMeta) and getLocalMatchDisplayInfo from
resolve_download_methods.js and missing_browser_methods.js into
render_format_methods.js for shared reuse.
- Relocated settings-related methods (getStoredTokens,
applyFrontendLoggingPreference, loadSettingsFromServer) and their
log_system imports from download_target_methods.js into
options_methods.js, where they are actually consumed by the options UI.
- Simplified missing_browser_methods.js to use
getLocalMatchDisplayInfo instead of inline local-match code.
Remove duplicated refreshMissingListRowForMissing and
refreshMissingListRowLocalMatch implementations, replacing them
with a single refreshMissingListRow method in missingBrowserMethods.
Also strip unnecessary BOM from imports.
Replace scattered inline encodeURIComponent(JSON.stringify(...)) and
manual oncontextmenu/dataset assignments with unified helpers added to
renderFormatMethods:
- encodeContextMenuModel(context): safe JSON serialization for data-model
- getContextMenuAttrs(context, tooltip): HTML attribute string for
template literals (used in 5 files)
- getContextMenuProps(context, tooltip): props object for imperative
element assignment (used in missingBrowserMethods)
- setContextMenuElement(element, context, tooltip): sets or clears
data-model, data-tooltip, and oncontextmenu on a DOM element
Reduces duplication across 5 modules, adds try/catch around JSON
serialization, and removes 14 lines of repeated oncontextmenu wiring.
- Add right-click 'Open Folder' context menu to folder browser rows and
root group headers, with left-click guards to prevent context actions on
non-primary clicks
- Deduplicate local model entries before filtering using path-based identity
and category ranking to prefer the active download category
- Introduce --mr-z-context-menu-popup z-index variable and shift existing
z-indices up by one so context menu popups layer correctly above
other UI elements.
- Update resolver-main.css and resolver-shell.css context-menu rules to
use the new popup z-index with a fallback.
- Add joinLocalModelPath, buildLocalFolderContext, buildLocalModelContext,
and getLocalPathContextAttrs helpers to missing_browser_methods.js.
- Wire folder and model entries in the local browser to include encoded
JSON context attributes so right-click opens the model/folder context
menu with the correct open-folder and model actions.