From d2542d9d37487492fe8b695099603fc2c223058d Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 22 Feb 2026 13:10:36 +0100 Subject: [PATCH] chore(gateway): cover denied notifyOnExit path and clarify help --- src/config/schema.help.ts | 2 +- src/gateway/server-node-events.test.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/config/schema.help.ts b/src/config/schema.help.ts index f883d57a032..18c53b5f954 100644 --- a/src/config/schema.help.ts +++ b/src/config/schema.help.ts @@ -88,7 +88,7 @@ export const FIELD_HELP: Record = { "Enable known poll tool no-progress loop detection (default: true).", "tools.loopDetection.detectors.pingPong": "Enable ping-pong loop detection (default: true).", "tools.exec.notifyOnExit": - "When true (default), backgrounded exec sessions enqueue a system event and request a heartbeat on exit.", + "When true (default), backgrounded exec sessions on exit and node exec lifecycle events enqueue a system event and request a heartbeat.", "tools.exec.notifyOnExitEmptySuccess": "When true, successful backgrounded exec exits with empty output still enqueue a completion system event (default: false).", "tools.exec.pathPrepend": "Directories to prepend to PATH for exec runs (gateway/sandbox).", diff --git a/src/gateway/server-node-events.test.ts b/src/gateway/server-node-events.test.ts index 9face4b662a..a7c0b1057fc 100644 --- a/src/gateway/server-node-events.test.ts +++ b/src/gateway/server-node-events.test.ts @@ -226,6 +226,26 @@ describe("node exec events", () => { expect(enqueueSystemEventMock).not.toHaveBeenCalled(); expect(requestHeartbeatNowMock).not.toHaveBeenCalled(); }); + + it("suppresses exec.denied when notifyOnExit is false", async () => { + loadConfigMock.mockReturnValueOnce({ + session: { mainKey: "agent:main:main" }, + tools: { exec: { notifyOnExit: false } }, + } as ReturnType); + const ctx = buildCtx(); + await handleNodeEvent(ctx, "node-3", { + event: "exec.denied", + payloadJSON: JSON.stringify({ + sessionKey: "agent:demo:main", + runId: "run-silent-3", + command: "rm -rf /", + reason: "allowlist-miss", + }), + }); + + expect(enqueueSystemEventMock).not.toHaveBeenCalled(); + expect(requestHeartbeatNowMock).not.toHaveBeenCalled(); + }); }); describe("voice transcript events", () => {