fix: safety valve only flushes partial openers, not real tags

Long cleanup tags (e.g. collapse summaries) can span 30+ SSE deltas.
The safety valve was flushing after 6 deltas regardless, dumping
incomplete tags into the output. Now only flushes when buffering a
partial opener (<m, <y) that never resolved — never when inside a
confirmed tag.
This commit is contained in:
Joey Yakimowich-Payne 2026-03-13 21:27:08 -06:00
commit e0af1edadf

View file

@ -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. "<m" that turned out to be prose "<model>"),
# 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