From f129ac93c508c2cbe45e8342bbf59ce4ba04acdc Mon Sep 17 00:00:00 2001 From: herr kaste Date: Wed, 25 Feb 2026 12:05:27 +0100 Subject: [PATCH] fix(tui): load koffi via createRequire in ESM (#1627) The previous lazy-loading change switched to require("koffi") inside enableWindowsVTInput(). In ESM, require is undefined, so the call threw and VT input mode was silently not enabled on Windows. Use createRequire(import.meta.url) at module scope and cjsRequire("koffi") at the call site. This keeps koffi externalized for Bun binaries while restoring Windows VT input behavior, including multiline paste handling. --- packages/tui/src/terminal.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/tui/src/terminal.ts b/packages/tui/src/terminal.ts index 52f6361c..5ebb4967 100644 --- a/packages/tui/src/terminal.ts +++ b/packages/tui/src/terminal.ts @@ -1,7 +1,10 @@ import * as fs from "node:fs"; +import { createRequire } from "node:module"; import { setKittyProtocolActive } from "./keys.js"; import { StdinBuffer } from "./stdin-buffer.js"; +const cjsRequire = createRequire(import.meta.url); + /** * Minimal terminal interface for TUI */ @@ -176,7 +179,7 @@ export class ProcessTerminal implements Terminal { // Dynamic require to avoid bundling koffi's 74MB of cross-platform // native binaries into every compiled binary. Koffi is only needed // on Windows for VT input support. - const koffi = require("koffi"); + const koffi = cjsRequire("koffi"); const k32 = koffi.load("kernel32.dll"); const GetStdHandle = k32.func("void* __stdcall GetStdHandle(int)"); const GetConsoleMode = k32.func("bool __stdcall GetConsoleMode(void*, _Out_ uint32_t*)");