mirror of
https://github.com/anomalyco/opencode.git
synced 2026-04-25 07:15:19 +00:00
60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import { useRenderer } from "@opentui/solid"
|
|
import { createSimpleContext } from "./helper"
|
|
import { FormatError, FormatUnknownError } from "@/cli/error"
|
|
import { win32FlushInputBuffer } from "../win32"
|
|
type Exit = ((reason?: unknown) => Promise<void>) & {
|
|
message: {
|
|
set: (value?: string) => () => void
|
|
clear: () => void
|
|
get: () => string | undefined
|
|
}
|
|
}
|
|
|
|
export const { use: useExit, provider: ExitProvider } = createSimpleContext({
|
|
name: "Exit",
|
|
init: (input: { onExit?: () => Promise<void> }) => {
|
|
const renderer = useRenderer()
|
|
let message: string | undefined
|
|
let task: Promise<void> | undefined
|
|
const store = {
|
|
set: (value?: string) => {
|
|
const prev = message
|
|
message = value
|
|
return () => {
|
|
message = prev
|
|
}
|
|
},
|
|
clear: () => {
|
|
message = undefined
|
|
},
|
|
get: () => message,
|
|
}
|
|
const exit: Exit = Object.assign(
|
|
(reason?: unknown) => {
|
|
if (task) return task
|
|
task = (async () => {
|
|
// Reset window title before destroying renderer
|
|
renderer.setTerminalTitle("")
|
|
renderer.destroy()
|
|
win32FlushInputBuffer()
|
|
if (reason) {
|
|
const formatted = FormatError(reason) ?? FormatUnknownError(reason)
|
|
if (formatted) {
|
|
process.stderr.write(formatted + "\n")
|
|
}
|
|
}
|
|
const text = store.get()
|
|
if (text) process.stdout.write(text + "\n")
|
|
await input.onExit?.()
|
|
})()
|
|
return task
|
|
},
|
|
{
|
|
message: store,
|
|
},
|
|
)
|
|
process.on("SIGHUP", () => exit())
|
|
return exit
|
|
},
|
|
})
|