Skip to content

v2.2.5

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Sep 02:50

新增

启动失败不再是一片白屏

  • 主进程在 registerIpc() 之前抛错时,窗口已经建出来了,而闸门永远不会放行 —— 此前用户看到的是一整窗空白,界面上一个错都不报,唯一的线索是终端里那行 [app] 启动流程失败:。现在同一条异常经 announceStartupFailure 推给首屏:一屏说明、一个「打开数据目录」的入口,以及可复制的原始诊断(含堆栈)
  • 等待完整 IPC 超过 15 秒同样切到诊断页,而不是继续伪装成「正在加载」;等待期间画的是首屏骨架,不再是留白。诊断页只在 ipcReady 还没盖上时出现 —— 已经能用的 App 不会因为一个后台服务的失败被反过来卸载掉
  • Windows/Linux 没有原生标题栏,启动骨架与诊断页也必须能拖动、最小化、关闭:窗口控制随迁移频道一起提前登记,并在完整 registerIpc() 里跳过,避免同一条频道被监听两次(一次点击执行两遍)

邀请海报:一键存成 PNG 发出去

  • 奖励中心新增「保存邀请海报」,按你自己的邀请码生成一张 1920×1080 的海报(二维码、邀请码、三条卖点),点一下走系统保存对话框落盘
  • 二维码里编的是邀请链接本身(…/login?ref=<码>)而不是邀请码文本:编错内容的症状是朋友确实注册了、双方却谁都拿不到奖励,而且全程零报错
  • 海报文案跟着界面语言走(切英文再存一张就是英文海报),版式判断留在纯函数里、由单测钉住;新增 app:saveImageFile 频道,和文本保存分开 —— 合并成一条会逼每个调用点带一个「这次是文本还是二进制」的参数,传错一次就写出一个内容是 base64 的 .png,打开之前看不出来

更新说明按 Markdown 渲染

  • 「关于 › 更新说明」此前把 CHANGELOG 截下来的那段原文当纯文本铺开,界面上直接出现 ### 改动**加粗**。现在按 Markdown 渲染,而 markdown 那一坨(streamdown + katex + mermaid,单独一个 chunk 约 1.0MB)是点开弹窗时才拉的:设置浮层是静态依赖,从这里静态引它等于把它拽回主 bundle
  • 拉取期间先按纯文本铺开、到了才换成渲染版:慢盘上先看到的是能读的文字,而不是一个「更新说明是空的」的空弹窗

应用内奖励中心,邀请好友不再跳浏览器

  • 账户菜单里的「邀请好友」改成应用内的全屏浮层:横幅、邀请链接与邀请码(可复制、可在浏览器打开)、累计统计,以及邀请记录 / 奖励记录两张表;右上角关闭、Esc 关闭、标题旁刷新
  • 邀请链接在主进程拼成绝对地址,渲染层不再持有站点常量;取数失败分成「未登录 / 服务端还没开放(404)/ 网络错误」三种,平台没部署该接口时给的是「还没开放」而不是「网络错误」
  • 横幅素材深浅各一张,跟随主题切换;奖励任务一栏暂为固定空态(拆除条件写在该组件的文件头)

模型目录

  • 收录 Grok 4.7(500K 上下文;定价按产品方确认与 4.6 一致,4.7 目前还没有独立的 LiteLLM/OpenRouter 条目)与小米 MiMo V2.6 系列(Pro / Flash / Pro UltraSpeed)
  • 插件菜单图标补上 tv / film / music / gamepad:网页应用类插件此前只能挂一个拼图块

改动

  • 「默认模型 / 默认子代理」从「模型」页搬到「通用 → Agent」:它们和 AI 审核模型、目标判定模型同属「Agent 用哪个模型」这一类问题,原先挤在供应商列表那条 236px 窄列的 footer 里,和「配权限/审核模型」不是同一次心智动作。同时把两级弹层选择器抽成 ProviderModelMenu,输入框与设置页共用一套「先选供应商、再选这一家的模型」的交互(子菜单定位、视口翻转、跟随滚动重新量高那套逻辑抄第二份的代价是「面板飞到屏幕外」,且不报错)
  • 工作区(过程段)默认收起:此前「本轮有过失败工具调用」会默认展开,而后台任务(如更新检查抓取失败)会让这个条件永久成立 —— 表现为每次打开会话「用时」面板都是展开的。用户要看失败细节点开一次就行
  • 账户菜单与侧边栏里「积分余额」的文案统一成「余额」

修复

Windows 上密码认证永远失败——密码是对的

  • OpenSSH 只肯把 SSH_ASKPASS 指向一个 exe(CreateProcessW 起不了 .cmd#! 脚本),而打包形态的入口就是 Electron 本体:它启动时先往 stdout 写一个换行,而 ssh 只取 stdout 的第一行(readpass.c),于是用户看到的是「密码明明是对的却一直认证失败」,没有任何一条错误提到 askpass。现在 helper 是同一个 exe 的 node 形态(ELECTRON_RUN_AS_NODE=1 + 一份生成的脚本),因此打包配置里 runAsNode fuse 必须是 true —— 关掉它就会退回带 Chromium 的 GUI 形态,上面那条症状原样复现
  • 同一个原因还有第二个坑:GUI 形态会去抢主窗口的 Chromium profile,第二个实例卡在 profile 上,表现为连接一直转圈到超时;helper 因此还带了自己的 --user-data-dir
  • ELECTRON_RUN_AS_NODE 是本仓库「拒绝透传 Node/Electron 注入开关」这条规则上唯一的例外,而且只对调用方显式传入的 overrides 放开(继承环境里来的那份照旧丢掉),NODE_OPTIONS 依旧全封
  • 断开连接时清理临时目录失败不再让整条断开链路失败:Windows 上 GUI 兜底形态留下的 profile 会握着句柄,force 也删不掉,而从这里抛出去的错会变成「断不开连接」

任务清单:模型丢掉一项,界面上看不出来

  • TodoWrite 每轮发的是完整清单,所以一张接一张的卡片看上去几乎一样。现在回执里带上「上次 → 这次」的增量,并把被丢掉的项逐条点名回显给模型 —— 前后两份清单各自都自洽,「任务凭空消失」此前只能靠用户自己发现
  • 消息里的清单卡片改成「先报这次更新改了什么,完整清单收在折叠里」:新增/移除/刚完成/刚开始各报一次数,没有变化的那一档不报(四条都写「0 项」等于没说)。清单本体仍与输入框上方那条共用同一份行渲染,两份不会分叉
  • 上一份清单从本 run 的转录里取(不新存一份状态,todo.ts 那条「完全无状态」的设计不动),并且按 callId 查「这次调用之前那份」而不是全局最新那份;工具名从注册表查(撞名时外部名带哈希后缀,写字面量会静默取不到任何东西)。TodoItem / MARK / latestTodosFrom / 新增的 todoPlan 一并下沉到 shared/agent/todo.ts —— 渲染层要用它们,而渲染层 import src/main/** 是禁止的

文档

  • 新增 README.md(英文)与 README.zh-CN.md:功能面、下载、开发与验证命令、目录结构、插件开发入口
  • 补上 LICENSE(Apache-2.0),package.json 同步声明 license —— 仓库此前对外可见却没有许可证文件

测试

  • 新增:任务清单增量(todoPlan 的新增/移除/完成/开始、顺序变化不算变化、重复内容一对一消耗、不知道上一份时四个字段全空)、按 callId 回溯历史清单(被拒绝的那次与还没有回执的那次都不更新「上一份」)、消息里那张卡片(收起态、丢项单独列出、只标本次变更的行、没有上下文时说「不知道」而不是「无变化」)、清单默认折叠、更新说明的 Markdown 渲染与「关着时不拉 chunk」
  • 新增:Windows askpass helper 脚本按 ssh 的调法真跑一遍(断言 stdout 整串相等 —— 多写一个字节就是「密码不对」),以及取消时以非 0 退出而不是送一个空密码
  • 新增:邀请海报(二维码编的是邀请链接本身、模块不越界、文案全部来自外部传入、XML 转义、超出三条就丢掉而不是溢出、文件名里保留邀请码)
  • 完整套件 5790 项全部通过(23 skipped);npm run typechecknpm run lint 通过(0 error,4 个既有 any warning)