hermes-agent/ui-opentui
alt-glitch 3723bf5fe6 opentui(v6): defer per-block copy button (carved to its own PR)
The clickable per-block ⧉ copy chip under each message block is split out of
the engine PR (#42922) into its own issue + PR, to keep the engine PR focused.

Removes:
- logic/blockCopy.ts + its unit test (copyBlock + injectable writer)
- the CopyChip component and its two render sites in view/messageLine.tsx
  (flat message text + text parts); the wrapper boxes unwrap back to bare
  <text>/<Markdown>
- the `chips` height accounting in logic/window.ts (estimateMessageHeight +
  partLines added a phantom +1 line per block) and the arg passed from
  view/transcript.tsx; updated window.test.ts / displayModes.test.tsx /
  transcriptWindow.test.tsx expectations accordingly

Unaffected (intentionally kept — core, parity-critical): mouse-selection copy
/ Ctrl+C / copy-on-select (OSC52) in boundary/renderer.ts, and the /copy [n]
command in logic/copy.ts.

Verified: npm run check green (type-check + lint + 813 tests), acceptance greps
clean (no CopyChip/copyBlock/blockCopy left; selection-copy + /copy intact),
and a live tmux smoke confirms no ⧉ copy renders under messages.
2026-06-16 21:03:13 +05:30
..
scripts refactor(tui): fetch tree-sitter grammars at runtime instead of vendoring 2026-06-16 19:12:21 +05:30
src opentui(v6): defer per-block copy button (carved to its own PR) 2026-06-16 21:03:13 +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.