deerflow2/frontend/src
Eilen Shin 25fbd25b05
fix(frontend): cap deeply nested list indentation to prevent render crash (#3393) (#3570)
* fix(frontend): cap deeply nested list indentation to prevent render crash

Deeply nested lists make marked's recursive list tokenizer overflow the
call stack during Streamdown's lexing useMemo, throwing an uncaught
"RangeError: Maximum call stack size exceeded" that replaces the chat
route with an error page (issue #3393); on larger stacks the same input
exhausts the heap, which the render error boundary cannot catch.

Mirror the existing capBlockquoteNesting guard with capListNesting, which
clamps leading whitespace to 200 columns (~100 nesting levels) only when
pathologically deep indentation is present, leaving normal content and
fenced code untouched. Wire both through capMarkdownNesting.

* fix(frontend): satisfy prettier format check in preprocess test

* fix(frontend): exempt indented code from list-indent cap (PR #3570 review)

* fix(frontend): keep capping all deep indentation outside fenced code

Revert the indented-code exemption from the PR #3570 review nit. Taken
literally the suggested guard (insideFence || INDENTED_CODE_RE.test(line))
no-ops capListNesting, because INDENTED_CODE_RE matches every line with
4+ leading spaces — i.e. exactly the deep-indent lines the cap targets.
A context-aware exemption (only treat 4+-space lines as code after a
blank line) instead reopens the crash: blank-separated deeply nested list
items get exempted and still blow up marked (verified: OOM at depth ~1.5k).

Unlike blockquotes (markers take <=3 leading spaces, so deep-quote lines
never look like indented code), list vs. indented-code indentation is
ambiguous line-by-line, so any exemption is exploitable. Keep capping all
deep indentation outside fenced code; the only cost is mild corruption of
a >200-column indented-code line, which never occurs in real content and
is strictly preferable to a render crash. Add a regression test locking
the blank-line case.
2026-06-14 22:19:54 +08:00
..
app fix(frontend): reset active chat after deletion (#3519) 2026-06-14 22:06:19 +08:00
components fix(frontend): cap deeply nested list indentation to prevent render crash (#3393) (#3570) 2026-06-14 22:19:54 +08:00
content feat(community): add Brave Search web search tool (#3528) 2026-06-13 22:47:35 +08:00
core fix(frontend): cap deeply nested list indentation to prevent render crash (#3393) (#3570) 2026-06-14 22:19:54 +08:00
hooks feat(im): Add user-owned IM channel connections (#3487) 2026-06-12 15:24:58 +08:00
lib fix(frontend): prevent submit during IME composition (#1562) 2026-03-29 22:36:38 +08:00
styles fix(frontend): UI polish - fix CSS typo, dark mode border, and hardcoded colors (#1942) 2026-04-08 09:07:39 +08:00
typings feat: add 'about' page 2026-02-06 15:18:37 +08:00
env.js feat(auth): release-validation pass for 2.0-rc — 12 blockers + simplify follow-ups (#2008) 2026-04-26 11:08:11 +08:00
mdx-components.ts Add documents site (#1767) 2026-04-03 07:25:40 +08:00