From 753d312c28519b0c060a56e69e8cde971b3719bb Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Fri, 26 Jun 2026 19:44:28 +1000 Subject: [PATCH] fix(tui): preserve renderer initialization errors (#33996) Co-authored-by: Shoubhit Dash --- packages/tui/src/app.tsx | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx index 57b99c45ce..fecf71b6c8 100644 --- a/packages/tui/src/app.tsx +++ b/packages/tui/src/app.tsx @@ -8,7 +8,7 @@ import { ClipboardProvider, useClipboard } from "./context/clipboard" import { ExitProvider, useExit } from "./context/exit" import { EpilogueProvider } from "./context/epilogue" import * as Selection from "./util/selection" -import { createCliRenderer, MouseButton, type CliRenderer } from "@opentui/core" +import { createCliRenderer, MouseButton } from "@opentui/core" import { RouteProvider, useRoute } from "./context/route" import { Switch, @@ -183,21 +183,23 @@ export const run = Effect.fn("Tui.run")(function* (input: TuiInput) { const result = yield* Effect.scoped( Effect.gen(function* () { const renderer = yield* Effect.acquireRelease( - Effect.tryPromise(() => - createCliRenderer({ - externalOutputMode: "passthrough", - targetFps: 60, - gatherStats: false, - exitOnCtrlC: false, - useKittyKeyboard: {}, - autoFocus: false, - openConsoleOnError: false, - useMouse: !Flag.OPENCODE_DISABLE_MOUSE && input.config.mouse, - consoleOptions: { - keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }], - }, - }), - ), + Effect.tryPromise({ + try: () => + createCliRenderer({ + externalOutputMode: "passthrough", + targetFps: 60, + gatherStats: false, + exitOnCtrlC: false, + useKittyKeyboard: {}, + autoFocus: false, + openConsoleOnError: false, + useMouse: !Flag.OPENCODE_DISABLE_MOUSE && input.config.mouse, + consoleOptions: { + keyBindings: [{ name: "y", ctrl: true, action: "copy-selection" }], + }, + }), + catch: (error) => (error instanceof Error ? error : new Error(String(error))), + }), (renderer) => Effect.sync(() => { destroyRenderer(renderer)