Skip to content

v3.7.6 版本发布

Choose a tag to compare

@smart-open smart-open released this 10 Oct 13:33
· 109 commits to main since this release

[3.7.6] · 2026-10-10 · 全面审查修复批:凭证刷新锁统一 + 整表互斥收口 + 前端交互加固

范围:自 [3.7.4] 以来的全部变更(含 [3.7.5]「OAuth 多设备凭证轮转 + 冷启动切换解死锁 + 同 uid 合并与证书指引批」),核心为 OAuth 多设备凭证轮转与同 uid 合并、WorkBuddy 冷启动切换解死锁、WB 凭证刷新锁体系统一、冷却/设备映射整表互斥收口与前端交互加固;实现细节、根因分析与过程记录见 git 提交历史。

新功能

  • OAuth 多设备凭证轮转(issue #76):服务端按 device_id 限制每设备账号绑定数,登录恒用首套本机凭证会撞上限。现登录会话从本机凭证集中按 device_map 绑定数确定性择优(同状态两次取参一致),登录 URL 参数、ExchangeToken DeviceProof、刷新交换全链路设备同源;登录成功后回写 device_map(无条目按 uid 派生补全,已有条目仅换 device_id 保留 market/session),JWT 自动刷新同样按账号绑定设备取凭证,账号均匀摊到多套本机设备凭证上。
  • 「无 Refresh」账号徽标:账号列表对缺 refresh_token 的账号(多为历史导入)显示灰徽标并给出恢复路径(对该账号重新执行一次 OAuth 登录即可自动更新),不再表现为「看起来正常但无法自动刷新」。
  • OAuth 同 uid 合并:同一服务端账号再次 OAuth 登录不再产生重复账号——按 uid 匹配直接更新已有账号的 JWT/refresh_token,登录弹窗、回环完成页、事件与提示全链路文案口径一致(「已更新其凭证,未新增账号」);登录时选择的分组对合并账号同样生效(此前仅新增账号应用分组,合并路径静默忽略)。
  • 证书手动导入指引:证书自动安装失败且 ca.cer 已生成时,引导卡片内直接展示三步手动导入(打开证书目录 → certmgr 导入「受信任的根证书颁发机构」→ 重新检测),配套新增「打开证书目录」入口;ca.cer 尚未生成(证书生成失败)时不弹指引、只保留真实报错;使用手册新增 8.4「手动导入证书」章节。

修复加强

  • WB 凭证刷新锁体系统一(网关 401 自愈接入):网关 401 刷新此前持独立锁,与签到/续期/积分刷新并发同一账号时互不约束——「后落库者覆盖先落库者」,服务端一次性轮换下 refresh_token 可能一并丢失被迫重登。现网关侧复用 tasks 侧每账号锁 + 跨进程命名互斥体,持锁后二次检查:他人已刷新落库(access 与本次失效凭证不同)直接复用新凭证不发网络请求;token store 表锁与 tasks 侧统一为一把,废除互不相干的独立锁。他方进程刷新中以忙态哨兵返回——网关本轮换号且不记 401 致命错误,防瞬时忙态被误判会话失效 → 账号被踢出轮转;对方刷新落库后下轮请求直接复用新凭证。
  • 冷却/设备映射整表读改写互斥:新增 account_cooldowns 与 device_map 两把表级锁,覆盖调度签到写冷却、手动清冷却、积分刷新自动解冻、OAuth 设备回写、签到取设备等全部运行期写点——此前整表 load→save 并发互相覆盖丢条目(已冷却账号被重新探测对上游连打;设备条目丢失致指纹漂移)。积分刷新自动解冻改两阶段回写:锁外扫描、锁内重读后仅移除与扫描时快照完全一致的条目,扫描窗口内新写入的冷却不被误清。
  • WorkBuddy 冷启动切换死锁解除(issue #78):目标账号从无快照且客户端已被旧账号占据时,旧链路「切换要快照 → 保存快照被守卫拒绝 → 旧账号不登出」循环打结。现切换预检发现目标槽缺失时,用 token store 凭证副本在既有壳模板上合成最小 authfile 快照(仅 auth 文件 + meta,槽位已存在绝不覆盖、合成结果自检 uid 不可读即放弃);确认切换成功后自动以客户端完整登录态升级该快照(best-effort,失败仅告警不阻塞)。同场景守卫拒绝文案改用统一分流话术,指向实际可行的操作。
  • WorkBuddy 合成快照切换加固(issue #78 后续审查):确认切换的期望 uid 回退链补会话暂存真实 uid——meta.json 写失败不阻塞合成的场景下原回退到槽名(池 id ≠ 真实 uid),三信号确认恒不命中、每次切换空转 30 秒;合成后切换未走完(进程退出/失败重试)跨会话重试同样能升级完整快照(槽位持久化 bootstrap 标记);壳模板仅存裸键 token 时身份改写补兜底——原实现插入新 accessToken 而旧裸键 token 残留,最坏客户端读到旧 token 切换无效。
  • 设备绑定上限错误可读化(issue #76):签到/状态巡检命中设备绑定上限错误时,不再倾倒原始文案,追加指引「对本账号重新执行一次 OAuth 登录即可自动轮换到其他本机设备凭证,或在 Trae 客户端解绑不再使用的账号」(中英文案特征词均识别)。
  • general_expire_times 持久化断链回归测试(issue #75):新增 save → load 持久化回路端到端测试,列名/字段不一致即刻失败,防网关通用积分到期口径(issue #28)再次断链。
  • 证书自动安装降级链:UAC 提权安装(HKLM Root)失败后依次 DACL 自愈 → 当前用户级安装(HKCU Root,免提权)→ Windows 根存储终检;PowerShell 不可用时给出明确报错与替代路径,不再笼统失败;指引内「重新检测」明确区分检测失败 / 未安装 / ca.cer 缺失(提示先重新执行安装)三种结果。
  • OAuth 回调设备选定去漂移:无在途会话的 fallback 设备改为回调入口一次性选定,AuthCode 交换与尾部 device_id 透传共用同一台——原实现两处独立选定,横跨分钟级网络交换的窗口内绑定数分布变化会让实际交换设备与 device_map 回写/刷新交换设备错配。
  • 前端统一 invoke 入口(超时 + 错误翻译):全库命令经唯一入口发出——120 秒竞速超时(后端仍在执行前端不再无限悬挂),长耗时命令按覆盖表放宽(多账号串行操作 10 分钟、安装包下载与证书安装不限时——后者 UAC 等待用户点击无上限);底层错误在源头翻译(剥 Error: 前缀、网络类错误转人话),全库 toast 文案自动受益。
  • 设置保存守卫:设置读取失败时 store 仅持默认值兜底,此时保存会把默认值整表写回覆盖服务端真实配置——守卫拒绝写入并提示重启恢复,不再静默丢配置。
  • 签到看门狗:事件通道丢帧时完成事件可能永不到达,「签到进行中」永久卡死、开始按钮永久禁用——15 分钟未收到任何进度事件自动解除并提示(迟到事件照常归约展示)。
  • 交互防重入批:Trae 账号页刷新/删除确认/行内操作(刷新 JWT、解除冷却)、概览页刷新、分组新建/删除补防连点与 loading 态——连点会逐账号重复打上游积分查询(易频控)、1 秒最小展示窗口内重复触发删除确认;分组操作失败统一捕获 rethrow,不再产生 unhandled rejection。
  • 关闭鉴权二次确认:鉴权全局关闭 = 放行所有无 Key 请求,此前误触一次即生效——补确认弹框明示风险(重新开启不确认)。
  • Buddy/Qoder 账号导出改原生另存为:原 WebView 伪下载落盘位置不可控——改原生另存为对话框(对齐 Trae 账号导出),成功提示附实际保存路径;Qoder 取消对话框不再残留导出密码预填。
  • 模型厂商归属修正:space-bunny/spacebunny → MiniMax、mimo → 小米,网关模型目录与自定义模型面板的厂商显示对齐真实供应商。
  • API 服务启动重复 uid 告警:账号池存在同 uid 多条目时启动即记录告警日志,防重复条目干扰调度与排查。
  • 杂项加固:证书提权安装 PowerShell 单引号转义(用户名含撇号时整条命令语法错误恒败且白耗一次 UAC 弹窗);JSON 配置解析前剥 UTF-8 BOM(记事本编辑过的配置此前静默回退默认值 → 写回覆盖用户配置)并落失败日志;调度器状态落库失败补日志(last_run_date 静默丢失会当日重复执行);启动日志输出生效时区偏移与本地时间(签到时刻偏移可排查);设备绑定上限错误特征词收窄为完整短语(「使用额度已达上限」等非设备绑定类错误不再误追加重新 OAuth 登录引导);error 级 toast 驻留 10s(长错误文案可读完);API 日志读取/搜索失败与「确无日志」区分提示。
  • 审查加固:合成快照身份改写补齐 expiresAt/expires_at(RFC3339 形态键名,与 refresh 侧对称覆盖,防旧过期值残留);合成落盘序列化失败不再写空 auth 文件(宁可不合成);meta.json 写入失败显式告警。