# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). **Maintainer rule (AI):** before every `vX.Y.Z` tag, complete `## [X.Y.Z]` below. CI Release body = this section only (via `scripts/changelog-for-release.py`; no repeated download/install boilerplate). See `docs/llm-wiki/release.md`. **What's New popup:** each bullet's **first sentence** is what users see. Keep that sentence to one short line (added / fixed / improved — no paths, no implementation, no issue piles). A second short sentence is allowed for GitHub / this file only. Do **not** rewrite already-shipped `## [X.Y.Z]` sections. ## [Unreleased] ### Fixed - Windows no longer freezes when stream IPC or tool journals ran under session locks. - Opening a chat times out stuck history loads and keeps the cached transcript. - Connect retry no longer waits unbounded on a stuck claim or stop. - Windows agent kill reaps the full process tree so tool shells do not orphan. - One busy terminal tab no longer blocks writes or resize on other tabs. - Official login restores from the App agent-home mirror if `~/.grok` auth was wiped. - Windows titlebar drag moves the window again on older WebView2 (#1075). - Feishu remote-control setup shows the publish / availability guide (same as Lark). - Search no longer applies results after you close the palette (#1078). - Local media previews bind to browser-safe ports (#1076). - Windows Explorer drop cleans up failed transfers more reliably (#1077). - Legacy proxy mode `use` migrates the same way in UI and Host (#1079). - Image lightbox close stays closed when a late load finishes (#1081). - Wallpaper X search drains CLI output so hung pipes time out cleanly (#1086). - Wallpaper X results drop non-image pages and rank clearer media first (#1085). - Wallpaper X search can be cancelled and shows prepare / search / validate progress (#1087). - Opening a file in Review keeps the macOS title bar visible. Focus scrolls only inside Review (#1041). - Advanced context-window Save stays fully clickable. The flyout no longer clips the button (#1047). - Linux AppImage prefers host WebKitGTK to avoid black screens and SIGBUS on quit. Helpers stay on disk so FUSE unmount is safe (#539). - Binding QR codes are generated locally without sharing login links. - Plugin authorization keeps secrets out of process command lines. **中文 · 修复** - Windows 上不再因会话锁内发流式事件或写工具日志而整窗卡死。 - 打开会话时历史加载会超时,并保留已有缓存内容。 - 重连不再因卡住的连接占用或 Stop 而无限等待。 - Windows 结束 Agent 时会清理整棵进程树,避免工具子进程残留。 - 一个繁忙终端标签页不再挡住其他标签页的输入或缩放。 - 当 `~/.grok/auth.json` 被清掉时,会从 App agent-home 镜像恢复官方登录。 - Windows 标题栏在旧版 WebView2 上又能拖动窗口(#1075)。 - 飞书远程控制显示与 Lark 相同的「发布 / 可用性」引导步骤。 - 关掉搜索面板后,迟到的结果不再写回(#1078)。 - 本地媒体预览绑定到浏览器安全端口(#1076)。 - Windows 资源管理器拖放在失败时更干净地释放(#1077)。 - 旧代理模式 `use` 在界面与 Host 侧迁移一致(#1079)。 - 图片预览关闭后,迟到的加载不会再把它打开(#1081)。 - 壁纸 X 搜索并行排空 CLI 输出,管道堵死时能按时退出(#1086)。 - 壁纸 X 结果会丢掉非图片页,并优先更清晰的媒体(#1085)。 - 壁纸 X 搜索可取消,并显示准备 / 搜索 / 校验进度(#1087)。 - 在 Review 中打开文件时,macOS 标题栏保持可见。只滚动 Review 内部列表(#1041)。 - Advanced 里上下文窗口的「保存」可正常点到。浮层不再裁掉按钮(#1047)。 - Linux AppImage 优先用本机 WebKitGTK,避免黑屏和退出时 SIGBUS。子进程不再映射在 squashfs 上(#539)。 - 扫码绑定的二维码在本地生成,登录链接不再发给第三方。 - 插件授权密钥不再出现在进程命令行中。 ### Added - Chat markdown renders Mermaid diagrams from fenced code blocks. - Wallpaper X can use Responses search with a clear fallback to CLI (#1088). - Wallpaper X Responses search shows validated images in batches as paths finish (#1089). - Wallpaper X Responses search reuses recent verified results for the same query (#1090). - Wallpaper X Responses search can load more images without clearing the gallery (#1091). - Wallpaper sources add Openverse and Pexels search with paging and Pexels key setup (#1096). - Openverse and Pexels prefetch the next page after a successful search (#1097). - Wallpaper sources add a separate Web image search with safe preview download (#1099). - Wallpaper sources can browse your Grok Saved album after a secure sign-in check (#1103). - Ctrl+Tab jumps back to the last chat you used. Hold Ctrl and tap Tab to cycle further; Ctrl+Shift+Tab goes the other way. **中文 · 新增** - 聊天 Markdown 会渲染 fenced Mermaid 流程图。 - 壁纸 X 可用 Responses 搜索,失败时清楚回退到 CLI(#1088)。 - 壁纸 X 的 Responses 搜索会按完成批次逐步显示已校验图片(#1089)。 - 壁纸 X 的 Responses 搜索会复用同一查询的近期已验证结果(#1090)。 - 壁纸 X 的 Responses 搜索可加载更多,且不清空已有图库(#1091)。 - 壁纸来源新增 Openverse / Pexels 搜索、分页与 Pexels Key 设置(#1096)。 - Openverse / Pexels 在成功搜索后会预取下一页(#1097)。 - 壁纸来源新增独立的 Web 图片搜索,并安全下载预览(#1099)。 - 壁纸来源可在安全登录校验后浏览 Grok Saved 相册(#1103)。 - Ctrl+Tab 切回上一个用过的对话。按住 Ctrl 再点 Tab 继续循环;Ctrl+Shift+Tab 反向。 ### Changed - Sent quotes show the excerpt and comment in the bubble, not a notes chip. - Account quota sits in the user menu again, with remaining % beside the name. - Streaming chat, heatmap hover, and SSH sidebar refresh do less re-rendering (#1073). - Default workspace uses a house icon in the sidebar and composer (#1069). - Sidebar Other now uses the same name as the composer chip: Default workspace (#1067). - Startup skips TipTap and markdown preloads; Office and Settings load on demand (#1055, #1063). **中文 · 变更** - 发送后的引用在气泡里直接显示摘录和评论,不再收成「N 条注释」。 - 额度卡片回到用户菜单顶部,名字旁显示剩余百分比。 - 流式对话、热力图像悬停与 SSH 侧栏刷新减少无效重渲染(#1073)。 - 默认工作区在侧栏和输入框改用小房子图标(#1069)。 - 侧栏「其他会话」与输入框统一为「默认工作区」(#1067)。 - 启动不再预载 TipTap / markdown;Office 与设置页按需加载(#1055、#1063)。 ## [0.2.33] - 2026-09-06 > **Highlight:** Windows installers are back, with composer shortcuts and worktree GC fixes. > > **中文 · 亮点:** Windows 安装包恢复上架,输入框快捷键与 worktree 清理也修好了。 ### Fixed - Windows setup and portable packages publish again after the 0.2.32 build break (#1039). - New chat and Settings shortcuts work while the message box is focused (#1035). - Worktree GC confirm actually runs prune instead of only closing the dialog (#1037). **中文 · 修复** - Windows 安装版与绿色版重新随 Release 发布(#1039)。 - 光标在消息输入框时,新建对话和设置快捷键也能用(#1035)。 - Worktree 清理点确认会真正执行 prune,而不只是关掉对话框(#1037)。 ### Changed - Release CI fails the gate unless every macOS, Windows, and Linux installer is on the tag. **中文 · 变更** - 发版门禁要求 macOS / Windows / Linux 安装包齐全,缺任一平台会失败。 ## [0.2.32] - 2026-09-06 > **Highlight:** Windows drag-drop and Mac Doubao voice work again, with leaner tool memory. > > **中文 · 亮点:** Windows 拖放与 Mac 豆包语音恢复可用,工具内存也更省。 ### Changed - The quote toolbar appears after text selection settles, keeping chat selection smooth. - Slash and @ detection pause while the window is hidden or the input is not focused. - Long chats stay smoother when no session files changed. - The quote comment box uses the same Enter / Ctrl+Enter shortcut as the composer (#1015). - Running tool steps stay collapsed by default to reduce memory use (#1018). - Completed tool output uses less memory in long turns (#1029). **中文 · 变更** - 对话划词结束后再显示引用工具栏,对话选取更顺畅。 - 窗口隐藏或输入框未聚焦时,斜杠和 @ 探测会停。 - 没有文件变更时,长对话保持流畅。 - 划词评论框与输入框共用 Enter / Ctrl+Enter 发送快捷键(#1015)。 - 工具运行中默认折叠,减少内存占用(#1018)。 - 工具结束后占用更少内存,长回合更顺畅(#1029)。 ### Fixed - Mac Control+Return steers a live turn again (#1023). - Windows Explorer drag-drop works again for projects and chat attachments (#1017). - Image prompts no longer paint two user bubbles (#1021). - Enter in the composer sends a quote card even when the input is empty (#1015). - Wide Markdown tables now scroll horizontally without fading on the right (#1020). - Mac Doubao IME Fn / Globe voice works in the chat composer again (#1030). **中文 · 修复** - Mac 上 Control+Return 又能引导当前回合(#1023)。 - Windows 资源管理器拖放项目和附件恢复可用(#1017)。 - 带图发送不再画出两条用户气泡(#1021)。 - 输入框为空时按 Enter 也能只发送引用卡片(#1015)。 - 过宽的 Markdown 表格支持横向滚动,右侧不再变淡(#1020)。 - Mac 上豆包输入法按 Fn / Globe 可唤起语音(#1030)。 ## [0.2.31] - 2026-09-04 > **Highlight:** See which files the agent edited, then expand a highlighted diff in chat. > > **中文 · 亮点:** 回合结束后能看到改了哪些文件,并在对话里展开高亮 diff。 ### Added - Chat shows expandable cards for files the agent edited. Open Review from a card for the focused diff (#998). - OrcaRouter is available as a custom-provider preset (#1004). **中文 · 新增** - 助手改完文件后,对话里会出现可展开的改动卡片。也可从卡片打开 Review 看聚焦 diff(#998)。 - 自定义供应商画廊增加了 OrcaRouter 一键预设(#1004)。 ### Changed - In-app CLI upgrades warn when a newer App is available. You can still continue after confirming (#1009). - Project folder actions stay hidden until you hover the row. - Long streaming replies paint more smoothly near the end of the message. **中文 · 变更** - 应用内升级 CLI 时,若已有新版 App 会先提醒。确认后仍可继续升级(#1009)。 - 项目文件夹右侧操作按钮改为悬停才显示。 - 长回复流式输出接近结尾时更顺滑。 ### Fixed - Settings render errors no longer blank the whole window. The Settings stage keeps a Retry panel (#1006). - Custom-model chats no longer switch models between turn 1 and turn 2 (#1000). - Windows can add a project by dropping a folder on the sidebar again (#999). - Chat no longer crashes mid-stream with React error #30 when a turn fails (#1002). - Phone mirror turns finish on the phone, and the desktop shows that message (#1001). **中文 · 修复** - 设置页渲染出错时不再整窗空白。设置舞台会留下可重试面板(#1006)。 - 自定义模型会话不会再在第一轮与第二轮之间悄悄换模型(#1000)。 - Windows 又能把文件夹拖到侧栏加为项目(#999)。 - 回合失败时聊天区不再因 React #30 崩溃(#1002)。 - 手机镜像回合会在手机端正常结束,电脑也能看到手机发出的消息(#1001)。 ## [0.2.30] - 2026-09-02 > **Highlight:** Install plugins from a local folder, and add X API from Recommended. > > **中文 · 亮点:** 设置里可从本地装插件,推荐里可一键加 X API。 ### Added - Settings can install a plugin from a local folder or git URL. - Installed plugins that ship MCP appear under Extensions → MCP. - X API is a recommended plugin you can install from Settings. - You can authorize the X API plugin from the MCP list. **中文 · 新增** - 设置 → 插件可以从本地文件夹或 git 安装。 - 带 MCP 的已装插件会出现在扩展 → MCP。 - 推荐插件里增加了 X API。 - 可在 MCP 列表里给 X API 授权。 ### Changed - More UI languages fill in strings that still matched English. Remaining locales including Japanese, Korean, Russian, Ukrainian, and Tamil follow the locale (#972–#975, #977–#980). - Background git and worktree Host work stays off the async runtime. Status, diffs, review loads, and worktree ops no longer stall other commands (#988, #990–#993). - Opening a chat with media settles with fewer polls. Reveal still waits on load events; the safety net is slower (#989). **中文 · 变更** - 更多界面语言补上了原先还跟英文重复的可见文案。含日/韩/俄/乌/泰米尔等剩余语言跟语言走(#972–#975、#977–#980)。 - 后台 git / worktree 更省。状态、diff、Review 与 worktree 操作不再堵其它 Host 命令(#988、#990–#993)。 - 打开带媒体的会话少扫 DOM。仍靠加载事件揭开,兜底轮询更慢(#989)。 ### Fixed - Sidebar header is now one row: logo, search, and pane toggle. Search sits next to the toggle on the right (#996). - Desktop composer now shows localized labels for all reasoning tiers. The top tier no longer shows a raw internal id (#994). - Project chats no longer inherit the default-workspace sandbox. Writes inside the selected project work again (#986). - Expanded tool steps no longer stack title and command on one line. The last row in a Worked-for list keeps its real height (#983). - Thinking no longer stays on screen as the final reply. The real answer paints in place; switching chats is not required (#968). - Settings search finds Chinese keywords for permission, telemetry, login, and more. Bilingual keywords stay locked by catalog test (#970). - Queue edit and other glass dialogs stay above the embedded browser. Native webviews hide while the modal is open (#976). - Doctor and the agent dashboard no longer use native dropdowns. They use the same app Select as settings (#981). - Screen-reader labels for the files pane and setup steps follow the UI language. They no longer stay English (#982). - Wallpaper crop in the theme editor matches the main window. **中文 · 修复** - 桌面侧栏顶栏收成一行,搜索与侧栏按钮同在右侧。折叠时仍可在主栏左上角打开侧栏(#996)。 - 桌面 Composer 推理强度最高档已与其它档位一样显示本地化名称。例如最高档显示「极高」(#994)。 - 项目会话不再误用默认工作区的沙箱。在选中项目里写文件又能成功了(#986)。 - 展开的工具步骤不再把标题和命令叠在同一行。工作列表最后一行会按真实高度排开(#983)。 - 思考结束后不再把思考过程当成最终回复。正文会直接画出来,不用切走再切回来(#968)。 - 设置搜索补上了中文关键词,权限、遥测、登录等能搜到了。目录测试会锁住双语关键词(#970)。 - 打开内置浏览器时,队列编辑等毛玻璃弹窗不再被挡住。弹窗打开期间会暂时藏起原生页面(#976)。 - Doctor 和智能体面板不再用系统原生下拉。跟设置一样走项目 Select(#981)。 - 文件面板和设置向导的读屏标签跟界面语言走。不再固定英文(#982)。 - 主题编辑器里的壁纸裁切跟主窗口比例一致。 ## [0.2.29] - 2026-08-31 > **Highlight:** One-click CLI install, complete translations, and smoother long chats. > > **中文 · 亮点:** 一键装 CLI、翻译补全、长对话更顺。 ### Added - When the Grok Build CLI is missing, Runtime settings offers a one-click install. **中文 · 新增** - 找不到 Grok Build CLI 时,运行时设置里可以直接一键安装。 ### Changed - Missing translations are filled in. SSH, IM security, permission rules, and Doctor checks follow the UI language. - Scrolling a long chat does less work per frame. Three full-journal scans no longer run on every render. - Long chats scroll more smoothly. Measuring one row no longer re-adds every row above it. **中文 · 变更** - 补上缺的翻译。SSH、IM 安全、权限规则和 Doctor 检查跟界面语言。 - 长会话滚动每帧少做一些活。三处全量遍历不再每次渲染都跑。 - 长会话滚动更顺。测量一行不再把它上面所有行的高度重新加一遍。 ### Fixed - CLI update banner and empty side-tab hint follow Appearance text color on wallpaper. They sat outside the old chrome list and used tertiary ink. - Opening a remote file no longer shows a failed banner when the file already loaded. Listing a parent folder is not treated as an SSH outage. - Rewind puts the discarded user prompt back in the composer. Edit it and send again, including attachments. - Chat no longer jumps while the agent is streaming. Switching away and back no longer lands in the middle. - Live thinking is not clipped in a 220px box. The transcript follows the stream. - Opening an SSH path chip no longer blanks the window. The files pane shows a loading state instead of an empty Suspense. - A question from the agent comes back after a reload instead of leaving the chat stuck. Reopening the chat restores it. - Rollback no longer spins for minutes when the agent is slow to answer. Forking a chat also stops holding up other chats' sends. - Rewind is refused while a chat you switched away from is still streaming. It used to cut that chat's history mid-turn. **中文 · 修复** - 壁纸上 CLI 更新条和「未打开标签」跟外观文字色。原先不在暴露层名单里,用了过淡的 tertiary。 - 修复远端文件已经打开仍显示 failed。展开目录失败不再盖住已经读出来的正文。 - 修复回退后用户那句从对话里消失、没法改。会回到输入框,带上原来的附件。 - 修复对话输出时屏幕往上跳、切出 App 再回来落到中间。正在看历史时不会被拽回底部。 - 修复 Live Thinking 被 220px 小框截断。主对话跟着流式输出走。 - 修复点 SSH 路径 chip 整窗变白。文件面板先显示加载,不再空白。 - 修复重载后 agent 的提问消失、会话卡在思考中。重新打开会话会把提问恢复出来。 - 修复回退在 agent 迟迟不应答时转好几分钟。分叉会话也不再占住别的会话的发送。 - 修复切走的会话还在输出时仍允许回退。原先会截断那条会话的历史。 ## [0.2.28] - 2026-08-29 > **Highlight:** SSH remote hosts, a combined model chip, and chat that stays with the stream. > > **中文 · 亮点:** SSH 远端主机、模型推理合一芯片,对话跟住输出。 ### Added - SSH remote hosts can be watched from Settings. Runtime → SSH; list, open, and start remote chats over OpenSSH. **中文 · 新增** - 设置里可 Watch SSH 远端主机。运行时 → SSH;列出、打开,并在远端文件夹开新对话。 ### Changed - Composer model chip is one control for model + effort. Advanced hub; empty and active chats share the same width. - Message action buttons stay visible. Appearance still has On hover. - Opening a file uses the full preview. The tree stays closed unless you pick Files or jump from env. **中文 · 变更** - 输入框模型按钮改为模型+推理一颗芯片。高级悬停侧出选项;空对话和进行中对话同一列宽。 - 消息操作按钮默认始终显示。外观里仍可改回悬停显示。 - 打开文件用满宽预览。除非点 Files 或从环境跳转,文件树保持收起。 ### Fixed - Last chat lines stay above the composer. Bottom overscroll no longer hides the tail. - Rewind on the last user bubble undoes that turn. Local journal still truncates if agent rewind fails. - First send on a new chat is not dropped when the agent is parked as viewed-only. - SSH path chips in chat open the files tree like local projects. - Long live thinking stays on the latest tokens. After a turn finishes, the view stays on the stream. - Wallpaper frost stays on during a live turn. Overlay at 0% no longer clears blur. - Windows taskbar keeps the Grok mark after an update. - Mac Steer is Ctrl+Enter only, matching Grok Build CLI. Cmd+Enter no longer steers. - Windows wallpaper frost reaches the sidebar and empty chat. - Fork from a middle turn no longer brings back later parent messages. - Rapid follow-up messages no longer lose the next reply. - Cmd/Ctrl click keeps multi-select in the session list. **中文 · 修复** - 修复对话最后几行压在输入框上。底部超滚不再把尾巴藏起来。 - 修复点最后一条用户消息无法回退。Agent rewind 失败时仍截断本地记录。 - 修复新会话第一轮发出去没有真正开跑。 - 修复 SSH 会话里点路径 chip 不能跳到侧栏文件树。 - 修复思考过长时看不到最新内容。任务结束后视口留在流式输出结尾。 - 修复进会话、开始直播时壁纸突然变清楚。遮罩拉到 0% 也不会关掉模糊。 - 修复 Windows 更新后任务栏变成空白文档图标。 - 修复 Mac 引导快捷键。对标 Grok Build CLI,只用 Ctrl+Enter。 - 修复 Windows 壁纸透过侧栏和空会话。 - 修复从中间分叉时后面的父会话消息又回来。 - 修复连续快速发送时下一条回复丢失。 - 修复按住 Cmd/Ctrl 点选会话时只留下最后一条。 ## [0.2.27] - 2026-08-27 > **Highlight:** Settings opacity, plugin packs, LaTeX, and a less blocking ask bar. > > **中文 · 亮点:** 设置页透明度、斜杠选插件、对话公式,提问不再挡住会话。 ### Added - Settings overlay opacity can be adjusted. Appearance → Theme; 20% floor; not in `.grokskin`. - After an update, the app shows this version's notes. Reopen from the account menu or Settings → About. - Slash menu can pick a whole plugin pack. A single skill from the pack can still be chosen. - Chat can render LaTeX. Matches Grok Build CLI `$…$` / `$$…$$`. - The text-selection toolbar can be hidden. Right-click still works. - The progress rail can sit on the left or right. - Text color and shadow can be customized. These fields travel with `.grokskin`. **中文 · 新增** - 设置页可调节不透明度。外观 → 主题;最低约 20%;不进皮肤包。 - 更新后会弹出本版说明。账户菜单和设置 → 关于可再打开。 - 斜杠菜单可以选整个插件。仍可只选其中一条 skill。 - 对话支持 LaTeX 公式。与 Grok Build CLI 的 `$…$` / `$$…$$` 一致。 - 可隐藏划词工具栏。右键菜单仍可用。 - 对话进度条可改到左侧或右侧。 - 可自定义文字颜色和阴影。这两项会随皮肤包导入导出。 ### Changed - OpenRouter preset is now GLM-5.3 Flash. Saved channels stay until re-added. - Zhipu GLM is a single gallery entry with official branding. - Custom provider form puts name, URL, and key first. - Environment info can pin beside the chat. - Plan card and agent questions no longer cover the transcript. - Titlebar, wallpaper, and pane contrast were cleaned up. - Overlay blur notes a macOS 27+ bug. - Dock icons use the authored black and white sets. - README lists Linux AppImage runtime packages. - Unused UI widgets were removed. - What's New notes are one short sentence per bullet. **中文 · 变更** - OpenRouter 预设改为 GLM-5.3 Flash。已保存通道不会自动改。 - 智谱 GLM 改为单入口并带官方标识。 - 自定义服务商表单把关键信息提前。 - 环境信息可固定到对话旁。 - 计划卡片和 Agent 提问不再挡住会话。 - 标题栏、壁纸和分栏对比已调整。 - 遮罩模糊下注明 macOS 27+ 有 bug。 - Dock 图标改用成品黑白套件。 - 补充 Linux AppImage 运行依赖说明。 - 移除未使用的界面组件。 - 更新公告每条只保留一句话。 ### Fixed - Opening a past chat waits until image and video cards have a real height, then shows the thread and scrolls to the latest once. - Chat stays pinned through thinking, tools, and pane resize. - Custom effort catalogs no longer check two rungs at once. - The providers list scrolls when there are many channels. - Windows editor open no longer passes extended-length paths. - Desktop pet motion and language follow the app again. - Composer newline no longer drops the whole line. - Session API second turn no longer deadlocks. - Signed-out startup no longer waits on authenticate. - Sidebar selection, new-chat fold, and leftover plan overlay were fixed. - Wallpaper overlay now continues across the right pane. - Appearance preset and color cards are flat. Video presets play in the card. - Appearance preset cards show an outline only when selected. **中文 · 修复** - 修复打开历史会话不滚到最底部。等图片和视频卡片高度算准后再展示记录,并只滚一次到底。 - 修复思考、工具输出和打开侧栏时聊天不跟到底。 - 修复自定义推理档会同时勾中两档。 - 修复服务商列表条目多时无法滚动。 - 修复 Windows 用编辑器打开路径。 - 修复桌宠动画和语言。 - 修复输入框换行把整行下移。 - 修复会话接口第二轮卡住。 - 修复未登录启动长时间等待。 - 修复侧栏选中、新建会话折叠和计划面板遮罩。 - 修复壁纸遮罩在右侧栏变亮。 - 去掉外观预设卡和配色卡的浮雕;视频预设会在卡片里播放。 - 外观预设卡仅在选中时显示描边。 ## [0.2.26] - 2026-08-24 > **Highlight:** Import Grok Build CLI sessions from Account; phone mirror on the same Wi-Fi; Windows permission/rewind clicks; long chats stay scrollable. > > **中文 · 亮点:** 从账户导入 Grok Build CLI 会话;同一 Wi-Fi 手机镜像;Windows 权限/回退按钮可点;长对话滚动不再卡死。 ### Added - **Import Grok Build CLI sessions from Account → Recent sessions**: Import & open a row, or import the listed table into the sidebar. Empty sidebar offers the same when local CLI logs exist. Import may add the CLI cwd as an **untrusted** project (never home `/` or `~/`). - **Second SuperGrok login hint** on the account switcher: Add account, then switch. One login stays active. **中文 · 新增** - **从设置 → 账户「近期会话」导入 Grok Build CLI 对话**到侧栏;空侧栏在有本地 CLI 记录时提供同一入口。导入可为 CLI 工作目录补一条**未信任**项目(不会把家目录或 `/` 加成项目)。 - **账户切换**提示可添加第二个 SuperGrok 登录;同一时间只有一个登录生效。 ### Changed - **Settings overlay navigation (#870)**: open/section/tab/hash/last-route live in `useSettingsNavigation`. Pref hydration is `useAppSettingsPrefs`; session connect/live map is `useSessionConnect`. - **AppWorkbench domain split (#869)**: session tree, sidebar, composer send, settings stage and related chrome live in extracted modules. - **Bottom terminal tab chrome**: hover shows the close chip on every tab; a close-all icon sits next to New terminal. - **Plan / resources pane enter motion**: desktop in-flow aside interpolates width with the existing pane-split token; overlay and side-expanded stay snap. Bottom terminal height still snaps (no chat virtualizer reflow); chrome/body fade in. - **Light wallpaper readability**: light theme uses its own white veil and weaker main mix so text stays ink-dark on mixed wallpaper; no extra cards under chrome. **中文 · 变更** - **设置页导航 / prefs / connect(#870)**:开合走 `useSettingsNavigation`,prefs 水合走 `useAppSettingsPrefs`,会话 connect/live map 走 `useSessionConnect`。 - **AppWorkbench 拆分(#869)**:会话树、侧栏、发送路径、设置舞台等迁到独立模块。 - **底部终端标签栏**:鼠标悬停任意标签显示关闭;加号旁增加关闭所有终端。 - **计划 / 资源侧栏入场**:桌面分栏宽度用现有 pane-split 令牌插值;overlay 与展开覆盖仍一次落位。底部终端高度仍一次到位(避免长对话重排);顶栏和内容淡入。 - **浅色壁纸可读性**:浅色主题用独立白色 veil、主区更通透;文字保持深色描边,不额外加承载卡片。 ### Fixed - **Windows permission bar clicks (#878, #880)**: the card dumped ACP request JSON as the command preview, and Approve / Deny could miss clicks (floating composer is `pointer-events: none` without `no-drag`). Preview is the command/path; buttons stay clickable; busy/error show on the card. - **Windows rewind confirm stayed open (#879, #880)**: failures toasted under the modal overlay (`z-index` 60 vs 12000). Toast is portaled above overlays; rewind shows the error in the dialog; the timeline closes before confirm. - **Long-chat history browse freeze (#881, #882)**: a 4800px overscan floor remounted too much markdown on a fling. Browse overscan scales down with row count; the pin-to-bottom window is unchanged. - **Phone mirror same-LAN access (#875)**: the host bound only `127.0.0.1`, so replacing the URL with a LAN IP returned `ERR_CONNECTION_REFUSED`. Loopback stays the default. **Allow same Wi-Fi** (in-app confirm) rebinds `0.0.0.0` and copies/QRs the detected LAN IPv4. Soft-fail copy no longer claims LAN works without that toggle. - **Windows PTY clippy**: `PtySession.pid` is Unix-only (process-group SIGKILL). Windows kill stays on `ChildKiller`, so CI `-D warnings` stays green. - **Expanded SideWorkbench vs macOS traffic lights**: when the sidebar is hidden or overlayed, the shared pane chrome pads with `--titlebar-safe-left`. - **WeCom webhook replay window**: signed callbacks whose `timestamp` is outside ±300 seconds are rejected with 401. - **WeCom webhook loopback hint**: webhook mode bound to 127.0.0.1 now surfaces that public callbacks need `allow_external` (runtime last_error code + Settings health copy). - **CLI session project import**: auto-add uses home-relative depth ≥ 2, so Linux `/home/name/projects` and Windows `C:\Users\name\Documents` are not treated as projects. Missing home refuses. - **Theme switch snapshot cap**: WebKit color snapshot skips animation when the live DOM has more than 400 elements, avoiding jank on large trees. - **Closing a terminal really kills the shell**: tab × / close-all / overflow / project switch call host `terminal_pty_kill` (process killer + PTY drop), not only hide the chip. Hide-panel still keeps sessions. - **Bottom terminal tab numbers follow creation order**: the plus button appends a new chip on the right, so the original Terminal 1 stays Terminal 1 instead of being pushed to Terminal 2. - **Terminal prompt inset**: side and bottom PTY text sits 5px inside the pane. The 50% veil still covers the full terminal; padding is on `.xterm`, not the host. - **New session side pane opens the picker, not Plan**: the unused `planFocusKey` 0 is no longer treated as a focus bump, so opening the right pane on a fresh chat shows the kind menu instead of an empty Plan tab. - **Plan empty state centers in the side pane**: the idle title / hint / history CTA no longer sit in a left-capped 28rem column when Plan is a side-workbench tab. - **Context compact cards stay at the moment of compaction (#855)**: mid-turn auto-compact freezes the current assistant bubble, inserts the banner, then continues streaming below it so later tools are not piled on the composer. - **Files tree refreshes when the agent creates files (#863)**: open Resources keeps expand state and re-lists root + expanded folders as session write paths change — no need to close and reopen the pane. - **Long chat transcript scroll no longer hitches on Worked-for blocks or lift-off (#853)**: Follow-up to #842. Virtual-window growth that still covers the viewport commits in the background (`startTransition`) and at most 3 rows per frame; collapsed tool steps skip `toolExpandBody` until opened; scroll settle uses velocity + a 160ms stillness floor so touchpad lift-off is not treated as a stop; hover is disabled while moving; pin snap restores the pre-commit distance from the bottom so expanding overscan does not bounce. - **WeCom webhook auth + ACL fail-closed (#851)**: webhook mode requires `callback_token` and verifies signatures; empty `allowFrom` denies all (use `*` to opt in); loopback bind by default. - **Settings segmented controls no longer flash (#856)**: shared `SegmentedControl` for tabs and theme capsules; first mount settles without a vertical expand. - **Welcome intro motion + Appearance toggle (#857)**: restored “what to do today” cadence; optional welcome animation (on by default). - **Sidebar open/close motion stable (#858)**: wide-window rail eases with the main pane; titlebar safe padding no longer snaps toward traffic lights. - **Settings frosts wallpaper behind the stage (#859)**: `app-settings-stage` uses glass blur/saturate under wallpaper. - **Theme light/dark transition keeps sidebar blur (#860)**: View Transition elsewhere; WebKit color WAAPI so backdrop-filter stays live. - **Pet body edge no longer shows a white fringe (#861)**: same-ink stroke covers AA seams. - **Composer matches chat reading width after the first turn**: once a session has transcript, the floating input (and permission bar) follow Appearance → chat width via `--chat-width-max`. Empty/new-session welcome still uses the classic `42rem` input. - **Sidebar “Other sessions” no longer sits under empty project space**: collapsing every project (or shrinking a folder after a long session list) now retargets the locked L1 projects height to the remaining rows instead of keeping the last expanded px. - **Sidebar project header icons**: chevron + space name expand/collapse the project list; space switching is a standalone switch button that appears on row hover like collapse/more; collapse-all stays outside; select, archive-older, and add-project move into a ⋯ menu. - **Official-aux X/Imagine on packaged custom mains**: `/Applications/Grok.app` never bundled `scripts/official-aux-mcp.mjs`, so ACP injected `mcpServers count=0` while ChatCut still auto-loaded from independent `agent-home/config.toml`. Host now writes the MCP script into `agent-home-official`, disables user MCP `enabled` flags during solo inject, ships official-aux `--rules` on prewarm, and tells the model to call `official-aux__x_keyword_search` directly instead of `search_tool` (which was resolving to ChatCut). **中文 · 修复** - **Windows 权限卡点击无响应(#878, #880)**:预览区曾渲染整段 ACP JSON;浮动输入区 `pointer-events: none` 且权限卡未标 `no-drag`,WebView2 会把点击当成拖窗口。现显示真实命令,按钮可点,失败写在卡片上。 - **Windows 回退确认窗关不掉(#879, #880)**:错误 toast 被挡在遮罩下。toast 提到 overlay 之上;失败写在弹窗里;打开确认时关掉时间线。 - **长会话上下滚动卡死(#881, #882)**:浏览历史时 overscan 下限 4800px,一甩挂太多 markdown。现按行数缩小浏览 overscan,钉在底部的窗口不变。 - **手机镜像同一局域网访问(#875)**:主机原先只绑 `127.0.0.1`,把链接换成局域网 IP 会 `ERR_CONNECTION_REFUSED`。默认仍是回环。开启 **允许同一 Wi-Fi**(应用内确认)后改绑 `0.0.0.0`,复制/二维码使用探测到的局域网 IPv4。隧道失败时的文案不再暗示「换成局域网 IP 就能用」。 - **Windows PTY clippy**:`PtySession.pid` 仅 Unix 用于进程组 SIGKILL;Windows 仍走 `ChildKiller`,CI `-D warnings` 不再红。 - **展开侧栏避开 macOS 交通灯**:侧栏隐藏或 overlay 时,共享顶栏使用 `--titlebar-safe-left` 内边距。 - **企微 webhook 重放窗口**:`timestamp` 超出 ±300 秒的已签名回调返回 401。 - **企微 webhook loopback 提示**:未开启 `allow_external` 且绑在 127.0.0.1 时,运行状态与设置页提示「公网回调需开启 allow_external」。 - **CLI 会话导入项目路径**:按相对 home 深度 ≥ 2 判断,不再把 Linux `/home/name/projects` 或 Windows `C:\Users\name\Documents` 当成项目;取不到 home 则拒绝。 - **主题切换快照上限**:DOM 超过 400 个元素时跳过 WebKit 颜色快照,避免大树卡帧。 - **关闭终端会真正杀掉 shell**:标签 × / 关闭全部 / 超出上限 / 切换项目都会走宿主 `terminal_pty_kill`(杀进程 + 关掉 PTY),不是只藏标签。收起面板仍保留会话。 - **底部终端标签序号跟随创建顺序**:加号把新标签加到右边,原来的「终端 1」不会被挤成「终端 2」。 - **终端提示符内边距**:侧栏和底部 PTY 文字距面板 5px。50% 遮罩仍铺满整个终端,内边距加在 `.xterm` 上,不加在外壳。 - **新建会话打开侧栏显示可选菜单,而不是计划**:不再把未使用的 `planFocusKey` 0 当成一次聚焦,新对话打开右侧栏会看到种类菜单,而不是空的计划页签。 - **侧栏计划空状态在面板内居中**:计划作为侧栏页签打开时,标题 / 说明 / 计划历史不再落在左侧 28rem 窄列里。 - **「上下文已自动压缩」卡片留在压缩发生的时间点(#855)**:回合中压缩会冻结当前助手气泡、插入横幅,再在下方继续流式输出,后续工具不再堆到输入框上方。 - **Agent 新建文件后右侧文件树自动刷新(#863)**:保持展开状态,按会话写入路径重列根目录与已展开文件夹,不用关面板再开。 - **长对话滑过「Worked for …」和抬手时不再卡顿(#853)**:#842 的后续。视口已被覆盖时的窗口扩张走后台提交,每帧最多挂 3 行;折叠的 tool 步骤在展开前不算 `toolExpandBody`;settle 用速度 + 160ms 静止下限,触控板抬手不再被当成停下;滑动中关掉 hover;贴底 snap 恢复 commit 前的离底距离,扩张 overscan 时不再弹跳。 - **企微 webhook 鉴权 + ACL 默认拒绝(#851)**:webhook 必须填 `callback_token` 并验签;空 `allowFrom` 拒绝全部(显式 `*` 才开放);默认只绑 loopback。 - **设置页签/胶囊切换不再闪(#856)**:公共 `SegmentedControl`;首次挂载不纵向展开。 - **新对话欢迎动画 + 外观开关(#857)**:恢复入场节奏;欢迎动画默认开、可关。 - **侧栏开合动效稳定(#858)**:宽窗侧栏与主区连续移动;标题栏安全边距不再回弹红绿灯。 - **壁纸下设置舞台毛玻璃(#859)**:`app-settings-stage` 使用 glass blur。 - **深浅主题切换保持侧栏模糊(#860)**:非 WebKit 用 View Transition;WebKit 用颜色 WAAPI。 - **宠物身体外缘白边消除(#861)**:同色描边盖住抗锯齿缝。 - **有聊天记录后输入框与阅读宽度一致**:会话产生内容后,浮动输入框(及权限条)跟随设置 → 外观的聊天宽度(`--chat-width-max`)。新建/空会话欢迎态仍用原来的 `42rem` 输入框宽度。 - **侧栏「其他会话」不再被空项目区顶到最下面**:收起全部项目(或长会话列表变短)后,L1 项目区会按剩余行高回缩,而不再锁在上次展开的像素高度。 - **侧栏项目区顶部图标**:箭头+空间名展开/收起整个项目区;切换空间是独立按钮,和折叠/更多一样只在该行 hover 时出现;折叠全部仍留在外面;多选、按时间归档、添加项目收进 ⋯ 菜单。 - **打包后自定义主模型的官方 X/画图注入**:正式版 App 找不到 `official-aux-mcp.mjs`,ACP 注入空 MCP,ChatCut 仍从独立 `agent-home/config.toml` 自动拉起。现将脚本写入 `agent-home-official`,solo inject 时关掉用户 MCP 的 `enabled`,预热进程带上官方 `--rules`,并要求模型直接调用 `official-aux__x_keyword_search` 而不是 `search_tool`(后者会命中 ChatCut)。 ## [0.2.25] - 2026-08-23 > **Highlight:** Desktop pet mirrors on the right of the screen and no longer wakes the workbench; appearance packs; long chats, files, and Settings stay full-window and responsive; Windows caption/titlebar geometry is honest. > > **中文 · 亮点:** 桌面宠物在屏幕右侧水平镜像且按下不再唤醒主窗;外观包;长对话、文件树和设置页铺满且更跟手;Windows 标题栏/最大化几何正确。 ### Added - **Windows `install-latest.cmd`**: with Node / pnpm / Rust / VS Build Tools, double-click to fast-forward `origin/main` and silently install an unsigned side-by-side **grok-app-latest** under `%LOCALAPPDATA%\grok-app-latest`. Does not replace official **Grok**. For people waiting on the next GitHub Release; not a signed production build (`docs/BUILD.md`). - **Appearance packs (.grokskin)**: Settings → Appearance can save, import, and export the current skin + wallpaper + crop + clip + overlay. Apply always confirms first. `grok://` and `.grokskin` files write a pending import and never auto-apply. Export bakes the visible wallpaper crop (video uses system ffmpeg when present). - **Custom provider extra request headers (#812)**: Settings → Account → Providers can add key/value HTTP headers. They write Grok Build `extra_headers` on `[model.]` (sent verbatim). Use for AgentRouter / AnyRouter WAF (`User-Agent`, `Originator`) or Anthropic `x-api-key`. Empty list omits the field. - **OpenRouter provider preset**: Add-provider gallery one-click fill — `https://openrouter.ai/api/v1` with **chat_completions**, model **`stealth/ox-alpha`** (Ox Alpha), Grok-style effort `low`/`medium`/`high`/`max` (default medium), vision on, 1 048 576 context, and the OpenRouter mark (purple `#7624F4` in light theme, ink in dark). Get API Key opens https://openrouter.ai/settings/keys. Existing auto-suffixed ids such as `openrouter-----…` resolve the same channel. - **Optional Windows taskbar overlay for unread sessions** (#775): Settings → General → App toggle, **off by default**, independent of the dock/tray unread badge. When on, the host paints 1–9 / 10+ via `set_overlay_icon` (Tauri `set_badge_count` is a no-op on Windows). Hide-to-tray restore re-applies the last overlay count after Explorer AddTab. - **Shortcuts help (Ctrl+/)**: the overlay now searches by label / id / chord, groups like Settings → Keyboard, and lists zoom, newline, prompt history, and type-to-focus. The list scrolls instead of clipping the last rows. **中文 · 新增** - **Windows `install-latest.cmd`**:已有 Node / pnpm / Rust / VS Build Tools 时可双击,把 `origin/main` fast-forward 后静默安装一份未签名的并排 **grok-app-latest**(`%LOCALAPPDATA%\grok-app-latest`),不覆盖正式版 **Grok**。给等不及下一版 GitHub Release 的人用,不是签名生产包(`docs/BUILD.md`)。 - **外观包(.grokskin)**:设置 → 外观可保存/导入/导出当前皮肤 + 壁纸 + 裁切 + 片段 + 遮罩。套用前必须确认。`grok://` 和 `.grokskin` 只写入待导入槽,从不静默套用。导出按当前窗口可见区域烘焙壁纸(视频在本机有 ffmpeg 时裁切)。 - **自定义提供商可填额外请求头(#812)**:设置 → 账号 → 提供商可添加键/值 HTTP 头,写入 Grok Build `[model.].extra_headers`(推理请求原样发送)。用于 AgentRouter / AnyRouter 校验 `User-Agent` / `Originator`,或 Anthropic 的 `x-api-key`。空列表不写该字段。 - **OpenRouter 服务商预设**:添加提供商图库一键填入 `https://openrouter.ai/api/v1`(chat_completions)、模型 **`stealth/ox-alpha`**(Ox Alpha)、思考档 `low`/`medium`/`high`/`max`(默认 medium)、开启视觉、上下文 1 048 576,并带 OpenRouter 标(浅色主题紫色 `#7624F4`,深色跟当前文字色)。获取 Key 打开 https://openrouter.ai/settings/keys。本地已有带随机后缀的 `openrouter-----…` 仍识别为同一渠道。 - **可选 Windows 任务栏未读 overlay**(#775):设置 → 通用 → 应用里开关,**默认关闭**,与程序坞/托盘未读角标互不绑定。开启后 Host 用 `set_overlay_icon` 画 1–9 / 10+(Tauri 的 `set_badge_count` 在 Windows 上是空操作)。从托盘还原时按上次 overlay 计数在 Explorer AddTab 后再贴一次。 - **快捷键帮助(Ctrl+/)**:面板可按名称 / id / 组合键筛选,按设置页同样的分组列出;补上缩放、换行、历史提示、打字聚焦;列表可滚动,不再裁掉末尾几项。 ### Changed - **Code-quality gates measure App shell + AppWorkbench**: `APP_*` budgets sum `src/App.tsx` and `src/app/AppWorkbench.tsx` (decreasing ceilings from current combined size). The 26-line shell no longer vacuously passes the old 6000-line bar. Fake `shellEpoch` state in `App.tsx` is gone. - **Workbench pane open/close/resize lives in `useWorkbenchLayout`**: sidebar/aside fit, overlay grow, and splitter drag persist inside the layout hook. AppWorkbench keeps verbs (`openAsidePane`, `beginSidebarResize`, …). - **Command palette search lives in `useSearchPalette`**: open/query/filters, journal scan, and keyboard nav persist inside the hook. AppWorkbench keeps action dispatch (`runPaletteAction`) and session open. - **Session export/share lives in `useSessionExportText` / `useSessionExportImage`**: markdown modal, file formats, traces, and PNG share-card preview/skin persist in those hooks. AppWorkbench keeps menu labels and modal JSX. - **Sandbox wizard and reliability center chrome live in `useSandboxReliability`**: offer/dismiss persistence and stall/error rings sit in the hook. Profile apply and the reliability view memo stay on the host. - **Session catalog lives in `useSessionCatalog`**: sidebar list refresh, `sessions://changed` fanout, and multi-select persist in the hook. AppWorkbench keeps open/new-chat and archived grouping. - **Sidebar session tree lives in `WorkbenchSessionTree`**: project/orphan paint and the multi-select bar. Open/new-chat stay on the host. - **Left workbench rail lives in `WorkbenchSidebar`**: chrome, primary nav, and user footer. The session tree is a child; open/new-chat stay on the host. - **Center workbench chrome lives in `WorkbenchMain`**: title row, toast, drop overlay, and top actions. Chat / kanban / automations stay as children. - **Resources pane lives in `WorkbenchResourcesAside`**: resize handle and SideWorkbench. Skill insert stays on the host. - **Search / export / sandbox / reliability overlays live in `WorkbenchDomainOverlays`**: those domain hooks already own state; AppWorkbench keeps session-open and sandbox profile apply. - **Thousand-line file budget is 69**: domain CSS parts, session/contextUsage tests, stall-history module, and Remote IM channel catalog are split so `files_ge_1000` sits under 70. - **Desktop pet on the right is a horizontal mirror**: Bottom-left keeps the authored ¾-right face. On the right half of the **screen work area** the mark is `scaleX(-1)` so the eyes look toward centre. Position comes from the overlay window (not `window.screenX`, which is 0 in the pet webview). The flip follows while dragging. - **macOS workbench sidebar uses the same frost as Settings**: Left rail (sessions + Settings nav) applies `--sidebar-blur` backdrop-filter instead of relying on native vibrancy alone. Settings is available before first navigation and swaps atomically with the workbench; the account portal closes in the same commit. Settings nav width follows the workbench rail. The glass meets the chat column with no opaque black seam. Returning keeps the workbench painted instead of hiding Settings for 320ms and leaving only the wallpaper in WKWebView. - **macOS sidebar right edge no longer flashes while dragging**: The seam is an inset hairline on the solid chat column, not a 1px layout border on Sidebar vibrancy. Window drag and split resize no longer alias that pixel light/dark. - **Chat transcript scroll no longer thrashes layout on mounted rows**: Virtual rows share a single `ResizeObserver` and measure via `borderBoxSize` instead of synchronous `getBoundingClientRect()` on mount; code block line-wrap/number preferences use in-memory caches to avoid blocking `localStorage` reads; right-edge message node rail uses memoized node IDs and skips redundant tick scrolls. - **UI font and terminal font are local-font dropdowns**: Settings → Appearance lists installed families (searchable) instead of a free-text name. UI default is the app sans stack; terminal default is the built-in Nerd Font stack. Reset is unchanged. - **Debug dock icon is the white invert**: `pnpm dev` uses `src-tauri/icons/dev` (white plate, dark mark) so the running debug app is distinct from the installed black production icon. Release bundles are unchanged. - **Windows AUMID follows the bundled identifier**: `pnpm dev` (`com.grokapp.desktop.dev`) is no longer grouped with official Grok on the taskbar / WinRT toasts. Release stays `com.grokapp.desktop`. Sessions still share App data unless `GROK_APP_HOME` is set. - **Resource markdown preview windows long files**: Side-pane `.md` keeps short files as one tree. Files at 200+ lines split on headings (and length caps) and only mount visible sections, instead of ReactMarkdown for the whole buffer. - **In-chat find stays off the workbench shell**: Ctrl+F match scanning and stream ticks live in the find bar / transcript island. Opening or closing find still toggles the shell; typing and token growth do not. - **Files tree windows long listings**: Side-pane / resource trees keep short folders as a full list. At 32+ visible rows, only the viewport is mounted (28px rows), instead of recursively mapping every expanded entry. - **L/R splitter drag no longer re-renders the workbench every move**: In-flow sidebar / aside width is written on the pane element while the pointer is down. Layout prefs commit on pointer-up. Dragging the left rail past the open min still collapses live. - **Bottom terminal toggle snaps height**: Ctrl+` jumps between 0 and the last panel height. The chat column is not interpolated for 320ms, so a long transcript does not reflow on every open/close. Drag-resize and persist-mounted PTY are unchanged. - **Chat code line numbers are one text node**: Fences with line numbers on keep a single gutter (`1\n2\n…`) instead of one React node per source line, so a 5000-line streamed/pasted block no longer mounts thousands of spans. - **Wide windows toggle side panes instantly; narrow windows overlay them**: Ctrl+B / Ctrl+Alt+B no longer interpolate flex width against the chat column. When sidebar + chat + aside fit, the split snaps with no animation. When they would crush chat, the pane overlays with a transform and the OS window does not grow. - **Resource code preview windows long files**: Side-pane / Changes `CodePreview` keeps short files as a full list. Files at 200+ lines (including 5000-line sources) only mount the visible rows and highlight those lines, instead of highlight.js + one DOM node per line for the whole file. - **Permission countdown, git dirty chip, and Tasks liveMap stay off the workbench shell**: Auto-deny seconds tick inside the permission bar. Git chip setState runs only when the count/label change. The Tasks panel subscribes to liveMap itself. ConversationThreadLive is memoized with stable callbacks. - **Pet overlay does not parse the workbench**: `#/pet` `import()`s `PetApp`; the main window `import()`s `App`. - **Clippy is deny-warnings on all CI legs (#829)**: `cargo clippy --all-targets -- -D warnings` now gates Linux / macOS / Windows. Platform-cfg dead code, mechanical style, and skin-share follow-up lints restore a green gate; no product behavior change. - **Clippy is silent on macOS host builds again (#785)**: Windows-only overlay/WSL/shim items use the existing `cfg_attr(not(windows), allow(dead_code))` idiom so cross-platform tests stay; mechanical style lints and Tauri `too_many_arguments` allows restore zero `cargo clippy --all-targets` warnings without behavior change. - **Locale catalogs load on demand**: English stays in the main bundle. The other 14 languages `import()` when selected; UI falls back to English until that chunk arrives. - **Heavy surfaces leave first paint**: Bottom terminal (xterm) mounts after first open; project-rules TipTap and the image lightbox load on demand. - **Live tool title rows keep activity VirtualList**: Only streaming thought bodies (variable height) drop windowing. Running 36px tool titles no longer dump the whole step list into the DOM. - **Weaving tools no longer clones every chat row**: History message object identity is kept so memoized transcript rows survive stream ticks. Row memo no longer busts on a new `wovenMessages` array. - **Completed tool journal writes leave the ACP pump**: `load_messages` / `save_messages` for finished tools run on `spawn_blocking` so disk IO does not stall later stream tokens. - **PTY output is coalesced**: `terminal://data` flushes every 16ms or 4KiB instead of one IPC per 8KiB OS read. - **Pet cursor watch idles when hidden**: Overlay pointer polling stays ~64ms while visible or dragging, and sleeps 500ms when the pet is hidden or disabled. - **Session journals write compact JSON**: `messages.json` mid-stream flushes rewrite the whole file; pretty-print indent was extra disk/CPU on long chats. Existing pretty files still load. - **Stream-perf actually drops wallpaper GPU cost**: `html[data-stream-perf="1"]` now turns off wallpaper sidebar/settings blur and pauses wallpaper video for the live turn (the flag already existed; CSS/JS did not honor it). - **Streaming markdown keeps a stable ReactMarkdown component map**: `remarkPlugins` and leaf tags are module-level; path/code/img handlers memoize so a token tick does not remount the tree. - **Streamdown CSS no longer loads at boot**: Chat uses `MarkdownChat`, not Streamdown. Styles move onto the unused `MessageResponse` module so a later import still looks right. - **Vendor JS split for markdown / TipTap / xterm**: Vite emits separate chunks so those stacks can cache independently of the app shell (and drop off first paint once their call sites are lazy). - **README refresh for the current workbench**: Public README (en / zh / ru) now leads with Highlights + grouped capabilities — 15 locales, desktop pet, Remote IM + phone mirror, local session API, Imagine / ChatCut, Kanban / Project Spaces, Grok 4.6 Extra High, custom-provider presets — instead of the early session-and-preview feature table. Install, Gatekeeper, and Linux troubleshooting stay. - **DeepSeek preset adds V4 Flash Vision Exp**: The add-provider catalog now includes `deepseek-v4-flash-vision-exp` alongside Flash and Pro. Existing saved DeepSeek channels are unchanged until re-added or edited. - **Official site on GitHub About and README**: Repo homepage, `package.json` `homepage`, and public READMEs now point to [https://grok-app.com](https://grok-app.com) (no trailing slash). **中文 · 变更** - **代码质量闸门改为度量 App shell + AppWorkbench**:`APP_*` 预算合计 `src/App.tsx` 与 `src/app/AppWorkbench.tsx`(从当前合计规模起递减天花板)。26 行 shell 不再让旧的 6000 行门槛空过。`App.tsx` 里的假 `shellEpoch` state 已删。 - **工作台左右栏开关/拖拽收进 `useWorkbenchLayout`**:开合、窗口适配、分割条拖拽在 layout hook 内持久化。AppWorkbench 只留动词方法。 - **命令面板搜索收进 `useSearchPalette`**:开合/查询/筛选、journal 扫描、键盘导航在 hook 内持久化。AppWorkbench 只留动作分发(`runPaletteAction`)和打开会话。 - **会话导出/分享卡收进 `useSessionExportText` / `useSessionExportImage`**:Markdown 弹层、文件格式、trace、PNG 分享卡预览/皮肤在 hook 内持久化。AppWorkbench 只留菜单文案和弹层 JSX。 - **沙箱向导和可靠性中心收进 `useSandboxReliability`**:向导出现/不再提示、stall/error 环在 hook 内。档位套用和 reliability view 计算仍在宿主。 - **会话目录收进 `useSessionCatalog`**:侧栏列表刷新、`sessions://changed` 同步、多选在 hook 内。AppWorkbench 只留打开/新建会话和归档分组。 - **侧栏会话树收进 `WorkbenchSessionTree`**:项目/无归属会话绘制和多选条。打开/新建会话仍在宿主。 - **左栏收进 `WorkbenchSidebar`**:chrome、主导航、用户菜单。会话树是子节点;打开/新建会话仍在宿主。 - **中栏 chrome 收进 `WorkbenchMain`**:标题、toast、拖放层、顶栏动作。对话 / 看板 / 自动化仍是子节点。 - **右栏收进 `WorkbenchResourcesAside`**:拖拽条和 SideWorkbench。插入 skill 仍在宿主。 - **搜索/导出/沙箱/可靠性弹层收进 `WorkbenchDomainOverlays`**:域 hook 已自持状态;宿主只留打开会话和套用沙箱档。 - **千行文件预算改为 69**:CSS part、session/contextUsage 测试、stall history、Remote IM 渠道目录拆开,`files_ge_1000` 降到 70 以下。 - **桌面宠物在屏幕右半边水平镜像**:左侧仍是原来的 ¾ 右视脸。到屏幕工作区右半边时整只 `scaleX(-1)`。位置用宠物窗口坐标(不用 `window.screenX`,浮层 WebView 里经常是 0)。拖动过程中跟着翻。 - **macOS 主页面侧栏与设置导航同一套毛玻璃**:会话列表和设置左栏都用 `--sidebar-blur` 的 backdrop-filter,不再只靠系统 vibrancy。设置页在首次导航前就已可用,并与工作台原子切换;账户菜单浮层在同一次提交中收起。设置左栏宽度跟工作台侧栏走,玻璃接到聊天列不再夹实色黑边。返回时工作台始终保持已绘制,不再先隐藏设置层并等待 320ms、让 WKWebView 只剩壁纸。 - **macOS 侧栏右缘拖动不再明暗闪烁**:分割线画在实色聊天列上,不再用 Sidebar 毛玻璃上的 1px layout 边框。拖窗口和拖分割条时那一像素不会再在亮/暗之间跳。 - **长对话滚动消除挂载重排与同步存储阻塞**:虚拟列表改用单个共享 `ResizeObserver` 并通过 `borderBoxSize` 获取高度,消除新行挂载时的 `getBoundingClientRect()` 强制同步重排(Layout Thrashing);代码块换行与行号偏好使用内存缓存,避免挂载时同步读取 `localStorage` 阻塞主线程;右侧消息节点轴缓存节点 ID 集合并在可视范围内跳过冗余滚动。 - **界面字体和终端字体改为本机字体下拉**:设置 → 外观列出本机已安装字体族(可搜索),不再手填名称。界面默认是应用无衬线栈;终端默认是内置 Nerd Font。重置不变。 - **开发版 Dock 图标改白底反色**:`pnpm dev` 使用 `src-tauri/icons/dev`(白底深色标),和已安装的黑底正式版区分。发布包图标不变。 - **Windows AUMID 跟随 bundled identifier**:`pnpm dev`(`com.grokapp.desktop.dev`)不再和正式版抢任务栏分组 / WinRT toast。发布包仍是 `com.grokapp.desktop`。会话/设置仍共用,除非设置 `GROK_APP_HOME`。 - **资源栏 Markdown 对长文件做窗口化**:侧栏 `.md` 短文件仍整树渲染。200 行以上按标题(及长度上限)切块,只挂可见节,不再对整份 buffer 跑 ReactMarkdown。 - **对话内查找不再打穿工作台**:Ctrl+F 的匹配和流式跳动留在找条 / 对话岛。开关查找仍会切壳;打字和 token 增长不会。 - **文件树对长列表做窗口化**:侧栏 / 资源树短目录仍整表渲染。可见行达到 32 以上只挂视口(28px 行高),不再递归把每个展开节点打进 DOM。 - **拖左右分割条不再每帧重绘工作台**:按住时只改侧栏/右栏元素宽度;松手才写入 layout。左栏拖过最小宽度仍即时收起。 - **底栏终端开关改为瞬时高度**:Ctrl+` 在 0 和上次高度之间直接跳。聊天列不再插值 320ms,长对话不会每次开关都重排。拖高度和常驻 PTY 不变。 - **聊天代码行号改成一个文本节点**:开启行号时 gutter 是一份 `1\n2\n…`,不再一行一个 React 节点;流式/粘贴的 5000 行代码块不会再挂几千个 span。 - **宽窗瞬时切换侧栏,窄窗改为覆盖层**:Ctrl+B / Ctrl+Alt+B 不再用 flex 宽度去挤聊天列。侧栏 + 聊天 + 右栏能放下时无动画直接切分;会压到聊天时改为 overlay + transform,也不再拉大系统窗口。 - **资源栏代码预览对长文件做窗口化**:侧栏 / Changes 的 `CodePreview` 短文件仍整表渲染。200 行以上(含 5000 行源文件)只挂可见行并高亮这些行,不再对整文件跑 highlight.js、也不再一行一个 DOM 节点。 - **权限倒计时、git 脏文件芯片和 Tasks liveMap 不再打穿工作台**:自动拒绝秒数在权限条内部跳动。git 芯片只在条数/文案变化时 setState。Tasks 面板自己订阅 liveMap。ConversationThreadLive 带稳定回调并 memo。 - **宠物浮层不再解析工作台**:`#/pet` 动态加载 `PetApp`;主窗口动态加载 `App`。 - **CI 全平台 clippy 改为 deny warnings(#829)**:Linux / macOS / Windows 均以 `cargo clippy --all-targets -- -D warnings` 过门。平台条件死代码、机械风格和皮肤包后续 lint 清干净,无产品行为变化。 - **macOS 上 clippy 再次零警告(#785)**:Windows 专用 overlay/WSL/shim 用既有 `cfg_attr(not(windows), allow(dead_code))`,跨平台测试仍跑;机械风格与 Tauri `too_many_arguments` allow 恢复 `cargo clippy --all-targets` 零警告,无行为变化。 - **语言包按需加载**:主包只带英文。另外 14 种语言选中后再 `import()`;chunk 到达前界面先用英文。 - **重表面离开首屏**:底栏终端(xterm)第一次打开才挂载;项目规则 TipTap 和图片灯箱按需加载。 - **进行中的 tool 标题行仍走活动列表虚拟化**:只有流式 thought(变高)才关掉窗口化;36px 的 running tool 不再把整表打进 DOM。 - **织入 tool 不再克隆整份 transcript**:历史消息保持同一对象引用,流式时 memo 行能活下来;行比较也不再被新的 `wovenMessages` 数组打穿。 - **完成态 tool journal 不再堵 ACP 泵**:落盘改 `spawn_blocking`,磁盘 IO 不再挡住后续 token。 - **终端 PTY 输出合并发送**:`terminal://data` 每 16ms 或满 4KiB 再发,不再每次 OS read(8KiB)打一次 IPC。 - **桌宠隐藏时降低光标轮询**:可见或拖动时仍约 64ms;隐藏/关闭时睡 500ms。 - **会话 journal 改写紧凑 JSON**:流式落盘会重写整份 `messages.json`,pretty 缩进在长对话上白烧磁盘。旧的 pretty 文件仍能读。 - **流式性能模式真正减壁纸 GPU**:`html[data-stream-perf="1"]` 会关掉壁纸侧栏/设置毛玻璃,并暂停壁纸视频(旗标早就有,CSS/JS 之前没接上)。 - **流式 markdown 不再每跳一次 token 换一套 components**:`remarkPlugins` 和叶子标签提到模块级;路径/代码/图片处理器 memo,避免 ReactMarkdown 整树重挂。 - **启动不再加载 Streamdown CSS**:聊天走 `MarkdownChat`,不走 Streamdown。样式挪到未接入的 `MessageResponse`,以后真用到时才会带上。 - **markdown / TipTap / xterm 拆成独立 JS chunk**:Vite 单独打包这三坨,壳改动不再带着重库一起失效;后续 lazy 后它们可以离开首屏。 - **README 按当前工作台重装**:公开 README(英 / 中 / 俄)改为亮点 + 分组能力:十五种语言、桌面宠物、远程 IM + 手机镜像、本机会话接口、Imagine / ChatCut、看板 / 项目空间、Grok 4.6 极高、自定义提供商预设;不再沿用早期「会话 + 预览」功能表。安装、Gatekeeper、Linux 排障保留。 - **DeepSeek 预设增加 V4 Flash Vision Exp**:添加提供商目录现含 `deepseek-v4-flash-vision-exp`,与 Flash / Pro 并列。已保存的 DeepSeek 渠道不会自动改,直到重新添加或编辑。 - **仓库 About 与 README 挂上官网**:GitHub 仓库网站、`package.json` `homepage` 与各语言 README 现指向 [https://grok-app.com](https://grok-app.com)(无末尾斜杠)。 ### Fixed - **Desktop pet press no longer wakes the workbench**: Dragging or single-clicking the mark only moves it / plays an emote. Double-click opens the main window (or the focused session). The overlay no longer yields key to main on pointer-down, and on macOS it opts out of app activation so a pet press cannot raise a background or hidden workbench. - **macOS launch can type and use shortcuts without a first click**: After `show()`, the Host reasserts key/activation once the page has loaded, retries briefly if NSApp stayed inactive while the window claimed key, and points firstResponder at the WKWebView so ⌘, and other web shortcuts reach the DOM. - **Settings covers the window with wallpaper on (#846)**: Wallpaper chrome lift no longer forces `position: relative` on the settings overlay. Short tabs (Pet, Archived chats) were shrinking to content height, so wallpaper (and the desktop pet) showed in the leftover strip. - **Agent questionnaire no longer freezes the workbench (#844)**: Answering or dismissing `_x.ai/ask_user_question` used to wait on the Host IPC with every control disabled. The modal now closes first and restores only if a failed accept is still the live request. Portaled overlays also opt out of the window-drag region so macOS titlebar drag cannot swallow clicks. - **Windows titlebar drag-up no longer grows height (#786)**: Follow-up to #783/#784. Caption maximize stayed up, but dragging the titlebar still stretched the frame. Windows skips JS `start_dragging` (`data-tauri-drag-region="false"`) and keeps compositor caption drag. Host `set_min_size` no longer runs on every `Moved` (tao re-applies inner size and double-counts the shadow offset); it skips while maximized, while the pointer is down, and when the min is unchanged. - **Desktop pet stays the chosen body, celebrates once, and no longer stalls on Windows**: Typing and in-progress tools no longer morph the mark into the catalog `!` or orbit/comet ribbons — the rest shape stays, with an attentive/curious face. Colorful belts fire only when the last live turn becomes unread-ready, then a corner pastille. Overlay paint throttles after idle, pauses while hidden, and cursor look events stay on the pet window (no duplicate still-cursor wakeups) so a long-running Windows overlay no longer freezes until restart. - **Windows caption maximize stays maximized; titlebar drag moves the window (#783)**: Follow-up to #773/#774. The button defers `maximize()` until after mouse-up so Aero does not drag-to-restore (flash). The `body` visualViewport transform pin is gone — it broke `-webkit-app-region: drag`, so pulling the titlebar up north-resized (bottom never lifted). An 8px top no-drag strip keeps native HTTOP. - **Windows maximize button is a real maximize (#773)**: The caption square used a Linux work-area `setSize` fill when `isMaximized()` lagged ~40ms. That cancelled the OS maximize, left the glyph as a square, and after restore, dragging the top edge panned the WebView inside the frame. Windows now waits for the OS flag and never fakes geometry; the button switches to the restore glyph. - **In-app update waits for Install and restart (#777)**: Settings → About Check for updates only checks and downloads. Sidebar and Install and restart open an in-app confirm (version + restart) before install+relaunch. Cancel does nothing. Unsigned GitHub download is unchanged. - **Windows dark-taskbar tray is a white glyph, not a white square (#776)**: Follow-up to #747/#748, not a revert of the invisibility fix. Light taskbars keep the black rounded tile + white glyph. Dark taskbars drop the white fill and show a white Grok mark on transparency. The host still follows `SystemUsesLightTheme` (not the in-app theme) and does not restore black-on-transparent. - **Slow trackpad scroll-up can leave stick-to-bottom (#778)**: Pixel-mode wheels send 2–8px ticks, so a single 10px event never unpinned. Release once the viewport is 10px off the bottom, even across ticks, and do not snap the virtual list back after the user has left. - **Long chats no longer bounce up while images/PDF previews decode (#771)**: Per-row pinned snaps are gone. Media-sized height jumps coalesce to one follow instead of one per file. - **Win+Right snap is true half on short displays (#765)**: Comfort `minWidth` stays 900. The Host caps the OS min to half the current monitor work area (height too), so a 1440×900 work area snaps to 720 instead of sticking at 900 (~2/3). A larger display restores the 900 floor. - **Windows Alt+Tab can type without a click first (#768)**: Tauri `unstable` (side-browser multi-webview) builds the page as a child `WRY_WEBVIEW`, so Alt-Tab / taskbar only activates the outer HWND. The host now forwards `WM_SETFOCUS` / `WM_ACTIVATE` into that child so composer and shortcuts work immediately. **中文 · 修复** - **按下桌面宠物不再唤醒主窗口**:拖动或单击标记只移动 / 做表情;双击才打开主窗口(或聚焦当前会话)。浮层在按下时不再把键盘焦点交回主窗口;macOS 上宠物窗选择不激活应用,避免后台或已隐藏的工作台被带起来。 - **macOS 启动后不用先点一下就能打字和用快捷键**:`show()` 之后等页面加载完再确认一次键盘焦点/激活;若窗口已是 key 但 NSApp 仍 inactive,短重试几次;并把 firstResponder 指到 WKWebView,让 ⌘, 等网页快捷键进 DOM。 - **有壁纸时设置页铺满窗口(#846)**:壁纸层级提升不再给设置 overlay 强制 `position: relative`。内容短的页(宠物、归档对话)以前按内容高度收缩,壁纸和桌面宠物会从底下露出来。 - **Agent 提问弹窗不再卡住工作台(#844)**:回答或忽略 `_x.ai/ask_user_question` 以前会等 Host IPC,期间所有按钮都禁用。现在先关弹窗,只有失败的接受且仍是当前请求时才恢复。浮层也退出窗口拖动区,避免 macOS 标题栏拖动吞掉点击。 - **Windows 标题栏往上拖不再把窗口拉高(#786)**:#783/#784 的后续。最大化能站住,但拖标题栏仍会拉长窗口。Windows 关掉 JS `start_dragging`(`data-tauri-drag-region="false"`),保留 compositor 标题栏拖动。`set_min_size` 不再在每次 `Moved` 里重设客户区(tao 会把阴影边框加两次);最大化、按住鼠标、min 没变时都跳过。 - **桌面宠物以本体为主、只在全部完成时撒彩带,Windows 长跑不再卡死**:打字和工具进行中不再把标记变成感叹号或轨道/彗星彩带,始终显示所选形体(专注/好奇脸)。彩带只在最后一个进行中的回合变成未读完成时播一次,然后右上角亮未读小圆点。空闲后降低绘制频率、隐藏时暂停,光标看向事件只发给宠物窗且静止不再重复唤醒,避免 Windows 透明浮层用久了卡顿卡死、重启才恢复。 - **Windows 点最大化不再闪回,标题栏往上拖是移动窗口(#783)**:#773/#774 的后续。最大化推迟到鼠标松开之后,避免 Aero 当成拖拽立刻还原。去掉会破坏标题栏拖动的 `body` transform;顶边留 8px 非拖动带,标题栏中部往上拖会把整窗抬起来,不再把下沿无限拉高。 - **Windows 右上角最大化是系统最大化(#773)**:按钮在 `isMaximized()` 还没跟上时会走 Linux 的铺满工作区 `setSize`,把真正的最大化取消掉,图标也不变;还原后再从上沿往下拉,页面会在窗口里往下挪。Windows 现在等系统标志、不再假铺满,按钮换成还原图标。 - **应用内更新须确认「安装并重启」(#777)**:设置 → 关于「检查更新」只检查和下载。侧栏与「安装并重启」会先弹出应用内确认(版本 + 即将重启),取消不安装。未签名的 GitHub 下载路径不变。 - **Windows 深色任务栏托盘改为白标透明底,不再是白方块(#776)**:#747/#748 的后续,不是撤回可见性修复。浅色任务栏仍是黑底圆角块 + 白标;深色任务栏去掉白色填充,只用透明底上的白色 Grok 标。仍跟任务栏 `SystemUsesLightTheme`,不跟应用内主题;也不会退回深色栏上看不见的黑标。 - **触控板慢慢往上滚能离开贴底锁(#778)**:像素模式滚轮每次只有 2–8px,单次 10px 永远松不开。离开底部累计 10px 就放锁,虚拟列表不再把你弹回去。 - **长对话里图片/PDF 预览解码时不再往上弹(#771)**:不再在每一行高度变化时贴底;媒体尺寸的高度跳变合并成一次跟随。 - **Win+Right 在矮屏上能贴真正半屏(#765)**:舒适下限仍是 900。Host 把系统 min 限制在当前显示器工作区的一半(高度同样),1440×900 会贴 720 而不是卡在 900(约 2/3)。拖到更大屏后 900 下限会回来。 - **Windows Alt+Tab 后不用先点一下就能打字(#768)**:Tauri `unstable`(资源栏内嵌浏览器)把页面建成子窗口 `WRY_WEBVIEW`,Alt+Tab / 任务栏只激活外层 HWND。Host 现在把 `WM_SETFOCUS` / `WM_ACTIVATE` 转进该子窗口,输入框和快捷键立刻可用。 ## [0.2.24] - 2026-08-21 > **Highlight:** Full bloub pet with compact Look/Bubbles settings; fork from an assistant reply; Windows no longer freezes at end of turn; Explorer-file paste and local session API stall are fixed. > > **中文 · 亮点:** 宠物换完整 bloub 形变、设置拆成紧凑的外观/气泡;可从助手回复分叉;Windows 回合结束不再卡死;资源管理器文件可粘贴,本地 session API 不再一轮后卡死。 ### Added - **Fork from an assistant reply**: “Fork from here” sits on completed Grok bubbles (not user prompts). The new chat copies through that turn; the child agent is rewound to match (bootstrap fallback if rewind is unavailable). - **AI98PRO provider preset**: Add-provider gallery ships a one-click Grok relay — `https://ai98pro.xyz/v1` with Responses, models **`grok-4.6`** + **`grok-4.5`**, official effort `low`/`medium`/`high`/`xhigh` (default Extra high), vision on, and config id **`AI98PRO`** (stored slug `ai98pro`). Existing auto-suffixed local ids such as `ai98pro-----…` resolve the same channel. - **Settings closes with Ctrl+, / Esc (#752)**: Pressing the settings chord again on the Settings page (including in a field) returns to the workbench. Esc does the same, without stopping a background turn. Nested dialogs and Select menus still own Escape first. The account-menu Settings row, slash `/settings`, command-palette settings actions, and “Back to app” show the live chord. - **Ctrl+Q twice to quit (#743)**: First press toasts; second within 2s exits. Side-terminal Ctrl+Q (XON after Ctrl+S freeze) is not swallowed. macOS tray does not advertise `(Ctrl+Q)` — ⌘Q is still immediate quit; the catalog mac column is `⌃ Q`. - **Ctrl+Enter steers a live turn (Grok Build CLI chord) (#741)**: While the agent is mid-turn, Ctrl+Enter (Cmd+Enter on macOS too) injects the composer draft via Steer / `sessionInterject`. Empty composer + a queued follow-up steers the head. You no longer have to queue first and click **Steer**. Plain Enter still queues. - **Pet uses the full bloub morph catalogue**: the overlay now runs the measured SVG engine (idle, thinking, wink, notify, alert, hexagon, orbit, comet, …) instead of the old clip-path faces. Settings pick the 8 rest shapes plus 16 rest expressions. Typing in the composer plays the catalog alert morph (slanted !) and returns to the chosen rest shape after a short pause; unread ready chats show a vivid orange-red pastille (lime on already-hot bodies) rather than the video’s blue. **中文 · 新增** - **从助手回复分叉**:「从这里分叉」在已完成的 Grok 气泡上(不再挂用户气泡)。新会话复制到该回合结束;子 Agent 会 rewind 对齐截断历史(rewind 不可用则 journal bootstrap)。 - **AI98PRO 服务商预设**:添加提供商图库一键填入 `https://ai98pro.xyz/v1`(Responses)、**Grok 4.6 / 4.5**、官方思考档 `low`/`medium`/`high`/`xhigh`(默认极高)、开启视觉;配置 ID 为 **AI98PRO**(落盘 slug `ai98pro`)。本地已有带随机后缀的 `ai98pro-----…` 仍识别为同一渠道。 - **设置页再按 Ctrl+, / Esc 回到主窗(#752)**:设置页再按一次设置快捷键(输入框里也能关)走「返回应用」。Esc 同样离开设置,不误停后台生成;嵌套对话框和 Select 仍先处理 Esc。账号菜单 Settings、`/settings`、命令面板设置项、「返回应用」显示当前和弦。 - **Ctrl+Q 连按两次退出(#743)**:第一次提示,2 秒内再按才退出。侧栏终端的 Ctrl+Q(XON,Ctrl+S 冻结后靠它解冻)不吞。macOS 托盘不写 `(Ctrl+Q)`,⌘Q 仍立即退出;目录 mac 列是 `⌃ Q`。 - **Ctrl+Enter 引导当前回合(对标 Grok Build CLI)(#741)**:Agent 正在跑时,Ctrl+Enter(macOS 也认 Cmd+Enter)把输入框里的内容直接 Steer 进当前回合。输入框空、队列里有跟进时引导队首。不用先排队再点「引导」。普通 Enter 仍是排队。 - **宠物换成完整 bloub 形变目录**:浮层改用测过的 SVG 引擎(静止、思考、眨眼、通知、警示、六边形、轨道、彗星等),不再用旧的 clip-path 表情。设置可选 8 种休息形体和 16 种休息表情。输入框打字会走目录里的警示(斜感叹号),停打后回到所选休息形体;未读完成会话是显眼的橙红圆点(身体已经很热时改用柠黄),不再用视频里的蓝色。 ### Changed - **Pet settings use Look / Bubbles tabs**: Settings → Pet no longer stacks appearance and bubble chrome on one long page. Default tab is Look; Bubbles holds the chip toggle, progress bar, auto-hide, and bubble shape/background. `#/settings/pet` still opens Look. Look packs enable + size on one toolbar, with the live preview left of the shape / face / color / eye pickers. - **Workbench shell split (#757)**: Prefs/layout hooks, GlassModals, compact overlay, in-app dialog host, and command palette live under `workbench-modals/`. Transcript helpers move to `src/lib/session/*` with a stable barrel. Send / open-session / rewind stay in AppWorkbench. **中文 · 变更** - **宠物设置拆成「外观设置 / 气泡设置」两个 tab**:默认打开外观;气泡(提示框、进度条、自动关闭、形状/背景)单独一页。旧链 `#/settings/pet` 仍落到外观。外观 tab 把开关和尺寸收进顶栏一行,预览在左、形体/表情/颜色/眼睛在右,减少纵向高度。 - **工作台外壳拆分(#757)**:偏好/布局 hook、GlassModal、紧凑浮层、应用内对话框、命令面板进 `workbench-modals/`;会话 transcript 助手进 `src/lib/session/*`(barrel 保持 `@/lib/session`)。发送 / 打开会话 / rewind 仍在 AppWorkbench。 ### Fixed - **Windows Host builds again after Explorer-file paste (#763)**: `clipboard-win` 5.4’s `FileList` implements `Getter` for both `Vec` and `Vec`, so rustc could not infer `get_clipboard` (`E0282`). Name `Vec` explicitly. Follow-up to #756. - **Desktop pet remembers its last place after quit**: Drag origin is flushed on pointer-up, hide, and process exit. A stuck OS-drag flag can no longer persist 0,0 while hiding. Settings writes keep the live overlay instead of stale x/y. Reopen places the window so the mark (not just the frame’s top-left) stays put when overlay size changes. - **Long chats no longer flash on send and at turn settle (#760)**: This is not #714 / #703 (stick-lock no longer yanks a slight scroll-up, and send only sticks once). After send, the virtual list no longer fights two `itemCount`s; journal rewrite of the last user id no longer force-sticks. - **Windows paste of Explorer files (.dmp) no longer dies on NotReadableError (#755)**: Composer paste of an on-disk file (crash dumps, locked/large binaries) now reads the OS clipboard path list (`CF_HDROP`) and attaches `@path` like drag-drop. WebView `File.arrayBuffer()` is only used for in-memory blobs (screenshots). Unreadable blobs get a dedicated i18n hint instead of the Chromium English `NotReadableError`. - **Windows no longer freezes at end of a long turn (#754)**: A trailing `prompt_complete` after `session/prompt` RPC Ok used to re-arm the end-of-turn handler. The second pass emitted IPC while journal reconcile still held the store lock; the WebView WndProc waited on that lock inside `SendMessage` and the window stopped painting. Duplicate finish is now a no-op, and post-turn UI rehydrate reads App `messages.json` only (Host already merged agent history). - **Local session API no longer wedges after the first turn**: A hung ACP handshake used to keep `connect_lock` forever (90s timeout abandoned the waiter without aborting the task). Later `--session-send` / `POST /turns` then waited ~180s and the CLI lied with `app_not_running`. Connect now aborts and bounded-kills pending children; dispatch returns `retry_later` in 15s; health exposes `connectLockBusy`; CLI maps timeouts to `error`; queued external prompts persist on disk and the Host drains them without the main window. - **Japanese PR hub and Ukrainian agent command keep `{name}` (#751)**: `ja` `prHub.author` was `作成者` with no author; `uk` `preferredCurrent` shipped `--agent ` with nothing to paste. Catalog tests now fail if any locale drops or renames an `en` placeholder. - **Sidebar tree text columns line up (#745)**: Projects and Other labels share one left edge. Project names and the session titles under them share `--tree-text-inset`. The L1 chevron column is 20px (was 28). - **Windows tray icon stays visible on a dark taskbar (#747)**: The notification-area mark is no longer a black glyph on transparency. Light taskbars get a black tile / white glyph; dark taskbars get the inverse. The host follows `SystemUsesLightTheme` (not the in-app theme) and swaps live. - **Windows “follow system” theme now switches with Personalization (#749)**: Boot still locks WebView2 form chrome, but that froze `prefers-color-scheme`, so the main window stayed put when the OS flipped. The host watches `AppsUseLightTheme` and the UI reapplies `data-theme`. - **Phone mirror serves the packaged SPA when dist is missing (#734)**: Filesystem `dist` / `GROK_MIRROR_DIST` still win in dev; packaged builds fall back to embedded `frontendDist`. Token gates on `/t/{token}` and `/assets` are unchanged. - **macOS green zoom no longer deadlocks the UI (#735)**: After a resize/move debounce, window-state persist hops back to the main thread before `save_window_state`. The plugin mutex + macOS geometry getters could AB-deadlock when maximize fired a Resized storm. - **Queued follow-up reply no longer stays blank until you switch chats (#737)**: Turn-1 journal rehydrate (400/900ms) was copying the previous answer onto the queued `a-pending-*` bubble. Turn-2 tokens then looked like a replay and were dropped. Same-turn lift still runs once disk has the new user prompt; a stale Host `ready` no longer freezes that pending shell. - **User bubbles paint the hydrated draft, not a leftover `/goal` or `/skill` first line**: Optimistic send and reload already hydrates; the live bubble now uses the same text. - **Type-to-focus no longer doubles letters (#739)**: Printable keys only focus the composer. Chromium/WebView2 already types that key into the newly focused editor; a second `insertText` made `aa` from one `a` (#706). Space still inserts itself (`preventDefault` so the page does not scroll). - **Pet typing / settings / spin**: composer typing plays the catalog alert morph (slanted !) and returns to the chosen rest shape when keystrokes stop; Settings → Pet shape and rest-face clicks update the preview immediately; **Spin spin spin** restores the colorful orbit belts instead of collapsing to a point. - **Japanese UI is no longer two-thirds Simplified Chinese (#732)**: Settings / Doctor / extensions / session catalogs that still copied `zh` verbatim are Japanese. `session.placeholderTitle` is `新しいチャット` (matches the tray). A catalog test fails if a non-Chinese locale copies simplified-only Han from `zh`. - **Windows `pnpm test` no longer fails on a fresh clone (#730)**: `window-config.test.ts` now normalizes CRLF before asserting on Host source, so `core.autocrlf=true` checkouts stay green. - **German “turn” is *Vorgang*, not *Zug* (#728)**: 125 catalog sites no longer read as “train” / “chess move”. - **15-locale auto-title and test cascade (#726)**: CJK titles no longer panic when peeling 「」 / “”; every shipped locale’s placeholder name is recognised; engine-locale tests no longer poison `APP_HOME_ENV_LOCK` on a non-English desktop. - **Parallel `cargo test` is reliable again (#727)**: `plan_chrome` takes the shared app-home lock; a poisoned env lock no longer takes the rest of the suite with it. - **Dates and clocks follow Settings, not the WebView (#729)**: history / audit timestamps and the quota-reset clock use the chosen locale (tray included). - **Boot splash and “follow system” honour the chosen language (#731)**: splash copy covers all 15 catalogs; `` is no longer `en` for twelve of them; follow-system reads the Host OS tag instead of the WebView’s `navigator.language`. - **`cargo fmt --check` is green on main (#725)**. **中文 · 修复** - **Windows Host 在资源管理器粘贴修复后重新能编过(#763)**:`clipboard-win` 5.4 的 `FileList` 同时实现 `Vec` 和 `Vec`,`get_clipboard` 推不出类型(`E0282`)。显式标成 `Vec`。#756 的后续。 - **桌面宠物关闭再开会回到上次位置**:松手、隐藏、退出都会把坐标写盘。卡住的系统拖动标记不会在隐藏时把 0,0 存进去。改设置不再用过期的 x/y 覆盖现场。重新打开时按宠物(不是窗口左上角)对齐,浮层大小变了也不会把宠物挪走。 - **长对话发送/回合结束不再整页闪(#760)**:不是 #714 / #703(那是贴底后轻滑被拽回、发送双吸底)。发送后虚拟列表不再用两套条数抢窗口;日记改写最后一条 user id 时不再强制吸底。 - **Windows 粘贴资源管理器文件(.dmp)不再报 NotReadableError(#755)**:Explorer 复制的已有磁盘路径改为读系统剪贴板文件列表(`CF_HDROP`)并按 `@path` 附加,与拖放一致。截图等无路径内容仍走 `arrayBuffer`。读不了的 blob 用专用文案,不再把 Chromium 英文 `NotReadableError` 拼进横幅。 - **Windows 长回合结束不再卡死整窗(#754)**:`session/prompt` RPC 已经结束之后,迟到的 `prompt_complete` 会再次武装结束逻辑。第二次结束在 journal 对账还占着 store 锁时发 IPC,WebView 的 WndProc 在 `SendMessage` 里等这把锁,窗口不再重绘。重复结束现在是空操作;回合结束后的 UI 补刷只读 App `messages.json`(Host 已经合并过 agent 历史)。 - **本地 session API 干完一轮后不再卡死**:卡住的 ACP 握手会把 `connect_lock` 永久占住(90s 超时只放弃等待、不 abort 任务),之后的 `--session-send` / `POST /turns` 会挂到约 180s,CLI 还谎称 `app_not_running`。现在超时会 abort 并用有上界的 kill 清 pending 子进程;派活 15s 内回 `retry_later`;health 带 `connectLockBusy`;CLI 把超时映射成 `error`;外部 queued 落盘,由 Host drain,不依赖主窗口。 - **日语 PR hub 和乌克兰语 agent 命令不再丢掉 `{name}`(#751)**:`ja` 的 `prHub.author` 只有「作成者」没有人名;`uk` 的 `preferredCurrent` 复制出来是空的 `--agent `。目录测试会拦截任何语言丢掉或改名 en 占位符。 - **侧栏树文字列对齐(#745)**:Projects 与 Other 标题左缘对齐;项目名与其下会话标题共用 `--tree-text-inset`。一级箭头列从 28px 收到 20px。 - **Windows 托盘在深色任务栏上不再隐身(#747)**:通知区不再用透明底黑标。浅色任务栏黑底白标,深色任务栏白底黑标。跟随任务栏 `SystemUsesLightTheme`(不是应用内主题),切换后即时换标。 - **Windows「跟随系统」现在会跟个性化一起切(#749)**:启动锁 WebView2 表单颜色后,`prefers-color-scheme` 不再更新,系统换深浅色主窗不动。Host 改为监视 `AppsUseLightTheme`,前端重刷 `data-theme`。 - **手机镜像在没有磁盘 dist 时改走打包内嵌前端(#734)**:开发模式仍优先文件系统 / `GROK_MIRROR_DIST`;正式包用 embedded `frontendDist`。`/t/{token}` 与 `/assets` 的 token 门不变。 - **macOS 点绿色放大不再卡死(#735)**:resize/move debounce 到期后先 hop 回主线程再 `save_window_state`。插件 mutex 加上跨线程几何查询会在 maximize 的 Resized 风暴里 AB 死锁。 - **排队跟进跑完后,不用切会话才看到回复(#737)**:上一轮 journal 补刷会把旧正文盖到新的空 pending 气泡上,跟进 token 被当成 replay 丢掉。磁盘追上新 user 之后仍会做同轮抬升;过期的 Host `ready` 也不会把排队中的 pending 结算掉。 - **用户气泡按 hydrated 草稿画,不再露出 `/goal` / `/skill` 首行**。 - **打字聚焦输入框不再重复字母(#739)**:可打印键只负责聚焦。Chromium/WebView2 会把该键打进刚聚焦的输入框;再 `insertText` 一次就会变成按 `a` 出 `aa`(#706)。空格仍自己插入(必须 `preventDefault`,否则会滚页面)。 - **宠物打字 / 设置 / 转圈**:输入走目录里的警示(斜感叹号),停打后回到原形;设置里点形状和表情会马上反映到预览;「转转转」找回彩带轨道,不再缩成一个点。 - **日语界面不再有三分之二简体中文(#732)**:原先原样复制 `zh` 的设置 / Doctor / 扩展 / 会话词条改为日语。`session.placeholderTitle` 与托盘一致为 `新しいチャット`。CI 会拦截非中文目录复制简体专用汉字。 - **Windows 全新 clone 上 `pnpm test` 不再红(#730)**:断言 Host 源码前把 CRLF 归一成 LF。 - **德语 “turn” 改为 Vorgang,不再用 Zug(#728)**。 - **十五语言自动标题与测试连锁失败(#726)**:剥「」/“”不再 panic;占位标题覆盖全部语言;非英语桌面上的 engine locale 断言不再毒化锁。 - **并行 `cargo test` 重新稳定(#727)**。 - **日期和时间跟设置语言走,不再跟 WebView(#729)**。 - **启动页和「跟随系统」使用所选语言(#731)**。 - **`cargo fmt --check` 在 main 上重新通过(#725)**。 ## [0.2.23] - 2026-08-20 > **Highlight:** Fifteen UI locales; attach another chat as context; custom STT; think → tools timeline stays honest; sidebar drag no longer fires on a twitch. > > **中文 · 亮点:** 十五种界面语言;可附加另一段对话;自定义听写端点;思考/工具时间线恢复诚实;侧栏拖动不再一碰就触发。 ### Added - **Fifteen UI locales with complete catalogs (#708)**: Settings and OS language detection include German, Spanish, Filipino, French, Indonesian, Italian, Japanese, Korean, Brazilian Portuguese, Tamil, and Ukrainian (plus existing English, Russian, Simplified and Traditional Chinese). Every new catalog has the full English key set. Japanese is nearly fully translated; the others cover chrome plus expanded surfaces (remaining deep settings stay English, like Russian). Dates, compact counts, heatmap labels, and tray/menu copy follow the locale instead of forking on Chinese-vs-English. Russian `tray.*` keys are filled. Latin and Sanskrit are not shipped. - **Interrupted turns after an app restart**: If the host process dies mid-turn, reopening the chat journals `turn_cancelled|host_exit` instead of looking finished. Continue sends a new prompt (with the unfinished command when known). Unclean host exits and Windows last-crash notes go into the session diagnostic zip. - **Pet stage bubbles, boot color, and peek-hide**: Chips pop only when an agent posts a mid-turn reply (not the session title). Concurrent chats stack instead of overwriting. The overlay boots in the saved color. Settings add auto-hide seconds (default 15), an optional progress bar (off — spinner/check is enough), and bubble shape/background presets. Single-click opens the window; double-click hides it; a second click within 3s of opening also hides (quick peek). - **File preview refresh (#711)**: The files toolbar can re-read the open file from disk after the agent edits it. Unsaved drafts keep the button disabled so a refresh cannot wipe the editor. - **Type-to-focus composer (#704)**: With the chat in the foreground, typing while focus is not in an input focuses the composer and inserts the character. IME composition, sidebar j/k, terminals/editors, overlays, and Space-on-button are left alone. - **Double-click a sidebar chat to rename (#702)**: Project and Other-session rows edit the title in place. Enter / blur save when the name changed; Escape cancels. F2 on a focused row does the same. Right-click Rename still uses the existing prompt. Multi-select does not start rename. - **Pet eye color, white body, and celebrate spin**: Settings → Pet can pick eyes independently of the body (body palette + Auto). White stays pale in both themes. The mark spins when a focused task finishes, or from the pet menu. - **Pet task bubbles can be turned off (#696)**: Settings → Pet and the pet context menu can hide the session chips above the mark. The overlay shrinks when they are off. - **Attach another chat as context**: `/attach-chat`, composer `+`, or right-click **Attach to current chat** picks a local conversation; drag a sidebar chat onto the composer to attach it. Chips sit on the composer; the journal stores `[[chat:id]]` tokens; the host prefixes a compact transcript for the agent only (max 3; source chat unchanged). Row-body drag onto a project still moves the chat. - **Custom OpenAI-compatible STT endpoint for composer dictation (#700)**: Settings → Voice can pick a custom `/audio/transcriptions` endpoint (Groq / OpenAI / Mistral / local server) with per-provider API keys stored in the OS keychain; official xAI dictation and Live Voice stay unchanged. Chinese dictation gets simplified / traditional script steering, and the 跟随系统 language hint now follows the resolved UI locale. **中文 · 新增** - **十五种界面语言,词条补全(#708)**:设置和系统语言可识别德、西、菲、法、印尼、意、日、韩、巴西葡、泰米尔、乌克兰(加上原有的英、俄、简中、繁中)。新语言都有完整 key 集。日语接近全译;其余覆盖主界面并扩展了设置(深层仍可回落英文,和俄语一样)。日期、数字、热力图、托盘/菜单跟界面语言走,不再按「中文或英语」二分。补上俄语 `tray.*`。不收录拉丁语和梵语。 - **应用重启后的中断回合**:宿主进程中途死掉再打开会话,会记 `turn_cancelled|host_exit`,不再看起来像做完了。芯片上的「继续」发新 prompt(有未跑完的命令会带上)。非干净退出和 Windows 崩溃摘要会进会话诊断包。 - **宠物阶段性气泡、启动色、点一下就藏**:气泡只在 Agent 写出阶段性回复时弹出(不再只显示会话标题);不同会话往上叠加、互不覆盖。启动即用已保存的自定义颜色。设置里可调自动关闭秒数(默认 15)、可选进度条(默认关,左边旋转/打钩即可),以及气泡形状和背景。单击打开窗口,双击隐藏;打开后 3 秒内再点一次也会藏(看一眼就收)。 - **文件预览可刷新(#711)**:文件工具栏能从磁盘重新读取当前打开的文件,agent 改完不必关 tab。有未保存草稿时按钮禁用,避免冲掉编辑。 - **打字自动聚焦输入框(#704)**:对话在前台、光标不在输入框时,敲键盘会聚焦 composer 并写入该字符。中文输入法、侧栏 j/k、终端/编辑器、弹层、按钮上的空格不受影响。 - **双击侧栏对话可重命名(#702)**:项目里和其他会话的行内直接改标题。Enter / 失焦在标题有改动时保存,Esc 取消。聚焦行按 F2 同样进入。右键「重命名」仍走原来的弹窗。多选模式不会进入重命名。 - **宠物可改眼睛颜色、白色身体、完成转圈**:设置 → 宠物里眼睛和身体分开选(身体色板 + 自动)。白色在两种主题下都保持浅色。聚焦任务完成时(或右键菜单)会转圈。 - **桌宠提示框可关(#696)**:设置 → 宠物,以及宠物右键菜单,都能关掉任务气泡;关掉后浮层会收小。 - **把另一段对话当作上下文加入**:`/attach-chat`、输入框 `+`、或右键「加入目前对话」可加入本地对话;把侧栏会话拖到输入框也会附加。chip 挂在输入框;日记只存 `[[chat:id]]`;Host 只给 Agent 加一段压缩记录(最多 3 段;来源对话不改)。拖行身到项目仍是移动会话。 - **Composer 听写支持自定义 OpenAI 兼容 STT 端点(#700)**:设置 → Voice 可选用任意 `/audio/transcriptions` 端点(Groq / OpenAI / Mistral / 本地服务),API Key 按提供方独立存入系统钥匙串,明文不出 webview;官方 xAI 听写与 Live Voice 不变。中文听写支持简体 / 繁体引导,「跟随系统」语言提示跟随界面实际语言。 ### Changed - **Remaining UI locales filled**: German, Spanish, French, Korean, Brazilian Portuguese, Indonesian, Filipino, Ukrainian, Tamil, and Russian catalogs now cover essentially the full key set (product names and symbols stay English). Russian leftovers after that pass were filled again. Korean leftovers after the first pass were filled again. - **Italian catalog is now fully translated**: Remaining settings / Doctor / extensions copy that still fell back to English is Italian. **中文 · 变更** - **其余界面语言补全**:德、西、法、韩、巴西葡、印尼、菲、乌克兰、泰米尔、俄语目录覆盖完整 key 集(品牌名和符号仍可保持英文)。 - **意大利语目录补全**:原先回落英文的设置、Doctor、扩展文案改为意大利语。 ### Fixed - **Sidebar session drag needs a clearer move**: Opening a chat no longer turns into a drag from an 8px twitch, the first-click synthetic jump, or the pet overlay stealing key / remapping the cursor. The gesture waits for 16px after an 80ms hold. Showing the pet gives the workbench key back so the first click after launch still selects a chat. - **Shift+Enter no longer wipes composer text**: Newlines split the live line in place. The editor no longer rebuilds from a lagging React snapshot, which deleted what you had just typed. - **Chat timeline keeps think → tools → body cycles**: Mid-turn status no longer gets hoisted into the thinking fold, and the next “思考中” no longer starts while tools from the previous round are still running. Live interleave stays in stream order after the turn ends (v0.2.19 honesty; the 0.2.20/0.2.21 process-fold had mashed the whole turn). - **Thinking timer is per episode**: The first “思考中” no longer keeps counting through later tool rounds, and the next thinking row starts from zero instead of continuing the previous clock. Work-phase “工作中” uses this phase’s tool times, not the assistant bubble’s send time. - **Live work stays expanded**: The “工作中” rail stays open so you can see which tools are running. It auto-collapses when that burst finishes with no errors, and stays open if any tool failed. - **Live tools no longer look stuck on the first reads**: Journal completion now settles in-progress reads even after later tools arrive, and the work rail follows the currently running step so later bash/polls are not clipped off-screen. - **STREAM_STALL after send is this-turn only**: A new prompt no longer inherits the previous answer as “output paused”. The empty first-token wait is 90s (was 45s) so Grok 4.x high-effort thinking is less likely to look like a dead gateway. - **Relative chat images resolve from curl dest and journal tail**: Markdown basenames like `foo.png` no longer miss when the real file was written with `curl -o` (or similar) into an absolute path. Rehydrate after journal ready so first-paint does not lock an empty card. `/workspace/` is not matched inside `/Users/…/Documents/workspace`. - **Pet bubble body wraps 2–3 lines; session title stays readable on light chips**: Stage text is no longer a single ellipsis line. The session title under it uses contrast-safe muted color (paper/white no longer hides it). With the progress bar off, the chip does not keep an empty track gap. - **“No credentials on the agent” points to Providers, not only official Sign in (#705)**: The banner now explains that a terminal CC Switch / custom relay is unused until you click Use in Settings, and the primary action opens Custom providers. - **Chat no longer jitters when scrolling up from the bottom (#703)**: Stick-to-bottom only snaps rubber-band past max; a 10px trackpad nudge can leave the pin. Sending after reading history force-sticks once in layout (not a double rAF + busy-edge bump). - **New-chat Connecting no longer hangs when `connect_lock` is held (#709)**: The 90s wall clock now covers lock wait (sibling task, so a blocking ACP poll cannot starve the timer). A timed-out attempt is invalidated so it cannot start a handshake after the lock frees. Idle recycle kill / send / disconnect wait for the lock with a timeout. Connect enqueue + timeout also sync-append to `app.log` if the tracing worker is silent. The client drops `sessionConnect` after 100s so the pill cannot sit on Connecting forever. - **Finished turns no longer stay on 思考中 / 连接中**: After the last assistant body is painted, leftover streaming or a leaked connect claim kept Stop and blocked the next send. Client heal unlocks the composer (reply stays) when Host is idle, or after 90s if Host itself went stale. - **Late tool-turn answers paint without remount (#697 / #698)**: Stream text that arrives after a tool-only (or thinking-only) bubble can now fill that bubble in place. A ready→ready skip no longer hides the final answer. - **Permission bars and journal flush after live lock**: A remounted WebView can recover the full approval card instead of looking stuck thinking. The stream journal flushes after the live lock is released. - **User images no longer echo as broken assistant cards**: Pasted / attached user files are not re-attached onto the assistant turn. Outside-project paths 403 after restart no longer lock the card as a corrupt blob. - **Windows pet overlay no longer inherits File / Edit / Window / Help; toggle follows real window visibility; hit target shrinks after drag (#696)**: The overlay keeps a window-local empty menu and strips the native bar. Hide retries if the HWND stays painted; File → Close hides instead of destroying. Host clears drag when the left button is up, and measured hit radius is clamped to the mark size. - **Linux / KDE pet overlay can be clicked and dragged**: The always-on-top pet stays focusable on Linux so KWin delivers pointer events, hides the GTK Edit/Window/Help bar that `app.set_menu` reapplied on the transparent window, and moves with `movementX/Y` on Wayland (late `startDragging` has no button serial). - **Windows release build compiles the last-crash filter**: `windows` 0.61 moved `EXCEPTION_CONTINUE_SEARCH` into Debug and gates `SetUnhandledExceptionFilter` on `Win32_System_Kernel`. The Host now enables that feature so NSIS / portable packages can build. - Attach is drag-onto-composer or the row menu (no ⋮⋮ grip-drag). Host compact keeps the newest turns; chips-only missing/empty sources return typed errors; recycle bootstrap keeps a stub or re-expanded attach context. **中文 · 修复** - **侧栏会话拖动不再一碰就触发**:点开会话时 8px 的轻微移动、按下后第一次虚假位移、以及宠物窗口抢焦点/重映射指针,都不会立刻变成拖动。启动后第一次点击会话会选中,不会被宠物 `show()` 吃掉。 - **Shift+Enter 不再删掉输入框文字**:换行在当前行原地拆开,不再用滞后的 React 草稿整页重绘(那会把刚打的字清掉)。 - **对话时间线恢复「思考 → 工具 → 正文」循环**:过程旁白不再被折进思考折叠里;上一轮工具还没跑完时,也不会在下面先画出新的「思考中」。回合结束后仍保持流式顺序(回到 0.2.19;0.2.20/0.2.21 的过程折叠把整轮揉成一团)。 - **思考计时按轮次清零**:第一轮「思考中」不再把后面的工具时间算进去;下一轮思考从 0 开始,而不是接着上一轮的秒数。工作阶段的「工作中」只用本阶段工具时间,不用整条气泡的发送时刻。 - **进行中的工作不折叠**:「工作中」保持展开,能看到正在跑哪些工具;这一段跑完且没有报错再自动折叠,有报错则保持展开。 - **进行中的工具不再卡在第一条读取**:后面又来新工具时,前面已完成的读取会从「进行中」结算掉;工作列表会跟到当前正在跑的那一步,后面的命令/轮询不会被截在视口外。 - **发消息后的 STREAM_STALL 只看本轮**:新 prompt 不会因为上一轮已有正文而显示「输出暂时停住了」。尚未出首 token 的等待窗口改为 90 秒(原 45 秒),减少高思考模型被误判成网关挂死。 - **相对路径聊天图片能对上 curl 落盘和日记尾**:`foo.png` 这类 markdown 文件名不再漏掉 `curl -o` 写到绝对路径的文件。日记 ready 后再解析一次,避免首屏把卡片钉成空图。`/Users/…/Documents/workspace` 里的 `/workspace/` 不会被误当成工作区根。 - **宠物气泡正文可折 2–3 行;浅色底上也能看见会话标题**:阶段性回复不再只挤一行省略。下面的会话标题用对比色,纸张/白色背景不再把标题隐成空行。关掉进度条时不再留那条空白。 - **「Agent 侧没有可用凭据」不再只叫人官方登录(#705)**:文案说明终端 CC Switch / 中转要在设置里点「使用」才会进 App;主按钮打开自定义服务商。 - **贴底后再轻微上滑不再抖动(#703)**:贴底锁只回弹越过底部的橡皮筋;10px 触控板轻拨即可离开。先上滑再发送只会在 layout 里吸一次底,不会双 rAF + busy 再吸一次。 - **`connect_lock` 被占住时新对话不再一直 Connecting(#709)**:90 秒墙钟覆盖等锁;握手在旁路任务里跑,ACP 阻塞也挡不住超时。超时后作废这次 connect。recycle 杀进程、发送、断开等锁都有上限。tracing 日志挂了时 connect 关键行仍会写入 `app.log`。前端 100 秒丢掉卡住的 `sessionConnect`。 - **回合结束后不再一直「思考中 / 连接中」**:正文已经出来,UI 还停在停止键、发不了下一句。Host 已空闲(或卡住超过 90 秒)时自动解锁,回复保留。 - **工具回合的晚到正文不再要重挂才出现(#697 / #698)**:只有工具(或只有思考)的气泡,后到的流式文字会填进同一条。ready→ready 跳过状态时也不再把最终答案藏掉。 - **权限条和日记在解开 live lock 后会补上**:WebView 重挂后能恢复完整审批卡,不再看起来卡在思考。流式日记在释放锁之后再刷盘。 - **用户图片不再回显成损坏的助手图卡**:用户粘贴/附图不会再挂到助手回合上。项目外路径重启后 403 也不再把卡片钉成坏图。 - **Windows 宠物不再继承 File / Edit / Window / Help;开关跟真实窗口走;拖完热区会收回(#696)**:浮层用自己的空菜单并卸掉原生菜单栏。关掉后若仍显示会再 hide 一次;File → 关闭只会收起。松开鼠标后 Host 清掉拖拽状态,热区半径按标记尺寸封顶。 - **Linux / KDE 上可以点、可以拖桌面宠物**:Linux 上宠物窗保持可接收指针;去掉 GTK 应用菜单画在透明 overlay 上的 Edit/Window/Help;Wayland 用位移挪窗,不再等已经过期的 `startDragging` 抓手。 - **Windows 正式包能编过崩溃摘要钩子**:`windows` 0.61 把 `EXCEPTION_CONTINUE_SEARCH` 挪到 Debug,并把 `SetUnhandledExceptionFilter` 挂在 `Win32_System_Kernel` 上。Host 打开该 feature,NSIS / 绿色版才能编出来。 - 附加对话改为拖到输入框或用行菜单(无 ⋮⋮ 拖曳)。压缩时保留最新轮次;只发 chip 且来源缺失/空白会返回明确错误;Agent 重开后仍保留附加上下文或占位。 ## [0.2.22] - 2026-08-19 > **Highlight:** Move chats between projects; a persist-mounted terminal under the chat; Russian UI; pet overlay no longer steals the first click. > > **中文 · 亮点:** 会话可移到其他项目;对话栏底部常驻终端;俄语界面;宠物窗口不再抢走第一次点击。 ### Changed - **Pet settings nav icon has two short eyes**: The hex outline now includes two short vertical strokes so the sidebar item reads as the companion, not a generic polygon. - **Pet menu keeps a single settings item**: The overlay context menu no longer lists both Edit and Pet settings (they opened the same Settings → Pet page). **中文 · 变更** - **设置里的宠物图标加了两只短竖线眼睛**:不再只是空六边形。 - **宠物菜单只保留「宠物设置」**:右键里「编辑」和「宠物设置」进的是同一页,已去掉重复的「编辑」。 ### Added - **Move chats between projects (#616)**: Sidebar menu, multi-select, and drag-and-drop can place a chat (including Other sessions) under another folder. Confirm first — the agent reopens in the new cwd and does not reuse the old CLI session. Relative paths from the previous workspace may break. - **Chat-column bottom terminal and pane motion (#681)**: `⌘\`` toggles a persist-mounted terminal under the chat. Sidebar / aside / settings / account-menu / project-list click-toggles interpolate instead of hard-cutting. - **Russian UI locale (#689)**: Settings language list and system-language detection include `ru`. Catalog is English-backed with translated overrides; tray / app menu follow the same locale. **中文 · 新增** - **会话可移到其他项目(#616)**:侧栏菜单、多选和拖到项目上可以把对话(含「其他会话」)挂到另一个文件夹。会先确认;Agent 在新目录重开,不会把旧 CLI 会话 load 进新仓库。原先工作区的相对路径可能失效。 - **对话栏底部终端与分栏动画(#681)**:`⌘\`` 打开/收起聊天下方常驻终端。侧栏、右侧栏、设置、账号菜单、项目列表的点击开合改为插值,不再硬切。 - **俄语界面(#689)**:设置语言列表和跟随系统可切到 `ru`。词库以英文兜底、常用面有俄文;托盘和原生菜单同步。 ### Fixed - **Project list collapse no longer snaps and leaves a leftover scrollbar (#694)**: Closing a project (or the L1 Projects chevron) paints the locked height, then interpolates to 0. The overlay thumb stays hidden while height is moving. Overflow is restored before the active chat scrolls into view. Open folders retarget the px lock when a chat is dropped in, so new rows are not clipped and the next close still interpolates. - **Pet context menu stays near the click**: The menu opens at the right-click and only slides enough to stay on the visible work-area slice of the overlay (no jump to the mark or the window corner). - **Pet overlay no longer steals the workbench’s first click**: The always-on-top pet window is not focusable (`canBecomeKeyWindow = NO` / `WS_EX_NOACTIVATE`). Tao `show()` still calls `makeKeyAndOrderFront`; if the overlay becomes key while the main window is visible, key is returned immediately so composer / list clicks land on the first press. - **Official login no longer breaks a working custom relay**: After sign-in, Host kept calling ACP `authenticate(cached_token)` on custom-route processes. That RPC reads `~/.grok/auth.json`, Grok Build then sends OIDC to the relay (`HTTP 400 Incorrect API key` / network card), and logout “fixed” it immediately. Custom routes now skip `cached_token`; login / account switch bind agent-home via `prepare_route_auth_for_agent` (official syncs, custom clears). - **History image chips no longer decode the full original (#692, #693)**: User-message paste thumbs use the same Host thumbnail path as assistant cards (#675). First paint stays empty until the ≤480px JPEG is ready, a live loopback `src` is not blanked on remount, and the `` is no longer remounted on URL change. Long threads with screenshots no longer flash the window while a new reply streams. - **Live “思考中” timer no longer inherits another chat’s clock**: A leftover `turnStartedAt` (or a later correction) used to stick at 50+ minutes, then jump to the real duration after remount. The live timer now follows this turn’s clock and will not start before the assistant bubble’s `createdAt`. - **New-chat first send no longer false-heals as “message never reached the agent”**: Ghost-heal treated a leftover previous-session turn clock plus the `__draft__` → real-id handoff as “Host idle, send finished”. The toast fired, the composer was restored, and the agent still ran the prompt. New chat now clears the clock; draft sends start/migrate it; `sessionCreate` moves the send claim onto the real id immediately; heal also counts the draft claim as in-flight. - **Composer branch chip follows in-place checkout (#690)**: `git switch` in the same working tree no longer leaves the chip stale until the menu is opened. The dirty-status poll already had HEAD; it now patches the matching worktree row. - **Reasoning effort survives session respawn (#682)**: Changing effort on an existing chat was overwritten by `session/load` restoring the old CLI journal. A real change now clears `agent_session_id` (next connect uses `session/new`) and the next send waits for the preference write. Custom providers with an effort catalog get `supports_reasoning_effort` in App `agent-home` only. - **CLI import no longer paints `` as a user bubble (#687)**: Reminder-only / `synthetic_reason: project_instructions` envelopes in `chat_history.jsonl` are skipped. A wrapped `` is kept. - **Voice/STT no longer re-copies official OIDC into a custom route's agent-home**: `voice_auth` blind-called `sync_cli_auth_to_agent_home` on every token read, undoing the custom-route auth strip until the next spawn (a live relay process could lazily load the OIDC). It now goes through route-aware `prepare_route_auth_for_agent`; voice still falls back to `~/.grok/auth.json` for official xAI endpoints. - **Rewind-unsupported error now takes the clean path in drop-last**: The `initialize`-not-advertised early return is phrased as `method not supported`, so journal drop-last skips the pointless last-turn fallback retry and its misleading warn log. - **Long tool-heavy chats no longer flicker stacked replies**: Collapsed thinking is no longer counted in the first-paint row estimate, and a virtual-list start that lands on a 0-height tool plateau walks back to the previous real message. A 1px height change no longer remounts a different pair of assistant bubbles (Windows WebView leftover paint looked like the transcript flashing). - **A refused chat move no longer kills the live agent (#616 follow-up)**: Host validated the target folder only after dropping the session's ACP process, so an untrusted / missing target (or a same-project no-op from a stale caller) still cost the chat its `agent_session_id` and forced `session/new`. `session_move_to_project` now prechecks the target and cwd change first; the agent is dropped only when the move will actually happen. - **Composer skill chips no longer show a tiny hammer emoji**: Inline skill / tool tags in the input (and user bubbles) use 14px Tabler SVGs so the glyph matches the 12px label. Imagine uses the wand; other skills keep the tool icon. **中文 · 修复** - **收起项目列表不再硬切、也不再留下滚动条(#694)**:关掉项目(或一级「项目」)会先锁住当前高度再插值到 0。动画期间隐藏 overlay 滑块;高度恢复后再把当前会话滚进视野。往已展开的文件夹里拖入会话时会改写锁定高度,新行不会被裁切,下次收起仍能插值。 - **宠物右键菜单贴着点击位置**:菜单在右键处打开,只在会出屏时平移,不再跳到标记另一侧或窗口左上角。 - **宠物窗口不再抢走主窗口的第一次点击**:置顶宠物窗不可成为 key(macOS `canBecomeKeyWindow = NO` / Windows `WS_EX_NOACTIVATE`)。Tao 的 `show()` 仍会 `makeKeyAndOrderFront`;若主窗口已可见,立刻把焦点还回去,输入框和列表第一次点击就能生效。 - **登录官方号不再把正在用的中转打挂**:签入后自定义路由仍会 `authenticate(cached_token)`,CLI 读 `~/.grok/auth.json` 后把 OIDC 打到中转(HTTP 400 Incorrect API key / 网络异常),退出登录立刻又好。现在自定义路由不再做 `cached_token`;登录/切号按当前路由 `prepare_route_auth`(官方同步,自定义清掉)。 - **历史里的用户附图不再解原图(#692, #693)**:用户气泡里的粘贴缩略图走和助手图卡同一套 Host 缩略图(#675)。缓存未命中时先占位,已有 loopback 地址不再清成空,换地址时也不再拆掉 `` 重挂。带截图的长对话在往外写时窗口不再整屏闪。 - **「思考中」不再沿用上一会话的计时**:上一轮留下的 `turnStartedAt` 会把时长钉在 50 多分钟,滑一下或重挂载后又变成真正的几分钟。现在跟本轮时钟走,也不会早于这条助手气泡的 `createdAt`。 - **新建会话首条消息不再误报「消息没有真正发给 Agent」**:上一条会话留下的计时,加上草稿 `__draft__` 切到真实 session id 的空档,会被当成 Host 空闲、发送已结束。于是 toast 弹出、输入框还原,Agent 其实已经在跑。现在新建会话会清计时,草稿发送会建/迁移计时,`sessionCreate` 当下就把发送认领迁到新 id,heal 也会把草稿认领当成仍在发送。 - **输入框上的分支 chip 会跟着同目录切分支更新(#690)**:同一工作树里 `git switch` 后不再要点开菜单才刷新。脏状态轮询本来就有 HEAD,现在会补到对应 worktree 行。 - **切换推理力度后不再被旧 CLI 会话盖回去(#682)**:已有对话改 effort 会被 `session/load` 恢复成旧值。真正改过时清掉 `agent_session_id`(下次 `session/new`),下一条发送会等偏好写完。带 effort 目录的自定义渠道只在 App `agent-home` 写 `supports_reasoning_effort`。 - **导入 CLI 会话不再把 `` 画成用户气泡(#687)**:`chat_history.jsonl` 里只有 reminder / `project_instructions` 的信封会丢掉;带 `` 的仍保留正文。 - **用语音不再把官方 OIDC 复制回自定义路由的 agent-home**:`voice_auth` 每次取 token 都盲同步 `auth.json`,把自定义路由刚清掉的凭据又写回去(存活的中转进程可能懒加载到)。现在改走按路由处理的 `prepare_route_auth_for_agent`;语音本身仍会回退读 `~/.grok/auth.json`。 - **Agent 不支持 rewind 时撤回消息走干净路径**:`initialize` 未公布 rewind 的早退错误改为 `method not supported` 措辞,撤回上一条不再多发一次注定失败的兜底调用、也不再打误导性的 warn 日志。 - **工具很多的长对话不再把两轮回复叠在一起闪**:折叠的思考不再计入行高预估;虚拟列表起点落在一串 0 高工具行上时,回退到前一条真实消息。高度差 1px 不会再换一套助手气泡(Windows 上旧层清不掉,看起来像正文狂闪)。 - **移动会话被拒绝时不再误杀正在跑的 Agent(#616 跟进)**:Host 原来先杀掉会话的 ACP 进程、后校验目标文件夹,未信任/丢失的目标(或过期调用方发来的同项目 no-op)也会让会话丢掉 `agent_session_id`、被迫 `session/new`。现在 `session_move_to_project` 先预检目标和 cwd 是否变化,确认真的要移动才断开 Agent。 - **输入框里的 skill 标签图标不再过小**:工具 / skills / imagine 等标签改用 14px SVG,和 12px 文字齐平。imagine 用魔杖,其余仍用扳手。 ## [0.2.21] - 2026-08-18 > **Highlight:** Create Image / Create Video from the composer + menu; Agent Kanban and Project Spaces; chat no longer freezes on the first generated image or stays stuck Connecting. > > **中文 · 亮点:** 输入框 + 菜单可创作图像/视频;智能体看板与项目空间;出图首屏不再卡死,「连接中」不再只能重启。 ### Added - **Create Image / Create Video in the composer + menu (#677)**: When the bundled Imagine skill is available, Add lists **Create Image** (localized Imagine) and **Create Video** (Imagine + a short video starter prompt). Skill id stays `imagine`. - **Side workbench CodeMirror editor (#661 follow-up)**: Files edit mode uses CodeMirror 6 (Atom One palette + line numbers, Tab as two spaces, ⌘/Ctrl+S). Markdown still uses TipTap. Preview mode is unchanged. - **Side-browser Design Mode (#636)**: The Browser tab can inspect localhost / same-origin preview elements and send the selection, optional snapshot, and style note into the composer. - **Discover Claude / Cursor skills toggle**: Settings → Extensions → Skills can turn external compat discovery off. Independent session mode also writes `[compat.claude] skills` / `[compat.cursor] skills` in agent-home `config.toml`. Shared mode only hides them in the App (does not rewrite `~/.grok`). - **Session interrupt recovery**: Shutdown cancels the ACP TCP reader with the process, stamped events require an exact session owner, and per-session send claims/epochs survive reconnect so a kill cannot leave a ghost stream or a wedged queue. - **Agent Kanban**: Sidebar / palette / `#/kanban` shows live sessions in Needs you / Working / Done. A finished turn stays in Done across pane remounts (not a personal to-do list). Opening a card does not hide it. - **Project Spaces**: Sidebar groups projects into named spaces (All / Default / custom). Membership survives restart; search from All does not force a space switch. Name errors stay inline in the prompt (red), not a toast. - **Transcript selection quotes**: Selecting text in a bubble shows a floating bar (copy, optional comment, add to chat). Quotes sit **beside** the draft as a compact “N notes / N 条注释” chip — they are not pasted into the input. They persist on project/session drafts and the send queue. The agent sees `Quoted excerpt` / `Comment` blocks; the journal stores `[[quote]]` / `[[note]]` fences so reload rebuilds the cards. Queue **Guide** serializes quotes (and re-queues them on failure). Send settlement compares quotes so a quote added during an in-flight send is not overwritten on failure. Switching sessions closes the selection bar. **中文 · 新增** - **输入框 + 菜单可创作图像 / 视频(#677)**:有 Imagine 技能时,「添加」里出现「创作图像」和「创作视频」。技能 id 仍是 `imagine`;创作视频会带上短片起始提示。 - **侧栏 CodeMirror 编辑器(#661 后续)**:Files 编辑模式改用 CodeMirror 6(Atom One 配色 + 行号,Tab 两个空格,⌘/Ctrl+S)。Markdown 仍用 TipTap。预览模式不变。 - **侧栏浏览器设计模式(#636)**:Browser 页可点选本机 / 同源预览元素,把选区、可选快照和样式备注送进输入框。 - **探测 Claude / Cursor 技能开关**:设置 → 扩展 → 技能可关闭外源兼容探测。独立会话模式会写入 agent-home `config.toml`;共享模式只在应用内隐藏,不改写 `~/.grok`。 - **会话中断恢复**:关掉 Agent 时一并取消 TCP 读;打戳事件必须对上会话主人;发送认领按会话隔离,重连后不会留下幽灵流或卡死的队列。 - **智能体看板**:侧栏 / 命令面板 / `#/kanban` 按「需要你 / 工作中 / 已完成」展示运行中的会话。回合结束后切走再回来仍留在已完成(不是个人待办)。打开卡片不会把它藏掉。 - **项目空间**:侧栏项目可分到命名空间(全部 / 默认 / 自定义)。成员关系重启后仍在;「全部」里搜索不会误切空间。重名等错误在对话框里用红字提示,不再用顶部 toast。 - **正文选中批注**:在气泡里选中文字后出现浮层(复制、可选评论、添加到对话)。注释作为紧凑的「N 条注释」贴在输入框旁,**不粘进正文**。会跟项目/会话草稿和发送队列一起保存。发给模型的是 `Quoted excerpt` / `Comment`;日记里写 `[[quote]]` / `[[note]]`,重载后还能还原成卡片。队列「引导」会带上注释(失败重新入队也保留)。发送结算会比较注释,发送过程中新加的注释在失败时不会被旧快照盖掉。切换会话会关掉选择浮层。 ### Changed - **Composer workspace chip on every desktop chat (#662)**: The project / default-workspace control above the input is no longer limited to a brand-new draft that already has a folder. Pick, add, or return to the default workspace from the existing `ComposerProjectMenu`. Chinese copy uses 默认工作区 (was 通用). Sidebar `+` stays. Phone still uses the tools sheet. **中文 · 变更** - **桌面输入框上方始终显示工作区(#662)**:不再只在「已选项目的全新空草稿」才出现。沿用现有 `ComposerProjectMenu` 选择、添加或回到默认工作区。中文不再用「通用」。侧栏 `+` 保留。手机仍走工具页。 ### Fixed - **Selection comment pop hierarchy**: The comment field uses the input well so it no longer blends into the panel; the excerpt stays plain truncated text. - **Stuck「连接中」until restart**: The status pill is per-chat (another session’s handshake no longer paints this one Connecting). Host connect has a 90s wall clock; `ProcessExited` during handshake fails the FSM; leftover Connecting is not treated as a healthy live process. `session/set_mode` runs after Ready. Click the pill or Reconnect to cancel and retry — that button stays enabled. - **Chat no longer freezes when a generated image first appears (#675, #676)**: The card first-paints a placeholder or cached thumb instead of the full Imagine PNG. Host cache hits read source width/height from a sidecar (or the thumb JPEG header) and do not decode the original again. - **Assistant body text no longer stacks on itself**: Conclusion markdown and work-fold tool stdout could occupy the same box when a parent flex column crushed their height (`overflow: visible` expand bodies then painted over the answer). Transcript rows, timeline children, and `.chat-md--answer` no longer shrink; expand-body `overflow: visible` is only used inside a capped/virtual scroller. - **Compact dialog overflow + help**: Long inline help on Compact context could exceed `.modal` max-height (`overflow: hidden`, no scroll body) and clip the Compact button. Descriptions move into a title `?` tip; the body scrolls and the footer stays pinned. Connect failure after confirm no longer fails silently. - **Pathless「文件」tab no longer stays beside an opened file**: Opening a file from the tree replaces the picker Files chip. Picking Files again focuses the open file instead of minting a second dead tab (which did nothing and could stall the pane). - **Slash palette `/rc` and `/review-` select `review-commit` (#644)**: Treat `-` as a word boundary so kebab initials match, rank name prefix above description, and keep description as fallback only when no name hits. Peer skills that mention `review-commit` in YAML no longer steal the default highlight. - **Working rail overlap and leftover ANSI (#667, #672)**: Long live **工作中** rows no longer paint tool bodies over the next line; leftover `[39m` / `[32m` SGR after a dropped ESC is stripped. Mapped lists no longer flex-shrink into a 360px box that crushes expanded rows. - **75Hz external-display chat scroll (#651)**: Virtual-list window updates pair `requestAnimationFrame` with an 8ms fallback so a missed vsync on a mixed 120Hz/75Hz Mac does not drop the scroll to a 37.5Hz stutter. - **Command-palette search scroll and keyboard (#657)**: ⌘K results sit in a real scrollport (wheel / trackpad work). Arrow keys move a highlight; Enter opens the row; ⌘/Ctrl 1–9 still jump to the numbered session. - **Included-usage exhaustion is no longer a generic provider error (#659)**: When Grok Build reports `subscription:free-usage-exhausted`, Host stops the 15-retry loop immediately and emits `QUOTA_EXCEEDED`. The chat card uses the CLI line “You hit your free usage limit.” (rolling 24-hour window + Account). A bare 429 / “rate limit, retry later” uses the CLI “Rate limited” / “Wait a minute” card, not the free-usage sentence. - **Desktop notification click restores the session (#654)**: Clicking a native toast now unminimizes / focuses the main window and opens the chat that fired it (permission, ask-user, or turn-done). Windows uses a WinRT `on_activated` toast instead of the fire-and-forget plugin path; packaged macOS waits for the UN default action. Missing `sessionId` still focuses the app. `tauri dev` osascript toasts (Script Editor) still cannot deep-link. - **Skills catalog matches CLI discovery (#653)**: Settings → Extensions → Skills no longer keeps listing Claude/Cursor compat skills after Grok Build has them turned off. `skills_list` now runs `grok inspect` with the session `GROK_HOME` and drops `~/.claude` / `~/.cursor` rows when `[compat.claude] skills` or `[compat.cursor] skills` is false (or the new App overlay is off). Slash / + pickers share the same list. - **Premature 工作了 + copy/retry while the turn is still running (#670)**: Host no longer emits stream `done` while the prompt or tools are still open. A later finished fragment folds into the live sibling without duplicating answer text. Copy/MD/retry stay hidden until Ready. - **Windows huge assistant replies / paste become a .txt card (#647)**: On Windows only, a single reply or clipboard paste ≥ 8000 characters is shown as a short preview plus a file card (or attached as `.txt`). macOS / Linux keep full markdown and normal paste. Find-in-chat still shows the full body. - **New chat no longer restores a leftover first prompt**: Each project keeps a new-session composer buffer. After send, that buffer was often left on disk (`#620` leftovers, or a mid-type snapshot that is not byte-identical to the sent text). Restore now drops buffers that match a recent send **exactly**, as a **prefix** of that send, or as a **short first-line fragment** (e.g. saved `好的` / `d` vs sent `好的` / `你看好了吗?`). Attachment-only unsent drafts still restore. A follow-up send on an existing thread does not wipe a new-task buffer that still has extra files. - **Shift+Enter first press starts a new line**: The composer stored `\n` but re-projected a trailing `
`, which WebKit treats as an empty-editor sentinel (first Shift+Enter looked like a no-op). Each line is now a `div`; a trailing empty line is marked `data-composer-nl="1"` so serialize keeps the newline and the caret stays on that line. ZWSP caret pads are not used for this path (they split IME 汉字). - **Windows taskbar icon no longer looks a size smaller (#650)**: `icon.ico` is generated from a fill-cropped raster so the mark fills the frame. macOS `icon-source.png` / `.icns` stay on the dock-grid master. - **Side workbench file tabs and per-project isolation (#661 slice)**: Inactive file chips show a filename (and a short parent path on collisions). Switching projects stashes that project's tabs. Opening Files shows the tree and adopts the placeholder chip instead of minting a second pathless tab. The CodeMirror editor from the same PR is **not** in this slice. **中文 · 修复** - **选区注释弹窗层次**:评论框用输入井,不再和面板糊成一块;摘录仍是普通截断文本。 - **一直卡在「连接中」、只能重启**:顶栏药丸按当前会话投影(别的会话在握手时,这个聊天不再显示连接中)。整段 connect 有 90 秒墙钟;握手期间进程退出会离开 Connecting;未完成的握手不再被当成健康活进程。`session/set_mode` 改到 Ready 之后。点击药丸或「重新连接」可取消并重试,按钮不再因连接中被禁用。 - **对话出图那一下不再卡死(#675、#676)**:卡片首屏改占位或缓存缩略图,不再先解完整原图。Host 缓存命中读 sidecar / JPEG 头拿宽高,不再为读尺寸再解一遍原图。 - **助手正文不再叠字**:结论 Markdown 和工作轨里的工具输出会被父级 flex 压扁到同一块区域(展开体 `overflow: visible` 再盖到答案上)。消息行、时间线子项和 `.chat-md--answer` 不再被压缩;只有带滚动条的工作列表才允许展开体溢出。 - **压缩弹窗过长、按钮被裁切**:原先说明全铺在弹窗里,超出 `.modal` 最大高度后底部「压缩」被裁掉(容器 `overflow: hidden`、没有可滚 body)。说明收到标题旁 `?`,正文可滚、底部按钮固定。确认后连不上 Agent 也不再静默失败。 - **空的「文件」tab 不再和已打开文件并排**:从树里打开文件会替换选择器里的「文件」占位。再点「文件」只会聚焦已打开的文件,不会再多出一个点了没反应、还会卡住侧栏的死标签。 - **斜杠菜单 `/rc`、`/review-` 会选中 `review-commit`(#644)**:把 `-` 当词界以匹配 kebab 首字母,名字前缀优先于描述,且只有名字全无命中时才用描述兜底。YAML 里互相点名 `review-commit` 的 skill 不再抢走默认高亮。 - **工作轨叠字和残留 ANSI(#667、#672)**:长「工作中」不再把工具正文盖到下一行;ESC 丢掉后残留的 `[39m` / `[32m` 会被剥掉。展开后的列表不再被压进 360px 盒子里叠字。 - **75Hz 外接屏聊天滑动(#651)**:虚拟列表窗口更新在 rAF 之外加 8ms 兜底,混用 120Hz/75Hz 时漏一帧不会掉成肉眼 37.5Hz。 - **命令面板搜索可滚动、可用键盘(#657)**:⌘K 结果有独立滚动区。方向键高亮,Enter 打开,⌘/Ctrl 1–9 仍跳到编号会话。 - **额度用尽不再显示成普通提供商报错(#659)**:官方返回 `subscription:free-usage-exhausted` 时,Host 立刻停转并记 `QUOTA_EXCEEDED`,气泡对齐 CLI 的 “You hit your free usage limit.”(滚动 24 小时窗口 + 账号)。普通 429 走 CLI 的 “Rate limited / 等一分钟再发”,不再和免费用量写成一句。 - **点击桌面通知回到对应会话(#654)**:点原生通知会还原/聚焦主窗口并打开发出该通知的会话。Windows 走带点击回调的 WinRT toast;已打包的 macOS 等 UN 默认点击。没有 `sessionId` 时仍只聚焦应用。`tauri dev` 的 osascript(脚本编辑器)通知仍无法回跳。 - **技能目录与 CLI 探测一致(#653)**:在 Grok Build 关掉兼容探测后,设置 → 扩展 → 技能不再继续列出 Claude/Cursor 技能。`skills_list` 用当前会话的 `GROK_HOME` 跑 `grok inspect`,并在 config.toml / 应用开关关闭时丢掉 `~/.claude`、`~/.cursor` 条目。斜杠 / + 选择器共用这份列表。 - **回合还在跑就出现「工作了」和复制/重试(#670)**:Host 在 prompt / 工具未结束时不再发 stream done。后到的完成片段并进仍在工作的那条,正文不重复。Ready 之前不显示复制 / MD / 重试。 - **Windows 超长回复/粘贴改为 txt 卡片(#647)**:仅 Windows,单条回复或粘贴 ≥ 8000 字改成预览 + 文件卡。macOS / Linux 仍是完整 Markdown / 正常粘贴。对话内查找仍显示全文。 - **新建对话不再带回已发送的残留**:每个项目有一份新会话输入缓冲。发送后这份缓冲常留在磁盘上(`#620` 残留,或和发出去的原文不完全相同的半截)。恢复时会丢掉与最近发送**完全相同**、作为其**前缀**、或**短且首行相同**的碎片(例如存的是 `好的` / `d`,发出去的是 `好的` / `你看好了吗?`)。只有附件的未发送草稿仍会恢复。在已有会话里跟进发送时,如果新任务缓冲还带着这份发送里没有的附件,不会整份清掉。 - **第一次 Shift+Enter 就会换行**:原先存的是 `\n`,重绘却是尾部 `
`,WebKit 把它当成空编辑器哨兵,第一次换行看起来没反应。现在一行一个 `div`,末尾空行标 `data-composer-nl="1"`,序列化会保留换行,光标留在新行。这条路径不再用 ZWSP 占位(会拆开输入中的汉字)。 - **Windows 任务栏图标不再小一号(#650)**:`icon.ico` 按去留白后的画布生成。macOS 母版 / `.icns` 不动。 - **侧栏文件 tab 名 + 按项目隔离(#661 切片)**:未激活的文件芯片显示文件名(重名时带上一级路径)。切换项目会收起该项目的 tab。打开 Files 显示树,并用占位芯片承接真实文件,不再并排多一个无路径 tab。同一 PR 里的 CodeMirror 编辑器不在本切片。 ## [0.2.20] - 2026-08-17 > **Highlight:** Grok Build-compatible custom relay; local session list/continue API; official-site installer aliases; opening a chat shows a real loading state instead of a fake empty session. > > **中文 · 亮点:** Grok Build 原生兼容中转;本机会话列表/续跑接口;官网安装包稳定别名;打开会话先显示加载而不是空会话。 ### Added - **Grok Build-compatible custom relay (#634, supersedes #617)**: Settings → Account → Custom providers has **Provider mode**. Generic stays on `[model.]`. **Grok Build-compatible relay** is an explicit opt-in: Responses only, save reads live `/models` and requires `supports_backend_search=true` for every selected model, ACP launches the real model id with process-scoped catalog/proxy env (no hostname special case, no official-aux auto-enable). CC Switch `grokbuild` imports honor an explicit mode; otherwise they promote only when that live catalog claim is present. Attachments stay `@path` (same as #627). - **Composer `/workflow` and `/workflows`**: Slash palette matches Grok Build CLI. `/workflows` or bare `/workflow` opens Settings → Runtime → workflows (saved scripts + smoke/run). `/workflow ` is sent as a session turn so the agent/CLI host can run it. This App still has no TUI run dashboard. - **User menu lists every saved official account (#621)**: Each row shows honest SuperGrok remaining % (never invents 0% / 100% on a failed probe). Click another account to `account_switch`; click the active row for Settings → Account. Custom-provider / signed-out cards stay as they are. - **Local session API (list + continue, #626 first slice)**: Other apps on this machine can list Grok App chats and continue one by session id + prompt. Loopback HTTP (`GET /v1/sessions`, `POST /v1/sessions/{id}/turns`) is token-gated; CLI `--sessions` / `--session-send` talks to the same Host path and does not steal window focus. List can read the on-disk index when the app is quit; sending requires the app (or tray) and never interrupts a running turn. Settings → Runtime → Connection shows status and the token-file location (never the token). - **External follow-ups join the composer queue while a turn is running**: If that chat is mid-turn (drawing, tools, streaming), `POST /v1/sessions/{id}/turns` returns `queued` (HTTP 202) and the prompt appears on the same follow-up strip above the composer. It sends when the turn ends. The current turn is not interrupted. - **Install a `grok-app` terminal command from Settings**: Runtime → Connection → Session API can symlink (or write a Windows `.cmd` shim) to `~/.local/bin/grok-app` pointing at the running binary. No sudo, no shell-rc edits, will not overwrite a foreign file. New terminals still need `~/.local/bin` on `PATH`. - **Official-site download contract**: Each tagged Release also publishes unversioned installer aliases (`Grok_mac_x64.dmg`, `Grok_windows_x64-setup.exe`, …) plus `downloads.json`. The upcoming grok-app.com buttons can pin `/releases/latest/download/…` and stay on GitHub’s CDN (no site bandwidth). Settings → About prefers those aliases when present. **中文 · 新增** - **Grok Build 原生兼容中转(#634,替代 #617)**:设置 → 账户 → 自定义提供商新增 **提供商模式**。通用模式仍写 `[model.<别名>]`。**Grok Build 原生兼容中转** 必须显式打开:只走 Responses,保存时读实时 `/models`,每个所选模型都要 `supports_backend_search=true`,ACP 用真实模型 id 和进程级目录/代理环境启动(不按主机名特判,也不自动打开 official-aux)。CC Switch `grokbuild` 导入尊重已写明的模式;否则只有实时目录声明了该能力才会提升。附件仍走 `@path`(与 #627 相同)。 - **输入框 `/workflow` 与 `/workflows`**:斜杠菜单对齐 Grok Build CLI。`/workflows` 或单独的 `/workflow` 打开设置 → 运行时 → 工作流(已发现脚本 + 试跑)。`/workflow <名称|pause|resume|stop|save …>` 作为会话回合发出,由 agent / CLI 托管运行。本应用仍没有终端里的运行看板。 - **头像菜单列出全部已保存官方账号(#621)**:每行显示诚实的 SuperGrok 剩余 %(探测失败不编造 0% / 100%)。点其他号走 `account_switch`;点当前号仍进设置 → 账户。自定义提供商 / 未登录卡片不变。 - **本机会话接口(列表 + 续跑,#626 第一刀)**:同一台机器上的其他应用可以列出 Grok App 会话,再用会话 ID + 提示词续跑同一条。回环 HTTP(`GET /v1/sessions`、`POST /v1/sessions/{id}/turns`)用令牌鉴权;CLI `--sessions` / `--session-send` 走同一条 Host 路径,不会抢窗口焦点。列表在应用退出后仍可读磁盘索引;发送需要应用(或托盘)在跑,且不会打断正在进行的一轮。设置 → 运行时 → 连接 显示状态和令牌文件位置(不展示令牌)。 - **会话正忙时外部跟进入输入框上方的队列**:该会话正在跑一轮(绘画、工具、流式)时,`POST /v1/sessions/{id}/turns` 回 `queued`(HTTP 202),提示词出现在同一条跟进队列条上,本轮结束后再发。当前轮不会被打断。 - **设置里可安装 `grok-app` 终端命令**:运行时 → 连接 → 会话接口会把用户级命令装到 `~/.local/bin/grok-app`(Unix 符号链接 / Windows `.cmd`),指向当前正在跑的二进制。不需要 sudo,不改 shell 启动脚本,也不会覆盖别人的同名文件。新终端仍需把 `~/.local/bin` 放进 `PATH`。 - **官网下载契约**:每个正式 Release 额外上传不带版本号的安装包别名(`Grok_mac_x64.dmg`、`Grok_windows_x64-setup.exe` 等)和 `downloads.json`。之后 grok-app.com 的按钮可以写死 `/releases/latest/download/…`,流量仍走 GitHub。设置 → 关于 在有别名时优先用它们。 ### Changed - **README Gatekeeper copy**: Official Releases from v0.2.19 are Developer ID signed and Apple-notarized. The `xattr` workaround stays for forks / older unsigned builds. - **Assistant process vs answer**: Mid-turn speech and folded actions (explore / run / edit) live inside one **工作了** fold (collapsed by default). The conclusion stays visible below. Journal CoT stays a separate **思考了** row — not dumped into the rail or mashed into the answer. **中文 · 变更** - **README Gatekeeper 说明**:官方 Release 从 v0.2.19 起已签名并公证。`xattr` 仅留给 fork / 旧的未签名包。 - **助手过程与结论分开**:中间穿插的话和折叠动作(探索 / 运行 / 编辑)收进同一条「工作了」(默认收起),结论始终在下面。日记 CoT 仍是单独的「思考了」,不灌进活动轨,也不和结论挤在一起。 ### Fixed - **Opening a session no longer looks like a new empty chat**: While the journal is still on disk, the thread shows a spinner and “Loading conversation” instead of “Start chatting” plus the “agent failed to connect” banner. Journal text paints before relative-media / path-classify IPC. After HMR remount, a selected session re-opens instead of looking empty. - **Transcript wheel over message bodies**: The 4096px inner scroller from the long-chat fix ate vertical wheel in WebKit. Drop the nested scroller; the virtual list still windows long threads. Horizontal code/table scrollers use `overflow-y: clip`. - **Chat image previews**: Project-relative markdown images (`design-demos/shots/foo.png`) resolve from attachments instead of painting an empty alt card. A first-paint miss (file still being written, or path grant not ready) retries instead of locking the card as broken. - **Windows file / image drop into the composer**: WebView2 cannot use HTML5 `Files` while Tauri owns the drop target. Windows builds now set `dragDropEnabled: false` and handle Explorer drops in capture-phase HTML5 (temp-file attach when `File.path` is missing). Overlay + `@path` still work. - **Linux maximize / minimize**: Linux was decorated with no in-app caption buttons, and GTK/Wayland often no-ops `toggleMaximize`. Linux is now frameless with the same min/max/close chrome as Windows; maximize falls back to filling the monitor work area when the compositor ignores GTK. - **Long chat / long article blanks the transcript** (community, [@y7469591](https://x.com/y7469591/status/2088917279966917116)): One huge message or spacer could exceed the WebView compositor layer and paint white (scroll also stuck). Virtualize by estimated height, split tall spacers, and cap a single message body at 4096px with inner scroll. - **Fork no longer pins the parent chat on 连接中**: After `_x.ai/session/fork` the CLI is still hydrating parent context. Post-open `session/set_mode` used to walk every agent-mode alias (`agent` / `default` / `code` / `normal` / `Agent`) at 45s each — ~4 minutes of handshake, no `session/prompt`, both the fork and the original chat stuck on Connecting / Thinking. Fork skips that nudge (spawn already has `--permission-mode`); any later `set_mode` transport timeout aborts the remaining aliases. - **New-session composer no longer restores the just-sent prompt (#620)**: Sending from the New session page materializes a chat and leaves the draft view, so persist-clear used to be skipped. The per-project new-session buffer is now wiped on success. - **Telegram topic replies stay in the topic (#623)**: Inbound `message_thread_id` is kept and sent back on `sendMessage` / cards / edits. With **thread isolation** on, each topic is its own agent binding. - **Custom Grok / vision relays can read image attachments (#618)**: Settings → Account → Custom providers has **This model can see images**. Grok / GPT-4o / Claude / Gemini names already count. Unknown relays stay text-only so DeepSeek-style APIs do not 400 on `image_url`. Vision mains keep `@path` pixels and no longer hit the `read_file` image hook. **中文 · 修复** - **打开会话不再先画成新空聊天**:日志还在读盘时,中间是转圈和「正在加载会话内容」,不再出现「开始对话」和「连接 Agent 失败」横幅。相对路径媒体和 path classify 不再挡住整段日志的第一帧。热更新后若会话还在、缓存没了,会重新打开而不是空会话。 - **消息正文上滚轮被吃掉**:长对话修复里的 4096px 内层滚动在 WebKit 里会吞掉纵向滚轮。去掉嵌套滚动;长对话仍由虚拟列表窗口化。代码/表格横向滚动用 `overflow-y: clip`。 - **聊天图片预览**:项目相对路径的 markdown 图(`design-demos/shots/foo.png`)会跟附件对上,不再画出一张空的 alt 卡。文件还没写完或授权还没落到的第一次失败会重试,不再把卡片锁死。 - **Windows 无法把图片/文件拖进输入框**:Tauri 接管 WebView2 拖放后 HTML5 `Files` 是空的。Windows 现在关掉原生 drop handler,改用捕获阶段 HTML5(没有 `File.path` 就存临时文件再附加)。 - **Linux 无法最大化/最小化**:以前走系统标题栏、应用内没有按钮,GTK/Wayland 上 `toggleMaximize` 经常没反应。Linux 改为与 Windows 一样的无边框自绘按钮;合成器忽略 GTK 最大化时,退化为铺满工作区。 - **长对话 / 长文章后聊天变空白、滚不动**(社区反馈 [@y7469591](https://x.com/y7469591/status/2088917279966917116)):超高消息或占位层会撑爆 WebView 合成层。现在按预估高度虚拟化、拆开超高 spacer,单条消息正文限高 4096px 内部滚动。 - **分叉后不再把原会话卡在「连接中」**:`session/fork` 之后 CLI 还在灌父会话。以前会连试 5 个 `session/set_mode` 别名,每个等 45 秒,握手约 4 分钟,消息发不出去,分叉和原会话一起停在连接中/思考中。分叉后不再做这次 nudge;之后若 `set_mode` 是传输超时,立刻停掉剩余别名。 - **新建会话发送后不再把刚发出的草稿带回来(#620)**:从「新建会话」发出去会落成真实会话并离开草稿页,以前会跳过清空。成功后现在会清掉该项目的新建会话草稿。 - **Telegram 话题回复回到原话题(#623)**:入站保留 `message_thread_id`,出站 `sendMessage` / 卡片 / 编辑一并带回。打开 **按话题隔离** 后,每个 Topic 是独立 Agent 绑定。 - **自定义 Grok / 识图中转能读图片附件(#618)**:设置 → 账户 → 自定义提供商可勾 **这个模型能看图**。名称或模型 id 带 Grok / GPT-4o / Claude / Gemini 的通道本身就算。未知中转仍按纯文本,避免 DeepSeek 类接口被 `image_url` 打 400。识图主模型保留 `@path` 像素,不再被 `read_file` 读图 hook 拦住。 ## [0.2.19] - 2026-08-15 > **Highlight:** SuperGrok quota auto-refresh every 10 minutes; macOS Release notarization when Apple secrets are present; first launch follows the OS language; mid-turn steer no longer flashes the transcript; composer clears as soon as the user bubble appears. > > **中文 · 亮点:** SuperGrok 额度每 10 分钟自动刷新;仓库配齐 Apple secrets 后 macOS Release 会公证;首次安装跟随系统语言;中途引导不再闪聊天;发送后输入框立刻清空。 ### Changed - **Official SuperGrok quota auto-refresh**: Background probe every **10 minutes**. Settings → Account, the sidebar user-menu (remaining %), tray Usage, and the usage-limit modal all follow the same snapshot. Quiet billing-only ticks (no spinner, no heatmap walk); last good numbers stay on soft-fail. - **macOS Release signing / notarization**: When Apple Developer ID + App Store Connect API secrets are present, `release.yml` codesigns and notarizes the `.app` / `.dmg` (Hardened Runtime entitlements include microphone + camera). Forks without secrets stay unsigned. **中文 · 变更** - **官方 SuperGrok 额度自动刷新**:后台每 **10 分钟**拉一次。设置 → 账户、主页左下角用户面板(剩余 %)、托盘 Usage、用量限制弹层共用同一份快照。后台为静默、只刷新账单(不扫热力图);失败时保留上次数字。 - **macOS Release 签名 / 公证**:仓库配齐 Developer ID + App Store Connect API secrets 后,`release.yml` 会对 `.app` / `.dmg` 做 codesign 与公证(Hardened Runtime 含麦克风 / 摄像头 entitlements)。未配 secrets 的 fork 仍出未签名包。 ### Fixed - **Chat no longer flashes after mid-turn steer**: Leftover Host chunks on the pre-steer assistant id no longer revive that bubble. The Worked-for rail stays a one-line header (full tool list is capped) instead of swapping collapsed ↔ hundreds of rows. - **Composer clears as soon as the user bubble appears**: Send no longer waits for `ensureConnected` / `sessionSend` to wipe the input. A failed send puts the text back if the box is still empty; follow-up typed during a slow send is never wiped. - **Follow system language on first launch**: New installs default `settings.locale` to **System**. Host reads macOS AppleLanguages / Windows UI language (not just `LANG=C`), so a Chinese OS opens in 简体/繁體. Existing installs that still have the factory `en` lift once to System (explicit 简体/繁體 stays). Boot splash and tray follow the same probe. - **English token units (#613)**: Context-window chip, composer model menu, phone tools sheet, heatmap, and account call-log counts use **K / M / B** when locale is `en` (e.g. `500K`, `1M`) instead of Chinese 百/千/万. zh / zh-TW still use 万·萬 / 亿·億. **中文 · 修复** - **中途引导后聊天不再狂闪**:旧助手 id 上残留的 Host 分片不再把已冻结气泡重新标成 streaming。「工作了」活动轨保持一行标题(工具列表有高度上限),不会在收起和整段工具行之间来回切。 - **发送后输入框立刻清空**:用户气泡一出现就清 composer,不再等连接 / `sessionSend` 成功。发送失败且框仍空时回填原文;慢发送期间新打的字不会被清掉。 - **首次安装跟随系统语言**:新安装默认「跟随系统」。Host 读取 macOS AppleLanguages / Windows 界面语言(不再只看经常为空的 `LANG`),中文系统会直接进入简体/繁体。旧安装里仍是出厂 `en` 的一次性改成跟随系统(用户已选的中文不变)。启动页与托盘同一套探测。 - **英文 Token 单位 (#613)**:界面语言为英文时,上下文芯片、模型菜单、热力图与通话记录显示 **K / M / B**,不再混用「万 / 千 / 百」。简体/繁体仍用中文计数单位。 ## [0.2.18] - 2026-08-14 > **Highlight:** TUI-parity Usage limit (`/usage`, `/cost`) with this-session spend plus heatmap Tokens / Cumulative stats; long image and tool turns no longer die at 4 hours; Windows Settings Agent tab no longer flashes a black console; chat image cards survive remount. > > **中文 · 亮点:** 对齐 TUI 的用量限制(`/usage` / `/cost`,含本会话花费)+ 热力图 Tokens / 累计视图;长图/工具回合不再 4 小时被掐;Windows 设置 Agent 页不再闪黑框;聊天图片卡片回合结束后仍能显示。 ### Added - **Usage limit (`/usage`, `/cost`)**: TUI-parity weekly SuperGrok bar plus this session’s token spend since start or last resume (input/cached, output/reasoning, total, cache hit, model calls, API time, cost). Also from the composer context-chip menu. Official route only for the weekly quota; custom routes stay honest. - **Account heatmap call log Tokens column**: Each recent session row now shows billing usage (same `turn_completed` sum as the heatmap) next to context occupancy. - **Account heatmap stats strip**: Codex-style totals — cumulative tokens, peak day, longest chat, current / longest streak — plus a **Cumulative** calendar view (running-total color). **中文 · 新增** - **用量限制(`/usage` / `/cost`)**:对齐 TUI 的本周 SuperGrok 额度条,加上本会话(自开始或上次续跑)的 token 花费(输入/缓存、输出/推理、合计、缓存命中、模型调用、API 时长、费用)。也可从 Composer 上下文芯片菜单打开。周额度只走官方路由;自定义路由保持诚实空态。 - **账号热力图通话记录 Tokens 列**:最近会话每一行在上下文占用旁显示计费用量(与热力图同一套 `turn_completed` 汇总)。 - **账号热力图统计条**:Codex 风格合计 — 累计 tokens、峰值日、最长聊天、当前/最长连续天数 — 以及 **累计** 日历视图(按累计总量上色)。 ### Fixed - **Long image / tool turns no longer die at 4 hours**: `session/prompt` wait is silence-only (30 minutes with no `session/update`). Fresh progress re-arms the clock; there is no absolute turn-age ceiling. Batch image jobs that were still working used to get `TURN_TIMEOUT` at 4h. - **Windows Settings → Agent no longer flashes a black box**: Opening the Agent tab (and other similar surfaces) no longer pops a console window (`git` / `rg` / `tasklist` / `taskkill` / `reg`) and no longer paints native number/date/time inputs with the OS dark scheme. WebView2 now boots with the same light/dark theme as the page. - **Usage modal cache > input, then empty**: Session spend only sums `turn_completed` snapshots. Cache-heavy fragments (cache > input, no `modelCalls`) are dropped so cached cannot exceed input; a real turn without `modelCalls` still counts. Totals persist in sessionStorage, and an in-flight turn says usage updates when it finishes. - **Chat image cards no longer die after the turn ends**: Leftover remote https thumbs (web-fetch charts, etc.) first-paint from the in-memory thumb cache on journal remount. Swapping `src` mid-load used to abort the original `` and lock `broken_blob` (“preview failed”). Abort / stale-src errors are ignored; a working https original is not wiped when thumb resolve returns empty. **中文 · 修复** - **长图 / 工具回合不再 4 小时被掐**:`session/prompt` 只按静默超时(30 分钟没有任何 `session/update`)。有新进度就重新计时,没有绝对回合年龄上限。以前还在跑的批量出图会在 4 小时拿到 `TURN_TIMEOUT`。 - **Windows 设置 → Agent 不再闪黑框**:打开 Agent 页(以及类似表面)不再弹出控制台窗口(`git` / `rg` / `tasklist` / `taskkill` / `reg`),也不再用系统深色方案画原生数字/日期/时间输入。WebView2 启动主题与页面一致。 - **用量弹层缓存大于输入然后变空**:会话花费只汇总 `turn_completed` 快照。缓存大于输入且没有 `modelCalls` 的碎片会被丢掉,避免 cached 超过 input;没有 `modelCalls` 的真实回合仍计入。合计写入 sessionStorage;进行中的回合会提示结束后再更新。 - **聊天图片卡片回合结束后不再挂掉**:journal 重挂时远程 https 缩略图先从内存缓存首屏。中途改 `src` 以前会中止原来的 `` 并锁成 `broken_blob`(「预览失败」)。中止 / 过期 src 错误会被忽略;缩略图解析为空时不会抹掉还能用的 https 原图。 ## [0.2.17] - 2026-08-14 > **Highlight:** Stability release — shared-process session isolation (no cross-chat history poisoning, per-session turn completion), thinking timer stays live across tool loops, chat bottom jitter gone, side-terminal Powerline/truecolor, MCP OAuth follows the selected server, and macOS no longer crashes on voice. > > **中文 · 亮点:** 稳定性版本——共享进程会话隔离(历史不再互灌、收尾按会话隔离)、思考计时全程在线、聊天贴底不再抖动、侧栏终端 Powerline/真彩、MCP 授权跟所选服务器走、macOS 语音不再闪退。 ### Fixed - **macOS no longer aborts on voice / media-device probe**: Info.plist now includes `NSCameraUsageDescription`. WKWebView `getUserMedia` (even mic-only) enumerates cameras; missing the key is a TCC `SIGABRT`, not a permission dialog. Live Voice also passes `video: false`. - **Thinking timer no longer dies mid-turn or after switching chats**: Later think→tool loops stay on “思考中 / Thinking for …” (not frozen “思考了”) even after the first status sentence. Switching away and back while the agent is still running keeps `streaming` and restores the live assistant from Host state, so journal reconcile cannot paint a finished thought over a live turn. The live clock follows the turn start and resumes when the window is shown again. - **Model / floating menu flicker** (#602): When a portal menu sits above its trigger, `maxHeight` is no longer rewritten from the already-capped rendered height (`ph + 8`). That write-back plus `ResizeObserver` grew the panel every frame. - **Side terminal Starship / Powerline** (#603): Multi-word Nerd Font families are quoted (WebKit no longer splits them onto unpatched JetBrains Mono). The stack prefers Mono faces; xterm loads the WebGL addon so Powerline extras fill the cell. PTY spawn drops inherited `NO_COLOR` and forces truecolor. - **MCP authorize uses the selected server** (#605): Host OAuth discovery no longer tries ChatCut's well-known metadata first. Authorizing Appwrite (or any other remote MCP) opens that provider's consent screen, not `api.chatcut.io`. ChatCut still works — its metadata is derived from its own MCP URL. Loopback success page is generic (no longer says "ChatCut"). - **Chat jitter at the bottom**: Leaving the end no longer re-pins from the 100px near band (a trackpad bounce used to snap back). Virtual-list pin snaps are not treated as a user fling, so spacer remasure cannot bounce the tail. - **Fork / connecting send queue**: A first message after fork (or during warm-connect) no longer parks in the follow-up queue. Handshake `connecting` is not a live turn — Send goes through `ensureConnected`. Queue **Steer** becomes **Send now** when no turn is running. - **Agent turn finish no longer drops the last stream batch**: Process crash / RPC fail now flushes the coalesced `session://stream` buffer and journal tail before clearing the live slot (answers no longer stop mid-sentence). - **Early `prompt_complete` no longer discards a silent long tool**: Host keeps the turn deferred while tools are still open instead of force-clearing them after 3s and treating later chunks as load-replay. - **Shared-process prompt complete is per session**: `last_update` and waiter matching no longer let chat B's stream finish or extend chat A's turn. - **Stop / stall during Host vision no longer marks a scheduled task as run**: `send_message` returns `TURN_CANCELLED` when the turn was cleared before `session/prompt`; automations do not advance `next_run_at`. - **YOLO / effort / proxy mid-turn actually apply after the turn**: Busy `soft_respawn` is queued; parked agents with stale `--reasoning-effort` / permission flags are dropped so the next connect cold-spawns. Fixes Grok 4.6 Extra High not taking effect (#598) and UI “Ask” while the CLI still has `--always-approve`. - **Allow for session on write/edit tools no longer cancels the turn (#600)**: When the CLI list has no session-scoped option, Host answers with `allow-once` (and still caches session scope) instead of inventing `always-allow`. - **Stop cancels pending tool permission** (not only ask/plan), so reconnect is not stuck on an unanswered `request_permission`. - **Media path grant is file-exact**: `paths_classify` / `grant_path` no longer authorize the parent directory (no sibling read of e.g. `~/.ssh`). - **Composer draft is kept until send succeeds**; send targets the viewing chat, not a stale shell session id. Text or attachments added while a slow send is in flight are never wiped by the success cleanup. - **Changing proxy settings respawns warm agents** so the new `HTTP_PROXY` is picked up. - **Background turns honor provider `RetryState`**: switching away no longer leaves a hung chat until the CLI idle/absolute timeout; Host applies the same abort + `NETWORK_PROVIDER` path as the focused session. - **cwd-relative downloads (`curl -O` / `wget` without `-o`) prompt** unless YOLO — no longer assumed to write inside the project. - **Opening another chat no longer dumps its history into a still-streaming one**: Host will not warm-reuse a CLI process that already has a mid-turn background (or live) session. The other chat cold-spawns. Idle parked / idle background reuse is unchanged. **中文 · 修复** - **macOS 语音/枚举媒体设备不再闪退**:`Info.plist` 补上 `NSCameraUsageDescription`。WKWebView 即使只开麦克风也会扫摄像头,缺这个 key 会被 TCC 直接 `SIGABRT`,不会弹出授权框。Live Voice 申请媒体时显式 `video: false`。 - **思考计时不再在中途或切会话后停住**:第一句正文之后的 think→tool 轮次仍显示「思考中」并继续走秒。切走再切回时保留 `streaming`,并按 Host 状态把当前助手标回直播,避免 journal 回灌把还在跑的一轮画成「思考了」。 - **模型/浮层菜单底边闪烁**(#602):菜单在触发器上方时不再把已受 `max-height` 限制的渲染高度 `+8` 回写成新上限;避免 `ResizeObserver` 正反馈。 - **侧栏终端 Starship / Powerline**(#603):多词 Nerd Font 族名加引号,优先 Mono 面;xterm 走 WebGL 画分隔符;PTY 去掉宿主带来的 `NO_COLOR` 并强制 truecolor。 - **MCP 授权跟所选服务器走**(#605):OAuth 发现不再先打 ChatCut 的 well-known。给 Appwrite 等其它远程 MCP 点授权时,打开的是该服务商的登录页,而不是 `api.chatcut.io`。ChatCut 仍可用(从它自己的 MCP URL 推导元数据)。回环成功页不再写死 ChatCut。 - **聊天滚到底部抖动**:离开底部后不会因为还在 100px 近底带里就被拽回去;虚拟列表的贴底写入不再被当成用户甩动,避免 spacer 重测把尾巴弹一下。 - **分叉后发不出消息**:预热连接中的 `connecting` 不再把第一条消息当成跟进入队。握手不是进行中的回合;发送走 `ensureConnected`。无回合时队列「引导」改为「立即发送」。 - **回合结束不再丢掉最后一批流式字**:进程崩溃 / RPC 失败会先刷出合批缓冲和 journal 尾巴。 - **提前 `prompt_complete` 不再丢掉仍在跑的静默工具**:不再 3 秒后强清 open tools,后续 chunk 也不会被当成 load-replay 丢掉。 - **共享进程的收尾按会话隔离**:A 的回合不会被 B 的流续命或提前结束。 - **Stop / 准备阶段取消不再把定时任务标成已跑**:未真正派发 `session/prompt` 时返回 `TURN_CANCELLED`。 - **回合中改 YOLO / 推理强度 / 代理会在本轮结束后重生进程**:修好 Grok 4.6 极高不生效(#598)以及 UI 已是「询问」但 CLI 仍 `--always-approve`。 - **写文件等工具点「会话内允许」不再整轮取消(#600)**:没有 session 档 option 时用列表里的 `allow-once` 作答。 - **Stop 会取消未答复的工具权限**,避免重连卡在 `request_permission`。 - **媒体路径只授权该文件本身**,不再授权父目录。 - **发送失败前不丢草稿**;发送目标跟当前查看的会话,而不是过期的 shell id。发送期间新输入的文字/附件也不会被成功后的清空吞掉。 - **改代理设置会回收 warm 进程**。 - **后台回合也认 provider RetryState**:切走后不再空转到 CLI 超时,和前台一样熔断并记 `NETWORK_PROVIDER`。 - **不带 `-o` 的下载默认要批准**(YOLO 除外)。 - **打开另一条会话不再把对方历史灌进还在跑的聊天**:有回合在跑的 CLI 进程不再给别人 warm-reuse,另一条会话会单独冷启动。空闲 parked / 空闲后台的复用不变。 ## [0.2.16] - 2026-08-13 > **Highlight:** Official default is Grok 4.6 with Extra High (`xhigh`); Changes / Remote IM / Voice / workbench honesty remediations; Amux/Yun effort ids match official `low`/`medium`/`high`/`xhigh`. > > **中文 · 亮点:** 官方默认 Grok 4.6 + 极高推理;Changes / Remote IM / Voice / 工作台诚实整改;Amux/云驿思考档与官方枚举对齐。 ### Added - **Grok 4.6 + Extra High effort**: Official catalog default is `grok-4.6` (4.5 stays selectable). Composer shows 极高/`xhigh` on 4.6; product default effort on 4.6 is **xhigh**. One-shot settings lift `grok-4.5` → `grok-4.6` and official `high` → `xhigh`. Amux/Yun presets list both models. Official aux / spawn target is `grok-4.6`. - **Per-provider appended prompt**: The provider editor gains an **Appended prompt** box for relays that need specific instructions. It rides the CLI's `--rules` flag, so the text is *appended* to the agent's system prompt rather than replacing it (`--system-prompt-override` would drop the built-in prompt). Stored per channel in agent-home `config.toml` as `app_append_prompt` (ignored by Grok Build), merged at connect alongside session rules. Empty by default. - **X evidence citation honesty (wallpaper lite)**: Wallpaper X gallery shows **X post** (canonical `x.com/…/status/…` open-in-browser) or **Unverified** when no status URL; empty search soft-fails with honest summary; applying an X wallpaper records a small local evidence ring (`localStorage` path + url meta, no cloud / no full MCP SaaS). Pure `xEvidenceCitation` helpers + tests; Host normalizes `postUrl`; en/zh/zh-TW. - **Bridge resilience overview honesty**: Settings → Remote control → IM overview surfaces recovery reconnect, always-on rate-limit/backoff policy notes (8/chat · 40 global / 60s · cap 60s), sanitized last-error, and soft-fail empty states for channels/timeline during crash recovery (never invents links or events). Pure helpers in `resilience.ts` + tests; i18n en/zh/zh-TW. - **Resources multi-tab + split tree polish**: Files workbench keeps preview | tree simultaneous when the tree is open (no stack flip on open). Multi-file tabs: close-active, dirty discard honesty (side-tab markers + confirm), max-tab soft-fail (prefer drop clean LRU; i18n notice). Tree filter / expand persist / width persist residual fixes. Pure helpers + vitest (`resourceTabs`, `resourceTree`). - **Review / Changes empty honesty**: Classify no-repo · no-git · load-error · empty · filter-empty for Resources → Changes and Side Review (never pretends a clean tree on Host/git failure). Kind chips when workspace has mixed kinds; path deep-link opens Resources preview; open-in-editor uses default Host editor with honesty errors. Pure `resourceChangesHonesty` helpers + tests; en/zh/zh-TW. - **Changes accept/reject/restore honesty**: File and hunk actions show honest disabled reasons when snapshots are missing; git checkout soft-fails are classified (`not_a_git_repo` / `git_not_available` / path / checkout…); batch accept/reject reports partial success and untracked wipe confirm stays on GlassModal (never `window.confirm`). - **Default open target / open-with honesty**: Settings → Open files with lists probed editors (unavailable preferred soft-disabled + empty/preferred-missing honesty); Open Location menus put the preferred editor first with icons; Resource/Review open-in-editor uses session/global default and soft-fails with i18n copy when the editor is missing. Pure selection helpers + tests; en/zh/zh-TW. - **Sandbox product path honesty (F4)**: Settings → Permissions surfaces App **Workspace** default vs terminal CLI **Off**, Open sandbox guide wizard CTA, disabled-off soft-empty note, Linux userns / `SANDBOX_BLOCKED` platform note, and leader ↔ non-off sandbox mutual exclusion (also on Runtime → Leader). Wizard re-wired after project trust (when global profile is Off) and from project sandbox menu. Pure helpers + en/zh/zh-TW + tests. - **Export path honesty**: Session export menu shows clear format labels (name + extension) with **Journal** / **CLI export** badges. Markdown full-transcript download prefers `grok export` when an agent session is linked (soft-fails to local journal); other formats and copy stay journal-only. Pure path-resolution helpers + tests; en/zh/zh-TW. - **Live Voice delegate session honesty**: Overlay restores delegated/active session chips with real titles + liveMap progress while Live Voice is open; keep-agents default stays on (opt-out cancels turns). Soft-fail mic/auth/network/cli surfaces classified toasts in addition to overlay copy. Host never records blank delegated ids. Pure helpers + tests; existing en/zh/zh-TW `voice.err.*` / `voice.center.*`. - **Composer voice dictation honesty**: Mic always visible with insert-vs-send tips (Settings auto-send), cancel mid-stream during requesting/transcribing (not hard-disabled), empty speech / auth soft-fail toasts without sticky error chrome, auto-send blocked soft-fail when permission-gated. Pure `voiceDictation` helpers + tests; en/zh/zh-TW. No Live Voice S2S in this residual. - **Appearance fonts (#553)**: Settings → Appearance can set UI font family and side-terminal font family/size (localStorage; terminal prefers Nerd Fonts for Starship glyphs). - **Preferred agent apply honesty (#564)**: Settings preferred-agent and Agents & Personas console document spawn-time `--agent` apply paths — live agent soft-respawns on change; idle waits for next connect. Soft-fail when the saved name is missing from the catalog or has invalid characters. Pure `preferredAgentApply` helpers + tests; en/zh/zh-TW. - **Remote IM CN channels honesty**: DingTalk / WeCom / Weixin deep health always soft-fails incomplete bind fields and never shows **Connected** without Bridge running **and** instance linked; Weixin locks project/session picker to text menus (§6.9); no-live-claim hints + §6 field help polish. WPS xiezuo/agentspace stay retired. - **Memory clear scopes + dream honesty**: Memory ops center GlassModal clear for host scopes **workspace / global / all** (real `grok memory clear` flags; no `window.confirm`). Dream/watcher chips remain config-presence only — never a live “running” status. Experimental memory stays **off** by default with `--no-memory` force-disable honesty. **中文 · 新增** - **Grok 4.6 + 极高推理**:官方默认模型改为 `grok-4.6`(4.5 仍可选);4.6 显示极高/`xhigh`,产品默认 **xhigh**。旧安装一次性把全局 `grok-4.5` 抬到 4.6,官方 `high` 抬到 `xhigh`。 - **按提供商追加提示词**:编辑提供商表单新增**追加提示词**输入框,用于某些中转需要的针对性指令。它走 CLI 的 `--rules` 参数,因此是**追加**到系统提示词末尾,而不是替换。按渠道存在 agent-home 的 `config.toml` 里(键名 `app_append_prompt`),连接时与会话规则一并合并。默认为空。 - **沙箱产品路径诚实说明**:设置标明 App 默认 Workspace 严于 CLI Off;打开沙箱指南;Off 空态 soft 说明;Linux userns 提示;leader 与非 Off 沙箱互斥;信任项目后/项目菜单可再次打开向导。 - **导出路径诚实徽章**:导出会话菜单显示格式名+扩展名,并标注 **会话记录 / CLI 导出**。完整 Markdown 下载在已关联 agent 时优先 `grok export`(失败回退本地记录);其他格式与复制仅用会话记录。纯路径解析 + 测试;中英繁。 - **实时语音委派会话诚实**:叠加层恢复委派/活动会话芯片(真实标题 + liveMap 进度);结束后默认保留 Agent(关闭则取消回合)。麦克风/鉴权/网络/CLI 软失败额外 toast 分类文案。Host 不记录空委派 id。纯 helper + 测试;沿用三语 `voice.err.*` / `voice.center.*`。 - **Composer 口述诚实性**:麦克风始终可见并标明插入/发送;转写中可取消;空语音/鉴权 soft-fail;自动发送被权限挡住时提示已插入。纯 helper + 测试;三语文案。不含 Live Voice S2S。 - **默认打开目标 / 打开方式诚实提示**:设置「打开文件方式」列出探测到的编辑器(缺失首选软禁用 + 空/缺失诚实文案);打开位置菜单优先默认编辑器并显示图标;资源/审查「在编辑器中打开」跟随会话/全局默认,缺失时 i18n 软失败。纯选择助手 + 测试;en/zh/zh-TW。 - **Changes 接受/拒绝/还原诚实态**:内容缺失时按钮给出禁用原因;git checkout 失败分类 soft-fail;批量接受/拒绝诚实汇总部分成功;未跟踪删除确认走 GlassModal(不用 `window.confirm`)。 - **审阅 / 变更空状态诚实**:区分非仓库 · 无 git · 加载失败 · 无变更 · 筛选无结果;混合类型时显示 kind 筛选;路径可点开预览;默认编辑器打开走诚实错误。纯 helper + 测试;三语文案。 - **资源多标签 + 分栏树打磨**:文件工作台在树可见时保持「预览 | 树」并排;多文件标签关闭/脏标记/上限 soft-fail;树筛选·展开·宽度残留修复;纯函数 + 测试。 - **Bridge 韧性总览诚实态**:设置 → 远程控制 → IM 总览提供恢复期「立即重连」、始终可见的速率/退避策略说明、脱敏 last-error,以及崩溃恢复时渠道/时间线软失败空态(不伪造链路或事件)。`resilience.ts` 纯 helper + 测试;三语文案。 - **X 证据引用诚实(壁纸轻量)**:壁纸 X 画廊展示 **X 原帖**(规范 status 链接可外开)或 **未验证**;空搜索软失败;应用 X 壁纸时写入本机证据环(path + url 元数据,无云端/不做完整 MCP)。纯 `xEvidenceCitation` + 测试;Host 规范化 `postUrl`;三语文案。 - **外观字体 (#553)**:设置 → 外观 可配置界面字体与内置终端字体/字号(本机偏好;终端优先 Nerd Font 以显示 Starship 图标)。 - **首选 agent 生效路径诚实 (#564)**:设置与 Agents & Personas 控制台标明 spawn `--agent` 路径 — 已连接 soft-respawn、空闲下次连接;目录缺失/非法名称 soft-fail。纯 helper + 测试;三语文案。 - **记忆清除范围 + Dream 诚实**:操作中心 GlassModal 清除 host 作用域 **workspace / global / all**(真实 CLI 参数,不用 `window.confirm`)。Dream/Watcher 仅表示配置存在性,绝不伪造「运行中」。跨会话记忆默认关闭并强制 `--no-memory`。 ### Changed - **Bulk select is findable**: Right-click any chat → **Select** enters multi-select with that chat already ticked (and anchored for Shift-range). The **Other chats** group header gains the same hover action the **Projects** header already had. - **Goal session chrome menu**: Chat Goal chip (active on real `goal_updated`, dashed waiting when `/goal` is on with no harness events) opens a solid menu — Open Reliability · Copy summary · Clear local timeline (in-app confirm). Extracted `GoalOrchSessionChip`; still never invents progress. **中文 · 变更** - **批量选择变得找得到**:右键任意会话 → **选择**,直接进入多选并勾选该会话。**其他会话**分组标题补上与**项目**标题一致的悬停操作。 - **远程 IM 国内渠道诚实态**:钉钉 / 企微 / 微信个人 缺字段 soft-fail,未关联 Bridge 不显示「已连接」;微信强制文本菜单;无在线断言提示 + §6 字段帮助。WPS 协作/数字员工保持退役。 - **Goal 会话指示菜单**:有真实 `goal_updated` 显示阶段 chip,仅 `/goal` 无事件时虚线等待态;点击打开菜单(可靠性中心 / 复制摘要 / 清除本机时间线)。仍不虚构进度。 ### Fixed - **Grok preset effort catalog**: Amux / Yun presets use the official 4.6 enum (`low` / `medium` / `high` / `xhigh`, default Extra high). Legacy saved `max` ladders on those relays remap to `xhigh`. Blank custom channels still default to `max`. - **Changes accept/reject/restore path guard**: Accept / reject / restore never write file B using another file’s after-text. Hunk accept confirms drop-the-rest, caches the full after-text before write, and rebuilds the open diff so later hunks compose. All-dirty tabs refuse a new open instead of discarding unsaved buffers. Patch join keeps the source trailing-newline state. - **Remote IM empty / narrowed scope**: `{allow: []}` and out-of-scope bindings no longer spawn a turn (or fall back to `$HOME`). Telegram (and other channel) validate errors strip the request URL so bot tokens stay out of the settings panel. Only `/stop` / `/help` run inline on the pump so `/account` cannot block `/stop`. - **Memory clear fail-closed**: Workspace / all never fall back to `$HOME`; missing or non-directory cwd and unknown scope return an error (new i18n toast) and do not spawn the CLI. - **Live Voice + dictation**: Overlay `voice://*` / `session://permission` listeners survive parent re-renders and unregister on close. Dictation auto-send follows `commit.kind === "send"` without a `setDraft` side-effect. - **X status ids + wallpaper**: Status ids come only from pathname `status|statuses/` (TS + Rust). Query / fragment / `ftp:` / spoofed hosts are not verified. Library delete confirms via GlassModal; search/imagine over-budget kills the child. - **Workbench dirty / deep-link**: ⌘W and bulk close honor dirty confirm. `path:line` keeps line/column. `..` segments are rejected. Unknown project is not default-trusted. - **Effort + session core**: Official `high`→`xhigh` also migrates matching session/project rows under a new flag. Switching to a catalog without `xhigh` persists and resolves a clamped effort. Heatmap `local_usage` is off the async thread and skips old sessions. Tool `Permission denied` is not a hard-end error. Custom-route + shared mode self-heals. `append_message` load+save is atomic. AskUser clocks drop for every session on invalidate/clear. - **Settings / workflows cleanup**: Stale provider-test epoch dropped; unknown provider keys preserved; empty key not sent as `Bearer `; abandoned plan `closed_rpc_id` set; goal “clear local timeline” is per-session; doctor export cleans temp + kills on timeout; stop-all re-enumerates busy set; duplicate task-tree ids fail closed; Workflows native `