diff --git a/Resources/Localizable.xcstrings b/Resources/Localizable.xcstrings index 1aeae10abf0d..8a2ed1e64b27 100644 --- a/Resources/Localizable.xcstrings +++ b/Resources/Localizable.xcstrings @@ -31049,25 +31049,115 @@ "en": { "stringUnit": { "state": "translated", - "value": "No workspaces or surfaces match your search." + "value": "No workspaces or tabs match your search." } }, "ja": { "stringUnit": { "state": "translated", - "value": "検索に一致するワークスペースまたはサーフェスはありません。" + "value": "検索に一致するワークスペースまたはタブはありません。" } }, - "uk": { + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "没有匹配的工作区或标签页。" + } + }, + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Робочі області чи поверхні, що відповідають пошуку, не знайдено." + "value": "沒有符合搜尋的工作區或標籤頁。" } }, "ko": { "stringUnit": { "state": "translated", - "value": "검색과 일치하는 워크스페이스 또는 서피스가 없습니다." + "value": "검색과 일치하는 워크스페이스 또는 탭이 없습니다." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Arbeitsbereiche oder Tabs entsprechen Ihrer Suche." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ningún espacio de trabajo o pestaña coincide con tu búsqueda." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun espace de travail ou onglet ne correspond à votre recherche." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna area di lavoro o scheda corrisponde alla ricerca." + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Ingen arbejdsområder eller faner matcher din søgning." + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Brak przestrzeni roboczych lub kart pasujących do wyszukiwania." + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Нет рабочих пространств или вкладок, соответствующих запросу." + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Nijedan radni prostor ili kartica ne odgovara vašoj pretrazi." + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "لا توجد مساحات عمل أو تبويبات تطابق بحثك." + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Ingen arbeidsområder eller faner samsvarer med søket ditt." + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma área de trabalho ou aba corresponde à sua pesquisa." + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ไม่มีเวิร์กสเปซหรือแท็บที่ตรงกับการค้นหาของคุณ" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Aramanızla eşleşen çalışma alanı veya sekme yok." + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Робочі області чи вкладки, що відповідають пошуку, не знайдено." } } } @@ -31197,25 +31287,115 @@ "en": { "stringUnit": { "state": "translated", - "value": "Search workspaces and surfaces" + "value": "Search workspaces and tabs" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ワークスペースとサーフェスを検索" + "value": "ワークスペースとタブを検索" } }, - "uk": { + "zh-Hans": { + "stringUnit": { + "state": "translated", + "value": "搜索工作区和标签页" + } + }, + "zh-Hant": { "stringUnit": { "state": "translated", - "value": "Пошук робочих областей і поверхонь" + "value": "搜尋工作區和標籤頁" } }, "ko": { "stringUnit": { "state": "translated", - "value": "워크스페이스 및 서피스 검색" + "value": "워크스페이스 및 탭 검색" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Arbeitsbereiche und Tabs durchsuchen" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar espacios de trabajo y pestañas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher des espaces de travail et des onglets" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca aree di lavoro e schede" + } + }, + "da": { + "stringUnit": { + "state": "translated", + "value": "Søg i arbejdsområder og faner" + } + }, + "pl": { + "stringUnit": { + "state": "translated", + "value": "Szukaj przestrzeni roboczych i kart" + } + }, + "ru": { + "stringUnit": { + "state": "translated", + "value": "Поиск рабочих пространств и вкладок" + } + }, + "bs": { + "stringUnit": { + "state": "translated", + "value": "Pretraži radne prostore i kartice" + } + }, + "ar": { + "stringUnit": { + "state": "translated", + "value": "البحث في مساحات العمل والتبويبات" + } + }, + "nb": { + "stringUnit": { + "state": "translated", + "value": "Søk i arbeidsområder og faner" + } + }, + "pt-BR": { + "stringUnit": { + "state": "translated", + "value": "Pesquisar áreas de trabalho e abas" + } + }, + "th": { + "stringUnit": { + "state": "translated", + "value": "ค้นหาเวิร์กสเปซและแท็บ" + } + }, + "tr": { + "stringUnit": { + "state": "translated", + "value": "Çalışma alanlarını ve sekmeleri ara" + } + }, + "uk": { + "stringUnit": { + "state": "translated", + "value": "Пошук робочих областей і вкладок" } } } @@ -42775,115 +42955,115 @@ "en": { "stringUnit": { "state": "translated", - "value": "Go to Workspace…" + "value": "Go to Workspace or Tab…" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ワークスペースに移動…" + "value": "ワークスペースまたはタブに移動…" } }, "zh-Hans": { "stringUnit": { "state": "translated", - "value": "前往工作区..." + "value": "前往工作区或标签页…" } }, "zh-Hant": { "stringUnit": { "state": "translated", - "value": "前往工作區..." + "value": "前往工作區或標籤頁…" } }, "ko": { "stringUnit": { "state": "translated", - "value": "작업 공간으로 이동…" + "value": "작업 공간 또는 탭으로 이동…" } }, "de": { "stringUnit": { "state": "translated", - "value": "Zum Arbeitsbereich wechseln …" + "value": "Zum Arbeitsbereich oder Tab wechseln …" } }, "es": { "stringUnit": { "state": "translated", - "value": "Ir al espacio de trabajo…" + "value": "Ir al espacio de trabajo o pestaña…" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Aller à l'espace de travail..." + "value": "Aller à l'espace de travail ou à l'onglet…" } }, "it": { "stringUnit": { "state": "translated", - "value": "Vai all'area di lavoro…" + "value": "Vai all'area di lavoro o alla scheda…" } }, "da": { "stringUnit": { "state": "translated", - "value": "Gå til arbejdsområde…" + "value": "Gå til arbejdsområde eller fane…" } }, "pl": { "stringUnit": { "state": "translated", - "value": "Przejdź do przestrzeni roboczej…" + "value": "Przejdź do przestrzeni roboczej lub karty…" } }, "ru": { "stringUnit": { "state": "translated", - "value": "Перейти к рабочему пространству..." + "value": "Перейти к рабочему пространству или вкладке…" } }, "bs": { "stringUnit": { "state": "translated", - "value": "Idi na radni prostor…" + "value": "Idi na radni prostor ili karticu…" } }, "ar": { "stringUnit": { "state": "translated", - "value": "الانتقال إلى مساحة العمل…" + "value": "الانتقال إلى مساحة العمل أو تبويب…" } }, "nb": { "stringUnit": { "state": "translated", - "value": "Gå til arbeidsområde …" + "value": "Gå til arbeidsområde eller fane …" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Ir para Área de Trabalho…" + "value": "Ir para Área de Trabalho ou aba…" } }, "th": { "stringUnit": { "state": "translated", - "value": "ไปที่เวิร์กสเปซ..." + "value": "ไปที่เวิร์กสเปซหรือแท็บ…" } }, "tr": { "stringUnit": { "state": "translated", - "value": "Çalışma Alanına Git…" + "value": "Çalışma Alanına veya Sekmeye Git…" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Перейти до робочої області…" + "value": "Перейти до робочої області або вкладки…" } } } @@ -53527,25 +53707,25 @@ "en": { "stringUnit": { "state": "translated", - "value": "Command Palette Searches All Surfaces" + "value": "Command Palette Searches Tabs" } }, "ja": { "stringUnit": { "state": "translated", - "value": "コマンドパレットですべてのサーフェスを検索" + "value": "コマンドパレットでタブを検索" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Палітра команд шукає всі поверхні" + "value": "Палітра команд шукає вкладки" } }, "ko": { "stringUnit": { "state": "translated", - "value": "명령어 팔레트에서 모든 서피스 검색" + "value": "명령어 팔레트에서 탭 검색" } } } @@ -53585,25 +53765,25 @@ "en": { "stringUnit": { "state": "translated", - "value": "Cmd+P also matches terminal, browser, and markdown surfaces across workspaces." + "value": "Cmd+P also matches tab titles across workspaces." } }, "ja": { "stringUnit": { "state": "translated", - "value": "Cmd+Pでワークスペースをまたいだターミナル、ブラウザ、Markdownのサーフェスも検索できます。" + "value": "Cmd+Pでワークスペースをまたいだタブタイトルも検索できます。" } }, "uk": { "stringUnit": { "state": "translated", - "value": "Cmd+P також шукає термінали, браузери та markdown-поверхні у всіх робочих областях." + "value": "Cmd+P також шукає назви вкладок у всіх робочих областях." } }, "ko": { "stringUnit": { "state": "translated", - "value": "Cmd+P가 모든 워크스페이스의 터미널, 브라우저, 마크다운 서피스도 검색합니다." + "value": "Cmd+P가 모든 워크스페이스의 탭 제목도 검색합니다." } } } @@ -74915,13 +75095,13 @@ "en": { "stringUnit": { "state": "translated", - "value": "app.commandPaletteSearchesAllSurfaces command palette search all surfaces cmd-p terminal browser markdown" + "value": "app.commandPaletteSearchesAllSurfaces command palette search tabs tab titles cmd-p terminal browser markdown" } }, "ja": { "stringUnit": { "state": "translated", - "value": "app.commandPaletteSearchesAllSurfaces command palette search all surfaces cmd-p terminal browser markdown コマンドパレット すべて検索 サーフェス ターミナル ブラウザ markdown" + "value": "app.commandPaletteSearchesAllSurfaces command palette search tabs tab titles cmd-p terminal browser markdown コマンドパレット タブ検索 タイトル ターミナル ブラウザ markdown" } }, "ar": { diff --git a/Sources/CommandPalette/CommandPaletteSettingsToggle.swift b/Sources/CommandPalette/CommandPaletteSettingsToggle.swift index 9fa5b69771ce..f89003c595be 100644 --- a/Sources/CommandPalette/CommandPaletteSettingsToggle.swift +++ b/Sources/CommandPalette/CommandPaletteSettingsToggle.swift @@ -310,11 +310,11 @@ enum CommandPaletteSettingsToggleCommands { title: { String( localized: "settings.app.commandPaletteSearchAllSurfaces", - defaultValue: "Command Palette Searches All Surfaces" + defaultValue: "Command Palette Searches Tabs" ) }, sectionTitle: app, - keywords: ["app.commandPaletteSearchesAllSurfaces", "command", "palette", "search", "surfaces", "workspace"], + keywords: ["app.commandPaletteSearchesAllSurfaces", "command", "palette", "search", "tabs", "tab", "titles", "workspace"], defaultValue: CommandPaletteSwitcherSearchSettings.defaultSearchAllSurfaces, defaultsKey: CommandPaletteSwitcherSearchSettings.searchAllSurfacesKey ), diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 9e7e5f2c0f82..ccbd6752c8f6 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -4941,7 +4941,7 @@ struct ContentView: View { return String(localized: "commandPalette.search.commandsPlaceholder", defaultValue: "Type a command") case .switcher: return commandPaletteSearchAllSurfaces - ? String(localized: "commandPalette.search.switcherPlaceholderAllSurfaces", defaultValue: "Search workspaces and surfaces") + ? String(localized: "commandPalette.search.switcherPlaceholderAllSurfaces", defaultValue: "Search workspaces and tabs") : String(localized: "commandPalette.search.switcherPlaceholder", defaultValue: "Search workspaces") } } @@ -4952,7 +4952,7 @@ struct ContentView: View { return String(localized: "commandPalette.search.commandsEmpty", defaultValue: "No commands match your search.") case .switcher: return commandPaletteSearchAllSurfaces - ? String(localized: "commandPalette.search.switcherEmptyAllSurfaces", defaultValue: "No workspaces or surfaces match your search.") + ? String(localized: "commandPalette.search.switcherEmptyAllSurfaces", defaultValue: "No workspaces or tabs match your search.") : String(localized: "commandPalette.search.switcherEmpty", defaultValue: "No workspaces match your search.") } } diff --git a/Sources/KeyboardShortcutSettings.swift b/Sources/KeyboardShortcutSettings.swift index 2ea912c3767d..3a8768289b40 100644 --- a/Sources/KeyboardShortcutSettings.swift +++ b/Sources/KeyboardShortcutSettings.swift @@ -156,7 +156,7 @@ enum KeyboardShortcutSettings { case .newTab: return String(localized: "shortcut.newWorkspace.label", defaultValue: "New Workspace") case .openFolder: return String(localized: "shortcut.openFolder.label", defaultValue: "Open Folder") case .reopenPreviousSession: return String(localized: "shortcut.reopenPreviousSession.label", defaultValue: "Reopen Previous Session") - case .goToWorkspace: return String(localized: "menu.file.goToWorkspace", defaultValue: "Go to Workspace…") + case .goToWorkspace: return String(localized: "menu.file.goToWorkspace", defaultValue: "Go to Workspace or Tab…") case .commandPalette: return String(localized: "menu.file.commandPalette", defaultValue: "Command Palette…") case .commandPaletteNext: return String(localized: "shortcut.commandPaletteNext.label", defaultValue: "Command Palette: Next") case .commandPalettePrevious: return String(localized: "shortcut.commandPalettePrevious.label", defaultValue: "Command Palette: Previous") diff --git a/Sources/SettingsNavigation.swift b/Sources/SettingsNavigation.swift index f395f9800a4f..c1eb20777292 100644 --- a/Sources/SettingsNavigation.swift +++ b/Sources/SettingsNavigation.swift @@ -316,7 +316,7 @@ enum SettingsSearchIndex { setting(.app, "warn-before-quit", String(localized: "settings.app.warnBeforeQuit", defaultValue: "Warn Before Quit"), "cmd q confirmation"), setting(.app, "warn-before-closing-tab", String(localized: "settings.app.warnBeforeClosingTab", defaultValue: "Warn Before Closing Tab"), "cmd w close tab confirmation"), setting(.app, "rename-selects-name", String(localized: "settings.app.renameSelectsName", defaultValue: "Rename Selects Existing Name"), "command palette rename text selection"), - setting(.app, "palette-search-all", String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches All Surfaces"), "cmd p search terminal browser markdown"), + setting(.app, "palette-search-all", String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches Tabs"), "cmd p search tab title terminal browser markdown"), setting(.terminal, "scrollbar", String(localized: "settings.terminal.scrollBar", defaultValue: "Show Terminal Scroll Bar"), "terminal shell scrollback"), setting(.terminal, "agent-auto-resume", String(localized: "settings.terminal.agentAutoResume", defaultValue: "Resume Agent Sessions on Reopen"), "terminal.autoResumeAgentSessions auto resume restore reopen relaunch quit sessions agents claude code codex opencode rovo dev rovodev toggle"), setting(.sidebarAppearance, "match-terminal", String(localized: "settings.sidebarAppearance.matchTerminalBackground", defaultValue: "Match Terminal Background"), "sidebar material transparency"), diff --git a/Sources/SettingsSearchAliases.swift b/Sources/SettingsSearchAliases.swift index 3af6970fa445..28e98f5558af 100644 --- a/Sources/SettingsSearchAliases.swift +++ b/Sources/SettingsSearchAliases.swift @@ -66,7 +66,7 @@ enum SettingsSearchAliasIndex { "app:warn-before-quit": localized("settings.search.alias.setting.app.warn-before-quit", defaultValue: "app.warnBeforeQuit quit confirmation command-q cmd-q exit close app"), "app:warn-before-closing-tab": localized("settings.search.alias.setting.app.warn-before-closing-tab", defaultValue: "app.warnBeforeClosingTab close tab confirmation command-w cmd-w terminal surface"), "app:rename-selects-name": localized("settings.search.alias.setting.app.rename-selects-name", defaultValue: "app.renameSelectsExistingName rename select all existing title command palette workspace name"), - "app:palette-search-all": localized("settings.search.alias.setting.app.palette-search-all", defaultValue: "app.commandPaletteSearchesAllSurfaces command palette search all surfaces cmd-p terminal browser markdown"), + "app:palette-search-all": localized("settings.search.alias.setting.app.palette-search-all", defaultValue: "app.commandPaletteSearchesAllSurfaces command palette search tabs tab titles cmd-p terminal browser markdown"), "terminal:scrollbar": localized("settings.search.alias.setting.terminal.scrollbar", defaultValue: "terminal.showScrollBar scrollback scrollbar scroll bar right edge alternate screen tui"), "sidebarAppearance:match-terminal": localized("settings.search.alias.setting.sidebarAppearance.match-terminal", defaultValue: "sidebarAppearance.matchTerminalBackground transparent background material terminal background sync"), "sidebarAppearance:hide-sidebar-details": localized("settings.search.alias.setting.app.hide-sidebar-details", defaultValue: "sidebar.hideAllDetails compact sidebar hide details only title minimal left rail"), diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 9c6f0326da7d..63c03da442a1 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -506,7 +506,7 @@ struct cmuxApp: App { // Close tab/workspace CommandGroup(after: .newItem) { - splitCommandButton(title: String(localized: "menu.file.goToWorkspace", defaultValue: "Go to Workspace…"), shortcut: menuShortcut(for: .goToWorkspace)) { + splitCommandButton(title: String(localized: "menu.file.goToWorkspace", defaultValue: "Go to Workspace or Tab…"), shortcut: menuShortcut(for: .goToWorkspace)) { let targetWindow = NSApp.keyWindow ?? NSApp.mainWindow NotificationCenter.default.post(name: .commandPaletteSwitcherRequested, object: targetWindow) } @@ -4637,7 +4637,7 @@ enum CommandPaletteRenameSelectionSettings { enum CommandPaletteSwitcherSearchSettings { static let searchAllSurfacesKey = "commandPalette.switcherSearchAllSurfaces" - static let defaultSearchAllSurfaces = false + static let defaultSearchAllSurfaces = true static func searchAllSurfacesEnabled(defaults: UserDefaults = .standard) -> Bool { if defaults.object(forKey: searchAllSurfacesKey) == nil { @@ -6189,9 +6189,9 @@ struct SettingsView: View { SettingsCardRow( configurationReview: .json("app.commandPaletteSearchesAllSurfaces"), - String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches All Surfaces"), + String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches Tabs"), subtitle: commandPaletteSearchAllSurfaces - ? String(localized: "settings.app.commandPaletteSearchAllSurfaces.subtitleOn", defaultValue: "Cmd+P also matches panel surfaces across workspaces.") + ? String(localized: "settings.app.commandPaletteSearchAllSurfaces.subtitleOn", defaultValue: "Cmd+P also matches tab titles across workspaces.") : String(localized: "settings.app.commandPaletteSearchAllSurfaces.subtitleOff", defaultValue: "Cmd+P matches workspace rows only.") ) { Toggle("", isOn: $commandPaletteSearchAllSurfaces) @@ -6199,7 +6199,7 @@ struct SettingsView: View { .controlSize(.small) .accessibilityIdentifier("CommandPaletteSearchAllSurfacesToggle") .accessibilityLabel( - String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches All Surfaces") + String(localized: "settings.app.commandPaletteSearchAllSurfaces", defaultValue: "Command Palette Searches Tabs") ) } diff --git a/cmuxTests/CommandPaletteSearchEngineTests.swift b/cmuxTests/CommandPaletteSearchEngineTests.swift index 2f69dfa663b1..3bd650e03e11 100644 --- a/cmuxTests/CommandPaletteSearchEngineTests.swift +++ b/cmuxTests/CommandPaletteSearchEngineTests.swift @@ -632,6 +632,96 @@ final class CommandPaletteSearchEngineTests: XCTestCase { XCTAssertFalse(workspaceOnlyInputs.includesSurfaces) } + func testDefaultSwitcherSearchIncludesSurfacesForTabTitleQueries() { + let suiteName = "CommandPaletteSearchEngineTests.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Expected isolated UserDefaults suite") + return + } + defaults.removeObject(forKey: CommandPaletteSwitcherSearchSettings.searchAllSurfacesKey) + defer { defaults.removePersistentDomain(forName: suiteName) } + + XCTAssertTrue(CommandPaletteSwitcherSearchSettings.searchAllSurfacesEnabled(defaults: defaults)) + + let inputs = ContentView.commandPaletteRefreshInputsForTests( + stateQuery: "", + observedQuery: "server logs", + searchAllSurfaces: CommandPaletteSwitcherSearchSettings.searchAllSurfacesEnabled(defaults: defaults) + ) + XCTAssertEqual(inputs.scope, "switcher") + XCTAssertEqual(inputs.matchingQuery, "server logs") + XCTAssertTrue(inputs.includesSurfaces) + } + + func testExplicitSwitcherSearchOptOutKeepsWorkspaceOnlyQueries() { + let suiteName = "CommandPaletteSearchEngineTests.\(UUID().uuidString)" + guard let defaults = UserDefaults(suiteName: suiteName) else { + XCTFail("Expected isolated UserDefaults suite") + return + } + defaults.set(false, forKey: CommandPaletteSwitcherSearchSettings.searchAllSurfacesKey) + defer { defaults.removePersistentDomain(forName: suiteName) } + + XCTAssertFalse(CommandPaletteSwitcherSearchSettings.searchAllSurfacesEnabled(defaults: defaults)) + + let inputs = ContentView.commandPaletteRefreshInputsForTests( + stateQuery: "", + observedQuery: "server logs", + searchAllSurfaces: CommandPaletteSwitcherSearchSettings.searchAllSurfacesEnabled(defaults: defaults) + ) + XCTAssertEqual(inputs.scope, "switcher") + XCTAssertEqual(inputs.matchingQuery, "server logs") + XCTAssertFalse(inputs.includesSurfaces) + } + + func testSwitcherTabTitleQueryFindsTabEntry() throws { + let entries = [ + FixtureEntry( + id: "switcher.workspace.production", + rank: 0, + title: "Production", + searchableTexts: ["Production", "Workspace", "workspace", "switch", "go", "open"] + ), + FixtureEntry( + id: "switcher.surface.server-logs", + rank: 1, + title: "Server Logs", + searchableTexts: [ + "Server Logs", + "Production", + "Terminal", + "surface", + "tab", + "switch", + "go", + "open" + ] + ), + FixtureEntry( + id: "switcher.surface.build-queue", + rank: 2, + title: "Build Queue", + searchableTexts: [ + "Build Queue", + "Production", + "Terminal", + "surface", + "tab", + "switch", + "go", + "open" + ] + ), + ] + + let results = optimizedResults(entries: entries, query: "server logs") + + let first = try XCTUnwrap(results.first) + XCTAssertEqual(first.id, "switcher.surface.server-logs") + XCTAssertEqual(first.title, "Server Logs") + XCTAssertFalse(first.titleMatchIndices.isEmpty) + } + func testCommandContextFingerprintTracksExactContextValues() { let base = ContentView.commandPaletteContextFingerprint( boolValues: [