Release notes
A long chat streams without re-parsing itself
Streaming a long reply was re-parsing every message already on screen, once per flush, and the command-output buffer was copying its whole tail on every chunk. Both are fixed, and the chat hot path now has a bench harness that measures the work instead of guessing at it.
Improved
- Streaming a reply no longer re-parses the messages already on screen. The markdown renderer keeps a stable identity across flushes, so only the block that actually changed is re-parsed — 8 paragraph parses per flush instead of 128 on a long transcript.
- Command output appends in amortized time. The buffer used to copy its whole 1 MiB tail on every chunk; it now trims only once the tail grows past the cap, which is about 96% less copying.
- The transcript's "is this the newest turn" scan runs once per render instead of twice.
- The command-output subscription no longer re-subscribes on every render.
Fixed
- A long streaming reply no longer gets slower the more of it is already on screen.