Skip to content

Commit 49a3a9f

Browse files
authored
guard tui exit (#16640)
1 parent e51ed46 commit 49a3a9f

2 files changed

Lines changed: 18 additions & 15 deletions

File tree

packages/opencode/src/cli/cmd/tui/app.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ export function tui(input: {
111111
fetch?: typeof fetch
112112
headers?: RequestInit["headers"]
113113
events?: EventSource
114-
onExit?: () => Promise<void>
115114
}) {
116115
// promise to prevent immediate exit
117116
return new Promise<void>(async (resolve) => {
@@ -126,7 +125,6 @@ export function tui(input: {
126125

127126
const onExit = async () => {
128127
unguard?.()
129-
await input.onExit?.()
130128
resolve()
131129
}
132130

packages/opencode/src/cli/cmd/tui/context/exit.tsx

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const { use: useExit, provider: ExitProvider } = createSimpleContext({
1515
init: (input: { onExit?: () => Promise<void> }) => {
1616
const renderer = useRenderer()
1717
let message: string | undefined
18+
let task: Promise<void> | undefined
1819
const store = {
1920
set: (value?: string) => {
2021
const prev = message
@@ -29,20 +30,24 @@ export const { use: useExit, provider: ExitProvider } = createSimpleContext({
2930
get: () => message,
3031
}
3132
const exit: Exit = Object.assign(
32-
async (reason?: unknown) => {
33-
// Reset window title before destroying renderer
34-
renderer.setTerminalTitle("")
35-
renderer.destroy()
36-
win32FlushInputBuffer()
37-
if (reason) {
38-
const formatted = FormatError(reason) ?? FormatUnknownError(reason)
39-
if (formatted) {
40-
process.stderr.write(formatted + "\n")
33+
(reason?: unknown) => {
34+
if (task) return task
35+
task = (async () => {
36+
// Reset window title before destroying renderer
37+
renderer.setTerminalTitle("")
38+
renderer.destroy()
39+
win32FlushInputBuffer()
40+
if (reason) {
41+
const formatted = FormatError(reason) ?? FormatUnknownError(reason)
42+
if (formatted) {
43+
process.stderr.write(formatted + "\n")
44+
}
4145
}
42-
}
43-
const text = store.get()
44-
if (text) process.stdout.write(text + "\n")
45-
await input.onExit?.()
46+
const text = store.get()
47+
if (text) process.stdout.write(text + "\n")
48+
await input.onExit?.()
49+
})()
50+
return task
4651
},
4752
{
4853
message: store,

0 commit comments

Comments
 (0)