Skip to content

Commit a6ab318

Browse files
committed
fix(webview): resolve memory leak in ChatView by stabilizing callback props
- Stabilize handleSendMessage using clineAskRef to prevent frequent re-creation - Stabilize toggleRowExpansion by extracting handleSetExpandedRow and managing dependencies - Re-integrate scrolling logic into useEffect hook to avoid destabilizing callbacks - Add everVisibleMessagesTsRef to reduce unnecessary ChatRow remounts by Virtuoso - Update onToggleExpand signature to accept timestamp parameter for better stability - Remove diagnostic console.log statements used for debugging callback changes These changes address detached DOM elements memory leak caused by frequent callback re-creation triggering unnecessary component re-renders and preventing proper garbage collection of chat message DOM nodes.
1 parent 61a381a commit a6ab318

File tree

4 files changed

+170
-115
lines changed

4 files changed

+170
-115
lines changed

pnpm-lock.yaml

Lines changed: 17 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

webview-ui/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"i18next": "^24.2.2",
4545
"i18next-http-backend": "^3.0.2",
4646
"knuth-shuffle-seeded": "^1.0.6",
47+
"lru-cache": "^11.1.0",
4748
"lucide-react": "^0.510.0",
4849
"mermaid": "^11.4.1",
4950
"posthog-js": "^1.227.2",
@@ -67,8 +68,8 @@
6768
"tailwindcss": "^4.0.0",
6869
"tailwindcss-animate": "^1.0.7",
6970
"unist-util-visit": "^5.0.0",
70-
"vscode-material-icons": "^0.1.1",
7171
"use-sound": "^5.0.0",
72+
"vscode-material-icons": "^0.1.1",
7273
"vscrui": "^0.2.2",
7374
"zod": "^3.24.2"
7475
},

webview-ui/src/components/chat/ChatRow.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ interface ChatRowProps {
4242
isExpanded: boolean
4343
isLast: boolean
4444
isStreaming: boolean
45-
onToggleExpand: () => void
45+
onToggleExpand: (ts: number) => void // Modified to accept timestamp
4646
onHeightChange: (isTaller: boolean) => void
4747
onSuggestionClick?: (answer: string, event?: React.MouseEvent) => void
4848
}
@@ -300,7 +300,7 @@ export const ChatRowContent = ({
300300
progressStatus={message.progressStatus}
301301
isLoading={message.partial}
302302
isExpanded={isExpanded}
303-
onToggleExpand={onToggleExpand}
303+
onToggleExpand={() => onToggleExpand(message.ts)}
304304
/>
305305
</>
306306
)
@@ -326,7 +326,7 @@ export const ChatRowContent = ({
326326
progressStatus={message.progressStatus}
327327
isLoading={message.partial}
328328
isExpanded={isExpanded}
329-
onToggleExpand={onToggleExpand}
329+
onToggleExpand={() => onToggleExpand(message.ts)}
330330
/>
331331
</>
332332
)
@@ -348,7 +348,7 @@ export const ChatRowContent = ({
348348
progressStatus={message.progressStatus}
349349
isLoading={message.partial}
350350
isExpanded={isExpanded}
351-
onToggleExpand={onToggleExpand}
351+
onToggleExpand={() => onToggleExpand(message.ts)}
352352
/>
353353
</>
354354
)
@@ -387,7 +387,7 @@ export const ChatRowContent = ({
387387
language={getLanguageFromPath(tool.path || "") || "log"}
388388
isLoading={message.partial}
389389
isExpanded={isExpanded}
390-
onToggleExpand={onToggleExpand}
390+
onToggleExpand={() => onToggleExpand(message.ts)}
391391
/>
392392
</>
393393
)
@@ -433,7 +433,7 @@ export const ChatRowContent = ({
433433
language="markdown"
434434
isLoading={message.partial}
435435
isExpanded={isExpanded}
436-
onToggleExpand={onToggleExpand}
436+
onToggleExpand={() => onToggleExpand(message.ts)}
437437
/>
438438
</>
439439
)
@@ -453,7 +453,7 @@ export const ChatRowContent = ({
453453
code={tool.content}
454454
language="shell-session"
455455
isExpanded={isExpanded}
456-
onToggleExpand={onToggleExpand}
456+
onToggleExpand={() => onToggleExpand(message.ts)}
457457
/>
458458
</>
459459
)
@@ -473,7 +473,7 @@ export const ChatRowContent = ({
473473
code={tool.content}
474474
language="shellsession"
475475
isExpanded={isExpanded}
476-
onToggleExpand={onToggleExpand}
476+
onToggleExpand={() => onToggleExpand(message.ts)}
477477
/>
478478
</>
479479
)
@@ -493,7 +493,7 @@ export const ChatRowContent = ({
493493
code={tool.content}
494494
language="markdown"
495495
isExpanded={isExpanded}
496-
onToggleExpand={onToggleExpand}
496+
onToggleExpand={() => onToggleExpand(message.ts)}
497497
/>
498498
</>
499499
)
@@ -523,7 +523,7 @@ export const ChatRowContent = ({
523523
code={tool.content}
524524
language="shellsession"
525525
isExpanded={isExpanded}
526-
onToggleExpand={onToggleExpand}
526+
onToggleExpand={() => onToggleExpand(message.ts)}
527527
/>
528528
</>
529529
)
@@ -811,7 +811,7 @@ export const ChatRowContent = ({
811811
MozUserSelect: "none",
812812
msUserSelect: "none",
813813
}}
814-
onClick={onToggleExpand}>
814+
onClick={() => onToggleExpand(message.ts)}>
815815
<div style={{ display: "flex", alignItems: "center", gap: "10px", flexGrow: 1 }}>
816816
{icon}
817817
{title}
@@ -850,7 +850,7 @@ export const ChatRowContent = ({
850850
code={safeJsonParse<any>(message.text)?.request}
851851
language="markdown"
852852
isExpanded={true}
853-
onToggleExpand={onToggleExpand}
853+
onToggleExpand={() => onToggleExpand(message.ts)}
854854
/>
855855
</div>
856856
)}
@@ -896,7 +896,7 @@ export const ChatRowContent = ({
896896
language="diff"
897897
isFeedback={true}
898898
isExpanded={isExpanded}
899-
onToggleExpand={onToggleExpand}
899+
onToggleExpand={() => onToggleExpand(message.ts)}
900900
/>
901901
</div>
902902
)
@@ -943,7 +943,7 @@ export const ChatRowContent = ({
943943
code={message.text}
944944
language="json"
945945
isExpanded={true}
946-
onToggleExpand={onToggleExpand}
946+
onToggleExpand={() => onToggleExpand(message.ts)}
947947
/>
948948
</div>
949949
</>
@@ -1103,7 +1103,7 @@ export const ChatRowContent = ({
11031103
code={useMcpServer.arguments}
11041104
language="json"
11051105
isExpanded={true}
1106-
onToggleExpand={onToggleExpand}
1106+
onToggleExpand={() => onToggleExpand(message.ts)}
11071107
/>
11081108
</div>
11091109
)}

0 commit comments

Comments
 (0)