From 0bfe22ce1d4fc79ef72046626f9ea47f1361c3b7 Mon Sep 17 00:00:00 2001 From: Jinwoo-H Date: Thu, 30 Apr 2026 17:12:05 -0400 Subject: [PATCH] Revert "feat(settings): replace task-icon toggle with Tasks-button toggle, expose in View menu (#1271)" This reverts commit a02987e60495312d7baaf83f8e6f2ce2a3ed00f0. --- .../runtime-home-service.test.ts | 2 +- src/main/codex-accounts/service.test.ts | 2 +- src/main/index.ts | 38 +------ src/main/ipc/settings.ts | 16 +-- src/main/menu/register-app-menu.test.ts | 79 +------------ src/main/menu/register-app-menu.ts | 104 +++--------------- src/main/persistence.test.ts | 4 +- src/preload/api-types.ts | 4 - src/preload/index.ts | 11 +- .../components/settings/AppearancePane.tsx | 25 +++-- .../src/components/sidebar/SidebarNav.tsx | 50 +++++++-- src/renderer/src/hooks/useIpcEvents.test.ts | 24 ---- src/renderer/src/hooks/useIpcEvents.ts | 24 ---- src/shared/constants.ts | 2 +- src/shared/types.ts | 7 +- 15 files changed, 82 insertions(+), 310 deletions(-) diff --git a/src/main/codex-accounts/runtime-home-service.test.ts b/src/main/codex-accounts/runtime-home-service.test.ts index 2227c05bc26..d070b084ca4 100644 --- a/src/main/codex-accounts/runtime-home-service.test.ts +++ b/src/main/codex-accounts/runtime-home-service.test.ts @@ -64,7 +64,7 @@ function createSettings(overrides: Partial = {}): GlobalSettings openLinksInApp: false, rightSidebarOpenByDefault: true, showTitlebarAgentActivity: true, - showTasksButton: true, + showTaskProviderIcons: true, diffDefaultView: 'inline', notifications: { enabled: true, diff --git a/src/main/codex-accounts/service.test.ts b/src/main/codex-accounts/service.test.ts index fa8eb07d291..47ca0385162 100644 --- a/src/main/codex-accounts/service.test.ts +++ b/src/main/codex-accounts/service.test.ts @@ -58,7 +58,7 @@ function createSettings(overrides: Partial = {}): GlobalSettings openLinksInApp: false, rightSidebarOpenByDefault: true, showTitlebarAgentActivity: true, - showTasksButton: true, + showTaskProviderIcons: true, diffDefaultView: 'inline', notifications: { enabled: true, diff --git a/src/main/index.ts b/src/main/index.ts index c5c12176978..e98f2532552 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -18,7 +18,7 @@ import { registerCoreHandlers } from './ipc/register-core-handlers' import { triggerStartupNotificationRegistration } from './ipc/notifications' import { OrcaRuntimeService } from './runtime/orca-runtime' import { OrcaRuntimeRpcServer } from './runtime/runtime-rpc' -import { registerAppMenu, rebuildAppMenu } from './menu/register-app-menu' +import { registerAppMenu } from './menu/register-app-menu' import { checkForUpdatesFromMenu, isQuittingForUpdate } from './updater' import { configureDevUserDataPath, @@ -396,40 +396,8 @@ app.whenReady().then(async () => { onZoomReset: () => { mainWindow?.webContents.send('terminal:zoom', 'reset') }, - onToggleLeftSidebar: () => { - mainWindow?.webContents.send('ui:toggleLeftSidebar') - }, - onToggleRightSidebar: () => { - mainWindow?.webContents.send('ui:toggleRightSidebar') - }, - onToggleAppearance: (key) => { - if (!store) { - return - } - if (key === 'statusBarVisible') { - // Why: status bar visibility lives under the persisted UI state - // (ui:set/ui:get), not settings. The renderer owns the authoritative - // toggle logic (it knows the current value and persists it back), so - // we forward the event and let it flip + store. - mainWindow?.webContents.send('ui:toggleStatusBar') - return - } - const current = store.getSettings() - store.updateSettings({ [key]: !current[key] }) - // Why: settings:get returns the current snapshot; renderer tracks - // settings through window.api.settings.get(). Push the new value so - // the sidebar/titlebar re-render without waiting for a round-trip. - mainWindow?.webContents.send('settings:changed', { [key]: !current[key] }) - rebuildAppMenu() - }, - getAppearanceState: () => { - const settings = store?.getSettings() - const ui = store?.getUI() - return { - showTasksButton: settings?.showTasksButton !== false, - showTitlebarAgentActivity: settings?.showTitlebarAgentActivity !== false, - statusBarVisible: ui?.statusBarVisible !== false - } + onToggleStatusBar: () => { + mainWindow?.webContents.send('ui:toggleStatusBar') } }) runtimeRpc = new OrcaRuntimeRpcServer({ diff --git a/src/main/ipc/settings.ts b/src/main/ipc/settings.ts index 92aecef4868..323b652495a 100644 --- a/src/main/ipc/settings.ts +++ b/src/main/ipc/settings.ts @@ -3,16 +3,6 @@ import type { Store } from '../persistence' import type { GlobalSettings, PersistedState } from '../../shared/types' import { listSystemFontFamilies } from '../system-fonts' import { previewGhosttyImport } from '../ghostty/index' -import { rebuildAppMenu } from '../menu/register-app-menu' - -// Why: fields that appear in the View > Appearance submenu need the menu -// rebuilt after any update so the checkbox `checked` state stays in sync -// with the persisted value. Electron doesn't reactively re-render menu -// items when the backing state changes. -const APPEARANCE_MENU_KEYS: readonly (keyof GlobalSettings)[] = [ - 'showTasksButton', - 'showTitlebarAgentActivity' -] export function registerSettingsHandlers(store: Store): void { ipcMain.handle('settings:get', () => { @@ -23,11 +13,7 @@ export function registerSettingsHandlers(store: Store): void { if (args.theme) { nativeTheme.themeSource = args.theme } - const result = store.updateSettings(args) - if (APPEARANCE_MENU_KEYS.some((key) => key in args)) { - rebuildAppMenu() - } - return result + return store.updateSettings(args) }) ipcMain.handle('settings:listFonts', () => { diff --git a/src/main/menu/register-app-menu.test.ts b/src/main/menu/register-app-menu.test.ts index d28a0b51d56..6847f243622 100644 --- a/src/main/menu/register-app-menu.test.ts +++ b/src/main/menu/register-app-menu.test.ts @@ -30,14 +30,7 @@ function buildMenuOptions() { onZoomIn: vi.fn(), onZoomOut: vi.fn(), onZoomReset: vi.fn(), - onToggleLeftSidebar: vi.fn(), - onToggleRightSidebar: vi.fn(), - onToggleAppearance: vi.fn(), - getAppearanceState: vi.fn(() => ({ - showTasksButton: true, - showTitlebarAgentActivity: true, - statusBarVisible: true - })) + onToggleStatusBar: vi.fn() } } @@ -189,74 +182,4 @@ describe('registerAppMenu', () => { // No Help menu on macOS — About/Check for Updates live in the app menu. expect(template.find((item) => item.label === 'Help')).toBeUndefined() }) - - it('exposes an Appearance submenu under View with checkbox items reflecting state', () => { - const options = buildMenuOptions() - options.getAppearanceState.mockReturnValue({ - showTasksButton: false, - showTitlebarAgentActivity: true, - statusBarVisible: true - }) - registerAppMenu(options) - - const viewSubmenu = getSubmenu(getTemplate(), 'View') - const appearanceEntry = viewSubmenu.find((item) => item.label === 'Appearance') - expect(appearanceEntry).toBeDefined() - - const appearanceSubmenu = (appearanceEntry?.submenu ?? - []) as Electron.MenuItemConstructorOptions[] - const tasksItem = appearanceSubmenu.find((item) => item.label === 'Show Tasks Button') - expect(tasksItem?.type).toBe('checkbox') - expect(tasksItem?.checked).toBe(false) - - const titlebarItem = appearanceSubmenu.find( - (item) => item.label === 'Show Titlebar Agent Activity' - ) - expect(titlebarItem?.checked).toBe(true) - - const statusBarItem = appearanceSubmenu.find((item) => item.label === 'Show Status Bar') - expect(statusBarItem?.checked).toBe(true) - }) - - it('routes Appearance checkbox clicks through onToggleAppearance', () => { - const options = buildMenuOptions() - registerAppMenu(options) - - const viewSubmenu = getSubmenu(getTemplate(), 'View') - const appearanceSubmenu = (viewSubmenu.find((item) => item.label === 'Appearance')?.submenu ?? - []) as Electron.MenuItemConstructorOptions[] - - appearanceSubmenu - .find((item) => item.label === 'Show Tasks Button') - ?.click?.({} as never, {} as never, {} as never) - - expect(options.onToggleAppearance).toHaveBeenCalledWith('showTasksButton') - }) - - it('routes sidebar toggle items through their callbacks', () => { - const options = buildMenuOptions() - registerAppMenu(options) - - const viewSubmenu = getSubmenu(getTemplate(), 'View') - const appearanceSubmenu = (viewSubmenu.find((item) => item.label === 'Appearance')?.submenu ?? - []) as Electron.MenuItemConstructorOptions[] - - const leftLabel = `Toggle Left Sidebar\t${isMac ? 'Cmd+B' : 'Ctrl+B'}` - const rightLabel = `Toggle Right Sidebar\t${isMac ? 'Alt+Cmd+B' : 'Ctrl+Alt+B'}` - - appearanceSubmenu - .find((item) => item.label === leftLabel) - ?.click?.({} as never, {} as never, {} as never) - appearanceSubmenu - .find((item) => item.label === rightLabel) - ?.click?.({} as never, {} as never, {} as never) - - expect(options.onToggleLeftSidebar).toHaveBeenCalledTimes(1) - expect(options.onToggleRightSidebar).toHaveBeenCalledTimes(1) - // Why: these entries must not bind Cmd/Ctrl+B as real accelerators - // because before-input-event carries a TipTap-bold carve-out that the - // menu accelerator would bypass. - expect(appearanceSubmenu.find((item) => item.label === leftLabel)?.accelerator).toBeUndefined() - expect(appearanceSubmenu.find((item) => item.label === rightLabel)?.accelerator).toBeUndefined() - }) }) diff --git a/src/main/menu/register-app-menu.ts b/src/main/menu/register-app-menu.ts index d78a70d8c1b..776f48733b0 100644 --- a/src/main/menu/register-app-menu.ts +++ b/src/main/menu/register-app-menu.ts @@ -1,40 +1,23 @@ import { BrowserWindow, Menu, app } from 'electron' -export type AppearanceMenuState = { - showTasksButton: boolean - showTitlebarAgentActivity: boolean - statusBarVisible: boolean -} - -export type AppearanceMenuKey = keyof AppearanceMenuState - type RegisterAppMenuOptions = { onOpenSettings: () => void onCheckForUpdates: (options: { includePrerelease: boolean }) => void onZoomIn: () => void onZoomOut: () => void onZoomReset: () => void - onToggleLeftSidebar: () => void - onToggleRightSidebar: () => void - onToggleAppearance: (key: AppearanceMenuKey) => void - getAppearanceState: () => AppearanceMenuState + onToggleStatusBar: () => void } -function buildAndApplyMenu(options: RegisterAppMenuOptions): void { - const { - onOpenSettings, - onCheckForUpdates, - onZoomIn, - onZoomOut, - onZoomReset, - onToggleLeftSidebar, - onToggleRightSidebar, - onToggleAppearance, - getAppearanceState - } = options - +export function registerAppMenu({ + onOpenSettings, + onCheckForUpdates, + onZoomIn, + onZoomOut, + onZoomReset, + onToggleStatusBar +}: RegisterAppMenuOptions): void { const isMac = process.platform === 'darwin' - const appearance = getAppearanceState() const reloadFocusedWindow = (ignoreCache: boolean): void => { const webContents = BrowserWindow.getFocusedWindow()?.webContents @@ -142,53 +125,6 @@ function buildAndApplyMenu(options: RegisterAppMenuOptions): void { ] } - // Why: mirror VS Code's View > Appearance submenu so users can toggle - // sidebar/status-bar/tasks-button/titlebar-activity from the menu bar as - // well as from the settings pane. Electron doesn't reactively update - // menu items when the backing state changes, so rebuildAppMenu() must be - // called after every settings update — each build reads current - // appearance state through getAppearanceState() and produces a fresh - // template with accurate `checked` values. - const appearanceSubmenu: Electron.MenuItemConstructorOptions = { - label: 'Appearance', - submenu: [ - { - // Why: display-only shortcut hint — not a real accelerator. Cmd/Ctrl+B - // is intercepted in createMainWindow.ts's before-input-event handler - // with a TipTap-bold carve-out for markdown editors. Binding the - // accelerator here would steal the chord before that carve-out can - // fire. Sidebar open/closed lives in the renderer store (non-persisted), - // so we forward a toggle request rather than mirroring state in main. - label: `Toggle Left Sidebar\t${isMac ? 'Cmd+B' : 'Ctrl+B'}`, - click: () => onToggleLeftSidebar() - }, - { - // Why: display-only shortcut hint for the same reason as above. - label: `Toggle Right Sidebar\t${isMac ? 'Alt+Cmd+B' : 'Ctrl+Alt+B'}`, - click: () => onToggleRightSidebar() - }, - { - label: 'Show Status Bar', - type: 'checkbox', - checked: appearance.statusBarVisible, - click: () => onToggleAppearance('statusBarVisible') - }, - { type: 'separator' }, - { - label: 'Show Tasks Button', - type: 'checkbox', - checked: appearance.showTasksButton, - click: () => onToggleAppearance('showTasksButton') - }, - { - label: 'Show Titlebar Agent Activity', - type: 'checkbox', - checked: appearance.showTitlebarAgentActivity, - click: () => onToggleAppearance('showTitlebarAgentActivity') - } - ] - } - const viewMenu: Electron.MenuItemConstructorOptions = { label: 'View', submenu: [ @@ -242,7 +178,10 @@ function buildAndApplyMenu(options: RegisterAppMenuOptions): void { { type: 'separator' }, { role: 'togglefullscreen' }, { type: 'separator' }, - appearanceSubmenu + { + label: 'Toggle Status Bar', + click: () => onToggleStatusBar() + } ] } @@ -271,20 +210,3 @@ function buildAndApplyMenu(options: RegisterAppMenuOptions): void { Menu.setApplicationMenu(Menu.buildFromTemplate(template)) } - -let lastRegisterOptions: RegisterAppMenuOptions | null = null - -export function registerAppMenu(options: RegisterAppMenuOptions): void { - lastRegisterOptions = options - buildAndApplyMenu(options) -} - -/** Rebuild the application menu using the options from the most recent - * registerAppMenu call. Used to refresh checkbox `checked` state when - * settings that feed the Appearance submenu change, since Electron's - * menu items do not reactively re-render when the backing state updates. */ -export function rebuildAppMenu(): void { - if (lastRegisterOptions) { - buildAndApplyMenu(lastRegisterOptions) - } -} diff --git a/src/main/persistence.test.ts b/src/main/persistence.test.ts index 2f8081757eb..51f5a9087b7 100644 --- a/src/main/persistence.test.ts +++ b/src/main/persistence.test.ts @@ -77,7 +77,7 @@ describe('Store', () => { expect(settings.terminalFontSize).toBe(14) expect(settings.terminalFontWeight).toBe(500) expect(settings.rightSidebarOpenByDefault).toBe(true) - expect(settings.showTasksButton).toBe(true) + expect(settings.showTaskProviderIcons).toBe(true) }) it('returns default UI state when no data file exists', async () => { @@ -145,7 +145,7 @@ describe('Store', () => { expect(store.getSettings().editorAutoSaveDelayMs).toBe(1000) expect(store.getSettings().refreshLocalBaseRefOnWorktreeCreate).toBe(false) expect(store.getSettings().rightSidebarOpenByDefault).toBe(true) - expect(store.getSettings().showTasksButton).toBe(true) + expect(store.getSettings().showTaskProviderIcons).toBe(true) // repos should be loaded expect(store.getRepos()).toHaveLength(1) }) diff --git a/src/preload/api-types.ts b/src/preload/api-types.ts index 71369e0022d..af5875582f8 100644 --- a/src/preload/api-types.ts +++ b/src/preload/api-types.ts @@ -530,10 +530,6 @@ export type PreloadApi = { set: (args: Partial) => Promise listFonts: () => Promise previewGhosttyImport: () => Promise - /** Subscribe to out-of-band settings updates (e.g. the View > Appearance - * menu toggles) so the renderer can stay in sync with main's persisted - * state without round-tripping through settings:get. */ - onChanged: (callback: (updates: Partial) => void) => () => void } codexAccounts: { list: () => Promise diff --git a/src/preload/index.ts b/src/preload/index.ts index 59d80cbbcd4..83051cdce64 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -608,16 +608,7 @@ const api = { listFonts: (): Promise => ipcRenderer.invoke('settings:listFonts'), previewGhosttyImport: (): Promise => - ipcRenderer.invoke('settings:previewGhosttyImport'), - - onChanged: (callback: (updates: Record) => void): (() => void) => { - const listener = ( - _event: Electron.IpcRendererEvent, - updates: Record - ): void => callback(updates) - ipcRenderer.on('settings:changed', listener) - return () => ipcRenderer.removeListener('settings:changed', listener) - } + ipcRenderer.invoke('settings:previewGhosttyImport') }, codexAccounts: { diff --git a/src/renderer/src/components/settings/AppearancePane.tsx b/src/renderer/src/components/settings/AppearancePane.tsx index 1a314e0fbea..63588e83039 100644 --- a/src/renderer/src/components/settings/AppearancePane.tsx +++ b/src/renderer/src/components/settings/AppearancePane.tsx @@ -34,9 +34,9 @@ export const APPEARANCE_PANE_SEARCH_ENTRIES: SettingsSearchEntry[] = [ keywords: ['titlebar', 'agent', 'badge', 'active', 'count', 'status'] }, { - title: 'Show Tasks Button', - description: 'Show the Tasks button at the top of the left sidebar.', - keywords: ['tasks', 'sidebar', 'button', 'hide', 'show', 'github', 'linear'] + title: 'Task Provider Icons', + description: 'Show GitHub and Linear icons in the Tasks sidebar button.', + keywords: ['tasks', 'sidebar', 'github', 'linear', 'icons', 'badges'] } ] @@ -198,35 +198,36 @@ export function AppearancePane({

Sidebar

+

Tune the left sidebar chrome.

- +

- Show the Tasks button at the top of the left sidebar. + Show GitHub and Linear icons next to the Tasks button.

diff --git a/src/renderer/src/components/sidebar/SidebarNav.tsx b/src/renderer/src/components/sidebar/SidebarNav.tsx index 5d1c9478a6e..85aa69e514d 100644 --- a/src/renderer/src/components/sidebar/SidebarNav.tsx +++ b/src/renderer/src/components/sidebar/SidebarNav.tsx @@ -1,20 +1,26 @@ import React from 'react' -import { List } from 'lucide-react' +import { Github, List } from 'lucide-react' import { useAppStore } from '@/store' import { useRepoMap } from '@/store/selectors' import { cn } from '@/lib/utils' import { isGitRepoKind } from '../../../../shared/repo-kind' import { getTaskPresetQuery, PER_REPO_FETCH_LIMIT } from '@/lib/new-workspace' +function LinearIcon({ className }: { className?: string }): React.JSX.Element { + return ( + + + + ) +} + const SidebarNav = React.memo(function SidebarNav() { const openTaskPage = useAppStore((s) => s.openTaskPage) const activeView = useAppStore((s) => s.activeView) const repos = useAppStore((s) => s.repos) const repoMap = useRepoMap() const canBrowseTasks = repos.some((repo) => isGitRepoKind(repo)) - // Why: the setting is opt-out (default true). `!== false` keeps the button - // visible for users whose persisted settings predate this field. - const showTasksButton = useAppStore((s) => s.settings?.showTasksButton !== false) + const showTaskProviderIcons = useAppStore((s) => s.settings?.showTaskProviderIcons !== false) // Why: warm the GitHub work-item cache on hover/focus so by the time the // user's click finishes the round-trip has either completed or is already @@ -45,10 +51,6 @@ const SidebarNav = React.memo(function SidebarNav() { const tasksActive = activeView === 'tasks' - if (!showTasksButton) { - return null - } - return (
) diff --git a/src/renderer/src/hooks/useIpcEvents.test.ts b/src/renderer/src/hooks/useIpcEvents.test.ts index 14a23508543..eb8e760c1e1 100644 --- a/src/renderer/src/hooks/useIpcEvents.test.ts +++ b/src/renderer/src/hooks/useIpcEvents.test.ts @@ -178,9 +178,6 @@ describe('useIpcEvents updater integration', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: (listener: (status: unknown) => void) => { @@ -368,9 +365,6 @@ describe('useIpcEvents updater integration', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -556,9 +550,6 @@ describe('useIpcEvents updater integration', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -756,9 +747,6 @@ describe('useIpcEvents browser tab close routing', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -941,9 +929,6 @@ describe('useIpcEvents browser tab close routing', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -1121,9 +1106,6 @@ describe('useIpcEvents browser tab close routing', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -1310,9 +1292,6 @@ describe('useIpcEvents shortcut hint clearing', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, @@ -1506,9 +1485,6 @@ describe('useIpcEvents CLI-created worktree activation', () => { getZoomLevel: () => 0, set: vi.fn() }, - settings: { - onChanged: () => () => {} - }, updater: { getStatus: () => Promise.resolve({ state: 'idle' }), onStatus: () => () => {}, diff --git a/src/renderer/src/hooks/useIpcEvents.ts b/src/renderer/src/hooks/useIpcEvents.ts index 29496a806c6..74cce8e0dfb 100644 --- a/src/renderer/src/hooks/useIpcEvents.ts +++ b/src/renderer/src/hooks/useIpcEvents.ts @@ -45,30 +45,6 @@ export function useIpcEvents(): void { }) ) - // Why: the View > Appearance menu toggles settings directly in main (so - // checkbox state reflects the persisted value without a round-trip) and - // broadcasts the change. Merge it into the store so the sidebar and - // titlebar re-render immediately instead of waiting for the next - // fetchSettings() call. - unsubs.push( - window.api.settings.onChanged((updates) => { - const store = useAppStore.getState() - if (!store.settings) { - return - } - useAppStore.setState({ - settings: { - ...store.settings, - ...updates, - notifications: { - ...store.settings.notifications, - ...updates.notifications - } - } - }) - }) - ) - unsubs.push( window.api.ui.onToggleLeftSidebar(() => { dispatchClearModifierHints() diff --git a/src/shared/constants.ts b/src/shared/constants.ts index 04657a3bd04..ce003a184e7 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -160,7 +160,7 @@ export function getDefaultSettings(homedir: string): GlobalSettings { openLinksInApp: true, rightSidebarOpenByDefault: true, showTitlebarAgentActivity: true, - showTasksButton: true, + showTaskProviderIcons: true, notifications: getDefaultNotificationSettings(), diffDefaultView: 'inline', promptCacheTimerEnabled: false, diff --git a/src/shared/types.ts b/src/shared/types.ts index 648b8686e6a..ceb92eb8b36 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -950,10 +950,9 @@ export type GlobalSettings = { rightSidebarOpenByDefault: boolean /** Whether to show the live agent activity count badge in the titlebar. */ showTitlebarAgentActivity: boolean - /** Why: some users do not use the Tasks feature and prefer to keep the - * left sidebar free of its button entirely. Hiding the button here also - * removes it from keyboard navigation. */ - showTasksButton: boolean + /** Why: the Tasks sidebar label can be kept cleaner for users who do not + * actively use the GitHub/Linear integrations behind it. */ + showTaskProviderIcons: boolean diffDefaultView: 'inline' | 'side-by-side' notifications: NotificationSettings /** When true, a countdown timer is shown after a Claude agent becomes idle,