fix: preserve sessions when bootstrap races with event stream

Two fixes for intermittent "sessions missing at app launch":

- loadSessions: if session.list comes back empty but the store already
  has sessions populated via WS events, don't clobber. OpenCode can
  answer HTTP with [] while the WS snapshot is still arriving.
- loadSessions: wrap SDK errors preserving HTTP status so retry()'s
  transient detection (5xx) actually fires. String(errorObject) was
  erasing the status and retry gave up after one attempt.
- retry: broaden transient 5xx window from just 502/503 to any 5xx.
  OpenCode can return 500/504 while warming up (session store reading
  from disk), and those deserve the same retry treatment.
- Log bootstrap empty-session retries for future diagnosis.
This commit is contained in:
Bohdan Triapitsyn
2026-04-20 21:42:16 +03:00
parent c2eeadd9a3
commit 895edaf557
2 changed files with 30 additions and 5 deletions
+3 -2
View File
@@ -24,9 +24,10 @@ function isTransientError(error: unknown): boolean {
if (!error) return false
const message = String(error instanceof Error ? error.message : error).toLowerCase()
if (TRANSIENT_MESSAGES.some((m) => message.includes(m))) return true
// SDK errors from HTTP 502/503 responses (VS Code bridge returns these before OpenCode is ready)
// Any HTTP 5xx is considered transient — server-side issues during warmup
// (OpenCode reading sessions from disk, bridge not ready, etc.) are retryable.
const status = (error as { status?: number })?.status
if (status === 502 || status === 503) return true
if (typeof status === "number" && status >= 500 && status < 600) return true
return false
}