fix(terminal): contain transient resize failures

This commit is contained in:
Justin Skowyra
2026-08-29 15:31:12 +08:00
committed by Menghuan1918
parent 2088ef6891
commit cdd5706f5b
3 changed files with 62 additions and 7 deletions
+22
View File
@@ -40,6 +40,28 @@ export function clampDims(cols: number, rows: number): { cols: number; rows: num
return { cols: clamp(cols), rows: clamp(rows) }
}
/**
* Best-effort resize for WebSocket-driven terminal views. Layout animation
* can briefly produce unusable dimensions, and node-pty can reject a resize
* after the socket setup's outer try/catch has returned. Ignore that one
* frame so the host stays alive and a later valid measurement can retry.
* Returns whether node-pty accepted the resize.
*/
export function tryResizePty(
pty: Pick<IPty, 'resize'>,
cols: number,
rows: number,
): boolean {
if (!Number.isFinite(cols) || !Number.isFinite(rows)) return false
const dims = clampDims(cols, rows)
try {
pty.resize(dims.cols, dims.rows)
return true
} catch {
return false
}
}
/**
* Serializable snapshot of one agent terminal — the shape the model sees
* through `terminal_list` and the sidebar sees through the push endpoint.
+3 -5
View File
@@ -41,7 +41,7 @@ import { launchExternal } from './open-external.ts'
import * as git from './git.ts'
import { SettingsConflictError, settingsNamespace, type SettingsNamespace } from '@deepseek-ai/dsh-settings'
import { defaultShell, ensureSpawnHelper, PtyManager, shellDisplayName } from './pty-manager.ts'
import { AgentPtyRegistry, clampDims, type AgentTerminalHandle } from './agent-pty.ts'
import { AgentPtyRegistry, tryResizePty, type AgentTerminalHandle } from './agent-pty.ts'
import {
DSH_NODE_PTY_RANGE,
depsStatus,
@@ -1199,8 +1199,7 @@ async function attachTerminal(
&& control.type === 'resize'
&& typeof control.cols === 'number' && typeof control.rows === 'number'
) {
const dims = clampDims(control.cols, control.rows)
handle.pty.resize(dims.cols, dims.rows)
tryResizePty(handle.pty, control.cols, control.rows)
} else {
handle.pty.write(text)
}
@@ -1268,8 +1267,7 @@ function pumpAgentTerminal(
&& control.type === 'resize'
&& typeof control.cols === 'number' && typeof control.rows === 'number'
) {
const dims = clampDims(control.cols, control.rows)
handle.pty.resize(dims.cols, dims.rows)
tryResizePty(handle.pty, control.cols, control.rows)
} else if (control === null) {
// Raw text input (a JSON-looking string the pty would have received
// verbatim is reachable in theory but is exotic for an agent terminal;