From fe315c4a73a32fefc2ae9e6ab3ebbfc3ba66e92a Mon Sep 17 00:00:00 2001 From: mukesh Date: Tue, 7 Jul 2026 20:58:25 +0530 Subject: [PATCH] fix(web): focus terminal when opening a session/agent view xterm's term.focus() was never called on attach, so users had to click inside the pane before typing worked. Expose focus() on the AttachableTerminal handle and call it from TerminalPane's mount effect once a session is actually attached. Fixes #2434 Co-Authored-By: Claude Sonnet 5 --- frontend/src/renderer/components/TerminalPane.tsx | 3 +++ frontend/src/renderer/components/XtermTerminal.tsx | 1 + frontend/src/renderer/hooks/useTerminalSession.test.tsx | 1 + frontend/src/renderer/hooks/useTerminalSession.ts | 1 + 4 files changed, 6 insertions(+) diff --git a/frontend/src/renderer/components/TerminalPane.tsx b/frontend/src/renderer/components/TerminalPane.tsx index 79367e1a38..c88246b44f 100644 --- a/frontend/src/renderer/components/TerminalPane.tsx +++ b/frontend/src/renderer/components/TerminalPane.tsx @@ -193,6 +193,9 @@ function AttachedTerminal({ session, theme, daemonReady, terminalTarget, fontSiz terminal.clear(); } hadAttachmentRef.current = true; + if (handleId) { + terminal.focus(); + } return attach(terminal); }, [terminal, handleId, attach, attachSession?.id]); diff --git a/frontend/src/renderer/components/XtermTerminal.tsx b/frontend/src/renderer/components/XtermTerminal.tsx index 102a642b65..1efef5ae12 100644 --- a/frontend/src/renderer/components/XtermTerminal.tsx +++ b/frontend/src/renderer/components/XtermTerminal.tsx @@ -555,6 +555,7 @@ export function XtermTerminal(props: XtermTerminalProps) { return { dispose: () => userInputListeners.delete(listener) }; }, onResize: (listener) => term.onResize(listener), + focus: () => term.focus(), }; callbacksRef.current.onReady?.(handle); diff --git a/frontend/src/renderer/hooks/useTerminalSession.test.tsx b/frontend/src/renderer/hooks/useTerminalSession.test.tsx index aa42387622..78ea4bd017 100644 --- a/frontend/src/renderer/hooks/useTerminalSession.test.tsx +++ b/frontend/src/renderer/hooks/useTerminalSession.test.tsx @@ -110,6 +110,7 @@ function createFakeTerminal(): FakeTerminal { clear: () => { terminal.clears += 1; }, + focus: () => {}, onUserInput: (listener) => { inputListeners.add(listener); return { dispose: () => inputListeners.delete(listener) }; diff --git a/frontend/src/renderer/hooks/useTerminalSession.ts b/frontend/src/renderer/hooks/useTerminalSession.ts index 0ecfcfc216..7b76968832 100644 --- a/frontend/src/renderer/hooks/useTerminalSession.ts +++ b/frontend/src/renderer/hooks/useTerminalSession.ts @@ -35,6 +35,7 @@ export type AttachableTerminal = { clear: () => void; onUserInput: (listener: (data: string, source: TerminalUserInputSource) => void) => { dispose: () => void }; onResize: (listener: (size: { cols: number; rows: number }) => void) => { dispose: () => void }; + focus: () => void; }; export type TerminalSessionState =