mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-24 05:41:40 +00:00
chore(tui): /clean recent perf work — KISS/DRY pass
24 files, -319 LoC. Behaviour preserved, 369/369 tests green. - hermes-ink caches: shared lruEvict helper for the four parallel LRU caches (stringWidth, wrapText, sliceAnsi, lineWidth); touch-on-read stays inlined per cache; tightened output.ts skip-slice fast path. - wheelAccel: trimmed provenance header, collapsed env parsing, ternary dispatch in computeWheelStep. - perfPane: folded ensureLogDir into once-flag, spread-with-overrides for fastPath/phases instead of full rebuilds. - env: extracted truthy() (used 4×). - virtualHeights: collapsed user/diff/slash height bumps; trail+todos estimate. - useInputHandlers: scrollIdleTimer cleanup on unmount, ?? undefined shorthand. - useMainApp: dropped dead liveTailVisible IIFE and liveProgress indirection. - appLayout, markdown, messageLine, entry: vertical rhythm, dropped narration comments, inlined one-shot vars. - fix: empty catch blocks → /* best-effort */ for no-empty lint.
This commit is contained in:
parent
527ac351b4
commit
b1c49d5e73
32 changed files with 259 additions and 547 deletions
|
|
@ -1,13 +1,13 @@
|
|||
import type { ScrollBoxHandle } from '@hermes/ink'
|
||||
import {
|
||||
type RefObject,
|
||||
useCallback,
|
||||
useDeferredValue,
|
||||
useEffect,
|
||||
useLayoutEffect,
|
||||
useRef,
|
||||
useState,
|
||||
useSyncExternalStore,
|
||||
type RefObject
|
||||
useSyncExternalStore
|
||||
} from 'react'
|
||||
|
||||
const ESTIMATE = 4
|
||||
|
|
@ -98,6 +98,7 @@ export function useVirtualHistory(
|
|||
// Bump whenever heightCache mutates so offsets rebuild on next read.
|
||||
// Ref (not state) — checked during render phase, zero extra commits.
|
||||
const offsetVersion = useRef(0)
|
||||
|
||||
// Cached offsets: reused Float64Array keyed on (itemCount, version) so we
|
||||
// only rebuild when something actually changed. Previous approach allocated
|
||||
// a fresh Array(n+1) every render — at n=10k that's ~80KB/render of GC
|
||||
|
|
@ -107,6 +108,7 @@ export function useVirtualHistory(
|
|||
n: -1,
|
||||
version: -1
|
||||
})
|
||||
|
||||
const [hasScrollRef, setHasScrollRef] = useState(false)
|
||||
const metrics = useRef({ sticky: true, top: 0, vp: 0 })
|
||||
const lastScrollTopRef = useRef(0)
|
||||
|
|
@ -158,6 +160,7 @@ export function useVirtualHistory(
|
|||
(cb: () => void) => (hasScrollRef ? scrollRef.current?.subscribe(cb) : null) ?? NOOP,
|
||||
[hasScrollRef, scrollRef]
|
||||
)
|
||||
|
||||
useSyncExternalStore(
|
||||
subscribe,
|
||||
() => {
|
||||
|
|
@ -310,13 +313,8 @@ export function useVirtualHistory(
|
|||
if (velocity > vp * 2) {
|
||||
const [pS, pE] = prevRange.current
|
||||
|
||||
if (start < pS - SLIDE_STEP) {
|
||||
start = pS - SLIDE_STEP
|
||||
}
|
||||
|
||||
if (end > pE + SLIDE_STEP) {
|
||||
end = pE + SLIDE_STEP
|
||||
}
|
||||
start = Math.max(start, pS - SLIDE_STEP)
|
||||
end = Math.min(end, pE + SLIDE_STEP)
|
||||
|
||||
// A large jump past the capped end can invert (start > end); mount
|
||||
// SLIDE_STEP items from the new start so the viewport isn't blank
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue