@@ -32,6 +32,14 @@ import {
3232 createFileChangeUpdate ,
3333 createMcpToolCallUpdate ,
3434} from "./CodexToolCallMapper" ;
35+ import {
36+ createFastModeConfigOption ,
37+ FAST_MODE_CONFIG_ID ,
38+ FAST_MODE_OFF ,
39+ FAST_MODE_ON ,
40+ modelSupportsFast ,
41+ resolveFastServiceTier ,
42+ } from "./FastModeConfig" ;
3543
3644export interface SessionState {
3745 sessionId : string ,
@@ -46,6 +54,8 @@ export interface SessionState {
4654 rateLimits : RateLimitsMap | null ;
4755 account : Account | null ;
4856 cwd : string ;
57+ fastModeEnabled : boolean ;
58+ currentModelSupportsFast : boolean ;
4959 sessionMcpServers ?: Array < string > ;
5060}
5161
@@ -163,6 +173,7 @@ export class CodexAcpServer implements acp.Agent {
163173 const { sessionId, currentModelId, models} = sessionMetadata ;
164174 const sessionMcpServers = this . resolveSessionMcpServers ( requestedMcpServers , "sessionId" in request ) ;
165175 const currentModel = this . findCurrentModel ( models , currentModelId ) ;
176+ const currentModelSupportsFast = modelSupportsFast ( currentModel ) ;
166177 const sessionState : SessionState = {
167178 sessionId : sessionId ,
168179 currentModelId : currentModelId ,
@@ -176,6 +187,8 @@ export class CodexAcpServer implements acp.Agent {
176187 rateLimits : null ,
177188 account : account ,
178189 cwd : request . cwd ,
190+ fastModeEnabled : sessionMetadata . currentServiceTier === "fast" ,
191+ currentModelSupportsFast : currentModelSupportsFast ,
179192 sessionMcpServers : sessionMcpServers ,
180193 }
181194 this . sessions . set ( sessionId , sessionState ) ;
@@ -221,7 +234,8 @@ export class CodexAcpServer implements acp.Agent {
221234 } ) ;
222235 return {
223236 models : modelState ,
224- modes : modeState
237+ modes : modeState ,
238+ configOptions : this . createSessionConfigOptions ( this . getSessionState ( sessionId ) ) ,
225239 } ;
226240 }
227241
@@ -236,7 +250,8 @@ export class CodexAcpServer implements acp.Agent {
236250 } ) ;
237251 return {
238252 models : modelState ,
239- modes : modeState
253+ modes : modeState ,
254+ configOptions : this . createSessionConfigOptions ( this . getSessionState ( sessionId ) ) ,
240255 } ;
241256 }
242257
@@ -261,7 +276,8 @@ export class CodexAcpServer implements acp.Agent {
261276 return {
262277 sessionId : sessionId ,
263278 models : modelState ,
264- modes : modeState
279+ modes : modeState ,
280+ configOptions : this . createSessionConfigOptions ( this . getSessionState ( sessionId ) ) ,
265281 } ;
266282 }
267283
@@ -302,6 +318,28 @@ export class CodexAcpServer implements acp.Agent {
302318 return { } ;
303319 }
304320
321+ async setSessionConfigOption ( params : acp . SetSessionConfigOptionRequest ) : Promise < acp . SetSessionConfigOptionResponse > {
322+ logger . log ( "Set session config option requested" , {
323+ sessionId : params . sessionId ,
324+ configId : params . configId ,
325+ } ) ;
326+ const sessionState = this . sessions . get ( params . sessionId ) ;
327+ if ( ! sessionState ) throw new Error ( `Session ${ params . sessionId } not found` ) ;
328+
329+ if ( params . configId !== FAST_MODE_CONFIG_ID || ( "type" in params && params . type === "boolean" ) ) {
330+ throw RequestError . invalidParams ( ) ;
331+ }
332+
333+ if ( params . value !== FAST_MODE_ON && params . value !== FAST_MODE_OFF ) {
334+ throw RequestError . invalidParams ( ) ;
335+ }
336+
337+ sessionState . fastModeEnabled = params . value === FAST_MODE_ON ;
338+ return {
339+ configOptions : this . createSessionConfigOptions ( sessionState ) ,
340+ } ;
341+ }
342+
305343 async unstable_setSessionModel ( params : acp . SetSessionModelRequest ) : Promise < acp . SetSessionModelResponse | void > {
306344 logger . log ( "Set session model requested" , {
307345 sessionId : params . sessionId ,
@@ -337,10 +375,17 @@ export class CodexAcpServer implements acp.Agent {
337375 sessionState . currentModelId = ModelId . fromComponents ( model , reasoningEffort ) . toString ( ) ;
338376 sessionState . supportedReasoningEfforts = model . supportedReasoningEfforts ;
339377 sessionState . supportedInputModalities = model . inputModalities ;
378+ sessionState . currentModelSupportsFast = modelSupportsFast ( model ) ;
340379
341380 return { } ;
342381 }
343382
383+ private createSessionConfigOptions ( sessionState : SessionState ) : Array < acp . SessionConfigOption > {
384+ return [
385+ createFastModeConfigOption ( sessionState . fastModeEnabled ) ,
386+ ] ;
387+ }
388+
344389 private publishAvailableCommandsAsync ( sessionId : string ) {
345390 void this . availableCommands . publish ( sessionId ) ;
346391 }
@@ -388,6 +433,7 @@ export class CodexAcpServer implements acp.Agent {
388433 const { sessionId, currentModelId, models, thread} = sessionMetadata ;
389434 const sessionMcpServers = this . resolveSessionMcpServers ( requestedMcpServers , true ) ;
390435 const currentModel = this . findCurrentModel ( models , currentModelId ) ;
436+ const currentModelSupportsFast = modelSupportsFast ( currentModel ) ;
391437 const sessionState : SessionState = {
392438 sessionId : sessionId ,
393439 currentModelId : currentModelId ,
@@ -401,6 +447,8 @@ export class CodexAcpServer implements acp.Agent {
401447 rateLimits : null ,
402448 account : account ,
403449 cwd : request . cwd ,
450+ fastModeEnabled : sessionMetadata . currentServiceTier === "fast" ,
451+ currentModelSupportsFast : currentModelSupportsFast ,
404452 sessionMcpServers : sessionMcpServers ,
405453 } ;
406454 this . sessions . set ( sessionId , sessionState ) ;
@@ -767,8 +815,12 @@ export class CodexAcpServer implements acp.Agent {
767815 throw RequestError . invalidRequest ( "The current model does not support image input" ) ;
768816 }
769817 const agentMode = sessionState . agentMode ;
818+ const serviceTier = resolveFastServiceTier (
819+ sessionState . fastModeEnabled ,
820+ sessionState . currentModelSupportsFast ,
821+ ) ;
770822 const turnCompleted = await this . runWithProcessCheck (
771- ( ) => this . codexAcpClient . sendPrompt ( params , agentMode , modelId , disableSummary , sessionState . cwd ) ) ;
823+ ( ) => this . codexAcpClient . sendPrompt ( params , agentMode , modelId , serviceTier , disableSummary , sessionState . cwd ) ) ;
772824
773825 // Check if turn was interrupted (cancelled)
774826 if ( turnCompleted . turn . status === "interrupted" ) {
0 commit comments