feat: implement enhanced message controls with regenerate any message

Added comprehensive message control features for fine-grained conversation management:

Backend (Rust):
- Extended Message struct with 'pinned' and 'hidden' boolean fields
- Added delete_message_at_index() command for removing any message
- Added toggle_message_pin() command to mark important messages
- Added toggle_message_hidden() command to temporarily hide messages
- Added continue_message() command to append AI continuations
- Added regenerate_at_index() command to regenerate ANY message (not just last)

Frontend (JavaScript):
- Added delete, pin, hide buttons to all messages (user & assistant)
- Added continue button for assistant messages
- Updated regenerate to work on any message, not just the last one
- Implemented state persistence for pinned/hidden in chat history
- Added dynamic icon changes for hide/unhide states
- Integrated with token counter for real-time updates

UI/UX (CSS):
- Pinned messages: accent-colored left border with glow effect
- Hidden messages: 40% opacity with blur effect (70% on hover)
- Delete button: red hover warning (#ef4444)
- Active state indicators for pin/hide buttons
- Always-visible controls on hidden messages for quick access

Features:
- Delete any message with confirmation dialog
- Pin messages to always keep them in context
- Hide messages with visual blur (still in context but dimmed)
- Continue incomplete assistant responses
- Regenerate any assistant message (creates new swipe)
- All states persist in chat history JSON

This completes Phase 3.2 "Enhanced Message Controls" from the roadmap,
providing users with complete control over their conversation history.

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-16 17:19:07 -07:00
parent 9b4bc63e1a
commit b9230772ed
4 changed files with 573 additions and 27 deletions

View File

@@ -383,6 +383,56 @@ body {
height: 14px;
}
/* Enhanced message control buttons */
.message-delete-btn:hover {
background: rgba(239, 68, 68, 0.8) !important;
color: white !important;
}
.message-pin-btn.active,
.message-hide-btn.active {
background: var(--accent);
color: white;
}
.message-pin-btn.active:hover,
.message-hide-btn.active:hover {
background: var(--accent-hover);
}
/* Pinned message indicator */
.message.pinned::before {
content: '';
position: absolute;
left: -8px;
top: 0;
bottom: 0;
width: 3px;
background: var(--accent);
border-radius: 2px;
box-shadow: 0 0 8px var(--accent);
}
.message.pinned .message-content {
border-left: 2px solid var(--accent);
}
/* Hidden message styling */
.message.hidden-message {
opacity: 0.4;
filter: blur(2px);
transition: all 0.2s ease;
}
.message.hidden-message:hover {
opacity: 0.7;
filter: blur(1px);
}
.message.hidden-message .message-actions {
opacity: 1 !important;
}
/* Swipe navigation */
.swipe-controls {
display: flex;