Summary
Command Code renders its full TUI correctly inside a Herdr pane on Windows, but the input box never responds, no characters appear, esc does not dismiss the capacity banner, and ? does not open the shortcuts overlay. The identical build works normally in a plain Windows Terminal tab, so the failure is specific to running inside Herdr's ConPTY.
Herdr is a terminal multiplexer that sits between the outer terminal and the process. I isolated the fault to that boundary: bytes do reach the pane, a minimal Ink 7 useInput app in the same pane works fine, and command-code's own stdin ends
up correctly armed for raw-mode input, yet it never dispatches the keys it receives. I suspect command-code's startup terminal-capability probes, which take exclusive control of process.stdin and unshift leftover reply bytes back into the stream, are being desynchronized by Herdr answering the Kitty keyboard query itself.
Expected Behavior
Typing in the prompt inside a Herdr pane should insert characters into the input box and allow submitting, the same as in any other terminal.
Actual Behavior
The TUI paints completely and correctly (logo, model line, prompt, hint footer), but the process never acts on keyboard input:
- Typing letters, digits, esc, ?, and ctrl+c produces no visible change.
- The prompt stays on the ❯ Ask your question... placeholder indefinitely.
- The "◼ Space Bunny Alpha is free ... · esc to dismiss" banner never goes away.
- Output is unaffected — the UI redraws and the model/API connection works; only input is dead.
Deterministic, not intermittent: I tested continuously for 120 seconds and no keystroke was ever processed. I initially thought it was flaky, but that turned out to be a separate plain-node process in another pane echoing input, not Command Code responding.
What I verified about the boundary:
- Keys DO reach the pane. A PowerShell Host.UI.RawUI.ReadKey watcher running in
the same pane captured every injected keystroke.
- A minimal Ink 7.1.0 app using useInput, launched in the same pane, works
correctly and echoes typed characters.
- Raw mode + on('data'), readline keypress events with setEncoding('utf8'),
and Ink's own addListener('readable') model each all receive keys when tested
standalone in a Herdr pane.
- Input keeps working both before and after a pane enters the alternate screen
(ESC[?1049h), so alternate-screen handling is not the cause.
- Herdr answers the Kitty keyboard protocol query: command-code emits
CSI ? u and receives ESC[?0u back. When I reproduced command-code's probe
sequence in a working Ink app, that reply surfaced as literal typed text
(TYPED: [[?0u12345]), which suggests reply bytes are being re-injected into
the input stream.
- Instrumenting process.stdin during a real command-code launch shows a healthy
steady state — isRaw=true, readable=1, dataListeners=1 — yet no dispatch.
- HERDR_WINDOWS_CONPTY=system does not change the behavior.
The suspected code path is the startup probe in dist/cli.mjs, which forces raw
mode, attaches its own data listener, writes the Kitty query, then on settle
calls stdin.off('data', c), stdin.unshift(leftover), and
if (!wasRaw) stdin.setRawMode(false). Seeding and unsetting process.stdin like
this is fragile under a multiplexer that responds to terminal capability queries
itself.
Steps to reproduce the issue
- Install Command Code on Windows (Node 22+; I used Node 24.18.0).
- Install Herdr and launch it (herdr).
- Open a new workspace/pane in Herdr.
- Run command-code (on Windows the alias is cmdc, not cmd).
- Wait for the TUI to finish painting.
- Type any character.
- Observe: nothing is inserted. The prompt keeps showing the "Ask your question..." placeholder, and the capacity banner will not dismiss with esc.
- Control: run command-code in a plain Windows Terminal tab. Typing works there.
Command Code Version
1.74.1
Operating System
Windows
Terminal/IDE
Unknown
Shell
cmd.exe
Session file (optional)
No response
Fix prompt (optional)
No response
Additional context
No response
Summary
Command Code renders its full TUI correctly inside a Herdr pane on Windows, but the input box never responds, no characters appear, esc does not dismiss the capacity banner, and ? does not open the shortcuts overlay. The identical build works normally in a plain Windows Terminal tab, so the failure is specific to running inside Herdr's ConPTY.
Herdr is a terminal multiplexer that sits between the outer terminal and the process. I isolated the fault to that boundary: bytes do reach the pane, a minimal Ink 7 useInput app in the same pane works fine, and command-code's own stdin ends
up correctly armed for raw-mode input, yet it never dispatches the keys it receives. I suspect command-code's startup terminal-capability probes, which take exclusive control of process.stdin and unshift leftover reply bytes back into the stream, are being desynchronized by Herdr answering the Kitty keyboard query itself.
Expected Behavior
Typing in the prompt inside a Herdr pane should insert characters into the input box and allow submitting, the same as in any other terminal.
Actual Behavior
The TUI paints completely and correctly (logo, model line, prompt, hint footer), but the process never acts on keyboard input:
Deterministic, not intermittent: I tested continuously for 120 seconds and no keystroke was ever processed. I initially thought it was flaky, but that turned out to be a separate plain-node process in another pane echoing input, not Command Code responding.
What I verified about the boundary:
the same pane captured every injected keystroke.
correctly and echoes typed characters.
and Ink's own addListener('readable') model each all receive keys when tested
standalone in a Herdr pane.
(ESC[?1049h), so alternate-screen handling is not the cause.
CSI ? u and receives ESC[?0u back. When I reproduced command-code's probe
sequence in a working Ink app, that reply surfaced as literal typed text
(TYPED: [[?0u12345]), which suggests reply bytes are being re-injected into
the input stream.
steady state — isRaw=true, readable=1, dataListeners=1 — yet no dispatch.
The suspected code path is the startup probe in dist/cli.mjs, which forces raw
mode, attaches its own data listener, writes the Kitty query, then on settle
calls stdin.off('data', c), stdin.unshift(leftover), and
if (!wasRaw) stdin.setRawMode(false). Seeding and unsetting process.stdin like
this is fragile under a multiplexer that responds to terminal capability queries
itself.
Steps to reproduce the issue
Command Code Version
1.74.1
Operating System
Windows
Terminal/IDE
Unknown
Shell
cmd.exe
Session file (optional)
No response
Fix prompt (optional)
No response
Additional context
No response