Create the CDP target on a blank page and reset the session playback marker before retained samples so warmups cannot turn splash timing into reload timing.
Defer one-shot background initialization when the presentation request discovers authentication is required, so preferences, LLM state, and sessions initialize only after a successful login.
Use native Window Controls Overlay geometry and sampled background colors so caption hover and drag regions track the system title bar.
Forward original Windows close-handler errors to the shared logger so failures retain their stack traces.
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.
Limit prereleases to desktop artifacts, keep stable releases gated on CLI success, and start Docker publishing as soon as the npm package is available.
Close the uncached readonly adapter after every Desktop export so Windows can delete the session without restarting. Add regression coverage for the successful export lifecycle.
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.
Forward the selected keywords through the shared HTTP route without persistent caching, keep large templates out of the request URL, and reject empty keyword sets before building a regular expression. Ignore superseded analysis responses so rapid keyword changes cannot restore stale rankings or loading state.
getKeywordColor() indexed KEYWORD_COLORS with indexOf() result, which
returns -1 for types not present in currentKeywords (e.g. the
server-generated '其他' aggregate in typeDistribution). KEYWORD_COLORS[-1]
is undefined, so reading .wrapBg threw a TypeError when enabling
multi-color mode. Fall back to a stable keyword hash for unknown types.