From 67d3cb8ad031cd7bab383a00715ab231ec6307f0 Mon Sep 17 00:00:00 2001 From: Haozhe Date: Mon, 25 May 2026 16:12:59 +0800 Subject: [PATCH] fix(shell): fix bash timeout hang when daemon inherits stdio pipes (#10) - destroy stdout/stderr on abort to release stdio pipes held by detached daemons\n- use `exit` instead of `close` event to resolve exit promise Co-authored-by: haozhe.yang --- 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 148b899d0..ddcb2f778 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 d0c679500..71fa16b52 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); });