* fix: improve chat compression and tool display
Context Compression Fixes:
- Remove duplicate token calculation in compress()
- Simplify compress() to only execute compression, not judge
- Add buildConversationHistory() to preserve tool calls in LLM context
- Remove unused estimateMessagesTokens() and contextLength parameter
- Move all judgment logic to chat-run-socket.ts (uses accurate DB tokens)
Tool Call Display Improvements:
- Add tool execution duration display (format: 1.272s)
- Add success/error status icons with circular backgrounds
- Replace text error with SVG icon (X in red circle)
- Replace old checkmark with polished green checkmark icon
- Add i18n key 'chat.executionDuration' for all locales
Bug Fixes:
- Fix streaming-indicator stuck by adding try-finally in handleEvent
- Add debug logging for compression flow diagnosis
- Fix template syntax error in MessageList.vue
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(chat): convert conversation history to Anthropic format before sending to Gateway
- Add convertToAnthropicFormat() to transform OpenAI format to Anthropic format
- Handle DeepSeek reasoning_content in thinking blocks
- Properly convert tool_use and tool_result blocks
- Add convertFromAnthropicFormat() for parsing SSE responses
- Handle stringified Python arrays in resume messages
- Record debug history files for troubleshooting (original vs converted)
- Fix tool_call_id validation to prevent empty ID errors
- Clean internal Hermes fields (call_id, response_item_id) from tool_calls
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(chat): optimize message parsing and add debug logging
- Only check for stringified arrays in assistant messages (performance)
- Improve parsing error handling: keep original content on parse failure
- Add debug logging for upstream events (reasoning/thinking tracking)
- Log run.completed event keys for troubleshooting
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(chat): add message pagination and reasoning sync improvements
**Message Pagination:**
- Add getSessionDetailPaginated() for paginated message loading
- Query with DESC order then reverse in code for optimal performance
- Remove listSessionsPaginated() (not needed)
**Reasoning Sync:**
- Add bidirectional reasoning merge in syncFromHermes
- Memory → DB: preserve streamed reasoning from SSE events
- DB → Memory: restore reasoning if Hermes Gateway fixes storage
- Send resumed event after sync completes with complete messages
- Fix reasoning field inconsistency: use unified 'reasoning' field
**Message Parsing:**
- Only parse stringified arrays for assistant messages (performance)
- Improve parse error handling: keep original content on failure
- Add debug logging for upstream reasoning/thinking events
**Bug Fixes:**
- Fix reasoning content display: now works on both SSE and resume
- Ensure reasoning is preserved across page refreshes via sync + resumed event
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: increase default pagination limit for messages to 500
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: remove auto-resumed event trigger and clean up debug code
- Remove automatic resumed event trigger in syncFromHermes to avoid timing issues
- Clean up unused imports (fs, join)
- Remove debug history file logging code
- Fix socket parameter passing in handleAbort, markCompleted, and syncFromHermes
- Change usage emit from room broadcast to socket-only emit
- Remove console.log debug statement
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: use reasoning field in convertToAnthropicFormat
Change convertToAnthropicFormat to read from reasoning field instead
of reasoning_content for consistency with database schema and frontend.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: parse stringified array content and improve logs
- Parse stringified array format in run.completed to extract thinking/text/tool_use
- Send parsed content to frontend via parsed_content/parsed_reasoning/parsed_tool_calls
- Frontend updates last assistant message with parsed content
- Remove ellipsis from log messages, show full content
- Add detailed logging for conversion and parsing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: move finalOutputTrimmed outside else block
* fix(chat): handle double-serialized content in resumeSession
- Remove outer quotes before parsing stringified array format
- Updated changelog for v0.5.2 and v0.5.3 with multilingual support
- Fixed message pagination with DESC query + array reverse
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(chat): improve error logging for resume parsing
- Add detailed logging for double-serialized content parsing
- Log content preview when parsing fails to diagnose issues
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* revert(chat): use simple Python-to-JSON replacement
- Revert to simple .replace(/'/g, '"') approach
- Parsing failures will keep original content as-is
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Implement runtime theme switching using CSS custom properties delegated through SCSS variables, with light/dark/system modes, FOUC prevention, sidebar toggle, and settings selector. Add theme-aware video assets for sidebar and chat thinking indicator.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>