diff --git a/server/chat.ts b/server/chat.ts index 0a8e681b..e095a402 100644 --- a/server/chat.ts +++ b/server/chat.ts @@ -1273,7 +1273,16 @@ export async function interruptChat( ); await Promise.allSettled(stops); } - await session.queryInstance.interrupt(); + try { + await session.queryInstance.interrupt(); + } catch (err: unknown) { + // ProcessTransport may already be dead (process exited) — the interrupt + // is moot in that case. Swallow rather than crashing the server. + log.warn('interrupt() failed (transport likely dead)', { + clientId, + err: err instanceof Error ? err.message : String(err), + }); + } // Only push to inputQueue on first delivery — a retried interrupt should // still call interrupt() (to halt the agent) but not double-queue the prompt. if (!isDup) { diff --git a/server/ws-handler-v2.ts b/server/ws-handler-v2.ts index 32d9d5a1..cfed15e0 100644 --- a/server/ws-handler-v2.ts +++ b/server/ws-handler-v2.ts @@ -733,6 +733,12 @@ export function handleInterruptV2( msg.contextBlocks, msg.clientMsgId, msg.model, + ).catch((err: unknown) => + log.error('interruptChat failed', { + connectionId, + sessionId: msg.sessionId, + err: err instanceof Error ? err.message : String(err), + }), ); log.info('interrupt', { connectionId, sessionId: msg.sessionId }); return;