@eddyskywalker/dsh-chatgpt-subscription 0.24.6 → 0.25.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.
- package/CHANGELOG.md +25 -0
- package/lib/client.js +13 -0
- package/lib/client.js.map +1 -1
- package/lib/index.js +142 -13
- package/lib/types/host/antigravity/adapter.d.ts +11 -0
- package/lib/types/host/antigravity/adapter.d.ts.map +1 -1
- package/lib/types/host/antigravity/mapper.d.ts +1 -0
- package/lib/types/host/antigravity/mapper.d.ts.map +1 -1
- package/lib/types/host/claude/account-pool.d.ts.map +1 -1
- package/lib/types/host/claude/oauth.d.ts +23 -1
- package/lib/types/host/claude/oauth.d.ts.map +1 -1
- package/lib/types/host/claude/types.d.ts +13 -0
- package/lib/types/host/claude/types.d.ts.map +1 -1
- package/lib/types/host/common/idle-watchdog.d.ts.map +1 -1
- package/lib/types/host/common/llm-compat.d.ts +19 -4
- package/lib/types/host/common/llm-compat.d.ts.map +1 -1
- package/lib/types/host/common/reasoning-efforts.d.ts +2 -0
- package/lib/types/host/common/reasoning-efforts.d.ts.map +1 -0
- package/lib/types/host/common/request-images.d.ts +6 -0
- package/lib/types/host/common/request-images.d.ts.map +1 -1
- package/lib/types/host/common/webserver-compat.d.ts +7 -0
- package/lib/types/host/common/webserver-compat.d.ts.map +1 -0
- package/lib/types/host/kimi-code/adapter.d.ts +6 -0
- package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
- package/lib/types/host/minimax-code/adapter.d.ts +6 -0
- package/lib/types/host/minimax-code/adapter.d.ts.map +1 -1
- package/lib/types/host/minimax-code/mapper.d.ts.map +1 -1
- package/lib/types/host/model-catalog.d.ts.map +1 -1
- package/lib/types/host/step-code/adapter.d.ts +7 -1
- package/lib/types/host/step-code/adapter.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +37 -37
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.25.0 - 2026-10-17
|
|
6
|
+
|
|
7
|
+
- **[Harness] 支持 DSH 0.2.1-alpha.5,并接入新版可用的请求元数据能力**
|
|
8
|
+
- **依赖与启动兼容**:15 个 `@deepseek-ai/dsh-*` peer range 都明确加入 `0.2.1-alpha.5`,dev 基线使用精确版本,避免安装时静默落到刚发布的 `0.2.1-rc.1`。Cordis / loader / schemastery 使用与 alpha.5 peer 约束兼容的稳定补丁版,消除了根包 alpha 与间接稳定插件之间的真实 peer 冲突;`package-lock.json`、`pnpm-lock.yaml` 和 `pnpm-workspace.yaml` 已同步。
|
|
9
|
+
- **WebServer 与流超时**:`webServer.port` 在新版变为可空,Codex 本地图片地址改为优先使用新版 `getOrigin()`,旧版保留原 loopback / wildcard 构造,未绑定服务则明确报错。上游 idle watchdog 已能在传输忽略 abort 时结束等待;插件清理路径同步改为 detached drain,不再因 `await iterator.return()` 把已经超时的流重新挂死。
|
|
10
|
+
- **推理档位**:新版把 `reasoning.efforts` 定义为从低到高,会话标题等辅助调用直接选择第一项。Kimi live 乱序、MiniMax M3.1 的本地 `default`(省略后上游默认为 `max`)和 Codex live 档位现在都在 adapter 边界规范,设置页展示顺序与普通请求默认档不变,辅助调用能取得真正的最低档。
|
|
11
|
+
- **图片与工具视图**:Kimi / Step / MiniMax / Antigravity 新增 `imageRequestTarget()`,返回与真实 mapper 一致的缩放目标,供新版 CUA 等调用方使用;小图保留原尺寸和字节。共享与 Antigravity 目标同时补回旧 attachment store 必需的 `maxPixels`。Claude 的缩放取决于整次请求图片数,未伪造单图实现。Codex / Antigravity 图片工具视图还会读取新版惰性 `args`,在 preparing 阶段即可显示正在生成的 prompt,旧 `argsRaw` 形状继续兼容。
|
|
12
|
+
- **PTC 与旧代际**:新版 `run_code` 要求 `workingDirectory` 并用 `agent.ctx` 管理状态;实际受影响的是测试夹具而非生产授权逻辑,四个子代理授权用例已按新契约补齐并全部恢复。`llm-compat` 同时补齐旧类型没有的 `toolHistory`、`deferLoading` 与 tool-update 块,GLM 的现有拒绝行为不变。Claude OAuth 测试不再假设 `freePort + 1` 一定可绑定,以匹配 Windows 动态单端口保留;生产 OAuth 代码未改。
|
|
13
|
+
- **验证**:新基线强制 typecheck、干净 build、`npm ci --dry-run`、`npm pack --dry-run`(523 文件)均通过,全量 **230 passed | 1 skipped(231 文件)、3785 passed | 7 skipped、0 failed**。`0.2.0-rc.2` clean room 为 **3784 passed | 8 skipped、0 failed**;`0.1.5-rc.3` clean room 为 **3780 passed | 8 skipped**,仅已有记录的无 `dsh-ptc-runtime` PTC 文件无法加载,其他 229 个文件全部通过。
|
|
14
|
+
- **未采用 / 未验证**:`conversation.input.model.label` 需要另一套新旧双轨额度 UI 设计,第一方 `AccountNoticeStack` 不是通用插件通知服务,本轮没有强行迁移九条额度徽标;`ConfigureCall` 在插件内没有 auxiliary 调用点,`toolUpdate`、nested PTC `presentationMeta` 和官方图片 factory 留待独立评估。`0.2.1-rc.1` 无对应源码标签,不在本轮已验证范围;未做真实账号网络调用或 CUA / 新槽位的交互验证。
|
|
15
|
+
|
|
16
|
+
## 0.24.7 - 2026-10-16
|
|
17
|
+
- **[MiniMax Code] M3.1 在 `effort: max` 下偶尔把一整轮花在思考上就 `end_turn`:只有 thinking 块、没有正文也没有工具调用,harness 把「无工具调用的 stop」当成正常完成,整轮无报错地停住(issue #57)**
|
|
18
|
+
- **现象**:MiniMax Code 线路偶发**整轮无预警停住**——界面不报错、不重试、不弹提示,回复停在半句话上(如 `...Let me read lines 130-160 of the upstream preset.`)。
|
|
19
|
+
- **根因(会话存档实证,非推断)**:M3.1 在 `effort: 'max'` 下有时把整轮都花在思考上,然后带 `stop_reason: end_turn` 收尾,**只回一个 thinking 块**。mapper 把它如实映射成 `{ kind: 'stop' }`(这一步没错),但 harness 的 `agent-loop` 对「没有工具调用的 stop」无条件返回 `{ kind: 'completed' }`(`packages/core/agent-loop/src/agent.ts`),于是整轮就这么结束、调用方零感知。**责任层在 turn-end 映射,不在适配器**:本机 24 个会话存档里该线路 20 个 completed 轮次中有 **4 个**是这种形状,全部 `effort: 'max'`,每一轮的下一句用户输入都是「继续」。存档里的 `message.source.replayState.blocks` 保存了未改写的原生块,四例均为 `["thinking"]`——即上游本来就没发正文,不是适配器吞了内容,也不是流被掐断(`state.done` 为真,`assertStreamComplete` 放行是正确的)。
|
|
20
|
+
- **改法**:`finishReasonFor` 在 `stop` 之前新增判据——**既没有可见正文、也没有工具调用**时返回 `{ kind: 'error', failure: { code: 'PROVIDER_ERROR' } }`,形状照 `antigravity/mapper.ts` 里 `OTHER` 的既有写法。判据**不能复用 `state.hasContent`**:该标志由 `thinking_delta` 一起置位(文本/思考增量共用一个分支),「只有推理」在它眼里也是「有内容」,这正是此前一直没能接上判据的原因。失败信息里同时带上这一轮是被哪个事件收尾的(`message_stop` / `stop-reason` / `stream-end`,内部辅助函数、不对外导出),以后报到这个错可直接看出流是怎么结束的。
|
|
21
|
+
- **验证**:`npm run typecheck` 0 错误;全量 **226 passed | 1 skipped(227 文件)、3765 passed | 7 skipped、0 failed**。新增一张表驱动的**终止线形回归网**(9 种线形 + 1 条 `max_tokens` 独立用例):只有 thinking 增量 / thinking 仅在 `content_block_start` / 空流 / 空 text 块 / 纯空白 text → `error`;reasoning→text、只有 text → `stop`;只有工具调用、reasoning+工具调用 → `tool-calls`;`max_tokens` 截断 → `max-tokens`,**无健康线形被误伤**。矩阵中每一例都同时断言 `assertStreamComplete` 不抛——判据关于**内容**,与流是否被截断无关。**承重已双向检查(负对照)**:移掉 `finishReasonFor` 里那段判据,矩阵中 5 条 `error` 用例立刻变红、4 条健康线形仍绿。
|
|
22
|
+
- **升级提示**:这是**明确报错**而不是自动重试——`PROVIDER_ERROR` 不在本线重试集合里(`adapter.ts` 只有 `RATE_LIMIT / SERVER / TIMEOUT / TRANSPORT`)。升级后遇到这种轮次会看到一条失败的轮次,而不是静默停住;要让该轮自动跑完仍需另做续跑注入(未包含在本次改动内)。
|
|
23
|
+
- **[Claude] 续期请求要了授权里没有的 `org:create_api_key`:每次 access token 到期都被判 `invalid_scope`,账号被标成过期,只能重新登录**
|
|
24
|
+
- **现象**:Claude 线路大约每个 token 周期(约 8 小时,或隔夜后第一次使用)就报 `Claude rejected the sign-in: The requested scope is invalid, unknown, or malformed.. Sign in again.`,必须重新登录;其他线路没有这个问题。
|
|
25
|
+
- **根因(会话存档实证,非推断)**:authorize 请求的是 `OAUTH_SCOPES`(含 `org:create_api_key`),授权服务器对订阅账号**静默剥掉**这一项而不让登录失败(落盘凭据的 `scopes` 只有 5 个 `user:*`),续期却把整组 `OAUTH_SCOPES` 原样发回。RFC 6749 §6 规定续期不得请求原授权以外的 scope,服务器回 `invalid_scope`;它在 `FINAL_GRANT_CODES` 里 → `ClaudeUnauthorizedError` → 号池 `refreshFailureStatus` 标 `expired` 并移出轮换。本机会话存档在 10-14 至 10-16 间出现 4 次上述原文报错,间隔 11–13 小时。对照:官方 Claude Code 续期只发 5 个 claude.ai scope,参考实现 pi-mono 续期不带 scope——只有本插件多要了一项。
|
|
26
|
+
- **改法**:新增 `refreshScopeFor`,续期只回发凭据自己记录的已授权 scope(去空白、去重、保序);凭据没有记录时回退到新常量 `OAUTH_REFRESH_FALLBACK_SCOPES`(与官方客户端一致,不含 `org:create_api_key`)。`ensureAccessToken` 与号池 `refreshClaudeCredential` 两个调用点都传入 `credentials.scopes`。authorize 请求保持不变。
|
|
27
|
+
- **验证**:`npm run typecheck`、`npm run build` 0 错误;全量 **226 passed | 1 skipped(227 文件)、3753 passed | 9 skipped、0 failed**(新增 4 例;多出的 2 个 skipped 是本机缺 pi-ai 参考快照的 `claude-model-catalog` 保真断言,与本改动无关)。新用例的假 token 端点按 RFC 6749 §6 拒绝越权 scope,号池用例走真实 refresh hook(不经测试 seam)。**承重已双向检查(负对照)**:把续期 body 还原为 `scope: OAUTH_SCOPES`,3 条新用例失败,其中两条抛出的正是线上那句 `The requested scope is invalid, unknown, or malformed.. Sign in again.`。
|
|
28
|
+
- **升级提示**:升级前已被这个问题标成"需要重新登录"的账号,升级后仍需重新登录一次来清除标记;之后续期正常。
|
|
29
|
+
|
|
5
30
|
## 0.24.6 - 2026-10-16
|
|
6
31
|
- **[WorkBuddy 国际区] 补上与官方客户端一致的会话头组,并修正 `11128` 被当成单一含义的过期结论(issue #56)**
|
|
7
32
|
- **报告**:#56 称国际区(`www.workbuddy.ai`)线路恒返回 400 `code 11128` / `msg: "conversation id missing"`,根因是网关新增渠道校验、要求 `X-Conversation-ID` / `X-Conversation-Request-ID` / `X-Conversation-Message-ID` / `X-Request-ID` / `acp-connection-id` 这 5 个头,而插件一个都不带;报告者用自己的国际区凭据做过单变量差分,称这 5 个是**最小充分集**。
|
package/lib/client.js
CHANGED
|
@@ -223,6 +223,8 @@ window.__ModuleLoader__.load({
|
|
|
223
223
|
});
|
|
224
224
|
}
|
|
225
225
|
function promptFromBlock(block) {
|
|
226
|
+
const partial = partialPromptFromBlock(block);
|
|
227
|
+
if (partial !== null) return partial;
|
|
226
228
|
const raw = "kind" in block ? block.call?.argsRaw : dispatchedArgsRaw(block);
|
|
227
229
|
if (typeof raw !== "string" || raw.trim() === "") return null;
|
|
228
230
|
try {
|
|
@@ -232,6 +234,17 @@ window.__ModuleLoader__.load({
|
|
|
232
234
|
return null;
|
|
233
235
|
}
|
|
234
236
|
}
|
|
237
|
+
function partialPromptFromBlock(block) {
|
|
238
|
+
if (!("args" in block)) return null;
|
|
239
|
+
const args = block.args;
|
|
240
|
+
if (typeof args?.text !== "function") return null;
|
|
241
|
+
try {
|
|
242
|
+
const prompt = args.text.call(args, "prompt");
|
|
243
|
+
return typeof prompt === "string" ? prompt : null;
|
|
244
|
+
} catch {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
235
248
|
/**
|
|
236
249
|
* Arguments of a dispatched call that has no result yet.
|
|
237
250
|
*
|