@eddyskywalker/dsh-chatgpt-subscription 0.35.0 → 0.36.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/README.md +6 -6
- package/lib/client.js +1991 -167
- package/lib/client.js.map +1 -1
- package/lib/index.js +113 -10
- package/lib/types/client/antigravity/AntigravitySection.d.ts.map +1 -1
- package/lib/types/client/claude/ClaudeSection.d.ts.map +1 -1
- package/lib/types/client/claude/useClaudeSection.d.ts.map +1 -1
- package/lib/types/client/cline-pass/ClinePassSection.d.ts.map +1 -1
- package/lib/types/client/command-code/CommandCodeSection.d.ts.map +1 -1
- package/lib/types/client/common/line-locale.d.ts +21 -0
- package/lib/types/client/common/line-locale.d.ts.map +1 -0
- package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts.map +1 -1
- package/lib/types/client/glm-coding-plan/locales.d.ts +2 -2
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/kimi-code/KimiCodeSection.d.ts.map +1 -1
- package/lib/types/client/kimi-code/KimiModelCapabilities.d.ts.map +1 -1
- package/lib/types/client/kimi-code/locales.d.ts +2 -2
- package/lib/types/client/locales-ru/account-pool.d.ts +11 -0
- package/lib/types/client/locales-ru/account-pool.d.ts.map +1 -0
- package/lib/types/client/locales-ru/antigravity.d.ts +10 -0
- package/lib/types/client/locales-ru/antigravity.d.ts.map +1 -0
- package/lib/types/client/locales-ru/claude.d.ts +3 -0
- package/lib/types/client/locales-ru/claude.d.ts.map +1 -0
- package/lib/types/client/locales-ru/cline-pass.d.ts +11 -0
- package/lib/types/client/locales-ru/cline-pass.d.ts.map +1 -0
- package/lib/types/client/locales-ru/command-code.d.ts +9 -0
- package/lib/types/client/locales-ru/command-code.d.ts.map +1 -0
- package/lib/types/client/locales-ru/glm-coding-plan.d.ts +10 -0
- package/lib/types/client/locales-ru/glm-coding-plan.d.ts.map +1 -0
- package/lib/types/client/locales-ru/hub.d.ts +3 -0
- package/lib/types/client/locales-ru/hub.d.ts.map +1 -0
- package/lib/types/client/locales-ru/index.d.ts +27 -0
- package/lib/types/client/locales-ru/index.d.ts.map +1 -0
- package/lib/types/client/locales-ru/kimi-code.d.ts +10 -0
- package/lib/types/client/locales-ru/kimi-code.d.ts.map +1 -0
- package/lib/types/client/locales-ru/minimax-code.d.ts +9 -0
- package/lib/types/client/locales-ru/minimax-code.d.ts.map +1 -0
- package/lib/types/client/locales-ru/ollama.d.ts +10 -0
- package/lib/types/client/locales-ru/ollama.d.ts.map +1 -0
- package/lib/types/client/locales-ru/opendesign.d.ts +10 -0
- package/lib/types/client/locales-ru/opendesign.d.ts.map +1 -0
- package/lib/types/client/locales-ru/progress-updates.d.ts +8 -0
- package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -0
- package/lib/types/client/locales-ru/qoder.d.ts +11 -0
- package/lib/types/client/locales-ru/qoder.d.ts.map +1 -0
- package/lib/types/client/locales-ru/step-code.d.ts +9 -0
- package/lib/types/client/locales-ru/step-code.d.ts.map +1 -0
- package/lib/types/client/minimax-code/locales.d.ts +2 -2
- package/lib/types/client/ollama/OllamaSection.d.ts.map +1 -1
- package/lib/types/client/opendesign/OpenDesignSection.d.ts +4 -3
- package/lib/types/client/opendesign/OpenDesignSection.d.ts.map +1 -1
- package/lib/types/client/opendesign/locales.d.ts +108 -42
- package/lib/types/client/opendesign/locales.d.ts.map +1 -1
- package/lib/types/client/opendesign/styles.d.ts.map +1 -1
- package/lib/types/client/qoder/QoderSection.d.ts +2 -1
- package/lib/types/client/qoder/QoderSection.d.ts.map +1 -1
- package/lib/types/client/qoder/locales.d.ts +1 -1
- package/lib/types/client/step-code/StepCodeSection.d.ts.map +1 -1
- package/lib/types/client/step-code/locales.d.ts +2 -2
- package/lib/types/host/opendesign/client.d.ts +53 -0
- package/lib/types/host/opendesign/client.d.ts.map +1 -1
- package/lib/types/host/opendesign/routes.d.ts +4 -3
- package/lib/types/host/opendesign/routes.d.ts.map +1 -1
- package/lib/types/host/opendesign/types.d.ts +10 -0
- package/lib/types/host/opendesign/types.d.ts.map +1 -1
- package/lib/types/shared/opendesign-contracts.d.ts +35 -2
- package/lib/types/shared/opendesign-contracts.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.36.0 - 2026-10-22
|
|
6
|
+
- **[client] 修复俄语语言包与 `@linxin666/dsh-i18n` 等已安装语言包冲突导致插件客户端激活失败崩溃的问题**
|
|
7
|
+
- **现象**:Web 界面启动失败,提示 `web boot: 1 entry did not activate`,`@eddyskywalker/dsh-chatgpt-subscription: failed`。
|
|
8
|
+
- **根因**:环境中其它插件若先于本插件注册了 `'ru'` 语言,`ctx.locale.addLanguage` 会直接抛出 `Error: locale "ru" is already registered`;未被捕获的错误导致 Cordis 插件生命周期被标记为 FAILED,从而阻断了整个客户端加载。
|
|
9
|
+
- **改法**:在 `installRussianLocale` 中使用 `try-catch` 保护 `addLanguage` 与 `register` 调用,发生冲突时平滑捕获并返回 no-op disposer,继续注册本插件的各个 provider 命名空间字典;并在 `installLineLocale` 增加对 `locale` 对象的空值安全防御。
|
|
10
|
+
- **验证**:新增冲突用例(`addLanguage` 抛错且某个命名空间 `register` 抛错时,安装不抛错、其余命名空间仍注册);三工程 `tsc` 0 错误;全量 vitest 4452 passed / 7 skipped / 0 failed;`npm run build` 通过。
|
|
11
|
+
- **[opendesign] 套餐档位与额度改读 `/billing/summary`——订阅后不再显示 `free`,额度打开设置页即自动读取**
|
|
12
|
+
- **现象**:已订阅 Go 的账号,账号行仍显示 `free`;「钱包余额」区打开时永远停在「尚未读取余额」,必须手动点刷新才出现一个美元数字,看不到套餐、周期与 credits。
|
|
13
|
+
- **根因**:档位抄的是设备授权应答里的 `user.plan`,登录后永不更新,而上游对已订阅账号也返回 `"free"`(本机实测);额度只读 `GET /wallet/balance`,且只在显式刷新时读、只存在进程内存。真正的档位与额度在控制 Key 可读的 `GET /billing/summary` 里:`membershipTier`(go/plus/pro/max)、订阅状态、本周期、订阅/充值/合计 credits 及美元、今日与累计消耗。
|
|
14
|
+
- **改法**:`/usage` 并行读钱包与账单摘要,钱包被拒时用账单总额兜底,两个面各自失败不互相掩盖;账单档位覆盖登录快照,读一次就纠正账号行。设置页打开时自动读一次(仅当号池里有浏览器授权账号;粘贴的 API Key 没有控制 Key,不发请求)。「套餐与额度」区块移到账号卡下方,展示档位、状态、本周期、三类 credits 与美元、今日/累计消耗、计费请求数。仍然不画百分比条:摘要只说剩余,不说配额上限,卡片不臆造分母。
|
|
15
|
+
- **验证**:三工程 `tsc` 0 错误;全量 vitest 4451 passed / 7 skipped / 0 failed;`npm run build` 通过;用真实控制 Key 请求 `/billing/summary` 返回 `go` / `active` / 15000 credits($1.50),经 `/usage` 后 status 的 `plan` 由 `free` 变为 `go`。
|
|
16
|
+
- **[client] 新增俄语语言包(`ru`):插件自己的设置界面可以选择俄语,未翻译的键回落到英文**
|
|
17
|
+
- **背景**:`@deepseek-ai/dsh-client-locale` 的字典注册有两种形态——整本双语 `register(ns, { zh, en })`(内置两种语言都必须给全),以及给语言包用的单语言 `register(ns, locale, dict)`;语言本身由 `addLanguage({ id, label, fallback })` 加进目录。俄语走第二条路,**不是**给每个命名空间加第三列。
|
|
18
|
+
- **改法**:新增 `src/client/locales-ru/`——13 份字典(每条线路一份,共 1440 个键,键集与 `zh`/`en` 逐一对应)+ `account-pool.ts`(12 条线路共用的账号卡片文案)+ `index.ts` 的 `installRussianLocale(ctx)`:先 `addLanguage({ id: 'ru', label: 'Русский', fallback: 'en' })`,再按命名空间逐个 `register(ns, 'ru', dict)`,每个注册各持一个 disposer。客户端入口 `apply` 调用一次。
|
|
19
|
+
- **回落语义**:声明的 `fallback` 是 `en`,所以本包漏掉的键读作英文而不是键名;宿主自身的界面只有 `zh`/`en`,因此「插件俄语 + 宿主英文」是预期形态,DSH 本体要俄语是另一个语言包的事。
|
|
20
|
+
- **旧宿主兼容**:`addLanguage` 是语言包那半边契约才有的接口。没有它的宿主/测试替身直接跳过整个包(此时语言根本不可选,字典也就无从取用),而不是让客户端插件在缺一个 seam 的服务上崩掉。
|
|
21
|
+
- **测试**:新增 `test/russian-locale.test.tsx`(41 例)——13 个命名空间 × 三条断言(键集与 `zh`/`en` 完全一致、每个 `{placeholder}` 逐字保留、值里没有中日韩字符且不是整份照抄英文),另外钉住 `installRussianLocale` 注册一次语言 + 每条线路一次字典(disposer 数量 = 13 + 1),以及同一张 Claude 卡在 `ru` 下渲染俄语且不回落到 `zh`。
|
|
22
|
+
- **验证**:`npm run typecheck` 0 错误;`npm run build` 通过;全量 `npx vitest run` 4436 passed / 4 failed——同样是与本改动无关的 4 条 `Intl` 用例(俄语默认 locale 下 `1,200` → `1 200`、日期变俄文),在改动前就红。
|
|
23
|
+
- **[client] 除 ChatGPT 外,所有供应商详情页在英文界面下仍是中文——卡片直接渲染自己的 `zh` 字典,从不问本地化服务**
|
|
24
|
+
- **现象**:设置 › 订阅服务里点开 Claude(以及 Antigravity / Command Code / Kimi Code / MiniMax Code / GLM / Ollama / Step Code / Cline Pass / Qoder / OpenDesign),整页文案都是中文,即使界面语言是 English;只有 ChatGPT 那张卡是英文。每个命名空间的 `dictionaries` 里 `en` 早就齐全,且键集与 `zh` 完全一致,缺的从来不是翻译。
|
|
25
|
+
- **根因**:12 处 `const t = zh`(`claude/ClaudeSection.tsx`、`claude/useClaudeSection.ts`、`antigravity`、`command-code`、`glm-coding-plan`、`kimi-code` 两处、`ollama`、`cline-pass`、`step-code`、`qoder`、`opendesign`)把字典对象在渲染时直接捕获;`ctx.locale` 一次都没被读过。ChatGPT 卡片能用英文,只因为它渲染的是 hub 注入的 `t` 座位。
|
|
26
|
+
- **改法**:新增 `src/client/common/line-locale.ts`——`installLineLocale(ctx.locale)` 在客户端入口调用一次;`useLineDict(ns, zh)` 返回该命名空间的**字典形状视图**:属性访问不变(`t.signIn`)、键集与回退字典一致,但每个值在渲染时经 `ctx.locale.bind(ns)` 读取,并订阅 locale revision,所以切换语言会重渲染当前卡片而无需重挂载。没有 locale 服务时(单测裸挂卡片、只提供 `register`/`bind` 的旧宿主)退回回退字典,即改动前行为。
|
|
27
|
+
- **顺带修掉的冻结**:模块级捕获 `zh` 的四处表(Kimi 的思考档位、cline-pass 与 opendesign 的服务端错误前缀、GLM 的区域名、`qoderModelRowHint`)改为使用渲染期解析出的字典,否则这几行会一直说中文。
|
|
28
|
+
- **验证**:新增 `test/line-locale.test.tsx`(4 例)——同一张 Claude 卡在 `en` 下渲染英文、在 `zh` 下渲染中文、切换语言不重挂载即可换文案,并钉住 zh/en 键集一致这条前提;`npm run typecheck` 0 错误;`npm run build` 通过;全量 `npx vitest run` 4395 passed / 4 failed,与改动前(`git stash` 对照)完全相同的 4 条——它们断言英文 `Intl` 格式(`1,200`、`12:03`),在俄语默认 locale 的机器上必然失败,与本改动无关。
|
|
29
|
+
|
|
5
30
|
## 0.35.0 - 2026-10-21
|
|
6
31
|
- **【BREAKING】移除 WorkBuddy(CodeBuddy 订阅)线路及其全部残留**
|
|
7
32
|
- 该线路的上游已经失效,因此整条移除,而不是藏在开关后面:`src/host/workbuddy/`(15 文件)、`src/client/workbuddy/`(5 文件)、`src/shared/workbuddy-contracts.ts`、21 个专属测试与夹具、7 个一次性实况探针、其专属文档,以及它在共享词汇表里的那几项(`CONTROLLED_PROVIDERS`、能力表、请求诊断的 provider/route/wire 三处、hub 卡片与品牌图标、composer 配额槽位)一并删除;`src/index.ts` 里 85 处注册全部摘除。
|
package/README.md
CHANGED
|
@@ -1037,8 +1037,8 @@ OAuth 是默认入口;「使用 API Key」按钮保留为兼容回退,部署
|
|
|
1037
1037
|
|
|
1038
1038
|
**登录有两条路,共用同一个号池**:
|
|
1039
1039
|
|
|
1040
|
-
1. **浏览器授权(推荐)** — 点「登录 OpenDesign 账号」,宿主向 `POST /api/v1/cli/device-authorizations` 申请一次设备授权并给出激活地址与授权代码;在浏览器确认后,查询接口 `POST /api/v1/cli/device-authorizations/{deviceId}/token` 会返回一对 Key:`vela_ctrl_…` 控制 Key 与 `sk-amr-…` 运行时 Key,外加账号身份(邮箱 / 名称 / 套餐)。运行时 Key 走对话,控制 Key
|
|
1041
|
-
2. **粘贴 API Key(回退)** — 在 Cloud 控制台(工作区 → API Keys)创建后粘贴,仅用于对话(没有控制 Key
|
|
1040
|
+
1. **浏览器授权(推荐)** — 点「登录 OpenDesign 账号」,宿主向 `POST /api/v1/cli/device-authorizations` 申请一次设备授权并给出激活地址与授权代码;在浏览器确认后,查询接口 `POST /api/v1/cli/device-authorizations/{deviceId}/token` 会返回一对 Key:`vela_ctrl_…` 控制 Key 与 `sk-amr-…` 运行时 Key,外加账号身份(邮箱 / 名称 / 套餐)。运行时 Key 走对话,控制 Key 读钱包余额与账单摘要(套餐档位、credits、周期)。签发的 Key 不过期,失效只能重新登录;**宿主自身不打开浏览器**,由卡片 `window.open` 打开激活页(与本插件其它线路同一条规则)。
|
|
1041
|
+
2. **粘贴 API Key(回退)** — 在 Cloud 控制台(工作区 → API Keys)创建后粘贴,仅用于对话(没有控制 Key,因此读不了余额与套餐额度)。
|
|
1042
1042
|
|
|
1043
1043
|
号池支持多账号轮换;部署也可以用 `OPENDESIGN_API_KEY` 提供第一把 Key(号池为空时投射为首要账号,不写入凭据库)。
|
|
1044
1044
|
|
|
@@ -1046,7 +1046,7 @@ OAuth 是默认入口;「使用 API Key」按钮保留为兼容回退,部署
|
|
|
1046
1046
|
|
|
1047
1047
|
**模型目录**:随包内置 37 个聊天模型,每个都带 id、显示名、美元单价,以及**上下文窗口、最大输出、输入模态(是否收图)与推理档位**——价目来自官方公开价目接口,能力字段转录自本仓库已核对过的同族模型表(command-code 官方注册表、cline-pass、Claude 与 Antigravity 目录;两处冲突以 cline-pass 为准)。登录成功或添加 Key 后自动同步实时目录:**浏览器授权账号(带控制 Key)还会读 AMR 控制面目录**,那里有上游真实的 `metadata.contextWindowTokens`,会覆盖随包表;网关自己的 `/v1/models` 提供该 Key 实际可见的模型清单。同步条目持久化在设置文档里,重启无需网络即可恢复。**`minimax-m3.1-flash` 与 `muse-wonder` 没有任何同族表可核对**,按 128k / 默认三档处理并在文档里列名,不猜数字;任何模型都能在卡片的「上下文窗口」里按模型修正,覆盖值优先于以上全部来源。
|
|
1048
1048
|
|
|
1049
|
-
|
|
1049
|
+
**套餐与额度**:只有浏览器授权登录的账号带控制 Key,因此只有它们能读套餐与额度——`GET /api/v1/wallet/balance` 给当前余额(`balanceUsd` 字符串),`GET /api/v1/billing/summary` 给真正的档位(`membershipTier`:Go / Plus / Pro / Max)、订阅状态与本周期,以及订阅 / 充值 / 合计 credits 和已消耗美元。**档位不读登录应答里的 `user.plan`**:上游对已订阅账号也返回 `free`,且登录后不再更新。设置页打开时会自动读一次;「套餐与额度」区块按账号列出档位、状态、周期、credits 与消耗,账号行显示真实档位(例如 `Go · 生效中`)。钱包读取被拒时用账单的合计金额兜底,两个面互不掩盖;粘贴的 API Key 没有控制 Key,卡片会说明并建议去控制台查看。对话输入框右侧的胶囊仍显示主账号余额;读不到时显示原因而不是 0。**本线路不画百分比额度条**——摘要给的是剩余而不是可对照的配额上限,编一个分母就是编数据。
|
|
1050
1050
|
|
|
1051
1051
|
### 插件路由(OpenDesign)
|
|
1052
1052
|
|
|
@@ -1054,7 +1054,7 @@ OAuth 是默认入口;「使用 API Key」按钮保留为兼容回退,部署
|
|
|
1054
1054
|
|
|
1055
1055
|
| 方法 | 路径 | 用途 |
|
|
1056
1056
|
| --- | --- | --- |
|
|
1057
|
-
| GET | `/status` |
|
|
1057
|
+
| GET | `/status` | 卡片状态:开关、号池、模型、目录同步、余额与额度读数、登录流程 |
|
|
1058
1058
|
| POST | `/settings` | 线路开关与高级设置(网关地址、默认窗口、并发、空闲超时) |
|
|
1059
1059
|
| GET\|POST | `/accounts` | 账号增删、主账号、别名、轮换策略、Key 测试(用免费的目录读取验证,不花额度) |
|
|
1060
1060
|
| POST | `/login/start` | 申请设备授权,应答激活地址与授权代码(不含 deviceSecret) |
|
|
@@ -1064,9 +1064,9 @@ OAuth 是默认入口;「使用 API Key」按钮保留为兼容回退,部署
|
|
|
1064
1064
|
| POST | `/models/visibility`、`/models/visibility-all` | 单个/批量隐藏 |
|
|
1065
1065
|
| POST | `/models/context-window` | 单模型上下文窗口覆盖 |
|
|
1066
1066
|
| POST | `/catalog/refresh` | 用号池里可用的 Key 同步实时目录;目录真的变了才通知模型选择器重建 |
|
|
1067
|
-
| GET\|POST | `/usage` | 读取每个 OAuth
|
|
1067
|
+
| GET\|POST | `/usage` | 读取每个 OAuth 账号的钱包余额与账单摘要(套餐、credits、周期;每账号各一次请求);两项独立,失败作为数据显示,绝不标记账号 |
|
|
1068
1068
|
|
|
1069
|
-
协议事实与未验证项的完整证据记录见 `docs/opendesign-line-plan.md`:设备授权的创建与轮询响应是**实测**的,批准后的字段名来自上游 issue #8870
|
|
1069
|
+
协议事实与未验证项的完整证据记录见 `docs/opendesign-line-plan.md`:设备授权的创建与轮询响应是**实测**的,批准后的字段名来自上游 issue #8870;钱包与账单摘要在真实订阅账号上实测过,对话链路仍未与真实 Key 联调。
|
|
1070
1070
|
|
|
1071
1071
|
## 本机登录
|
|
1072
1072
|
|