@eddyskywalker/dsh-chatgpt-subscription 0.24.0 → 0.24.2

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,34 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.24.2 - 2026-10-14
6
+ - **[三条登录线路] 回调端口探测窗口按「100 端口一块」的否证前提定宽,导致整段保留区把探测窗口吃穿:Windows 实测连续 277 个端口不可用,而窗口只有 128(command-code 只有 10)**
7
+ - **现象**:本机全量 `npx vitest run` 稳定复现 **7 failed / 3711 passed**,全部集中在 `test/antigravity-callback-port.test.ts`(5 条)与 `test/login-open-browser-seams.test.ts`(2 条),报 `No usable local port for the Antigravity sign-in callback (tried 128 ports from 51121 on localhost)`,另有一条直接 `listen EACCES: permission denied ::1:51121`。
8
+ - **根因(实测否证既有注释)**:`port-constants.ts` 写着「Windows 排除区最多 100 端口一块,128 覆盖任何一块」——本机实测从默认端口 51121 起**连续 277 个端口不可用**(51121-51397,`netsh` 表印证),窗口在排除区内部就耗尽,必然抛错。除静态表外还有一批**散落的单端口 EACCES**(51512/51580/51620/51840…)根本不在 `netsh` 表里,属 Hyper-V/HNS 动态保留,且会在**百毫秒尺度上出现与释放**。三个取值(`antigravity` 128、`claude` 128、`command-code` **10**)建立在同一个被否定之前提上。
9
+ - **失效形态三条各不相同**:`antigravity` 抛错、`claude` 返回 `null` → `beginLogin` 把用户**静默推进手动粘贴流程**(机器上明明有数百个空闲端口就在保留区后面)、`command-code` 抛错且**没有手动流程可退**,窄窗口等于登录直接死掉。
10
+ - **改法**:三条线路的窗口统一为 **1024**(≈实测最宽区的 3.7 倍;终点 52144 / 54716 / 6983 均远低于 65535,command-code 另有断言确保不越入 49152+ 的 OS 动态端口区)并重写被否证的注释,把 277 宽实测、失效形态与 ~0.35ms/次探测的最坏代价一并记入。`resolveCallbackPort` / `findAvailablePort` 各补一个**可选**注入式 `probe` seam(`claude` 本就已有同形参数),使「窗口契约」与「机器事实」解耦;生产默认值仍是真绑定,调用点逐字未变。`claude` 的 `probed.length <= CALLBACK_PORT_ATTEMPTS` 收紧为 `===`,`command-code` 测试里硬编码的 `5959 + 10` 改为常量推导(两侧区间断言保留,上界仍被断言)。
11
+ - **command-code 的 10 为什么加宽(而非保持)**:「matches the official CLI」约束的是**起点**(5959 保留且仍先试,有测试钉死字面量),不是宽度;端口经 callback URL 交给 studio,5960+ 本就是「非 CLI 端口」,加宽不引入新的端口类别;决定性是失败形态——这条线路没有手动流程可退,窗口耗尽即登录失败。
12
+ - **测试为什么不碰真实 socket**:曾出现「用真实 socket 拼一段连续占用区」的写法在同一棵树上**时过时不过**(40 轮 3 轮失败,且 3 次全部停在 build 期就是 EACCES 的端口上,自持有端口一次都没变)——动态保留区会在测试运行途中解禁。新用例因此**全部注入 probe**,零真实 socket、零 skip,与机器排布无关。
13
+ - **验证**:`npm run typecheck` 0 错误;全量 **225 passed | 1 skipped(226 文件)、3732 passed | 7 skipped、0 failed**(基线 7 failed);承重文件连跑 20 次全绿;`login-open-browser-seams.test.ts` **未改测试**,靠生产修复自然通过且真的走到了 abort 分支。承重已双向检查:常量单独还原为 128/10 时 5 条立刻失败(`expected 128 to be greater than 277`、`expected null to be 53969`、`expected 'manual' to be 'loopback'`、`No free local port … (tried 10 ports from 5959)`)。
14
+ - **[Kimi Code] 上游瞬时过载不再被当成账号限流:一次 `The engine is currently overloaded` 曾把唯一账号冷却 15 分钟,重试期间连一次网络请求都发不出去**
15
+ - **现象**:现场会话 `session-70d30e6b`(2026-10-14 20:29)一个回合以 `全部 1 个 Kimi Code 账号均处于配额限制或冷却中 (429)。最短预计在 15 分钟后解除冷却。` 失败。账号登录正常、订阅正常、额度正常,用户点一次「继续」后自行恢复。三次重试的间隔为 3.2s / 6.1s,**等于纯退避时间、零网络耗时**——请求根本没发出去。
16
+ - **根因(两处叠加)**:① `classifyKimiFailure` 只在正文命中 `exceeded_current_quota_error` / `insufficient balance` 等额度文案时才判为额度类,`The engine is currently overloaded, please try again later.` 一条都不匹配,于是落进 429 兜底分支得到 `RATE_LIMIT`;② adapter 的 HTTP 分支与 in-band 分支的冷却判据都是**裸状态码 `response.status === 429`**,与错误码无关,所以分类改对也拦不住冷却。过载因此被写进 `cooldownUntil`(无 `Retry-After` 时套用 `POOL_COOLDOWN_MS = 15 分钟`)并**落盘**,号池随即用 `isEligible` 把唯一账号判掉,`allUnavailableError` 拼出上面那句话。单账号号池没有第二个账号可轮转 = 一次过载直接锁死整条线路。
17
+ - **这与全仓约定相悖**:`glm-coding-plan/mapper-openai.ts` 早已把 `OVERLOADED` 映射为非账号级的 `SERVER`,注释写明「把过载混进 RATE_LIMIT 会让号池按限流去冷却账号,而过载根本不是某个账号的错」;`claude` 线同样按 kind 分类、不冷却过载。本线路缺这道区分是偏离,不是取舍。
18
+ - **改法**:新增 `UPSTREAM_OVERLOAD_PATTERNS` 按**正文**识别过载(`engine is (currently )?overloaded` / `upstream model provider is temporarily unavailable` 等,刻意保留限定语,避免吞掉将来可能出现的「本账号请求量过载」类真限流),`KimiFailureClassification` 新增 `upstreamOverload` 字段把「归属」显式带出来——`code` 只有一个、说不了「可重试」与「不属于任何账号」这两件事,`accountScoped` 只回答「能不能换号」而不回答「要不要冷却」。过载返回 `SERVER`(仍在 `retryableCodes` 内,退避重试行为不变;用 `RATE_LIMIT` 会让 UI 读出「你的账号被限流了」这个错误结论);HTTP 分支与 in-band 分支**都**加 `!failure.upstreamOverload` 排除,两条路行为一致。
19
+ - **验证**:`npm run typecheck` 0 错误;`test/kimi-code-adapter.test.ts` 41 例 + `test/kimi-code-account-pool.test.ts` 22 例共 63 例全绿;全量 **3732 passed | 7 skipped、0 failed**。承重已双向检查:把 `adapter.ts` 单独还原后,3 条新用例立刻失败(`expected 'RATE_LIMIT' to be 'SERVER'` 等,含「账号留在轮转里且真的重发了请求」「in-band 与 HTTP 结论一致」两条端到端断言)。
20
+
21
+ ## 0.24.1 - 2026-10-14
22
+ - **[调度模式 & 子代理授权守卫] 插件端机制级修复模型调用 `list_subagent_models` 后仍疯狂翻找本地文件定义的问题,并全面优化预设提示词(现场会话 `session-01724ca8`)**
23
+ - **现象**:主模型在启动阶段已调用 `list_subagent_models`,但因无参调用 `list_subagent_models({})` 只返回 provider 摘要,或看到上游工具描述写着 `"Catalog membership is advisory"` / `"Child LLM selection is optional..."`,不敢直接采信返回值,紧接着连续 9 个回合在工作区 grep `subagentModelAuthorization`、读取源码、递归扫描 `~/.dsh`(触发 120s 命令超时)并翻看 `settings.json` / `cordis.patch.yml` 以寻找「真正的允许清单定义」。
24
+ - **插件端机制级修复(`src/host/subagent-model-authorization.ts`,零修改上游 DSH)**:
25
+ 1. **`tools/post-execute` 输出增强(`enrichListSubagentModelsOutput`)**:当会话开启子代理模型授权守卫且允许清单生效时,拦截成功的 `list_subagent_models` 调用(含 PTC `run_code` 内调用),在原始输出末尾直接附上本会话全部已授权的 `{ provider, model }` 拆解对(`- <provider>/<model> -> provider: "<provider>", model: "<model>"`),使模型哪怕只调一次无参 `list_subagent_models({})` 也能一步拿到完整授权路由与精确传参字段。
26
+ 2. **`system-prompt/assemble` 工具描述原位重写(`rewriteAuthorizedPromptAssembly`)**:当会话受允许清单管控时,在系统提示组装阶段原位改写 PTC 模式的 `tools:sdk` section 与 Native 模式的 `assembly.tools` 中 `list_subagent_models` 的 `"Catalog membership is advisory..."` 及 `subagent` 的 `"Child LLM selection is optional..."` 误导描述,直接替换为本会话的强制显式选模型要求与已授权路由清单,从源头消除工具 schema 与守卫规则的冲突。
27
+ - **预设提示词全面优化并统一为英文(`src/host/agent-preset.ts` 与 `presets/dispatch/agent.cordis.yml` 逐字节同步)**:
28
+ 1. **全英文统一与执行主线对齐**:将 `persona.config.prefix` 与 `plan-mode.config.section` 统一为高信噪比英文指令(与 DSH 工具签名及运行时系统提示词语言保持一致);在顶部新增 `[Execution Pipeline]` 速查流水线,并将 `## R0.5 · Compatibility Gate` 调整至 `## R0 · Complexity Triage` 之前,使阅读顺序与实际执行顺序完全一致。
29
+ 2. **消除 `G4` 与 `R2` 的张力**:在 `R-G` 的 `G4` 中明确补注本会话允许的子代理模型路由由 `list_subagent_models` 直接提供而非仓库文件,防止模型把「查仓库事实」泛化到搜本地允许清单。
30
+ 3. **重写 `R2 · Model Routing`**:明确允许清单的唯一真源是 `list_subagent_models`(无参调用末尾已直接附上完整 `provider/model` 拆解清单),直接采信其输出而无需去翻本地配置文件或工作区代码交叉核对(避免硬性禁读文件影响正常的配置/源码任务),移除诱发 grep 的内部符号名 `subagentModelAuthorization`,并新增 Anti-Pattern 第 16 条。
31
+ 4. **精简重写 `plan-mode.config.section`**:消除了原本与 `R-G` 大段重复的冗余段落,收敛为与 `R0 / R-G / R2` 紧密衔接的英文四段式规则(`[Plan Mode]`、`[Read-Only Exploration & Clarification Interview]`、`[Plan Completeness]`、`[Plan Approval]`),并在只读探查段同步指明直接使用 `list_subagent_models` 返回的路由。
32
+
5
33
  ## 0.24.0 - 2026-10-14
6
34
  - **[Antigravity] 新增 Gemini 4 Argon(`gemini-4-argon`)并同步官方 2.23.0 客户端版本标识(2026-10-14 线上实测)**
7
35
  - **版本门控(User-Agent)**:实测确认 `/v1internal:fetchAvailableModels` 对 `User-Agent` 版本存在门控——旧 `2.8.0` (`cl=963137146`) 仅下发 26 个模型且默认模型停留在 `gemini-3.8-flash-high`;升级为官方最新客户端 `2.23.0` (`cl=998057262`) 后服务端下发 29 个模型(新增 `gemini-4-argon-low` / `-medium` / `-high`),并将 `defaultAgentModelId` 切至 `gemini-4-argon-medium`。同步更新 `DEFAULT_ANTIGRAVITY_VERSION = '2.23.0'` 与 `DEFAULT_ANTIGRAVITY_CL = '998057262'`。
package/README.md CHANGED
@@ -491,7 +491,7 @@ DSH 的 Agent Teams(bundle `@deepseek-ai/dsh-experimental-agent-team-profile`
491
491
  | 任务开始建目标 | 除非用户明确要求,否则**不调用 `create_goal` / `/goal`**,任务清单一律走 `todo_write` | 机制性的:目标一旦激活,DSH 会自动续跑唤醒主代理,而子代理何时返回不由它控制——等待被从中间劈开,模型重新分诊、重新检查「还差什么」,每次续跑还要重载整段历史 |
492
492
  | 需要用户拍板 | 一切「我停在这里是因为缺一个决定」的停点(收到子代理结果要选下一步、验收不过要定返工范围、前提被推翻要改计划)都用 `ask_user_question` 递出去,并给出选项与推荐答案 | 提问是代理的工具,不是用户的义务:否则用户得先替模型把那段话翻译成一次输入。例外是 plan mode 的计划审批(走 `exit_plan_mode`)与任务完成后的收尾 |
493
493
 
494
- 三条各自对应 persona 反模式列表里的第 13–15 条。
494
+ 三条各自对应 persona 反模式列表里的第 13–15 条。此外,本插件在运行时通过 `system-prompt/assemble` 原位重写 `list_subagent_models` 与 `subagent` 工具描述中的 `"Catalog membership is advisory"` / `"Child LLM selection is optional..."` 误导措辞,并通过 `tools/post-execute` 在每次 `list_subagent_models` 返回末尾直接附上本会话全部已授权的 `{ provider, model }` 拆解对;`R2` 与 `plan-mode` 提示词也同步写明 `list_subagent_models` 是本会话允许清单的**唯一真源**,直接采信其输出即可,无需仅为了确认哪些子代理模型可用去翻找本地配置文件或工作区代码(对应 Anti-Pattern 第 16 条)。
495
495
 
496
496
  ### 为什么不降级:teammate 不能选模型
497
497
 
package/icon.svg ADDED
@@ -0,0 +1,28 @@
1
+ <!--
2
+ 本插件的插件管理器图标(package.json 的 "icon" 声明,36×36 规格,见 DSH 官方实验插件同款)。
3
+
4
+ 画的是「聚合」:四条订阅线路(四枚节点)收进中心一块圆角方块(本插件那个统一的账号/订阅管理面)。
5
+ 取色都有出处,不新造品牌色:中心 #10A37F 是本仓库 src/client/hub/brand-icons.ts 里 chatgpt 那条
6
+ 线路的 tile 色(本插件正是以 ChatGPT 订阅起家的那条),线路节点与辐条用的 #7AC2FF → #4A65E8
7
+ 与 DSH 官方插件图形同一支渐变。图形为装饰性,不依赖 currentColor / CSS 变量,可安全地按 data: URI
8
+ 渲染在插件管理器的 <img> 里(PackageArtwork)。
9
+ -->
10
+ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
11
+ <g stroke="url(#a)" stroke-width="2.8" stroke-linecap="round">
12
+ <path d="M18 12.8V9.7" />
13
+ <path d="M18 23.2V26.3" />
14
+ <path d="M12.8 18H9.7" />
15
+ <path d="M23.2 18H26.3" />
16
+ </g>
17
+ <circle cx="18" cy="6.6" r="3.1" fill="url(#a)" />
18
+ <circle cx="18" cy="29.4" r="3.1" fill="url(#a)" />
19
+ <circle cx="6.6" cy="18" r="3.1" fill="url(#a)" />
20
+ <circle cx="29.4" cy="18" r="3.1" fill="url(#a)" />
21
+ <rect x="12.25" y="12.25" width="11.5" height="11.5" rx="3.6" fill="#10A37F" />
22
+ <defs>
23
+ <linearGradient id="a" x1="7" y1="6" x2="30" y2="30" gradientUnits="userSpaceOnUse">
24
+ <stop stop-color="#7AC2FF" />
25
+ <stop offset="1" stop-color="#4A65E8" />
26
+ </linearGradient>
27
+ </defs>
28
+ </svg>