@@ -12,6 +12,8 @@ import type {
1212  NewSessionResponse , 
1313  PromptRequest , 
1414  PromptResponse , 
15+   SetSessionModelRequest , 
16+   SetSessionModelResponse , 
1517}  from  "@agentclientprotocol/sdk" 
1618import  {  Log  }  from  "../util/log" 
1719import  {  ACPSessionManager  }  from  "./session" 
@@ -55,24 +57,81 @@ export class OpenCodeAgent implements Agent {
5557  async  newSession ( params : NewSessionRequest ) : Promise < NewSessionResponse >  { 
5658    this . log . info ( "newSession" ,  {  cwd : params . cwd ,  mcpServers : params . mcpServers . length  } ) 
5759
58-     const  session  =  await  this . sessionManager . create ( params . cwd ,  params . mcpServers ) 
60+     const  model  =  await  this . defaultModel ( ) 
61+     const  session  =  await  this . sessionManager . create ( params . cwd ,  params . mcpServers ,  model ) 
62+     const  availableModels  =  await  this . availableModels ( ) 
5963
6064    return  { 
6165      sessionId : session . id , 
66+       models : { 
67+         currentModelId : `${ model . providerID } ${ model . modelID }  , 
68+         availableModels, 
69+       } , 
6270      _meta : { } , 
6371    } 
6472  } 
6573
6674  async  loadSession ( params : LoadSessionRequest ) : Promise < LoadSessionResponse >  { 
6775    this . log . info ( "loadSession" ,  {  sessionId : params . sessionId ,  cwd : params . cwd  } ) 
6876
69-     await  this . sessionManager . load ( params . sessionId ,  params . cwd ,  params . mcpServers ) 
77+     const  defaultModel  =  await  this . defaultModel ( ) 
78+     const  session  =  await  this . sessionManager . load ( params . sessionId ,  params . cwd ,  params . mcpServers ,  defaultModel ) 
79+     const  availableModels  =  await  this . availableModels ( ) 
7080
7181    return  { 
82+       models : { 
83+         currentModelId : `${ session . model . providerID } ${ session . model . modelID }  , 
84+         availableModels, 
85+       } , 
7286      _meta : { } , 
7387    } 
7488  } 
7589
90+   async  setSessionModel ( params : SetSessionModelRequest ) : Promise < SetSessionModelResponse >  { 
91+     this . log . info ( "setSessionModel" ,  {  sessionId : params . sessionId ,  modelId : params . modelId  } ) 
92+ 
93+     const  session  =  this . sessionManager . get ( params . sessionId ) 
94+     if  ( ! session )  { 
95+       throw  new  Error ( `Session not found: ${ params . sessionId }  ) 
96+     } 
97+ 
98+     const  parsed  =  Provider . parseModel ( params . modelId ) 
99+     const  model  =  await  Provider . getModel ( parsed . providerID ,  parsed . modelID ) 
100+ 
101+     this . sessionManager . setModel ( session . id ,  { 
102+       providerID : model . providerID , 
103+       modelID : model . modelID , 
104+     } ) 
105+ 
106+     return  { 
107+       _meta : { } , 
108+     } 
109+   } 
110+ 
111+   private  async  defaultModel ( )  { 
112+     const  configured  =  this . config . defaultModel 
113+     if  ( configured )  return  configured 
114+     return  Provider . defaultModel ( ) 
115+   } 
116+ 
117+   private  async  availableModels ( )  { 
118+     const  providers  =  await  Provider . list ( ) 
119+     const  entries  =  Object . entries ( providers ) . sort ( ( a ,  b )  =>  { 
120+       const  nameA  =  a [ 1 ] . info . name . toLowerCase ( ) 
121+       const  nameB  =  b [ 1 ] . info . name . toLowerCase ( ) 
122+       if  ( nameA  <  nameB )  return  - 1 
123+       if  ( nameA  >  nameB )  return  1 
124+       return  0 
125+     } ) 
126+     return  entries . flatMap ( ( [ providerID ,  provider ] )  =>  { 
127+       const  models  =  Provider . sort ( Object . values ( provider . info . models ) ) 
128+       return  models . map ( ( model )  =>  ( { 
129+         modelId : `${ providerID } ${ model . id }  , 
130+         name : `${ provider . info . name } ${ model . name }  , 
131+       } ) ) 
132+     } ) 
133+   } 
134+ 
76135  async  prompt ( params : PromptRequest ) : Promise < PromptResponse >  { 
77136    this . log . info ( "prompt" ,  { 
78137      sessionId : params . sessionId , 
@@ -84,7 +143,11 @@ export class OpenCodeAgent implements Agent {
84143      throw  new  Error ( `Session not found: ${ params . sessionId }  ) 
85144    } 
86145
87-     const  model  =  this . config . defaultModel  ||  ( await  Provider . defaultModel ( ) ) 
146+     const  current  =  acpSession . model 
147+     const  model  =  current  ??  ( await  this . defaultModel ( ) ) 
148+     if  ( ! current )  { 
149+       this . sessionManager . setModel ( acpSession . id ,  model ) 
150+     } 
88151
89152    const  parts  =  params . prompt . map ( ( content )  =>  { 
90153      if  ( content . type  ===  "text" )  { 
0 commit comments