From 9c8a4ea4ffae6ab53be4b19a3e88ff966e882221 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sat, 12 Sep 2026 18:56:37 -0400 Subject: [PATCH] fix(cli): replace update preflight renderer --- .../cli/src/services/update-preflight.tsx | 50 ++++++------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/packages/cli/src/services/update-preflight.tsx b/packages/cli/src/services/update-preflight.tsx index c163b0a93d3..f5e76d9ae35 100644 --- a/packages/cli/src/services/update-preflight.tsx +++ b/packages/cli/src/services/update-preflight.tsx @@ -1,7 +1,7 @@ /** @jsxImportSource @opentui/solid */ // Split-footer status shown while a freshly launched CLI replaces a // version-mismatched background service before the TUI attaches. -import { createCliRenderer, RGBA, TextAttributes, type CliRenderer, type ThemeMode } from "@opentui/core" +import { createCliRenderer, RGBA, TextAttributes, type CliRenderer } from "@opentui/core" import { render, useTerminalDimensions } from "@opentui/solid" import { OPENCODE_VERSION } from "../version" import { registerOpencodeSpinner } from "@opencode/tui/component/register-spinner" @@ -30,17 +30,11 @@ const completionHold = 650 export type Handle = { readonly begin: (from?: string) => boolean readonly loading: () => void - readonly finish: () => Promise + readonly finish: () => Promise readonly fail: (message: string) => Promise readonly close: () => Promise } -export type Handoff = { - readonly renderer: CliRenderer - readonly mode: ThemeMode | null - readonly complete: () => void -} - export const make = (): Handle => { let session: Promise | undefined return { @@ -72,7 +66,7 @@ export const make = (): Handle => { type Session = { readonly loading: () => Promise - readonly finish: () => Promise + readonly finish: () => Promise readonly fail: (message: string) => Promise readonly close: () => Promise } @@ -83,7 +77,6 @@ async function open(from?: string): Promise { const [outcome, setOutcome] = createSignal<"running" | "success" | "failure">("running") const [failure, setFailure] = createSignal("") const [animating, setAnimating] = createSignal(true) - const [visible, setVisible] = createSignal(true) let resolveOutcome: (() => void) | undefined const renderer = await createCliRenderer({ stdin: process.stdin, @@ -101,20 +94,17 @@ async function open(from?: string): Promise { externalOutputMode: "capture-stdout", consoleMode: "disabled", }) - const terminalMode = renderer.waitForThemeMode(1000).catch(() => null) await render( () => ( - - resolveOutcome?.()} - /> - + resolveOutcome?.()} + /> ), renderer, ).catch((error) => { @@ -148,10 +138,8 @@ async function open(from?: string): Promise { if (completed) await setTimeout(hold) } let closing: Promise | undefined - let transferred = false const close = () => (closing ??= (async () => { - if (transferred) return setAnimating(false) if (renderer.isDestroyed) return renderer.pause() @@ -174,18 +162,8 @@ async function open(from?: string): Promise { await waitForStage() await transitionTo("success", completionHold) }) - const mode = await terminalMode - renderer.externalOutputMode = "passthrough" - renderer.screenMode = "alternate-screen" - renderer.consoleMode = "console-overlay" - renderer.requestRender() - await Promise.race([renderer.idle(), setTimeout(500)]) - transferred = true - return { - renderer, - mode, - complete: () => setVisible(false), - } + await close() + return undefined }, fail: (message) => settle(async () => {