- panelHotkeysController: move V key handler before isPanelHotkeyContext guard
so it fires after subfolder navigation when hover/focus state has reset;
only blocked when focus is on an input/textarea outside the panel
- browserNavigationController: add clearSelection param, call it before
reloadGrid() in navigateFolder, resetToBrowserRoot, onOpenFolderAsset,
onCustomSubfolderChanged so stale selection is cleared immediately
- panelRuntime: pass clearSelection via gridContainer._mjrSetSelection([])
- floatingViewerManager: filter folder-kind assets from selectedIds in
_onSelectionChanged to avoid trying to load a folder as media
- Add AI.VectorCaptionOnIndex UI setting with rollback on API error
- Backend: persist/read vector_caption_on_index via AppSettings
- Expose set_vector_caption_on_index via health route and clientOps API
- Wire is_vector_caption_on_index_enabled() into config + env vars
- Update vector_indexer to honour the caption-on-index flag
- Add tests: settings backend, health routes, vector indexer video alignment
- Extend grid_scope_switch_cache test coverage
- ImageOps preview bridge: stream cropped contain-fit rect of __imageops_state.canvas (removes square scope/letterbox); fall back to full canvas when user pan/zoom is active. Signature-cached encode (WeakMap) avoids re-encoding on every poll tick.
- Floating viewer: skip metadata enrichment for imageops-live-preview source; preserve user pan/zoom across stream frames of the same node; remove inline CSS overrides that blocked the MFV transform.
- Workflow Nodes panel: graph-selected node is auto-expanded, promoted to first position in its container, scrolled into view, and gets a subtle blue highlight (is-selected-from-graph).
- Early-fetch immediate (no setTimeout 800ms), persisted scope/sort key, includeTotal=false.
- Snapshot persisted in localStorage (was sessionStorage), with legacy migration.
- MIN_LOADING_SKELETON_MS=0; skeleton hides as soon as assets are present.
- New scheduleSnapshotHeadRefresh: re-fetch page 0 after fast-path cached:true and upsert new items at correct sort position. Fixes recent assets disappearing on scope switch (custom->output).
- offset=max(offset, assets.length) in didHydrate branch so prefetch loads next page, not page 0 again.
- refreshDuplicateAlerts non-blocking (fire-and-forget).
- Race guards: scheduleDeferredExecutionReload skips reload if scope/filter changed during prompt execution; scheduleSnapshotHeadRefresh aborts if context changes mid-fetch.
- Includes other staged misc edits (config, scanner, watcher, components).
- sidebarRunButton: add _walkAllNodes() to mirror ComfyUI's native
beforeQueued/afterQueued widget cycle on all nodes incl. inner subgraph
nodes so control_after_generate (randomize/increment/decrement) is
applied correctly on each MFV run
- widgetAdapters: _syncWidgetDomElement falls back to
cachedDeepestByFrame.widget.inputEl for PromotedWidgetView so typing
in the sidebar updates the canvas textarea of subgraph outer widgets
in real time
- widgetAdapters: spinner step forced to 1 for integer widgets;
widget.value restored after callback to bypass step2 snapping
- Adjusting the infinite scroll loading point to 4 card rows from the bottom
- Improving grid state restoration after reloads
- Enhancing the early fetch mechanism for faster initial loads
- Optimizing execution runtime to handle large numbers of assets efficiently
- Updating viewer and run button behavior for better integration with ComfyUI
- Fix various bugs and edge cases
- nodes.py: MajoorSaveImage (PNG with generation_time_ms in text chunks) and MajoorSaveVideo (MP4 via PyAV, GIF, WebP with metadata persistence)
- extractors_png.py: read generation_time_ms from PNG text chunks
- extractors.py: extract generation_time_ms from merged EXIF data into metadata dict
- extractors_video.py: extract generation_time_ms from ffprobe format tags
- messageCenter.js: add generation-time-persistence tip and topbar MFV button announcement
- CHANGELOG.md: document topbar MFV button and custom nodes
- README.md: add Custom Nodes section with input tables
- docs/CUSTOM_NODES.md: full node reference and extraction pipeline docs
- docs/DOCUMENTATION_INDEX.md: add CUSTOM_NODES.md entry
- Multi-Pin references: toggle buttons A/B/C/D to pin up to 4 images
- Node Parameters sidebar: view/edit workflow node widgets inside MFV
- Run button in viewer toolbar for immediate re-queue
- Expandable text areas for long prompts
- Sidebar position setting (right/left/bottom) via Settings
- Toolbar layout: Run and Node Parameters pushed to far right
- Message Center: 2 new announcements for the features
- Docs: VIEWER_FEATURE_TUTORIAL, FLOATING_VIEWER_WORKFLOW_SIDEBAR
- CHANGELOG v2.4.5, README aligned
- Add keyboard shortcuts for video in-point (I), out-point (O), and navigation (Home/End)
- Implement swipe gesture for navigating between assets in the viewer
- Add option to copy prompt to clipboard (Ctrl/Cmd+C)
- Improve stack group card functionality and representative selection
- Optimize image preloading for smoother navigation
- Enhance audio visualizer with WebGL support and mode switching
- Refine feed card appearance and interaction
- Add grid snapshot caching to improve performance and reduce server requests
- Implement sessionStorage-based cache storage with size and TTL limitations
- Update grid loader to interact with the snapshot cache
- Modify asset upsert logic to work with cached snapshots
- Add functions to remember and retrieve snapshots
- Update CSS class names for grid skeleton layout
- Implemented LiveStreamTracker to manage live streaming of images and videos.
- Introduced functions for loading and saving images and videos, including handling of various formats.
- Added event listeners for new generation outputs and preview streaming integration with ComfyUI API.
- Established hooks for node selection changes to track and manage content updates.
- Created utility functions for parsing URLs and file paths to streamline input handling.
- Implemented LiveStreamTracker in LiveStreamTracker-DEOsWH5q.js to manage media loading and saving events.
- Introduced functions for handling image and video inputs, including URL parsing and widget integration.
- Added event listeners for new generation outputs to facilitate real-time updates.
- Created entry point in entry-DJOMRGDR.js to support the new tracking functionality.
- Implemented LiveStreamTracker with functionalities for tracking and managing live stream events.
- Introduced event listeners for new generation outputs and preview blobs.
- Added utility functions for handling image and video inputs and outputs.
- Established hooks for canvas node selection and changes.
- Created entry point for the LiveStreamTracker in entry-DSb73AW-.js.
- Implemented useGridState to manage grid state, including asset selection and loading states.
- Created useVirtualGrid to centralize virtualization helpers for improved performance.
- Added createVueApp for isolated Vue 3 + Pinia application instances.
- Introduced Vite configuration for building the ComfyUI-Majoor-AssetsManager with external dependencies.
- Added deduplication logic to prevent multiple simultaneous requests for the same asset metadata.
- Introduced a pending requests cache to manage in-flight promises.
- Updated `getAssetMetadata` and `vectorFindSimilar` functions to utilize the deduplication feature.
- Enhanced error handling to clear pending entries on request failures.
feat: add MediaBlobCache for media asset error tracking
- Created MediaBlobCache to manage blob URLs and track loading errors for media assets.
- Implemented methods to mark URLs as errored and acquire blob URLs with ref-counting.
- Integrated MediaBlobCache into the Card component to handle broken image URLs.
feat: reconcile selection IDs in grid management
- Added `reconcileSelectionIds` function to synchronize selected asset IDs with visible assets.
- Updated grid selection management to prune selections based on visibility.
- Enhanced the AssetsManagerPanel to trigger selection reconciliation on filter changes.
style: improve loading overlay and skeleton loaders
- Refined loading overlay styles for better user experience.
- Added CSS for skeleton loaders to provide visual feedback during asset loading.
test: add unit tests for API client deduplication and grid selection
- Implemented tests for deduplication logic in the API client.
- Added tests for the new `reconcileSelectionIds` function in the grid selection manager.
- Implemented entry UI registration for the Assets Manager, including sidebar and bottom panel integration.
- Created real-time listeners for execution events, asset updates, and enrichment status.
- Developed execution runtime controller to manage job tracking, asset buffering, and indexing.
- Introduced lazy initialization for vector services to optimize resource usage.
- Added HTTP handlers for plugin management, enabling listing, enabling, and reloading of plugins.
- Added functions to manage sibling asset states and determine if PNG siblings should be hidden based on their context (video, audio, model3D).
- Refactored asset appending logic to utilize the new sibling hiding functionality.
- Updated the backend to prioritize image assets over video assets in the same stack group.
- Introduced a new execution asset buffer to manage job-related assets efficiently.
- Created tests for sibling hiding logic and execution asset buffer functionality.
- Added coverage reporting for Vitest with configuration in vitest.config.mjs
- Updated package.json to include new scripts for JS coverage, linting, and formatting
- Modified run_quality_gate.py to allow skipping ESLint and Prettier checks
- Introduced .prettierrc for consistent code formatting
- Created .prettierignore to exclude specific files and directories from formatting
- Introduced runtime bootstrap helpers in `mjr_am_backend.features.runtime` for dependency initialization.
- Implemented `apply_startup_settings` to handle various startup configurations.
- Added search request normalization helpers in `mjr_am_backend.features.search` including `SearchRequestContext` and `parse_search_request` for better query handling.
- Created audit logging helpers in `mjr_am_backend.routes.core.audit_log` for state-changing route handlers.
- Developed a quality gate script in `scripts/run_quality_gate.py` to enforce code quality checks.
- Added comprehensive tests for audit routes, scan consistency, vendor routes, and code quality metrics.
- Improved URL parameter handling in `appendAssetFilterQueryParams` for better readability and maintainability.
- Added error handling for performance marks in `startTimer` to prevent potential issues.
- Enhanced `setRuntimeStatePatch` to avoid modifying blocked keys in the runtime state.
- Introduced hard caps on recent file and execution start tracking to prevent memory growth.
- Reduced workflow cache size to limit memory usage.
- Implemented safe escaping for asset IDs in `findAssetElement` to mitigate XSS risks.
- Ensured proper grid reference invalidation during asset manager panel cleanup.
- Enhanced debounce utility with cancel and flush methods for better control.
- Updated SQLite facade to improve error handling and schema population.
- Simplified custom roots store error messages for clarity.
- Added validation for upload filenames to prevent reserved names and control characters.
- Improved path resolution logic to avoid race conditions with symlinks.
- Enhanced health check routes with raw socket peer IP validation for security.
- Added collision handling in staging file resolution to prevent infinite loops.
- Updated tests to reflect changes in query building and validation logic.
- Implement toast history functionality in the message popover
- Add new history tab next to messages and shortcuts
- Display recent toast notifications in the history panel
- Include clear button to remove toast history
- Add unread indicator to history tab when there are new entries
- Update message popover layout and styling to accommodate new tab