Skip to content

fix: optimize QuickSearch cross-platform search behavior#246

Open
CelesteLP wants to merge 1 commit into
TouchAI-org:mainfrom
CelesteLP:codex/quick-search-macos-pr-243-v2
Open

fix: optimize QuickSearch cross-platform search behavior#246
CelesteLP wants to merge 1 commit into
TouchAI-org:mainfrom
CelesteLP:codex/quick-search-macos-pr-243-v2

Conversation

@CelesteLP

Copy link
Copy Markdown
Contributor

First external contributors may need to complete the CLA Assistant check before merge.
For code changes, this PR must link the related issue or RFC in the section below.

Summary

  • Keep QuickSearch closed when the native provider is unavailable or status probing fails, preventing open/close flicker while typing in a new conversation.
  • Add macOS Spotlight-backed file search while keeping Windows on Everything and unsupported platforms unavailable.
  • Add macOS file, folder, app, and image thumbnail icons for QuickSearch results, including path-based cache keys for .app bundles and extensionless paths.
  • Disable SearchBar contenteditable spellcheck/autocorrect/autocapitalize/autocomplete for command, path, and filename input.
  • Keep the search window top stable when QuickSearch expands without an active conversation; conversation resize remains centered.

Related issue or RFC

AI assistance disclosure

  • Tool(s) used: OpenAI Codex
  • Scope of assistance: implementation, tests, local verification, issue/PR preparation
  • Human review or rewrite performed: maintainer/user reviewed the intended issue and PR flow before submission
  • Architecture or boundary impact: adds a macOS QuickSearch provider and macOS search asset loading path; no AgentService, MCP, or database schema changes

Testing evidence

Commands run successfully:

  • PATH="$PWD/.codex-bin:$PATH" RUSTC=$(rustup which rustc) git commit -m "fix: optimize QuickSearch cross-platform search behavior"
    • pre-commit ran check:rust, type:check, eslint --fix, prettier --write, and cargo fmt for staged Rust files
  • corepack pnpm vitest run tests/composables/SearchView/QuickSearchPanel/useQuickSearchLogic.test.ts tests/SearchView/windowSizing.test.ts tests/composables/SearchView/useSearchWindowResize.test.ts tests/composables/SearchView/SearchBar/useSearchLogic.test.ts
  • corepack pnpm type:check
  • git diff --check origin/main...HEAD
  • Manual startup verified by maintainer/user on the branch with PATH="$PWD/.codex-bin:$PATH" RUSTC="$(rustup which rustc)" corepack pnpm tauri dev

Did you follow TDD (test-first) for feature and fix work?

  • Added focused tests for QuickSearch unavailable state, SearchBar autocorrect attributes, icon cache keys, and QuickSearch resize centering policy while implementing the fixes.

Risk notes

  • AgentService, runtime, MCP, or schema impact: none
  • database baseline or migration impact: none
  • release or packaging impact: adds macOS-only file_icon_provider dependency and Spotlight provider code path

Screenshots or recordings

No recording attached. The affected flow is the SearchView QuickSearch typing/expansion path.

Checklist

  • The PR title follows Conventional Commits and is valid for squash merge.
  • This PR is either ready for review or explicitly marked as a Draft PR.
  • I did not use [WIP] or similar title prefixes.
  • If AI materially assisted this PR, I disclosed the tools and scope and I personally reviewed every affected change.
  • I can explain the why, what, and how of this change without relying on an AI tool.
  • If this touches AgentService, runtime, MCP, or schema boundaries, there is an accepted RFC.
  • If this changes architecture or adds a new cross-boundary abstraction, there is an accepted RFC.
  • I ran pnpm test:pr for this code PR, or this is a docs-only change.
  • If I changed Rust behavior or tests, I reviewed pnpm test:coverage:rust or relied on CI coverage evidence.
  • If I changed desktop startup/window/search/popup/settings/E2E paths, I ran pnpm test:e2e locally or documented why CI is the first valid proof.
  • I added tests or explained why tests are not appropriate.
  • I updated docs when behavior changed.

@github-actions github-actions Bot added area:tauri Tauri shell or desktop runtime changes area:frontend Frontend UI or view-layer changes labels May 25, 2026
@hiqiancheng hiqiancheng force-pushed the codex/quick-search-macos-pr-243-v2 branch 2 times, most recently from fdcbc92 to d878e28 Compare May 26, 2026 03:19
@hiqiancheng hiqiancheng force-pushed the codex/quick-search-macos-pr-243-v2 branch from d878e28 to 9bbe46d Compare May 27, 2026 06:38
@coderabbitai

coderabbitai Bot commented May 27, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

Release Notes

  • New Features

    • Enabled Quick Search on macOS using native Spotlight search capabilities
    • Added file icon and image thumbnail extraction for macOS files
  • Improvements

    • Refined search window resizing behavior with smarter centering logic based on active sessions
    • Enhanced search input editor with disabled browser autocorrect features for better user control

Walkthrough

This PR adds macOS Spotlight-based file search support to match Windows Everything functionality, implements macOS icon/thumbnail extraction, gates search panel opening to prevent window jitter when the provider is unavailable, and improves window sizing behavior and input polish across platforms.

Changes

macOS Quick Search & Asset Extraction

Layer / File(s) Summary
Spotlight provider implementation via mdfind
apps/desktop/src-tauri/src/core/search/provider_spotlight.rs
search_shortcuts and search_files call mdfind system command, deduplicate and slice results by offset/limit, and return paginated QuickSearchResult/file item arrays; prepare_index and get_status are stub implementations.
macOS file icon and image thumbnail extraction
apps/desktop/src-tauri/src/core/search/assets/mac.rs
file_icon_data_url fetches system icons via file_icon_provider library and encodes as PNG data URL; image_thumbnail_data_url decodes images and encodes RGBA thumbnails as JPEG data URLs, both clamping sizes and handling blank paths.
Platform-aware asset dispatch and module setup
apps/desktop/src-tauri/src/core/search/assets.rs
Routes icon/thumbnail calls to macOS or Windows implementations behind cfg gates; mod mac compiles on macOS, mod win on Windows; both use shared memory/disk cache patterns.
Icon cache key normalization for .app bundles
apps/desktop/src-tauri/src/core/search/assets/cache.rs
Adds full-path cache prefix and updates normalize_icon_cache_key to special-case .app bundles and extensionless paths, preventing icon collisions across different applications; includes unit tests.
Windows-only codec gating
apps/desktop/src-tauri/src/core/search/assets/codec.rs
Gates bgra_to_rgba pixel conversion behind #[cfg(target_os = "windows")].
Search API platform expansion to macOS
apps/desktop/src-tauri/src/core/search/mod.rs, apps/desktop/src-tauri/Cargo.toml
Broadens quick-search APIs from Windows-only to Windows+macOS: adds Spotlight implementations for search/index/status functions; asset retrieval APIs compile on both platforms; adds file_icon_provider = "0.3.1" macOS dependency.

Frontend: Provider availability, window sizing, and input polish

Layer / File(s) Summary
Search provider type expansion
apps/desktop/src/services/NativeService/types.ts
QuickSearchStatus.provider union includes 'spotlight' alongside 'everything' and 'unavailable'.
Search panel availability guards based on provider state
apps/desktop/src/views/SearchView/components/QuickSearchPanel/composables/useQuickSearchLogic.ts, apps/desktop/tests/composables/SearchView/QuickSearchPanel/useQuickSearchLogic.test.ts
Adds providerUnavailable state; refreshStatus() sets flag from provider status; executeSearch(), open(), and triggerSearch() close panel early when unavailable, preventing window jitter.
Smart window centering based on session and QuickSearch state
apps/desktop/src/views/SearchView/windowSizing.ts, apps/desktop/src/views/SearchView/composables/useSearchWindowResize.ts, apps/desktop/tests/SearchView/windowSizing.test.ts
New shouldCenterSearchWindowResize() function returns true if sessionCount > 0, else !quickSearchOpen; useSearchWindowResize applies this instead of always centering; includes tests for both scenarios.
Browser input assistance disabling
apps/desktop/src/views/SearchView/components/SearchBar/composables/useSearchLogic.ts, apps/desktop/tests/composables/SearchView/SearchBar/useSearchLogic.test.ts
Tiptap editor attributes disable spellcheck and autocorrect/autocapitalize/autocomplete to prevent system input assistance in search input.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes


🐰 A rabbit springs forth with glee,
macOS search now works with Spotlight's spree,
Icons bloom and window heights behave,
Input flows calm—no auto-correct misbehave,
Cross-platform dreams in one solid wave! 🍀

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits format (fix:), is concise, and accurately describes the main change: cross-platform QuickSearch optimization.
Description check ✅ Passed The PR description is comprehensive, includes all required sections, links the related issue, discloses AI assistance with scope, documents testing evidence, and provides detailed risk notes.
Linked Issues check ✅ Passed The code changes comprehensively address all objectives in issue #243: unavailable provider handling, macOS Spotlight search, asset icons/thumbnails, SearchBar attribute controls, and window resize centering.
Out of Scope Changes check ✅ Passed All changes are scoped to the objectives: macOS QuickSearch support, icon/thumbnail caching, provider availability checks, window resizing behavior, and SearchBar input controls. No unrelated changes detected.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/desktop/src-tauri/src/core/search/assets.rs`:
- Line 279: Replace the silent unwrap_or(None) on mac::file_icon_data_url(path,
size) with explicit error handling that logs the Err before returning None;
e.g., call mac::file_icon_data_url(path, size) and on Err(e) emit a descriptive
error via the project's logger (log::error or tracing::error) including the
path/size and the error, then return None, and apply the same change to the
other mac::file_icon_data_url call in this file.

In `@apps/desktop/src-tauri/src/core/search/mod.rs`:
- Line 147: Update the unsupported-platform error strings that read "Quick
search file search is only available on Windows" to include macOS; specifically
replace the literal Err("Quick search file search is only available on
Windows".to_string()) (and the other instance with the same string) with a
message like Err("Quick search file search is only available on Windows and
macOS".to_string()) or a platform-agnostic message such as Err("Quick search
file search is not supported on this platform".to_string()) so both occurrences
reflect macOS support.

In `@apps/desktop/src-tauri/src/core/search/provider_spotlight.rs`:
- Line 43: The calculation for next_offset can overflow when offset +
total_files wraps; replace the direct addition with a saturating add to prevent
wrapping (use offset.saturating_add(total_files as u32) or otherwise convert
total_files safely before saturating); update the assignment to next_offset so
it uses saturating_add on the offset variable and keep total_files cast to u32
safely to match types.
- Around line 82-89: get_status() currently returns a hardcoded healthy
QuickSearchStatus; change it to actually probe Spotlight availability and
reflect real state by calling the Spotlight availability check (e.g., an
existing helper like is_spotlight_available() or the Spotlight client init used
elsewhere) and set QuickSearchStatus.provider to PROVIDER_NAME.to_string(),
db_loaded and index_warmed to true only if the probe succeeds, otherwise set
them to false and populate last_error (or last_refresh_ms) with the failure
info; update get_status() to catch errors from the probe and return an
appropriate QuickSearchStatus (provider name unchanged) so the frontend can
detect an unavailable provider.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3cff1390-ce4d-4e9e-9640-b637d4060930

📥 Commits

Reviewing files that changed from the base of the PR and between e692047 and 9bbe46d.

⛔ Files ignored due to path filters (1)
  • apps/desktop/src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (16)
  • apps/desktop/src-tauri/Cargo.toml
  • apps/desktop/src-tauri/src/core/search/assets.rs
  • apps/desktop/src-tauri/src/core/search/assets/cache.rs
  • apps/desktop/src-tauri/src/core/search/assets/codec.rs
  • apps/desktop/src-tauri/src/core/search/assets/mac.rs
  • apps/desktop/src-tauri/src/core/search/mod.rs
  • apps/desktop/src-tauri/src/core/search/provider_spotlight.rs
  • apps/desktop/src/services/NativeService/types.ts
  • apps/desktop/src/views/SearchView/components/QuickSearchPanel/composables/useQuickSearchLogic.ts
  • apps/desktop/src/views/SearchView/components/SearchBar/composables/useSearchLogic.ts
  • apps/desktop/src/views/SearchView/composables/useSearchWindowResize.ts
  • apps/desktop/src/views/SearchView/windowSizing.ts
  • apps/desktop/tests/SearchView/windowSizing.test.ts
  • apps/desktop/tests/composables/SearchView/QuickSearchPanel/useQuickSearchLogic.test.ts
  • apps/desktop/tests/composables/SearchView/SearchBar/useSearchLogic.test.ts
  • apps/desktop/tests/composables/SearchView/useSearchWindowResize.test.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Rust Checks
  • GitHub Check: Desktop E2E Smoke (Windows)
  • GitHub Check: CodeQL (rust)
🔇 Additional comments (18)
apps/desktop/src/services/NativeService/types.ts (1)

192-192: LGTM!

apps/desktop/src/views/SearchView/components/QuickSearchPanel/composables/useQuickSearchLogic.ts (5)

127-127: LGTM!


162-170: LGTM!


201-204: LGTM!


327-330: LGTM!


366-369: LGTM!

apps/desktop/src/views/SearchView/windowSizing.ts (2)

65-68: LGTM!


143-156: LGTM!

apps/desktop/src/views/SearchView/composables/useSearchWindowResize.ts (1)

16-16: LGTM!

Also applies to: 194-197

apps/desktop/src/views/SearchView/components/SearchBar/composables/useSearchLogic.ts (1)

195-198: LGTM!

apps/desktop/tests/SearchView/windowSizing.test.ts (1)

168-184: LGTM!

apps/desktop/tests/composables/SearchView/QuickSearchPanel/useQuickSearchLogic.test.ts (1)

774-822: LGTM!

apps/desktop/tests/composables/SearchView/useSearchWindowResize.test.ts (1)

196-224: LGTM!

apps/desktop/tests/composables/SearchView/SearchBar/useSearchLogic.test.ts (1)

312-321: LGTM!

apps/desktop/src-tauri/src/core/search/assets/mac.rs (1)

19-61: LGTM!

Also applies to: 68-81

apps/desktop/src-tauri/src/core/search/assets/cache.rs (1)

44-45: LGTM!

Also applies to: 139-168, 338-365

apps/desktop/src-tauri/src/core/search/assets/codec.rs (1)

23-24: LGTM!

apps/desktop/src-tauri/Cargo.toml (1)

115-116: LGTM!

return Ok(Some(disk_cached_icon));
}

let icon = mac::file_icon_data_url(path, size).unwrap_or(None);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don’t silently discard macOS extraction errors

Using unwrap_or(None) suppresses actionable failures entirely. Keep the fallback-to-None behavior, but log the error (like Windows does) so regressions are diagnosable.

Suggested fix
-#[cfg(target_os = "windows")]
+#[cfg(any(target_os = "windows", target_os = "macos"))]
 use log::warn;
...
-    let icon = mac::file_icon_data_url(path, size).unwrap_or(None);
+    let icon = match mac::file_icon_data_url(path, size) {
+        Ok(value) => value,
+        Err(error) => {
+            warn!(
+                "[QuickSearch] macOS icon extraction failed for '{}': {}",
+                path, error
+            );
+            None
+        }
+    };
...
-    let thumbnail = mac::image_thumbnail_data_url(path, size).unwrap_or(None);
+    let thumbnail = match mac::image_thumbnail_data_url(path, size) {
+        Ok(value) => value,
+        Err(error) => {
+            warn!(
+                "[QuickSearch] macOS thumbnail extraction failed for '{}': {}",
+                path, error
+            );
+            None
+        }
+    };

Also applies to: 345-345

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/desktop/src-tauri/src/core/search/assets.rs` at line 279, Replace the
silent unwrap_or(None) on mac::file_icon_data_url(path, size) with explicit
error handling that logs the Err before returning None; e.g., call
mac::file_icon_data_url(path, size) and on Err(e) emit a descriptive error via
the project's logger (log::error or tracing::error) including the path/size and
the error, then return None, and apply the same change to the other
mac::file_icon_data_url call in this file.

@@ -107,8 +147,8 @@ pub async fn quick_search_search_files(
Err("Quick search file search is only available on Windows".to_string())

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update unsupported-platform error text to include macOS

These fallback messages still say “only available on Windows”, but macOS is now a supported platform in this module.

Suggested fix
-    Err("Quick search file search is only available on Windows".to_string())
+    Err("Quick search file search is only available on Windows and macOS".to_string())
...
-        last_error: Some("Quick search is only available on Windows".to_string()),
+        last_error: Some("Quick search is only available on Windows and macOS".to_string()),

Also applies to: 260-260

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/desktop/src-tauri/src/core/search/mod.rs` at line 147, Update the
unsupported-platform error strings that read "Quick search file search is only
available on Windows" to include macOS; specifically replace the literal
Err("Quick search file search is only available on Windows".to_string()) (and
the other instance with the same string) with a message like Err("Quick search
file search is only available on Windows and macOS".to_string()) or a
platform-agnostic message such as Err("Quick search file search is not supported
on this platform".to_string()) so both occurrences reflect macOS support.

.collect::<Vec<_>>();

let total_files = files.len();
let next_offset = offset + total_files as u32;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use saturating add for next_offset

Line 43 can overflow on large offsets and produce wrapped pagination state.

Suggested fix
-    let next_offset = offset + total_files as u32;
+    let next_offset = offset.saturating_add(total_files as u32);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let next_offset = offset + total_files as u32;
let next_offset = offset.saturating_add(total_files as u32);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/desktop/src-tauri/src/core/search/provider_spotlight.rs` at line 43, The
calculation for next_offset can overflow when offset + total_files wraps;
replace the direct addition with a saturating add to prevent wrapping (use
offset.saturating_add(total_files as u32) or otherwise convert total_files
safely before saturating); update the assignment to next_offset so it uses
saturating_add on the offset variable and keep total_files cast to u32 safely to
match types.

Comment on lines +82 to +89
pub fn get_status() -> QuickSearchStatus {
QuickSearchStatus {
provider: PROVIDER_NAME.to_string(),
db_loaded: true,
index_warmed: true,
last_refresh_ms: None,
last_error: None,
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

get_status() currently reports healthy even when Spotlight is unavailable

This always returns "spotlight" with warmed/loaded flags, so the frontend cannot preemptively keep QuickSearch closed when status probing should fail. That contradicts the unavailable-provider guard path.

Suggested fix
 pub fn get_status() -> QuickSearchStatus {
-    QuickSearchStatus {
-        provider: PROVIDER_NAME.to_string(),
-        db_loaded: true,
-        index_warmed: true,
-        last_refresh_ms: None,
-        last_error: None,
-    }
+    let probe = Command::new("mdfind")
+        .arg("-name")
+        .arg("touchai_spotlight_probe")
+        .stdout(Stdio::null())
+        .stderr(Stdio::piped())
+        .status();
+
+    match probe {
+        Ok(status) if status.success() => QuickSearchStatus {
+            provider: PROVIDER_NAME.to_string(),
+            db_loaded: true,
+            index_warmed: true,
+            last_refresh_ms: None,
+            last_error: None,
+        },
+        Ok(status) => QuickSearchStatus {
+            provider: "unavailable".to_string(),
+            db_loaded: false,
+            index_warmed: false,
+            last_refresh_ms: None,
+            last_error: Some(format!("Spotlight probe failed: {}", status)),
+        },
+        Err(error) => QuickSearchStatus {
+            provider: "unavailable".to_string(),
+            db_loaded: false,
+            index_warmed: false,
+            last_refresh_ms: None,
+            last_error: Some(format!("Spotlight probe failed: {}", error)),
+        },
+    }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
pub fn get_status() -> QuickSearchStatus {
QuickSearchStatus {
provider: PROVIDER_NAME.to_string(),
db_loaded: true,
index_warmed: true,
last_refresh_ms: None,
last_error: None,
}
pub fn get_status() -> QuickSearchStatus {
let probe = Command::new("mdfind")
.arg("-name")
.arg("touchai_spotlight_probe")
.stdout(Stdio::null())
.stderr(Stdio::piped())
.status();
match probe {
Ok(status) if status.success() => QuickSearchStatus {
provider: PROVIDER_NAME.to_string(),
db_loaded: true,
index_warmed: true,
last_refresh_ms: None,
last_error: None,
},
Ok(status) => QuickSearchStatus {
provider: "unavailable".to_string(),
db_loaded: false,
index_warmed: false,
last_refresh_ms: None,
last_error: Some(format!("Spotlight probe failed: {}", status)),
},
Err(error) => QuickSearchStatus {
provider: "unavailable".to_string(),
db_loaded: false,
index_warmed: false,
last_refresh_ms: None,
last_error: Some(format!("Spotlight probe failed: {}", error)),
},
}
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/desktop/src-tauri/src/core/search/provider_spotlight.rs` around lines 82
- 89, get_status() currently returns a hardcoded healthy QuickSearchStatus;
change it to actually probe Spotlight availability and reflect real state by
calling the Spotlight availability check (e.g., an existing helper like
is_spotlight_available() or the Spotlight client init used elsewhere) and set
QuickSearchStatus.provider to PROVIDER_NAME.to_string(), db_loaded and
index_warmed to true only if the probe succeeds, otherwise set them to false and
populate last_error (or last_refresh_ms) with the failure info; update
get_status() to catch errors from the probe and return an appropriate
QuickSearchStatus (provider name unchanged) so the frontend can detect an
unavailable provider.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:frontend Frontend UI or view-layer changes area:tauri Tauri shell or desktop runtime changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: QuickSearch 在 macOS/非 Windows 环境下触发窗口抖动且缺少本地文件搜索能力

1 participant