From b2444c1f310552f443c4c22e45bbc660f1a35aac Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:03:27 -0700 Subject: [PATCH 01/11] Prevent text selection when clicking mode indicator --- .../features/message-editor/components/ModeIndicatorInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx index 7d2e9743b..723e85e14 100644 --- a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx +++ b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx @@ -91,7 +91,7 @@ export function ModeIndicatorInput({ align="center" justify="between" py="1" - style={onCycleMode ? { cursor: "pointer" } : undefined} + style={onCycleMode ? { cursor: "pointer", userSelect: "none" } : undefined} onClick={onCycleMode} > From 437dd7d334534105dc3c40546edbee57983c1e37 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:08:27 -0700 Subject: [PATCH 02/11] Update task input placeholder and contextual hints --- .../task-detail/components/TaskInputEditor.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx index 2b3dcc7e6..28b75d994 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx @@ -65,11 +65,23 @@ export const TaskInputEditor = forwardRef< const { isOnline } = useConnectivity(); const isSubmitDisabled = isCreatingTask || !isOnline; + const hasHistory = useTaskInputHistoryStore( + (s) => s.prompts.length > 0, + ); + const getPromptHistory = useCallback( () => useTaskInputHistoryStore.getState().prompts, [], ); + const hints = [ + "@ to add files", + "/ for commands and skills", + hasHistory ? "\u2191\u2193 for history" : "", + ] + .filter(Boolean) + .join(", "); + const { editor, isEmpty, @@ -85,8 +97,7 @@ export const TaskInputEditor = forwardRef< removeAttachment, } = useTiptapEditor({ sessionId, - placeholder: - "What do you want to work on? \u2191\u2193 for history, @ to add context", + placeholder: `What do you want to ship? ${hints}`, disabled: isCreatingTask, submitDisabled: !isOnline, isLoading: isCreatingTask, From ce78fded1409bf55c746d046caff58beb5fdf7ee Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:09:36 -0700 Subject: [PATCH 03/11] Reduce max prompt history from 50 to 15 --- .../features/message-editor/stores/taskInputHistoryStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts b/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts index 367166f50..9083e762a 100644 --- a/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts +++ b/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts @@ -11,7 +11,7 @@ interface TaskInputHistoryActions { type TaskInputHistoryStore = TaskInputHistoryState & TaskInputHistoryActions; -const MAX_HISTORY = 50; +const MAX_HISTORY = 15; export const useTaskInputHistoryStore = create()( persist( From 1d6761761fdd0f7b6934f4672cb9608300df006c Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:18:54 -0700 Subject: [PATCH 04/11] Standardize task input spacing and placeholder styling --- .../message-editor/components/ModeIndicatorInput.tsx | 2 +- .../features/message-editor/components/message-editor.css | 2 +- .../features/message-editor/tiptap/useTiptapEditor.ts | 2 +- .../features/sessions/components/ReasoningLevelSelector.tsx | 1 - .../features/sessions/components/UnifiedModelSelector.tsx | 1 - .../features/task-detail/components/TaskInputEditor.tsx | 6 +++--- 6 files changed, 6 insertions(+), 8 deletions(-) diff --git a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx index 723e85e14..2af032fd4 100644 --- a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx +++ b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx @@ -90,7 +90,7 @@ export function ModeIndicatorInput({ diff --git a/apps/code/src/renderer/features/message-editor/components/message-editor.css b/apps/code/src/renderer/features/message-editor/components/message-editor.css index 90d5e5c21..5beead9cb 100644 --- a/apps/code/src/renderer/features/message-editor/components/message-editor.css +++ b/apps/code/src/renderer/features/message-editor/components/message-editor.css @@ -1,7 +1,7 @@ /* Tiptap placeholder - targets empty first paragraph */ .cli-editor p.is-editor-empty:first-child::before { content: attr(data-placeholder); - color: var(--gray-11); + color: var(--gray-8); pointer-events: none; float: left; height: 0; diff --git a/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts b/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts index a5752157a..27761a1c3 100644 --- a/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts +++ b/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts @@ -38,7 +38,7 @@ export interface UseTiptapEditorOptions { } const EDITOR_CLASS = - "cli-editor min-h-[1.5em] w-full break-words border-none bg-transparent pr-2 text-[13px] text-[var(--gray-12)] outline-none [overflow-wrap:break-word] [white-space:pre-wrap] [word-break:break-word]"; + "cli-editor min-h-[1.5em] w-full break-words border-none bg-transparent pr-2 text-[14px] text-[var(--gray-12)] outline-none [overflow-wrap:break-word] [white-space:pre-wrap] [word-break:break-word]"; async function pasteTextAsFile( view: EditorView, diff --git a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx index df4b15c77..d3d47a17e 100644 --- a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx @@ -39,7 +39,6 @@ export function ReasoningLevelSelector({ fontSize: "var(--font-size-1)", color: "var(--gray-11)", padding: "4px 8px", - marginLeft: "4px", height: "auto", minHeight: "unset", gap: "6px", diff --git a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx index b18359cd4..dde644d73 100644 --- a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx @@ -71,7 +71,6 @@ export function UnifiedModelSelector({ fontSize: "var(--font-size-1)", color: "var(--gray-11)", padding: "4px 8px", - marginLeft: "4px", height: "auto", minHeight: "unset", gap: "6px", diff --git a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx index 28b75d994..852682a3e 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx @@ -191,7 +191,7 @@ export const TaskInputEditor = forwardRef< > - - + + Date: Sat, 11 Apr 2026 18:21:07 -0700 Subject: [PATCH 05/11] Standardize model and effort selectors to use same dropdown pattern --- .../components/ReasoningLevelSelector.tsx | 70 +++++++++++-------- .../components/UnifiedModelSelector.tsx | 7 ++ 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx index d3d47a17e..9270d9dee 100644 --- a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx @@ -1,6 +1,6 @@ import type { SessionConfigOption } from "@agentclientprotocol/sdk"; -import { Brain } from "@phosphor-icons/react"; -import { Flex, Select, Text } from "@radix-ui/themes"; +import { Brain, CaretDown, Check } from "@phosphor-icons/react"; +import { Button, DropdownMenu, Flex, Text } from "@radix-ui/themes"; import { flattenSelectOptions } from "../stores/sessionStore"; interface ReasoningLevelSelectorProps { @@ -10,6 +10,16 @@ interface ReasoningLevelSelectorProps { disabled?: boolean; } +const triggerStyle = { + fontSize: "var(--font-size-1)", + color: "var(--gray-11)", + padding: "4px 8px", + height: "auto", + minHeight: "unset", + gap: "6px", + userSelect: "none" as const, +}; + export function ReasoningLevelSelector({ thoughtOption, adapter, @@ -27,24 +37,9 @@ export function ReasoningLevelSelector({ options.find((opt) => opt.value === activeLevel)?.name ?? activeLevel; return ( - onChange?.(value)} - disabled={disabled} - size="1" - > - - + + + + + + {options.map((level) => ( - - {level.name} - + onChange?.(level.value)} + > + + + {level.name} + + ))} - - + + ); } diff --git a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx index dde644d73..738197f9f 100644 --- a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx @@ -5,6 +5,7 @@ import type { import type { AgentAdapter } from "@features/settings/stores/settingsStore"; import { ArrowsClockwise, + CaretDown, Check, Cpu, Robot, @@ -74,6 +75,7 @@ export function UnifiedModelSelector({ height: "auto", minHeight: "unset", gap: "6px", + userSelect: "none" as const, }; if (isConnecting) { @@ -122,6 +124,11 @@ export function UnifiedModelSelector({ {ADAPTER_ICONS[adapter]} {currentLabel ?? "Model"} + From 71ebf11b37641380d4398fe1b9ccffcf0ad64aac Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:24:50 -0700 Subject: [PATCH 06/11] Match branch selector trigger to other outline buttons --- .../components/ui/combobox/Combobox.css | 6 ++-- .../components/ui/combobox/Combobox.tsx | 36 ++++++++++--------- .../components/BranchSelector.tsx | 2 +- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/apps/code/src/renderer/components/ui/combobox/Combobox.css b/apps/code/src/renderer/components/ui/combobox/Combobox.css index b00067e84..06d2ce115 100644 --- a/apps/code/src/renderer/components/ui/combobox/Combobox.css +++ b/apps/code/src/renderer/components/ui/combobox/Combobox.css @@ -381,7 +381,7 @@ .combobox-trigger.size-1 { height: var(--space-5); - gap: var(--space-1); + gap: var(--space-2); font-size: var(--font-size-1); line-height: var(--line-height-1); letter-spacing: var(--letter-spacing-1); @@ -586,7 +586,7 @@ } .combobox-trigger.variant-outline { - color: var(--gray-11); + color: var(--gray-12); background-color: transparent; box-shadow: inset 0 0 0 1px var(--gray-a7); } @@ -609,7 +609,7 @@ } .combobox-trigger.variant-outline .combobox-trigger-icon { - color: var(--gray-11); + color: var(--gray-12); } .combobox-trigger:disabled .combobox-trigger-icon { diff --git a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx index 41a128115..7952b4e51 100644 --- a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx +++ b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx @@ -1,5 +1,7 @@ -import { CaretDown, Check, MagnifyingGlass } from "@phosphor-icons/react"; -import { Popover } from "@radix-ui/themes"; +import { Check, MagnifyingGlass } from "@phosphor-icons/react"; +import { ChevronDownIcon } from "@radix-ui/react-icons"; +import { Button, Flex, Popover } from "@radix-ui/themes"; +import type { Responsive } from "@radix-ui/themes/dist/esm/props/prop-def.js"; import { Command as CmdkCommand } from "cmdk"; import React, { createContext, @@ -150,7 +152,7 @@ function ComboboxRoot({ interface ComboboxTriggerProps { children?: React.ReactNode; className?: string; - variant?: ComboboxTriggerVariant; + variant?: "outline" | "ghost" | "surface" | "soft" | "classic"; color?: string; placeholder?: string; style?: React.CSSProperties; @@ -159,7 +161,7 @@ interface ComboboxTriggerProps { function ComboboxTrigger({ children, className = "", - variant = "surface", + variant = "outline", placeholder = "Select...", style, }: ComboboxTriggerProps) { @@ -167,25 +169,25 @@ function ComboboxTrigger({ const displayValue = children ?? (getItemLabel(value) || value || placeholder); - const hasPlaceholder = !children && !value; return ( - + + + {displayValue} + + {!disabled && } + + ); } diff --git a/apps/code/src/renderer/features/git-interaction/components/BranchSelector.tsx b/apps/code/src/renderer/features/git-interaction/components/BranchSelector.tsx index fa2264aec..ad9e10619 100644 --- a/apps/code/src/renderer/features/git-interaction/components/BranchSelector.tsx +++ b/apps/code/src/renderer/features/git-interaction/components/BranchSelector.tsx @@ -122,7 +122,7 @@ export function BranchSelector({ effectiveLoading || (isCloudMode && open && cloudBranchesFetchingMore); const triggerContent = ( - + {showSpinner ? ( ) : ( From 3600bc5f8b4d1190b52dd1f287f0b980d89b7d56 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Sat, 11 Apr 2026 18:27:03 -0700 Subject: [PATCH 07/11] Shorten placeholder hint to "/ for skills" --- .../features/task-detail/components/TaskInputEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx index 852682a3e..4103cc4f8 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx @@ -76,7 +76,7 @@ export const TaskInputEditor = forwardRef< const hints = [ "@ to add files", - "/ for commands and skills", + "/ for skills", hasHistory ? "\u2191\u2193 for history" : "", ] .filter(Boolean) From 2175d8f965767d52f9f5eefba6a50df74917b0ad Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Mon, 13 Apr 2026 12:05:46 -0700 Subject: [PATCH 08/11] Remove unused ComboboxTriggerVariant type --- apps/code/src/renderer/components/ui/combobox/Combobox.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx index 7952b4e51..d36c7dc2b 100644 --- a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx +++ b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx @@ -17,12 +17,6 @@ import "./Combobox.css"; import { useComboboxFilter } from "./useComboboxFilter"; type ComboboxSize = "1" | "2" | "3"; -type ComboboxTriggerVariant = - | "classic" - | "surface" - | "soft" - | "ghost" - | "outline"; type ComboboxContentVariant = "solid" | "soft"; interface ComboboxContextValue { From f37fad8a648babc166b5cd4c3d4d8cff7a9a89e3 Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Mon, 13 Apr 2026 12:06:39 -0700 Subject: [PATCH 09/11] Add no-drag to command center toolbar --- .../features/command-center/components/CommandCenterToolbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx b/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx index 60574aa6a..567574fba 100644 --- a/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx +++ b/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx @@ -118,7 +118,7 @@ export function CommandCenterToolbar({ gap="3" px="3" py="2" - className="shrink-0 border-gray-6 border-b" + className="no-drag shrink-0 border-gray-6 border-b" > Date: Mon, 13 Apr 2026 12:06:54 -0700 Subject: [PATCH 10/11] Add empty state to task list sidebar --- .../sidebar/components/TaskListView.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index 6d5f29456..e0d47a552 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -360,7 +360,22 @@ export function TaskListView({ } /> - {organizeMode === "by-project" ? ( + {pinnedTasks.length === 0 && + flatTasks.length === 0 && + groupedTasks.length === 0 ? ( +
+ + No tasks yet + + +
+ ) : organizeMode === "by-project" ? ( Date: Mon, 13 Apr 2026 12:47:44 -0700 Subject: [PATCH 11/11] lint --- .../features/message-editor/components/ModeIndicatorInput.tsx | 4 +++- .../features/task-detail/components/TaskInputEditor.tsx | 4 +--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx index 2af032fd4..aa5e0b847 100644 --- a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx +++ b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx @@ -91,7 +91,9 @@ export function ModeIndicatorInput({ align="center" justify="between" py="0" - style={onCycleMode ? { cursor: "pointer", userSelect: "none" } : undefined} + style={ + onCycleMode ? { cursor: "pointer", userSelect: "none" } : undefined + } onClick={onCycleMode} > diff --git a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx index 4103cc4f8..87bbac10e 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInputEditor.tsx @@ -65,9 +65,7 @@ export const TaskInputEditor = forwardRef< const { isOnline } = useConnectivity(); const isSubmitDisabled = isCreatingTask || !isOnline; - const hasHistory = useTaskInputHistoryStore( - (s) => s.prompts.length > 0, - ); + const hasHistory = useTaskInputHistoryStore((s) => s.prompts.length > 0); const getPromptHistory = useCallback( () => useTaskInputHistoryStore.getState().prompts,