github zhukunpenglinyutong/jetbrains-cc-gui v0.5.8

3 hours ago

English:

✨ Features

  • Add xhigh reasoning 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 typed session/set_config_option option before every prompt — the persisted value is read back and verified — instead of setting the GROK_REASONING_EFFORT process 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 (MessageList caches 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 MutationObserver version replaces the innerHTML snapshot, 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 its aria roles, 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 strictMcpConfig and 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 at debug and truncated to 200 characters, so streamed chunks and the generated message no longer flood and duplicate into idea.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 KEYUP and forwards the clipboard image, an AWT-level fallback covers IDE-level paths, non-BufferedImage clipboard payloads (MultiResolutionCachedImage) are converted instead of throwing ClassCastException, 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-6 is still served by the API but sat in the retired-model migration table, so a custom model with that id was silently rewritten to claude-opus-5 and the dropdown checked both rows at once; the id is out of the table, custom models are tagged isCustom and are never alias-migrated on selection, restore or backend callbacks (normalizeClaudeModelId now takes the custom id set, Java gained setModelVerbatim), 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: mapModelIdToSdkName returned aliases like opus, which can only resolve through ANTHROPIC_DEFAULT_OPUS_MODEL — a variable the webview-controlled settings override deliberately blanks — so requests silently fell back to the CLI's default Opus; the new resolveSdkModelName prefers the resolved exact id (including provider mappings such as MiniMax-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-id with "Unknown option", while --continue binds 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 useEffectEvent kept 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 to git@host:repo.git or user@example.com and 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

Full Changelog: v0.5.7...v0.5.8

Don't miss a new jetbrains-cc-gui release

NewReleases is sending notifications on new releases.