@@ -44,8 +44,8 @@ export interface SessionState {
4444 supportedReasoningEfforts : Array < ReasoningEffortOption > ,
4545 supportedInputModalities : Array < InputModality > ,
4646 agentMode : AgentMode ,
47- pendingTurnId : Promise < string > | null ;
48- currentTurnId : string | null ;
47+ // Promise covers the turn/start request window before the turn id response arrives.
48+ currentTurnId : Promise < string > | string | null ;
4949 lastTokenUsage : TokenCount | null ;
5050 totalTokenUsage : TokenCount | null ;
5151 modelContextWindow : number | null ;
@@ -175,7 +175,6 @@ export class CodexAcpServer implements acp.Agent {
175175 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
176176 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
177177 agentMode : AgentMode . getInitialAgentMode ( ) ,
178- pendingTurnId : null ,
179178 currentTurnId : null ,
180179 lastTokenUsage : null ,
181180 totalTokenUsage : null ,
@@ -407,7 +406,6 @@ export class CodexAcpServer implements acp.Agent {
407406 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
408407 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
409408 agentMode : AgentMode . getInitialAgentMode ( ) ,
410- pendingTurnId : null ,
411409 currentTurnId : null ,
412410 lastTokenUsage : null ,
413411 totalTokenUsage : null ,
@@ -670,17 +668,19 @@ export class CodexAcpServer implements acp.Agent {
670668 }
671669
672670 private async resolveActiveTurnId ( sessionState : SessionState ) : Promise < string | null > {
673- if ( sessionState . currentTurnId ) {
674- return sessionState . currentTurnId ;
675- }
676- if ( ! sessionState . pendingTurnId ) {
671+ const currentTurnId = sessionState . currentTurnId ;
672+ if ( ! currentTurnId ) {
677673 return null ;
678674 }
679675
676+ if ( typeof currentTurnId === "string" ) {
677+ return currentTurnId ;
678+ }
679+
680680 try {
681- return await sessionState . pendingTurnId ;
681+ return await currentTurnId ;
682682 } catch ( err ) {
683- logger . error ( `Failed to resolve pending turn for session ${ sessionState . sessionId } ` , err ) ;
683+ logger . error ( `Failed to resolve current turn for session ${ sessionState . sessionId } ` , err ) ;
684684 return null ;
685685 }
686686 }
@@ -783,7 +783,6 @@ export class CodexAcpServer implements acp.Agent {
783783 const sessionState = this . getSessionState ( params . sessionId ) ;
784784 const requireTrackedSession = this . sessions . has ( params . sessionId ) ;
785785 this . ensureSessionIsActive ( params . sessionId , requireTrackedSession ) ;
786- sessionState . pendingTurnId = null ;
787786 sessionState . currentTurnId = null ;
788787 sessionState . lastTokenUsage = null ;
789788
@@ -830,12 +829,11 @@ export class CodexAcpServer implements acp.Agent {
830829 throw RequestError . invalidRequest ( "The current model does not support image input" ) ;
831830 }
832831 const agentMode = sessionState . agentMode ;
833- const pendingTurnId = this . runWithProcessCheck (
832+ const turnIdPromise = this . runWithProcessCheck (
834833 ( ) => this . codexAcpClient . startPrompt ( params , agentMode , modelId , disableSummary , sessionState . cwd )
835834 ) ;
836- sessionState . pendingTurnId = pendingTurnId ;
837- const turnId = await pendingTurnId ;
838- sessionState . pendingTurnId = null ;
835+ sessionState . currentTurnId = turnIdPromise ;
836+ const turnId = await turnIdPromise ;
839837 sessionState . currentTurnId = turnId ;
840838
841839 const turnCompleted = await this . runWithProcessCheck (
@@ -879,7 +877,6 @@ export class CodexAcpServer implements acp.Agent {
879877 throw err ;
880878 } finally {
881879 logger . log ( "Prompt completed" , { sessionId : params . sessionId } ) ;
882- sessionState . pendingTurnId = null ;
883880 sessionState . currentTurnId = null ;
884881 }
885882 }
0 commit comments