Skip to content

Commit 3fe73f8

Browse files
fix: /status shouldn't display account usage for gateway auth
1 parent c352108 commit 3fe73f8

3 files changed

Lines changed: 75 additions & 14 deletions

File tree

src/CodexAcpClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export class CodexAcpClient {
300300
}
301301
}
302302

303-
private getModelProvider(): string | null {
303+
getModelProvider(): string | null {
304304
return this.gatewayConfig?.modelProvider ?? this.modelProvider;
305305
}
306306

src/CodexAcpServer.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
import * as acp from "@agentclientprotocol/sdk";
2-
import {
3-
RequestError,
4-
type SessionId,
5-
type SessionModelState,
6-
type SessionModeState
7-
} from "@agentclientprotocol/sdk";
2+
import {RequestError, type SessionId, type SessionModelState, type SessionModeState} from "@agentclientprotocol/sdk";
83
import {CodexEventHandler} from "./CodexEventHandler";
94
import {CodexApprovalHandler} from "./CodexApprovalHandler";
105
import {CodexElicitationHandler} from "./CodexElicitationHandler";
11-
import {getCodexAuthMethods, type CodexAuthRequest} from "./CodexAuthMethod";
6+
import {type CodexAuthRequest, getCodexAuthMethods} from "./CodexAuthMethod";
127
import {CodexAcpClient, type SessionMetadata, type SessionMetadataWithThread} from "./CodexAcpClient";
138
import type {McpStartupResult} from "./CodexAppServerClient";
149
import {ACPSessionConnection, type UpdateSessionEvent} from "./ACPSessionConnection";
@@ -17,10 +12,10 @@ import type {
1712
Account,
1813
CollabAgentToolCallStatus,
1914
Model,
15+
ReasoningEffortOption,
2016
Thread,
2117
ThreadItem,
22-
UserInput,
23-
ReasoningEffortOption
18+
UserInput
2419
} from "./app-server/v2";
2520
import type {RateLimitsMap} from "./RateLimitsMap";
2621
import {ModelId} from "./ModelId";
@@ -164,7 +159,13 @@ export class CodexAcpServer implements acp.Agent {
164159
sessionMetadata = await this.runWithProcessCheck(() => this.codexAcpClient.newSession(request));
165160
}
166161

167-
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
162+
let account: Account | null;
163+
if (this.codexAcpClient.getModelProvider() === null) {
164+
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
165+
account = accountResponse.account;
166+
} else {
167+
account = null;
168+
}
168169
const {sessionId, currentModelId, models} = sessionMetadata;
169170
const sessionMcpServers = this.resolveSessionMcpServers(requestedMcpServers, "sessionId" in request);
170171
const currentModel = this.findCurrentModel(models, currentModelId);
@@ -179,7 +180,7 @@ export class CodexAcpServer implements acp.Agent {
179180
totalTokenUsage: null,
180181
modelContextWindow: null,
181182
rateLimits: null,
182-
account: accountResponse.account,
183+
account: account,
183184
cwd: request.cwd,
184185
sessionMcpServers: sessionMcpServers,
185186
}
@@ -381,7 +382,13 @@ export class CodexAcpServer implements acp.Agent {
381382
this.codexAcpClient.loadSession(request)
382383
);
383384

384-
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
385+
let account: Account | null;
386+
if (this.codexAcpClient.getModelProvider() === null) {
387+
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
388+
account = accountResponse.account;
389+
} else {
390+
account = null;
391+
}
385392
const {sessionId, currentModelId, models, thread} = sessionMetadata;
386393
const sessionMcpServers = this.resolveSessionMcpServers(requestedMcpServers, true);
387394
const currentModel = this.findCurrentModel(models, currentModelId);
@@ -396,7 +403,7 @@ export class CodexAcpServer implements acp.Agent {
396403
totalTokenUsage: null,
397404
modelContextWindow: null,
398405
rateLimits: null,
399-
account: accountResponse.account,
406+
account: account,
400407
cwd: request.cwd,
401408
sessionMcpServers: sessionMcpServers,
402409
};

src/__tests__/CodexACPAgent/CodexAcpClient.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,60 @@ describe('ACP server test', { timeout: 40_000 }, () => {
146146
expect(newSessionResponse.sessionId).toBeDefined()
147147
})
148148

149+
it('should show account in /status for api key auth and hide it for gateway auth', async () => {
150+
const authFixture = createTestFixture();
151+
const codexAcpAgent = authFixture.getCodexAcpAgent();
152+
153+
await codexAcpAgent.initialize({
154+
protocolVersion: 1,
155+
clientCapabilities: {
156+
auth: {
157+
_meta: {
158+
gateway: true,
159+
}
160+
}
161+
}
162+
});
163+
await authFixture.getCodexAcpClient().logout();
164+
165+
await codexAcpAgent.authenticate({
166+
methodId: "api-key",
167+
_meta: { "api-key": { apiKey: "TOKEN" } }
168+
});
169+
const apiKeySession = await codexAcpAgent.newSession({cwd: "", mcpServers: []});
170+
authFixture.clearAcpConnectionDump();
171+
172+
await codexAcpAgent.prompt({
173+
sessionId: apiKeySession.sessionId,
174+
prompt: [{ type: "text", text: "/status" }]
175+
});
176+
177+
const apiKeyStatusDump = authFixture.getAcpConnectionDump([]);
178+
expect(apiKeyStatusDump).toContain("**Account:** API key configured");
179+
180+
await codexAcpAgent.authenticate({
181+
methodId: "gateway",
182+
_meta: {
183+
"gateway": {
184+
baseUrl: "https://www.example.com",
185+
headers: {
186+
"Custom-Auth-Header": "TOKEN"
187+
}
188+
}
189+
}
190+
});
191+
const gatewaySession = await codexAcpAgent.newSession({cwd: "", mcpServers: []});
192+
authFixture.clearAcpConnectionDump();
193+
194+
await codexAcpAgent.prompt({
195+
sessionId: gatewaySession.sessionId,
196+
prompt: [{ type: "text", text: "/status" }]
197+
});
198+
199+
const gatewayStatusDump = authFixture.getAcpConnectionDump([]);
200+
expect(gatewayStatusDump).toContain("**Account:** not logged in");
201+
});
202+
149203
it('supports legacy authentication/logout ext method', async () => {
150204
const mockFixture = createCodexMockTestFixture();
151205
const codexAcpAgent = mockFixture.getCodexAcpAgent();

0 commit comments

Comments
 (0)