personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: smooth chat continuations and remove send button

- Preserve message history when continuing conversations
- Add isContinuation parameter to loadAgent() to skip clearing messages
- Remove Send button from app bar (Enter key to submit)
- Messages now flow naturally across multiple turns

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

+13 -33
-25
apps/chat/app_bar.html
··· 17 17 border-color: #667eea; 18 18 } 19 19 20 - .chat-send-btn { 21 - padding: 0.75em 1.5em; 22 - border: none; 23 - border-radius: 20px; 24 - background: #667eea; 25 - color: white; 26 - cursor: pointer; 27 - font-weight: 500; 28 - font-size: 14px; 29 - transition: all 0.2s; 30 - white-space: nowrap; 31 - } 32 - 33 - .chat-send-btn:hover { 34 - background: #5a67d8; 35 - transform: translateY(-1px); 36 - } 37 - 38 - .chat-send-btn:disabled { 39 - background: #ccc; 40 - cursor: not-allowed; 41 - transform: none; 42 - } 43 - 44 20 .chat-backend-toggle { 45 21 margin-left: auto; 46 22 padding: 0.75em 1em; ··· 80 56 <!-- Use display:contents to make form invisible to flexbox --> 81 57 <form id="chatInputForm" style="display: contents;"> 82 58 <textarea id="chatMessageInput" class="chat-message-input" rows="1" placeholder="Send a message..."></textarea> 83 - <button type="submit" id="chatSendBtn" class="chat-send-btn">Send</button> 84 59 <button type="button" id="chatBackendToggle" class="chat-backend-toggle" data-backend="anthropic" title="Click to change backend"> 85 60 Claude 86 61 </button>
+13 -8
apps/chat/workspace.html
··· 469 469 } 470 470 471 471 // Agent loading function 472 - async function loadAgent(agentId) { 472 + async function loadAgent(agentId, isContinuation = false) { 473 473 currentAgentId = agentId; 474 474 isComplete = false; 475 475 resetEventTracking(); 476 476 477 - // Clear messages but keep activity indicator 478 - messagesDiv.innerHTML = ''; 479 - messagesDiv.appendChild(activityIndicator); 480 - Object.keys(toolPlacards).forEach(key => delete toolPlacards[key]); 481 - previousAgent = null; 477 + if (isContinuation) { 478 + // Continuation - preserve existing messages 479 + Object.keys(toolPlacards).forEach(key => delete toolPlacards[key]); 480 + } else { 481 + // New conversation - clear everything 482 + messagesDiv.innerHTML = ''; 483 + messagesDiv.appendChild(activityIndicator); 484 + Object.keys(toolPlacards).forEach(key => delete toolPlacards[key]); 485 + previousAgent = null; 486 + } 482 487 483 488 // Fetch existing events from disk 484 489 const url = agentUrl.replace('AGENT_ID', agentId); ··· 657 662 658 663 if (r.ok) { 659 664 const d = await r.json(); 660 - // Load the agent (will fetch initial events and subscribe to WebSocket) 661 - await loadAgent(d.agent_id); 665 + // Load agent - preserve messages if continuing 666 + await loadAgent(d.agent_id, !!continueAgentId); 662 667 } else { 663 668 input.disabled = false; 664 669 let err = 'Error';