@@ -4,7 +4,7 @@ import { AsciiLogo } from "@opencode-ai/ui/logo"
44import { Button } from "@opencode-ai/ui/button"
55import { TextField } from "@opencode-ai/ui/text-field"
66import { Icon } from "@opencode-ai/ui/icon"
7- import { normalizeServerUrl , serverDisplayName , useServer } from "@/context/server"
7+ import { normalizeServerUrl , ServerConnection , serverDisplayName , useServer } from "@/context/server"
88import { usePlatform } from "@/context/platform"
99import { createOpencodeClient } from "@opencode-ai/sdk/v2/client"
1010import { isHostedEnvironment , hasUrlQueryParam , getUrlQueryParam } from "@/utils/hosted"
@@ -46,14 +46,15 @@ export function WelcomeScreen(props: WelcomeScreenProps) {
4646
4747 const items = createMemo ( ( ) => {
4848 const list = server . list
49- return list . filter ( ( x ) => x !== props . attemptedUrl )
49+ return list . filter ( ( x ) => ServerConnection . key ( x ) !== props . attemptedUrl )
5050 } )
5151
5252 async function refreshHealth ( ) {
5353 const results : Record < string , ServerStatus > = { }
5454 await Promise . all (
55- items ( ) . map ( async ( url ) => {
56- results [ url ] = await checkHealth ( url , platform . fetch )
55+ items ( ) . map ( async ( conn ) => {
56+ const key = ServerConnection . key ( conn )
57+ results [ key ] = await checkHealth ( conn . http . url , platform . fetch )
5758 } ) ,
5859 )
5960 setStore ( "status" , reconcile ( results ) )
@@ -84,7 +85,7 @@ export function WelcomeScreen(props: WelcomeScreenProps) {
8485 if ( persist ) {
8586 server . add ( normalized )
8687 } else {
87- server . setActive ( normalized )
88+ server . setActive ( ServerConnection . Key . make ( normalized ) )
8889 }
8990 props . onRetry ?.( )
9091 }
@@ -177,32 +178,35 @@ export function WelcomeScreen(props: WelcomeScreenProps) {
177178 < h2 class = "text-sm font-medium text-text-strong" > Saved Servers</ h2 >
178179 < div class = "flex flex-col gap-2" >
179180 < For each = { items ( ) } >
180- { ( url ) => (
181- < button
182- type = "button"
183- class = "flex items-center gap-3 p-2 rounded hover:bg-background-base transition-colors text-left"
184- onClick = { ( ) => handleConnect ( url ) }
185- disabled = { store . status [ url ] ?. healthy === false }
186- >
187- < div
188- classList = { {
189- "size-2 rounded-full shrink-0" : true ,
190- "bg-icon-success-base" : store . status [ url ] ?. healthy === true ,
191- "bg-icon-critical-base" : store . status [ url ] ?. healthy === false ,
192- "bg-border-weak-base" : store . status [ url ] === undefined ,
193- } }
194- />
195- < span
196- class = "truncate text-sm"
197- classList = { { "text-text-weak" : store . status [ url ] ?. healthy === false } }
181+ { ( conn ) => {
182+ const key = ServerConnection . key ( conn )
183+ return (
184+ < button
185+ type = "button"
186+ class = "flex items-center gap-3 p-2 rounded hover:bg-background-base transition-colors text-left"
187+ onClick = { ( ) => handleConnect ( conn . http . url ) }
188+ disabled = { store . status [ key ] ?. healthy === false }
198189 >
199- { serverDisplayName ( url ) }
200- </ span >
201- < Show when = { store . status [ url ] ?. version } >
202- < span class = "text-xs text-text-weak ml-auto" > { store . status [ url ] ?. version } </ span >
203- </ Show >
204- </ button >
205- ) }
190+ < div
191+ classList = { {
192+ "size-2 rounded-full shrink-0" : true ,
193+ "bg-icon-success-base" : store . status [ key ] ?. healthy === true ,
194+ "bg-icon-critical-base" : store . status [ key ] ?. healthy === false ,
195+ "bg-border-weak-base" : store . status [ key ] === undefined ,
196+ } }
197+ />
198+ < span
199+ class = "truncate text-sm"
200+ classList = { { "text-text-weak" : store . status [ key ] ?. healthy === false } }
201+ >
202+ { serverDisplayName ( conn ) }
203+ </ span >
204+ < Show when = { store . status [ key ] ?. version } >
205+ < span class = "text-xs text-text-weak ml-auto" > { store . status [ key ] ?. version } </ span >
206+ </ Show >
207+ </ button >
208+ )
209+ } }
206210 </ For >
207211 </ div >
208212 </ div >
0 commit comments