From 71b8c5965c79825ce30db354823aae4002c9e888 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Wed, 1 Apr 2026 11:46:23 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20briefing=20discuss=20button=20=E2=80=94?= =?UTF-8?q?=20full=20article=20content=20+=20scroll=20+=20optimistic=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three bugs in discussArticle(): - Scroll selector was '.briefing-chat' (doesn't exist) → '.briefing-center'; the panel never scrolled into view so the response was invisible until refresh - Only 300-char snippet was sent to the LLM; now passes the full stored content (up to 2000 chars) from the backend - User message wasn't shown until streaming ended; now added optimistically to messages[] immediately on click so it appears straight away Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/types/news.ts | 1 + frontend/src/views/BriefingView.vue | 21 +++++++++++++++++---- src/fabledassistant/routes/briefing.py | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/frontend/src/types/news.ts b/frontend/src/types/news.ts index 93e371e..3371e36 100644 --- a/frontend/src/types/news.ts +++ b/frontend/src/types/news.ts @@ -3,6 +3,7 @@ export interface NewsItem { title: string url: string snippet: string + content: string published_at: string | null topics: string[] source: string diff --git a/frontend/src/views/BriefingView.vue b/frontend/src/views/BriefingView.vue index 674dec3..0de15f3 100644 --- a/frontend/src/views/BriefingView.vue +++ b/frontend/src/views/BriefingView.vue @@ -176,12 +176,25 @@ async function send(overrideText?: string) { } async function discussArticle(item: NewsItem) { - const snippet = item.snippet ? `\n\n"${item.snippet.slice(0, 400)}${item.snippet.length > 400 ? '…' : ''}"` : '' - const text = `Summarize the following article excerpt for me in a few sentences and share your thoughts. Do not use any research or search tools — just respond conversationally based on what I've shared below.\n\n**${item.title}**${snippet}\n\nSource: ${item.source}` - // Scroll the chat panel into view on narrow layouts, then send + const body = (item.content || item.snippet || '').trim() + const bodyBlock = body ? `\n\n---\n${body}\n---` : '' + const text = `Please summarize and share your thoughts on this article. Do not use any research or search tools — respond conversationally based only on the content below.\n\n**${item.title}**\nSource: ${item.source}${bodyBlock}` + + // Add the user message optimistically so it appears immediately + const optimisticMsg: BriefingMessage = { + id: Date.now(), + role: 'user', + content: text, + created_at: new Date().toISOString(), + } + messages.value = [...messages.value, optimisticMsg] + + // Scroll the chat panel into view await nextTick(() => { - document.querySelector('.briefing-chat')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) + document.querySelector('.briefing-center')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' }) + scrollToBottom() }) + await send(text) } diff --git a/src/fabledassistant/routes/briefing.py b/src/fabledassistant/routes/briefing.py index 5df7f8c..0ee9c70 100644 --- a/src/fabledassistant/routes/briefing.py +++ b/src/fabledassistant/routes/briefing.py @@ -388,6 +388,7 @@ async def list_news(): "title": r["title"], "url": r["url"], "snippet": (r["content"] or "")[:300], + "content": r["content"] or "", "published_at": r["published_at"].isoformat() if r["published_at"] else None, "topics": r["topics"] or [], "source": r["feed_title"],