hermes-agent/ui-opentui
alt-glitch 353a8c1c8f opentui(v6): composer/transcript UX polish from dogfood feedback (glitch 2026-06-13)
Three Tier-1 fixes from live use:

- bare `/` hydrates the full command menu again (reverses F1's "name char
  first" gate). The lead-token grammar still rejects `/abs/path` (F2) and a
  `/ ` trailing-space is still not arg-completion on an empty name.
- `!cmd` shell mode now reads unmistakably: the composer glyph flips ❯ → `$`
  in the alert (warn) color and an amber "shell mode — Enter runs this in your
  shell (no model turn)" note rides the slot the slash/path dropdown would use
  (they never coexist). New optional `brand.shellPrompt` ($), skin-overridable.
- the transcript scrollbox reserves a 1-cell right gutter (contentOptions
  paddingRight) so the vertical scrollbar no longer paints OVER hard-width
  content — markdown table / code-block right borders were clipped under it.

Gate green (714 tests); F1/F2/F7/F8 slash specs + the slashMenu frame test
updated to the new bare-/ behavior. Verified live in tmux.
2026-06-13 20:43:16 +05:30
..
parsers opentui(v6): syntax highlighting for 10 more languages (vendored tree-sitter grammars) 2026-06-12 13:26:17 +05:30
scripts opentui(v6): syntax highlighting for 10 more languages (vendored tree-sitter grammars) 2026-06-12 13:26:17 +05:30
src opentui(v6): composer/transcript UX polish from dogfood feedback (glitch 2026-06-13) 2026-06-13 20:43:16 +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 docs: OpenTUI dev handoff — base operating manual for continuing memory+UX on the canonical branch 2026-06-13 18:43:30 +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 docs: OpenTUI dev handoff — base operating manual for continuing memory+UX on the canonical branch 2026-06-13 18:43:30 +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 docs: OpenTUI dev handoff — base operating manual for continuing memory+UX on the canonical branch 2026-06-13 18:43:30 +05:30
README.md docs: OpenTUI dev handoff — base operating manual for continuing memory+UX on the canonical branch 2026-06-13 18:43:30 +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.