Add openResolverForDetectedMissingModels() in model_resolver.js to
keep the current resolver display state when missing models are
detected: if the resolver dialog is already visible, schedule an
active workflow refresh instead of re-activating the button; if it
is hidden, activate the resolver button as before.
Update the auto-open-on-missing path to use the new method, and
adjust/add tests to cover the preserved display mode behavior.
Handle removal of the legacy Xet connection-info helper while preserving the native download fallback. Adds regression coverage for mixed Hugging Face dependency versions.
Consolidate provider-specific category mapping into resolve_model_category(),
shared JSON request handling into execute_provider_json_request(), sidecar
path resolution into get_or_build_model_sidecar_info(), and progress
reporting into ProgressTracker. Update civitai/civarchive/common sources to
use the unified helpers. Add tests for the new utilities. Remove redundant
frontend wrapper methods from render_format_methods.js.
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.
- Add run_in_background_thread() in __init__.py to unify success/cancel/error
handling for hash calculation and local metadata build progress
- Extract match_model_by_title_generic() in core/matcher.py and use it from
both CivitAI and CivArchive providers to remove duplicated version/file
selection logic
- Enable safetensors header SHA256 extraction by default and report hash source
through progress updates
- Update options_methods.js to match backend progress behavior
- Add tests/test_title_matching_hashing.py covering title matching and hashing
- Minor metadata updates
- Replace remaining direct requests.get calls with request_public_url,
request_source_response, and request_source_json in downloader,
civarchive, civitai, and popular sources
- Use normalize_model_file_info in CivitAI source instead of inline logic
- Update huggingface-author-index.json metadata
- Add tests for civarchive page/search requests and popular base model updates
- Adjust downloader redirect test for new request_public_url behavior
- Add core/network_utils.py with URL validation, public-IP enforcement,
redirect validation, and safe request_public_url/validate_public_http_url helpers
- Replace direct requests calls in downloader/type_utils/sources with
request_public_url so redirects are validated before follow-up
- Replace netloc string checks with host_matches_domain for CivitAI,
CivArchive, and HuggingFace host matching
- Add HuggingFace Xet download backend with progress reporting and
cancellation support via hf_xet/huggingface_hub
- Harden aria2 installer: reject symlinks/special files in archives,
restrict custom aria2c paths to the managed install, and update UI copy
- Normalize paths with realpath and enforce configured model roots in
local hash/metadata routes, plus remove caller-selected metadata_path
injection in sidecar writing
- Sanitize download/network errors to strip signed query strings before
logging or showing them to the user
- Introduce workflow-scoped download state keys so active downloads and progress are isolated per workflow tab/route.
- Add a transient 'cancelling' status path and a finalizeCancelledDownloadFrontend helper to avoid flicker and prevent stale progress responses from recreating completed/cancelled UI state.
- Guard active-download lookups by current workflow scope to reduce cross-workflow interference.
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.
core/path_templates.py: allow model alias tokens to match when suffixed
with a version string or plural form, reducing false negatives in
single-folder path resolution.
metadata/huggingface-author-index.json: update Comfy-Org index timestamp
and repository ordering.