From f0fd44fac14249cf575d018696f0baaef8ba23df Mon Sep 17 00:00:00 2001 From: bkellam Date: Wed, 23 Jul 2025 16:32:39 -0700 Subject: [PATCH] fix: Add bounds checks to codemirror code folding extension and other places to avoid crashes. --- .../components/chatThread/codeFoldingExtension.ts | 11 +++++++++++ .../chatThread/referencedSourcesListView.tsx | 14 ++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/web/src/features/chat/components/chatThread/codeFoldingExtension.ts b/packages/web/src/features/chat/components/chatThread/codeFoldingExtension.ts index 6e1090f5..c49a46be 100644 --- a/packages/web/src/features/chat/components/chatThread/codeFoldingExtension.ts +++ b/packages/web/src/features/chat/components/chatThread/codeFoldingExtension.ts @@ -308,6 +308,17 @@ const createDecorations = (state: EditorState, foldingState: FoldingState): Deco // Create decorations for each hidden region foldingState.hiddenRegions.forEach((region, index) => { + + // Catch cases where the region is outside the document bounds. + if ( + region.startLine < 1 || + region.startLine > state.doc.lines || + region.endLine < 1 || + region.endLine > state.doc.lines + ) { + return; + } + const from = state.doc.line(region.startLine).from; const to = state.doc.line(region.endLine).to; const hiddenLineCount = region.endLine - region.startLine + 1; diff --git a/packages/web/src/features/chat/components/chatThread/referencedSourcesListView.tsx b/packages/web/src/features/chat/components/chatThread/referencedSourcesListView.tsx index 546a1e66..c930cee9 100644 --- a/packages/web/src/features/chat/components/chatThread/referencedSourcesListView.tsx +++ b/packages/web/src/features/chat/components/chatThread/referencedSourcesListView.tsx @@ -147,10 +147,11 @@ export const ReferencedSourcesListView = ({ // If we have a range, we can scroll to the starting line number. if ( - selectedReference.range - && editorRef - && editorRef.view - && scrollAreaViewport + selectedReference.range && + editorRef && + editorRef.view && + scrollAreaViewport && + selectedReference.range.startLine <= editorRef.view.state.doc.lines ) { const view = editorRef.view; const lineNumber = selectedReference.range.startLine; @@ -393,6 +394,11 @@ const CodeMirrorCodeBlock = ({ const isSelected = id === selectedReference?.id; for (let line = range.startLine; line <= range.endLine; line++) { + // Skip lines that are outside the document bounds. + if (line > state.doc.lines) { + continue; + } + if (isSelected) { decorations.push(selectedLineDecoration.range(state.doc.line(line).from)); } else {