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. |
||
|---|---|---|
| .. | ||
| scripts | ||
| src | ||
| .gitignore | ||
| .node-version | ||
| .prettierrc | ||
| eslint.config.mjs | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| vitest.config.ts | ||
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_modulesinstalled under Node 20/22 will not load under 26 (and vice versa) — runnpm ci(ornpm 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 envline in your shell rc; the.node-versionauto-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.jsondeclaresengines.node >= 26.3, so a wrong-Nodenpm ciwarns 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.