@@ -20,6 +20,13 @@ import type {
2020import type { RateLimitsMap } from "./RateLimitsMap" ;
2121import { ModelId } from "./ModelId" ;
2222import { AgentMode , MODE_CONFIG_ID } from "./AgentMode" ;
23+ import {
24+ COLLABORATION_MODE_CONFIG_ID ,
25+ createCollaborationModeConfigOption ,
26+ DEFAULT_COLLABORATION_MODE ,
27+ parseCollaborationMode ,
28+ } from "./CollaborationModeConfig" ;
29+ import type { ModeKind } from "./app-server/ModeKind" ;
2330import {
2431 createModelConfigOption ,
2532 createReasoningEffortConfigOption ,
@@ -88,6 +95,7 @@ export interface SessionState {
8895 supportedReasoningEfforts : Array < ReasoningEffortOption > ,
8996 supportedInputModalities : Array < InputModality > ,
9097 agentMode : AgentMode ,
98+ collaborationMode : ModeKind ,
9199 currentTurnId : string | null ;
92100 lastTokenUsage : TokenCount | null ;
93101 totalTokenUsage : TokenCount | null ;
@@ -405,6 +413,7 @@ export class CodexAcpServer {
405413 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
406414 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
407415 agentMode : AgentMode . getInitialAgentMode ( ) ,
416+ collaborationMode : DEFAULT_COLLABORATION_MODE ,
408417 currentTurnId : null ,
409418 lastTokenUsage : null ,
410419 totalTokenUsage : null ,
@@ -690,13 +699,24 @@ export class CodexAcpServer {
690699 const sessionState = this . sessions . get ( params . sessionId ) ;
691700 if ( ! sessionState ) throw new Error ( `Session ${ params . sessionId } not found` ) ;
692701
702+ await this . applySessionConfigOption ( sessionState , params ) ;
703+
704+ return {
705+ configOptions : this . createSessionConfigOptions ( sessionState ) ,
706+ } ;
707+ }
708+
709+ private async applySessionConfigOption ( sessionState : SessionState , params : acp . SetSessionConfigOptionRequest ) : Promise < void > {
693710 switch ( params . configId ) {
694711 case FAST_MODE_CONFIG_ID :
695712 this . applyFastModeChange ( sessionState , params ) ;
696713 break ;
697714 case MODE_CONFIG_ID :
698715 this . applyModeChange ( sessionState , this . stringConfigValue ( params ) ) ;
699716 break ;
717+ case COLLABORATION_MODE_CONFIG_ID :
718+ await this . applyCollaborationModeChange ( sessionState , this . stringConfigValue ( params ) ) ;
719+ break ;
700720 case MODEL_CONFIG_ID :
701721 this . applyModelChange ( sessionState , this . stringConfigValue ( params ) ) ;
702722 break ;
@@ -706,10 +726,6 @@ export class CodexAcpServer {
706726 default :
707727 throw RequestError . invalidParams ( ) ;
708728 }
709-
710- return {
711- configOptions : this . createSessionConfigOptions ( sessionState ) ,
712- } ;
713729 }
714730
715731 private applyFastModeChange ( sessionState : SessionState , params : acp . SetSessionConfigOptionRequest ) : void {
@@ -739,6 +755,15 @@ export class CodexAcpServer {
739755 sessionState . agentMode = newMode ;
740756 }
741757
758+ private async applyCollaborationModeChange ( sessionState : SessionState , value : string ) : Promise < void > {
759+ const mode = parseCollaborationMode ( value ) ;
760+ if ( mode === null ) {
761+ throw RequestError . invalidParams ( ) ;
762+ }
763+ await this . codexAcpClient . setCollaborationMode ( sessionState . sessionId , mode , sessionState . currentModelId ) ;
764+ sessionState . collaborationMode = mode ;
765+ }
766+
742767 private applyModelChange ( sessionState : SessionState , value : string ) : void {
743768 const model = sessionState . availableModels . find ( m => m . id === value ) ;
744769 if ( ! model ) {
@@ -817,6 +842,7 @@ export class CodexAcpServer {
817842 const currentModelId = ModelId . fromString ( sessionState . currentModelId ) ;
818843 const configOptions = [
819844 sessionState . agentMode . toConfigOption ( ) ,
845+ createCollaborationModeConfigOption ( sessionState . collaborationMode ) ,
820846 createModelConfigOption ( sessionState . availableModels , currentModelId . model ) ,
821847 ] ;
822848 if ( sessionState . supportedReasoningEfforts . length > 0 ) {
@@ -936,6 +962,7 @@ export class CodexAcpServer {
936962 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
937963 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
938964 agentMode : AgentMode . getInitialAgentMode ( ) ,
965+ collaborationMode : DEFAULT_COLLABORATION_MODE ,
939966 currentTurnId : null ,
940967 lastTokenUsage : null ,
941968 totalTokenUsage : null ,
@@ -1549,6 +1576,18 @@ export class CodexAcpServer {
15491576 sessionState . currentTurnId = turnId ;
15501577 pendingTurnStart ?. resolve ( turnId ) ;
15511578 } ,
1579+ setConfigOption : async ( configId , value ) => {
1580+ await this . applySessionConfigOption ( sessionState , {
1581+ sessionId : sessionState . sessionId ,
1582+ configId,
1583+ value,
1584+ } ) ;
1585+ const session = new ACPSessionConnection ( this . connection , sessionState . sessionId ) ;
1586+ await session . update ( {
1587+ sessionUpdate : "config_option_update" ,
1588+ configOptions : this . createSessionConfigOptions ( sessionState ) ,
1589+ } ) ;
1590+ } ,
15521591 } ) ;
15531592 void commandPromise . catch ( ( err ) => {
15541593 if ( this . activePrompts . get ( params . sessionId ) !== activePrompt ) {
0 commit comments