English:
✨ Features
- Add
xhighreasoning effort to the Grok CLI: the reasoning selector offers low/medium/high/xhigh for Grok, and the level is now applied to the live ACP session through the typedsession/set_config_optionoption before every prompt — the persisted value is read back and verified — instead of setting theGROK_REASONING_EFFORTprocess variable, which the CLI's session leader ignores for resumed and warm sessions (by @D-Jancy, @zhukunpenglinyutong)
🔧 Improvements
- Stop text streaming from redoing the whole transcript's work, the largest part of this release: tool results are now looked up in one session-scoped map backed by a weak-reference cache over raw messages, so a delta appended to the last message no longer invalidates historical tool consumers or re-renders history (
MessageListcaches each message's tool-result signature, taking history signature extraction from 31 per burst to 1); a text-only burst no longer rebuilds the file-changes ledger or touches storage (30 text updates: ledger rebuilds 30→0, storage reads 90→0, writes 30→0); the Java side coalesces full-message materialization on a ~33 ms window without delaying delta notifications; and the transport snapshot is captured once inside the message lock and reused, copying only messages whose content actually changed (200 messages plus 30 results: captured copies 6,665→230) (by @zhukunpenglinyutong) - Ship only the divergent tail of the transcript: incremental delivery is no longer gated on conversation length (the old 300-message threshold and 64-message tail are gone) — the coalescer finds the first index where the new snapshot diverges from the delivered one and pushes the suffix from that point, so a 50-message session with a 300k-character transcript pushes a few KB per update instead of the full transcript; payloads over 200k characters coalesce harder, and each snapshot is built once inside the lock (by @zhukunpenglinyutong)
- Cache Codex history pages in a bounded, file-backed turn index: a 1,000-turn session parses its source records once instead of per page (three pages: parsed source records 6,000→2,000, bytes fed to the parser 623,340→207,780), tool calls and results stay linked across pages and appends, and the existing
totalTurns/fromTurn/toTurn/cursor semantics are unchanged; over budget (200,000 offsets / 64 MiB per session, two sessions per injector) it falls back to the previous streaming full scan, and stale or superseded loads never publish (by @zhukunpenglinyutong) - Read Codex transcripts incrementally during tool replay: byte offsets, UTF-8 decoder carry-over and half-line handling stop an unchanged transcript from being re-read in full (30 non-growing updates: body bytes read 2,107,650→0), while same-inode rewrites and truncated tails are still detected and rebuilt (by @zhukunpenglinyutong)
- Coalesce streaming code highlighting: an unclosed fence highlights at most every 150 ms and refreshes immediately when the fence closes or the stream ends, so a growing long block no longer highlights on every token (300-line code plus 30 increments: highlight calls 31→2); the final content and clipboard copies always read the latest code and never wait for that window (by @zhukunpenglinyutong)
- Stop serializing long drafts just to validate the input cache: a
MutationObserverversion replaces theinnerHTMLsnapshot, so reading a ~100k-character draft performs no HTML serialization at all (120→0) and each content version is extracted once — equal-length replacements, file tags, newlines and selection are all preserved (by @zhukunpenglinyutong) - Virtualize the Read tool group: only the visible rows plus overscan exist in the DOM (a 1,000-row group mounts ~9 rows), with fixed 28px rows, keyboard focus that can move beyond the window, bottom-follow that does not jump on middle appends, and scroll position restored on collapse/expand (by @zhukunpenglinyutong)
- Replace the settings' native
<select>with a shared in-page listbox (ListboxSelect): the native popup is a separate CEF window that JCEF fails to create on the first browser instance after a fresh install (the first click is swallowed until an IDE restart) and any CSS zoom on an ancestor dismisses it; the DOM listbox keeps options inside the page, measures before paint so the menu never flashes on the wrong side, and keeps itsariaroles,Escape-to-close-and-refocus behavior and external<label htmlFor>wiring — adopted by the language, font size, UI font, code font and diff theme controls (by @zhukunpenglinyutong) - Skip the MCP bootstrap when generating a commit message: the Agent SDK fallback now uses
strictMcpConfigand passes no MCP servers, so booting the user's configured MCP servers no longer precedes the first streamed token (measured ~12s → ~0.5s on a typical config) (by @zhukunpenglinyutong) - Quiet the logs on hot paths: config reads that ran many times per second are now
debug; the invalid-skill-name warning is emitted once per file instead of on every scan (44 lines in a single second were observed); and the commit-message child process' stdout is logged atdebugand truncated to 200 characters, so streamed chunks and the generated message no longer flood and duplicate intoidea.log(by @zhukunpenglinyutong)
🐛 Fixes
- Restore image paste on macOS 27, where Cmd+V is swallowed before reaching CEF while the JCEF webview (OSR) has focus: a CEF keyboard hook detects the orphaned Cmd+V
KEYUPand forwards the clipboard image, an AWT-level fallback covers IDE-level paths, non-BufferedImageclipboard payloads (MultiResolutionCachedImage) are converted instead of throwingClassCastException, and the same image delivered by both the DOM paste and a Java producer is attached only once (1-second replay window plus byte comparison) (by @gumupaier, @zhukunpenglinyutong) - Send user-defined Claude model ids verbatim:
claude-opus-4-6is still served by the API but sat in the retired-model migration table, so a custom model with that id was silently rewritten toclaude-opus-5and the dropdown checked both rows at once; the id is out of the table, custom models are taggedisCustomand are never alias-migrated on selection, restore or backend callbacks (normalizeClaudeModelIdnow takes the custom id set, Java gainedsetModelVerbatim), and a custom entry whose id really is retired is labelled with a "Retired" badge explaining that it is still forwarded as-is (by @changshunxu520, @zhukunpenglinyutong) - Pass the exact model id to the Claude SDK instead of the family alias:
mapModelIdToSdkNamereturned aliases likeopus, which can only resolve throughANTHROPIC_DEFAULT_OPUS_MODEL— a variable the webview-controlled settings override deliberately blanks — so requests silently fell back to the CLI's default Opus; the newresolveSdkModelNameprefers the resolved exact id (including provider mappings such asMiniMax-M2.5) and is used by messages, attachments, persistent queries, commit messages and the prompt enhancer (by @changshunxu520, @zhukunpenglinyutong) - Resume the exact pi session: multi-turn pi conversations now pass
--session <id>— newer builds reject--session-idwith "Unknown option", while--continuebinds to the cwd's most recent session, i.e. the wrong conversation whenever several share a project (by @Cyber0xFE, @zhukunpenglinyutong) - Let CLI providers send while the Claude/Codex SDK check is still running: the input box and the sender only wait on that query when the provider is not installed, the "Checking SDK status…" bar hides for an installed CLI, and Enter now calls the latest submit handler (the committed
useEffectEventkept the first one, which still saw a loading status and toasted instead of sending) (by @toxeh) - Keep
@-addresses intact when linkifying file references: an@glued to a word character belongs togit@host:repo.gitoruser@example.comand is no longer collapsed into its last path segment (by @Cyber0xFE) - Do not cap a Codex request at 2 hours: only ten minutes without any output counts as a hang, so long refactors, full test suites and long agent chains are no longer killed mid-work (by @zhukunpenglinyutong)
- Keep the centered provider menu centered while it enters: the shared dropdown keyframes drop the trigger's inline
translateX(-50%), so the centered menu jumped half a width sideways when the animation ended; a dedicated centered keyframe (disabled under reduced motion) fixes it (by @zhukunpenglinyutong)
中文:
✨ 新功能
- Grok CLI 新增
xhigh推理强度:Grok 的推理强度选择器现在提供 low/medium/high/xhigh,并且强度改为在每次提问前通过 ACP 的session/set_config_option应用到活动会话(写入后回读并校验实际值),不再设置GROK_REASONING_EFFORT进程变量——该变量对续接和复用中的会话不起作用(by @D-Jancy、@zhukunpenglinyutong)
🔧 优化
- 文字流式输出不再触发整段对话的重复计算(本次发布最主要的改动):工具结果改由「会话级映射 + raw 消息弱引用缓存」统一查找,追加到末条消息的增量不再让历史工具消费方失效、也不再重渲染历史(
MessageList为每条消息缓存工具结果签名,历史签名提取由 31 次/批降为 1 次);纯文字更新不再重建文件变更账本、也不再读写存储(30 次文字更新:账本重建 30→0,存储读 90→0、写 30→0);Java 侧把「全文物化」按约 33ms 合并但不推迟增量通知;传输快照在消息锁内捕获一次并复用,只复制内容确实变化的消息(200 条消息 + 30 个结果:复制捕获 6,665→230)(by @zhukunpenglinyutong) - 只下发「发生分歧的尾部」:增量下发不再由对话长度决定(旧的 300 条消息阈值与 64 条尾部传输已移除)——合并器找到新快照与已投递快照的第一个分歧下标,并从该处开始下发后缀,因此 50 条消息、30 万字符的会话每次只推送几 KB 而不是整段对话;超过 20 万字符的负载进一步加大合并间隔,每个快照在锁内只构建一次(by @zhukunpenglinyutong)
- Codex 历史分页改用有界、临时文件支撑的轮次索引并缓存:1,000 个回合的会话只需解析一次源记录,而不是每页重扫(取三页:源记录解析 6,000→2,000,送入解析器的字节 623,340→207,780);工具调用与结果能跨页、跨追加保持关联,
totalTurns/fromTurn/toTurn/游标语义保持不变;超出预算(每会话 200,000 条偏移 / 64 MiB,每个 injector 两个会话)时回退到原有流式全扫描;过期或已被取代的加载不会发布结果(by @zhukunpenglinyutong) - 工具回放时增量读取 Codex 会话记录:通过字节偏移、UTF-8 解码残留与半行处理,未增长的会话不再被反复全文读取(30 次未增长更新:正文读取 2,107,650→0 字节),同时仍能识别同 inode 重写与截断尾部并重建(by @zhukunpenglinyutong)
- 合并流式代码高亮:未闭合的代码围栏最多每 150ms 高亮一次,围栏闭合或流结束时立即刷新,长代码块不再每来一个 token 就高亮一次(300 行初始代码 + 30 次增量:高亮调用 31→2);最终内容与复制始终读取最新代码,不受该窗口影响(by @zhukunpenglinyutong)
- 不再为了校验输入缓存而序列化长草稿:用
MutationObserver版本号替代innerHTML快照,读取约 10 万字符草稿不再产生任何 HTML 序列化(120→0),每个内容版本只提取一次,并保留等长替换、文件标签、换行与选区行为(by @zhukunpenglinyutong) - Read 工具组改为虚拟滚动:只有可视行与 overscan 会挂载到 DOM(1,000 条只挂载约 9 条),行高固定 28px,键盘焦点可跨窗口移动,中部追加不会跳动,折叠/展开后恢复滚动位置(by @zhukunpenglinyutong)
- 设置页的原生
<select>换成共享的页内列表(ListboxSelect):原生下拉弹层是独立的 CEF 窗口,全新安装后第一个浏览器实例上 JCEF 无法创建(首次点击被吞掉,必须重启 IDE 才能恢复),且祖先节点上的 CSS zoom 会把它关掉;DOM 列表把选项留在页面内,绘制前先测量以避免菜单闪在错误的一侧,并保留aria角色、Escape关闭并回焦、外部<label htmlFor>关联等行为——语言、字号、界面字体、代码字体、Diff 主题控件均已切换(by @zhukunpenglinyutong) - 生成提交信息时跳过 MCP 启动:Agent SDK 兜底路径改为
strictMcpConfig且不传入任何 MCP server,用户配置的 MCP server 不再抢在第一个流式 token 之前启动(典型配置实测约 12s → 约 0.5s)(by @zhukunpenglinyutong) - 降低热点路径的日志噪音:每秒被读取多次的配置读取降为
debug;技能名校验失败的告警改为「每个文件只报一次」(实测曾在一秒内刷出 44 行);提交信息子进程的 stdout 改为debug并截断到 200 字符,流式分片与生成结果不再刷屏、也不再重复写进idea.log(by @zhukunpenglinyutong)
🐛 修复
- 修复 macOS 27 上图片粘贴失效:当 JCEF webview(OSR)获得焦点时,Cmd+V 会在到达 CEF 之前被系统吞掉,只留下一个孤立的
KEYUP;新增的 CEF 键盘钩子据此识别并转发剪贴板图片,AWT 层兜底覆盖 IDE 级路径,非BufferedImage的剪贴板数据(MultiResolutionCachedImage)会被转换而不是抛ClassCastException,同一张图片同时被 DOM 粘贴与 Java 生产者投递时只作为附件加入一次(1 秒重放窗口 + 字节比较)(by @gumupaier、@zhukunpenglinyutong) - 用户自定义的 Claude 模型 ID 一律原样发送:
claude-opus-4-6官方 API 仍在提供服务,却被放进了「已下线模型迁移表」,导致使用该 ID 的自定义模型被静默改写成claude-opus-5、下拉列表里同时勾选两行;现在该 ID 已从迁移表移除,自定义模型会带上isCustom标记,在选择、恢复与后端回调路径上都不再被别名迁移(normalizeClaudeModelId接收自定义 ID 集合,Java 侧新增setModelVerbatim);若自定义 ID 确实已下线,会在下拉项上显示「已下线」标签并说明仍会原样发送(by @changshunxu520、@zhukunpenglinyutong) - 向 Claude SDK 传递精确模型 ID 而不是族别名:
mapModelIdToSdkName会返回如opus的别名,而该别名只能通过ANTHROPIC_DEFAULT_OPUS_MODEL解析——而 webview 托管的设置覆盖会刻意清空这个变量——于是请求会静默回落到 CLI 的默认 Opus;新增的resolveSdkModelName优先使用解析后的精确 ID(包括MiniMax-M2.5这类 Provider 映射),消息、附件、常驻查询、提交信息与提示词增强均已接入(by @changshunxu520、@zhukunpenglinyutong) - 恢复精确的 pi 会话:多轮 pi 对话改为传
--session <id>——较新的构建会以 "Unknown option" 拒绝--session-id,而--continue只会绑定到当前目录下最近的会话,同一项目里有多个对话时会接错(by @Cyber0xFE、@zhukunpenglinyutong) - CLI Provider 不再等待 Claude/Codex SDK 检查:输入框与发送流程只在 Provider 未安装时才等待 SDK 查询,「正在检查 SDK 状态…」状态条对已安装的 CLI 不再显示,Enter 也改为调用最新的提交处理器(此前提交过的
useEffectEvent会保留首个处理器,它看到的仍是加载中状态,于是只弹 toast 不发送)(by @toxeh) - 链接化文件引用时不再破坏
@地址:紧跟在单词字符后的@属于git@host:repo.git或user@example.com的一部分,不再被折叠成最后一段路径(by @Cyber0xFE) - Codex 请求不再有 2 小时总时长上限:只有连续 10 分钟无任何输出才算卡死,长时间重构、完整测试套件与长代理链不会在中途被中断(by @zhukunpenglinyutong)
- 居中显示的 Provider 菜单在入场动画期间不再偏移:共享的下拉动画关键帧会丢掉触发器上的内联
translateX(-50%),导致居中的菜单在动画结束时横向跳半个宽度;新增专用居中关键帧(并在「减少动态效果」下禁用动画)修复(by @zhukunpenglinyutong)
What's Changed
- fix(model): keep custom Claude model ids verbatim and pass exact model id to the SDK by @changshunxu520 in #1880
- fix(pi): 用 --continue 替代 --session-id 修复 Pi Agent 多轮会话失败 by @Cyber0xFE in #1865
- fix: restore Ctrl+V/Cmd+V clipboard image paste on macOS 27 by @gumupaier in #1872
- feat: grok-cli增加xhigh思考强度 by @D-Jancy in #1784
- fix(webview): 修复字体档位缩放模糊 by @yibeiqingke in #1885
- fix(webview): @ 文件引用不再截断 git 地址与邮箱地址 by @Cyber0xFE in #1889
- fix(chat): let CLI providers send while SDK status is still loading by @toxeh in #1888
- fix: keep the live prefix when a paginated Claude reload arrives by @gadfly3173 in #1892
- Feature/v0.5.8 by @zhukunpenglinyutong in #1884
New Contributors
- @gumupaier made their first contribution in #1872
- @D-Jancy made their first contribution in #1784
Full Changelog: v0.5.7...v0.5.8