mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 04:32:42 +00:00
Token-by-token streaming was buffering on the server. The chat route enqueued every tokenised SSE frame synchronously inside the stream's start() callback, so the runtime coalesced them into a single network read and the client painted the full answer at once despite the per-token render path already wired in use-coach. Make the emit callback async and yield to the event loop between token frames so each one flushes as its own chunk; the visible cadence now reads ChatGPT/Claude- style. Refusal and error paths stay single-frame. The conversation history was a permanent left column on lg+, eating chat width on laptops and reading as a takeover behind the narrowed drawer cap. It now lives behind an always-visible "Conversations" toggle on every viewport and opens as the left-edge tray on demand; the thread keeps the full width by default and never loses it on mobile. The provenance block (source chips plus raw key-values) rendered fully expanded under every answer and was often taller than the reply. Fold the chips into the existing collapsed disclosure alongside the key- values so the whole grounding is one click-to-expand surface, collapsed by default, with the disclosure's aria-expanded/aria-controls intact. The clinical-decisions disclaimer rendered both at the bottom of the thread and in the sources-rail footer. Consolidate to a single line directly above the composer, always visible on every viewport. The auto-growing composer (single line growing to a capped multi-line with internal scroll, Enter-to-send, Shift+Enter-newline) and the aria-live streaming region are preserved. Plain-text React children throughout; no new dependencies.