mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-12 03:42:08 +00:00
fix(dashboard): route browser wheel into inner TUI scrolling
This commit is contained in:
parent
8aceef539f
commit
7cbef2bd42
2 changed files with 34 additions and 7 deletions
|
|
@ -2949,13 +2949,6 @@ def _resolve_chat_argv(
|
||||||
argv, cwd = _make_tui_argv(PROJECT_ROOT / "ui-tui", tui_dev=False)
|
argv, cwd = _make_tui_argv(PROJECT_ROOT / "ui-tui", tui_dev=False)
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env.setdefault("NODE_ENV", "production")
|
env.setdefault("NODE_ENV", "production")
|
||||||
# Embedded browser chat should render into the primary screen buffer, not
|
|
||||||
# the terminal alternate screen. Alt-screen is ideal for the native CLI,
|
|
||||||
# but it intentionally has no host scrollback; in the web dashboard that
|
|
||||||
# makes mouse-wheel history feel broken even when xterm itself is healthy.
|
|
||||||
# INLINE mode keeps transcript rows in the normal buffer so browser-side
|
|
||||||
# scrollback works predictably.
|
|
||||||
env.setdefault("HERMES_TUI_INLINE", "1")
|
|
||||||
# Browser-embedded chat should prefer stable wheel-based scrollback over
|
# Browser-embedded chat should prefer stable wheel-based scrollback over
|
||||||
# native terminal mouse tracking. When mouse tracking is enabled, wheel
|
# native terminal mouse tracking. When mouse tracking is enabled, wheel
|
||||||
# events are consumed by the TUI and forwarded as terminal input, which
|
# events are consumed by the TUI and forwarded as terminal input, which
|
||||||
|
|
|
||||||
|
|
@ -366,6 +366,40 @@ export default function ChatPage({ isActive = true }: { isActive?: boolean }) {
|
||||||
fitRef.current = fit;
|
fitRef.current = fit;
|
||||||
term.loadAddon(fit);
|
term.loadAddon(fit);
|
||||||
|
|
||||||
|
// Single-scroll-system experiment:
|
||||||
|
// keep browser xterm as a display/input bridge only, and let the inner
|
||||||
|
// Hermes TUI own transcript scrolling.
|
||||||
|
//
|
||||||
|
// In practice, the most reliable path here is NOT terminal mouse-wheel
|
||||||
|
// protocol emulation — that can vary by terminal mode and parser path.
|
||||||
|
// The inner TUI already handles keyboard-driven transcript scrolling
|
||||||
|
// correctly (`Shift+Up` / `Shift+Down`, `PageUp` / `PageDown`), so we
|
||||||
|
// translate browser wheel gestures into those known-good key sequences.
|
||||||
|
term.attachCustomWheelEventHandler((ev) => {
|
||||||
|
if (wsRef.current?.readyState !== WebSocket.OPEN) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const delta = ev.deltaY;
|
||||||
|
if (!delta) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shift+Up / Shift+Down: the TUI maps these to line-by-line
|
||||||
|
// transcript scrolling, which feels much closer to wheel behavior
|
||||||
|
// than PageUp/PageDown's half-page jumps.
|
||||||
|
const step = Math.max(1, Math.round(Math.abs(delta) / 50));
|
||||||
|
const seq = delta > 0 ? "\x1b[1;2B" : "\x1b[1;2A";
|
||||||
|
|
||||||
|
for (let i = 0; i < step; i++) {
|
||||||
|
wsRef.current.send(seq);
|
||||||
|
}
|
||||||
|
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
const unicode11 = new Unicode11Addon();
|
const unicode11 = new Unicode11Addon();
|
||||||
term.loadAddon(unicode11);
|
term.loadAddon(unicode11);
|
||||||
term.unicode.activeVersion = "11";
|
term.unicode.activeVersion = "11";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue