新增
启动失败不再是一片白屏
- 主进程在
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+ 一份生成的脚本),因此打包配置里runAsNodefuse 必须是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—— 渲染层要用它们,而渲染层 importsrc/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 typecheck与npm run lint通过(0 error,4 个既有 any warning)