refactor: unified message labels with dynamic tool actions and inline reasoning
Implements intelligent, context-aware message headers with single unified labels
and inline reasoning toggles.
New Architecture:
- src/utils/messageLabels.ts - Pure label computation with tool action mapping
- src/components/InlineReasoningButton.tsx - Compact chevron-only reasoning toggle
- Updated MessageGroupBubble.tsx - Unified header (label + inline button)
- Updated ToolCallItem.tsx - Removed reasoning prop (handled in parent)
- Deleted ReasoningToggle.tsx - Replaced by inline button
Label Logic:
- Tool calls: "(co searched the web)" / "(co is searching the web)"
- Assistant messages: "(co said)" / "(co is saying)"
- Reasoning-only: "(co thought)" / "(co is thinking)"
- Dynamic transitions during streaming (thinking → saying, thinking → searching)
Tool Mappings:
- web_search → "searched the web" / "is searching the web"
- memory → "recalled" / "is recalling"
- conversation_search → "searched the conversation" / "is searching the conversation"
- grep_files, semantic_search_files → "searched files" / "is searching files"
- memory_replace → "updated memory" / "is updating memory"
- memory_insert → "added to memory" / "is adding to memory"
- fetch_webpage → "fetched a webpage" / "is fetching a webpage"
- open_files → "opened files" / "is opening files"
Benefits:
- No more duplicate labels like "(co thought)" + "(co said)"
- Cleaner visual hierarchy (single header per message)
- Streaming state awareness (labels update as content arrives)
- Easier to add new tool actions (centralized mapping)
- Better UX: reasoning toggle is now subtle inline button, not separate row