Introduces a new markdown file detailing the implementation of Windows File ID support for stable file identification across renames. This documentation outlines the problem with current Windows file handling, the solution using NTFS File IDs, and the expected user impact. It also includes acceptance criteria, implementation plans, known limitations, and success metrics, ensuring comprehensive guidance for developers.
Additionally, updates the indexing rules to include macOS metadata files in the system file rejection list, enhancing cross-platform compatibility.
Addresses task CORE-015.
- Marked the task FILE-005 as done, completing the implementation of bidirectional file transfers with PULL support.
- Updated documentation to reflect the new capabilities and changes in the system.
- Enhanced UI components to support drag-and-drop functionality from remote devices to local folders.
- Added integration tests for PULL operations, ensuring reliability and performance.
This commit concludes the work on enabling users to copy files from remote devices to local destinations seamlessly.
- Refactored the `InstancesTab` component to group file instances by device, providing a clearer overview of file availability across devices.
- Introduced a new `InstanceRow` component for better organization and readability of individual file instances.
- Added device querying to retrieve device names and icons, enhancing the user interface with relevant device information.
- Updated the layout to improve visual clarity and user experience when viewing alternate file instances.
- Updated `FileByIdQuery` and `FileByPathQuery` to populate alternate paths for files with the same content ID, improving data retrieval for file instances.
- Introduced `get_alternate_paths` method in both queries to fetch alternate file paths from the database.
- Modified the `InstancesTab` component to utilize a new query for alternate instances, enhancing the user interface with detailed instance information.
- Updated TypeScript types to support the new alternate instances query structure, ensuring type safety across the application.
- Adjusted various components to improve the display of alternate file instances, including device and path information.
- Added a new `files` field to `FileSearchOutput` to provide a flat array of files, improving integration with the explorer.
- Updated the `FileSearchQuery` to join directory paths directly on `parent_id`, simplifying the SQL query.
- Enhanced the query to batch fetch sidecars for content UUIDs, improving performance and data retrieval.
- Adjusted the handling of content identity fields to ensure proper association with files in search results.
- Updated the `SearchView` component to utilize the new `files` array instead of the previous `results` structure.
- Introduced a new column `device_id` in the entries table to denormalize device relationships, improving query performance.
- Updated related models and queries to accommodate the new device_id field.
- Enhanced foreign key mappings and migration scripts to support the addition of device_id.
- Adjusted various components to handle device_id, ensuring compatibility across the application.
- Improved release workflow to include specific file types for distribution.
- Updated the layout of the MultiFileInspector component to enhance visual clarity and usability.
- Removed unnecessary dividers between sections for a cleaner presentation.
- Streamlined the rendering of file types and tags sections, improving code readability and maintainability.
- Reformatted import statements for better organization.
- Enhanced code readability by adjusting indentation and line breaks in the SearchGridView and SearchListView functions.
- Ensured consistent formatting across file handling and event functions for clarity.
- Updated `stream_file_data` to bypass encryption, as Iroh provides end-to-end encryption for connections.
- Adjusted `FileTransferProtocolHandler` to skip decryption, directly using the received encrypted data.
- Enhanced logging to reflect changes in data handling during file transfers.
- Added tests to ensure session keys are distinct and validate key swapping functionality.
- Improved error handling in `DevicePersistence` for corrupted session keys during device loading.
- Updated macOS subproject reference to indicate a dirty state.
- Refactored `FileCopyJob` to improve logging for final destination calculations.
- Enhanced `stream_file_data` logging to include destination path in transfer requests.
- Added `find_containing` method to `EphemeralIndex` for substring search functionality.
- Improved logging in `ephemeral_search` to track search results and filtering.
- Replaced print statements with tracing logs in `FileTransferProtocolHandler` for better debugging.
- Added clipboard event handling to support native clipboard operations (copy, cut, paste) based on input focus.
- Introduced functions to check if an input element is focused and to execute native clipboard commands.
- Updated keybind listener to trigger appropriate actions based on clipboard events, differentiating between text input and file operations.
- Enhanced menu setup to ensure clipboard actions are always enabled for better user experience.
- Added `DirectoryPreview` component for rendering a grid view of subdirectories in the Quick Preview.
- Updated `ContentRenderer` to utilize `DirectoryPreview` for directory types.
- Introduced TypeScript integration test for verifying cache updates upon file deletions, ensuring accurate directory listing after deletions.
- Enhanced keyboard handling in Explorer to prevent shortcuts when input fields are focused.
- Added context menu options for creating new folders and pasting files in empty space within the Explorer.
- Implemented keyboard shortcuts for entering tag assignment mode and toggling tags 1-10.
- Refactored keyboard event handling to streamline tag mode activation and file renaming.
- Updated GridView and ListView components to support context menu interactions.
Implements comprehensive search functionality that intelligently routes between
ephemeral (in-memory) and persistent (FTS5 database) indexes, following the
directory listing pattern for consistency.
**Backend Changes:**
- Add IndexType enum (Persistent/Ephemeral/Hybrid) to communicate which index was used
- Add FilterKind enum to indicate available filters for each search type
- Implement ephemeral_search module with content type filtering via FileTypeRegistry
- Update FileSearchOutput with index_type and available_filters fields
- Add routing logic in FileSearchQuery to determine and use appropriate index
- Support file type, size, date, and content type filters in ephemeral search
**Frontend Changes:**
- Add search mode to Explorer context (browse vs search with query/scope)
- Create SearchView component with placeholder for search results
- Wire up SearchBar with debounced search (300ms, min 2 chars)
- Integrate search mode switching in ExplorerView router
**Key Features:**
- Fast, synchronous search (no events, no jobs)
- Defaults to current folder scope (not global like Finder)
- Backend as source of truth for all search operations
- Content type filtering using FileTypeRegistry.identify_by_extension()
- Ephemeral search supports: file types, size, dates, content types
- Persistent search supports: all ephemeral filters + tags + locations
**Architecture:**
Follows the directory listing pattern: checks location index mode, queries
database, falls back to ephemeral cache. Search results indicate which index
was used and which filters are available for dynamic UI updates.
Resolved conflicts in:
- SelectionContext.tsx: Merged rename state with isActiveTab prop
- useFileContextMenu.ts: Combined rename/folder actions with Open With submenu
- FileCard.tsx: Integrated InlineNameEdit with useOpenWith hook
- TableRow.tsx: Integrated InlineNameEdit with useOpenWith hook
- Added `run_in_background` field to `IndexerJobConfig` to allow jobs to run without persisting to the database or updating the UI.
- Updated `should_persist` method in `IndexerJob` to account for background jobs.
- Modified `handle_new_directory` in `DatabaseAdapter` to create background indexer jobs.
- Ensured default value for `run_in_background` is set to false in various configurations.
- Introduced a new integration test for bulk file moves to validate cache updates and file handling.
- Modified button styles in OverviewTopBar to enhance visual appeal and user experience.
- Adjusted layout properties, including height, padding, and border styles, for a more modern look.
- Simplified button content structure by removing unnecessary span elements.
- Implemented `getAppVersion` method in the platform abstraction to fetch the application version.
- Updated `DaemonStartupOverlay` to display the app version during startup, improving user feedback.
- Introduced a new `Orb` component for enhanced visual effects in the overlay.
- Made minor layout adjustments in various components for better UI consistency.
- Removed the DaemonOverlays component and integrated its functionality into a new ExplorerWithDaemonCheck component.
- The new component conditionally renders the Explorer UI based on the daemon connection status, preventing unnecessary queries during startup.
- Updated DaemonDisconnectedOverlay to accept daemonStatus as a prop for improved state management.
- Refactored useDaemonStatus hook to streamline polling logic and enhance connection handling.
- Added SwiftRs as a dependency in Package.swift to enhance file opening capabilities.
- Updated the get_apps_for_path function to return a JSON string of available applications instead of an array.
- Modified the Swift implementation to align with the new return type and improved data handling.
- Created a new Package.resolved file to manage package dependencies.
- Reformatted code for better readability and consistency, including indentation and line breaks.
- Enhanced the clarity of function definitions and context values within the SelectionProvider.
- Maintained existing functionality while improving code maintainability and visual structure.
- Added multi-select capability for the Inspector in the TODO list.
- Updated drag selection logic to prevent conflicts with file dragging when clicking on selected items.
- Adjusted drag selection settings across GridView, ListView, and ColumnView to improve user experience and ensure compatibility with drag-and-drop interactions.
- Refactored related components to streamline event handling and enhance performance.
- Eliminated the focus ring styling for the FileCard component to streamline its appearance during drag-and-drop interactions.
- Adjusted class names to enhance visual consistency and user experience in the GridView layout.
- Updated `TabNavigationGuard` to track tab switch timing and prevent stale data rendering during brief navigation delays.
- Introduced logic to only block rendering when a tab switch occurs within 50ms, ensuring smoother transitions and improved user experience.
- Clarified documentation regarding the guard's behavior during in-tab navigation.
- Introduced `TabNavigationGuard` component to manage rendering during tab navigation, ensuring that stale data is not displayed while switching tabs.
- Updated `ExplorerView` to wrap view components with `TabNavigationGuard`, enhancing user experience by blocking rendering until navigation completes.
- Removed unused tab management logic from `ColumnView` to streamline component functionality.
- Removed unused TabViewSync and associated hooks to simplify tab state handling.
- Integrated columnStack and scrollPosition management directly within ExplorerProvider, enhancing per-tab state synchronization.
- Updated Explorer and ColumnView components to utilize new context values for improved state consistency.
- Refactored view settings handling in ExplorerProvider to align with the new TabManager context structure, ensuring a cohesive user experience across tabs.
- Introduced `TabViewSync` component to preserve view settings (viewMode, sortBy, gridSize) per tab, improving user experience when switching between tabs.
- Added `useTabColumnSync` hook to maintain column drill-down state across tabs in the ColumnView, ensuring a seamless navigation experience.
- Updated `TabManagerContext` to include new view state management functions, enhancing the overall tab management capabilities.
- Refactored `Explorer` and `ColumnView` components to integrate the new synchronization features, ensuring consistent state handling across the application.
- Added `useTabScrollSync` hook to preserve scroll position for each tab in GridView, ListView, and MediaView components.
- Updated respective views to utilize the new hook, enhancing user experience by maintaining scroll state when switching tabs.
- Exported `useTabScrollSync` from TabManager for accessibility across components.
- Added a placeholder comment in TabView for future per-tab router isolation.
- Updated ExplorerProvider to include a new prop for controlling tab context processing.
- Changed TabManagerProvider's routes prop type to RouteObject for better type safety.
- Cleaned up TabView component by removing unused tab prop and simplifying children handling.
- Adjusted layout and styling of the TabBar for better visual consistency and user experience.
- Enhanced tab button styles to support flexible sizing and improved alignment.
- Updated close button positioning and hover effects for better accessibility.
- Refined transition effects for active tab indication, improving responsiveness.
- Improved tab management by adding TabDefaultsSync for default tab path handling.
- Refactored ExplorerLayoutContent to better structure the layout, including repositioning the TabBar and adjusting content areas.
- Updated TabBar component to conditionally render based on the number of tabs.
- Enhanced tab title derivation logic in TabNavigationSync to reflect current route accurately.
- Cleaned up styles and structure in various components for improved readability and maintainability.
- Added a new DragSelect component to facilitate multi-file selection using mouse drag.
- Integrated DragSelect into GridView, ListView, and ColumnView for consistent user experience.
- Enhanced file selection logic to support both single and multi-file selections, including modifier key handling.
- Updated FileCard and TableRow components to include selectable data attributes for drag selection.
- Improved performance with scroll handling during drag operations and optimized event management.
- Introduced context for managing drag selection state and behavior across different views.
Adds browser-like tabs to the Explorer, allowing users to browse multiple locations simultaneously. Includes tab creation, closing, switching, and navigation persistence.
Co-authored-by: ijamespine <ijamespine@me.com>