@eddyskywalker/dsh-chatgpt-subscription 0.17.1 → 0.19.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 (68) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +103 -1
  3. package/lib/client.js +1543 -269
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +9112 -2459
  6. package/lib/types/client/glm-coding-plan/GlmCodingPlanComposerQuota.d.ts +27 -0
  7. package/lib/types/client/glm-coding-plan/GlmCodingPlanComposerQuota.d.ts.map +1 -0
  8. package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts +22 -0
  9. package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts.map +1 -0
  10. package/lib/types/client/glm-coding-plan/api.d.ts +4 -0
  11. package/lib/types/client/glm-coding-plan/api.d.ts.map +1 -0
  12. package/lib/types/client/glm-coding-plan/locales.d.ts +412 -0
  13. package/lib/types/client/glm-coding-plan/locales.d.ts.map +1 -0
  14. package/lib/types/client/glm-coding-plan/styles.d.ts +15 -0
  15. package/lib/types/client/glm-coding-plan/styles.d.ts.map +1 -0
  16. package/lib/types/client/glm-coding-plan/useGlmCodingPlanSection.d.ts +65 -0
  17. package/lib/types/client/glm-coding-plan/useGlmCodingPlanSection.d.ts.map +1 -0
  18. package/lib/types/client/hub/brand-icons.d.ts +7 -5
  19. package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
  20. package/lib/types/client/hub/providers.d.ts.map +1 -1
  21. package/lib/types/client/index.d.ts +2 -0
  22. package/lib/types/client/index.d.ts.map +1 -1
  23. package/lib/types/client/kimi-code/locales.d.ts +2 -2
  24. package/lib/types/client/minimax-code/locales.d.ts +2 -2
  25. package/lib/types/host/antigravity/oauth.d.ts +11 -1
  26. package/lib/types/host/antigravity/oauth.d.ts.map +1 -1
  27. package/lib/types/host/common/model-request-control.d.ts +1 -1
  28. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  29. package/lib/types/host/common/request-diagnostics.d.ts +1 -1
  30. package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
  31. package/lib/types/host/glm-coding-plan/account-pool.d.ts +152 -0
  32. package/lib/types/host/glm-coding-plan/account-pool.d.ts.map +1 -0
  33. package/lib/types/host/glm-coding-plan/adapter.d.ts +169 -0
  34. package/lib/types/host/glm-coding-plan/adapter.d.ts.map +1 -0
  35. package/lib/types/host/glm-coding-plan/adopt.d.ts +354 -0
  36. package/lib/types/host/glm-coding-plan/adopt.d.ts.map +1 -0
  37. package/lib/types/host/glm-coding-plan/biz-token-cache.d.ts +99 -0
  38. package/lib/types/host/glm-coding-plan/biz-token-cache.d.ts.map +1 -0
  39. package/lib/types/host/glm-coding-plan/client.d.ts +218 -0
  40. package/lib/types/host/glm-coding-plan/client.d.ts.map +1 -0
  41. package/lib/types/host/glm-coding-plan/exchange.d.ts +223 -0
  42. package/lib/types/host/glm-coding-plan/exchange.d.ts.map +1 -0
  43. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts +308 -0
  44. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts.map +1 -0
  45. package/lib/types/host/glm-coding-plan/mapper-openai.d.ts +213 -0
  46. package/lib/types/host/glm-coding-plan/mapper-openai.d.ts.map +1 -0
  47. package/lib/types/host/glm-coding-plan/model-catalog.d.ts +232 -0
  48. package/lib/types/host/glm-coding-plan/model-catalog.d.ts.map +1 -0
  49. package/lib/types/host/glm-coding-plan/oauth.d.ts +211 -0
  50. package/lib/types/host/glm-coding-plan/oauth.d.ts.map +1 -0
  51. package/lib/types/host/glm-coding-plan/routes.d.ts +93 -0
  52. package/lib/types/host/glm-coding-plan/routes.d.ts.map +1 -0
  53. package/lib/types/host/glm-coding-plan/signing.d.ts +323 -0
  54. package/lib/types/host/glm-coding-plan/signing.d.ts.map +1 -0
  55. package/lib/types/host/glm-coding-plan/token-store.d.ts +202 -0
  56. package/lib/types/host/glm-coding-plan/token-store.d.ts.map +1 -0
  57. package/lib/types/host/glm-coding-plan/types.d.ts +413 -0
  58. package/lib/types/host/glm-coding-plan/types.d.ts.map +1 -0
  59. package/lib/types/host/kimi-code/routes.d.ts +10 -0
  60. package/lib/types/host/kimi-code/routes.d.ts.map +1 -1
  61. package/lib/types/host/minimax-code/adapter.d.ts +11 -0
  62. package/lib/types/host/minimax-code/adapter.d.ts.map +1 -1
  63. package/lib/types/host/minimax-code/client.d.ts.map +1 -1
  64. package/lib/types/index.d.ts +9 -0
  65. package/lib/types/index.d.ts.map +1 -1
  66. package/lib/types/shared/glm-coding-plan-contracts.d.ts +315 -0
  67. package/lib/types/shared/glm-coding-plan-contracts.d.ts.map +1 -0
  68. package/package.json +1 -1
@@ -0,0 +1,232 @@
1
+ /**
2
+ * GLM(ZCode 账号)线路的逐模型能力表。
3
+ *
4
+ * 存在的原因是一条硬规则:**能力不得从模型名推断**(计划 §1、§7)。本文件只转录逐模型事实,
5
+ * 任何一行都不写「GLM-5.3 所以……」这种推理;拿不出证据的字段宁可留空数组 / 取兜底值,
6
+ * 也不发明一个看起来合理的取值——上游收到不认识的档位直接报错(`ERROR_CODE.INVALID_PARAM` 1214),
7
+ * 编出来的档位代价是一次必然失败的请求。
8
+ *
9
+ * ## 事实来源(逐行标注,不混用)
10
+ *
11
+ * 1. **官方开源版内置配置** `zai-org/ZCode` 的 `config/provider/zcode-builtin.json`(revision 31,
12
+ * 184927 字节)。**路径在仓库根,不在 `apps/zcode-cli/` 下**——后者没有 `config/` 目录,
13
+ * 直连 `apps/zcode-cli/config/provider/zcode-builtin.json` 会 404。本文件下面引用的行号级事实
14
+ * 都出自这一份(读取日期 2026-10-11):
15
+ * - `zai-api` / `bigmodel-api` 两个模板(`access.type = zhipu-coding-plan-api-key`)与四个
16
+ * `account:*-coding-plan` provider 的 `api.type` **全部**是 `anthropic-messages`,
17
+ * `baseUrl` 就是本线路的 Anthropic 面(`https://api.z.ai/api/anthropic` /
18
+ * `https://open.bigmodel.cn/api/anthropic`)——这是 `wire` 取 `'anthropic'` 的依据;
19
+ * - `builtinProviderModelRules`(账号型 provider 的模型启用表)逐条给
20
+ * `account:{zai,bigmodel}-{individual,team}-coding-plan` 启用**同样四个** id:
21
+ * `GLM-5.3` / `GLM-5.3-Flash` / `GLM-5.2` / `GLM-5-Turbo`。所以本表是这四个,不多不少;
22
+ * - `modelConfigRules.modelRules` 给出逐模型事实(见下方每一行的注释);
23
+ * - `modelConfigRules.providerSiteRules` 有两条 `modelMatch: ".*"` 的站点规则,分别命中
24
+ * `https://api\.z\.ai/api/anthropic` 与 `https://open\.bigmodel\.cn/api/anthropic`,
25
+ * 把 `supportsImage/supportsVideo` 打开成 `true`——**这两个地址就是本线路的两个 Coding Plan
26
+ * 基址**,所以本表所有行的 `supportsImages` 都是 `true`(详见各行注释与
27
+ * {@link GLM_VISION_BRIDGED_BY_PLAN_FACE})。
28
+ * 2. **本仓库历史转录** `7e40fce:src/host/zhipu/model-catalog.ts`:同一张 Coding Plan 目录的逐模型
29
+ * 转录(上下文窗口、输出上限、思考梯子、收不收图、可不可关思考),来源是 docs.z.ai 的参数表
30
+ * 与「深度思考」说明。本文件沿用它,因为它是本仓库里唯一一份针对 **Coding Plan 面**
31
+ * (而不是别家网关)逐模型转录过的表。
32
+ * 3. **两区差异与「取小值」规则**:`src/host/workbuddy/model-catalog.ts` 与 `CHANGELOG.md:87`
33
+ * (一条表同时覆盖两区时取小值——高报会被网关拒绝,低报只是提前压缩)。
34
+ *
35
+ * ## 与 workbuddy 转录的冲突(刻意不采信那一侧)
36
+ *
37
+ * workbuddy 记的是**别家聚合网关**(CodeBuddy)的发布值:`glm-5.3` 输出上限是 48000(intl)/
38
+ * 64000(cn)、`glm-5.2` 的梯子是 `['high','xhigh']`、`glm-5.3-flash` 默认窗口 300000。
39
+ * 那些数字描述的是另一个网关,本线路打不到它,所以它们在本文件里**不作为取值来源**,
40
+ * 只用来提醒复审:两处数字不一样时,先问「哪条证据描述的是本线路这个面」。
41
+ *
42
+ * 输出上限的取值理由:官方 builtin 规则给 `128000`,历史转录的 docs.z.ai 参数表给 `131072`。
43
+ * 按本仓库「取小值」的规则(高报会被网关拒绝,低报只是提前压缩一段对话,见
44
+ * `CHANGELOG.md:87`)取 `128000`;而且 128000 正是**官方客户端自己在 Coding Plan 面上发的那个数**。
45
+ *
46
+ * ## 没有进这张表的 id(以及为什么)
47
+ *
48
+ * workbuddy 目录里还有 `glm-5.1` / `glm-5v-turbo` / `glm-5.0` / `glm-5.0-turbo` /
49
+ * `glm-4.7` / `glm-4.6v` / `glm-4.6`,官方 builtin 配置里也有它们的完整清单——但那一份挂在
50
+ * `zai-standard-api` / `bigmodel-standard-api` 模板上,`baseUrl` 是 `/api/paas/v4`,
51
+ * **通用开放平台面,套餐额度不生效**(计划 §3.3 的 Common mistakes 段)。把它们塞进本线路的目录,
52
+ * 换来的只会是 1311 `MODEL_NOT_IN_PLAN` 或按量计费。真正的兜底是
53
+ * {@link undeclaredGlmModelEntry}:上游 `/models` 里真出现、而本表没有的 id,
54
+ * 以「未声明模型」进入目录(不猜协议、不发思考档位、不认图),而不是凭空补一行能力。
55
+ */
56
+ import type { GlmModelOption, GlmReasoningEffort, GlmRegion, GlmWire } from '../../shared/glm-coding-plan-contracts.ts';
57
+ /**
58
+ * 目录声明的协议面。
59
+ *
60
+ * `null` = **未声明**(D3:未知模型不猜协议)。只有上游目录里出现、而本表没有转录过的 id
61
+ * 才会是这个值;调用方(适配器)遇到 `null` 必须拒绝该模型并说明原因,
62
+ * 而不是替它挑一个面——挑错的表现是 1212 `WRONG_METHOD`,比直接拒绝更难排查。
63
+ */
64
+ export type GlmCatalogWire = GlmWire | null;
65
+ /** 一行模型能力。与 `GlmModelOption` 同义,去掉的只是「用户设置」那一半(见 {@link catalogModelOptions})。 */
66
+ export interface GlmModelEntry {
67
+ id: string;
68
+ name: string;
69
+ /** 一句话能力描述:思考形态 / 可选档位 / 输入模态 / 上下文窗口。由 {@link describeGlmModel} 生成。 */
70
+ hint: string;
71
+ /** 服务该模型的部署。两区模型 id 不同(计划 R8),这是路由事实不是偏好。 */
72
+ regions: readonly GlmRegion[];
73
+ /**
74
+ * 该模型**真实**接受的思考档位梯子(W6 会把它当 ladder 传给两个 mapper)。
75
+ *
76
+ * **空数组是有意语义**:该模型完全不发思考控制字段(`convergeGlmEffort` 对空梯子返回 `null`,
77
+ * 两个 mapper 据此不发出 `reasoning_effort`)。这不是「忘了填」,是「不发」。
78
+ */
79
+ reasoningEfforts: readonly GlmReasoningEffort[];
80
+ /**
81
+ * 思考能否关闭。与上一条**正交**:档位非空而本项为 false = 恒定开启
82
+ * (上游把 `thinking.type: "disabled"` 当错误拒绝)。
83
+ */
84
+ thinkingDisableable: boolean;
85
+ /** 该模型走哪个协议面(D3:逐模型声明)。未声明的行是 `null`。 */
86
+ wire: GlmCatalogWire;
87
+ /** 是否接受 image 输入。 */
88
+ supportsImages: boolean;
89
+ /** 目录声明的默认上下文窗口(token)。设置页可逐模型覆盖。 */
90
+ defaultContextWindow: number;
91
+ /** 调用方不指定输出上限时本线路请求的输出上限。 */
92
+ defaultMaxTokens: number;
93
+ /** 官方描述;没有逐字来源时为 null(不编文案)。 */
94
+ description: string | null;
95
+ }
96
+ /** 一行能力去掉 `hint` 的样子:hint 由 {@link withHint} 从其余字段生成,不手写。 */
97
+ export type GlmModelFacts = Omit<GlmModelEntry, 'hint'>;
98
+ /**
99
+ * **能力随端点变化的那一处**:本线路的两个 Coding Plan 基址上,视觉输入由套餐端桥接打开。
100
+ *
101
+ * 逐字证据(`config/provider/zcode-builtin.json` revision 31 的
102
+ * `modelConfigRules.providerSiteRules`),两条规则的 `modelMatch` 都是 `.*`:
103
+ *
104
+ * | baseUrlMatch | config |
105
+ * |---|---|
106
+ * | `https://api\.z\.ai/api/anthropic/?` | `{ properties: { inputFormat: { supportsImage: true, supportsVideo: true } } }` |
107
+ * | `https://open\.bigmodel\.cn/api/anthropic/?` | `{ properties: { inputFormat: { supportsImage: true, supportsVideo: true } } }` |
108
+ *
109
+ * 这两个地址正是本线路 `./types.ts` 的 `CHAT_PATH_ANTHROPIC` 拼在
110
+ * `apiBaseForRegion()` 之后的两个基址,所以**规则集在本线路所打的端点上解析出来的结果**是收图。
111
+ *
112
+ * 为什么必须把这件事写死在这里:基础 `modelRules` 里 `.*glm-5\.3(...)?` 明写
113
+ * `supportsImage: false`,而规则集的叠加顺序(`model` → `model-api` → `provider-site` →
114
+ * `template-model` → `provider-model`,后层覆盖前层)会让后一条站点规则把它改成 true。
115
+ * 计划 §7 那个反例「`glm-5.3-flash` 收图而 `glm-5.3` 不收」描述的是**基础规则那一层**,
116
+ * 在 Coding Plan 面上不成立。日后若有人照基础规则把 `supportsImages` 改回 false,
117
+ * 后果是 DSH 在一个接受图片的端点上拒绝用户发图——不是报错,是功能凭空消失。
118
+ *
119
+ * 所以本表 `supportsImages` 一律读作「**经本线路这两个 Anthropic 端点时**是否收图」,
120
+ * 而不是「模型本身是否多模态」。要拿基础能力,请回官方规则集的 `modelRules`。
121
+ */
122
+ export declare const GLM_VISION_BRIDGED_BY_PLAN_FACE: readonly string[];
123
+ /**
124
+ * 随包发布的目录(每一行的 `hint` 已生成)。
125
+ *
126
+ * 导出的是生成结果而不是上面那张字面量表:这样目录的每一行——包括调用方自己
127
+ * `parseCatalogListing` 拼出来的行——都保证 `hint` 非空且与能力一致。
128
+ */
129
+ export declare const GLM_MODEL_CATALOG: readonly GlmModelEntry[];
130
+ /**
131
+ * 本线路四个模型**全部**是 Coding Plan 模型;反倒是 Start Plan 缺 `GLM-5.3`。
132
+ *
133
+ * 逐字证据(`config/provider/zcode-builtin.json` revision 31 的
134
+ * `modelConfigRules.builtinProviderModelRules`,「账号型 provider 的模型启用表」):
135
+ *
136
+ * - `account:zai-individual-coding-plan` / `account:zai-team-coding-plan` /
137
+ * `account:bigmodel-individual-coding-plan` / `account:bigmodel-team-coding-plan`
138
+ * 都逐条启用 **`GLM-5.3`、`GLM-5.3-Flash`、`GLM-5.2`、`GLM-5-Turbo` 四个**;
139
+ * - `account:{zai,bigmodel}-start-plan` 只启用 `GLM-5.3-Flash` / `GLM-5.2` /
140
+ * `GLM-5-Turbo`——**没有 `GLM-5.3`**。
141
+ *
142
+ * 这一条曾被写反过(旧的 `GLM_START_PLAN_ONLY_MODEL_IDS = ['GLM-5.2','GLM-5-Turbo']`
143
+ * 断言「这两个是 Start Plan 独有、Coding Plan 请求它们会拿到 1311」)。写反的代价是 W6 会把
144
+ * 两个**确实在套餐里**的模型判成未订阅,用户连试都不能试。留着这份对照,是为了让复审知道
145
+ * 「模型 id 反推不出账号套餐」:同一个 id 在不同 provider 规则下被启用的集合是不同的,
146
+ * 而套餐归属是**账号**的属性,不是模型的属性。
147
+ */
148
+ export declare const GLM_START_PLAN_EXCLUDED_MODEL_IDS: readonly string[];
149
+ /** 目录里全部 id,声明顺序即设置页的默认顺序。 */
150
+ export declare const GLM_MODEL_IDS: readonly string[];
151
+ /**
152
+ * 首次安装默认勾选的模型。
153
+ *
154
+ * 刻意是全部四行:这张表已经是 Coding Plan 面的模型全集(官方 builtin 配置公布的那一份),
155
+ * 藏掉任何一行都等于不给用户开启它的办法——与其如此,不如让用户在设置页里自己取消。
156
+ */
157
+ export declare const DEFAULT_VISIBLE_MODEL_IDS: readonly string[];
158
+ /** 目录里有没有这个 id(大小写不敏感)。 */
159
+ export declare function isGlmModelId(id: unknown, catalog?: readonly GlmModelEntry[]): id is string;
160
+ /** 该模型真实接受的思考档位;不在目录里时是空数组(即「不发任何思考控制字段」)。 */
161
+ export declare function glmReasoningEfforts(id: string, catalog?: readonly GlmModelEntry[]): readonly GlmReasoningEffort[];
162
+ /** 该模型是否接受图片输入;不在目录里时为 false(不认图比乱认图安全)。 */
163
+ export declare function glmModelSupportsImages(id: string, catalog?: readonly GlmModelEntry[]): boolean;
164
+ /** 该模型走哪个协议面;不在目录里时是 `null`(D3:不猜协议)。 */
165
+ export declare function glmModelWire(id: string, catalog?: readonly GlmModelEntry[]): GlmCatalogWire;
166
+ /** 该模型的输出上限;不在目录里时取 `./types.ts` 的兜底值(那里已标注未验证)。 */
167
+ export declare function maxOutputTokensFor(id: string, catalog?: readonly GlmModelEntry[]): number;
168
+ /** 该模型的上下文窗口;不在目录里时取 `./types.ts` 的兜底值(那里已标注未验证)。 */
169
+ export declare function defaultContextWindowFor(id: string, catalog?: readonly GlmModelEntry[]): number;
170
+ /**
171
+ * 目录没有转录过的 id 的**未声明**行。
172
+ *
173
+ * 什么时候会有:上游 `/models` 返回了本表没有的模型(发了新模型,或本轮清单已过期)。
174
+ * 这时最诚实的做法是什么都不主张:
175
+ *
176
+ * - `wire: null` → 适配器拒绝该模型(D3),而不是猜一个面;
177
+ * - `reasoningEfforts: []` → `convergeGlmEffort` 返回 null,两个 mapper 一个字段都不发;
178
+ * - `supportsImages: false` → 请求里的图片按「读不出来」明说,而不是发一个上游会拒的 image_url;
179
+ * - `thinkingDisableable: true` → 目录没声明「恒定开启」,那就永远不发关闭值(发关闭值才会被拒)。
180
+ *
181
+ * 上下文窗口只有在上游明确报了的时候才用它的值(运行时是窗口的权威),否则用兜底值。
182
+ */
183
+ export declare function undeclaredGlmModelEntry(id: string, options?: {
184
+ region?: GlmRegion;
185
+ contextWindow?: number;
186
+ }): GlmModelEntry;
187
+ /**
188
+ * 查一行模型能力;目录里没有时返回**未声明行**而不是 undefined。
189
+ *
190
+ * 返回未声明行而不是空,是为了让调用方只需要处理一种东西:每个 id 都有一份「不主张什么」的声明,
191
+ * 适配器据 `wire === null` 拒绝它即可,不必另开一条「找不到模型」的分支。
192
+ */
193
+ export declare function resolveGlmModel(id: string, catalog?: readonly GlmModelEntry[]): GlmModelEntry;
194
+ /** 一个部署能调的模型(`regions` 是路由事实:向不服务的部署问会得到 400)。 */
195
+ export declare function modelsForRegion(region: GlmRegion, catalog?: readonly GlmModelEntry[]): GlmModelEntry[];
196
+ /** 目录里的全部 id。 */
197
+ export declare function listModelIds(catalog?: readonly GlmModelEntry[]): string[];
198
+ /** 目录条目数,供 hub 概览显示「M 个模型可用」。 */
199
+ export declare function catalogSize(catalog?: readonly GlmModelEntry[]): number;
200
+ /**
201
+ * 从一行能力生成设置卡上的一句话描述(计划 §7 的四个要素:思考形态 / 档位 / 输入模态 / 上下文窗口)。
202
+ *
203
+ * 由数据生成而不是逐行手写,是为了让文案**不可能与能力表漂移**:手写文案出过
204
+ * 「三个档位」的模型实际只有两档这种事故,而这张表的每个字段都要被两个 mapper 当成事实使用。
205
+ *
206
+ * @param entry - 能力行。
207
+ * @param prefix - 可选前缀(未声明行用「未声明模型」点明这不是已核实的声明)。
208
+ */
209
+ export declare function describeGlmModel(entry: GlmModelEntry, prefix?: string): string;
210
+ /** 目录 + 用户设置 → 设置面下发的 `GlmModelOption[]`。 */
211
+ export interface GlmCatalogOptionOverrides {
212
+ /** 用户勾选的 id;缺省表示全选。 */
213
+ enabledModelIds?: readonly string[];
214
+ /** 逐模型上下文窗口覆盖;null / 非正数表示用目录默认值。 */
215
+ contextWindowOverrides?: Readonly<Record<string, number | null | undefined>>;
216
+ }
217
+ /**
218
+ * 把目录装配成设置面的模型行。
219
+ *
220
+ * `hint` 在这里生成(而不是写死在表里),所以「文案与能力表一致」是结构保证的:
221
+ * 表里改一次档位或图片支持,卡片上的那句话就跟着变。
222
+ *
223
+ * 两条与「未声明行」有关的规矩:
224
+ *
225
+ * - `wire` 为 null 时落到封闭联合上只能填一个占位值(契约的 `GlmModelOption.wire` 没有 null)。
226
+ * 真正的拦截点在适配器:它必须先用 {@link glmModelWire} 拿到 null 并拒绝该模型(D3),
227
+ * 所以这里填什么都不会变成一次猜协议的请求。
228
+ * - 未声明行**默认不勾选**。目录里出现一个新模型不等于它能被安全调用;
229
+ * 让它默认出现在「已启用」里,等于让用户在没读过任何声明的情况下就用上它。
230
+ */
231
+ export declare function catalogModelOptions(catalog?: readonly GlmModelEntry[], overrides?: GlmCatalogOptionOverrides): GlmModelOption[];
232
+ //# sourceMappingURL=model-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../../../src/host/glm-coding-plan/model-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * 浏览器 OAuth 登录(ZCode 平台中转轮询)。
3
+ *
4
+ * 这条线**不是**本地回调、也不是 RFC 8628 device code:授权发生在浏览器,
5
+ * 但令牌的落地由 ZCode 平台的服务端中转页完成,本插件只做两件事——
6
+ * 开一次流、按上游给的节奏轮询它(计划 §3.1,证据等级 A:
7
+ * `apps/zcode-cli/packages/adapters/src/auth/cli-oauth.ts:88-238`、
8
+ * `bootstrap/src/auth-login.ts:41`)。
9
+ *
10
+ * 三个必须记住的上游事实:
11
+ *
12
+ * 1. **开流与轮询都用 pollToken 鉴权**,不是 cookie、不是 session:
13
+ * `POST {ZCODE_API_BASE}/oauth/cli/init` 与
14
+ * `GET {ZCODE_API_BASE}/oauth/cli/poll/{flow_id}` 的头都是
15
+ * `Authorization: Bearer <pollToken>`,而 pollToken 是本地生成的
16
+ * `randomBytes(32).toString('hex')`——它不是登录凭据,只是把一次开流
17
+ * 与它的轮询绑在一起,所以它不进凭据存储。
18
+ * 2. **授权参数里没有 PKCE**(计划 §3.1、`PKCE_SUPPORTED = false`):
19
+ * 本插件照抄上游形状,不自带 `code_challenge`。
20
+ * 3. **回调由服务端中转页收走**:`{zcode.z.ai}/app/oauth/login?redirect=zcode://oauth/callback`
21
+ * 是一个网页而不是本机端口,所以远程会话 / 防火墙下浏览器照样能把
22
+ * 授权码交到上游手里——这也是「手工粘贴兜底」有意义的原因(见
23
+ * {@link submitLoginCode})。
24
+ *
25
+ * 轮询错误语义(计划 §3.1,证据等级 B,逆向实测量化出来的四条,逐条照抄):
26
+ *
27
+ * - 4xx(**除 408 / 429**)→ 致命
28
+ * - 信封 `code !== 0` → 致命
29
+ * - 未知 `status` → 致命
30
+ * - 5xx / 网络错误 / 畸形 200 → 按 pending 重试
31
+ *
32
+ * 分界线是「上游给了没有结论」还是「上游给了结论」:4xx 说「这个流程不行」,
33
+ * 5xx 与畸形 200 只是这一次没拿到结论,重试到 `expires_at` 才是真正的上界。
34
+ */
35
+ import type { GlmLoginFlowStatus, GlmRegion } from '../../shared/glm-coding-plan-contracts.ts';
36
+ /**
37
+ * 致命的登录失败:重试同一个流程不会改变结果。
38
+ *
39
+ * 计划 §3.1 的三条致命语义(4xx、信封 `code !== 0`、未知 status)都归到这里,
40
+ * 另外开流响应的字段校验失败也是同一类——上游已经给了结论,只是结论是「你发的请求不对」。
41
+ */
42
+ export declare class GlmLoginFatalError extends Error {
43
+ constructor(message: string);
44
+ }
45
+ /** 一次开流的上游响应,字段名来自 `CLI_INIT_RESPONSE_FIELDS`(逐字:`cli-oauth.ts:138,172`)。 */
46
+ export interface GlmCliInit {
47
+ flowId: string;
48
+ authorizeUrl: string;
49
+ /** 上游失效时刻(Unix 毫秒,由 `expires_at` 秒换算)。 */
50
+ expiresAt: number;
51
+ /** 上游建议的轮询间隔(秒);实际间隔还要过 `POLL_MIN_INTERVAL_MS` 下限。 */
52
+ pollIntervalSec: number;
53
+ /** 本次流程的 pollToken,只有开流与轮询会用到它。 */
54
+ pollToken: string;
55
+ }
56
+ export interface GlmRequestOptions {
57
+ /** 注入的 fetch;测试全部走它,所以本文件离网。 */
58
+ fetchFn?: typeof fetch;
59
+ signal?: AbortSignal;
60
+ /** 环境覆盖(`DSH_GLM_*`),读取时机与 types.ts 的覆盖表一致:调用时读。 */
61
+ env?: NodeJS.ProcessEnv;
62
+ }
63
+ /**
64
+ * 开一次流:`POST {ZCODE_API_BASE}/oauth/cli/init`。
65
+ *
66
+ * 请求体只有 `{"provider": "zai" | "bigmodel"}`——区域到上游 provider 名的翻译只在这一处
67
+ * (`CLI_PROVIDER_BY_REGION`),翻译错会让开流成功但授权落到另一个部署的账号上。
68
+ */
69
+ export declare function requestCliInit(region: GlmRegion, options?: GlmRequestOptions): Promise<GlmCliInit>;
70
+ /** 一次登录成功后的凭据。host 侧专用,**不进任何共享契约**。 */
71
+ export interface GlmCliCredentials {
72
+ region: GlmRegion;
73
+ /** 兑换链的输入(计划 §3.2):它是 `POST /api/auth/z/login` 的 `token`。 */
74
+ accessToken: string;
75
+ /**
76
+ * 上游同包下发的 refresh_token。
77
+ *
78
+ * **没有**对应的刷新接口(计划 §3.6:官方 `oauthService.ts:972-975` 直接抛错),
79
+ * 所以这个值只做留档与诊断,**不要**据此实现任何刷新路径。
80
+ */
81
+ refreshToken: string | null;
82
+ /**
83
+ * 就绪载荷里的 `token`(ZCode 平台自己的 JWT)。
84
+ *
85
+ * 本线路不拿它做任何鉴权,只留档:计划 §9 明确记录 `data.token` 的完整 payload
86
+ * 未验证,缺一份真实的解码样本。
87
+ */
88
+ zcodeToken: string | null;
89
+ userId: string | null;
90
+ email: string | null;
91
+ displayName: string | null;
92
+ /** 上游给了头像地址时只记「有」,不落原始字节。 */
93
+ hasAvatar: boolean;
94
+ authenticatedAt: number;
95
+ }
96
+ /** 一次轮询的结论。致命不是一个结论,是一个异常({@link GlmLoginFatalError})。 */
97
+ export type GlmPollOutcome = {
98
+ kind: 'pending';
99
+ progress: string;
100
+ } | {
101
+ kind: 'ready';
102
+ credentials: GlmCliCredentials;
103
+ };
104
+ /**
105
+ * 轮询一次:`GET {ZCODE_API_BASE}/oauth/cli/poll/{flow_id}`。
106
+ *
107
+ * 返回值只有 pending / ready 两种;「该停了」的情况按计划 §3.1 分三类抛出:
108
+ * 4xx(除 408/429)与未知 status 抛 {@link GlmLoginFatalError},
109
+ * 而 5xx、网络错误与畸形 200 都返回 pending——这四种在上游眼里都是「这次没有结论」。
110
+ */
111
+ export declare function pollCliFlow(flow: {
112
+ flowId: string;
113
+ pollToken: string;
114
+ region: GlmRegion;
115
+ }, options?: GlmRequestOptions): Promise<GlmPollOutcome>;
116
+ /**
117
+ * 截止时刻:`min(now + 5min, expires_at * 1000)`(逐字:`auth-login.ts:41`)。
118
+ *
119
+ * 取小者的理由写在 `OAUTH_FLOW_TIMEOUT_MS` 的注释里:`expires_at` 才是上游真正的失效时刻,
120
+ * 本地 5 分钟只是兜底。
121
+ */
122
+ export declare function flowDeadlineMs(now: number, expiresAt: number): number;
123
+ /** 轮询间隔:`max(1000ms, poll_interval_sec * 1000)`(逐字:`cli-oauth.ts:106-115`)。 */
124
+ export declare function pollIntervalMs(pollIntervalSec: number): number;
125
+ /** 一次登录流程的对外状态:冻结契约的 `GlmLoginFlowStatus` 加上本插件自己的会话 id。 */
126
+ export interface GlmWebLogin extends GlmLoginFlowStatus {
127
+ /**
128
+ * 本次流程的会话 id。卡片轮询与取消都用它;
129
+ * `GlmLoginFlowStatus` 里没有这个字段,因为「会话 id」是 host 的实现细节,
130
+ * 不该出现在共享契约里。
131
+ */
132
+ loginId: string;
133
+ /** 就绪时的凭据;其它状态为 null。这个字段**不出这个模块**。 */
134
+ credentials: GlmCliCredentials | null;
135
+ }
136
+ /** 登录选项。 */
137
+ export interface BeginWebLoginOptions extends GlmRequestOptions {
138
+ region?: GlmRegion;
139
+ /** 打开浏览器的方式;缺省用本平台的 `openBrowser`。测试注入一个空函数即可。 */
140
+ openBrowser?: (url: string) => void;
141
+ }
142
+ /**
143
+ * 开一次浏览器登录:开流 → 尽力打开授权页 → 落一条 pending 状态。
144
+ *
145
+ * 这里**不开轮询循环**:卡片通过 `/login/poll` 显式驱动,host 自己在后台轮询的话,
146
+ * 用户关掉设置页之后还会继续打上游。
147
+ */
148
+ export declare function beginWebLogin(options?: BeginWebLoginOptions): Promise<GlmWebLogin>;
149
+ /** 读某次登录(或最近一次)的公开状态。 */
150
+ export declare function getWebLoginStatus(loginId?: string): GlmWebLogin | null;
151
+ /** 取消一次登录,让后续轮询无从恢复。 */
152
+ export declare function cancelWebLogin(loginId?: string): boolean;
153
+ /** 测试缝:忘掉所有会话与最近一次流程。 */
154
+ export declare function resetWebLogins(): void;
155
+ export interface PollWebLoginOptions extends GlmRequestOptions {
156
+ /**
157
+ * 就绪后把凭据交出去(W6 在这里落盘并把账号加进号池)。
158
+ *
159
+ * 本模块**不持有凭据存储**,所以持久化失败不吞:吞掉的话卡片会显示
160
+ * 「登录成功」而凭据根本没落盘。
161
+ */
162
+ onAuthenticated?: (credentials: GlmCliCredentials) => Promise<void> | void;
163
+ }
164
+ /**
165
+ * 轮询一次,把状态机往前推一格。
166
+ *
167
+ * 三种停下来的方式都返回状态而不抛:卡片轮询的语义是「读状态」,
168
+ * 让它去 catch 异常只会把「上游说了不行」显示成 500。
169
+ */
170
+ export declare function pollWebLogin(loginId: string, options?: PollWebLoginOptions): Promise<GlmWebLogin>;
171
+ /**
172
+ * 从用户粘回来的东西里取出授权码。
173
+ *
174
+ * 两种输入都是自然的(照 9ad8a53 那份 `extractAuthorizationCode` 的思路):
175
+ * 地址栏里回不来的那串裸 code,以及整条回调 URL。
176
+ * 回调 URL 有两个易错点,都在这里兜住:自定义 scheme(`zcode://oauth/callback?code=…`)
177
+ * 的 query 一样能解析,而有些浏览器把参数放进 fragment(`#code=…`)。
178
+ * 认不出来的输入返回空串——宁可让调用方报「这不像授权码」,也不要把它当 code 提交上去。
179
+ */
180
+ export declare function extractAuthorizationCode(raw: string): string;
181
+ /**
182
+ * 从回调里取 `error` / `error_description`。
183
+ *
184
+ * 用户在授权页点「拒绝」时,上游会把错误塞进回调而不是给我们一个 code。
185
+ * 那是用户的明确决定,不该被当成「还在等」,所以单独读出来判致命。
186
+ */
187
+ export declare function extractAuthorizationError(raw: string): string;
188
+ /**
189
+ * 用户把 code(或整条回调 URL)粘回来时调用。
190
+ *
191
+ * 存在的理由:防火墙或远程会话下浏览器可能走不到中转页,这时卡片会一直 pending 到超时,
192
+ * 而用户手上明明已经有一个 code。
193
+ *
194
+ * 它做的事是**强制立刻复查一次平台流程**,不是自己拿 code 去换 token——
195
+ * 授权码是服务端中转页(`{zcode.z.ai}/app/oauth/login?redirect=zcode://oauth/callback`)
196
+ * 用同一个 code 换掉的,计划 §3.1 只逐字记录了 `cli/init` 与 `cli/poll` 两个端点,
197
+ * 客户端直换端点**未验证**。所以 code 在本插件里的唯一作用是「上游可能已经就绪了,去看一眼」。
198
+ *
199
+ * @throws 没有进行中的流程,或粘贴内容里既没有 code 也没有 error。
200
+ */
201
+ export declare function submitLoginCode(raw: string, options?: {
202
+ loginId?: string;
203
+ }): GlmWebLogin;
204
+ /**
205
+ * 用平台默认浏览器打开一个 URL。
206
+ *
207
+ * 与其余各线路同一份形状(kimi-code / claude / command-code / antigravity 都有一份)。
208
+ * 全部按尽力而为处理:调用方永远会展示同一个 URL,所以启动失败是可恢复的。
209
+ */
210
+ export declare function openBrowser(url: string): void;
211
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/host/glm-coding-plan/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * GLM(ZCode 账号)线路的 web 路由。
3
+ *
4
+ * 路由表与客户端 `src/client/glm-coding-plan/api.ts` 里那一份是**同一个约定**,两边必须逐条对上:
5
+ *
6
+ * ```
7
+ * GET /status -> GlmStatusDto(页面的唯一读口)
8
+ * POST /settings GlmSettingsUpdateDto -> GlmStatusDto
9
+ * POST /accounts { action, accountId } / { action:'strategy', strategy } -> GlmStatusDto
10
+ * POST /login/start { region } -> GlmLoginFlowStatus
11
+ * GET /login/status -> GlmLoginFlowStatus
12
+ * POST /login/cancel { region } -> GlmLoginFlowStatus
13
+ * POST /login/manual { region, code } -> GlmStatusDto
14
+ * POST /adopt { region } -> GlmAdoptResultDto
15
+ * POST /connection/test -> GlmConnectionDto
16
+ * POST /quota -> GlmStatusDto(强制刷新配额)
17
+ * POST /catalog/refresh -> GlmStatusDto
18
+ * ```
19
+ *
20
+ * 信封:除 `/adopt` 与 `/connection/test` 外一律 `{ ok, value }`,因为客户端走的
21
+ * `createLineApi` 会把信封拆掉、直接把 `value` 当 DTO 用;这两条路由的契约把 DTO 定在
22
+ * 顶层,所以它们**直接**返回 DTO(`createLineApi` 对没有布尔 `ok` 的应答原样返回整体)。
23
+ *
24
+ * 同源校验不可省:每个 POST 都过 `isSameOriginMutation`,与兄弟线路同一份实现。
25
+ * 本文件不持有任何凭据,所有落盘与兑换都交给 token-store / account-pool / oauth / adopt。
26
+ */
27
+ import type { Context } from '@deepseek-ai/cordis';
28
+ import { type GlmStatusDto } from '../../shared/glm-coding-plan-contracts.ts';
29
+ import { type GlmWebLogin } from './oauth.ts';
30
+ import { type GlmCodingPlanCredentials, type GlmCodingPlanModelSettings, type GlmCodingPlanModelSettingsStore, type GlmCodingPlanPreferenceStore, type GlmCodingPlanSettingsPatch } from './token-store.ts';
31
+ /** 设置来源:register 后端优先,没有就落回凭据旁边的 JSON 文件。 */
32
+ export declare function glmCodingPlanSettingsSource(preferences: GlmCodingPlanPreferenceStore | undefined, fallback: GlmCodingPlanModelSettingsStore): GlmCodingPlanSettingsSource;
33
+ import { type GlmCodingPlanAccountPool } from './account-pool.ts';
34
+ /** 一个请求寻址的子路径(剥掉契约前缀)。 */
35
+ export declare function glmSubPathOf(requestUrl: string): string;
36
+ export interface GlmCodingPlanRouteOptions {
37
+ fetchFn?: typeof fetch;
38
+ /** 本插件是否正在服务这条 Provider 路由;每次状态都重新读。 */
39
+ serving?: boolean | (() => boolean);
40
+ /** 路由被别的适配器占用时的诊断文案;每次状态都重新读。 */
41
+ conflict?: string | null | (() => string | null);
42
+ /** 号池;本进程装了才有。 */
43
+ accountPool?: GlmCodingPlanAccountPool;
44
+ /**
45
+ * 打开授权页的方式;缺省是**什么都不做**。
46
+ *
47
+ * 卡片(client/glm-coding-plan/useGlmCodingPlanSection.ts 的 window.open)才是
48
+ * 唯一开浏览器的地方。host 再开一次就是同一场登录弹出两个一模一样的页面——
49
+ * 兄弟线路 claude / command-code 早就把这条收敛掉了,这里的缺省跟着它们走。
50
+ *
51
+ * 这一栏存在的理由是测试:/login/start 一共被十几条路由用例打中,显式传入一个
52
+ * 空函数就把这条外部副作用整个摘掉;只有显式传入时才用传入的那一份。
53
+ */
54
+ openBrowser?: (url: string) => void;
55
+ }
56
+ /**
57
+ * 设置来源:register 后端与文件后端形状不同,这里收敛成一个。
58
+ *
59
+ * `status()` 允许是 promise:文件后端要读盘,而卡片每次轮询都会问一次状态。
60
+ * register 后端同步返回,实现方不必知道自己被允许同步。
61
+ */
62
+ export interface GlmCodingPlanSettingsSource {
63
+ status(): GlmCodingPlanModelSettings | Promise<GlmCodingPlanModelSettings>;
64
+ update(patch: GlmCodingPlanSettingsPatch): Promise<GlmCodingPlanModelSettings>;
65
+ }
66
+ /** 设置卡片渲染的模型总数(hub overview 与状态共用同一份读数)。 */
67
+ export declare function glmCatalogSize(): number;
68
+ export interface GlmStatusSources {
69
+ options: GlmCodingPlanRouteOptions;
70
+ settings: GlmCodingPlanSettingsSource;
71
+ /** 登录流程的公开状态(凭据不出这一层)。 */
72
+ latestLogin: GlmWebLogin | null;
73
+ /** 正在跑的配额刷新;缺省表示没有。 */
74
+ quotaRefreshing: boolean;
75
+ /** 上一次配额读失败的原因;读到快照时为 null。缺省表示没有失败可报。 */
76
+ quotaError?: string | null;
77
+ /** 本次读到的账号(卡片渲染用,不带任何凭据)。 */
78
+ account: GlmCodingPlanCredentials | null;
79
+ }
80
+ /**
81
+ * 组装 `GlmStatusDto`。
82
+ *
83
+ * 号池读不出来不能带倒整张卡:连接那一半仍然值得渲染,只是账号列表是空的。
84
+ */
85
+ export declare function getGlmCodingPlanStatus(sources: GlmStatusSources): Promise<GlmStatusDto>;
86
+ /**
87
+ * 注册本线路的路由。
88
+ *
89
+ * `store` 只用来读「当前该显示哪个账号」与存储位置说明;真正的路由与轮转在号池,
90
+ * 真正���落盘在 token-store,两者都不在本文件里做。
91
+ */
92
+ export declare function registerGlmCodingPlanRoutes(ctx: Context, settings: GlmCodingPlanSettingsSource, options?: GlmCodingPlanRouteOptions): () => void;
93
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/glm-coding-plan/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAKlD,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,2CAA2C,CAAA;AAsBlD,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAChC,MAAM,kBAAkB,CAAA;AAEzB,6CAA6C;AAC7C,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,4BAA4B,GAAG,SAAS,EACrD,QAAQ,EAAE,+BAA+B,GACxC,2BAA2B,CAE7B;AACD,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,mBAAmB,CAAA;AA8C1B,0BAA0B;AAC1B,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAOvD;AA0BD,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IACnC,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAA;IAChD,kBAAkB;IAClB,WAAW,CAAC,EAAE,wBAAwB,CAAA;IACtC;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC1C,MAAM,IAAI,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC1E,MAAM,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAA;CAC/E;AAqBD,4CAA4C;AAC5C,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,yBAAyB,CAAA;IAClC,QAAQ,EAAE,2BAA2B,CAAA;IACrC,0BAA0B;IAC1B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAA;IAC/B,uBAAuB;IACvB,eAAe,EAAE,OAAO,CAAA;IACxB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAA;CACzC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA+C7F;AAkCD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,2BAA2B,EACrC,OAAO,GAAE,yBAA8B,GACtC,MAAM,IAAI,CAiSZ"}