diff --git a/src/CodexAcpServer.ts b/src/CodexAcpServer.ts index 0003c05..a407d23 100644 --- a/src/CodexAcpServer.ts +++ b/src/CodexAcpServer.ts @@ -214,7 +214,7 @@ export class CodexAcpServer implements acp.Agent { } async handleError(e: Error){ - if (e.message.includes("log out")) { + if (e.message.includes("log out") || e.message.includes("cloud requirements")) { await this.runWithProcessCheck(() => this.codexAcpClient.logout()); throw RequestError.internalError(`${(e.message)}\n\nYou have been logged out. Please try again.`); } diff --git a/src/__tests__/CodexACPAgent/new-session-logout.test.ts b/src/__tests__/CodexACPAgent/new-session-logout.test.ts index 88835ef..36a6f49 100644 --- a/src/__tests__/CodexACPAgent/new-session-logout.test.ts +++ b/src/__tests__/CodexACPAgent/new-session-logout.test.ts @@ -20,4 +20,23 @@ describe("New session logout handling", () => { }); expect(logoutSpy).toHaveBeenCalledOnce(); }); + + it("recovers when newSession fails with a failed to reload config error", async () => { + const fixture = createCodexMockTestFixture(); + const codexAcpAgent = fixture.getCodexAcpAgent(); + const codexAcpClient = fixture.getCodexAcpClient(); + const codexAppServerClient = fixture.getCodexAppServerClient(); + vi.spyOn(codexAcpClient, "authRequired").mockResolvedValue(false); + + const errorMessage = `Internal error: "failed to reload config: Failed to load cloud requirements (workspace-managed policies)."`; + vi.spyOn(codexAppServerClient, "threadStart").mockRejectedValue(new Error(errorMessage)); + + const logoutSpy = vi.spyOn(codexAcpClient, "logout").mockResolvedValue(); + + await expect(codexAcpAgent.newSession({cwd: "", mcpServers: []})) + .rejects.toMatchObject({ + data: expect.stringContaining("You have been logged out. Please try again."), + }); + expect(logoutSpy).toHaveBeenCalledOnce(); + }); });