diff --git a/apps/desktop/src/lib/trpc/routers/terminal/terminal.ts b/apps/desktop/src/lib/trpc/routers/terminal/terminal.ts index 6a4875f1f9c..7ddaa8a2399 100644 --- a/apps/desktop/src/lib/trpc/routers/terminal/terminal.ts +++ b/apps/desktop/src/lib/trpc/routers/terminal/terminal.ts @@ -96,7 +96,6 @@ export const createTerminalRouter = () => { isNew: result.isNew, scrollback: result.scrollback, wasRecovered: result.wasRecovered, - viewportY: result.viewportY, }; }), @@ -152,7 +151,6 @@ export const createTerminalRouter = () => { .input( z.object({ paneId: z.string(), - viewportY: z.number().optional(), }), ) .mutation(async ({ input }) => { diff --git a/apps/desktop/src/main/lib/terminal/manager.ts b/apps/desktop/src/main/lib/terminal/manager.ts index 09c5e367beb..5603ec2fcbc 100644 --- a/apps/desktop/src/main/lib/terminal/manager.ts +++ b/apps/desktop/src/main/lib/terminal/manager.ts @@ -41,7 +41,6 @@ export class TerminalManager extends EventEmitter { isNew: false, scrollback: getSerializedScrollback(existing), wasRecovered: existing.wasRecovered, - viewportY: existing.viewportY, }; } @@ -239,8 +238,8 @@ export class TerminalManager extends EventEmitter { } } - detach(params: { paneId: string; viewportY?: number }): void { - const { paneId, viewportY } = params; + detach(params: { paneId: string }): void { + const { paneId } = params; const session = this.sessions.get(paneId); if (!session) { @@ -249,9 +248,6 @@ export class TerminalManager extends EventEmitter { } session.lastActive = Date.now(); - if (viewportY !== undefined) { - session.viewportY = viewportY; - } } clearScrollback(params: { paneId: string }): void { diff --git a/apps/desktop/src/main/lib/terminal/types.ts b/apps/desktop/src/main/lib/terminal/types.ts index f5968d218b9..1fdcf4169ca 100644 --- a/apps/desktop/src/main/lib/terminal/types.ts +++ b/apps/desktop/src/main/lib/terminal/types.ts @@ -19,8 +19,6 @@ export interface TerminalSession { shell: string; startTime: number; usedFallback: boolean; - /** Saved viewport scroll position for restoration on reattach */ - viewportY?: number; } export interface TerminalDataEvent { @@ -40,8 +38,6 @@ export interface SessionResult { isNew: boolean; scrollback: string; wasRecovered: boolean; - /** Saved viewport scroll position for restoration on reattach */ - viewportY?: number; } export interface CreateSessionParams { diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx index 027cf9eb4e4..03248c8f68c 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/Terminal.tsx @@ -25,12 +25,7 @@ import { parseCwd } from "./parseCwd"; import { ScrollToBottomButton } from "./ScrollToBottomButton"; import { TerminalSearch } from "./TerminalSearch"; import type { TerminalProps, TerminalStreamEvent } from "./types"; -import { - getScrollOffsetFromBottom, - restoreScrollPosition, - shellEscapePaths, - smoothScrollToBottom, -} from "./utils"; +import { shellEscapePaths, smoothScrollToBottom } from "./utils"; export const Terminal = ({ tabId, workspaceId }: TerminalProps) => { const paneId = tabId; @@ -385,12 +380,9 @@ export const Terminal = ({ tabId, workspaceId }: TerminalProps) => { wasRecovered: boolean; isNew: boolean; scrollback: string; - viewportY?: number; }) => { - xterm.write(result.scrollback, () => { - updateCwdRef.current(result.scrollback); - restoreScrollPosition(xterm, result.viewportY); - }); + xterm.write(result.scrollback); + updateCwdRef.current(result.scrollback); }; const restartTerminal = () => { @@ -569,10 +561,8 @@ export const Terminal = ({ tabId, workspaceId }: TerminalProps) => { unregisterClearCallbackRef.current(paneId); unregisterScrollToBottomCallbackRef.current(paneId); debouncedSetTabAutoTitleRef.current?.cancel?.(); - detachRef.current({ - paneId, - viewportY: getScrollOffsetFromBottom(xterm), - }); + // Detach instead of kill to keep PTY running for reattachment + detachRef.current({ paneId }); setSubscriptionEnabled(false); xterm.dispose(); xtermRef.current = null; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts index 4d2782b64c1..ded18432fff 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts @@ -16,22 +16,3 @@ export function smoothScrollToBottom(terminal: Terminal): void { terminal.scrollToBottom(); } } - -/** Get scroll offset from bottom (0 = at bottom, >0 = scrolled up N lines) */ -export function getScrollOffsetFromBottom(terminal: Terminal): number { - const { baseY, viewportY } = terminal.buffer.active; - return baseY - viewportY; -} - -/** Restore scroll position from offset (0 = bottom, >0 = N lines from bottom) */ -export function restoreScrollPosition( - terminal: Terminal, - offsetFromBottom: number | undefined, -): void { - if (offsetFromBottom && offsetFromBottom > 0) { - const targetLine = terminal.buffer.active.baseY - offsetFromBottom; - terminal.scrollToLine(Math.max(0, targetLine)); - } else { - terminal.scrollToBottom(); - } -}