diff --git a/packages/opencode/src/global/index.ts b/packages/opencode/src/global/index.ts index 869019e2ce74..6669bdae0949 100644 --- a/packages/opencode/src/global/index.ts +++ b/packages/opencode/src/global/index.ts @@ -49,6 +49,9 @@ if (version !== CACHE_VERSION) { }), ), ) - } catch (e) {} + } catch (e) { + // Log cache cleanup failure but continue - non-critical operation + console.warn("Failed to clean cache directory:", e) + } await Filesystem.write(path.join(Global.Path.cache, "version"), CACHE_VERSION) } diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index c6784f450244..cd57b228fc1e 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1372,7 +1372,14 @@ export namespace Provider { const mod = await import(installedPath) - const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!] + const createKey = Object.keys(mod).find((key) => key.startsWith("create")) + if (!createKey) { + throw new InitError( + { providerID: model.providerID }, + { cause: new Error(`No create function found in module ${installedPath}`) }, + ) + } + const fn = mod[createKey] const loaded = fn({ name: model.providerID, ...options, diff --git a/packages/opencode/src/util/rpc.ts b/packages/opencode/src/util/rpc.ts index ebd8be40e455..212f07e87abd 100644 --- a/packages/opencode/src/util/rpc.ts +++ b/packages/opencode/src/util/rpc.ts @@ -5,10 +5,31 @@ export namespace Rpc { export function listen(rpc: Definition) { onmessage = async (evt) => { - const parsed = JSON.parse(evt.data) - if (parsed.type === "rpc.request") { - const result = await rpc[parsed.method](parsed.input) - postMessage(JSON.stringify({ type: "rpc.result", result, id: parsed.id })) + try { + const parsed = JSON.parse(evt.data) + if (parsed.type === "rpc.request") { + const method = rpc[parsed.method] + if (!method) { + postMessage( + JSON.stringify({ + type: "rpc.error", + id: parsed.id, + error: `Unknown method: ${parsed.method}`, + }), + ) + return + } + const result = await method(parsed.input) + postMessage(JSON.stringify({ type: "rpc.result", result, id: parsed.id })) + } + } catch (e) { + // Send error response for JSON parse errors or method execution failures + postMessage( + JSON.stringify({ + type: "rpc.error", + error: e instanceof Error ? e.message : String(e), + }), + ) } } }