Skip to content

Commit 5eda46d

Browse files
kommanderdemostanis
authored andcommitted
guard tui exit (anomalyco#16640)
1 parent 7a74fc5 commit 5eda46d

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
@@ -112,7 +112,6 @@ export function tui(input: {
112112
fetch?: typeof fetch
113113
headers?: RequestInit["headers"]
114114
events?: EventSource
115-
onExit?: () => Promise<void>
116115
}) {
117116
// promise to prevent immediate exit
118117
return new Promise<void>(async (resolve) => {
@@ -127,7 +126,6 @@ export function tui(input: {
127126

128127
const onExit = async () => {
129128
unguard?.()
130-
await input.onExit?.()
131129
resolve()
132130
}
133131

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)