qin-chenghan e7d7da9e7c
fix(frontend): strip <memory> tags in Streamdown to avoid React console error (#4209)
* fix(frontend): use code-aware stripLeakedSystemTags for all internal marker tags

Replace the ad-hoc /<\/?memory>/g in ClipboardSafeStreamdown with a
dedicated stripLeakedSystemTags() function in preprocess.ts that:

- Covers all INTERNAL_MARKER_TAGS (<memory>, <system-reminder>,
  <current_date>, <uploaded_files>, <slash_skill_activation>) instead
  of only <memory>
- Is code-aware: skips fenced code blocks (```) and indented code
  blocks (4-space indent), so user-written meta-discussions about the
  memory system are not silently stripped
- Handles opening tags, closing tags, self-closing tags, and tags with
  attributes
- Adds 15 unit tests covering all the above cases

* fix(frontend): use marker-aware fence tracking in stripLeakedSystemTags

The boolean insideFence toggle incorrectly closes a fence on any line
matching 3+ backticks or tildes, regardless of the actual delimiter.
This causes tags inside a tilde-fenced block containing a backtick
sub-fence, or a 4-backtick block containing a 3-backtick sub-fence, to
be silently stripped.

Track the opening fence marker (character and run length) so that only
a matching marker with at least the same length closes the fence.

Adds 4 new test cases:
- Tilde fence with inner backtick fence
- 4-backtick fence with inner 3-backtick fence
- Shorter tilde closing inside longer tilde fence
- Tags stripped after real closing fence

* fix(frontend): fix TypeScript strict errors in fence marker tracking

- Use non-null assertion (!) on fenceMatch[1] (guaranteed by regex)
- Use charAt(0) instead of [0] to avoid string | undefined type
2026-07-16 14:09:00 +08:00
..