@eddyskywalker/dsh-chatgpt-subscription 0.10.11 → 0.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ - **修复所有订阅线路共享号池的读-改-写竞争**:原来只分别串行化读和写,令牌刷新或设置更新会把整份旧快照写回,覆盖其他请求的新令牌、账号与冷却状态——共享内核 `account-pool.ts` 的注释曾声称不会发生。现在账号增删、备注、主账号、轮换策略、冷却和认证标记都在同一锁内读取最新文档并修改;指向同一文件的多个号池实例共享锁与身份版本号。
6
+ - **刷新不占用整池锁**:模型请求、工具凭据、设置卡片与 Codex 强制续期共用按账号/凭据代际的单飞。读取当前凭据与登记刷新任务是一个短事务,网络请求在锁外发出,锁内不等待任何 flight(否则它自己的提交会死锁)。
7
+ - **条件写与过期保护**:轮换结果和外部权威凭据都按“发起时的凭据”写回,不匹配就返回最新行而不覆盖——晚到的刷新不会盖掉重新登录的新令牌,也不会复活已删除的账号;旧刷新抛出的终态失败也不会把刚登录的账号标记失效。刷新期间账号被删除时,模型请求会切到其他可用账号。
8
+ - **严格落盘与可选记账分离**:轮换出的新令牌必须写入并读回验证成功;最近使用时间等记账失败仍不阻断正常请求,且不会回滚期间发生的删除、重登录或主账号切换。主账号镜像按提交顺序更新,显式空池不再因镜像清理失败而从旧投影复活账号。
9
+ - **消除一次调用两次轮换**:`OAuthService` 原先先取凭据(可能已按到期刷新)再强制续期,会在几秒内连续消费两个刷新令牌;现在强制续期由号池一次完成。
10
+ - **迁移线路特有路径**:Claude 的身份索引、导入、合并与删除改用事务,凭据文档只在号池提交成功后同步(此前满池或落盘失败会留下孤儿凭据),非订阅凭据仍在事务内被拒绝;MiniMax 自愈与 WorkBuddy 桌面账号同步改用定向原子补丁与条件写。
11
+ - **确定性回归测试**:`test/account-pool-concurrency.test.ts` 覆盖跨实例并发添加与设置、不同账号交错刷新、同账号只轮换一次、刷新期间删除/重新登录、过时认证失败、镜像顺序与落盘失败,并在未修复代码上实测失败。协调范围是同一个宿主进程;不声称提供跨进程文件锁,也无法阻止外部应用自行轮换令牌。
12
+
5
13
  - **Claude 线路审计修复(均有回归测试,且在修复前代码上实测失败)**:
6
14
  - **按账号「重新登录」修不好那个账号**(`routes.ts` `loginStore`)。重新登录经 `pool.credentialStoreFor()` 只写进旧的单账号凭据文档,而请求路由读的是**号池行**;随后又清掉失效标记,于是该行带着**已失效的旧令牌**重新进入轮换,下一次请求再次失败——浏览器登录成功了,账号却立刻又要求重新登录。现在一律经 `pool.addAccount()` 写入(按账号身份就地更新同一行并同步文档),且只有新凭据确实落在用户点的那个账号上时才清除失效标记(浏览器里登成别的账号时,会新增那个账号,而不会把死行放回轮换)。
7
15
  - **刷新令牌在「2xx 但响应体解析失败」后被重发**(`oauth.ts` `refreshAccessToken`)。重试循环只对 `ClaudeUnauthorizedError` 提前停止,而 `parseTokenResponse` 抛的是普通 Error;一次 200 意味着轮换型 refresh token 已被消费,重发同一个必得 `invalid_grant`,账号随即被判失效。现只重试 `ClaudeRetryableError`。