Skip to content

feat(desktop): improve AttentionRail and chat UX#3

Merged
ephor merged 10 commits into
mainfrom
feat/attention-rail-chat-ux
Jul 17, 2026
Merged

feat(desktop): improve AttentionRail and chat UX#3
ephor merged 10 commits into
mainfrom
feat/attention-rail-chat-ux

Conversation

@ephor

@ephor ephor commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

  • make AttentionRail scalable with memoized cards, bounded previews, filtering, grouping, sorting, and measured virtualization
  • add state-aware thinking disclosures, stable native chat scrolling, persistent tool timing, and memoized TaskDetail boundaries
  • add compact actionable in-app notifications for permission and attention events
  • preserve review context while preventing toast overflow, stale activity, and streaming render storms

Validation

  • desktop typecheck
  • desktop lint (existing warnings only)
  • 55 desktop tests
  • desktop production build
  • cargo check
  • 72 Rust tests
  • 8 warpforge-protocol tests
  • React Doctor review; conditional hook regression fixed before PR

Notes

  • branch was rebuilt from the latest origin/main and the feature commits were cherry-picked in order
  • TaskDetail transcript currently uses native document flow for scroll stability; ChatTranscript is now the boundary for a future turn-level virtualization pass

ephor added 10 commits July 17, 2026 11:44
- ChangesRail: flatten tree + useVirtualizer (28px rows, overscan 20)
- Unified diff: virtualize FileDiffView list with dynamic height measurement
- Split diff: virtualize + lazy-fetch file contents (only visible items queried)
- ProjectFilesPanel: flatten tree + useVirtualizer for project file browser
- AttentionRail: pre-compute coalesceUpdates in useMemo cache, pinned→Set,
  memoize all derived data; move to fixed overlay with slide animation
- Stream virtualizer: increase estimateSize 72→100, overscan 12→30
- ChangesRail: collapse folders by default when >50 files
- SessionRailCard: memo with React.memo, coalesceUpdates moved inside
  (computes per-card only when its own updates change, not all tasks)
- Remove previewCache that ran coalesceUpdates for ALL tasks on every render
- Pass raw updates array to card, let memo handle staleness
- App.tsx: useCallback for handleOpenTask passed to AttentionRail
- Inline pin/open callbacks → stable useCallback curried per task id
- Board: useMemo for 8 derived arrays (done, running, review, laneTrees*),
  memoize match fn and byStatus with cache
- TaskDetail: useCallback for openFileTab, openDiffFile, openChangesTab
- MissionControl: useMemo for live/pinnedTasks, memoize all FocusPane
  derived computations (coalesceUpdates, resolvedPermissions, etc.),
  stable callbacks for pinned task map
- ChangesRail: useCallback for toggle
- Projects: useMemo for services/pfs/projectTasks/running, pre-compute
  runningByProject map to eliminate O(projects × services) filter-in-map
@ephor
ephor merged commit 1eea1e1 into main Jul 17, 2026
3 checks passed
@ephor
ephor deleted the feat/attention-rail-chat-ux branch July 17, 2026 09:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant