Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/CodexAcpClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import packageJson from "../package.json";
import type {AuthenticationStatusResponse} from "./AcpExtensions";
import {createCodexCollaborationMode} from "./CollaborationModeConfig";
import type {ModeKind} from "./app-server/ModeKind";
import type {SupportedServiceTier} from "./FastModeConfig";

/**
* Well-known provider id for the client-configurable custom LLM gateway.
Expand Down Expand Up @@ -345,7 +346,7 @@ export class CodexAcpClient {
models: codexModels,
collaborationMode: this.getCollaborationMode(response.thread.id),
modelProvider: response.modelProvider,
currentServiceTier: response.serviceTier as ServiceTier ?? null,
currentServiceTier: response.serviceTier as SupportedServiceTier ?? null,
additionalDirectories,
}
}
Expand Down Expand Up @@ -373,7 +374,7 @@ export class CodexAcpClient {
models: codexModels,
collaborationMode: this.getCollaborationMode(response.thread.id),
modelProvider: response.modelProvider,
currentServiceTier: response.serviceTier as ServiceTier ?? null,
currentServiceTier: response.serviceTier as SupportedServiceTier ?? null,
thread: historyResponse.thread,
additionalDirectories,
};
Expand All @@ -400,7 +401,7 @@ export class CodexAcpClient {
models: codexModels,
collaborationMode: this.getCollaborationMode(response.thread.id),
modelProvider: response.modelProvider,
currentServiceTier: response.serviceTier as ServiceTier ?? null,
currentServiceTier: response.serviceTier as SupportedServiceTier ?? null,
additionalDirectories,
};
}
Expand Down Expand Up @@ -899,7 +900,7 @@ export type SessionMetadata = {
models: Model[],
collaborationMode: ModeKind,
modelProvider?: string | null,
currentServiceTier?: ServiceTier | null,
currentServiceTier?: SupportedServiceTier | null,
additionalDirectories: string[],
}

Expand Down
5 changes: 3 additions & 2 deletions src/CodexAcpServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ import {
FAST_MODE_ON,
modelSupportsFast,
resolveFastServiceTier,
serviceTierEnablesFast,
} from "./FastModeConfig";
import packageJson from "../package.json";
import {isJetBrains2026_1Client} from "./JBUtils";
Expand Down Expand Up @@ -460,7 +461,7 @@ export class CodexAcpServer {
authProvider: authProvider,
cwd: request.cwd,
additionalDirectories: sessionMetadata.additionalDirectories,
fastModeEnabled: sessionMetadata.currentServiceTier === "fast",
fastModeEnabled: serviceTierEnablesFast(sessionMetadata.currentServiceTier),
currentModelSupportsFast: currentModelSupportsFast,
sessionMcpServers: sessionMcpServers,
terminalOutputMode: this.terminalOutputMode,
Expand Down Expand Up @@ -1302,7 +1303,7 @@ export class CodexAcpServer {
authProvider: authProvider,
cwd: request.cwd,
additionalDirectories: sessionMetadata.additionalDirectories,
fastModeEnabled: sessionMetadata.currentServiceTier === "fast",
fastModeEnabled: serviceTierEnablesFast(sessionMetadata.currentServiceTier),
currentModelSupportsFast: currentModelSupportsFast,
sessionMcpServers: sessionMcpServers,
terminalOutputMode: this.terminalOutputMode,
Expand Down
6 changes: 6 additions & 0 deletions src/FastModeConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type * as acp from "@agentclientprotocol/sdk";
import type {ServiceTier} from "./app-server";
import type {Model} from "./app-server/v2";

export type SupportedServiceTier = ServiceTier | "priority";

export const FAST_MODE_CONFIG_ID = "fast-mode";
export const FAST_MODE_CATEGORY = "model_config";
export const FAST_MODE_ON = "on";
Expand All @@ -14,6 +16,10 @@ export function modelSupportsFast(model: Model | undefined): boolean {
return model?.additionalSpeedTiers?.includes("fast") ?? false;
}

export function serviceTierEnablesFast(serviceTier: SupportedServiceTier | null | undefined): boolean {
return serviceTier === "fast" || serviceTier === "priority";
}

export function resolveFastServiceTier(fastModeEnabled: boolean, currentModelSupportsFast: boolean): ServiceTier | null {
return fastModeEnabled && currentModelSupportsFast ? "fast" : null;
}
Expand Down
16 changes: 15 additions & 1 deletion src/__tests__/CodexACPAgent/fast-mode-config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ describe("Fast mode session config", () => {
};

async function createSession(
currentServiceTier: "fast" | "flex" | null = null,
currentServiceTier: "fast" | "priority" | "flex" | null = null,
clientInfo: acp.Implementation | null = null,
clientCapabilities?: acp.ClientCapabilities,
) {
Expand Down Expand Up @@ -106,6 +106,20 @@ describe("Fast mode session config", () => {
expect(codexAcpAgent.getSessionState("session-id").fastModeEnabled).toBe(true);
});

it("initializes Fast mode as On when the app-server session tier is priority", async () => {
const {fixture, response, codexAcpAgent} = await createSession("priority");
const turnStartSpy = mockPromptTurn(fixture, "session-id");

expect(response.configOptions).toContainEqual(createFastModeConfigOption(true));
expect(codexAcpAgent.getSessionState("session-id").fastModeEnabled).toBe(true);

await codexAcpAgent.prompt({sessionId: "session-id", prompt: [{type: "text", text: "test"}]});

expect(turnStartSpy).toHaveBeenCalledWith(expect.objectContaining({
serviceTier: "fast",
}));
});

it("omits Fast mode config options for JetBrains 2026.1 IntelliJ clients", async () => {
const {response} = await createSession(null, {
name: "JetBrains.WebStorm",
Expand Down