summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-30 10:34:55 -0600
committerAdam <[email protected]>2025-12-30 10:34:55 -0600
commitdff1fe2d2856ea83f7c874469811e945e3c7b04f (patch)
treefdeb2338a4072777684812882f7572b7b9227e41
parent72ab4260eed8da8d10a2749ea164982943fe1cd4 (diff)
downloadopencode-dff1fe2d2856ea83f7c874469811e945e3c7b04f.tar.gz
opencode-dff1fe2d2856ea83f7c874469811e945e3c7b04f.zip
fix(desktop): sort servers by health
-rw-r--r--packages/app/src/components/dialog-select-server.tsx21
1 files changed, 20 insertions, 1 deletions
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx
index 99b1c4278..6d224c6c3 100644
--- a/packages/app/src/components/dialog-select-server.tsx
+++ b/packages/app/src/components/dialog-select-server.tsx
@@ -46,6 +46,25 @@ export function DialogSelectServer() {
const current = createMemo(() => items().find((x) => x === server.url) ?? items()[0])
+ const sortedItems = createMemo(() => {
+ const list = items()
+ if (!list.length) return list
+ const active = current()
+ const order = new Map(list.map((url, index) => [url, index] as const))
+ const rank = (value?: ServerStatus) => {
+ if (value?.healthy === true) return 0
+ if (value?.healthy === false) return 2
+ return 1
+ }
+ return list.slice().sort((a, b) => {
+ if (a === active) return -1
+ if (b === active) return 1
+ const diff = rank(store.status[a]) - rank(store.status[b])
+ if (diff !== 0) return diff
+ return (order.get(a) ?? 0) - (order.get(b) ?? 0)
+ })
+ })
+
async function refreshHealth() {
const results: Record<string, ServerStatus> = {}
await Promise.all(
@@ -101,7 +120,7 @@ export function DialogSelectServer() {
<List
search={{ placeholder: "Search servers", autofocus: true }}
emptyMessage="No servers yet"
- items={items}
+ items={sortedItems}
key={(x) => x}
current={current()}
onSelect={(x) => {