Skip to content

Commit 21bdd37

Browse files
jonathanlabclaude
andcommitted
Remove agent chat header and move raw logs toggle to context menu
Removed the deprecated agent chat header that contained run status indicators and various buttons. The raw ACP logs toggle has been moved to a right-click context menu for cleaner UI. Changes: - Removed "Agent Chat" header section from LogView - Removed run status indicators (Running/Idle) - Removed copy logs and cancel session buttons - Added Radix UI context menu to logs area - Raw ACP logs toggle now accessible via right-click checkbox - Cleaned up unused props and handlers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent ffd2566 commit 21bdd37

File tree

2 files changed

+41
-127
lines changed

2 files changed

+41
-127
lines changed

apps/array/src/renderer/features/logs/components/LogView.tsx

Lines changed: 41 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import type { SessionNotification } from "@agentclientprotocol/sdk";
22
import type { SessionEvent } from "@features/sessions/stores/sessionStore";
33
import { useAutoScroll } from "@hooks/useAutoScroll";
4-
import {
5-
Code as CodeIcon,
6-
Copy as CopyIcon,
7-
PaperPlaneRight as SendIcon,
8-
Stop as StopIcon,
9-
} from "@phosphor-icons/react";
4+
import { PaperPlaneRight as SendIcon } from "@phosphor-icons/react";
105
import {
116
Box,
127
Button,
138
Code,
9+
ContextMenu,
1410
Flex,
15-
Heading,
1611
IconButton,
1712
Text,
1813
TextArea,
@@ -26,7 +21,6 @@ interface LogViewProps {
2621
isRunning: boolean;
2722
isPromptPending?: boolean;
2823
onSendPrompt?: (text: string) => Promise<void>;
29-
onCancelSession?: () => void;
3024
onStartSession?: () => void;
3125
}
3226

@@ -62,7 +56,6 @@ export function LogView({
6256
isRunning,
6357
isPromptPending = false,
6458
onSendPrompt,
65-
onCancelSession,
6659
onStartSession,
6760
}: LogViewProps) {
6861
const [inputValue, setInputValue] = useState("");
@@ -97,21 +90,6 @@ export function LogView({
9790
[handleSend],
9891
);
9992

100-
const handleCopyLogs = () => {
101-
const logsText = events
102-
.map((event) => {
103-
if (event.type === "session_update") {
104-
return renderNotification(event.notification);
105-
}
106-
if (event.type === "acp_message") {
107-
return `[${event.direction}] ${JSON.stringify(event.message)}`;
108-
}
109-
return JSON.stringify(event);
110-
})
111-
.join("\n");
112-
navigator.clipboard.writeText(logsText);
113-
};
114-
11593
// Build rendered output from events (filter out raw acp_message unless showRawLogs is true)
11694
const renderedOutput: Array<{
11795
key: string;
@@ -170,101 +148,46 @@ export function LogView({
170148

171149
return (
172150
<Flex direction="column" height="100%">
173-
{/* Header */}
174-
<Box p="4" className="border-gray-6 border-b">
175-
<Flex align="center" justify="between">
176-
<Heading size="3">Agent Chat</Heading>
177-
<Flex align="center" gap="3">
178-
<Tooltip
179-
content={showRawLogs ? "Show pretty view" : "Show raw ACP logs"}
180-
>
181-
<IconButton
182-
size="2"
183-
variant={showRawLogs ? "solid" : "ghost"}
184-
color="gray"
185-
onClick={() => setShowRawLogs(!showRawLogs)}
186-
>
187-
<CodeIcon size={16} />
188-
</IconButton>
189-
</Tooltip>
190-
191-
<Tooltip content="Copy logs">
192-
<IconButton
193-
size="2"
194-
variant="ghost"
195-
color="gray"
196-
onClick={handleCopyLogs}
197-
>
198-
<CopyIcon size={16} />
199-
</IconButton>
200-
</Tooltip>
201-
202-
{isRunning && onCancelSession && (
203-
<Tooltip content="Cancel session">
204-
<Button size="2" color="red" onClick={onCancelSession}>
205-
<StopIcon size={16} weight="fill" />
206-
Cancel
207-
</Button>
208-
</Tooltip>
209-
)}
210-
211-
{isRunning ? (
212-
<Flex align="center" gap="2">
213-
<Box
214-
width="8px"
215-
height="8px"
216-
className="animate-pulse rounded-full bg-green-9"
217-
/>
218-
<Text size="2" color="gray">
219-
Running
220-
</Text>
221-
</Flex>
222-
) : (
223-
events.length > 0 && (
224-
<Flex align="center" gap="2">
225-
<Box
226-
width="8px"
227-
height="8px"
228-
className="rounded-full bg-accent-9"
229-
/>
230-
<Text size="2" color="gray">
231-
Idle
232-
</Text>
233-
</Flex>
234-
)
235-
)}
236-
</Flex>
237-
</Flex>
238-
</Box>
239-
240151
{/* Chat output */}
241-
<Box ref={scrollRef} flexGrow="1" overflowY="auto" p="4">
242-
<Box className="space-y-1 font-mono text-sm">
243-
{renderedOutput.map((item) => (
244-
<Code
245-
key={item.key}
246-
size="2"
247-
variant="ghost"
248-
className={`block whitespace-pre-wrap ${
249-
item.rawDirection === "client"
250-
? "text-cyan-11"
251-
: item.rawDirection === "agent"
252-
? "text-orange-11"
253-
: item.isUserMessage
254-
? "text-blue-11"
255-
: ""
256-
}`}
257-
>
258-
{item.text}
259-
</Code>
260-
))}
261-
{isPromptPending && (
262-
<Code size="2" variant="ghost" className="block text-gray-9">
263-
Thinking...
264-
</Code>
265-
)}
266-
</Box>
267-
</Box>
152+
<ContextMenu.Root>
153+
<ContextMenu.Trigger>
154+
<Box ref={scrollRef} flexGrow="1" overflowY="auto" p="4">
155+
<Box className="space-y-1 font-mono text-sm">
156+
{renderedOutput.map((item) => (
157+
<Code
158+
key={item.key}
159+
size="2"
160+
variant="ghost"
161+
className={`block whitespace-pre-wrap ${
162+
item.rawDirection === "client"
163+
? "text-cyan-11"
164+
: item.rawDirection === "agent"
165+
? "text-orange-11"
166+
: item.isUserMessage
167+
? "text-blue-11"
168+
: ""
169+
}`}
170+
>
171+
{item.text}
172+
</Code>
173+
))}
174+
{isPromptPending && (
175+
<Code size="2" variant="ghost" className="block text-gray-9">
176+
Thinking...
177+
</Code>
178+
)}
179+
</Box>
180+
</Box>
181+
</ContextMenu.Trigger>
182+
<ContextMenu.Content>
183+
<ContextMenu.CheckboxItem
184+
checked={showRawLogs}
185+
onCheckedChange={setShowRawLogs}
186+
>
187+
Show raw ACP logs
188+
</ContextMenu.CheckboxItem>
189+
</ContextMenu.Content>
190+
</ContextMenu.Root>
268191

269192
{/* Input area */}
270193
{sessionId && (

apps/array/src/renderer/features/task-detail/components/TaskLogsPanel.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ export function TaskLogsPanel({ taskId, task }: TaskLogsPanelProps) {
2626
// Get session state from store
2727
const session = useSessionStore((state) => state.getSessionForTask(taskId));
2828
const connectToTask = useSessionStore((state) => state.connectToTask);
29-
const disconnectFromTask = useSessionStore(
30-
(state) => state.disconnectFromTask,
31-
);
3229
const sendPrompt = useSessionStore((state) => state.sendPrompt);
3330

3431
const isRunning =
@@ -78,11 +75,6 @@ export function TaskLogsPanel({ taskId, task }: TaskLogsPanelProps) {
7875
[taskId, sendPrompt],
7976
);
8077

81-
const handleCancelSession = useCallback(async () => {
82-
await disconnectFromTask(taskId);
83-
log.info("Agent session cancelled");
84-
}, [taskId, disconnectFromTask]);
85-
8678
return (
8779
<BackgroundWrapper>
8880
<Box height="100%" width="100%">
@@ -92,7 +84,6 @@ export function TaskLogsPanel({ taskId, task }: TaskLogsPanelProps) {
9284
isRunning={isRunning}
9385
isPromptPending={session?.isPromptPending}
9486
onSendPrompt={handleSendPrompt}
95-
onCancelSession={handleCancelSession}
9687
onStartSession={handleStartSession}
9788
/>
9889
</Box>

0 commit comments

Comments
 (0)