From 07b1f8d3cd7ff975197c8e64181ce5c52277fd65 Mon Sep 17 00:00:00 2001 From: Weilu Jia Date: Fri, 20 Feb 2026 21:11:05 -0800 Subject: [PATCH] fix: gracefully handle well-known provider being down --- packages/opencode/src/config/config.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index aad0fd76c4be..d93e3dbfae7e 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -81,20 +81,25 @@ export namespace Config { for (const [key, value] of Object.entries(auth)) { if (value.type === "wellknown") { process.env[value.key] = value.token - log.debug("fetching remote config", { url: `${key}/.well-known/opencode` }) - const response = await fetch(`${key}/.well-known/opencode`) - if (!response.ok) { - throw new Error(`failed to fetch remote config from ${key}: ${response.status}`) + const url = `${key}/.well-known/opencode` + const cached = path.join(Global.Path.cache, "wellknown", key.replaceAll(/[^a-zA-Z0-9.-]/g, "_") + ".json") + log.debug("fetching remote config", { url }) + const response = await fetch(url, { signal: AbortSignal.timeout(10_000) }).catch(() => undefined) + const fetched = response?.ok ? await response.json().catch(() => undefined) : undefined + if (fetched) await Filesystem.writeJson(cached, fetched) + if (!fetched) log.warn("failed to fetch remote config, trying cache", { url }) + const wellknown = fetched ?? (await Filesystem.readJson(cached).catch(() => undefined)) + if (!wellknown) { + log.warn("no cached remote config available", { url }) + continue } - const wellknown = (await response.json()) as any const remoteConfig = wellknown.config ?? {} - // Add $schema to prevent load() from trying to write back to a non-existent file if (!remoteConfig.$schema) remoteConfig.$schema = "https://opencode.ai/config.json" result = merge( result, await load(JSON.stringify(remoteConfig), { - dir: path.dirname(`${key}/.well-known/opencode`), - source: `${key}/.well-known/opencode`, + dir: path.dirname(url), + source: url, }), ) log.debug("loaded remote config from well-known", { url: key })