31ac7e27eb
Timer-driven reveal and spinner ticks (streaming reveal, tool-args reveal, tool-execution spinner, todo strike animation) now hand the changed component to `TUI.requestComponentRender(component)` instead of forcing a full-tree render at 30fps. Every other root subtree reuses its previous frame rows, cutting the Box/Container tree walk out of the compose pipeline while the transcript grows. Shimmer: - Intern the working-message palette per accent (WeakMap-keyed) so the Symbol-slot compiled-ANSI cache in `shimmerSegments.compile` actually hits between frames — the fresh palette literal in `renderWorkingMessage` guaranteed a per-tick miss. - Add an `activeBand` fast-path: outside the sweep window the intensity is guaranteed zero, so those code points coalesce into a single low-tier run without running `intensityFn` or `tierFor`. On the typical ~60-char working message the classic band is 12 cells wide, so ~80% of the per-char loop disappears. Widen `ToolExecutionHandle` to extend `Component` (matches every concrete impl — `ToolExecutionComponent`, `ReadToolGroupComponent` — which already extend `Container`) so the reveal controller callback sites are type-checked. Fixes #4377