@eddyskywalker/dsh-chatgpt-subscription 0.3.9 → 0.5.0

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.
Files changed (97) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/lib/client.js +959 -503
  3. package/lib/client.js.map +1 -1
  4. package/lib/index.js +5592 -3670
  5. package/lib/types/client/CodexSubscriptionSection.d.ts +1 -1
  6. package/lib/types/client/CodexSubscriptionSection.d.ts.map +1 -1
  7. package/lib/types/client/antigravity/AntigravitySection.d.ts.map +1 -1
  8. package/lib/types/client/antigravity/locales.d.ts +63 -153
  9. package/lib/types/client/antigravity/locales.d.ts.map +1 -1
  10. package/lib/types/client/antigravity/styles.d.ts.map +1 -1
  11. package/lib/types/client/api.d.ts +13 -1
  12. package/lib/types/client/api.d.ts.map +1 -1
  13. package/lib/types/client/command-code/CommandCodeSection.d.ts.map +1 -1
  14. package/lib/types/client/command-code/locales.d.ts +72 -201
  15. package/lib/types/client/command-code/locales.d.ts.map +1 -1
  16. package/lib/types/client/common/AccountPoolSection.d.ts +41 -0
  17. package/lib/types/client/common/AccountPoolSection.d.ts.map +1 -0
  18. package/lib/types/client/common/account-pool-labels.d.ts +43 -0
  19. package/lib/types/client/common/account-pool-labels.d.ts.map +1 -0
  20. package/lib/types/client/common/styles.d.ts +11 -0
  21. package/lib/types/client/common/styles.d.ts.map +1 -0
  22. package/lib/types/client/index.d.ts.map +1 -1
  23. package/lib/types/client/kimi-code/KimiCodeSection.d.ts.map +1 -1
  24. package/lib/types/client/kimi-code/locales.d.ts +69 -336
  25. package/lib/types/client/kimi-code/locales.d.ts.map +1 -1
  26. package/lib/types/client/locales.d.ts +49 -3
  27. package/lib/types/client/locales.d.ts.map +1 -1
  28. package/lib/types/host/antigravity/account-pool.d.ts +60 -0
  29. package/lib/types/host/antigravity/account-pool.d.ts.map +1 -0
  30. package/lib/types/host/antigravity/adapter.d.ts +3 -1
  31. package/lib/types/host/antigravity/adapter.d.ts.map +1 -1
  32. package/lib/types/host/antigravity/mapper.d.ts.map +1 -1
  33. package/lib/types/host/antigravity/oauth.d.ts +1 -1
  34. package/lib/types/host/antigravity/oauth.d.ts.map +1 -1
  35. package/lib/types/host/antigravity/routes.d.ts +3 -2
  36. package/lib/types/host/antigravity/routes.d.ts.map +1 -1
  37. package/lib/types/host/antigravity/token-store.d.ts +3 -0
  38. package/lib/types/host/antigravity/token-store.d.ts.map +1 -1
  39. package/lib/types/host/codex-account-pool.d.ts +64 -0
  40. package/lib/types/host/codex-account-pool.d.ts.map +1 -0
  41. package/lib/types/host/command-code/account-pool.d.ts +60 -0
  42. package/lib/types/host/command-code/account-pool.d.ts.map +1 -0
  43. package/lib/types/host/command-code/adapter.d.ts +11 -1
  44. package/lib/types/host/command-code/adapter.d.ts.map +1 -1
  45. package/lib/types/host/command-code/client.d.ts +17 -1
  46. package/lib/types/host/command-code/client.d.ts.map +1 -1
  47. package/lib/types/host/command-code/mapper.d.ts.map +1 -1
  48. package/lib/types/host/command-code/oauth.d.ts +4 -1
  49. package/lib/types/host/command-code/oauth.d.ts.map +1 -1
  50. package/lib/types/host/command-code/routes.d.ts +12 -3
  51. package/lib/types/host/command-code/routes.d.ts.map +1 -1
  52. package/lib/types/host/command-code/token-store.d.ts +3 -0
  53. package/lib/types/host/command-code/token-store.d.ts.map +1 -1
  54. package/lib/types/host/common/account-pool.d.ts +179 -0
  55. package/lib/types/host/common/account-pool.d.ts.map +1 -0
  56. package/lib/types/host/common/home.d.ts +8 -0
  57. package/lib/types/host/common/home.d.ts.map +1 -0
  58. package/lib/types/host/kimi-code/account-pool.d.ts +48 -0
  59. package/lib/types/host/kimi-code/account-pool.d.ts.map +1 -0
  60. package/lib/types/host/kimi-code/adapter.d.ts +10 -1
  61. package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
  62. package/lib/types/host/kimi-code/client.d.ts +16 -0
  63. package/lib/types/host/kimi-code/client.d.ts.map +1 -1
  64. package/lib/types/host/kimi-code/mapper.d.ts.map +1 -1
  65. package/lib/types/host/kimi-code/oauth.d.ts +2 -0
  66. package/lib/types/host/kimi-code/oauth.d.ts.map +1 -1
  67. package/lib/types/host/kimi-code/routes.d.ts +11 -3
  68. package/lib/types/host/kimi-code/routes.d.ts.map +1 -1
  69. package/lib/types/host/kimi-code/token-store.d.ts +3 -0
  70. package/lib/types/host/kimi-code/token-store.d.ts.map +1 -1
  71. package/lib/types/host/model-catalog.d.ts.map +1 -1
  72. package/lib/types/host/oauth-service.d.ts +41 -2
  73. package/lib/types/host/oauth-service.d.ts.map +1 -1
  74. package/lib/types/host/preferences.d.ts.map +1 -1
  75. package/lib/types/host/preset-sync.d.ts +7 -1
  76. package/lib/types/host/preset-sync.d.ts.map +1 -1
  77. package/lib/types/host/responses-client.d.ts +15 -0
  78. package/lib/types/host/responses-client.d.ts.map +1 -1
  79. package/lib/types/host/routes.d.ts +2 -1
  80. package/lib/types/host/routes.d.ts.map +1 -1
  81. package/lib/types/host/token-store-windows.d.ts.map +1 -1
  82. package/lib/types/host/usage-service.d.ts +15 -0
  83. package/lib/types/host/usage-service.d.ts.map +1 -1
  84. package/lib/types/index.d.ts +6 -0
  85. package/lib/types/index.d.ts.map +1 -1
  86. package/lib/types/shared/account-pool-contracts.d.ts +47 -0
  87. package/lib/types/shared/account-pool-contracts.d.ts.map +1 -0
  88. package/lib/types/shared/antigravity-contracts.d.ts +12 -0
  89. package/lib/types/shared/antigravity-contracts.d.ts.map +1 -1
  90. package/lib/types/shared/command-code-contracts.d.ts +16 -0
  91. package/lib/types/shared/command-code-contracts.d.ts.map +1 -1
  92. package/lib/types/shared/contracts.d.ts +8 -0
  93. package/lib/types/shared/contracts.d.ts.map +1 -1
  94. package/lib/types/shared/kimi-code-contracts.d.ts +16 -0
  95. package/lib/types/shared/kimi-code-contracts.d.ts.map +1 -1
  96. package/lib/types/shared/preferences.d.ts.map +1 -1
  97. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,6 +1,56 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.4.0 - 2026-09-20
4
+
5
+ - **四条线路全部支持多账号与号池调度**(把 Antigravity 已有的账号管理推广到 ChatGPT / Command Code / Kimi Code,落实设计文档 `docs/design-multi-account-pool.md` 的 P0–P4):
6
+ - **共享号池内核** `src/host/common/account-pool.ts`:加密存储(Windows DPAPI / macOS Keychain / Linux Secret Service)、按文件串行化的读改写、旧版单凭据的零副作用投影、顺序耗尽 / 轮询调度 / 粘性会话三种策略、429 冷却、账号级认证失效状态、刷新失败自动换号。Antigravity 线路改为复用该内核(`AccountPoolStore` 保留原 API 与池文件格式),四条线路的池规则从此只有一处实现。
7
+ - **ChatGPT 号池**(`storages/codex-pool.json`):按 `chatgpt_account_id` 去重;单账号 OAuth 升级为多账号,`ResponsesClient` 在建立响应前轮换账号,429 冷却换号、401 强制刷新一次后把该账号标记为需重新登录(不再清空整个凭据库)、刷新令牌轮换按账号单飞写入,避免并发重复兑换。
8
+ - **Command Code 号池**(`storages/command-code-pool.json`):API Key 永久有效故无刷新;按 user id + key name 去重;401/403 标记该 Key 失效并换号,429 冷却换号;浏览器登录与手工粘贴 Key 两条路径都写入池。
9
+ - **Kimi Code 号池**(`storages/kimi-code-pool.json`):按账号刷新(刷新令牌轮换写回池),凭据自带 region / oauthHost / baseUrl,因此**跨区域账号可混池**且每次请求都用该账号自己的主机与区域。
10
+ - **429 语义按线路区分**:Kimi 的「套餐不含此模型」型 429 属请求属性,既不冷却也不换号——否则一次这样的请求会把整个号池打成冷却;真正的限流/额度型 429 才冷却并接力下一账号。Command Code / ChatGPT 的 429 一律视为账号配额。
11
+ - **账号级失效而非删除**:刷新令牌被拒绝时该账号进入 `expired` 状态并退出轮换,但保留别名与排序;界面提供「重新登录」原地复活(清标记 + 重走登录流程),不再靠"删除再添加"。
12
+ - **ChatGPT 配额感知路由**:已缓存的 Codex 窗口若已用尽且未到重置时间,该账号在发请求前就被跳过,而不是每次都用一次 429 重新发现;用量快照按账号分键存放,切换账号不会串显别人的配额。
13
+ - **排序策略与粘性会话**:新增 `sticky`(保持当前账号直到其被限流),对上游前缀缓存更友好;顺序耗尽与轮询语义保持与 Antigravity 一致。
14
+ - **设置页 UI 统一**:抽出共享账号卡片 `src/client/common/AccountPoolSection.tsx`(主账号 / 当前使用 / 冷却倒计时 / 需重新登录徽章、设备码面板与粘贴 Key 作为插槽),**四个 Tab 全部改用它渲染账号管理**(Antigravity 原本自己手写的那份 JSX 已删除,其项目/邮箱/到期/上次调用行改由 `renderDetails` 提供),并共用同一套 `dsha-*` 分组样式;ChatGPT Tab 顺带从旧的 `dsh-codex-*` 样式换到同一套设计系统,账号管理、连接、模型、增强、上下文窗口、配额的分组顺序四路由一致。
15
+ - **Antigravity 顺带对齐**:调度策略补上 `sticky`(原只有顺序耗尽/轮询),账号动作后清空配额缓存,避免切换账号后显示上一个账号的用量。
16
+ - **测试隔离加固**(代码审查发现的可疑点,经复现判定为误报,但仍加固):共享 setup 现在**每个测试前重新断言** `DSH_HOME`,两个视频用例改为"恢复原值"而不是 `delete process.env.DSH_HOME`,并新增 `test/isolated-home.test.ts` 作为哨兵。真实用户目录在全程未被测试写入(原报告把 live 应用自身每次 Antigravity 请求都会回写池文件 `lastUsedAt` 的现象误判为测试泄漏)。
17
+ - 三个线路的 `en` 字典补上 `: Record<keyof typeof zh, string>`,漏译从此在 `tsc` 阶段就被拦住。
18
+ - **向后兼容**:老用户升级后池文件不存在时,读路径把原有单凭据投影为主账号(`acc_primary`),界面显示「已登录 1 个账号」,无需重新授权、无需迁移脚本。
19
+ - **修「取号记账写失败被误报成凭据不可用」**(实机 sighting:ChatGPT 卡片显示 "ChatGPT credentials could not be refreshed.",但账号已登录、令牌 6.5 天后才到期、按 60 秒刷新余量根本不需要刷新):
20
+ - 根因:`getEffectiveAccount` 选中账号后会把 `lastUsedAt`/`activeAccountId` 写回池文件,这是**记账**;该写入一旦失败(DPAPI 助手进程卡住、目标文件被占用导致 replace 失败等),异常一路冒泡到 `usage-service` 64-67 行的通用 catch,被换成"凭据无法刷新"——于是凭据明明可用,配额卡片却报错且只显示上次快照。用真实池内容在干净进程里复现可证数据与逻辑本身无误(`write=ok`、`getEffectiveAccount=ok`),故障来自运行进程内的那一次写入。
21
+ - 记账写入改为 best-effort(失败不再阻断取号);**表达用户意图的写入仍然严格失败**:新增/删除账号、设主账号、冷却、标记失效照旧抛出,避免"冷却没写成功却把限流账号放回轮换"。
22
+ - 同一条提示现在带上底层原因(如 `(DPAPI credential write failed)`),不再是无信息文案。
23
+ - 新增 2 条测试:内核"记账写失败仍能取到凭据、冷却写入仍报错",配额服务"错误文案包含底层原因"。
24
+ - 新增 54 条测试:`account-pool-core`(11)、`account-pool-section`(9)、`codex-account-pool`(12,含 429/401 轮换与并发刷新单飞)、`command-code-account-pool`(8,含路由动作与单 Key 回退)、`kimi-code-account-pool`(11,含跨区域、套餐型 429 不冷却、刷新失败换号)、`antigravity-section-pool`(3,锁定 Antigravity Tab 已改用共享卡片),外加 `isolated-home` 哨兵 1 条。
25
+
26
+ ## 0.3.9 - 2026-09-19
27
+
28
+ - **修复工具结果内嵌图像到不了模型**(command-code / antigravity / kimi-code 三条线路,合入 PR #7):三条线路的 mapper 此前都以「只看消息顶层 content」为前提,因此带图的工具结果(截图类工具、`read_image`)在模型侧全部失明——收集阶段看不到 `tool-result` 内部的图像块,压平阶段又把整条工具结果降级成 `[image: 名字]` 文本,像素从来没有上车的机会。更危险的是模型不知道自己瞎了,会凭空编造图片内容作答。用户在聊天框直接粘贴的顶层图片不受影响,这正是问题看起来像「模型不支持视觉」的原因。
29
+ - 三个 `collectImageRefs` 改为递归进入 `tool-result` 的嵌套 content(`continue` 式,不对块顺序做假设);DSH 本体 `dsh-llm` 的对应函数同样递归,此处属实现遗漏。
30
+ - **command-code 的 Anthropic 路径**:`tool_result.content` 在带图时改为块数组(原生 `text` + `image.base64`),无图时仍返回纯字符串,逐字节不变。
31
+ - **command-code / kimi-code 的 OpenAI 路径**:`role: "tool"` 消息装不下图像,因此扫描**整段连续 tool 消息**收集全部图像,在段末统一追加**一条** `role: "user"` 消息挂 `image_url`。不逐条插入是硬约束:parallel tool calls 会产生连续的 tool 段,把 user 消息插进段中间会被严格上游拒绝(`tool_calls` 未被连续应答)。kimi 变体的 `declarationSlots` 语义逐语句保持等价,无 slot 漂移。
32
+ - **antigravity(Gemini)**:`functionResponse` 装不下图像,图像以 `inlineData` part 追加到同一条 user content 的 parts 数组(Gemini 允许同一 content 混合二者);无图时 parts 数组与改前完全一致。
33
+ - 图像读不到(附件缺失或 media type 不支持)时降级为明确的 `[image unavailable: …]` 文本块,绝不静默丢弃。
34
+ - 行为不变性:11 类无图场景 × 5 条 wire 共 55 份请求体与改前**逐字节一致**(差分验证 0 处差异),只有真正带图的结果才改变行为。
35
+ - 新增 `test/tool-result-images.test.ts`(16 条,映射层)与 `test/tool-result-images-wire.test.ts`(4 条,从桩传输读回实际发出的请求体);两者在未修复源码上分别有 9 条与 2 条失败,可证明其有效性。
36
+ - 已知限制:`offloadOldestRequestImages` 的字节统计仍未递归 `tool-result`(`collectRequestImageBytes` 只扫顶层)。这是有意保持的最小改动——若只让统计递归而替换逻辑仍只处理顶层块,会造成「计数按递归、替换按顶层」的新不一致。后果是工具结果内嵌图像的 base64 体积不计入 `MAX_REQUEST_IMAGE_BYTES` 预算,极端情况下可能发出偏大的请求;修复方向是让统计与替换同时递归,作为独立改动处理。
37
+ - **优化 Antigravity 提示词与工具进度输出**:在系统提示词后置注入进度规则,引导模型在调用工具前输出简要进展;过滤冗余格式与前导思考文本。
38
+ - **优化 Kimi Code 工具 Schema 兼容性**:递归解析并内联工具参数中的本地 `$ref` 引用,避免上游网关因引用定义不存在而报错。
39
+ - **支持自由停用供应商与清空模型列表**(修复 Issue #8 中反馈的供应商强制常驻与选择器受挤占问题):
40
+ - 四大供应商(ChatGPT、Antigravity、Command Code、Kimi Code)均增加「启用此供应商」总开关;当关闭供应商或全部取消勾选模型时,Adapter 返回空列表,DSH 会话模型选择器将完全隐藏该供应商,不再遮蔽或挤占原生 DeepSeek 及其他第三方供应商模型。
41
+ - 彻底移除前端与后端中「最少保留一个模型」的硬编码拦截,支持全选与全不选自由切换。
42
+ - 修复 Command Code 和 Kimi Code 适配器在已选模型为空时误回退到全量展示(导致 30+ 款模型意外暴露)的严重缺陷。
43
+ - Antigravity 路线注册增加柔性容错与路由冲突监听,避免与其他 Antigravity 插件(如 `dsh-agy-link`)共存时引发崩溃。
44
+ - **Antigravity 多账号池与轮询/接力调度**(落实 Issue #8 中建议 3):
45
+ - 支持绑定并管理多个 Google Antigravity 账号,账号池数据通过系统底层安全存储加密隔离(Windows DPAPI / macOS Keychain / Linux Secret Service),首次使用自动平滑迁移旧版单凭据为主账号,零破坏、免重新授权。
46
+ - **双重调度策略**:
47
+ - **顺序耗尽 (Sequential Drain)**:优先使用主账号;遇 429 限流或额度耗尽时自动进入冷却,并在同一次生成请求中无缝接力切换至下一个健康账号,不中断对话;
48
+ - **轮询调度 (Round-Robin)**:基于 LRU(最久未使用)跨账号循环分摊调用,均衡多个账号的配额消耗。
49
+ - **429 智能冷却与自动接力**:检测到上游 429 配额耗尽时,自动为该账号挂起冷却倒计时(优先解析 Retry-After 头,默认 15 分钟),立即自动重试下一个账号。
50
+ - **界面风格严谨统一且无 emoji**:完全遵从当前设计系统提供多账号卡片列表、主账号标识、当前活跃态、冷却倒计时徽章、设为主账号、手动重置冷却与注销操作。
51
+ - **修测试写坏真实凭据**:账号池默认落在 `$DSH_HOME/storages/antigravity-pool.json`,而多个 Antigravity 测试文件会构造使用默认路径的池,并在并行 worker 里互相覆盖同一个文件——一次 `npm test` 就能把开发者本机的真实账号覆盖成 `{"access":"test-token"}`,随后刷新报 `Missing Antigravity refresh token`。现在由 `test/setup/isolated-home.ts` 为每个测试文件分配私有 `$DSH_HOME`,测试全程不接触真实主目录(已在真机上按文件长度与 mtime 校验零改动)。
52
+ - **读取不再有副作用**:`AccountPoolStore.read()` 原先在从旧版单凭据迁移时顺手落盘,而所有改动池的调用者紧接着都会自己写回,等于白做一次加密往返;一个 getter 悄悄重写加密存储,正是上面那类事故能发生的条件。迁移现在只体现在返回值里,由随后的显式写入落盘,并新增断言锁定该性质。
53
+ - 登录流程因此多了一次加密池写入,`test/antigravity-proxy.test.ts` 的等待预算相应从默认 1s 调整为有界的 10s(实测约 2s 完成,仍能对真正卡死的流程报错)。
4
54
 
5
55
  ## 0.3.6 - 2026-09-17
6
56