Render circular member avatars on ranking lists, person-based charts,
hot-repeat originators, and catchphrase rows. Look up avatars from the
member table instead of bloating ranking queries, and clip ECharts
photos so they match the HTML lists.
Keep the shared runtime in tool_running until every concurrent call finishes. Route renderer progress and completion by toolCallId so one result cannot hide another active tool.
Show a retry-only state when summary index reads fail so transient errors cannot expose the full rebuild action and erase summaries. Also align newly added implementation comments with repository style.
Remove the one-time close prompt and remembered-choice path so Windows close behavior is always explicit and predictable. New installations now minimize to the system tray by default, while users can still choose to quit from settings.
Compress oversized browser history in model-sized stages so switching to a smaller model can recover. Bound the recent-history fallback when summarization fails without deleting persisted messages.
Avoid matching OpenAI-compatible model IDs across providers. Use an 8K fallback so automatic compression runs before unknown providers reject long conversations.
Match ownerless QQ exports safely across UID and UIN drift, preserve merged message scopes through single and batch imports, and apply only sender mappings proven by overlapping platform message IDs. Reject incomplete group mappings to avoid member identity corruption.
Carry owner metadata through merge exports when every source agrees and the owner resolves to a merged member. Drop conflicting or unmappable owner identifiers.
QCE exports can mix UIN and UID namespaces while exposing only observed senders. Keep owner metadata unset across TypeScript, chunked, and native parser paths unless it can be mapped safely.
Keep one-member private exports source-local until exact message overlap proves they belong to the same chat. This prevents unrelated outgoing-only chats from losing messages when platform IDs collide.