Releases
v2.4.1
Compare
Sorry, something went wrong.
No results found
更新内容(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。
You can’t perform that action at this time.