新增
多账号:一家供应商挂一串身份,限流了自己换号
- OAuth 供应商(Codex/Kimi/GLM…)下可以挂多个登录身份:账号元数据落新表
provider_accounts,密文仍只住credentials—— 此前「限流了就换个号」在数据模型上无法表达:一家供应商只有一个槽 - 选号是固定顺序取第一个可用的,靠前的先用;限流落双闸门:进程内秒级 + 落库的分钟级(重启后仍在),上游给了
Retry-After就听上游,没给兜底 5 分钟。换号不消耗重试次数,上限 8 次只是死循环保险;401 永不算配额失败 —— 真失效的 token 被认成限流,界面会说「1 小时后恢复」而它永远不会恢复 - Codex 的 5 小时/本周额度从已经发生的对话请求的响应头里搭便车读,不发探针、不后台轮询;额度跑满时提前落闸到重置时刻,不等那次注定失败的 429。没有快照时界面写「尚未获取,发一条消息后更新」,不画 0%
- 设置 › 模型的供应商页新增账号列表:状态徽章(可用/限流中/登录已失效/已停用)、恢复倒计时、设为当前/启停/重命名/删除/上下移动,Codex 另画两条额度条(≥90% 转告警色,超过 24 小时标「N 小时前的数据」);列表变化经
provider:accountsChanged推整份,不用关了重开设置页 - 设置 › 连接 › 网关新增「账号自动切换」开关(出厂开启),刻意不跟网关开关联动 —— 网关默认关,跟着置灰会让多账号在绝大多数用户那里默默失效,而界面上几个号都显示「可用」
- 账号随备份包与云同步走:云同步只在挂了 ≥2 个账号时才写 accounts 段(旧版本客户端对未知顶层键是拒绝的,出现该键会让旧设备把整份 providers 文档判无效);限流闸门与额度快照不出门 —— 那是这台机器那一刻观察到的上游状态,带过去会让另一台机器上一个好账号显示「限流中 · 还有 3 小时」
- 「退出登录」语义变为退出当前账号,其余按顺序顶上;旧槽
provider:<id>保留为「当前账号的镜像」,降级旧版本仍显示已登录 - 新增
provider:listAccounts/addAccount/reauthAccount/removeAccount/setAccountEnabled/setAccountLabel/setCurrentAccount/reorderAccounts/clearAccountLimit九条频道与provider:accountsChanged事件;写操作一律回整份列表、不回增量 —— 增量在连点两次时会出现「写成功但列表还是旧顺序」
「打开方式」:用本机装的 IDE / 终端 / 文件管理器打开文件
- 四处入口:文档工具条、文件树
…菜单、改动审查卡的文件行、图片灯箱(仅磁盘绝对路径,data:与ncw://不认);远端工作区一律不画 - 探测按平台分路:macOS 扫 6 个应用目录(含 JetBrains Toolbox / Setapp)再退到 PATH 上的 CLI;Windows 先注册表 App Paths 再 PATH,带安装根目录兜底(用户级安装恰好落在
%LOCALAPPDATA%\Programs);Linux 只查 PATH。覆盖 15 个 IDE + 按平台排序的终端列表 + 文件管理器,菜单顺序按固定优先级排,不随探测顺序漂 - 图标取自 simple-icons(CC0)单色字形,内联而非
<img>;图标 id 是闭合联合 —— 加一个 IDE 忘配字形编译期就挂,而不是界面上一排空白图标 - 只认我们列得出的编辑器,不问系统「这个文件类型的默认关联是谁」:那会把「用什么写代码」交给一个不知何时被改过的关联,而这张表可以逐行读完、可以写测试。返回项只含
{ id, label, icon },绝对路径不进渲染层 - 目录上只留文件管理器 / 终端 / 复制路径 ——
code <目录>会把工作区根换掉;终端打开的是所在目录而不是文件,认文件参数的终端会把它当脚本跑。菜单顺序固定为 文件管理器 → 终端 → 编辑器,高频动作不藏在中间 - 探测结果缓存一次、失败不缓存:装完 IDE 不用重启应用才看得见;「复制路径」返回真正写进剪贴板的那串 —— 工作区外的文件「复制相对路径」实际得到的是绝对路径,界面若仍显示「已复制相对路径」,用户粘到别处才发现不对
- 新增
workspace:listOpenTargets/workspace:openWith/workspace:copyPath三条频道
上下文压缩做了什么,点开压缩分隔线就看见
- 分隔线与顶部检查点面板共用一张三页卡:摘要(可编辑,机械压缩只读)/ 摘要输入(真正发给摘要模型的原文)/ 压缩后上下文(逐条标明 原文/已折叠/提要/摘要 + token 数);顶部统计折叠 N 条、清空 N 处工具输出、移出上下文 N 条、摘要省略 N 条 —— 折叠与丢弃分开数,前者工具输出被清空、骨架还在,后者真的不再发给模型,合成一句会让用户以为追问一下模型还能想起来
- 检查点新增
detail列,可空且不回填:老检查点没有这份事实就一个数都不画,画一排 0 等于断言「一条都没丢」 - 第三页切到时才拉
context:window(主进程重投影整段转录),它是按当前转录重算的、不是压缩当时的录像,界面照实说
工具行换了一套呈现,终端与命中清单各有各的卡
- 工具卡标题从「拼好一句话」改成 label/target/context 结构化三格 + 可选 stats:原先目录、文件类型、命令原文在拼接那一刻就丢了,渲染层想分色只能反向切字符串。
Edit/Write给出+7 −1(Write 只在新建时报,覆写时旧内容不在入参里,硬报−0是假的);图标按文件类型走,运行中/失败时丢掉文件自带颜色 - Bash 展开是终端卡:输出不折行、横向滚动(
ls -l折行就散了),命令折行,stdout/stderr 分色,<stdout>信封标签不出现;失败说明单独一行,不混进输出 - Grep/Glob 展开是命中清单:文件名可点开、行号压暗;认不出形状的行原样留着 —— 丢一行命中,用户会以为搜索漏了
- run 结束、工具组自动收起时正文不再往上蹿:折叠前记锚点,400ms 内逐帧回补
scrollTop(三条中止条件各对应一种「不该由我们写 scrollTop」的场景);先让人看清完成态(✓、耗时)再收
浏览器与内置浏览器工具支持 file://
- 地址栏直接粘本地路径就能开;解析、回写、外部打开三处判据收进
address.ts纯函数 —— 此前各写各的/^https?:\/\//,漏掉回写那处的症状是页面跳转后地址栏停在旧地址、且 Tab 标题不再跟随。javascript:/data:/ncw://一律不认 file://只给浏览器工具(ssrf新增allowFileUrls,凭证拦截不受任何开关影响);WebFetch与内置搜索不给,window.open一律只把 http(s) 交给系统浏览器 ——openExternal('file://…')等于用默认应用打开任意本地路径- 地址填错给「请输入有效的 http / https / file 地址」,不再混进通用 catch 显示成「操作失败」(那看起来像浏览器坏了)
模型目录
- 收录 Claude Opus 5.5(1M 上下文;缓存读 0.05× 输入,全表第三条「缓存读 ≠ 0.1× 输入」的例外)与 GPT-6 Sol / Luna(1,050,000 上下文,272K 双档定价)
- 豆包 2.1 Pro 换 260915:窗口 262,144 → 1,048,576,价 ¥6/30 → ¥3/15;新增 2.1 Lite(¥0.8/2.7);Turbo 退役,其别名故意不挂到 Lite —— 挂上去等于用 Lite 的窗口和价格替一款退役模型作答
- 新增 Seedream / Seedance 共 11 条目录条目(按张/秒计费,
TokenRates表达不了,价目显示「—」) - 侧边栏品牌行右侧新增应用版本号
改动
- 两套 diff 实现合成一套:工具卡(自己算 LCS + 词级高亮)与 Git 面板(解析
git diff文本)此前各有一份行底色、行号栏宽度、换行策略,改一处的 bug 永远漏掉另一处;现在两个生产者产出同一份DiffLine[]交唯一渲染组件,Git 面板那侧顺带补上语法高亮(动态 import、超 10 万字符 / 4000 行不高亮、一次只跑一个,首帧不等解析) - markdown 围栏与详情卡共用一张代码卡(
components/code):复制、折行开关、反馈复位只有一份;mermaid 预览路径不变,详情区原先用<pre>画的 read/mutate/network 输出也走这张卡 - Surface 改无边框文本风格:删掉
tone/rail/dashed,新增 21px 缩进 —— 无边框后缩进是「这几行属于上一行」的唯一证据;插件侧 API 同步换导出,还传旧参数会编译报错(有意:留着不生效的参数更难排查) - 右/底部 dock 边补 280ms 开合动画,侧边栏与两条 dock 边共用同一个时长
Bash的description在工具说明里标成必填,但 schema 给默认空串而非.min(1)—— 挂.min(1)的症状是正在跑的旧会话下一条命令直接Invalid arguments;空串时状态行回落到命令前 80 字- 工具详情的 label 改为可选(展开区是用户主动点开的),失败那一档保留标题 —— 红字能说明「出事了」,但说不清「这段是错误而不是输出」
修复
上下文压缩的两处「模型失忆」
- digest 超预算时从最早侧整条丢,而检查点一律把覆盖锚点写成转录最后一条 → 那些消息既没进摘要又被当「已覆盖」裁掉,模型对中间一段完全失忆、摘要只字未提、全程零报错。现在
compactionDigest返回缺口起点,两道覆盖上界一起守 - 摘要切点判据过严,两头都出错:单条 user + 长工具链会话恒返回 0(摘要只加不减,占用不降反升);混合消息
[tool_result, 插话文本]又被误判成合法切点(留孤儿回执 → 下一轮 400)。改判「自身不带 tool_result 即可当切点」,并新增只在机械压缩榨不出东西时才打开的丢弃路径:丢掉最早一段、原位留一条[context-window trim]提要,否则模型从头再来一遍、连「我调用过 bash」都看不见
Codex 登录第二天刷新失败(403)
- 换 token 与刷新两跳都要带
codex_cli_rs/0.154.0:只写换码那一跳会漏掉刷新,症状是能登录、第二天刷新 403,而错误信息里不会出现任何头名。版本号写死一个真实存在过的值 —— 编一个不存在的版本号是赌上游不做白名单,赌输是一个不解释原因的 403
死订阅者每次 flush 刷一屏栈
- Electron 44 的
WebContents.send自己 try/catch 后console.error,外层 catch 接不到;注册表改成发之前先问帧还活着没,destroyed事件用WeakSet去重(⌘R 重载会重复 register →MaxListenersExceededWarning)
测试
- 新增:账号池(选择不看 current、关轮换不换号防死循环、401 永不算配额失败、闸门合并取更晚、存量迁移、导入导出隔离、云同步段)、编辑器探测(三平台分支、菜单顺序按优先级、返回值不含任何路径、终端参数是目录不是文件)、地址解析(
file://不被补成https://file…)、压缩详情(药丸、折叠/丢弃分列、缺口警告)、diff 语法高亮、终端信封与命中清单解析、ChatGPT issuer UA、窗口注册表 - 完整套件 6022 项通过(23 skipped);
typecheck与lint通过(0 error)