fix: launcher UI and AI suggestion improvements#240
Conversation
Move LauncherMain.Match → LauncherMatch, LauncherSuggestionType/LauncherSuggestion into dedicated model files. Extract search/suggestion business logic into LauncherViewModel, making LauncherMain a pure view (~114 lines). Consolidate MoveDirection and LauncherMouseHasMovedKey into LauncherEnvironment.swift. Remove duplicate SearchEngineService, unused toolbarManager EnvironmentObject, dead SuggestionFocus enum, and commented-out code. No behavior changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Recognize localhost as a valid host in isValidURL - Use http:// scheme for localhost in constructURL (devs typically use HTTP) - Require both scheme and host in appendOpenURLSuggestionIfNeeded so localhost:3000 (parsed as scheme=localhost, host=nil) falls through to constructURL instead of being used as-is - Fix 192.168.1.1:8080 which URL(string:) returns nil for, now falls through to isValidURL → constructURL correctly Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…eSite self.url is non-optional, so failedURL ?? self.url always produces URL. Use let instead of guard let to fix the build error. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The SVG is the referenced asset; the PNG was orphaned and causing an Xcode "unassigned child" warning. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Same pattern as the launcher fix — track first mouse movement with NSEvent monitor so keyboard-driven focus isn't hijacked by the cursor's resting position when the switcher appears. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add SSL bypass support in BrowserPage with per-host tracking - Handle URLAuthenticationChallenge to accept bypassed hosts - Add onContinueAnyway callback to StatusPageView for security errors - Add labelColorOverride to OraButton for muted ghost button styling - Wire continueToInsecureSite through BrowserWebContentView Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace broken regex patterns (checked via .contains instead of regex evaluation) with proper heuristic layers: question prefixes, question marks, imperative phrases, action keywords, and a word count threshold. Add negative signals to skip single words and valid URLs.
Skip showing the em-dash URL suffix when the suggestion title is already the URL itself. History items with distinct page titles still display their URL.
Replace RoundedRectangle and .cornerRadius with ConditionallyConcentricRectangle and .clipShape for concentric corner support on macOS 26+. Bump radii slightly (container 16→20, badges 6→8, suggestion rows 8→10).
Greptile SummaryThis PR delivers a significant refactor of the launcher UI alongside several functional improvements. The launcher's business logic is extracted from views into a dedicated
Confidence Score: 3/5
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[User types in Launcher] --> B{Input empty?}
B -->|Yes| C[Show default suggestions]
B -->|No| D[LauncherViewModel.searchHandler]
D --> E[Search open tabs]
D --> F[Check if valid URL]
D --> G[Append default engine suggestion]
D --> H[Request auto-suggestions via debouncer]
D --> I[Search history]
D --> J{isAISuitableQuery?}
J -->|Yes| K[Append AI chat suggestions]
J -->|No| L[Skip AI suggestions]
M[Navigation Error] --> N{Error type?}
N -->|Security| O[Show Continue Anyway button]
N -->|Other| P[Show Retry / Go Back]
O --> Q[Tab.continueToInsecureSite]
Q --> R[BrowserPage.bypassSSL for host]
R --> S[Host added to sslBypassedHosts permanently]
S --> T[Reload page with SSL bypass]
Last reviewed commit: 0f576e6 |
Summary