diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
index b1616b95..3841be0d 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -1792,7 +1792,7 @@ export function Prompt(props: PromptProps) {
return (
- {retryText()}
+ {retryText()}
)
diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx
index edc5608b..55da7f0e 100644
--- a/packages/opencode/src/cli/cmd/tui/context/local.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx
@@ -7,12 +7,15 @@ import { uniqueBy } from "remeda"
import path from "path"
import { Global } from "@/global"
import { iife } from "@/util/iife"
+import { Log } from "@/util"
import { useToast } from "../ui/toast"
import { useArgs } from "./args"
import { useSDK } from "./sdk"
import { RGBA } from "@opentui/core"
import { Filesystem } from "@/util"
+const log = Log.create({ service: "tui.local" })
+
export function parseModel(model: string) {
const [providerID, ...rest] = model.split("/")
return {
@@ -151,7 +154,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
if (Array.isArray(x.favorite)) setModelStore("favorite", x.favorite)
if (typeof x.variant === "object" && x.variant !== null) setModelStore("variant", x.variant)
})
- .catch(() => {})
+ .catch((err: any) => log.warn("Failed to read model preferences", { error: String(err) }))
.finally(() => {
setModelStore("ready", true)
if (state.pending) save()
diff --git a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
index 22561844..51283eb8 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx
@@ -3,6 +3,7 @@ import type { GlobalEvent } from "@mimo-ai/sdk/v2"
import { createSimpleContext } from "./helper"
import { createGlobalEmitter } from "@solid-primitives/event-bus"
import { Flag } from "@/flag/flag"
+import { Log } from "@/util"
import { batch, onCleanup, onMount } from "solid-js"
export type EventSource = {
@@ -18,6 +19,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
headers?: RequestInit["headers"]
events?: EventSource
}) => {
+ const log = Log.create({ service: "tui.sdk" })
const abort = new AbortController()
let sse: AbortController | undefined
@@ -90,7 +92,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
if (Flag.MIMOCODE_EXPERIMENTAL_WORKSPACES) {
// Start syncing workspaces, it's important to do this after
// we've started listening to events
- await sdk.sync.start().catch(() => {})
+ await sdk.sync.start().catch((err: any) => log.warn("Workspace sync failed", { error: String(err) }))
}
for await (const event of events.stream) {
@@ -107,7 +109,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
const backoff = Math.min(retryDelay * 2 ** (attempt - 1), maxRetryDelay)
await new Promise((resolve) => setTimeout(resolve, backoff))
}
- })().catch(() => {})
+ }).catch((err: any) => log.error("SSE event loop crashed", { error: String(err) }))
}
onMount(async () => {
@@ -118,7 +120,7 @@ export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
if (Flag.MIMOCODE_EXPERIMENTAL_WORKSPACES) {
// Start syncing workspaces, it's important to do this after
// we've started listening to events
- await sdk.sync.start().catch(() => {})
+ await sdk.sync.start().catch((err: any) => log.warn("Workspace sync failed", { error: String(err) }))
}
} else {
startSSE()
diff --git a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
index 7f93ca84..45068689 100644
--- a/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
+++ b/packages/opencode/src/cli/cmd/tui/plugin/runtime.ts
@@ -90,19 +90,16 @@ const EMPTY_TUI: TuiPluginModule = {
function fail(message: string, data: Record) {
if (!("error" in data)) {
log.error(message, data)
- console.error(`[tui.plugin] ${message}`, data)
return
}
const text = `${message}: ${errorMessage(data.error)}`
const next = { ...data, error: errorData(data.error) }
log.error(text, next)
- console.error(`[tui.plugin] ${text}`, next)
}
function warn(message: string, data: Record) {
log.warn(message, data)
- console.warn(`[tui.plugin] ${message}`, data)
}
type CleanupResult = { type: "ok" } | { type: "error"; error: unknown } | { type: "timeout" }