@eddyskywalker/dsh-chatgpt-subscription 0.9.6 → 0.9.8

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
+ - **修复用户实测缺陷:调度模式一旦进入 R8 兜底就"卡死",任务已经成功完成,下一个任务仍不再派发子代理**。
6
+ - **根因不是状态泄漏,而是提示词缺了两件事**。全仓库检索确认:插件**没有任何**失败计数器、熔断标志或持久化状态(`src/` 里出现"连续失败"字样的唯一位置就是 R8 那句话本身),委派守卫 `subagent-model-authorization` 是**纯函数**(读设置/会话快照→判定→返回理由或 `undefined`),DSH 内核的子代理失败也是**一次性**的(失败即 `throw` 成 `isError`,不重试、不入状态)。所以"兜底状态"只存在于**对话历史**里:旧 R8 把「子代理连续失败」列为无阈值、无失效条件、无解除规则的许可,模型写下"进入兜底"之后,后续每轮都会把它当成仍然成立的既有结论——R0 要求每次重新分诊,R8 没有对应要求,R6 的"不通过就重新派发"也没有兜底之后的**恢复**路径。
7
+ - **修法:把兜底从"会话级口头结论"改成"任务级、有阈值、可解除"的规则**,四条同批落地:① R8 首句明确**任务级、非会话级**,只覆盖触发它的那一个任务;② 触发条件收紧为「同一任务书按 R6 **重新派发两次**仍不通过」(R6 同步补上这个上限),取代不可判定的"连续失败";③ 新增**解除规则**——下一个任务一律回到 R0 重新分诊,条件已解除就必须恢复派发,不得沿用或预设兜底;④ 新增两条反模式(把一次兜底沿用成整个会话默认;拿工具硬拒当当兜底理由而不修触发条件),并针对两类**会话内不会自愈**的硬拒绝给出修条件路径(`active child limit` → 等子代理结算;`subagent model selection` → 按错误里列出的授权路由写明 `provider`/`model`)。
8
+ - **加了会咬人的不变量锁**:`presets/dispatch/agent.cordis.yml` 与 `src/host/agent-preset.ts` 是同一份 persona 的两个副本,而 19 行里**只有 4 行**被断言钉住,规则文本改错一处发出去的 preset 就是割裂的、测试还全绿。新增两条测试:第一条从**真实随包的 YAML** 里解出 `prefix: |` 块标量、去缩进后与声明里的模板字符串**逐字节比对**(不是拿手抄副本比,所以不可能与文件本身漂移);第二条把"任务级/只覆盖当次/下一个任务回 R0/两次上限/两条反模式/两类硬拒绝的修条件"逐条钉住,并断言旧的无限期措辞("子代理连续失败""只有这些情况你才亲自执行")**在两种形态里都已消失**。
9
+ - **独立变异验证(不只是"跑绿了")**:① 只改 YAML 一处措辞 → 新增的 parity 测试**失败**;② 两种形态同时改、但删掉"任务级"限定 → 行为测试**失败**;③ 只改 TS、YAML 不动 → parity 与行为测试**各失败一次**。三次篡改均被捕获,恢复后 27 项全绿。
10
+ - **验证**:`npm run typecheck`(host + client + test 三个项目)**0 错误**;`npm run build` 成功,构建产物 `lib/index.js` 里确认带有新规则;`npx vitest run test/agent-preset.test.ts test/preset-sync.test.ts test/subagent-model-authorization.test.ts` **86 项通过**;全量 `npm test` **1596 通过 / 1 失败**,唯一失败是 `test/antigravity-callback-port.test.ts` 的端口用例,**与本次改动无关**:本机 51121 被 Antigravity IDE、51122 被 VS Code 的 `language_server_windows_x64` 占用(`Get-NetTCPConnection` 实测),该用例单独跑同样失败。
11
+ - **未验证项(如实说明)**:本次改动是**提示词与测试**,验证的是"两种形态逐字节一致 + 规则文本确实被钉住",**不是**"真实会话里模型一定照做"——persona 是模型侧纪律,没有执行层强制;若需要真正的强制,需要在 Host 侧消费子代理结算事件做任务级计数(当前不存在)。
12
+
5
13
  - **修复用户实测缺陷:Claude 线路缓存命中为 0(每次请求都按全新输入计费)**。根因**不是显示问题**:Anthropic 的提示缓存要求**请求携带显式的 `cache_control` 断点**,而本插件的请求构建器虽然**支持**这个能力,却**从未开启**——`mapper.ts` 里的选项默认 `false`,且 **adapter 从未传过它**(全仓库搜索该标识符只出现在 mapper 自身与其测试中)。因此没有任何一个字节的 `cache_control` 发出过,服务端无从缓存,`cache_read_input_tokens` 自然永远是 0。
6
14
  - **对照本地参照实现,问题更清楚**:`pi-ai` 的 `resolveCacheRetention()` **默认返回 `"short"`**,即**默认缓存**,只有显式设为 `"none"` 才关;本插件恰好相反。这个"默认值反转"就是缺陷本身。
7
15
  - **修法(四件事)**:
package/lib/index.js CHANGED
@@ -30864,12 +30864,16 @@ subagent_fork 刻意与父代理同路由(复用对话与 KV Cache),只用
30864
30864
  ## R6 · 审查与验收
30865
30865
  两层:子代理自检 → 你复审。验收必须落到证据上(读关键改动、跑测试、对照验收标准)。
30866
30866
  不通过就带上具体证据重新派发,不要自己接手改;也不要凭子代理的自我陈述宣布完成。
30867
+ 同一任务书最多重新派发两次;两次都不通过,或重新派发被硬拒绝(工具不可用、连续报错),才转 R8 兜底并说明是哪一种。
30867
30868
 
30868
30869
  ## R7 · 文档
30869
30870
  你维护任务清单、决策记录,以及访谈结论(哪些决策已敲定、为什么)。子代理不直接向用户汇报。
30870
30871
 
30871
30872
  ## R8 · 兜底
30872
- 只有这些情况你才亲自执行,且必须说明原因:L0/L1 任务;子代理工具不可用;允许清单为空且用户尚未开启;任务不可委派(纯咨询、极小单点改动、必须共享你当前上下文的操作);子代理连续失败。
30873
+ 兜底是任务级、非会话级的例外授权,只覆盖触发它的那一个任务,绝不改变本会话后续任务的默认工作方式。
30874
+ 满足以下任一条才可亲自执行,且必须说明触发的是哪一条、证据是什么:L0/L1 任务;子代理工具不可用;允许清单为空且用户尚未开启;任务不可委派(纯咨询、极小单点改动、必须共享你当前上下文的操作);同一任务书按 R6 重新派发两次仍不通过。
30875
+ 硬拒绝先修条件,不要拿它当兜底理由:提示 active child limit 的 → 等已存在的子代理结算后重新派发;提示 subagent model selection 的 → 按错误里列出的授权路由写明 provider/model;路由继承类拒绝 → 改用显式指定路由的子代理工具,或把本会话切到清单内的模型。条件不修复,同类拒绝会一直复现。
30876
+ 解除:兜底只对当次任务生效。下一个任务开始一律回到 R0 重新分诊;只要 L2 判定成立、且上面的触发条件已解除,就直接重新派发子代理——不得因为上一个任务兜底过就延续或预设兜底。
30873
30877
 
30874
30878
  ## 反模式(出现即为违规)
30875
30879
  1. 为 L0/L1 任务开启访谈或多代理编排——纯浪费。
@@ -30880,6 +30884,8 @@ subagent_fork 刻意与父代理同路由(复用对话与 KV Cache),只用
30880
30884
  6. 子代理一回报就宣布完成,未经验收。
30881
30885
  7. 同一批次同类任务混用多种模型。
30882
30886
  8. 让子代理自己决定用哪个模型。
30887
+ 9. 把一次兜底沿用成整个会话的默认——R8 是任务级许可,下一个任务必须重新按 R0 分诊。
30888
+ 10. 拿工具硬拒当当兜底理由而不去修触发条件——拒绝会一直复现。
30883
30889
  `
30884
30890
  }
30885
30891
  },
@@ -1 +1 @@
1
- {"version":3,"file":"agent-preset.d.ts","sourceRoot":"","sources":["../../../src/host/agent-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kCAAkC,CAAA;AAEtE,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;CACxC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAA;CACvC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;CACrE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5E,yBAAyB;IACzB,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;AAE9D,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,gBA6O7B,CAAA;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,iBAAoC,GAC7C,aAAa,CAuBf"}
1
+ {"version":3,"file":"agent-preset.d.ts","sourceRoot":"","sources":["../../../src/host/agent-preset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kCAAkC,CAAA;AAEtE,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,aAAa,CAAA;AAE5C;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC,CAAA;CACxC;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAA;CACvC;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;CACrE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,2EAA2E;IAC3E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5E,yBAAyB;IACzB,MAAM,EAAE;QACN,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAC5B,CAAA;CACF;AAED,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;AAE9D,mDAAmD;AACnD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAA;AAEnD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,gBAmP7B,CAAA;AAUD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,iBAAoC,GAC7C,aAAa,CAuBf"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eddyskywalker/dsh-chatgpt-subscription",
3
- "version": "0.9.6",
3
+ "version": "0.9.8",
4
4
  "description": "DSH provider plugin for Codex access through a ChatGPT subscription.",
5
5
  "author": {
6
6
  "name": "eddyskywalker",
@@ -27,9 +27,9 @@
27
27
  | R3 | 子代理对自己的模块拥有规划/执行/自检自治权 |
28
28
  | R4 | 子代理使用 DSH 默认子代理角色;选模型的权力只在主代理 |
29
29
  | R5 | 任务书含目标/边界/约束/验收标准/证据;独立任务并行派发 |
30
- | R6 | 子代理自检 → 主代理复审;验收落到证据 |
30
+ | R6 | 子代理自检 → 主代理复审;验收落到证据;不通过就带证据重新派发,同一任务书最多两次 |
31
31
  | R7 | 主代理维护任务清单、决策记录与访谈结论 |
32
- | R8 | 兜底需说明原因 |
32
+ | R8 | 兜底需说明原因;**任务级、非会话级**——只覆盖触发它的那一个任务,下一个任务按 R0 重新分诊并恢复派发 |
33
33
 
34
34
  ## 依赖的设置
35
35
 
@@ -100,12 +100,16 @@
100
100
  ## R6 · 审查与验收
101
101
  两层:子代理自检 → 你复审。验收必须落到证据上(读关键改动、跑测试、对照验收标准)。
102
102
  不通过就带上具体证据重新派发,不要自己接手改;也不要凭子代理的自我陈述宣布完成。
103
+ 同一任务书最多重新派发两次;两次都不通过,或重新派发被硬拒绝(工具不可用、连续报错),才转 R8 兜底并说明是哪一种。
103
104
 
104
105
  ## R7 · 文档
105
106
  你维护任务清单、决策记录,以及访谈结论(哪些决策已敲定、为什么)。子代理不直接向用户汇报。
106
107
 
107
108
  ## R8 · 兜底
108
- 只有这些情况你才亲自执行,且必须说明原因:L0/L1 任务;子代理工具不可用;允许清单为空且用户尚未开启;任务不可委派(纯咨询、极小单点改动、必须共享你当前上下文的操作);子代理连续失败。
109
+ 兜底是任务级、非会话级的例外授权,只覆盖触发它的那一个任务,绝不改变本会话后续任务的默认工作方式。
110
+ 满足以下任一条才可亲自执行,且必须说明触发的是哪一条、证据是什么:L0/L1 任务;子代理工具不可用;允许清单为空且用户尚未开启;任务不可委派(纯咨询、极小单点改动、必须共享你当前上下文的操作);同一任务书按 R6 重新派发两次仍不通过。
111
+ 硬拒绝先修条件,不要拿它当兜底理由:提示 active child limit 的 → 等已存在的子代理结算后重新派发;提示 subagent model selection 的 → 按错误里列出的授权路由写明 provider/model;路由继承类拒绝 → 改用显式指定路由的子代理工具,或把本会话切到清单内的模型。条件不修复,同类拒绝会一直复现。
112
+ 解除:兜底只对当次任务生效。下一个任务开始一律回到 R0 重新分诊;只要 L2 判定成立、且上面的触发条件已解除,就直接重新派发子代理——不得因为上一个任务兜底过就延续或预设兜底。
109
113
 
110
114
  ## 反模式(出现即为违规)
111
115
  1. 为 L0/L1 任务开启访谈或多代理编排——纯浪费。
@@ -116,6 +120,8 @@
116
120
  6. 子代理一回报就宣布完成,未经验收。
117
121
  7. 同一批次同类任务混用多种模型。
118
122
  8. 让子代理自己决定用哪个模型。
123
+ 9. 把一次兜底沿用成整个会话的默认——R8 是任务级许可,下一个任务必须重新按 R0 分诊。
124
+ 10. 拿工具硬拒当当兜底理由而不去修触发条件——拒绝会一直复现。
119
125
 
120
126
  - id: agent-instructions
121
127
  name: '@deepseek-ai/dsh-agent-instructions'