hermes-agent/ui-opentui
alt-glitch b0fb2b8b05 opentui(v6): skins/theming parity — live /skin switch, animated spinner, tool_emojis, status-bar colors
- server resolve_skin() now serializes spinner + tool_emojis (were dropped on
  the wire; neither native engine could use them)
- GatewaySkin schema gains optional spinner/tool_emojis (additive, back-compat)
- theme.ts: SpinnerConfig + parseSpinner (crash-proof) threaded through fromSkin;
  status_bar_* keys now drive statusBg/Fg/Bad/Critical (were hardcoded — all
  dark skins looked identical in the status bar)
- /skin <name> CLIENT slash handler -> config.set -> skin.changed -> live retheme
- composer: imperative ta.textColor/cursorColor on theme change (uncontrolled
  textarea recolor) + slash-token SyntaxStyle re-register
- statusLine: animated face via bounded setInterval armed on running/cleared on stop
- registry/toolPart: skin tool_emojis override tool glyphs
2026-06-15 15:57:57 +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): bench fixture — HERMES_BENCH_TOOL_BODY_LINES knob for fat tool output 2026-06-14 16:12:10 +05:30
src opentui(v6): skins/theming parity — live /skin switch, animated spinner, tool_emojis, status-bar colors 2026-06-15 15:57:57 +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): bump @opentui 0.4.0 -> 0.4.1 + openConsoleOnError:false (W5) 2026-06-14 13:53:11 +05:30
package.json opentui(v6): bump @opentui 0.4.0 -> 0.4.1 + openConsoleOnError:false (W5) 2026-06-14 13:53:11 +05:30
README.md docs(opentui): point bench references at the tui-bench repo 2026-06-14 10:56:08 +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 the tui-bench repo's node-pty (github.com/NousResearch/tui-bench).
  • 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 the tui-bench repo (github.com/NousResearch/tui-bench; see its README). Transcript windowing (memory architecture) is documented in ../docs/plans/opentui-transcript-windowing.md.