From 8526f02c77aacb057c3551ceb32b2a1378952236 Mon Sep 17 00:00:00 2001 From: Jinjing <6427696+AmethystLiang@users.noreply.github.com> Date: Mon, 8 Jun 2026 10:31:34 -0700 Subject: [PATCH 01/13] Inline conflict count with snapshot timestamp in review panel (#4886) --- .../src/components/editor/ConflictComponents.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/renderer/src/components/editor/ConflictComponents.tsx b/src/renderer/src/components/editor/ConflictComponents.tsx index 8b6ff42f221..efff89a6de8 100644 --- a/src/renderer/src/components/editor/ConflictComponents.tsx +++ b/src/renderer/src/components/editor/ConflictComponents.tsx @@ -284,13 +284,14 @@ export function ConflictReviewPanel({ )} -
-
+
+ {unresolvedCount} unresolved conflict{unresolvedCount === 1 ? '' : 's'} -
-
+ + · + Snapshot captured at {snapshotTime}. -
+
- - - ) : null} - {hiddenExperimentalUnlocked ? : null} ) diff --git a/src/renderer/src/components/settings/experimental-search.ts b/src/renderer/src/components/settings/experimental-search.ts index 15ad2e7fdc6..47f12c6997e 100644 --- a/src/renderer/src/components/settings/experimental-search.ts +++ b/src/renderer/src/components/settings/experimental-search.ts @@ -79,26 +79,6 @@ export const EXPERIMENTAL_PANE_SEARCH_ENTRIES: SettingsSearchEntry[] = [ 'env', 'node_modules' ] - }, - { - title: 'Smart New Tab menu', - description: - 'Type in the New Tab menu to open a terminal, launch an agent, visit a URL, or open/create a file.', - keywords: [ - 'experimental', - 'smart', - 'new tab', - 'new tab menu', - 'launcher', - 'unified', - 'plus', - 'terminal', - 'agents', - 'claude', - 'codex', - 'url', - 'file' - ] } ] @@ -118,6 +98,5 @@ export const EXPERIMENTAL_SEARCH_ENTRY = { activity: findEntry('Agents View'), terminalAttention: findEntry('Terminal attention'), compactWorktreeCards: findEntry('Compact worktree cards'), - symlinks: findEntry('Symlinks on worktrees'), - unifiedNewTabLauncher: findEntry('Smart New Tab menu') + symlinks: findEntry('Symlinks on worktrees') } as const diff --git a/src/renderer/src/components/tab-bar/TabBar.tsx b/src/renderer/src/components/tab-bar/TabBar.tsx index 228a91bce46..6b3b2067abb 100644 --- a/src/renderer/src/components/tab-bar/TabBar.tsx +++ b/src/renderer/src/components/tab-bar/TabBar.tsx @@ -237,17 +237,11 @@ function TabBarInner({ const repo = worktree ? s.repos?.find((entry) => entry.id === worktree.repoId) : null return Boolean(repo?.connectionId) }) - const unifiedNewTabLauncherEnabled = useAppStore( - (s) => s.settings?.experimentalUnifiedNewTabLauncher === true - ) const defaultAgent = useAppStore((s) => s.settings?.defaultTuiAgent) const agentCmdOverrides = useAppStore( (s) => s.settings?.agentCmdOverrides ?? EMPTY_AGENT_CMD_OVERRIDES ) const connectionId = useAppStore((s) => { - if (!unifiedNewTabLauncherEnabled) { - return undefined - } const allWorktrees = Object.values(s.worktreesByRepo ?? {}).flat() const worktree = allWorktrees.find((w) => w.id === worktreeId) if (!worktree) { @@ -969,7 +963,7 @@ function TabBarInner({ { // Why: terminal-producing menu actions activate a freshly-mounted // xterm. Radix's default focus restore sends focus back to the "+" @@ -978,7 +972,7 @@ function TabBarInner({ runPendingNewTabMenuFocusAfterClose() }} > - {!terminalOnly && onOpenEntry && unifiedNewTabLauncherEnabled ? ( + {!terminalOnly && onOpenEntry ? ( <> unifiedTabsByWorktree: Record activeGroupIdByWorktree: Record + detectedAgentIds: string[] | null + remoteDetectedAgentIds: Record + isDetectingAgents: boolean + isDetectingRemoteAgents: Record } = { activeTabId: null, activeTabType: null, @@ -18,7 +22,11 @@ const appStoreSnapshot: { repos: [], worktreesByRepo: {}, unifiedTabsByWorktree: {}, - activeGroupIdByWorktree: {} + activeGroupIdByWorktree: {}, + detectedAgentIds: null, + remoteDetectedAgentIds: {}, + isDetectingAgents: false, + isDetectingRemoteAgents: {} } const pinTabMock: (tabId: string) => void = vi.fn() const unpinTabMock: (tabId: string) => void = vi.fn() @@ -33,6 +41,10 @@ const useAppStoreMock = vi.fn( worktreesByRepo: Record unifiedTabsByWorktree: Record activeGroupIdByWorktree: Record + detectedAgentIds: string[] | null + remoteDetectedAgentIds: Record + isDetectingAgents: boolean + isDetectingRemoteAgents: Record pinTab: typeof pinTabMock unpinTab: typeof unpinTabMock settings: { @@ -50,6 +62,10 @@ const useAppStoreMock = vi.fn( worktreesByRepo: appStoreSnapshot.worktreesByRepo, unifiedTabsByWorktree: appStoreSnapshot.unifiedTabsByWorktree, activeGroupIdByWorktree: appStoreSnapshot.activeGroupIdByWorktree, + detectedAgentIds: appStoreSnapshot.detectedAgentIds, + remoteDetectedAgentIds: appStoreSnapshot.remoteDetectedAgentIds, + isDetectingAgents: appStoreSnapshot.isDetectingAgents, + isDetectingRemoteAgents: appStoreSnapshot.isDetectingRemoteAgents, pinTab: pinTabMock, unpinTab: unpinTabMock, settings: { @@ -107,6 +123,10 @@ useAppStoreExport.getState = vi.fn(() => ({ worktreesByRepo: appStoreSnapshot.worktreesByRepo, unifiedTabsByWorktree: appStoreSnapshot.unifiedTabsByWorktree, activeGroupIdByWorktree: appStoreSnapshot.activeGroupIdByWorktree, + detectedAgentIds: appStoreSnapshot.detectedAgentIds, + remoteDetectedAgentIds: appStoreSnapshot.remoteDetectedAgentIds, + isDetectingAgents: appStoreSnapshot.isDetectingAgents, + isDetectingRemoteAgents: appStoreSnapshot.isDetectingRemoteAgents, pinTab: pinTabMock, unpinTab: unpinTabMock, settings: { diff --git a/src/renderer/src/components/tab-bar/TabBarCreateEntry.tsx b/src/renderer/src/components/tab-bar/TabBarCreateEntry.tsx index 8783fdecc61..90f07105945 100644 --- a/src/renderer/src/components/tab-bar/TabBarCreateEntry.tsx +++ b/src/renderer/src/components/tab-bar/TabBarCreateEntry.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useMemo, useRef, useState } from 'react' -import { FilePlus, FileText, Globe, Loader2, Search } from 'lucide-react' +import { FilePlus, FileText, Globe, Loader2 } from 'lucide-react' import { Input } from '@/components/ui/input' import { AgentIcon } from '@/lib/agent-catalog' import { cn } from '@/lib/utils' @@ -100,7 +100,7 @@ export default function TabBarCreateEntry({ const statusMessage = statusOption?.classification.kind === 'empty' || statusOption?.classification.kind === 'blocked' ? statusOption.classification.message - : 'URL, file, or new file' + : 'Open any file, URL, agent, ...' const submitOption = (option?: ActiveOption) => { if (disabled || pending) { @@ -143,7 +143,7 @@ export default function TabBarCreateEntry({ return (
{ event.preventDefault() submitOption() @@ -164,11 +164,7 @@ export default function TabBarCreateEntry({ }} onPointerDown={(event) => event.stopPropagation()} > -
-