@eddyskywalker/dsh-chatgpt-subscription 0.8.1 → 0.8.3
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 +45 -0
- package/README.md +66 -1
- package/lib/client.js +1580 -287
- package/lib/client.js.map +1 -1
- package/lib/index.js +5432 -1757
- package/lib/types/client/CodexSubscriptionSection.d.ts.map +1 -1
- package/lib/types/client/ProviderHubSection.d.ts.map +1 -1
- package/lib/types/client/antigravity/AntigravitySection.d.ts.map +1 -1
- package/lib/types/client/antigravity/locales.d.ts +2 -2
- package/lib/types/client/command-code/CommandCodeSection.d.ts.map +1 -1
- package/lib/types/client/command-code/locales.d.ts +2 -2
- package/lib/types/client/common/quota-follow-up.d.ts +30 -0
- package/lib/types/client/common/quota-follow-up.d.ts.map +1 -0
- package/lib/types/client/index.d.ts +1 -0
- 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/locales.d.ts +2 -2
- package/lib/types/client/locales.d.ts +1 -1
- package/lib/types/client/workbuddy/WorkBuddySection.d.ts.map +1 -1
- package/lib/types/client/workbuddy/locales.d.ts +60 -0
- package/lib/types/client/workbuddy/locales.d.ts.map +1 -1
- package/lib/types/client/zhipu/ZhipuComposerQuota.d.ts +26 -0
- package/lib/types/client/zhipu/ZhipuComposerQuota.d.ts.map +1 -0
- package/lib/types/client/zhipu/ZhipuSection.d.ts +11 -0
- package/lib/types/client/zhipu/ZhipuSection.d.ts.map +1 -0
- package/lib/types/client/zhipu/locales.d.ts +275 -0
- package/lib/types/client/zhipu/locales.d.ts.map +1 -0
- package/lib/types/client/zhipu/styles.d.ts +12 -0
- package/lib/types/client/zhipu/styles.d.ts.map +1 -0
- package/lib/types/host/antigravity/oauth.d.ts +15 -1
- package/lib/types/host/antigravity/oauth.d.ts.map +1 -1
- package/lib/types/host/antigravity/port-constants.d.ts +20 -0
- package/lib/types/host/antigravity/port-constants.d.ts.map +1 -0
- package/lib/types/host/antigravity/routes.d.ts.map +1 -1
- package/lib/types/host/command-code/client.d.ts +9 -1
- package/lib/types/host/command-code/client.d.ts.map +1 -1
- package/lib/types/host/command-code/routes.d.ts.map +1 -1
- package/lib/types/host/common/catalog-snapshot.d.ts +61 -0
- package/lib/types/host/common/catalog-snapshot.d.ts.map +1 -0
- package/lib/types/host/common/credential-read-cache.d.ts +73 -0
- package/lib/types/host/common/credential-read-cache.d.ts.map +1 -0
- package/lib/types/host/common/quota-refresh.d.ts +35 -0
- package/lib/types/host/common/quota-refresh.d.ts.map +1 -0
- package/lib/types/host/common/same-origin.d.ts +30 -0
- package/lib/types/host/common/same-origin.d.ts.map +1 -0
- package/lib/types/host/credential-store-secret-service.d.ts +1 -0
- package/lib/types/host/credential-store-secret-service.d.ts.map +1 -1
- package/lib/types/host/kimi-code/client.d.ts.map +1 -1
- package/lib/types/host/kimi-code/routes.d.ts.map +1 -1
- package/lib/types/host/routes.d.ts.map +1 -1
- package/lib/types/host/token-store-macos.d.ts +9 -0
- package/lib/types/host/token-store-macos.d.ts.map +1 -1
- package/lib/types/host/token-store-windows.d.ts +8 -0
- package/lib/types/host/token-store-windows.d.ts.map +1 -1
- package/lib/types/host/usage-service.d.ts +19 -1
- package/lib/types/host/usage-service.d.ts.map +1 -1
- package/lib/types/host/workbuddy/checkin.d.ts +134 -0
- package/lib/types/host/workbuddy/checkin.d.ts.map +1 -0
- package/lib/types/host/workbuddy/client.d.ts +9 -1
- package/lib/types/host/workbuddy/client.d.ts.map +1 -1
- package/lib/types/host/workbuddy/routes.d.ts +3 -0
- package/lib/types/host/workbuddy/routes.d.ts.map +1 -1
- package/lib/types/host/workbuddy/token-store.d.ts +24 -1
- package/lib/types/host/workbuddy/token-store.d.ts.map +1 -1
- package/lib/types/host/zhipu/account-pool.d.ts +43 -0
- package/lib/types/host/zhipu/account-pool.d.ts.map +1 -0
- package/lib/types/host/zhipu/adapter.d.ts +93 -0
- package/lib/types/host/zhipu/adapter.d.ts.map +1 -0
- package/lib/types/host/zhipu/client.d.ts +153 -0
- package/lib/types/host/zhipu/client.d.ts.map +1 -0
- package/lib/types/host/zhipu/mapper.d.ts +111 -0
- package/lib/types/host/zhipu/mapper.d.ts.map +1 -0
- package/lib/types/host/zhipu/model-catalog.d.ts +73 -0
- package/lib/types/host/zhipu/model-catalog.d.ts.map +1 -0
- package/lib/types/host/zhipu/routes.d.ts +33 -0
- package/lib/types/host/zhipu/routes.d.ts.map +1 -0
- package/lib/types/host/zhipu/token-store.d.ts +112 -0
- package/lib/types/host/zhipu/token-store.d.ts.map +1 -0
- package/lib/types/host/zhipu/types.d.ts +125 -0
- package/lib/types/host/zhipu/types.d.ts.map +1 -0
- package/lib/types/index.d.ts +8 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/antigravity-contracts.d.ts +8 -0
- package/lib/types/shared/antigravity-contracts.d.ts.map +1 -1
- package/lib/types/shared/command-code-contracts.d.ts +8 -0
- package/lib/types/shared/command-code-contracts.d.ts.map +1 -1
- package/lib/types/shared/contracts.d.ts +8 -0
- package/lib/types/shared/contracts.d.ts.map +1 -1
- package/lib/types/shared/kimi-code-contracts.d.ts +8 -0
- package/lib/types/shared/kimi-code-contracts.d.ts.map +1 -1
- package/lib/types/shared/workbuddy-contracts.d.ts +48 -0
- package/lib/types/shared/workbuddy-contracts.d.ts.map +1 -1
- package/lib/types/shared/zhipu-contracts.d.ts +164 -0
- package/lib/types/shared/zhipu-contracts.d.ts.map +1 -0
- package/package.json +32 -33
- package/lib/types/host/compaction-patch.d.ts +0 -17
- package/lib/types/host/compaction-patch.d.ts.map +0 -1
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
export declare const NS_ZHIPU = "dsh-zhipu";
|
|
2
|
+
export declare const zh: {
|
|
3
|
+
readonly title: "GLM(智谱 Coding Plan)";
|
|
4
|
+
readonly pageDesc: "添加智谱 / Z.ai 的 GLM Coding Plan API Key,管理可用模型、上下文窗口与额度。";
|
|
5
|
+
readonly account: "账号";
|
|
6
|
+
readonly signedIn: "已登录";
|
|
7
|
+
readonly signedOut: "未登录";
|
|
8
|
+
readonly region: "区域";
|
|
9
|
+
readonly regionIntl: "国际区 (api.z.ai)";
|
|
10
|
+
readonly regionCn: "国区 (open.bigmodel.cn)";
|
|
11
|
+
readonly keyHint: "Key 尾号";
|
|
12
|
+
readonly plan: "套餐";
|
|
13
|
+
readonly planUnknown: "—";
|
|
14
|
+
readonly renews: "续费于";
|
|
15
|
+
readonly authenticatedAt: "添加时间";
|
|
16
|
+
readonly storage: "凭据存储";
|
|
17
|
+
readonly storageNotice: "API Key 由 Host 保存于本地加密存储,不会进入浏览器。";
|
|
18
|
+
readonly signOut: "注销";
|
|
19
|
+
readonly addKeySection: "添加 API Key";
|
|
20
|
+
readonly addKeyHint: "在对应开放平台的「API Keys」页创建 Key 后粘贴到此处。它必须来自你订阅 Coding Plan 的那个平台:国区 Key 与国际区 Key 互不通用,开放平台(/api/paas/v4)的通用 Key 在订阅接口上会被拒绝。";
|
|
21
|
+
readonly keyPlaceholder: "粘贴 GLM Coding Plan API Key";
|
|
22
|
+
readonly keySave: "保存并验证";
|
|
23
|
+
readonly keySaving: "验证中...";
|
|
24
|
+
readonly keySaved: "已保存";
|
|
25
|
+
readonly connection: "连接";
|
|
26
|
+
readonly provider: "Provider";
|
|
27
|
+
readonly providerValue: "GLM(智谱 Coding Plan)· zhipu-coding-plan";
|
|
28
|
+
readonly connectionState: "连接状态";
|
|
29
|
+
readonly connected: "已连接";
|
|
30
|
+
readonly untested: "未测试";
|
|
31
|
+
readonly testConnection: "测试连接";
|
|
32
|
+
readonly testingConnection: "测试中...";
|
|
33
|
+
readonly routeOwned: "模型路由由本插件提供";
|
|
34
|
+
readonly routeConflict: "模型路由已被其他 Provider 占用:{detail}。请在 DSH 设置中移除重复的 Provider 配置后重试。";
|
|
35
|
+
readonly modelsSection: "模型";
|
|
36
|
+
readonly enableProvider: "启用此供应商";
|
|
37
|
+
readonly modelsHint: "勾选后模型才会出现在对话页的模型选择列表中;全部取消勾选或关闭上方开关可在列表中隐藏该供应商。";
|
|
38
|
+
readonly refreshCatalog: "刷新模型目录";
|
|
39
|
+
readonly refreshingCatalog: "刷新中...";
|
|
40
|
+
readonly selectAll: "全选";
|
|
41
|
+
readonly unselectAll: "全不选";
|
|
42
|
+
readonly effectiveWindow: "有效窗口";
|
|
43
|
+
readonly enhanced: "增强功能";
|
|
44
|
+
readonly defaultReasoningEffort: "默认思考深度";
|
|
45
|
+
readonly defaultReasoningEffortHint: "仅对声明了思考档位的模型生效。上游只接受 low / high / max,其余档位会收敛到最近的可用档位后发出(不支持的档位会直接报错)。";
|
|
46
|
+
readonly defaultEffortAuto: "使用 Provider 默认值";
|
|
47
|
+
readonly contextWindowSection: "模型上下文窗口";
|
|
48
|
+
readonly contextWindowHint: "默认取该模型官方声明的上下文窗口;可覆盖为自定义容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。";
|
|
49
|
+
readonly contextWindowReset: "恢复默认";
|
|
50
|
+
readonly contextWindowResetAll: "全部恢复默认";
|
|
51
|
+
readonly contextWindowResetAllConfirm: "确定把已改过的模型上下文窗口全部恢复为默认值吗?";
|
|
52
|
+
readonly contextWindowNoneEnabled: "还没有勾选任何模型。在上方勾选后,这里会出现该模型的上下文窗口设置。";
|
|
53
|
+
readonly save: "保存";
|
|
54
|
+
readonly saved: "已保存";
|
|
55
|
+
readonly saving: "保存中...";
|
|
56
|
+
readonly quotaSection: "用量与配额";
|
|
57
|
+
readonly quotaDesc: "数据来自 GLM Coding Plan 的用量接口,页面可见时最多每 60 秒刷新一次。Coding Plan 同时受 5 小时额度与每周额度限制。";
|
|
58
|
+
readonly refreshQuota: "刷新用量";
|
|
59
|
+
readonly refreshingQuota: "刷新中...";
|
|
60
|
+
readonly quotaEmpty: "暂无配额数据,点击「刷新用量」重试。";
|
|
61
|
+
readonly quotaUnavailable: "该账号没有可用的配额数据(通常是套餐未生效,或 Key 不属于 Coding Plan)。";
|
|
62
|
+
readonly quotaError: "配额读取失败";
|
|
63
|
+
readonly updatedAt: "更新时间:{time}";
|
|
64
|
+
readonly loading: "加载中...";
|
|
65
|
+
readonly tokens: "tokens";
|
|
66
|
+
readonly left: "剩余";
|
|
67
|
+
readonly resetAt: "重置于";
|
|
68
|
+
readonly now: "即将重置";
|
|
69
|
+
readonly accountPool: string;
|
|
70
|
+
readonly addAccount: string;
|
|
71
|
+
readonly accountCount: string;
|
|
72
|
+
readonly primaryAccount: string;
|
|
73
|
+
readonly activeAccount: string;
|
|
74
|
+
readonly setPrimary: string;
|
|
75
|
+
readonly deleteAccount: string;
|
|
76
|
+
readonly cooling: string;
|
|
77
|
+
readonly cooldownLeft: string;
|
|
78
|
+
readonly clearCooldown: string;
|
|
79
|
+
readonly needsRelogin: string;
|
|
80
|
+
readonly relogin: string;
|
|
81
|
+
readonly rotationStrategy: string;
|
|
82
|
+
readonly strategySequential: string;
|
|
83
|
+
readonly strategyRoundRobin: string;
|
|
84
|
+
readonly strategySticky: string;
|
|
85
|
+
readonly noAccounts: string;
|
|
86
|
+
readonly email: string;
|
|
87
|
+
readonly expires: string;
|
|
88
|
+
readonly lastUsed: string;
|
|
89
|
+
readonly accountId: string;
|
|
90
|
+
};
|
|
91
|
+
export declare const en: Record<keyof typeof zh, string>;
|
|
92
|
+
export declare const dictionaries: {
|
|
93
|
+
zh: {
|
|
94
|
+
readonly title: "GLM(智谱 Coding Plan)";
|
|
95
|
+
readonly pageDesc: "添加智谱 / Z.ai 的 GLM Coding Plan API Key,管理可用模型、上下文窗口与额度。";
|
|
96
|
+
readonly account: "账号";
|
|
97
|
+
readonly signedIn: "已登录";
|
|
98
|
+
readonly signedOut: "未登录";
|
|
99
|
+
readonly region: "区域";
|
|
100
|
+
readonly regionIntl: "国际区 (api.z.ai)";
|
|
101
|
+
readonly regionCn: "国区 (open.bigmodel.cn)";
|
|
102
|
+
readonly keyHint: "Key 尾号";
|
|
103
|
+
readonly plan: "套餐";
|
|
104
|
+
readonly planUnknown: "—";
|
|
105
|
+
readonly renews: "续费于";
|
|
106
|
+
readonly authenticatedAt: "添加时间";
|
|
107
|
+
readonly storage: "凭据存储";
|
|
108
|
+
readonly storageNotice: "API Key 由 Host 保存于本地加密存储,不会进入浏览器。";
|
|
109
|
+
readonly signOut: "注销";
|
|
110
|
+
readonly addKeySection: "添加 API Key";
|
|
111
|
+
readonly addKeyHint: "在对应开放平台的「API Keys」页创建 Key 后粘贴到此处。它必须来自你订阅 Coding Plan 的那个平台:国区 Key 与国际区 Key 互不通用,开放平台(/api/paas/v4)的通用 Key 在订阅接口上会被拒绝。";
|
|
112
|
+
readonly keyPlaceholder: "粘贴 GLM Coding Plan API Key";
|
|
113
|
+
readonly keySave: "保存并验证";
|
|
114
|
+
readonly keySaving: "验证中...";
|
|
115
|
+
readonly keySaved: "已保存";
|
|
116
|
+
readonly connection: "连接";
|
|
117
|
+
readonly provider: "Provider";
|
|
118
|
+
readonly providerValue: "GLM(智谱 Coding Plan)· zhipu-coding-plan";
|
|
119
|
+
readonly connectionState: "连接状态";
|
|
120
|
+
readonly connected: "已连接";
|
|
121
|
+
readonly untested: "未测试";
|
|
122
|
+
readonly testConnection: "测试连接";
|
|
123
|
+
readonly testingConnection: "测试中...";
|
|
124
|
+
readonly routeOwned: "模型路由由本插件提供";
|
|
125
|
+
readonly routeConflict: "模型路由已被其他 Provider 占用:{detail}。请在 DSH 设置中移除重复的 Provider 配置后重试。";
|
|
126
|
+
readonly modelsSection: "模型";
|
|
127
|
+
readonly enableProvider: "启用此供应商";
|
|
128
|
+
readonly modelsHint: "勾选后模型才会出现在对话页的模型选择列表中;全部取消勾选或关闭上方开关可在列表中隐藏该供应商。";
|
|
129
|
+
readonly refreshCatalog: "刷新模型目录";
|
|
130
|
+
readonly refreshingCatalog: "刷新中...";
|
|
131
|
+
readonly selectAll: "全选";
|
|
132
|
+
readonly unselectAll: "全不选";
|
|
133
|
+
readonly effectiveWindow: "有效窗口";
|
|
134
|
+
readonly enhanced: "增强功能";
|
|
135
|
+
readonly defaultReasoningEffort: "默认思考深度";
|
|
136
|
+
readonly defaultReasoningEffortHint: "仅对声明了思考档位的模型生效。上游只接受 low / high / max,其余档位会收敛到最近的可用档位后发出(不支持的档位会直接报错)。";
|
|
137
|
+
readonly defaultEffortAuto: "使用 Provider 默认值";
|
|
138
|
+
readonly contextWindowSection: "模型上下文窗口";
|
|
139
|
+
readonly contextWindowHint: "默认取该模型官方声明的上下文窗口;可覆盖为自定义容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。";
|
|
140
|
+
readonly contextWindowReset: "恢复默认";
|
|
141
|
+
readonly contextWindowResetAll: "全部恢复默认";
|
|
142
|
+
readonly contextWindowResetAllConfirm: "确定把已改过的模型上下文窗口全部恢复为默认值吗?";
|
|
143
|
+
readonly contextWindowNoneEnabled: "还没有勾选任何模型。在上方勾选后,这里会出现该模型的上下文窗口设置。";
|
|
144
|
+
readonly save: "保存";
|
|
145
|
+
readonly saved: "已保存";
|
|
146
|
+
readonly saving: "保存中...";
|
|
147
|
+
readonly quotaSection: "用量与配额";
|
|
148
|
+
readonly quotaDesc: "数据来自 GLM Coding Plan 的用量接口,页面可见时最多每 60 秒刷新一次。Coding Plan 同时受 5 小时额度与每周额度限制。";
|
|
149
|
+
readonly refreshQuota: "刷新用量";
|
|
150
|
+
readonly refreshingQuota: "刷新中...";
|
|
151
|
+
readonly quotaEmpty: "暂无配额数据,点击「刷新用量」重试。";
|
|
152
|
+
readonly quotaUnavailable: "该账号没有可用的配额数据(通常是套餐未生效,或 Key 不属于 Coding Plan)。";
|
|
153
|
+
readonly quotaError: "配额读取失败";
|
|
154
|
+
readonly updatedAt: "更新时间:{time}";
|
|
155
|
+
readonly loading: "加载中...";
|
|
156
|
+
readonly tokens: "tokens";
|
|
157
|
+
readonly left: "剩余";
|
|
158
|
+
readonly resetAt: "重置于";
|
|
159
|
+
readonly now: "即将重置";
|
|
160
|
+
readonly accountPool: string;
|
|
161
|
+
readonly addAccount: string;
|
|
162
|
+
readonly accountCount: string;
|
|
163
|
+
readonly primaryAccount: string;
|
|
164
|
+
readonly activeAccount: string;
|
|
165
|
+
readonly setPrimary: string;
|
|
166
|
+
readonly deleteAccount: string;
|
|
167
|
+
readonly cooling: string;
|
|
168
|
+
readonly cooldownLeft: string;
|
|
169
|
+
readonly clearCooldown: string;
|
|
170
|
+
readonly needsRelogin: string;
|
|
171
|
+
readonly relogin: string;
|
|
172
|
+
readonly rotationStrategy: string;
|
|
173
|
+
readonly strategySequential: string;
|
|
174
|
+
readonly strategyRoundRobin: string;
|
|
175
|
+
readonly strategySticky: string;
|
|
176
|
+
readonly noAccounts: string;
|
|
177
|
+
readonly email: string;
|
|
178
|
+
readonly expires: string;
|
|
179
|
+
readonly lastUsed: string;
|
|
180
|
+
readonly accountId: string;
|
|
181
|
+
};
|
|
182
|
+
'zh-CN': {
|
|
183
|
+
readonly title: "GLM(智谱 Coding Plan)";
|
|
184
|
+
readonly pageDesc: "添加智谱 / Z.ai 的 GLM Coding Plan API Key,管理可用模型、上下文窗口与额度。";
|
|
185
|
+
readonly account: "账号";
|
|
186
|
+
readonly signedIn: "已登录";
|
|
187
|
+
readonly signedOut: "未登录";
|
|
188
|
+
readonly region: "区域";
|
|
189
|
+
readonly regionIntl: "国际区 (api.z.ai)";
|
|
190
|
+
readonly regionCn: "国区 (open.bigmodel.cn)";
|
|
191
|
+
readonly keyHint: "Key 尾号";
|
|
192
|
+
readonly plan: "套餐";
|
|
193
|
+
readonly planUnknown: "—";
|
|
194
|
+
readonly renews: "续费于";
|
|
195
|
+
readonly authenticatedAt: "添加时间";
|
|
196
|
+
readonly storage: "凭据存储";
|
|
197
|
+
readonly storageNotice: "API Key 由 Host 保存于本地加密存储,不会进入浏览器。";
|
|
198
|
+
readonly signOut: "注销";
|
|
199
|
+
readonly addKeySection: "添加 API Key";
|
|
200
|
+
readonly addKeyHint: "在对应开放平台的「API Keys」页创建 Key 后粘贴到此处。它必须来自你订阅 Coding Plan 的那个平台:国区 Key 与国际区 Key 互不通用,开放平台(/api/paas/v4)的通用 Key 在订阅接口上会被拒绝。";
|
|
201
|
+
readonly keyPlaceholder: "粘贴 GLM Coding Plan API Key";
|
|
202
|
+
readonly keySave: "保存并验证";
|
|
203
|
+
readonly keySaving: "验证中...";
|
|
204
|
+
readonly keySaved: "已保存";
|
|
205
|
+
readonly connection: "连接";
|
|
206
|
+
readonly provider: "Provider";
|
|
207
|
+
readonly providerValue: "GLM(智谱 Coding Plan)· zhipu-coding-plan";
|
|
208
|
+
readonly connectionState: "连接状态";
|
|
209
|
+
readonly connected: "已连接";
|
|
210
|
+
readonly untested: "未测试";
|
|
211
|
+
readonly testConnection: "测试连接";
|
|
212
|
+
readonly testingConnection: "测试中...";
|
|
213
|
+
readonly routeOwned: "模型路由由本插件提供";
|
|
214
|
+
readonly routeConflict: "模型路由已被其他 Provider 占用:{detail}。请在 DSH 设置中移除重复的 Provider 配置后重试。";
|
|
215
|
+
readonly modelsSection: "模型";
|
|
216
|
+
readonly enableProvider: "启用此供应商";
|
|
217
|
+
readonly modelsHint: "勾选后模型才会出现在对话页的模型选择列表中;全部取消勾选或关闭上方开关可在列表中隐藏该供应商。";
|
|
218
|
+
readonly refreshCatalog: "刷新模型目录";
|
|
219
|
+
readonly refreshingCatalog: "刷新中...";
|
|
220
|
+
readonly selectAll: "全选";
|
|
221
|
+
readonly unselectAll: "全不选";
|
|
222
|
+
readonly effectiveWindow: "有效窗口";
|
|
223
|
+
readonly enhanced: "增强功能";
|
|
224
|
+
readonly defaultReasoningEffort: "默认思考深度";
|
|
225
|
+
readonly defaultReasoningEffortHint: "仅对声明了思考档位的模型生效。上游只接受 low / high / max,其余档位会收敛到最近的可用档位后发出(不支持的档位会直接报错)。";
|
|
226
|
+
readonly defaultEffortAuto: "使用 Provider 默认值";
|
|
227
|
+
readonly contextWindowSection: "模型上下文窗口";
|
|
228
|
+
readonly contextWindowHint: "默认取该模型官方声明的上下文窗口;可覆盖为自定义容量,该值用于 DSH 的压缩与溢出判断,可输入 1M、512K、200K 等容量。";
|
|
229
|
+
readonly contextWindowReset: "恢复默认";
|
|
230
|
+
readonly contextWindowResetAll: "全部恢复默认";
|
|
231
|
+
readonly contextWindowResetAllConfirm: "确定把已改过的模型上下文窗口全部恢复为默认值吗?";
|
|
232
|
+
readonly contextWindowNoneEnabled: "还没有勾选任何模型。在上方勾选后,这里会出现该模型的上下文窗口设置。";
|
|
233
|
+
readonly save: "保存";
|
|
234
|
+
readonly saved: "已保存";
|
|
235
|
+
readonly saving: "保存中...";
|
|
236
|
+
readonly quotaSection: "用量与配额";
|
|
237
|
+
readonly quotaDesc: "数据来自 GLM Coding Plan 的用量接口,页面可见时最多每 60 秒刷新一次。Coding Plan 同时受 5 小时额度与每周额度限制。";
|
|
238
|
+
readonly refreshQuota: "刷新用量";
|
|
239
|
+
readonly refreshingQuota: "刷新中...";
|
|
240
|
+
readonly quotaEmpty: "暂无配额数据,点击「刷新用量」重试。";
|
|
241
|
+
readonly quotaUnavailable: "该账号没有可用的配额数据(通常是套餐未生效,或 Key 不属于 Coding Plan)。";
|
|
242
|
+
readonly quotaError: "配额读取失败";
|
|
243
|
+
readonly updatedAt: "更新时间:{time}";
|
|
244
|
+
readonly loading: "加载中...";
|
|
245
|
+
readonly tokens: "tokens";
|
|
246
|
+
readonly left: "剩余";
|
|
247
|
+
readonly resetAt: "重置于";
|
|
248
|
+
readonly now: "即将重置";
|
|
249
|
+
readonly accountPool: string;
|
|
250
|
+
readonly addAccount: string;
|
|
251
|
+
readonly accountCount: string;
|
|
252
|
+
readonly primaryAccount: string;
|
|
253
|
+
readonly activeAccount: string;
|
|
254
|
+
readonly setPrimary: string;
|
|
255
|
+
readonly deleteAccount: string;
|
|
256
|
+
readonly cooling: string;
|
|
257
|
+
readonly cooldownLeft: string;
|
|
258
|
+
readonly clearCooldown: string;
|
|
259
|
+
readonly needsRelogin: string;
|
|
260
|
+
readonly relogin: string;
|
|
261
|
+
readonly rotationStrategy: string;
|
|
262
|
+
readonly strategySequential: string;
|
|
263
|
+
readonly strategyRoundRobin: string;
|
|
264
|
+
readonly strategySticky: string;
|
|
265
|
+
readonly noAccounts: string;
|
|
266
|
+
readonly email: string;
|
|
267
|
+
readonly expires: string;
|
|
268
|
+
readonly lastUsed: string;
|
|
269
|
+
readonly accountId: string;
|
|
270
|
+
};
|
|
271
|
+
en: Record<"account" | "storage" | "rotationStrategy" | "accountId" | "relogin" | "tokens" | "title" | "signedOut" | "signedIn" | "plan" | "expires" | "signOut" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "enableProvider" | "selectAll" | "unselectAll" | "modelsHint" | "contextWindowReset" | "contextWindowResetAll" | "contextWindowResetAllConfirm" | "save" | "refreshQuota" | "accountPool" | "addAccount" | "accountCount" | "primaryAccount" | "activeAccount" | "setPrimary" | "deleteAccount" | "cooling" | "cooldownLeft" | "clearCooldown" | "needsRelogin" | "strategySequential" | "strategyRoundRobin" | "strategySticky" | "noAccounts" | "storageNotice" | "email" | "lastUsed" | "pageDesc" | "providerValue" | "enhanced" | "defaultReasoningEffort" | "defaultReasoningEffortHint" | "defaultEffortAuto" | "contextWindowSection" | "contextWindowHint" | "contextWindowNoneEnabled" | "saved" | "saving" | "quotaSection" | "quotaDesc" | "refreshingQuota" | "quotaEmpty" | "updatedAt" | "now" | "planUnknown" | "renews" | "authenticatedAt" | "testingConnection" | "routeOwned" | "routeConflict" | "modelsSection" | "refreshCatalog" | "refreshingCatalog" | "region" | "resetAt" | "regionIntl" | "regionCn" | "keyHint" | "addKeySection" | "addKeyHint" | "keyPlaceholder" | "keySave" | "keySaving" | "keySaved" | "effectiveWindow" | "quotaUnavailable" | "quotaError" | "left", string>;
|
|
272
|
+
'en-US': Record<"account" | "storage" | "rotationStrategy" | "accountId" | "relogin" | "tokens" | "title" | "signedOut" | "signedIn" | "plan" | "expires" | "signOut" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "enableProvider" | "selectAll" | "unselectAll" | "modelsHint" | "contextWindowReset" | "contextWindowResetAll" | "contextWindowResetAllConfirm" | "save" | "refreshQuota" | "accountPool" | "addAccount" | "accountCount" | "primaryAccount" | "activeAccount" | "setPrimary" | "deleteAccount" | "cooling" | "cooldownLeft" | "clearCooldown" | "needsRelogin" | "strategySequential" | "strategyRoundRobin" | "strategySticky" | "noAccounts" | "storageNotice" | "email" | "lastUsed" | "pageDesc" | "providerValue" | "enhanced" | "defaultReasoningEffort" | "defaultReasoningEffortHint" | "defaultEffortAuto" | "contextWindowSection" | "contextWindowHint" | "contextWindowNoneEnabled" | "saved" | "saving" | "quotaSection" | "quotaDesc" | "refreshingQuota" | "quotaEmpty" | "updatedAt" | "now" | "planUnknown" | "renews" | "authenticatedAt" | "testingConnection" | "routeOwned" | "routeConflict" | "modelsSection" | "refreshCatalog" | "refreshingCatalog" | "region" | "resetAt" | "regionIntl" | "regionCn" | "keyHint" | "addKeySection" | "addKeyHint" | "keyPlaceholder" | "keySave" | "keySaving" | "keySaved" | "effectiveWindow" | "quotaUnavailable" | "quotaError" | "left", string>;
|
|
273
|
+
};
|
|
274
|
+
export type ZhipuLocaleKey = keyof typeof zh;
|
|
275
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/zhipu/locales.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,cAAc,CAAA;AAEnC,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAoErC,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const STYLE_ID = "dsh-zhipu-settings-style";
|
|
2
|
+
/**
|
|
3
|
+
* GLM Coding Plan additions to the shared settings design system.
|
|
4
|
+
*
|
|
5
|
+
* The base control styles (`.dsha-page`, `.dsha-group`, `.dsha-models`, the
|
|
6
|
+
* account card, the meters, …) come from the stylesheets the sibling routes
|
|
7
|
+
* install, in the same order the client installs them, so this file declares
|
|
8
|
+
* only what stays unique to this card: the key-hint line and the region
|
|
9
|
+
* selector that sits beside the key input.
|
|
10
|
+
*/
|
|
11
|
+
export declare function installZhipuStyles(): void;
|
|
12
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/client/zhipu/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,6BAA6B,CAAA;AAElD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAWzC"}
|
|
@@ -12,8 +12,20 @@ export interface WebLoginFlowState {
|
|
|
12
12
|
progress?: string;
|
|
13
13
|
}
|
|
14
14
|
export declare function callbackPort(): number;
|
|
15
|
+
/**
|
|
16
|
+
* First usable loopback port for the callback listener.
|
|
17
|
+
*
|
|
18
|
+
* Windows (Hyper-V/WinNAT) dynamically reserves TCP port ranges that change on
|
|
19
|
+
* every reboot, and the CLI's default port can land inside one — `listen` then
|
|
20
|
+
* fails with `EACCES: permission denied ::1:51121` and browser authorization
|
|
21
|
+
* never opens. A fixed port therefore cannot be relied on; the Google redirect
|
|
22
|
+
* URI carries whatever port this returns, so any free loopback port works. A
|
|
23
|
+
* configured `DSH_ANTIGRAVITY_CALLBACK_PORT` still wins — callers who set it
|
|
24
|
+
* accept that the port must be usable.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveCallbackPort(attempts?: number, host?: string): Promise<number>;
|
|
15
27
|
export declare function resolveCallbackHost(raw?: string | undefined): string;
|
|
16
|
-
export declare function redirectUri(): string;
|
|
28
|
+
export declare function redirectUri(port?: number, host?: string): string;
|
|
17
29
|
export declare function clientId(): string;
|
|
18
30
|
export declare function clientSecret(): string;
|
|
19
31
|
export declare function generatePKCE(): {
|
|
@@ -28,6 +40,8 @@ export declare function startCallbackServer(expectedState: string): Promise<{
|
|
|
28
40
|
code: string;
|
|
29
41
|
state: string;
|
|
30
42
|
}>;
|
|
43
|
+
/** The redirect URI the provider receives: the probed port, not the default. */
|
|
44
|
+
callbackUrl: string;
|
|
31
45
|
}>;
|
|
32
46
|
export declare function extractGoogleValidationUrl(text: string): string | undefined;
|
|
33
47
|
export declare function assertFreeTierEligible(payload: LoadCodeAssistDetailResult): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/oauth.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loopback callback ports for provider sign-in flows.
|
|
3
|
+
*
|
|
4
|
+
* Windows (Hyper-V/WinNAT) dynamically reserves TCP port ranges that change on
|
|
5
|
+
* every reboot. A fixed callback port can land inside one and `listen` fails
|
|
6
|
+
* with `EACCES` — browser authorization never opens. Flows therefore probe for
|
|
7
|
+
* a usable port instead of assuming the default is free; the redirect URI the
|
|
8
|
+
* provider receives carries whichever port was probed.
|
|
9
|
+
*/
|
|
10
|
+
/** Default loopback port the Antigravity CLI's own flow uses. */
|
|
11
|
+
export declare const DEFAULT_CALLBACK_PORT = 51121;
|
|
12
|
+
/**
|
|
13
|
+
* How many consecutive ports one probe covers.
|
|
14
|
+
*
|
|
15
|
+
* Windows excluded-port ranges are reserved in blocks of up to 100 ports, so a
|
|
16
|
+
* probe narrower than that can stop inside a block and still fail. 128 covers
|
|
17
|
+
* any single block the default port can start in.
|
|
18
|
+
*/
|
|
19
|
+
export declare const CALLBACK_PORT_ATTEMPTS = 128;
|
|
20
|
+
//# sourceMappingURL=port-constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-constants.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/port-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,QAAQ,CAAA;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAC/G,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAKpD,OAAO,KAAK,EAA0B,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AA+BzG,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,sBAAsB,EACrC,WAAW,CAAC,EAAE,0BAA0B,EACxC,WAAW,mBAAoD,GAC9D,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,sBAAsB,EACrC,WAAW,CAAC,EAAE,0BAA0B,EACxC,OAAO,GAAE,OAAO,KAAa,EAC7B,WAAW,mBAAoD,GAC9D,MAAM,IAAI,CA6IZ"}
|
|
@@ -58,7 +58,15 @@ export declare function parseProviderModels(payload: unknown): CommandCodeCatalo
|
|
|
58
58
|
* and is what fills the settings card's context-window defaults.
|
|
59
59
|
*/
|
|
60
60
|
export declare function fetchProviderModels(options?: CommandCodeRequestOptions): Promise<CommandCodeCatalogModel[]>;
|
|
61
|
-
/** Cached catalog with a TTL; a failed refresh keeps the previous snapshot.
|
|
61
|
+
/** Cached catalog with a TTL; a failed refresh keeps the previous snapshot.
|
|
62
|
+
*
|
|
63
|
+
* On the first cache miss of a process the persisted snapshot is rehydrated
|
|
64
|
+
* first, so a restart serves the previous listing without waiting on the
|
|
65
|
+
* network. An expired snapshot still answers immediately (stale) while a
|
|
66
|
+
* refresh runs in the background — the catalog is not fast-moving data, and
|
|
67
|
+
* waiting on an unreachable endpoint turned a restart into the full discovery
|
|
68
|
+
* timeout on every model resolution.
|
|
69
|
+
*/
|
|
62
70
|
export declare function loadProviderModels(options?: CommandCodeRequestOptions & {
|
|
63
71
|
force?: boolean;
|
|
64
72
|
}): Promise<CommandCodeCatalogModel[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/host/command-code/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,WAAW,EAWZ,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAA+B,MAAM,kBAAkB,CAAA;AAEjH,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,wCAAwC,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/host/command-code/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/command-code/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../../src/host/command-code/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAIlD,OAAO,EAAmB,WAAW,EAAE,aAAa,EAAqC,MAAM,YAAY,CAAA;AAC3G,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,uBAAuB,EAE5B,KAAK,0BAA0B,EAChC,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAKL,gBAAgB,EAMjB,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAA;AAqDrG;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,EAAE,SAAS,uBAAuB,EAAE,EAC3C,OAAO,UAAO,GACb,MAAM,EAAE,CAUV;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IACnC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAA;IAChD;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC;AAMD,mFAAmF;AACnF,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,sBAAsB,EACrC,WAAW,CAAC,EAAE,0BAA0B,EACxC,OAAO,GAAE,wBAA6B,EACtC,WAAW,GAAE,sBAAsB,GAAG,SAA+B,GACpE,OAAO,CAAC,oBAAoB,CAAC,CA0E/B;AAED,2EAA2E;AAC3E,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,mBAAmB,EAC1B,aAAa,EAAE,sBAAsB,EACrC,WAAW,CAAC,EAAE,0BAA0B,EACxC,OAAO,GAAE,wBAA6B,EACtC,WAAW,GAAE,sBAAsB,GAAG,SAA+B,GACpE,MAAM,IAAI,CA8OZ;AAED,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persistent snapshot for one provider's live model catalog.
|
|
3
|
+
*
|
|
4
|
+
* The in-memory catalog caches keep a process alive between requests, but they
|
|
5
|
+
* start cold: on the first call after a restart (or a plugin reinstall) the
|
|
6
|
+
* picker and the settings page both wait on the upstream listing before they
|
|
7
|
+
* can render anything, and an unreachable endpoint turns that wait into the
|
|
8
|
+
* full discovery timeout — "the model server is unavailable" on a fresh
|
|
9
|
+
* install. The catalog is not fast-moving data, so the last successful listing
|
|
10
|
+
* is persisted to `<DSH_HOME>/storages/` and rehydrated into the in-memory
|
|
11
|
+
* cache on first use. A snapshot the caller can read is therefore available
|
|
12
|
+
* from the very first call, with no network in the path.
|
|
13
|
+
*
|
|
14
|
+
* Writes are best-effort: persistence is an optimization, never a capability.
|
|
15
|
+
* A read-only home or a locked file must not fail the fetch that produced the
|
|
16
|
+
* snapshot.
|
|
17
|
+
*/
|
|
18
|
+
/** File name of the persisted snapshot for one catalog. */
|
|
19
|
+
export declare function catalogSnapshotPath(name: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Snapshot name for one catalog *and* one credential scope.
|
|
22
|
+
*
|
|
23
|
+
* A persisted snapshot answers before any credential is read — that is the whole
|
|
24
|
+
* point of it — so the file itself has to carry the scope it was fetched under.
|
|
25
|
+
* Otherwise the first call after a restart, for any account, is answered by
|
|
26
|
+
* whatever listing some other scope happened to persist last: a Kimi listing
|
|
27
|
+
* fetched for the mainland-cn endpoint would answer a global caller with models
|
|
28
|
+
* and context windows that region does not serve, and a Command Code listing
|
|
29
|
+
* fetched against one API environment would answer the other.
|
|
30
|
+
*
|
|
31
|
+
* The scope is part of the file name rather than of the payload because a caller
|
|
32
|
+
* that cannot name the account — the harness resolves this catalog with no token
|
|
33
|
+
* at all — still has to find the snapshot its own scope owns.
|
|
34
|
+
*
|
|
35
|
+
* Everything outside `[a-z0-9]` is folded to `_`, so no scope can escape the
|
|
36
|
+
* `storages` directory.
|
|
37
|
+
*/
|
|
38
|
+
export declare function catalogSnapshotName(base: string, scope: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Read the persisted snapshot for one catalog.
|
|
41
|
+
*
|
|
42
|
+
* Shape errors and unreadable files both return `undefined` — the caller keeps
|
|
43
|
+
* its in-memory state, and the next successful fetch overwrites the file.
|
|
44
|
+
*/
|
|
45
|
+
export declare function readCatalogSnapshot<T>(name: string, parseModels: (value: unknown) => T[] | undefined): Promise<{
|
|
46
|
+
fetchedAt: number;
|
|
47
|
+
models: T[];
|
|
48
|
+
} | undefined>;
|
|
49
|
+
/** Persist one snapshot; a failure is logged nowhere and never thrown. */
|
|
50
|
+
export declare function writeCatalogSnapshot<T>(name: string, models: T[], fetchedAt: number): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Warm an in-memory cache from the persisted snapshot when it is fresher than
|
|
53
|
+
* what the cache currently holds. Called lazily on the first cache miss of a
|
|
54
|
+
* process, so a restart serves the previous listing without waiting on the
|
|
55
|
+
* network.
|
|
56
|
+
*
|
|
57
|
+
* @returns the snapshot's `fetchedAt`, or `0` when no usable snapshot exists —
|
|
58
|
+
* the caller then fetches as before.
|
|
59
|
+
*/
|
|
60
|
+
export declare function rehydrateCatalogCache<T>(name: string, parseModels: (value: unknown) => T[] | undefined, accept: (fetchedAt: number, models: T[]) => void, currentFetchedAt: number): Promise<number>;
|
|
61
|
+
//# sourceMappingURL=catalog-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-snapshot.d.ts","sourceRoot":"","sources":["../../../../src/host/common/catalog-snapshot.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGvE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,GAAG,SAAS,GAC/C,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,CAczD;AAED,0EAA0E;AAC1E,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzG;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAC3C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,GAAG,SAAS,EAChD,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,EAChD,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAKjB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity a file-backed credential store reports when nothing is stored.
|
|
3
|
+
*
|
|
4
|
+
* An absent file is a *known* answer, not a cache miss: the store returns null
|
|
5
|
+
* without decrypting anything, which is what makes the signed-out settings card
|
|
6
|
+
* cheap to render.
|
|
7
|
+
*/
|
|
8
|
+
export declare const ABSENT_CREDENTIAL = "absent";
|
|
9
|
+
/**
|
|
10
|
+
* Cheap identity of one credential file: its last write time and size.
|
|
11
|
+
*
|
|
12
|
+
* Returns {@link ABSENT_CREDENTIAL} when the file does not exist, and `null`
|
|
13
|
+
* when its state cannot be established at all (a stat failure other than
|
|
14
|
+
* ENOENT) — `null` disables caching for that read rather than risking a stale
|
|
15
|
+
* answer.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fileCredentialIdentity(path: string): Promise<string | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Identity for a keyring-backed credential, which has no file to compare.
|
|
20
|
+
*
|
|
21
|
+
* A time bucket is the honest substitute: a burst of reads inside one bucket
|
|
22
|
+
* shares a single keyring lookup, and the bucket bounds how long a write from
|
|
23
|
+
* another process can go unnoticed. Fifteen seconds matches the scan cache the
|
|
24
|
+
* WorkBuddy store already keeps, and stays far below the polling interval of
|
|
25
|
+
* every surface that reads these credentials.
|
|
26
|
+
*/
|
|
27
|
+
export declare function keyringCredentialIdentity(ttlMs: number): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* In-memory snapshot of one credential read.
|
|
30
|
+
*
|
|
31
|
+
* Reading a credential is expensive on every platform this plugin supports:
|
|
32
|
+
* Windows runs a DPAPI unprotect through a spawned `powershell.exe` (measured
|
|
33
|
+
* at 200-243 ms on a real machine), macOS spawns `security`, and Linux spawns
|
|
34
|
+
* `secret-tool`. One settings request reads several credentials — a pool is
|
|
35
|
+
* read once per `read()` call, and a status card asks for the pool twice — so
|
|
36
|
+
* opening a tab cost 3-5 process launches and took 1-3 s.
|
|
37
|
+
*
|
|
38
|
+
* A snapshot is reused only while the stored value is provably unchanged, so a
|
|
39
|
+
* write from another process (the CLI login helper, a second Host) is still
|
|
40
|
+
* observed. The identity is read *before* the value: a write that lands during
|
|
41
|
+
* a read leaves the cached identity older than the stored bytes, so the next
|
|
42
|
+
* read compares against a newer identity and decrypts again. Reading it after
|
|
43
|
+
* would cache the older value under the newer identity and hide that write.
|
|
44
|
+
*
|
|
45
|
+
* Concurrent reads that observe the same identity share one in-flight read,
|
|
46
|
+
* which is what makes the two reads inside `readPoolStatus` cost one launch
|
|
47
|
+
* rather than two.
|
|
48
|
+
*
|
|
49
|
+
* Every write through the owning store calls {@link invalidate}, so the
|
|
50
|
+
* write-then-read verification the pools perform still reads real storage
|
|
51
|
+
* instead of the snapshot it just wrote.
|
|
52
|
+
*/
|
|
53
|
+
export declare class CredentialReadCache<T> {
|
|
54
|
+
private readonly identity;
|
|
55
|
+
private entry;
|
|
56
|
+
private pending;
|
|
57
|
+
/**
|
|
58
|
+
* @param identity - cheap identity of the stored value; `null` disables
|
|
59
|
+
* caching for the read.
|
|
60
|
+
*/
|
|
61
|
+
constructor(identity: () => Promise<string | null>);
|
|
62
|
+
/**
|
|
63
|
+
* Read through the snapshot.
|
|
64
|
+
*
|
|
65
|
+
* @param read - the expensive read, invoked only when the snapshot cannot
|
|
66
|
+
* answer.
|
|
67
|
+
* @returns the stored value, or null when nothing is stored.
|
|
68
|
+
*/
|
|
69
|
+
load(read: () => Promise<T | null>): Promise<T | null>;
|
|
70
|
+
/** Drop the snapshot; the next read consults storage again. */
|
|
71
|
+
invalidate(): void;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=credential-read-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-read-cache.d.ts","sourceRoot":"","sources":["../../../../src/host/common/credential-read-cache.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAA;AAEzC;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9E;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB,CAAC,CAAC;IAQpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAPrC,OAAO,CAAC,KAAK,CAAqD;IAClE,OAAO,CAAC,OAAO,CAAgE;IAE/E;;;OAGG;gBAC0B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAEnE;;;;;;OAMG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAwB5D,+DAA+D;IAC/D,UAAU,IAAI,IAAI;CAInB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One quota refresh that runs behind an already-answered status call.
|
|
3
|
+
*
|
|
4
|
+
* A status card used to block on the upstream quota request whenever its
|
|
5
|
+
* snapshot had aged past the line's TTL — measured at up to 3.6 s on a real
|
|
6
|
+
* machine, on a tab whose other work answers in milliseconds. A snapshot that
|
|
7
|
+
* exists can answer immediately instead, with the refresh running behind it.
|
|
8
|
+
*
|
|
9
|
+
* The outcome is remembered here rather than dropped: a refresh that keeps
|
|
10
|
+
* failing would otherwise look exactly like a snapshot that never aged, and the
|
|
11
|
+
* card would show old numbers with no hint of why they stopped moving.
|
|
12
|
+
*
|
|
13
|
+
* The caller still decides whether the snapshot may answer at all. No snapshot,
|
|
14
|
+
* or one belonging to another account, has to be fetched before the card can be
|
|
15
|
+
* rendered — those paths call {@link run} and wait.
|
|
16
|
+
*/
|
|
17
|
+
export declare class QuotaRefresh {
|
|
18
|
+
private pending;
|
|
19
|
+
private error;
|
|
20
|
+
/**
|
|
21
|
+
* Start one refresh behind the answer.
|
|
22
|
+
*
|
|
23
|
+
* A refresh that is already running is not duplicated; the caller can see
|
|
24
|
+
* that one is in flight through {@link refreshing} and ask again when it
|
|
25
|
+
* lands.
|
|
26
|
+
*/
|
|
27
|
+
start(refresh: () => Promise<unknown>): void;
|
|
28
|
+
/** Run one refresh and wait for it, recording the same outcome. */
|
|
29
|
+
run(refresh: () => Promise<unknown>): Promise<void>;
|
|
30
|
+
/** Whether a refresh started here is still running. */
|
|
31
|
+
get refreshing(): boolean;
|
|
32
|
+
/** Message from the most recent failed refresh, or null when none failed. */
|
|
33
|
+
lastError(): string | null;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=quota-refresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-refresh.d.ts","sourceRoot":"","sources":["../../../../src/host/common/quota-refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAAsB;IAEnC;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAa5C,mEAAmE;IAC7D,GAAG,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,uDAAuD;IACvD,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,6EAA6E;IAC7E,SAAS,IAAI,MAAM,GAAG,IAAI;CAG3B"}
|