37 lines
882 B
TypeScript
37 lines
882 B
TypeScript
import fs from "fs"
|
|
import * as tty from "node:tty"
|
|
|
|
export const INTERACTIVE_INPUT_ERROR = "opencode mini requires a controlling terminal for input"
|
|
|
|
type InteractiveStdin = {
|
|
stdin: NodeJS.ReadStream
|
|
cleanup?: () => void
|
|
}
|
|
|
|
function openTerminalStdin(path: string): NodeJS.ReadStream {
|
|
return new tty.ReadStream(fs.openSync(path, "r"))
|
|
}
|
|
|
|
export function resolveInteractiveStdin(
|
|
stdin: NodeJS.ReadStream = process.stdin,
|
|
open: (path: string) => NodeJS.ReadStream = openTerminalStdin,
|
|
platform = process.platform,
|
|
): InteractiveStdin {
|
|
if (stdin.isTTY) {
|
|
return { stdin }
|
|
}
|
|
|
|
const file = platform === "win32" ? "CONIN$" : "/dev/tty"
|
|
|
|
try {
|
|
const stream = open(file)
|
|
return {
|
|
stdin: stream,
|
|
cleanup: () => {
|
|
stream.destroy()
|
|
},
|
|
}
|
|
} catch (error) {
|
|
throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })
|
|
}
|
|
}
|