diff --git a/src/mnemosyne/gateway.py b/src/mnemosyne/gateway.py index e8057de..44591e0 100644 --- a/src/mnemosyne/gateway.py +++ b/src/mnemosyne/gateway.py @@ -220,9 +220,16 @@ class SSECleanupFilter: has_close = bool(_TAG_CLOSE_RE.search(self._buf)) partial = _has_partial_tag(self._buf) - # Safety valve: if we've buffered too many deltas without resolving - # a tag, this is just prose containing '<' — flush everything. - if self._buffered_deltas > self._MAX_BUFFERED_DELTAS and not has_close: + # Safety valve: if we've buffered many deltas waiting for a *partial* + # opener to resolve (e.g. ""), + # flush everything. But NEVER flush when _inside_tag is True — that + # means we matched a real opening tag and are waiting for the close. + # Real tags (e.g. long collapse summaries) can span 30+ deltas. + if ( + self._buffered_deltas > self._MAX_BUFFERED_DELTAS + and not self._inside_tag + and not has_close + ): result = self._buf self._buf = "" self._inside_tag = False