fa84e40efc
Briefing chat now uses the same StreamIterator + 45s per-event timeout as the main chat provider, so a dropped SSE socket no longer leaves isBriefingStreaming stuck true. Adds refreshMessages() that unfreezes state when the server-side message is complete, wired to a new pull-to-refresh gesture and the app lifecycle-resume hook. Chat provider gains attachToGeneration() — safe to call unconditionally on screen init, so landing on a conversation that's already mid-stream (e.g. the /news discuss button, which now creates a conv and auto-kicks generation server-side) picks up live tokens instead of freezing on the placeholder. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>