Skip to content

Commit fe69fd8

Browse files
fix: /status shouldn't display account usage for gateway auth (#138)
1 parent 5e99c28 commit fe69fd8

3 files changed

Lines changed: 71 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: 16 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,7 @@ 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+
const account = await this.getActiveAccount();
168163
const {sessionId, currentModelId, models} = sessionMetadata;
169164
const sessionMcpServers = this.resolveSessionMcpServers(requestedMcpServers, "sessionId" in request);
170165
const currentModel = this.findCurrentModel(models, currentModelId);
@@ -179,7 +174,7 @@ export class CodexAcpServer implements acp.Agent {
179174
totalTokenUsage: null,
180175
modelContextWindow: null,
181176
rateLimits: null,
182-
account: accountResponse.account,
177+
account: account,
183178
cwd: request.cwd,
184179
sessionMcpServers: sessionMcpServers,
185180
}
@@ -200,6 +195,14 @@ export class CodexAcpServer implements acp.Agent {
200195
return [sessionId, sessionModelState, sessionModeState];
201196
}
202197

198+
private async getActiveAccount(){
199+
if (this.codexAcpClient.getModelProvider()) {
200+
return null
201+
}
202+
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
203+
return accountResponse.account;
204+
}
205+
203206
async loadSession(params: acp.LoadSessionRequest): Promise<acp.LoadSessionResponse> {
204207
logger.log("Loading session...", {sessionId: params.sessionId});
205208
const {
@@ -381,7 +384,7 @@ export class CodexAcpServer implements acp.Agent {
381384
this.codexAcpClient.loadSession(request)
382385
);
383386

384-
const accountResponse = await this.runWithProcessCheck(() => this.codexAcpClient.getAccount());
387+
const account = await this.getActiveAccount();
385388
const {sessionId, currentModelId, models, thread} = sessionMetadata;
386389
const sessionMcpServers = this.resolveSessionMcpServers(requestedMcpServers, true);
387390
const currentModel = this.findCurrentModel(models, currentModelId);
@@ -396,7 +399,7 @@ export class CodexAcpServer implements acp.Agent {
396399
totalTokenUsage: null,
397400
modelContextWindow: null,
398401
rateLimits: null,
399-
account: accountResponse.account,
402+
account: account,
400403
cwd: request.cwd,
401404
sessionMcpServers: sessionMcpServers,
402405
};

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)