fix: keep background exec aborts from killing sessions (#1000) (thanks @roshanasingh4)
When exec returns early in background mode, the tool-call AbortSignal can fire and previously caused killProcessTree(SIGKILL). Ignore abort after yielding/backgrounding so background sessions keep running.
This commit is contained in:
38
src/agents/bash-tools.exec.background-abort.test.ts
Normal file
38
src/agents/bash-tools.exec.background-abort.test.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { afterEach, expect, test } from "vitest";
|
||||||
|
|
||||||
|
import { createExecTool } from "./bash-tools.exec";
|
||||||
|
import { getFinishedSession, getSession, resetProcessRegistryForTests } from "./bash-process-registry";
|
||||||
|
import { killProcessTree } from "./shell-utils";
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
resetProcessRegistryForTests();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("background exec is not killed when tool signal aborts", async () => {
|
||||||
|
const tool = createExecTool({ allowBackground: true, backgroundMs: 0 });
|
||||||
|
const abortController = new AbortController();
|
||||||
|
|
||||||
|
const result = await tool.execute(
|
||||||
|
"toolcall",
|
||||||
|
{ command: "node -e \"setTimeout(() => {}, 5000)\"", background: true },
|
||||||
|
abortController.signal,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result.details.status).toBe("running");
|
||||||
|
const sessionId = (result.details as { sessionId: string }).sessionId;
|
||||||
|
|
||||||
|
abortController.abort();
|
||||||
|
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, 150));
|
||||||
|
|
||||||
|
const running = getSession(sessionId);
|
||||||
|
const finished = getFinishedSession(sessionId);
|
||||||
|
|
||||||
|
try {
|
||||||
|
expect(finished).toBeUndefined();
|
||||||
|
expect(running?.exited).toBe(false);
|
||||||
|
} finally {
|
||||||
|
const pid = running?.pid;
|
||||||
|
if (pid) killProcessTree(pid);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -263,6 +263,7 @@ export function createExecTool(
|
|||||||
};
|
};
|
||||||
|
|
||||||
const onAbort = () => {
|
const onAbort = () => {
|
||||||
|
if (yielded || session.backgrounded) return;
|
||||||
killSession(session);
|
killSession(session);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user