fix(tui): address Copilot review comments

- stringWidth: true LRU on cache hit (touch-on-read via delete+set) so
  hot strings stay resident under long sessions; was insertion-order
  FIFO before
- virtualHeights: include todos, panel sections, and intro version in
  messageHeightKey so height-cache reuse correctly invalidates when
  todo content / panel sections change
- virtualHeights: estimate trail+todos rows at todos.length+2 (or 2
  collapsed) instead of the generic ~1-line fallback, so initial
  virtualization offsets are closer to reality
- useInputHandlers: clearTimeout on unmount for scrollIdleTimer so
  pending relaxStreaming() never fires after teardown
- render-node-to-output: drop unused declined.noHint counter from
  scrollFastPathStats; it was always 0 (the "hint missing" branch is
  outside the diagnostics block)
- perfPane / hermes-ink.d.ts: follow the noHint removal
- wheelAccel: replace ~/claude-code path comment with generic
  attribution that doesn't reference a developer-local checkout
This commit is contained in:
Brooklyn Nicholson 2026-04-26 20:07:41 -05:00
parent b115ea62da
commit 527ac351b4
7 changed files with 42 additions and 13 deletions

View file

@ -1,6 +1,6 @@
import { useInput } from '@hermes/ink'
import { useStore } from '@nanostores/react'
import { useRef } from 'react'
import { useEffect, useRef } from 'react'
import { TYPING_IDLE_MS } from '../config/timing.js'
import type {
@ -40,6 +40,16 @@ export function useInputHandlers(ctx: InputHandlerContext): InputHandlerResult {
// as the BASE — final rows = wheelStep × accelMult.
const wheelAccelRef = useRef(initWheelAccelForHost())
useEffect(
() => () => {
if (scrollIdleTimer.current) {
clearTimeout(scrollIdleTimer.current)
scrollIdleTimer.current = null
}
},
[]
)
const scrollTranscript = (delta: number) => {
if (getUiState().busy) {
turnController.boostStreamingForScroll()