You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Part of SprintStartProject/Wiki#319 (retire /chat, Buddy is the only conversation surface). Complements #206, which unifies the surface (conversation rail, capability switch, filters, redirects, removing chat). This issue covers the rest of what chat has and Buddy lacks, found in a chat-vs-Buddy check of dev on 2026-09-25.
Blocked by sprintstart-backend#214, sprintstart-backend#259 (backend parity) and sprintstart-ai#206. Blocks the chat removal step of sprintstart-frontend#206.
Split with #206 (2026-09-25): this issue builds the parts (components, hooks, types, callers). #206 wires the page: the rail placement, moving PM Replies into a drawer, removing the no-project gate, the capability switch, the dock, redirects, and deleting chat. Fix #236 (composer lag) first if you can, since it touches the same hook.
1. Citations are not shown in Buddy at all
useBuddyConversation collects citation events into message.citations, but no Buddy component renders them. Chat renders them with MessageCitations, linkifyCitations, CitationPopover and opens ArtifactViewerDrawer.
Render citations under Buddy replies (live and after reload, once the backend persists them), with the popover and the artifact drawer.
Move the Citation type out of features/chatbot/types (features/buddy/types.ts imports it from there today), so deleting features/chatbot does not break Buddy.
2. Composer
Stop an answer while it streams (chat: onStop / stopStreaming; Buddy composer has none).
Filters use the sources that are actually connected (useAvailableSources via connectorService), not a hardcoded list.
3. Thread and rail
Reasoning / tool panel (chat: ReasoningPanel, ThinkingIndicator) fed by the reasoning events the backend emits before the answer (ai#206, batch: shown after the model thought, not live).
Stopped replies show as incomplete (isIncomplete, backend#259), as chat marks them today.
Conversation rail search and date grouping (chat: ChatSidebar search field, date buckets, delete with confirmation → bin).
Conversations replace visits (Wiki#319 decision): "start a new conversation", Alt+N and the fresh-visit button create a conversation; visit dividers and "Clear the earlier conversation" go away. Only the hire's first conversation (or one after a long absence) opens with the greeting; a new one starts with an empty thread and the composer focused.
4. Re-point everything outside features/chatbot
hooks/useAskAi.ts (used by ArtifactViewerDrawer's "ask AI about the selection") → Buddy with the prompt as a draft
Parent Story
Part of SprintStartProject/Wiki#319 (retire
/chat, Buddy is the only conversation surface). Complements #206, which unifies the surface (conversation rail, capability switch, filters, redirects, removing chat). This issue covers the rest of what chat has and Buddy lacks, found in a chat-vs-Buddy check ofdevon 2026-09-25.Blocked by sprintstart-backend#214, sprintstart-backend#259 (backend parity) and sprintstart-ai#206. Blocks the chat removal step of sprintstart-frontend#206.
Split with #206 (2026-09-25): this issue builds the parts (components, hooks, types, callers). #206 wires the page: the rail placement, moving PM Replies into a drawer, removing the no-project gate, the capability switch, the dock, redirects, and deleting chat. Fix #236 (composer lag) first if you can, since it touches the same hook.
1. Citations are not shown in Buddy at all
useBuddyConversationcollectscitationevents intomessage.citations, but no Buddy component renders them. Chat renders them withMessageCitations,linkifyCitations,CitationPopoverand opensArtifactViewerDrawer.Citationtype out offeatures/chatbot/types(features/buddy/types.tsimports it from there today), so deletingfeatures/chatbotdoes not break Buddy.2. Composer
onStop/stopStreaming; Buddy composer has none).QueuedMessages, Show chat errors as toasts and queue messages sent during a response #230).useAvailableSourcesviaconnectorService), not a hardcoded list.3. Thread and rail
ReasoningPanel,ThinkingIndicator) fed by thereasoningevents the backend emits before the answer (ai#206, batch: shown after the model thought, not live).isIncomplete, backend#259), as chat marks them today.ChatSidebarsearch field, date buckets, delete with confirmation → bin).Alt+Nand the fresh-visit button create a conversation; visit dividers and "Clear the earlier conversation" go away. Only the hire's first conversation (or one after a long absence) opens with the greeting; a new one starts with an empty thread and the composer focused.4. Re-point everything outside
features/chatbothooks/useAskAi.ts(used byArtifactViewerDrawer's "ask AI about the selection") → Buddy with the prompt as a draftboard/selection/SelectionActions.tsxreadsChatContext.quoteSelection→ Buddy's quote (quoteFromSelection)board/generation/chatToCard.ts:chatLinkbuilds/chat/:id→/buddy/:id(old cards keep working through the redirect)dashboard/QuickChatWidget,RecentChatsWidget→ Buddy entry and recent conversationsDinoGameModaland onboardingGenerationScreenimportchatbot/components/DinoGame→features/easter-eggs(open PR Easter Eggs Consolidation & Overhaul #184 consolidates the egg code there; check where it leavesDinoGameonce merged)ChatPage's own egg handlers go away with itDeliberately not ported (decided 2026-09-25)
ChatPage(aria-live)SleepyBot,BotGlyphgaze,useIdleSleep,usePointerGaze)These go away with
features/chatbot.Acceptance Criteria
features/buddyimports fromfeatures/chatbotAlt+N) creates a conversation; no visit dividers remaingit grep chatbot srconly hits code that One conversation surface: retire /chat #206 deletesnpm run trypasses