Skip to content

Commit 7d593bb

Browse files
LZY3538steipete
andauthored
fix: log terminal session persistence failures (#97839)
* fix: log terminal session persistence failures * fix: format terminal persistence error logs * fix(gateway): identify failed terminal persistence --------- Co-authored-by: Peter Steinberger <[email protected]>
1 parent 09dc880 commit 7d593bb

2 files changed

Lines changed: 18 additions & 2 deletions

File tree

src/gateway/server-chat.agent-events.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ import { formatChannelProgressDraftLine } from "../channels/streaming.js";
55
import { registerAgentRunContext, resetAgentRunContextForTest } from "../infra/agent-events.js";
66

77
const persistGatewaySessionLifecycleEventMock = vi.fn();
8+
const logErrorMock = vi.fn();
89

910
vi.mock("./server-chat.persist-session-lifecycle.runtime.js", () => ({
1011
persistGatewaySessionLifecycleEvent: (...args: unknown[]) =>
1112
persistGatewaySessionLifecycleEventMock(...args),
1213
}));
1314

15+
vi.mock("../logger.js", () => ({
16+
logError: (...args: unknown[]) => logErrorMock(...args),
17+
}));
18+
1419
vi.mock("../config/io.js", () => ({
1520
getRuntimeConfig: vi.fn(() => ({})),
1621
}));
@@ -74,6 +79,7 @@ describe("agent event handler", () => {
7479
});
7580
vi.mocked(loadGatewaySessionRow).mockReset().mockReturnValue(null);
7681
persistGatewaySessionLifecycleEventMock.mockReset().mockResolvedValue(undefined);
82+
logErrorMock.mockReset();
7783
resetAgentRunContextForTest();
7884
});
7985

@@ -2500,7 +2506,9 @@ describe("agent event handler", () => {
25002506
startedAt: 1_000,
25012507
abortedLastRun: false,
25022508
});
2503-
persistGatewaySessionLifecycleEventMock.mockRejectedValueOnce(new Error("disk full"));
2509+
persistGatewaySessionLifecycleEventMock.mockRejectedValueOnce(
2510+
new Error("disk full sk-abcdefghijklmnopqrstuvwxyz123456"),
2511+
);
25042512
const markTrackedRunTerminalPersisted = vi.fn();
25052513
const { broadcastToConnIds, handler, sessionEventSubscribers } = createHarness({
25062514
resolveSessionKeyForRun: () => "session-failed-write",
@@ -2532,6 +2540,10 @@ describe("agent event handler", () => {
25322540
updatedAt: 2_100,
25332541
abortedLastRun: false,
25342542
});
2543+
expect(logErrorMock).toHaveBeenCalledTimes(1);
2544+
expect(logErrorMock).toHaveBeenCalledWith(
2545+
"gateway: terminal session persistence failed session=session-failed-write run=run-failed-write error=Error: disk full sk-abc…3456",
2546+
);
25352547
expect(markTrackedRunTerminalPersisted).not.toHaveBeenCalled();
25362548
});
25372549

src/gateway/server-chat.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { getRuntimeConfig } from "../config/io.js";
99
import { type AgentEventPayload, getAgentRunContext } from "../infra/agent-events.js";
1010
import { detectErrorKind, type ErrorKind } from "../infra/errors.js";
1111
import { resolveHeartbeatVisibility } from "../infra/heartbeat-visibility.js";
12+
import { logError } from "../logger.js";
1213
import { isAcpSessionKey, isSubagentSessionKey } from "../sessions/session-key-utils.js";
1314
import { resolveAssistantEventPhase } from "../shared/chat-message-content.js";
1415
import { setSafeTimeout } from "../utils/timer-delay.js";
@@ -716,7 +717,10 @@ export function createAgentEventHandler({
716717
markPersisted();
717718
broadcastSessionChange();
718719
})
719-
.catch(() => {
720+
.catch((err: unknown) => {
721+
logError(
722+
`gateway: terminal session persistence failed session=${formatForLog(sessionKey)} run=${formatForLog(evt.runId)} error=${formatForLog(err)}`,
723+
);
720724
// Persistence recovery remains tracked by the controller entry, but
721725
// subscribers still need a terminal projection instead of hanging.
722726
broadcastSessionChange(evt);

0 commit comments

Comments
 (0)