Commit Graph
71 Commits
Author SHA1 Message Date
Ewald 16da4a279c Restore browser navigation guard contract 2026-05-26 14:29:29 +02:00
Ewald a78f4572c8 Align frontend layout with ComfyUI conventions 2026-05-26 10:42:22 +02:00
Ewald 5c6ec82e8e migrate frontend source to TypeScript 2026-05-25 00:36:51 +02:00
Ewald 6587940862 refactor(app): enhance ComfyUI integration and settings sync - Implement two-way binding for ComfyUI settings in Majoor - Add new settings for auto-opening viewers and floating sidebar - Improve extension manager compatibility and dialog handling - Extend sidebar tab registration and controller discovery - Introduce graph canvas helpers for centering view and getting viewport bounds - Enhance minimap functionality with new graph canvas methods - Add settings sync with ComfyUI language 2026-05-23 18:35:21 +02:00
Ewald 22648e5961 chore: commit remaining workspace changes 2026-05-17 21:21:49 +02:00
Ewald f239f0b4fa fix(mfv): V key context, clear selection on folder nav, filter folder cards from MFV
- 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
2026-05-07 21:21:40 +02:00
Ewald f00fdb570c Fix MFV hotkeys, node stream, and video seek 2026-05-01 13:14:07 +02:00
Ewald 80c0aad5e7 audit profond : corrections et améliorations 2026-04-30 08:42:27 +02:00
Ewald b9ab229555 feat: add VectorCaptionOnIndex setting (Florence-2 captions during indexing)
- 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
2026-04-25 12:12:04 +02:00
Ewald b2ef3d0f80 fix(assets): improve grid reload and scroll behavior
- 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
2026-04-20 23:10:42 +02:00
Ewald 8ae71eb31e Fix floating viewer playback and search responsiveness 2026-04-14 15:23:35 +02:00
Ewald 9b8b9f9a12 Improve MFV player UX and regression coverage 2026-04-14 09:00:43 +02:00
Ewald 13a69c1237 fix: wire video autoplay mode setting to grid cards
- Import APP_CONFIG in AssetCardInner.vue and read GRID_VIDEO_AUTOPLAY_MODE
- Add reactive videoMode ref updated via mjr-settings-changed listener
- Add bindVideoAutoplay() with IntersectionObserver for 'always' mode
- Add cleanupVideoBehaviors()/applyVideoMode() to switch between off/hover/always
- watch(videoMode) re-applies behavior on runtime setting change
- Fix rating reset bug: mark_recent_generated before ExifTool write (sync.py/watcher.py)
- Add scope-switch cache, exit-similar-scope, and rating/tags ID tests
2026-04-10 15:18:53 +02:00
Ewald 0c7466c20b feat: add LiveStreamTracker for enhanced media handling and tracking
- 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.
2026-04-07 14:53:37 +02:00
MajoorWaldi c860f38fbd Refactor executable path resolution in ExifTool and FFProbe; enhance vector search stats with coverage fields; improve DB backup naming and handling; add tests for new functionality 2026-04-06 09:41:58 +02:00
MajoorWaldi 99a429dffe feat: add LiveStreamTracker and entry module for enhanced video and image processing capabilities 2026-04-04 22:28:49 +02:00
MajoorWaldi 2fa41a0e76 feat: add useGridState and useVirtualGrid composables for asset management
- 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.
2026-04-03 11:04:55 +02:00
MajoorWaldi b0070544d0 feat: implement request deduplication in API client
- 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.
2026-03-30 17:04:33 +02:00
MajoorWaldi c3071914eb feat: Enhance asset management with new stack rename endpoint and improve filtering logic 2026-03-29 20:00:06 +02:00
Ewald 44c0c57f6e feat: Add asset management and real-time listener functionalities
- 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.
2026-03-29 01:03:49 +01:00
MajoorWaldi dc72be0139 feat: enhance JS testing and linting setup
- 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
2026-03-28 14:14:28 +01:00
MajoorWaldi c9be315b42 feat: Implement stack grouping for asset cards with popover management and enhanced CSS styling 2026-03-27 17:38:07 +01:00
MajoorWaldi cb171e826d feat: Add runtime bootstrap helpers and search request normalization
- 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.
2026-03-26 20:42:51 +01:00
MajoorWaldi c7f93f0eab Refactor and optimize various components
- 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.
2026-03-21 16:20:26 +01:00
MajoorWaldi 04a3da6643 feat(assets): enhance tag handling and agenda calendar functionality
- Implement tag deduplication and improve tag normalization
- Add toggle behavior for agenda calendar day selection
- Display asset count badges on agenda calendar days
- Extend agenda calendar API to support additional filters
- Adjust grid controller to use semantic filter options
- Update backend scanner to notify about asset updates
2026-03-08 00:51:40 +01:00
MajoorWaldi fecfa0eb56 feat(panel): add shortcut guide tab to message popover
- Implement new tabbed interface in message popover
- Add shortcut guide tab alongside messages tab
- Update MFV toggle button to use new tooltip format
- Enhance scroll handling for open popovers
- Adjust search input to display keyboard shortcuts
- Update Floating Viewer buttons with new tooltip format
- Add keyboard shortcut for toggling MFV (Ctrl/Cmd+V)
2026-03-06 19:21:51 +01:00
MajoorWaldi 834ef1fef3 feat(docs): comprehensive AI features guide and new documentation
- Added new AI_FEATURES.md guide covering all AI-powered capabilities
- Updated DOCUMENTATION_INDEX.md to include new AI features guide
- Added AI Features section to README.md with overview and models used
- Improved backfill warning information in README.md
- Updated reset index / delete DB procedures in DB_MAINTENANCE.md
- Added configuration options for AI features in README.md
2026-03-06 12:43:46 +01:00
MajoorWaldi 29e5059c4d feat(ai): enhance asset alignment, captioning and tagging
- Add AI alignment score display to asset metadata
- Implement image description fallback for non-workflow image assets
- Improve AI captioning UI and UX
- Optimize AI tagging suggestions with bootstrap generation
- Refactor collections controller to support AI toggling
- Enhance error handling and retry logic for asset indexing
2026-03-05 02:21:13 +01:00
MajoorWaldi aaf16f4653 feat: Add new vector caption route and enhance search functionality
- Added a new POST route for caption generation at /mjr/am/vector/caption/{asset_id}.
- Enhanced result hydration in search to include AI-related metadata such as has_ai_info, has_ai_vector, has_ai_auto_tags, and has_ai_enhanced_caption.
- Updated deduplication logic in search results to ensure accurate total counts.
- Improved test coverage for database maintenance routes, including force delete and backup functionalities.
- Introduced new tests for hybrid search routes to validate scope filtering and ensure correct behavior with invalid inputs.
- Added functionality to bypass list gate in background scan initiation.
- Enhanced error handling and response validation in various search and scan routes.
2026-03-03 20:02:46 +01:00
MajoorWaldi 72fcfe5aeb feat: enhance semantic search with auto-detection and add legacy prompt enhancement alias 2026-03-03 08:20:44 +01:00
MajoorWaldi 0fa92e19c6 feat: Enhance vector service and database maintenance with HuggingFace token management
- Introduced functions to manage HuggingFace tokens in settings, including retrieval and updates.
- Added asynchronous routes for getting and setting HuggingFace token information.
- Implemented operation gates for delete, rename, and move operations in custom routes.
- Enhanced vector service with quiet encoding to suppress output during model encoding.
- Added retry logic for text embeddings to handle length constraints.
- Implemented vector backfill job management with status tracking and history pruning.
- Improved error handling in vector search routes and added logging for failures.
- Added tests for new HuggingFace settings routes and operation gate enforcement in database maintenance.
- Created tests for vector alignment and search routes, ensuring proper handling of exceptions and invalid inputs.
2026-03-02 20:13:04 +01:00
MajoorWaldi 5393ad6ff6 feat: implement vector search capabilities and backfill missing asset vectors 2026-03-02 14:40:49 +01:00
MajoorWaldi 83c2d19327 Add audit, hybrid search, and vector search functionalities
- Implemented library audit route to surface assets based on completeness and quality scores.
- Created hybrid search route combining FTS and semantic search with inline filter parsing.
- Developed vector search routes for semantic search, find-similar, and alignment score retrieval.
- Added auto-clustering utility for grouping assets by visual similarity using K-Means.
- Enhanced vector search capabilities with support for AI auto-tags and clustering suggestions.
2026-03-02 14:03:31 +01:00
MajoorWaldi ad7678ccab feat: enhance WebGL video processing and output directory management
- Updated WebGL context creation to preserve the drawing buffer for frame export functionality.
- Added new CSS styles for sampler, scheduler, CFG, step, and genTime fields in the theme-comfy stylesheet.
- Implemented output directory override restoration on startup in the settings service.
- Introduced functions to collect distinct sampler configurations and checkpoints from multiple sinks and chained sampler passes.
- Enhanced prompt tracing and sampler name resolution to handle advanced sampler configurations.
- Added support for filtering by tags in the search functionality, including validation and sanitization of tag inputs.
- Updated search query sanitization to include tag handling and adjusted valid sort keys.
- Improved filesystem listing handlers to accommodate new workflow type filters and ensure proper filtering logic.
- Enhanced health check routes to manage output directory settings and cache invalidation.
- Added tests to verify new filtering capabilities and ensure functionality remains intact.
2026-03-01 20:08:43 +01:00
MajoorWaldi 2240cbc74d feat(i18n): add tooltip translations for various UI elements
- Updated delete collection button title to use translation.
- Updated agenda calendar cell title for no assets to use translation.
- Updated asset manager panel titles and tooltips for various buttons and actions to use translations.
- Updated sidebar asset refresh tooltip to use translation.
- Updated status dot delete database button title to use translation.
- Updated floating viewer button titles to use translations for close, live stream, and capture view.
- Updated viewer toolbar button titles and tooltips to use translations for various modes and actions.
- Added performance metrics utility for tracking rendering and search query durations.
- Enhanced toast styling to include icons and improved layout.
2026-02-28 20:52:11 +01:00
MajoorWaldi 08e07b5312 fix: replace silent catches with debug logging across multiple files
- Updated error handling in videoProcessor.js, videoProcessorWebGL.js, videoSync.js, viewerInstanceManager.js, and various utility files to log caught exceptions using console.debug.
- Introduced a new script to automate the replacement of silent catch blocks with logging statements.
- Enhanced safety checks in the database schema and transaction manager to prevent SQL injection vulnerabilities.
- Added regex patterns for validating column definitions and executable names in the ExifTool adapter.
- Improved error handling in health and filesystem routes to ensure better feedback on invalid inputs.
- Added tests to cover new error handling and validation logic.
2026-02-27 21:00:17 +01:00
MajoorWaldi 42ff0fc748 fix(security): address high/low severity findings from browser deep-audit
- Implement safe URL validation and opener/noreferrer flags in ViewerContextMenu
- Add event listener management and disposal in customRootsController
- Fix removeEventListener options inconsistency in filtersController
- Update list URL construction for custom scope in endpoints.js
- Add disposal of customRootsController bindings in AssetsManagerPanel
2026-02-27 16:14:39 +01:00
MajoorWaldi 70621bd8d6 fix(toast): improve error toast handling and dismissals
- Make all error toasts persistent and group them for mass dismissal
- Add fallback mechanism for error toast dismissal in case of ComfyUI extension absense
- Remove auto-removal of error toasts, requiring manual dismissal
- Adjust success toasts to remove grouped error toasts (if ComfyUI extension present)
2026-02-27 13:35:32 +01:00
MajoorWaldi e7c2443670 fix(security): improve API token handling and add server-side bootstrapping
- Move token from local to session storage on client side
- Set httpOnly cookie for server-side token on bootstrap/rotate
- Add token validation and auto-sanitization
- Implement retry logic for failed operations
- Add input validation for collection names
- Update toast durations and error handling
2026-02-27 10:09:44 +01:00
Your Name 966cf86f28 chore: commit current AssetsManager fixes 2026-02-19 16:36:55 +01:00
Your Name 657ddc4c8e feat: enhance filename handling and sanitization
- Added `splitNameExt` function to separate filename and extension.
- Implemented `normalizeRenameFilename` to preserve extensions during renaming.

fix: improve error handling in search queries

- Added checks for malformed match errors in `IndexSearcher`.
- Enhanced FTS query sanitization to remove reserved tokens and normalize case.

feat: implement security token management

- Introduced API token generation, hashing, and rotation in `AppSettings`.
- Added endpoints for rotating and bootstrapping security tokens.

fix: enforce write access across various routes

- Integrated `_require_write_access` checks in multiple route handlers to ensure proper authorization.

test: add unit tests for search query sanitization

- Created tests for sanitizing FTS queries, ensuring reserved tokens are removed and terms are lowercased.
2026-02-19 11:19:13 +01:00
Your Name 5e5a50dfeb feat(sidebar): localize placeholder text in sidebar
feat(generation): remove unnecessary checks for width and height
feat(grid): add max width and height filters to grid view
feat(panel): integrate resolution comparison in assets manager panel
feat(panel): update context controller to handle max width and height
feat(panel): enhance filters controller with resolution comparison
feat(panel): update grid controller to include max width and height in state
feat(panel): persist max width and height in panel state
feat(panel): update context pills view to reflect resolution filters
feat(panel): enhance filter popover view with resolution comparison options
feat(panel): improve search view with localized placeholder and title
feat(backend): extend filesystem browser to support max width and height filters
feat(backend): update searcher to handle max width and height in filters
feat(backend): normalize visual dimensions in metadata extraction
feat(backend): enhance metadata service to ensure width and height are set
feat(backend): add max width and height handling in search routes
test: add tests for version route aliases registration
2026-02-18 22:31:31 +01:00
Ewald b7a1f9bdec feat: internationalize UI text and tooltips across various components
- Added localization support for button texts in browser navigation.
- Updated context pills view to use localized labels for filters and scopes.
- Localized header view titles and tooltips for better user experience.
- Enhanced summary bar view with internationalized labels for asset counts and filters.
- Updated tabs view to reflect localized tab names and tooltips.
- Localized viewer context menu options and toast messages for file operations.
- Implemented SQL fragment safety checks to prevent injection attacks.
- Improved rate limiting logic to avoid shared overflow buckets.
- Added tests for new security features and localization checks.
2026-02-18 17:20:29 +01:00
Ewald da847f35f9 Add regression tests for route security guards
- Implement tests to ensure file paths are properly allowlisted in custom view and folder info handlers.
- Verify that collections mutations enforce CSRF protection and write access guards.
- Check that settings mutations require write access for specific routes.
2026-02-18 14:37:13 +01:00
Ewald 00d141ef8c Add tests and enhancements for browser navigation and asset management
- Implemented size filters in the filesystem browser and added tests to ensure correct application of size constraints.
- Updated write access guard tests to reflect changes in handling forwarded remote requests.
- Introduced a new browser navigation controller to manage folder navigation and breadcrumb rendering.
- Added regression tests to ensure proper binding order for asset manager and back navigation functionality.
- Created tests to validate the absence of double reloads on folder context opening and the use of single folder keys in browser state.
- Added various regression tests to ensure database integrity, asset metadata handling, and viewer functionality.
- Enhanced tests for media filters and search scope to ensure correct behavior and data handling.
2026-02-18 08:11:14 +01:00
Your Name 7183c87400 Refactor filtersController to manage event listeners with lifecycle support
- Introduced `addManagedListener` function to handle event listeners with automatic cleanup.
- Updated event listeners for various filter controls to use the new management function.
- Added lifecycle signal support for event listeners to ensure proper disposal.
- Implemented cleanup logic to remove event listeners when no longer needed.

---

Update database schema handling to support async operations

- Changed `db.has_table` to `db.ahas_table` for async compatibility.
- Updated related database checks to use the new async method.

---

Refactor SQLite adapter to prioritize async operations

- Transitioned public API to expose async methods as primary.
- Removed synchronous methods and replaced them with async counterparts.
- Updated internal transaction handling to support async context management.
- Enhanced error handling and logging for async operations.

---

Add async support for FFProbe tool

- Implemented `aread` and `aread_batch` methods for asynchronous metadata reading.
- Utilized asyncio subprocess for non-blocking execution of ffprobe commands.

---

Enhance IndexScanner with I/O throttling

- Introduced `SCAN_IOPS_LIMIT` to control I/O operations during directory scans.
- Implemented pacing logic to manage scan I/O operations effectively.

---

Update MetadataService to utilize async reading methods

- Refactored methods to call async variants of exif and ffprobe reading.
- Improved error handling for async operations.

---

Implement path resolution checks in asset routes

- Added `_is_resolved_path_allowed` function to enforce allowed roots for file paths.
- Updated asset route handlers to validate resolved paths against allowed roots.

---

Refactor database maintenance routes for async handling

- Changed database close operations to use async `aclose` method.
- Updated error handling during database maintenance operations.

---

Update scan routes to utilize async database vacuuming

- Replaced synchronous database vacuum calls with async `avacuum` method.

---

Modify tests to support async database operations

- Updated test examples to use async context management for database interactions.
- Refactored integration tests to ensure proper async cleanup of database connections.
- Adjusted regression tests to count async transaction invocations correctly.
2026-02-16 01:05:48 +01:00
Your Name 0debbd53a2 feat: Enhance context and custom roots management
- Added resetBrowserHistory functionality to contextController for better state management.
- Improved handling of custom root states in customRootsController, including resetting labels and paths.
- Removed unused refreshCustomRoots from scopeController.
- Updated sidebarController to provide more context in asset status updates.
- Introduced new folder details section in the sidebar to display folder metadata.
- Created pinned folders popover view for better folder management.
- Implemented custom status dot themes for improved visual feedback in asset status.
- Added folder info endpoint in the backend to retrieve folder statistics and metadata.
2026-02-15 23:44:26 +01:00
Ewald 42bc855749 feat: Enhance asset management with browser mode and custom root support
- Introduced browser mode for file operations, allowing users to interact with arbitrary file paths without prior indexing.
- Added functionality to resolve file paths from request bodies, supporting both asset IDs and direct file paths.
- Implemented new service methods for listing visible subfolders and filesystem entries, enhancing directory navigation.
- Updated asset routes to accommodate new file path handling, improving error responses and validation.
- Created a new FolderCard component for better UI representation of folders in the frontend.
- Added tests for browser service functionalities to ensure robustness and correctness.
2026-02-14 02:03:59 +01:00
Ewald b700149b2d feat: Enhance metadata handling and fallback mechanisms
- Introduced fallback readers for metadata extraction when ExifTool/ffprobe are unavailable, utilizing Pillow and hachoir for images and media files respectively.
- Added settings for metadata fallback preferences, allowing users to toggle image and media fallback options.
- Implemented route collision logging to prevent overlapping API paths.
- Added middleware for authentication on sensitive routes, ensuring secure access.
- Updated API documentation to reflect new endpoints and settings.
- Enhanced unit tests for metadata handling, case sensitivity in file paths, and fallback mechanisms.
- Removed compatibility shims for shared modules, consolidating imports under mjr_am_shared.
2026-02-13 16:37:44 +01:00
Ewald 00ee7806f7 feat: Add tool detection helpers for ExifTool and FFprobe
- Implemented caching for tool availability and versions.
- Added functions to check for ExifTool and FFprobe availability.
- Included version satisfaction checks against minimum required versions.
- Created utility functions for parsing boolean and float values from environment variables.
- Introduced shared utilities for error message sanitization and logging with emoji indicators.
- Established a Result pattern for error handling without exceptions.
- Added scan throttling helpers to manage background scans efficiently.
- Implemented time utilities for timestamps and performance measurement.
- Defined shared types, enums, and constants for consistent error handling and file classification.
- Created version management utilities to retrieve version information from pyproject.toml.
- Developed installation script for runtime dependencies.
- Added tests for ExifTool batch processing and various configuration scenarios.
- Implemented tests for version route aliases and runtime output root configuration.
2026-02-12 17:55:28 +01:00