@@ -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 ,
@@ -87,6 +94,7 @@ export interface SessionState {
8794 supportedReasoningEfforts : Array < ReasoningEffortOption > ,
8895 supportedInputModalities : Array < InputModality > ,
8996 agentMode : AgentMode ,
97+ collaborationMode : ModeKind ,
9098 currentTurnId : string | null ;
9199 lastTokenUsage : TokenCount | null ;
92100 totalTokenUsage : TokenCount | null ;
@@ -402,6 +410,7 @@ export class CodexAcpServer {
402410 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
403411 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
404412 agentMode : AgentMode . getInitialAgentMode ( ) ,
413+ collaborationMode : DEFAULT_COLLABORATION_MODE ,
405414 currentTurnId : null ,
406415 lastTokenUsage : null ,
407416 totalTokenUsage : null ,
@@ -685,13 +694,24 @@ export class CodexAcpServer {
685694 const sessionState = this . sessions . get ( params . sessionId ) ;
686695 if ( ! sessionState ) throw new Error ( `Session ${ params . sessionId } not found` ) ;
687696
697+ await this . applySessionConfigOption ( sessionState , params ) ;
698+
699+ return {
700+ configOptions : this . createSessionConfigOptions ( sessionState ) ,
701+ } ;
702+ }
703+
704+ private async applySessionConfigOption ( sessionState : SessionState , params : acp . SetSessionConfigOptionRequest ) : Promise < void > {
688705 switch ( params . configId ) {
689706 case FAST_MODE_CONFIG_ID :
690707 this . applyFastModeChange ( sessionState , params ) ;
691708 break ;
692709 case MODE_CONFIG_ID :
693710 this . applyModeChange ( sessionState , this . stringConfigValue ( params ) ) ;
694711 break ;
712+ case COLLABORATION_MODE_CONFIG_ID :
713+ await this . applyCollaborationModeChange ( sessionState , this . stringConfigValue ( params ) ) ;
714+ break ;
695715 case MODEL_CONFIG_ID :
696716 this . applyModelChange ( sessionState , this . stringConfigValue ( params ) ) ;
697717 break ;
@@ -701,10 +721,6 @@ export class CodexAcpServer {
701721 default :
702722 throw RequestError . invalidParams ( ) ;
703723 }
704-
705- return {
706- configOptions : this . createSessionConfigOptions ( sessionState ) ,
707- } ;
708724 }
709725
710726 private applyFastModeChange ( sessionState : SessionState , params : acp . SetSessionConfigOptionRequest ) : void {
@@ -734,6 +750,15 @@ export class CodexAcpServer {
734750 sessionState . agentMode = newMode ;
735751 }
736752
753+ private async applyCollaborationModeChange ( sessionState : SessionState , value : string ) : Promise < void > {
754+ const mode = parseCollaborationMode ( value ) ;
755+ if ( mode === null ) {
756+ throw RequestError . invalidParams ( ) ;
757+ }
758+ await this . codexAcpClient . setCollaborationMode ( sessionState . sessionId , mode , sessionState . currentModelId ) ;
759+ sessionState . collaborationMode = mode ;
760+ }
761+
737762 private applyModelChange ( sessionState : SessionState , value : string ) : void {
738763 const model = sessionState . availableModels . find ( m => m . id === value ) ;
739764 if ( ! model ) {
@@ -812,6 +837,7 @@ export class CodexAcpServer {
812837 const currentModelId = ModelId . fromString ( sessionState . currentModelId ) ;
813838 const configOptions = [
814839 sessionState . agentMode . toConfigOption ( ) ,
840+ createCollaborationModeConfigOption ( sessionState . collaborationMode ) ,
815841 createModelConfigOption ( sessionState . availableModels , currentModelId . model ) ,
816842 ] ;
817843 if ( sessionState . supportedReasoningEfforts . length > 0 ) {
@@ -931,6 +957,7 @@ export class CodexAcpServer {
931957 supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
932958 supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
933959 agentMode : AgentMode . getInitialAgentMode ( ) ,
960+ collaborationMode : DEFAULT_COLLABORATION_MODE ,
934961 currentTurnId : null ,
935962 lastTokenUsage : null ,
936963 totalTokenUsage : null ,
@@ -1490,6 +1517,18 @@ export class CodexAcpServer {
14901517 sessionState . currentTurnId = turnId ;
14911518 pendingTurnStart ?. resolve ( turnId ) ;
14921519 } ,
1520+ setConfigOption : async ( configId , value ) => {
1521+ await this . applySessionConfigOption ( sessionState , {
1522+ sessionId : sessionState . sessionId ,
1523+ configId,
1524+ value,
1525+ } ) ;
1526+ const session = new ACPSessionConnection ( this . connection , sessionState . sessionId ) ;
1527+ await session . update ( {
1528+ sessionUpdate : "config_option_update" ,
1529+ configOptions : this . createSessionConfigOptions ( sessionState ) ,
1530+ } ) ;
1531+ } ,
14931532 } ) ;
14941533 void commandPromise . catch ( ( err ) => {
14951534 if ( this . activePrompts . get ( params . sessionId ) !== activePrompt ) {
0 commit comments