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/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(
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..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,25 +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 b18359cd4..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,
@@ -71,10 +72,10 @@ export function UnifiedModelSelector({
fontSize: "var(--font-size-1)",
color: "var(--gray-11)",
padding: "4px 8px",
- marginLeft: "4px",
height: "auto",
minHeight: "unset",
gap: "6px",
+ userSelect: "none" as const,
};
if (isConnecting) {
@@ -123,6 +124,11 @@ export function UnifiedModelSelector({
{ADAPTER_ICONS[adapter]}
{currentLabel ?? "Model"}
+
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" ? (
s.prompts.length > 0);
+
const getPromptHistory = useCallback(
() => useTaskInputHistoryStore.getState().prompts,
[],
);
+ const hints = [
+ "@ to add files",
+ "/ for skills",
+ hasHistory ? "\u2191\u2193 for history" : "",
+ ]
+ .filter(Boolean)
+ .join(", ");
+
const {
editor,
isEmpty,
@@ -85,8 +95,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,
@@ -180,7 +189,7 @@ export const TaskInputEditor = forwardRef<
>
-
-
+
+