Skip to content

v2.4.1

Choose a tag to compare

@github-actions github-actions released this 13 Oct 19:21
· 64 commits to main since this release

更新内容(v2.2.1 → v2.4.1)

修复

  • 流式输出「说到一半卡住」:GatewayHttpServer.streamResponse 新增 sawDone 门禁,上游正常结束(EOF)但未发送 data: [DONE] 时补一帧,客户端不再收到无结束信号的截断流;SSE 心跳由「每 15 秒无条件发送」改为「静默满 15 秒才发」(检查周期 5 秒,最坏保活间隔约 20 秒),不再掩盖客户端自身的读超时。新增 SseStreamTerminationTest(5 例)。
  • 模型页折叠分组闪退:折叠状态由 SnapshotStateList 套 rememberSaveable 改为不可变 Set。原写法在切后台/进程回收的保存时机与列表快照交叠,抛「Reading a state that was created after the snapshot was taken」。
  • 模型测试失败原因看不全:行内仍紧凑显示,点击弹窗查看完整原文(可滚动)。
  • 刷新按钮未绕过模型目录缓存:新增 Provider.invalidateModelCache(),modelsStreaming(forceRefresh) 在拉取前失效各供应商的目录 TTL 缓存(Antigravity 10 分钟 / Trae 60 分钟 / Loomy 10 分钟),真正重打上游;仍保留最后一次成功结果作失败兜底。
  • 远端已下架的模型残留:刷新后清理开放名单中已不存在的勾选(拉不到完整目录的前缀不动);自定义供应商「拉取模型」改为以远端结果为准,保存时移除已下架项并提示数量。

新功能

  • WorkBuddy 粘贴凭证 JSON 导入:CodeBuddyProvider.importCredentials(复用 credentialOf 链路,兼容 camelCase / snake_case,uid 从 JWT 兜底)。上游只有设备码通道、无回调链接端点,原语义不准的「重新检查授权状态」按钮已移除,设备码登录保留。
  • 账号列表统一分页:新增共享组件 PagedAccountList(每页 30,超过才出现翻页控件),五个内置供应商 + 自定义供应商共用同一套代码;Trae / WorkBuddy 按国内 / 国际各自分页。
  • 批量操作进度与结果:批量签到 / 批量任务 / 刷新额度改为有界并发,带「已完成 X/N」进度与结构化结果面板(失败账号逐条列出)。
  • 模型页按供应商分组可折叠:点击分组头展开/收起该组模型,折叠状态重进页面保持(折叠集合 + 分组头图标与点击 + 折叠时跳过该组模型行)。

结构调整

  • 账号状态一账号一 json:状态键由 pool/state/<供应商>.json(内含全部账号)改为 pool/state/<供应商>/<账号>.json;旧格式首次读取时惰性迁移(迁一个摘一个、旧文件空则删除、可重复执行、不会回退),并对旧键残留做清理。
  • GatewayEngine.performActionAll / refreshAllCredits:有界并发 + 结构化结果;动作全部结束后才统一刷额度,去掉「每个账号动作成功后立刻补刷」的逐账号额外请求。

性能

  • AccountPool:账号状态/凭证落盘移出写锁。原实现持写锁期间执行 EncryptedSharedPreferences.commit()(整文件重写 + 加密),一个账号更新额度即阻塞整个账号池读写;现改为按账号串行 I/O,且落盘前重读内存最新值(refreshToken 轮换场景不会写出旧值覆盖新值)。
  • AccountPool.summary(providerId):复用 byProvider 分片索引,消除 providers() 的 O(供应商 × 账号) 遍历。
  • GatewayEngine.providerHosts():结果加缓存(原先每次建立连接都重建 Map 并遍历全部供应商)。
  • GatewayEngine 批量并发:DEFAULT_BATCH_PARALLELISM 3 → 6,MAX_BATCH_PARALLELISM 8 → 12(7000 账号量级的批量签到耗时约减半)。
  • RequestLog:拆分「数据锁」与「落盘串行化」,降低并发写入日志时的锁争用。
  • :app:ProviderUiRegistry 缓存自定义供应商的 CustomUi 实例(原先每次重组都 new,导致该页永远无法跳过重组);移除 StatusChip 中目标恒为主题常量的空转动画;模型搜索过滤与首页趋势图数组补 remember,避免每帧重算/重建。

重构(行为不变)

  • 新增 util/HttpSupport:收敛 6 家 Provider 几乎相同的建连/超时/读体/截断逻辑(Custom / Trae / Loomy / CodeBuddy / Raccoon / Antigravity)。
  • 新增 util/Ids:newCompletionId(原 4 处重复)、randomHex(原 3 处重复,共用一个 SecureRandom)。
  • SSE_DONE 收敛至 StreamSupport;firstString / firstLong / jwtClaim 从 CodeBuddy 与 Raccoon 的逐字重复副本提升进 util/JsonAccess(保留 firstLong 的「>0」语义);删除 LoomyJson 中与 JsonAccess 逐字相同的取值函数。
  • 新增 ui/AccountComponents(账号卡外壳 + 标题行 + 启用开关 + 删除胶囊 + 区域滑块),收敛 4 份账号卡片(通用详情页 / Trae / WorkBuddy / 自定义供应商)与 2 份区域滑块。
  • 新增 ui/Format.kt,合并 HomeScreen 与 MeScreen 中逐字重复的格式化函数;删除无引用的死代码 NavRow。
  • 重复定义点由 16 处收敛到 4 处。
  • 刻意未合并(属协议差异,不能共享):Antigravity 的 postForm(urlencoded + 特殊 Host 头)、各家超时值与 UA/业务头、各家 SSE translator、Credential / toProviderAccount。