A 5e storytelling engine with an LLM DM

Stream markdown a block at a time master

The play loop prints a reply into scrollback as it arrives, and terminal scrollback cannot be repainted, so a row must be final before it goes out. MarkdownStream keeps the text of the round and the count of rows it has handed out, re-renders the whole text on every call, and slices from that count. A block commits once a blank line and a later block follow it, which is the point after which appended text cannot change its rows: a lone `|` after a table reads as a paragraph until the rest of its row arrives, and the blank line is what rules that out. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CUXjWo1zGFhdJUig1hcQGf