hermes-agent/ui-opentui/package.json
alt-glitch ef94562125 opentui(v6): terminal window title (OSC 0/2) + waiting-on-you notifications (OSC 9/99/777)
Window title: a render-nothing <TerminalChrome> tracks session.info — the
native renderer.setTerminalTitle (frame-safe, zig-side OSC emit) shows
'{session title} — Hermes' once the session is titled, 'Hermes Agent' until
then. The user's previous title is bracketed with the XTWINOPS title stack
(save on boot, best-effort restore on quit). Gateway: _session_info now
carries the live title (DB row, pending_title fallback) and a session.info
refresh follows every title change — pending-title application, the
auto-title worker landing (via maybe_auto_title's title_callback), and
session.title renames — so the window retitles without waiting for the
next turn.

Notifications: when the TUI starts waiting on the user — any blocking
prompt (clarify/approval/sudo/secret/confirm) or turn completion — three
dialect sequences go out through renderer.writeOut: OSC 9 (iTerm2/wezterm),
OSC 99 (kitty), OSC 777 (urxvt/foot); terminals ignore what they don't
speak. Suppressed while the terminal reports focused (core's mode-1004
focus/blur events; until a first blur proves reporting works, notify
unconditionally). HERMES_TUI_NOTIFY=0/false/off kills notifications; the
title is not gated. All text is OSC-sanitized (control chars stripped,
777's semicolon fields spliced-proof, length-capped).

13 new TUI tests (pure shaping/sequences/env gate + store-edge wiring via
an injected seam) and 2 gateway tests (title resolution order, thread-safe
refresh emitter). Live-smoked: tmux pane_title shows 'Hermes Agent' from
the native title path.
2026-06-12 13:09:23 +05:30

42 lines
1.3 KiB
JSON

{
"name": "@hermes/ui-opentui",
"version": "0.0.0",
"private": true,
"type": "module",
"description": "Native OpenTUI engine for Hermes (Solid + Effect-at-boundary, from scratch). Ink (ui-tui/) stays the shipping default.",
"scripts": {
"type-check": "tsc --noEmit",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"fmt": "prettier --write src",
"fix": "prettier --write src && eslint . --fix",
"build": "node scripts/build.mjs",
"start": "node --experimental-ffi --no-warnings dist/main.js",
"test": "vitest run",
"check": "bash scripts/check.sh",
"dev": "node scripts/build.mjs && node --experimental-ffi --no-warnings dist/main.js"
},
"dependencies": {
"@opentui/core": "0.4.0",
"@opentui/keymap": "0.4.0",
"@opentui/solid": "0.4.0",
"effect": "4.0.0-beta.78",
"fuzzysort": "^3.1.0",
"solid-js": "1.9.12"
},
"devDependencies": {
"@babel/core": "^7.29.7",
"@babel/preset-typescript": "^7.29.7",
"@effect/vitest": "^4.0.0-beta.78",
"@eslint/js": "^9",
"@types/node": "^24",
"babel-preset-solid": "^1.9.12",
"esbuild": "^0.28.0",
"eslint": "^9",
"eslint-plugin-unused-imports": "^4",
"prettier": "^3",
"typescript": "^5",
"typescript-eslint": "^8",
"vitest": "^4.1.8"
}
}