@@ -98,6 +98,7 @@ export interface Provider {
9898 models : Record < string , Model > ;
9999 options ?: Record < string , unknown > ;
100100 source ?: ProviderSource ;
101+ isConnected ?: boolean ;
101102}
102103
103104export interface ProviderWithModels {
@@ -108,6 +109,7 @@ export interface ProviderWithModels {
108109 npm ?: string ;
109110 models : Model [ ] ;
110111 source : ProviderSource ;
112+ isConnected : boolean ;
111113}
112114
113115interface ConfigProvider {
@@ -139,23 +141,21 @@ function classifyProviderSource(providerId: string, isFromConfig: boolean): Prov
139141 return "configured" ;
140142}
141143
142- function getProviderPriority ( source : ProviderSource ) : number {
143- switch ( source ) {
144- case "configured" : return 1 ;
145- case "local" : return 2 ;
146- case "builtin" : return 3 ;
147- default : return 4 ;
148- }
149- }
150-
151144
145+ interface OpenCodeProviderResponse {
146+ all : OpenCodeProvider [ ] ;
147+ connected : string [ ] ;
148+ default : Record < string , string > ;
149+ }
152150
153- async function getProvidersFromOpenCodeServer ( ) : Promise < Provider [ ] > {
151+ async function getProvidersFromOpenCodeServer ( ) : Promise < { providers : Provider [ ] ; connected : string [ ] } > {
154152 try {
155- const response = await axios . get ( `${ API_BASE_URL } /api/opencode/provider` ) ;
153+ const response = await axios . get < OpenCodeProviderResponse > ( `${ API_BASE_URL } /api/opencode/provider` ) ;
156154
157155 if ( response ?. data ?. all && Array . isArray ( response . data . all ) ) {
158- return response . data . all . map ( ( openCodeProvider : OpenCodeProvider ) => {
156+ const connectedSet = new Set ( response . data . connected || [ ] ) ;
157+
158+ const providers = response . data . all . map ( ( openCodeProvider : OpenCodeProvider ) => {
159159 const models : Record < string , Model > = { } ;
160160
161161 Object . entries ( openCodeProvider . models ) . forEach ( ( [ modelId , openCodeModel ] ) => {
@@ -196,21 +196,24 @@ async function getProvidersFromOpenCodeServer(): Promise<Provider[]> {
196196 env : openCodeProvider . env ,
197197 models,
198198 options : openCodeProvider . options ,
199+ isConnected : connectedSet . has ( openCodeProvider . id ) ,
199200 } ;
200201 } ) ;
202+
203+ return { providers, connected : response . data . connected || [ ] } ;
201204 }
202205 } catch ( error ) {
203206 console . warn ( "Failed to load providers from OpenCode server" , error ) ;
204207 }
205208
206- return [ ] ;
209+ return { providers : [ ] , connected : [ ] } ;
207210}
208211
209- export async function getProviders ( ) : Promise < Provider [ ] > {
212+ export async function getProviders ( ) : Promise < { providers : Provider [ ] ; connected : string [ ] } > {
210213 return await getProvidersFromOpenCodeServer ( ) ;
211214}
212215
213- async function getConfiguredProviders ( ) : Promise < ProviderWithModels [ ] > {
216+ async function getConfiguredProviders ( connectedIds : Set < string > ) : Promise < ProviderWithModels [ ] > {
214217 try {
215218 const config = await settingsApi . getDefaultOpenCodeConfig ( ) ;
216219 if ( ! config ?. content ?. provider ) return [ ] ;
@@ -247,6 +250,7 @@ async function getConfiguredProviders(): Promise<ProviderWithModels[]> {
247250 npm : providerConfig . npm ,
248251 models,
249252 source,
253+ isConnected : connectedIds . has ( providerId ) ,
250254 } ) ;
251255 }
252256
@@ -258,11 +262,10 @@ async function getConfiguredProviders(): Promise<ProviderWithModels[]> {
258262}
259263
260264export async function getProvidersWithModels ( ) : Promise < ProviderWithModels [ ] > {
261- const [ builtinProviders , configuredProviders ] = await Promise . all ( [
262- getProviders ( ) ,
263- getConfiguredProviders ( ) ,
264- ] ) ;
265-
265+ const { providers : builtinProviders , connected } = await getProviders ( ) ;
266+ const connectedIds = new Set ( connected ) ;
267+
268+ const configuredProviders = await getConfiguredProviders ( connectedIds ) ;
266269 const configuredIds = new Set ( configuredProviders . map ( ( p ) => p . id ) ) ;
267270
268271 const builtinResult : ProviderWithModels [ ] = builtinProviders
@@ -281,15 +284,16 @@ export async function getProvidersWithModels(): Promise<ProviderWithModels[]> {
281284 npm : provider . npm ,
282285 models,
283286 source : "builtin" as ProviderSource ,
287+ isConnected : provider . isConnected ?? false ,
284288 } ;
285289 } ) ;
286290
287291 const allProviders = [ ...configuredProviders , ...builtinResult ] ;
288292
289293 allProviders . sort ( ( a , b ) => {
290- const priorityA = getProviderPriority ( a . source ) ;
291- const priorityB = getProviderPriority ( b . source ) ;
292- if ( priorityA !== priorityB ) return priorityA - priorityB ;
294+ if ( a . isConnected !== b . isConnected ) {
295+ return a . isConnected ? - 1 : 1 ;
296+ }
293297 return a . name . localeCompare ( b . name ) ;
294298 } ) ;
295299
0 commit comments