hermes-agent/ui-opentui
alt-glitch fc8d5f203a opentui(v6): post-rebase fixups — dedup probe mouse, .demo lint ignore, cap tests to windowing-aware contract
Rebasing onto fcf49f313 (multi-click selection) collided in the test
probe (both sides added 'mouse' — deduped) and surfaced two test debts
the cap-restore commit (3cc56517a) had shipped masked by a piped exit
code: store cap tests still asserted the 1000 default (now: 3000
windowed, 1000 with HERMES_TUI_WINDOWING=0, both covered), and the
burst-interplay test relied on the old cap trimming a 1500-row burst
(now pins HERMES_TUI_MAX_MESSAGES=1000 explicitly for both stores).
Also: .demo/ build artifacts excluded from typed linting. 669 tests
exit 0 (verified unpiped). Multi-click selections flow through the
same renderer selection seam, so windowing's drag-freeze + row-pinning
covers them with no changes.
2026-06-12 08:40:53 +05:30
..
scripts opentui(v6): double-click word / triple-click line selection with held drag-extend 2026-06-11 15:58:33 +05:30
src opentui(v6): post-rebase fixups — dedup probe mouse, .demo lint ignore, cap tests to windowing-aware contract 2026-06-12 08:40:53 +05:30
.gitignore opentui(v6): degrade SyntaxStyle exhaustion, unmask the exit-7 crash, clamp the cap to the 65k native handle table 2026-06-11 04:06:19 +05:30
.node-version opentui: Node 26 onboarding — scoped .node-version, engines floor, README setup guide 2026-06-12 08:29:24 +05:30
.prettierrc feat(tui): run on Node 26 (one runtime), finalize copy UX, rename to ui-opentui 2026-06-09 16:16:48 +00:00
eslint.config.mjs opentui(v6): post-rebase fixups — dedup probe mouse, .demo lint ignore, cap tests to windowing-aware contract 2026-06-12 08:40:53 +05:30
package-lock.json opentui(v6): standardize fuzzy search on fuzzysort (adapter keeps our API) 2026-06-10 21:04:22 +05:30
package.json opentui: Node 26 onboarding — scoped .node-version, engines floor, README setup guide 2026-06-12 08:29:24 +05:30
README.md opentui: Node 26 onboarding — scoped .node-version, engines floor, README setup guide 2026-06-12 08:29:24 +05:30
tsconfig.json feat(tui): run on Node 26 (one runtime), finalize copy UX, rename to ui-opentui 2026-06-09 16:16:48 +00:00
vitest.config.ts opentui(v6): background-agents tray — down-arrow focus + enter to dashboard 2026-06-10 21:00:59 +05:30

ui-opentui — native OpenTUI engine for Hermes

Solid + @opentui/core over Node FFI. Ink (ui-tui/) is the shipping default; this is the experimental engine (draft PR #42922).

Node 26 setup (required; will not touch your other projects)

This package needs Node ≥ 26.3 (--experimental-ffi floor). Everything else on this machine/repo can keep whatever Node it already uses — pin 26 to this directory only:

# 1. install fnm (skip if you have it; nvm/mise work too — see below)
curl -fsSL https://fnm.vercel.app/install | bash
# add to ~/.zshrc (or bashrc): eval "$(fnm env --use-on-cd --shell zsh)"

# 2. install Node 26 SIDE BY SIDE (does NOT change your default)
fnm install 26

# 3. done — this directory has a .node-version (26.3), so `cd ui-opentui`
#    auto-switches to 26 and leaving switches back. Do NOT run `fnm default 26`.
node -v   # v26.x here; your old version everywhere else

No shell integration wanted (CI, scripts, one-off): fnm exec --using 26 -- node ... or invoke the absolute binary (~/.local/share/fnm/node-versions/v26.*/installation/bin/node). mise users: mise use node@26 in this directory. nvm users: nvm install 26, plus an .nvmrc shim (echo 26 > .nvmrc) if you rely on auto-switching.

Gotchas

  • Native modules are ABI-locked. A node_modules installed under Node 20/22 will not load under 26 (and vice versa) — run npm ci (or npm rebuild) after switching versions. Same applies to bench/'s node-pty.
  • Global npm packages don't follow between versions (per-version prefix); reinstall the few you need, or don't use globals.
  • Editor terminals (Zed/VS Code) need the fnm env line in your shell rc; the .node-version auto-switch then covers any shell that cd's here.
  • Never run this package with bun — the FFI seam and the Solid/JSX build are Node-path only here.
  • package.json declares engines.node >= 26.3, so a wrong-Node npm ci warns immediately.

Build & run

node scripts/build.mjs
HERMES_TUI_MOUSE=1 node --experimental-ffi --no-warnings dist/main.js

Gates: npm run check (typecheck + lint + tests). Memory/perf benchmarks live in ../bench/ (see its README). Transcript windowing (memory architecture) is documented in ../docs/plans/opentui-transcript-windowing.md.