@@ -5,6 +5,7 @@ import { ChatMessageList } from "@/components/ChatMessageList";
55import { ChatSidebar } from "@/components/ChatSidebar" ;
66import { ChatSourcesPanel } from "@/components/ChatSourcesPanel" ;
77import { ContextUsageIndicator } from "@/components/ContextUsageIndicator" ;
8+ import { AttachedMemoryChips } from "@/components/AttachedMemoryChips" ;
89import { useConversation } from "@/contexts/ConversationContext" ;
910import { useConversations } from "@/hooks/useConversations" ;
1011import type { ChatMessage } from "@/types/chat" ;
@@ -31,13 +32,16 @@ export default function ChatPage() {
3132 estimatedTokens,
3233 billingUsage,
3334 contextWindow,
35+ attachedMemories,
3436 setCurrentConversationId,
3537 addMessage,
3638 updateMessage,
3739 selectConversation,
3840 startNewChat,
3941 setPendingMessage,
4042 updateContextWindow,
43+ removeAttachedMemory,
44+ clearAttachedMemories,
4145 } = useConversation ( ) ;
4246
4347 const { conversations } = useConversations ( ) ;
@@ -58,6 +62,10 @@ export default function ChatPage() {
5862 // Clear previous follow-up suggestions when sending a new message
5963 setFollowupSuggestions ( [ ] ) ;
6064
65+ // Capture attached memories before clearing (they're consumed with this message)
66+ const memoriesToSend = [ ...attachedMemories ] ;
67+ clearAttachedMemories ( ) ;
68+
6169 // FIX: Handle conversation ID race condition
6270 // If no conversation ID and another message is already creating one, wait for it
6371 let effectiveConversationId = conversationId ;
@@ -109,6 +117,7 @@ export default function ChatPage() {
109117 body : JSON . stringify ( {
110118 message : userMessage . content ,
111119 conversation_id : effectiveConversationId ,
120+ attached_memory_ids : memoriesToSend . length > 0 ? memoriesToSend . map ( ( m ) => m . id ) : undefined ,
112121 } ) ,
113122 } ) ;
114123
@@ -216,7 +225,7 @@ export default function ChatPage() {
216225 // Clear pending conversation ref
217226 pendingConversationRef . current = null ;
218227 }
219- } , [ addMessage , updateMessage , setCurrentConversationId , updateContextWindow ] ) ;
228+ } , [ addMessage , updateMessage , setCurrentConversationId , updateContextWindow , attachedMemories , clearAttachedMemories ] ) ;
220229
221230 // Handler for manual chat input
222231 const handleChat = useCallback ( ( ) => {
@@ -240,11 +249,12 @@ export default function ChatPage() {
240249 useEffect ( ( ) => {
241250 if ( isStartingNewChatRef . current ) return ;
242251 if ( wantsNewChatRef . current ) return ;
252+ if ( attachedMemories . length > 0 ) return ; // Don't auto-load if memories attached
243253 if ( currentConversationId || messages . length > 0 ) return ;
244254 if ( conversations . length === 0 ) return ;
245255
246256 selectConversation ( conversations [ 0 ] ) ;
247- } , [ currentConversationId , conversations , messages . length , selectConversation ] ) ;
257+ } , [ currentConversationId , conversations , messages . length , selectConversation , attachedMemories . length ] ) ;
248258
249259 return (
250260 < div className = "flex h-full" >
@@ -273,14 +283,26 @@ export default function ChatPage() {
273283 { /* Floating input at bottom */ }
274284 < div className = "flex-none p-4" >
275285 < div className = "max-w-2xl mx-auto" >
286+ { /* Attached memory chips */ }
287+ { attachedMemories . length > 0 && (
288+ < AttachedMemoryChips
289+ memories = { attachedMemories }
290+ onRemove = { removeAttachedMemory }
291+ className = "mb-2"
292+ />
293+ ) }
276294 < div className = "flex items-center gap-2" >
277295 < div className = "flex-1" >
278296 < ChatInput
279297 value = { message }
280298 onChange = { setMessage }
281299 onSubmit = { handleChat }
282300 isLoading = { isLoading }
283- placeholder = "Type your message..."
301+ placeholder = {
302+ attachedMemories . length > 0
303+ ? `Ask about ${ attachedMemories [ 0 ] . title } ...`
304+ : "Type your message..."
305+ }
284306 />
285307 </ div >
286308 < ContextUsageIndicator
0 commit comments