@@ -3,6 +3,7 @@ import { PROVIDERS } from "../config/providers.js";
33import { OAUTH_ENDPOINTS , buildKimiHeaders } from "../config/appConstants.js" ;
44import { buildClineHeaders } from "../../src/shared/utils/clineAuth.js" ;
55import { getCachedClaudeHeaders } from "../utils/claudeHeaderCache.js" ;
6+ import { proxyAwareFetch } from "../utils/proxyFetch.js" ;
67
78export class DefaultExecutor extends BaseExecutor {
89 constructor ( provider ) {
@@ -154,19 +155,19 @@ export class DefaultExecutor extends BaseExecutor {
154155 return headers ;
155156 }
156157
157- async refreshCredentials ( credentials , log ) {
158+ async refreshCredentials ( credentials , log , proxyOptions = null ) {
158159 if ( ! credentials . refreshToken ) return null ;
159160
160161 const refreshers = {
161- claude : ( ) => this . refreshWithJSON ( OAUTH_ENDPOINTS . anthropic . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . claude . clientId } ) ,
162- codex : ( ) => this . refreshWithForm ( OAUTH_ENDPOINTS . openai . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . codex . clientId , scope : "openid profile email offline_access" } ) ,
163- qwen : ( ) => this . refreshWithForm ( OAUTH_ENDPOINTS . qwen . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . qwen . clientId } ) ,
164- iflow : ( ) => this . refreshIflow ( credentials . refreshToken ) ,
165- gemini : ( ) => this . refreshGoogle ( credentials . refreshToken ) ,
166- kiro : ( ) => this . refreshKiro ( credentials . refreshToken ) ,
167- cline : ( ) => this . refreshCline ( credentials . refreshToken ) ,
168- "kimi-coding" : ( ) => this . refreshKimiCoding ( credentials . refreshToken ) ,
169- kilocode : ( ) => this . refreshKilocode ( credentials . refreshToken )
162+ claude : ( ) => this . refreshWithJSON ( OAUTH_ENDPOINTS . anthropic . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . claude . clientId } , proxyOptions ) ,
163+ codex : ( ) => this . refreshWithForm ( OAUTH_ENDPOINTS . openai . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . codex . clientId , scope : "openid profile email offline_access" } , proxyOptions ) ,
164+ qwen : ( ) => this . refreshWithForm ( OAUTH_ENDPOINTS . qwen . token , { grant_type : "refresh_token" , refresh_token : credentials . refreshToken , client_id : PROVIDERS . qwen . clientId } , proxyOptions ) ,
165+ iflow : ( ) => this . refreshIflow ( credentials . refreshToken , proxyOptions ) ,
166+ gemini : ( ) => this . refreshGoogle ( credentials . refreshToken , proxyOptions ) ,
167+ kiro : ( ) => this . refreshKiro ( credentials . refreshToken , proxyOptions ) ,
168+ cline : ( ) => this . refreshCline ( credentials . refreshToken , proxyOptions ) ,
169+ "kimi-coding" : ( ) => this . refreshKimiCoding ( credentials . refreshToken , proxyOptions ) ,
170+ kilocode : ( ) => this . refreshKilocode ( credentials . refreshToken , proxyOptions )
170171 } ;
171172
172173 const refresher = refreshers [ this . provider ] ;
@@ -182,69 +183,69 @@ export class DefaultExecutor extends BaseExecutor {
182183 }
183184 }
184185
185- async refreshWithJSON ( url , body ) {
186- const response = await fetch ( url , {
186+ async refreshWithJSON ( url , body , proxyOptions = null ) {
187+ const response = await proxyAwareFetch ( url , {
187188 method : "POST" ,
188189 headers : { "Content-Type" : "application/json" , "Accept" : "application/json" } ,
189190 body : JSON . stringify ( body )
190- } ) ;
191+ } , proxyOptions ) ;
191192 if ( ! response . ok ) return null ;
192193 const tokens = await response . json ( ) ;
193194 return { accessToken : tokens . access_token , refreshToken : tokens . refresh_token || body . refresh_token , expiresIn : tokens . expires_in } ;
194195 }
195196
196- async refreshWithForm ( url , params ) {
197- const response = await fetch ( url , {
197+ async refreshWithForm ( url , params , proxyOptions = null ) {
198+ const response = await proxyAwareFetch ( url , {
198199 method : "POST" ,
199200 headers : { "Content-Type" : "application/x-www-form-urlencoded" , "Accept" : "application/json" } ,
200201 body : new URLSearchParams ( params )
201- } ) ;
202+ } , proxyOptions ) ;
202203 if ( ! response . ok ) return null ;
203204 const tokens = await response . json ( ) ;
204205 return { accessToken : tokens . access_token , refreshToken : tokens . refresh_token || params . refresh_token , expiresIn : tokens . expires_in } ;
205206 }
206207
207- async refreshIflow ( refreshToken ) {
208+ async refreshIflow ( refreshToken , proxyOptions = null ) {
208209 const basicAuth = btoa ( `${ PROVIDERS . iflow . clientId } :${ PROVIDERS . iflow . clientSecret } ` ) ;
209- const response = await fetch ( OAUTH_ENDPOINTS . iflow . token , {
210+ const response = await proxyAwareFetch ( OAUTH_ENDPOINTS . iflow . token , {
210211 method : "POST" ,
211212 headers : { "Content-Type" : "application/x-www-form-urlencoded" , "Accept" : "application/json" , "Authorization" : `Basic ${ basicAuth } ` } ,
212213 body : new URLSearchParams ( { grant_type : "refresh_token" , refresh_token : refreshToken , client_id : PROVIDERS . iflow . clientId , client_secret : PROVIDERS . iflow . clientSecret } )
213- } ) ;
214+ } , proxyOptions ) ;
214215 if ( ! response . ok ) return null ;
215216 const tokens = await response . json ( ) ;
216217 return { accessToken : tokens . access_token , refreshToken : tokens . refresh_token || refreshToken , expiresIn : tokens . expires_in } ;
217218 }
218219
219- async refreshGoogle ( refreshToken ) {
220- const response = await fetch ( OAUTH_ENDPOINTS . google . token , {
220+ async refreshGoogle ( refreshToken , proxyOptions = null ) {
221+ const response = await proxyAwareFetch ( OAUTH_ENDPOINTS . google . token , {
221222 method : "POST" ,
222223 headers : { "Content-Type" : "application/x-www-form-urlencoded" , "Accept" : "application/json" } ,
223224 body : new URLSearchParams ( { grant_type : "refresh_token" , refresh_token : refreshToken , client_id : this . config . clientId , client_secret : this . config . clientSecret } )
224- } ) ;
225+ } , proxyOptions ) ;
225226 if ( ! response . ok ) return null ;
226227 const tokens = await response . json ( ) ;
227228 return { accessToken : tokens . access_token , refreshToken : tokens . refresh_token || refreshToken , expiresIn : tokens . expires_in } ;
228229 }
229230
230- async refreshKiro ( refreshToken ) {
231- const response = await fetch ( PROVIDERS . kiro . tokenUrl , {
231+ async refreshKiro ( refreshToken , proxyOptions = null ) {
232+ const response = await proxyAwareFetch ( PROVIDERS . kiro . tokenUrl , {
232233 method : "POST" ,
233234 headers : { "Content-Type" : "application/json" , "Accept" : "application/json" , "User-Agent" : "kiro-cli/1.0.0" } ,
234235 body : JSON . stringify ( { refreshToken } )
235- } ) ;
236+ } , proxyOptions ) ;
236237 if ( ! response . ok ) return null ;
237238 const tokens = await response . json ( ) ;
238239 return { accessToken : tokens . accessToken , refreshToken : tokens . refreshToken || refreshToken , expiresIn : tokens . expiresIn } ;
239240 }
240241
241- async refreshCline ( refreshToken ) {
242+ async refreshCline ( refreshToken , proxyOptions = null ) {
242243 console . log ( '[DEBUG] Refreshing Cline token, refreshToken length:' , refreshToken ?. length ) ;
243- const response = await fetch ( "https://api.cline.bot/api/v1/auth/refresh" , {
244+ const response = await proxyAwareFetch ( "https://api.cline.bot/api/v1/auth/refresh" , {
244245 method : "POST" ,
245246 headers : { "Content-Type" : "application/json" , "Accept" : "application/json" } ,
246247 body : JSON . stringify ( { refreshToken, grantType : "refresh_token" , clientType : "extension" } )
247- } ) ;
248+ } , proxyOptions ) ;
248249 console . log ( '[DEBUG] Cline refresh response status:' , response . status ) ;
249250 if ( ! response . ok ) {
250251 const errorText = await response . text ( ) ;
@@ -260,23 +261,23 @@ export class DefaultExecutor extends BaseExecutor {
260261 return { accessToken : data ?. accessToken , refreshToken : data ?. refreshToken || refreshToken , expiresIn } ;
261262 }
262263
263- async refreshKimiCoding ( refreshToken ) {
264+ async refreshKimiCoding ( refreshToken , proxyOptions = null ) {
264265 const kimiHeaders = buildKimiHeaders ( ) ;
265- const response = await fetch ( "https://auth.kimi.com/api/oauth/token" , {
266+ const response = await proxyAwareFetch ( "https://auth.kimi.com/api/oauth/token" , {
266267 method : "POST" ,
267268 headers : {
268269 "Content-Type" : "application/x-www-form-urlencoded" ,
269270 "Accept" : "application/json" ,
270271 ...kimiHeaders
271272 } ,
272273 body : new URLSearchParams ( { grant_type : "refresh_token" , refresh_token : refreshToken , client_id : "17e5f671-d194-4dfb-9706-5516cb48c098" } )
273- } ) ;
274+ } , proxyOptions ) ;
274275 if ( ! response . ok ) return null ;
275276 const tokens = await response . json ( ) ;
276277 return { accessToken : tokens . access_token , refreshToken : tokens . refresh_token || refreshToken , expiresIn : tokens . expires_in } ;
277278 }
278279
279- async refreshKilocode ( refreshToken ) {
280+ async refreshKilocode ( refreshToken , proxyOptions = null ) {
280281 // Kilocode uses device code flow, no refresh token support
281282 return null ;
282283 }
0 commit comments