diff --git a/apps/code/src/renderer/features/terminal/services/TerminalManager.ts b/apps/code/src/renderer/features/terminal/services/TerminalManager.ts index 1c5c5f242..bd15de20c 100644 --- a/apps/code/src/renderer/features/terminal/services/TerminalManager.ts +++ b/apps/code/src/renderer/features/terminal/services/TerminalManager.ts @@ -273,6 +273,11 @@ class TerminalManagerImpl { handleExit(sessionId: string, exitCode?: number): void { const instance = this.instances.get(sessionId); if (instance) { + // Without this, ResizeObserver keeps firing shell.resize against the dead + // session on every layout shift, producing a TRPC error per call and + // wedging the renderer. + instance.isReady = false; + this.disconnectResizeObserver(instance); this.emit("exit", { sessionId, persistenceKey: instance.persistenceKey, @@ -281,6 +286,13 @@ class TerminalManagerImpl { } } + private disconnectResizeObserver(instance: TerminalInstance): void { + if (instance.resizeObserver) { + instance.resizeObserver.disconnect(); + instance.resizeObserver = null; + } + } + private scheduleSave(sessionId: string, instance: TerminalInstance): void { if (instance.saveTimeout) { clearTimeout(instance.saveTimeout); @@ -307,10 +319,7 @@ class TerminalManagerImpl { return; } - if (instance.resizeObserver) { - instance.resizeObserver.disconnect(); - instance.resizeObserver = null; - } + this.disconnectResizeObserver(instance); instance.attachedElement = element; @@ -355,10 +364,7 @@ class TerminalManagerImpl { return; } - if (instance.resizeObserver) { - instance.resizeObserver.disconnect(); - instance.resizeObserver = null; - } + this.disconnectResizeObserver(instance); const serialized = instance.serializeAddon.serialize(); this.emit("stateChange", {