From cf73f1f5cac21b2dfe7c3b0dfac084f321005933 Mon Sep 17 00:00:00 2001 From: "haozhe.yang" Date: Mon, 25 May 2026 11:59:58 +0800 Subject: [PATCH] fix(shell): fix bash timeout hang when daemon inherits stdio pipes - destroy stdout/stderr on abort to release stdio pipes held by detached daemons\n- use `exit` instead of `close` event to resolve exit promise --- packages/agent-core/src/tools/builtin/shell/bash.ts | 11 +++++++++++ packages/kaos/src/local.ts | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/agent-core/src/tools/builtin/shell/bash.ts b/packages/agent-core/src/tools/builtin/shell/bash.ts index 148b899..ddcb2f7 100644 --- a/packages/agent-core/src/tools/builtin/shell/bash.ts +++ b/packages/agent-core/src/tools/builtin/shell/bash.ts @@ -275,6 +275,17 @@ export class BashTool implements BuiltinTool { /* ignore */ } } + + try { + proc.stdout.destroy(); + } catch { + /* ignore */ + } + try { + proc.stderr.destroy(); + } catch { + /* ignore */ + } }; const onAbort = (): void => { diff --git a/packages/kaos/src/local.ts b/packages/kaos/src/local.ts index d0c6795..71fa16b 100644 --- a/packages/kaos/src/local.ts +++ b/packages/kaos/src/local.ts @@ -58,7 +58,7 @@ class LocalProcess implements KaosProcess { this.pid = child.pid ?? -1; this._exitPromise = new Promise((resolve, reject) => { - child.on('close', (code: number | null) => { + child.on('exit', (code: number | null) => { this._exitCode = code ?? -1; resolve(this._exitCode); });