From 18798c6115a4b580663aae89bb23ba80275f4898 Mon Sep 17 00:00:00 2001 From: AstroHan Date: Sun, 30 Aug 2026 00:47:24 +0800 Subject: [PATCH] perf(ui): scope prompt rail observation to mounted turns Keep Prompt Rail membership observation on the existing keyed Turn list instead of waking for arbitrary Markdown subtree mutations. Generated-by: Codex --- packages/ui/src/prompt-anchor-rail.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/prompt-anchor-rail.tsx b/packages/ui/src/prompt-anchor-rail.tsx index 5e10b43959..f1afa851b8 100644 --- a/packages/ui/src/prompt-anchor-rail.tsx +++ b/packages/ui/src/prompt-anchor-rail.tsx @@ -312,7 +312,8 @@ export const PromptAnchorRail = memo(function PromptAnchorRail({ turns, scrollRe useEffect(() => { const root = scrollRef.current; - if (!root || turns.length === 0) return; + const mountedTurnList = root?.querySelector('[data-virtual-turn-id]')?.parentElement; + if (!root || !mountedTurnList || turns.length === 0) return; const idByElement = new Map(); const visible = new Set(); @@ -381,7 +382,7 @@ export const PromptAnchorRail = memo(function PromptAnchorRail({ turns, scrollRe }, { root, rootMargin: '0px 0px -66% 0px', threshold: 0 }, ); - for (const element of root.querySelectorAll('[data-turn-id]')) observeElement(element); + for (const element of mountedTurnList.querySelectorAll('[data-turn-id]')) observeElement(element); const mutationObserver = new MutationObserver((records) => { for (const record of records) { @@ -390,7 +391,7 @@ export const PromptAnchorRail = memo(function PromptAnchorRail({ turns, scrollRe } resolveActive(); }); - mutationObserver.observe(root, { childList: true, subtree: true }); + mutationObserver.observe(mountedTurnList, { childList: true }); let frame = 0; const onScroll = (): void => {