Commit Graph
55 Commits
Author SHA1 Message Date
Dariusz L 3cd302d4ee feat: implement local-only model info fetching and refactor model info dialog
- Add local_only endpoint mode: returns basic file info (filename, size, path,
  location, sha256) without querying CivitAI or computing file hashes
- Validate provided sha256/hash inputs (must be 64-char hex) and fall back to
  empty string when invalid
- Refactor monolithic info response builder into build_info_response() helper
  used across all result paths (local, CivitAI success, CivitAI fallback,
  not-found), reducing duplication
- Add get_model_info_for_file(local_only=True) early return in CivitAI source
  that builds a minimal local-only result without hash lookup
- Split frontend fetchModelInfoForDialog into:
  - fetchLocalModelInfoForDialog: opens dialog with local data immediately,
    marks civitai_checked=false
  - fetchCivitaiModelInfoForDialog: async CivitAI lookup triggered by user
- Add 'Fetch with CivitAI' button in info dialog when local file exists but
  CivitAI has not been checked yet
- Infer model_type from category in both backend and frontend to reduce
  reliance on upstream data shape
- Fix sidecar metadata condition (was skipping save when path already existed)
- Add cursor/disabled styles for info dialog CivitAI link button
2026-06-26 22:16:44 +02:00
Dariusz L 4e576cbd56 feat: add SHA256 hash calculation with cancellation, progress tracking, and remote size probing 2026-06-26 21:51:55 +02:00
Dariusz L af31075cb1 style: tighten padding in model details panel and sidebar
Reduce excessive padding in .mr-model-details-side, .mr-model-details-panel, and .mr-model-details-side to make the layout more compact and consistent with the updated modal spacing.
2026-06-26 03:22:34 +02:00
Dariusz L e386808dd4 feat: add CivitAI link, file matching, and mirror selection to model details
Add a direct "View on CivitAI" action button when a model has CivitAI IDs,
auto-detect the matched file via hash/URL/filename, surface the preferred
mirror, and render file entries as collapsible details with summary badges.
Normalize CSS formatting (rgba spacing, rule separators) for consistency.
2026-06-26 01:44:15 +02:00
Dariusz L 26cca55fee feat: add right-click context menu to local model folder browser
- 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.
2026-06-24 22:44:51 +02:00
Dariusz L f4f07ccb0a completion: add local model browser with category-aware filtering and download target synchronization 2026-06-24 22:30:31 +02:00
Dariusz L 8867058312 feat: improve download folder selection UX with category tooltips and dynamic widget category hints
- core/workflow_analyzer.py: add dynamic widget category hint extraction via threaded cache and sentinel-prefix matching; get_model_widget_category_hints now returns all inferred categories including dynamic ones, improving model folder detection for workflows with encoded category metadata.
- web: add ? help icon with context-aware tooltip to download folder selector explaining why a category was auto-selected (preserved manual choice, node type hint, workflow-detected category, default fallback, or best available). Tooltip refreshes live as the user changes the folder selection.
- web/css/resolver-main.css: style the new category help badge.
- metadata/huggingface-author-index.json: update index entry.
2026-06-24 21:01:21 +02:00
Dariusz L a01be11e27 feat(info-dialog): improve model info dialog layout and UX
- Add Escape key handler to close the info dialog, with proper cleanup
- Extract reusable renderInfoFieldLabel() helper to reduce code duplication
- Add dedicated SVG icons (file, fileText, hash, box, hardDrive, bookType) for field labels
- Adjust dialog sizing to calc(100vh - 16px) with 92vw max width
- Refactor CSS into .mr-info-field-label / .mr-info-label-icon / .mr-info-label-text
- Improve trained-words row layout with flex styling
2026-06-23 21:15:22 +02:00
Dariusz L b292411b93 feat: enhance model info image preview with CivitAI badge, metadata fields, and linked resources
- Add CivitAI badge overlay on example images with icon and direct link
- Extract denoise, scheduler, and cfgScale from metadata in civitai.py
- Support additionalResources alongside resources in both parser paths
- Redesign resource display with clickable links, version badges, and type/weight pills
- Drop prompt tags section and getInfoImagePromptTags; focus preview on generation data and resources
- Include full metadata rows and resources in copy-to-clipboard output
- Add matching CSS for badge, resource layout, and interactive states
2026-06-23 20:48:08 +02:00
Dariusz L 16a32de8de feat: improve model info dialog with clickable location, wider layout, and refined styling 2026-06-23 20:28:48 +02:00
Dariusz L 093b6d33a7 feat: enrich model info dialog with location, size, tags, and trained words from metadata 2026-06-23 19:47:49 +02:00
Dariusz L ee7d59546c feat(folder-browser): show create path message and update model index
- Update HuggingFace author index metadata (file count, repo entries)
- Style empty folder browser state with grid layout and monospace path display
- When a non-existent subfolder is typed, inform user the path will be created during download
2026-06-23 19:01:35 +02:00
Dariusz L 1cfc0beeb6 refactor: replace inline dropdown display toggling with reusable floating positioning helpers
Switch download target dropdowns from absolute-positioned elements clipped by
scroll containers to body-ported fixed-position lists managed by
downloadTargetMethods. Adds showDropdownList, hideDropdownList,
portalDropdownList, positionFloatingDropdownList, and related helpers so the
UI can keep dropdowns visible and correctly placed near their anchors.
2026-06-23 06:22:57 +02:00
Dariusz L f94abe1489 feat(folder-browser): improve expand/collapse interaction and row styling
Make expandable folder rows clearly distinguishable and allow clicking the
left-side toggle zone to expand/collapse folders instead of selecting them.

- Add is-expandable class and data-state-key to expandable rows
- Extract toggleFolderBrowserState helper for reuse
- Extract isFolderBrowserToggleZoneClick to detect toggle-zone clicks
- Adjust toggle button width/positioning via CSS for expandable rows
- Apply box-sizing: border-box to folder browser toggle
2026-06-23 04:48:05 +02:00
Dariusz L baa8849fa4 fix: improve floating subfolder list positioning and scroll behavior
- Remove fixed max-height constraints from folder browser scroll container
- Calculate available height dynamically based on viewport space
- Account for container chrome (borders, padding) and child elements when setting scroll max-height
- Use clampNumber for popup positioning to keep it within viewport bounds
- Ignore scroll events originating from within the list to prevent jittery repositioning
- Add box-sizing: border-box to folder browser for consistent sizing
2026-06-23 04:42:00 +02:00
Dariusz L c08eabc465 Simplify download folder browser by removing manual path rows and preserving scroll position
- Remove 'Use model root' and 'Use typed folder' manual rows from the folder browser
- Remove category badge and folder browser header elements
- Add nested scroll element detection for scroll delta handling
- Preserve scroll position when re-rendering the folder browser on toggle
2026-06-23 04:28:41 +02:00
Dariusz L f2cd4cde30 feat: replace flat subfolder list with floating folder browser for download targets
Refactor populateSubfolderOptions into renderDownloadFolderBrowser to show a
persistent floating panel with an expandable folder tree grouped by base
directory. Includes live preview of the selected target path, manual
typed-folder rows, and window/viewport-aware positioning. Prevents duplicate
portal mounts and cleans up resize/scroll bindings on hide.
2026-06-23 04:16:38 +02:00
Dariusz L 74a696a4bc Add manual refresh button for local model matches in missing browser
When a model is missing, users can now click a refresh button in the
'Local Matches' header to rescan local folders and refresh matches
for that specific model. The button requests POST /model_resolver/local-matches
with force_rescan=true, shows loading state, and updates the UI on
completion or error. CSS was added for the new button element.
2026-06-22 02:00:40 +02:00
Dariusz L 590b4a4969 feat(missing-browser): add toggle to show resolved models
Report resolved (already-existing) models alongside missing ones in the
missing-browser view. Resolved models are hidden by default; a new
'Show resolved' toggle in the toolbar reveals them with a badge and
reduced-opacity row styling. The toggle state is persisted in
localStorage.

Backend: include resolved_models and total_resolved in the analysis
payload so the frontend can merge them into the display list.

Frontend: normalize resolved workflow models into the missing-models
display shape, compute visibility-aware counts, and refresh the
missing-browser view on queue mutating actions.
2026-06-22 01:34:55 +02:00
Dariusz L d88b3b6c6c feat: guard missing-browser split drag and register CSS track property 2026-06-21 21:12:28 +02:00
Dariusz L 9cfa50e406 perf(missing-browser): optimize resize and rendering performance
- Disable CSS transitions during splitter drag to prevent jank
- Apply content-visibility: auto to off-screen missing list and match rows
- Suppress redundant style.setProperty calls when split width is unchanged
- Reset applied split width state on cleanup
2026-06-21 20:04:52 +02:00
Dariusz L baabbb6027 Center-align text and increase badge font size in resolver UI
- Increase badge font size from 10px to 13px and add line-height: 1
- Center-align search results table column 3
- Change justify-self/self-align from start/right to center for consistent centered layout
- Remove right padding on element that now uses text-align: center
2026-06-21 19:54:49 +02:00
Dariusz L 0a98c9e44f feat: add suggest download subfolder button with lightbulb animation; normalize search button labels based on UI state
- Add grid layout and CSS for a new 'Suggest' column in the download target
  panel, including a lightbulb SVG icon button with a flash animation
- Update download_target_methods.js to render the suggest button in the
  dedicated grid area and apply a ‘mr-is-suggesting’ animation on click
- Adjust search button label logic so it shows 'Search Again' when there is
  a renderable search state in the panel, otherwise show 'Search Online'
2026-06-21 03:51:24 +02:00
Dariusz L 24fed2302f feat: support multi-line search button labels 2026-06-21 03:16:20 +02:00
Dariusz L bb927b3cc4 fix: align search source picker UI to layout spec
- change .mr-search-source-bar to align-items: end
- simplify .mr-search-source-picker to single-column grid with align-items: start
- fix gap, remove unused margin-left auto, set width 100%
- add flex display to .mr-search-source-picker-label with consistent vertical alignment
2026-06-21 02:56:02 +02:00
Dariusz L 4b6161b267 Add source tracking and tooltips for auto-selected base models in search panel 2026-06-21 02:12:11 +02:00
Dariusz L 1a4156f00d feat: add any-model fallback search for civitai, civarchive, and lora_manager_archive
When a model search returns no results for a specific base_model, retry the
same query with base_model_context=None so the provider can match any model.
Fallback matches are marked with any_model_match and base_model_fallback on
the result payload. The UI reports 'Found (Any Model)' when a result came
from this fallback path, and the cancel/progress button styling is tightened
to 16x16px with border-radius.
2026-06-20 00:53:51 +02:00
Dariusz L 2e9ffb05a8 feat: add per-source search cancellation support
Implement AbortController-based cancellation for individual search sources
during background resolution. Users can now cancel a single pending/running
source search via a new cancel button in the progress UI, while other sources
continue uninterrupted. Add cancelled status tracking, source-level AbortController
management, CSS styling for the cancelled state, and cleanup on job teardown.
Also refactor getBackgroundSearchJob for consistent job lookup across callers.
2026-06-19 21:36:01 +02:00
Dariusz L c3caeb0a24 feat: add ETA and improved progress metadata to download queue 2026-06-19 21:20:40 +02:00
Dariusz L 4f91accbab feat: improve model scan cache override, combo UX, and filename handling
- Add force_rescan end-to-end so callers can bypass the short-lived local model scan cache: backend entry in __init__.py and core/resolver.py, lifecycle_graph_methods forwards it through the workflow analysis body, and download_target_methods passes ?force=1 from the refresh flow.
- Rewrite combo dropdown lifecycle in missing_browser_methods with show/hide helpers, pointer-capture tracking, and a capture-phase outside-click listener so the list stays open during drag/hover and closes reliably otherwise.
- Animate refresh buttons (CSS keyframes + JS Web Animations) with reduced-motion fallback.
- Encode selected model path into the selected-bar data-model attribute and wire contextmenu so users can open the containing folder from the selection.
- Fix XSS risk in selected-bar label by escaping label HTML; change queue/selected Remove buttons to danger style.
- Increase max missing-browser model column width clamp from 430 to 820 and stop truncating missing-filename display; show full filename with tooltip instead.
- Update huggingface-author-index.json metadata timestamp/counts (1 file changed, 1 line).
2026-06-19 03:57:40 +02:00
Dariusz L 47d286620f feat: add configurable download path system with templates and mappings
Implements a new download path configuration UI and backend logic:
- Add Subfolder fill mode: Suggested (existing), Template, Manual
- Add Base Model Path Mappings to override detected base-model folders
- Add Default Root settings to control root directory per category
- Add Detect From Existing Folders button that infers templates and mappings from local model folders
- Add backend /model_resolver/root-directories and /model_resolver/path-template-suggestions routes
- Refactor resolver settings into core/settings.py for shared frontend/backend use
- Extract path template inference logic into core/path_templates.py
- Update download panel, context menu, and loading flow to use new path settings
2026-06-19 00:09:58 +02:00
Dariusz L 4943be89a9 Add responsive footer star link and update badge/metadata 2026-06-17 02:35:10 +02:00
Dariusz L a4d5bd4c5c feat(logging): add frontend/backend log controls, unify console logging
- Add frontend_logs_enabled/frontend_log_level and backend_logs_enabled/backend_log_level
  toggles and selectors in the Options panel (web/resolver/views/options_methods.js)
- Sync frontend logging settings from localStorage / server settings into the
  frontend logger on startup and settings load (download_target_methods.js)
- Apply backend logging settings from server settings in the Python backend
  (__init__.py), loading control state on startup and after saves
- Make frontend Logger resilient to stored configs that lack an 'enabled' flag
  and to legacy/invalid moduleSettings levels (logger.js)
- Guard default module logger level initialization against undefined settings
  (log_funcs.js)
- Replace scattered console.log/usages with module-level log.debug calls across
  resolve_download_methods.js, model_resolver.js, and workflow_state_methods.js
- Bump log system package version to 1.5.6 (core + web)
2026-06-17 01:51:29 +02:00
Dariusz L fa2002fc2a Add per-item Apply button to queued resolution selected bar
Refactor queue_methods.js to split applyPendingResolutions into
applyQueuedByKey (per-item) and applyPendingResolutionList (shared
implementation). Add an Apply button alongside the Remove button in
the selected resolution bar, wired to applyQueuedByKey with loading
state. Update CSS for .mr-selected-actions layout and .mr-btn-primary
styling in the detail pane.
2026-06-17 01:17:25 +02:00
Dariusz L d533cda5e8 fix: preserve model_url fallback and add search download button icons with tooltips 2026-06-16 19:19:45 +02:00
Dariusz L bbfd50a075 feat: expose download folder context through status indicators and notifications
Propagate the resolved download directory and file path from the backend
download flow into frontend progress UI: add \path\ and \directory\ fields
to download progress state, render right-clickable context menu entries on
progress bars and status messages, and allow opening the download folder
directly from completion or error notifications. Also update the HuggingFace
author index.
2026-06-12 16:32:48 +02:00
Dariusz L 98c4b10e90 chore: update HuggingFace author index and tighten model details CSS 2026-06-08 17:43:27 +02:00
Dariusz L c7f108fcf7 feat: add gated mirror status to model details view 2026-06-08 17:34:51 +02:00
Dariusz L 2709dddb22 feat: improve Civitai integration and download button resilience 2026-06-08 03:26:32 +02:00
Dariusz L 6e2f1b3101 feat: enhance CivArchive resilience and mirror display
backend:
- add 429 retry handling with backoff in CivArchive API requests
- add page-scraping fallback for CivArchive model payloads
- normalize CivArchive mirrors with dead/gated/paid/sha256 metadata
- include file metadata and mirror data in normalized archive files
- propagate additional dead/missing status field aliases
- include metadata in normalized CivitAI files

frontend:
- render mirror lists with source grouping, dead-link indicators, and skull icons
- add file badges (primary, type, format, size, fp, mirror count, id)
- improve secondary info in resolve/download methods to include base model
- enhance search panel secondary info with base model and filename
- on selecting a version with empty files, fetch fresh version details
- propagate base model context to CivitAI search state and display labels
2026-06-08 03:03:53 +02:00
Dariusz L 9bebb52395 feat: replace model details image gallery with draggable horizontal strip 2026-06-08 01:06:04 +02:00
Dariusz L 65b4594d19 feat: add model details modal and source-aware context menus 2026-06-08 00:53:39 +02:00
Dariusz L 87fabdd9d9 feat: add image preview modal and extended CivitAI image metadata
Adds a fullscreen image preview dialog to the model info panel with
navigation, copy-prompt support, generation metadata display, and
referenced resources listing.

Extends CivitAI backend extraction to handle varied metadata key names
(negativePrompt, Clip skip, Model, etc.) and surfaces clip_skip, width,
height, tags, resources, and raw metadata through the new preview UI.

Renames z-index variable to reserve a dedicated layer for the preview
backdrop.
2026-06-07 18:57:03 +02:00
Dariusz L 46be3fbb50 fix: separate z-index layers for info dialogs and tooltips 2026-06-07 18:44:10 +02:00
Dariusz L b9c9867472 feat: replace context menu text icons with SVG icons for consistent UI styling 2026-06-07 15:20:42 +02:00
Dariusz L ab59cd231f feat: add base model filtering across search sources, API routes, and frontend UI 2026-06-06 19:43:43 +02:00
Dariusz L 57ac022fc4 feat: add refresh button to re-analyze workflow and refresh local matches 2026-06-06 18:26:47 +02:00
Dariusz L 7bd1b9ad33 feat: persist download target subfolder selections and add suggest button 2026-06-06 18:18:58 +02:00
Dariusz L 57b8bc7cda feat: add force search (ignore cache) toggle to batch search menu
Adds a checkbox in the resolver footer search menu that bypasses all
search result caches for the duration of a batch search run.

Frontend (queue_methods.js, resolve_download_methods.js,
resolver_dialog.js, search_panel.js, resolver-main.css):
- Introduce checkbox-type footer menu items (type: 'checkbox').
- Add 'Force search (ignore cache)' checkbox to the search menu,
  wired to a new forceBatchSearch flag on ResolverManagerDialog.
- Pass forceSearch through searchMissingBatch and searchOnline to
  the backend API call.
- When the manual search button is clicked and results already exist
  for that model, forceSearch defaults to true.
- mergeSearchResults respects forceRefresh: if a forced search
  returns no results for a source, that source is cleared from the
  cached results.

Backend (__init__.py, core/sources/huggingface.py):
- force_search is read from the incoming API request and, when true,
  clears all active source search caches (local, huggingface,
  civitai, civarchive, lora_manager_archive) before searching.
- force_search is forwarded as force_refresh to
  search_huggingface_for_file, which folds it into the cache key so
  the cache is not hit, and propagates it to _get_author_index.
- Search result timestamps are no longer inherited from prior
  cached signatures when force_search is active; a fresh timestamp
  is written unconditionally.

Updated metadata/huggingface-author-index.json reflects the latest
cached author index after rebuild.
2026-06-06 17:02:25 +02:00
Dariusz L 57018b4e0f feat: add search result timestamps, enhanced cache clearing, and maintenance UI
Add searched_at timestamps to search results so cached entries are accurately tracked and preserved across merges. Expand the clear-search-cache command to also invalidate popular databases, model list, and the new result timestamp store. Frontend gains new cache-clearing methods and a full resolver cache reset for maintenance. The search panel and missing browser now show source result dates and toggle the search button between 'Search' and 'Search Again' when results already exist.
2026-06-06 16:38:30 +02:00