From 2e8d644945115b3f663979173d1e8013647ec73e Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 4 Jan 2026 20:48:46 +0800 Subject: [PATCH] feat(terminal): add quick input for control keys (#31) Signed-off-by: Ruihang Xia --- web/src/routes/sessions/terminal.tsx | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/web/src/routes/sessions/terminal.tsx b/web/src/routes/sessions/terminal.tsx index fa66f256..c833509b 100644 --- a/web/src/routes/sessions/terminal.tsx +++ b/web/src/routes/sessions/terminal.tsx @@ -42,6 +42,13 @@ function ConnectionIndicator(props: { status: 'idle' | 'connecting' | 'connected ) } +const QUICK_INPUTS = [ + { label: 'Esc', sequence: '\u001b', description: 'Escape' }, + { label: 'Tab', sequence: '\t', description: 'Tab' }, + { label: 'Home', sequence: '\u001b[H', description: 'Home' }, + { label: 'End', sequence: '\u001b[F', description: 'End' } +] + export default function TerminalPage() { const { sessionId } = useParams({ from: '/sessions/$sessionId/terminal' }) const { api, token } = useAppContext() @@ -154,6 +161,15 @@ export default function TerminalPage() { } }, [terminalState.status]) + const quickInputDisabled = !session?.active || terminalState.status !== 'connected' + const handleQuickInput = useCallback((sequence: string) => { + if (quickInputDisabled) { + return + } + write(sequence) + terminalRef.current?.focus() + }, [quickInputDisabled, write]) + if (!session) { return (
@@ -218,6 +234,26 @@ export default function TerminalPage() { />
+ +
+
+
+ {QUICK_INPUTS.map((input) => ( + + ))} +
+
+
) }