dsh-llm-codebuddy-power 1.0.0 → 1.3.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/LICENSE +22 -22
- package/README.md +84 -66
- package/README.zh.md +84 -66
- package/cordis.patch.yml +7 -7
- package/icon.svg +6 -0
- package/lib/cli-login.js +113 -110
- package/lib/client.js +491 -410
- package/lib/index.js +439 -273
- package/lib/types/adapter.d.ts +7 -1
- package/lib/types/auth-service.d.ts +68 -22
- package/lib/types/cli/login.d.ts +1 -2
- package/lib/types/client/AccountSwitcher.d.ts +1 -2
- package/lib/types/client/CodeBuddySection.d.ts +17 -12
- package/lib/types/client/TurnCreditPill.d.ts +5 -4
- package/lib/types/client/index.d.ts +6 -6
- package/lib/types/client/locales.d.ts +6 -4
- package/lib/types/client/store.d.ts +19 -13
- package/lib/types/client/wire.d.ts +20 -3
- package/lib/types/constants.d.ts +15 -0
- package/lib/types/index.d.ts +44 -22
- package/lib/types/prefs.d.ts +17 -13
- package/lib/types/serialize.d.ts +19 -10
- package/lib/types/session-store.d.ts +1 -1
- package/lib/types/session.d.ts +59 -29
- package/lib/types/settings.d.ts +10 -7
- package/lib/types/storage.d.ts +6 -13
- package/lib/types/usage.d.ts +4 -2
- package/package.json +37 -30
- package/lib/types/client/UsageIndicator.d.ts +0 -21
- package/lib/types/client/poll.d.ts +0 -19
- package/lib/types/credit-store.d.ts +0 -25
- package/lib/types/selection.d.ts +0 -35
package/lib/types/prefs.d.ts
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CodeBuddy
|
|
2
|
+
* CodeBuddy 界面偏好的契约,Host 与 Client 两面共享。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* harness
|
|
7
|
-
* `codebuddy-draw`
|
|
4
|
+
* 这些偏好是**插件自己的 volatile 配置字段**:`Config` 里声明为 volatile 后,
|
|
5
|
+
* 设置表单按入口 id 把它们投影成可读写的表单,宿主在每次操作时读取当前值,因此
|
|
6
|
+
* 换浏览器、重启 harness 后仍然生效。其中「极简模式画图工具」还会被宿主读取来
|
|
7
|
+
* 决定 `codebuddy-draw` 对模型是否可见。
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* 本文件必须保持零运行时依赖:两面都会编译它,而 Client 面若因此引入 schemastery
|
|
10
10
|
* 就会把它打进浏览器产物(校验 schema 是宿主面的事,见 `./settings.ts`)。
|
|
11
|
+
* `Volatile` 是纯类型导入,擦除后不留依赖。
|
|
11
12
|
*
|
|
12
13
|
* @module dsh-llm-codebuddy-power/prefs
|
|
13
14
|
*/
|
|
14
|
-
|
|
15
|
+
import type { Volatile } from '@deepseek-ai/cordis';
|
|
16
|
+
/** 本插件的设置入口 id,与插件名一致。 */
|
|
15
17
|
export declare const CODEBUDDY_SETTINGS_NAMESPACE = "llm-codebuddy-power";
|
|
16
18
|
/** 告警百分比的下界(含)。 */
|
|
17
19
|
export declare const DANGER_PCT_MIN = 1;
|
|
18
20
|
/** 告警百分比的上界(含)。 */
|
|
19
21
|
export declare const DANGER_PCT_MAX = 100;
|
|
20
|
-
/**
|
|
22
|
+
/** 本插件的界面偏好;设置表单投影出的就是这个结构。 */
|
|
21
23
|
export interface CodeBuddyPrefs {
|
|
22
24
|
/** 对话输入区是否显示额度圆环。 */
|
|
23
25
|
showUsage: boolean;
|
|
@@ -29,15 +31,17 @@ export interface CodeBuddyPrefs {
|
|
|
29
31
|
/** 未覆盖任何一层时使用的偏好默认值。 */
|
|
30
32
|
export declare const DEFAULT_CODEBUDDY_SETTINGS: CodeBuddyPrefs;
|
|
31
33
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
+
* `Config` 里的界面偏好字段。
|
|
35
|
+
*
|
|
36
|
+
* 三者都声明为 volatile:设置表单只能读写 volatile 字段,而 volatile 引用在原地
|
|
37
|
+
* 更新,所以宿主每次 `.get()` 都拿到当前值,不必重挂插件。
|
|
34
38
|
*/
|
|
35
39
|
export interface CodeBuddyPrefsConfig {
|
|
36
40
|
/** 对话输入区是否显示额度圆环。 */
|
|
37
|
-
showUsage
|
|
41
|
+
showUsage: Volatile<boolean>;
|
|
38
42
|
/** 圆环填充变为告警颜色的已用百分比。 */
|
|
39
|
-
dangerPct
|
|
43
|
+
dangerPct: Volatile<number>;
|
|
40
44
|
/** 极简模式会话是否注入 codebuddy-draw 工具。 */
|
|
41
|
-
drawToolInMinimal
|
|
45
|
+
drawToolInMinimal: Volatile<boolean>;
|
|
42
46
|
}
|
|
43
47
|
//# sourceMappingURL=prefs.d.ts.map
|
package/lib/types/serialize.d.ts
CHANGED
|
@@ -2,28 +2,35 @@
|
|
|
2
2
|
* 把 harness 消息序列化为 CodeBuddy(OpenAI 兼容)chat 请求。
|
|
3
3
|
*
|
|
4
4
|
* 用户文本被拼接,助手文本成为 `content`,工具调用成为
|
|
5
|
-
* `tool_calls
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* `tool_calls`,每个工具结果是一条 `role: 'tool'` 的 harness 消息,直接映射为
|
|
6
|
+
* 同名 wire 条目。对于支持图像的模型,用户消息里的图**不内联**:改为给出一段
|
|
7
|
+
* 引导模型自行用 `read_image` 读取的提示词(附件服务解析出的只读绝对路径);
|
|
8
|
+
* 解析不出路径时退回内联,以免模型既拿不到图也拿不到路径。`read_image` 的工具
|
|
9
|
+
* 结果仍内联图片本身 —— 那是像素交给模型的唯一途径。生成图工具的结果继续走
|
|
10
|
+
* 纯文本信封。
|
|
11
11
|
*
|
|
12
12
|
* @module dsh-llm-codebuddy-power/serialize
|
|
13
13
|
*/
|
|
14
|
-
import type { GenerateOptions,
|
|
14
|
+
import type { GenerateOptions, ImageAttachmentAccessResolver, RequestMessage } from '@deepseek-ai/dsh-llm';
|
|
15
15
|
import type { RequestImageAttachment } from '@deepseek-ai/dsh-attachment';
|
|
16
16
|
import type { WireMessage, WireRequest } from './types.ts';
|
|
17
17
|
/** 请求中每个图像已解析的请求版本,以 attachment id 为键。 */
|
|
18
18
|
export type RequestImages = ReadonlyMap<RequestImageAttachment['attachment']['attachmentId'], RequestImageAttachment>;
|
|
19
19
|
/**
|
|
20
20
|
* 按顺序序列化整个对话。
|
|
21
|
+
*
|
|
22
|
+
* 工具结果在 harness 里是**独立的 `role: 'tool'` 消息**(`ToolResultMessage`),
|
|
23
|
+
* 因此这里逐条映射,而不是按块从 user 消息里筛选。
|
|
24
|
+
* developer 消息由运行时在 `projectToolUpdates` 中剥离(本 adapter 未声明
|
|
25
|
+
* `toolUpdate`),因此不会到达这里;万一到达即明确拒绝,而不是静默丢弃。
|
|
21
26
|
* @param messages - harness 会话。
|
|
22
27
|
* @param supportsImages - 所选模型是否声明支持图像输入。
|
|
23
28
|
* @param images - 请求中每个图像已解析的请求版本。
|
|
24
|
-
* @
|
|
29
|
+
* @param resolveAccess - 解析单张图在当前执行世界中的只读路径。
|
|
30
|
+
* @param route - 本请求的读图形态。
|
|
31
|
+
* @returns wire 消息,工具结果各自成为独立条目。
|
|
25
32
|
*/
|
|
26
|
-
export declare function serializeMessages(messages: readonly
|
|
33
|
+
export declare function serializeMessages(messages: readonly RequestMessage[], supportsImages: boolean, images?: RequestImages, resolveAccess?: ImageAttachmentAccessResolver, route?: 'direct' | 'ptc' | 'none'): WireMessage[];
|
|
27
34
|
/**
|
|
28
35
|
* 构建 chat-completions 请求体。始终流式并上报 usage;
|
|
29
36
|
* 缺省的选项被省略而非以 null 发送,以便应用
|
|
@@ -31,7 +38,9 @@ export declare function serializeMessages(messages: readonly Message[], supports
|
|
|
31
38
|
* @param options - 组装好的 harness 请求。
|
|
32
39
|
* @param supportsImages - 所选模型是否声明支持图像输入。
|
|
33
40
|
* @param images - 请求中每个图像已解析的请求版本。
|
|
41
|
+
* @param resolveAccess - 解析单张图在当前执行世界中的只读路径。
|
|
42
|
+
* @param route - 本请求的读图形态,由工具目录决定;写入前由调用方计算一次。
|
|
34
43
|
* @returns 请求体。
|
|
35
44
|
*/
|
|
36
|
-
export declare function serializeRequest(options: GenerateOptions, supportsImages: boolean, images?: RequestImages): WireRequest;
|
|
45
|
+
export declare function serializeRequest(options: GenerateOptions, supportsImages: boolean, images?: RequestImages, resolveAccess?: ImageAttachmentAccessResolver): WireRequest;
|
|
37
46
|
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -28,7 +28,7 @@ export interface SessionAccountRef {
|
|
|
28
28
|
}
|
|
29
29
|
/** 一个会话的持久化信息。 */
|
|
30
30
|
export interface SessionInfo {
|
|
31
|
-
/** 该会话选用的账号 uid
|
|
31
|
+
/** 该会话选用的账号 uid;未选用时缺省,按账号级兜底解析。 */
|
|
32
32
|
uid?: string;
|
|
33
33
|
/** 本会话用过的账号,以文件内部序号为键;每轮记录里的账号引用指向这里。 */
|
|
34
34
|
accounts: Record<string, SessionAccountRef>;
|
package/lib/types/session.d.ts
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* 并发调用会互相取到对方的刷新结果,其中一个的 token 永远停留过期。
|
|
8
8
|
*
|
|
9
9
|
* 账号由会话决定:某个会话显式选了账号就用它,否则顺延到派生它的会话(子代理、
|
|
10
|
-
* fork)
|
|
10
|
+
* fork),再落到账号级兜底(最后一次手动切换的账号,其次是列表第一个)。会话在
|
|
11
|
+
* 第一次真正发请求时把解析到的账号固定下来,此后不再跟随兜底。目录与计量快照
|
|
11
12
|
* 也按账号分别缓存,因为不同账号的可用模型与额度本就可以不同。
|
|
12
13
|
*
|
|
13
14
|
* @module dsh-llm-codebuddy-power/session
|
|
@@ -30,7 +31,7 @@ interface Catalog {
|
|
|
30
31
|
promotions: readonly CodeBuddyModelPromotion[];
|
|
31
32
|
tiers: readonly CodeBuddyModelTier[] | undefined;
|
|
32
33
|
}
|
|
33
|
-
/**
|
|
34
|
+
/** 配置页与账号切换按钮读取的账号投影。 */
|
|
34
35
|
export interface CodeBuddyAccountInfo {
|
|
35
36
|
uid: string;
|
|
36
37
|
nickname: string;
|
|
@@ -64,7 +65,7 @@ export interface TurnCreditAccount {
|
|
|
64
65
|
nickname: string;
|
|
65
66
|
}
|
|
66
67
|
/**
|
|
67
|
-
*
|
|
68
|
+
* 每轮积分记录,即文件里的形状:消耗值,本轮用过的账号,以及本轮请求 id。
|
|
68
69
|
*
|
|
69
70
|
* 账号只存账号表里的序号(见 `session-store.ts`),完整 uid 与昵称在表里各存一份。模型
|
|
70
71
|
* 由 dsh 用量自带,插件不再存。
|
|
@@ -77,6 +78,15 @@ export interface TurnCreditRecord {
|
|
|
77
78
|
* 每一个,事后悬停才不会把整轮说成最后那个账号。
|
|
78
79
|
*/
|
|
79
80
|
accounts: string[];
|
|
81
|
+
/**
|
|
82
|
+
* 本轮的 CodeBuddy 请求 id。
|
|
83
|
+
*
|
|
84
|
+
* 一条记录一个,轮内所有请求共用,因此直接内联而不建表 —— 账号需要表是因为同一账号
|
|
85
|
+
* 在几十轮里反复出现,而请求 id 每轮都不同,没有可去重的重复。
|
|
86
|
+
*
|
|
87
|
+
* 可选是为了读出本字段存在之前写下的记录:那些轮次照常显示积分,只是拿不出 id。
|
|
88
|
+
*/
|
|
89
|
+
requestId?: string;
|
|
80
90
|
}
|
|
81
91
|
/**
|
|
82
92
|
* 解析出的一个账号:界面需要的两个事实。
|
|
@@ -91,6 +101,8 @@ export interface TurnCreditAccountView {
|
|
|
91
101
|
export interface TurnCreditRecordView {
|
|
92
102
|
credit: number;
|
|
93
103
|
accounts: TurnCreditAccountView[];
|
|
104
|
+
/** 本轮请求 id;读到的记录早于该字段时为缺省。 */
|
|
105
|
+
requestId?: string;
|
|
94
106
|
}
|
|
95
107
|
/**
|
|
96
108
|
* 把一条文件记录里的账号引用按账号表展开。
|
|
@@ -118,7 +130,7 @@ export declare class CodeBuddySession {
|
|
|
118
130
|
private readonly logger?;
|
|
119
131
|
/**
|
|
120
132
|
* `listModels` 或 `resolveModel` 报出的内容可能变化时触发一次:账号集合变化
|
|
121
|
-
* (
|
|
133
|
+
* (登录、退出)或各账号已读到的目录并集变大。
|
|
122
134
|
*/
|
|
123
135
|
private readonly onModelsChanged?;
|
|
124
136
|
private storage;
|
|
@@ -143,7 +155,7 @@ export declare class CodeBuddySession {
|
|
|
143
155
|
*
|
|
144
156
|
* 集合只由**带会话身份的**读取填充(聊天请求、模型面板),并供拿不到会话身份的
|
|
145
157
|
* 调用方({@link knownModel}、`listModels`)查询:那些调用方无法知道该用哪个账号
|
|
146
|
-
*
|
|
158
|
+
* 的目录,主动读取只能落在账号级兜底上 —— 而当前会话用的可能正是另一个账号。
|
|
147
159
|
*/
|
|
148
160
|
private readonly knownCatalog;
|
|
149
161
|
/** 按账号 uid 单飞的目录读取。 */
|
|
@@ -164,7 +176,7 @@ export declare class CodeBuddySession {
|
|
|
164
176
|
constructor(logger?: SessionLogger | undefined,
|
|
165
177
|
/**
|
|
166
178
|
* `listModels` 或 `resolveModel` 报出的内容可能变化时触发一次:账号集合变化
|
|
167
|
-
* (
|
|
179
|
+
* (登录、退出)或各账号已读到的目录并集变大。
|
|
168
180
|
*/
|
|
169
181
|
onModelsChanged?: (() => void) | undefined);
|
|
170
182
|
/**
|
|
@@ -242,7 +254,7 @@ export declare class CodeBuddySession {
|
|
|
242
254
|
/**
|
|
243
255
|
* 由当前缓存的各账号目录重建合并目录。
|
|
244
256
|
*
|
|
245
|
-
* 账号退出后的处理必须是"重建"而不是"清空"
|
|
257
|
+
* 账号退出后的处理必须是"重建"而不是"清空":清空会让官方列表塌回账号级兜底,
|
|
246
258
|
* 而其余仍登录账号的目录本来就在手上 —— 继续并着才是"退出后重新合并当前已有的
|
|
247
259
|
* 列表"。重建同时确定性地解决同 id 的归属:只剩下仍在的账号参与竞争。
|
|
248
260
|
*/
|
|
@@ -265,7 +277,7 @@ export declare class CodeBuddySession {
|
|
|
265
277
|
* 或每记一次“最后切换的账号”都会被当成账号变更,从而丢掉按账号缓存的计量快照并
|
|
266
278
|
* 广播一次模型变更 —— 那些都不是账号增删。真的增删时才会丢弃已退出账号的缓存并
|
|
267
279
|
* 重建合并目录:退出一个账号后官方列表应当继续并着其余账号已读到的目录,而不是
|
|
268
|
-
*
|
|
280
|
+
* 塌回账号级兜底那一个。
|
|
269
281
|
*/
|
|
270
282
|
private refreshIfChanged;
|
|
271
283
|
/** 账号条目,按 uid 查。 */
|
|
@@ -274,24 +286,41 @@ export declare class CodeBuddySession {
|
|
|
274
286
|
* 该会话自身及其派生祖先显式选用的账号,由近及远。读取某个会话的信息可能要碰盘,
|
|
275
287
|
* 因此本方法是异步的。
|
|
276
288
|
*
|
|
277
|
-
* 走到祖先是因为子代理与 fork
|
|
278
|
-
*
|
|
289
|
+
* 走到祖先是因为子代理与 fork 出来的会话在**固定之前**还没有自己的账号:子代理
|
|
290
|
+
* 界面上从来就没有账号按钮,若不沿用父会话就会静默改用账号级兜底,把一次派发记到
|
|
291
|
+
* 另一个账号头上;fork 有自己的按钮,但它在被切换之前也应当跟着父会话走。
|
|
279
292
|
*/
|
|
280
293
|
private accountChain;
|
|
281
294
|
/**
|
|
282
295
|
* 该会话此刻生效的账号 uid。
|
|
283
296
|
*
|
|
284
|
-
* 顺序:会话(或其派生祖先)显式选用的账号 →
|
|
285
|
-
*
|
|
286
|
-
*
|
|
297
|
+
* 顺序:会话(或其派生祖先)显式选用的账号 → 最后一次手动切换的账号 → 列表第一个。
|
|
298
|
+
* 指向已退出账号的选择会被跳过,而不是当成“没有账号”;全部落空时返回
|
|
299
|
+
* `undefined`,调用方据此报未登录。
|
|
287
300
|
*/
|
|
288
301
|
private accountUidFor;
|
|
302
|
+
/**
|
|
303
|
+
* 把该会话此刻解析到的账号写进它自己的文件,使它从此不再跟随账号级兜底。
|
|
304
|
+
*
|
|
305
|
+
* 已有选择就不再动它。那有两种可能,而两种都不该被覆盖:早已固定的会话重写只是
|
|
306
|
+
* 同一份事实的重复落盘;而记录指向一个已退出账号时,读取侧按"没有选择"处理它,
|
|
307
|
+
* 磁盘上的记录则只增不删 —— 覆盖掉它会让该账号重新登录后不再回到这个会话。
|
|
308
|
+
* @param sessionId - dsh 会话身份。
|
|
309
|
+
* @param uid - 本次请求实际使用的账号 uid。
|
|
310
|
+
*/
|
|
311
|
+
private pinAccount;
|
|
289
312
|
private identityOf;
|
|
290
313
|
/** 把刷新后的账号写回内存,并尽力落盘(写不进去也不影响本进程继续使用)。 */
|
|
291
314
|
private persist;
|
|
292
315
|
/**
|
|
293
316
|
* 已存账号条目,在首次使用、失效之后以及文件被外部改动时从磁盘读取。
|
|
294
|
-
*
|
|
317
|
+
*
|
|
318
|
+
* 解析出的账号在返回前固定进该会话自己的文件,因此"这个会话用哪个账号"只在它
|
|
319
|
+
* 第一次真正发请求时从全局兜底取一次;此后用户别处切换账号不会再改变它。固定
|
|
320
|
+
* 挂在这里而不是账号解析处(见 {@link accountUidFor}),是因为本方法只被
|
|
321
|
+
* {@link requestIdentity} 调用,即只有真实请求经过 —— 界面上打开一个空会话所
|
|
322
|
+
* 触发的用量与目录读取不会落下任何记录。
|
|
323
|
+
* @param sessionId - 用哪个会话的账号;会话未选用时按账号级兜底解析。
|
|
295
324
|
* @throws NotLoggedInError 未存有任何凭据时。
|
|
296
325
|
*/
|
|
297
326
|
private require;
|
|
@@ -312,7 +341,7 @@ export declare class CodeBuddySession {
|
|
|
312
341
|
* 两者在**同一次**身份解析中一起给出:分开解析会有两次账号选择,而账号是每次请求
|
|
313
342
|
* 解析的(用户可在同一步里切换),两次解析可能落到不同账号上 —— 那样记进这一轮的
|
|
314
343
|
* 账号名就与实际发出去的请求不符。缩写由落盘侧按同一规则算出,故此处给出完整账号。
|
|
315
|
-
* @param sessionId -
|
|
344
|
+
* @param sessionId - 请求所属的会话;决定用哪个账号,缺省时按账号级兜底。
|
|
316
345
|
* @returns 身份请求头与发起该请求的账号。
|
|
317
346
|
*/
|
|
318
347
|
requestIdentity(sessionId?: string): Promise<CodeBuddyRequestIdentity>;
|
|
@@ -322,21 +351,22 @@ export declare class CodeBuddySession {
|
|
|
322
351
|
*/
|
|
323
352
|
isLoggedIn(): Promise<boolean>;
|
|
324
353
|
/**
|
|
325
|
-
*
|
|
326
|
-
* @returns 账号列表(顺序与磁盘一致)
|
|
354
|
+
* 已存账号,供配置页与会话切换按钮展示。
|
|
355
|
+
* @returns 账号列表(顺序与磁盘一致);未登录时列表为空。
|
|
327
356
|
*/
|
|
328
|
-
accountList(): Promise<
|
|
329
|
-
accounts: CodeBuddyAccountInfo[];
|
|
330
|
-
defaultUid?: string;
|
|
331
|
-
}>;
|
|
357
|
+
accountList(): Promise<CodeBuddyAccountInfo[]>;
|
|
332
358
|
/**
|
|
333
359
|
* 某会话此刻生效的账号 uid。
|
|
334
|
-
* @param sessionId - dsh
|
|
360
|
+
* @param sessionId - dsh 会话身份;缺省时按账号级兜底。
|
|
335
361
|
* @returns 账号 uid;一个账号也没有时为 `undefined`。
|
|
336
362
|
*/
|
|
337
363
|
activeUid(sessionId?: string): Promise<string | undefined>;
|
|
338
364
|
/**
|
|
339
365
|
* 把某会话的账号切换为指定账号,并把它记为最后一次手动切换的账号。
|
|
366
|
+
*
|
|
367
|
+
* 该会话已有持久记录才写它自己的文件;一个还从未落过盘的新会话只更新账号级的
|
|
368
|
+
* `lastUid` —— 它可能永远不会被发过第一条消息,为它建文件会在磁盘上留下无人
|
|
369
|
+
* 认领的残留文件。这类会话在真正发请求时由 {@link require} 固定下来。
|
|
340
370
|
* @param sessionId - dsh 会话身份。
|
|
341
371
|
* @param uid - 要使用的账号 uid。
|
|
342
372
|
* @returns 该 uid 是已存账号时为 true;否则不做任何改动并返回 false。
|
|
@@ -345,7 +375,7 @@ export declare class CodeBuddySession {
|
|
|
345
375
|
/**
|
|
346
376
|
* CodeBuddy 模型目录,短暂缓存,并在并发读取者之间共享。
|
|
347
377
|
* @param signal - 底层读取的可选取消信号。
|
|
348
|
-
* @param sessionId -
|
|
378
|
+
* @param sessionId - 用哪个会话的账号;缺省时按账号级兜底解析。
|
|
349
379
|
* @returns 目录中的模型,按服务自身的顺序。
|
|
350
380
|
*/
|
|
351
381
|
models(signal?: AbortSignal, sessionId?: string): Promise<readonly CodeBuddyModel[]>;
|
|
@@ -353,7 +383,7 @@ export declare class CodeBuddySession {
|
|
|
353
383
|
* 目录及其推广与档位,在同一个 TTL 下按账号一起缓存,并按账号单飞,使列表与
|
|
354
384
|
* 面板富化共享同一次读取。
|
|
355
385
|
* @param signal - 底层读取的可选取消信号。
|
|
356
|
-
* @param sessionId -
|
|
386
|
+
* @param sessionId - 用哪个会话的账号;缺省时按账号级兜底解析。
|
|
357
387
|
* @returns 模型、推广与档位。
|
|
358
388
|
*/
|
|
359
389
|
catalogData(signal?: AbortSignal, sessionId?: string): Promise<Catalog>;
|
|
@@ -362,7 +392,7 @@ export declare class CodeBuddySession {
|
|
|
362
392
|
* 从各账号已读到的目录的并集里查一个模型,**不发起任何请求**。
|
|
363
393
|
*
|
|
364
394
|
* 供拿不到会话身份的调用方使用(适配器的 `resolveModel`):它无法知道该用哪个
|
|
365
|
-
*
|
|
395
|
+
* 账号的目录,主动读取只能落在账号级兜底上,而当前会话用的可能正是另一个账号 ——
|
|
366
396
|
* 那会把一个账号独有的模型解析成保守的默认能力(上下文窗口、输出上限、图片输入
|
|
367
397
|
* 全部按最保守处理)。并集由带会话身份的读取填充,因此这个查询零成本、也不改变
|
|
368
398
|
* "谁在读目录"这件事。
|
|
@@ -383,17 +413,17 @@ export declare class CodeBuddySession {
|
|
|
383
413
|
* 目录及其推广/档位;读不到时返回空值 —— 供面板使用的
|
|
384
414
|
* {@link catalogData} 建议性读取孪生体。
|
|
385
415
|
* @param signal - 可选取消信号。
|
|
386
|
-
* @param sessionId -
|
|
416
|
+
* @param sessionId - 用哪个会话的账号;缺省时按账号级兜底解析。
|
|
387
417
|
* @returns 目录与活动,或空列表。
|
|
388
418
|
*/
|
|
389
419
|
catalogDataOrEmpty(signal?: AbortSignal, sessionId?: string): Promise<Catalog>;
|
|
390
420
|
/**
|
|
391
421
|
* 目录;读不到时返回空列表。
|
|
392
422
|
*
|
|
393
|
-
*
|
|
423
|
+
* 列出模型是配置页上的浏览动作,所以失败必须降级为“没有可显示的内容”,
|
|
394
424
|
* 而不是让页面崩掉。请求路径直接使用 {@link models} 并保留真实失败。
|
|
395
425
|
* @param signal - 可选取消信号。
|
|
396
|
-
* @param sessionId -
|
|
426
|
+
* @param sessionId - 用哪个会话的账号;缺省时按账号级兜底解析。
|
|
397
427
|
* @returns 目录,或空列表。
|
|
398
428
|
*/
|
|
399
429
|
modelsOrEmpty(signal?: AbortSignal, sessionId?: string): Promise<readonly CodeBuddyModel[]>;
|
|
@@ -405,7 +435,7 @@ export declare class CodeBuddySession {
|
|
|
405
435
|
* 其他每种失败(传输、解析、刷新过期)都在一条警告之后解析为
|
|
406
436
|
* `undefined`。身份通过与聊天请求相同的按账号单飞刷新解析,所以并发的计量
|
|
407
437
|
* 读取绝不会消耗两次刷新 token。
|
|
408
|
-
* @param sessionId -
|
|
438
|
+
* @param sessionId - 用哪个会话的账号;缺省时按账号级兜底解析。
|
|
409
439
|
* @param signal - 可选取消信号。
|
|
410
440
|
* @returns 该快照;未存有任何凭据或计量平面不可达时为 `undefined`。
|
|
411
441
|
*/
|
package/lib/types/settings.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 本插件的 `Config` schema —— 连接事实与界面偏好合一。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* `
|
|
6
|
-
*
|
|
4
|
+
* 设置表单只投影**入口自己的 `Config`** 里声明为 `.volatile()` 的字段(入口 id
|
|
5
|
+
* 即命名空间),因此界面偏好字段与连接字段同在 `Config` 中,只有偏好那三个是
|
|
6
|
+
* volatile。
|
|
7
7
|
*
|
|
8
8
|
* 字段的默认值一律取自 `DEFAULT_CODEBUDDY_SETTINGS`,不在此重复字面量 ——
|
|
9
9
|
* 两处各写一份时,改了一处就会出现「宿主默认 90、界面显示 80」这种只有用户
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
* @module dsh-llm-codebuddy-power/settings
|
|
13
13
|
*/
|
|
14
14
|
import z from '@deepseek-ai/schemastery';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/** `Config.showUsage` 的 schema。 */
|
|
16
|
+
export declare const ShowUsageField: z<boolean, boolean, "volatile-defined">;
|
|
17
|
+
/** `Config.dangerPct` 的 schema。 */
|
|
18
|
+
export declare const DangerPctField: z<number, number, "volatile-defined">;
|
|
19
|
+
/** `Config.drawToolInMinimal` 的 schema。 */
|
|
20
|
+
export declare const DrawToolInMinimalField: z<boolean, boolean, "volatile-defined">;
|
|
18
21
|
//# sourceMappingURL=settings.d.ts.map
|
package/lib/types/storage.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* (`$DSH_HOME/data/plugins/llm-codebuddy-power/`,通过 harness 所用的同一个
|
|
6
6
|
* `@deepseek-ai/dsh-home-paths` 解析),而不放在插件包内,因此重装不会让
|
|
7
7
|
* 用户退出登录。写入经 [atomic-file.ts](./atomic-file.ts) 做原子替换并按路径串行化:
|
|
8
|
-
*
|
|
8
|
+
* 多个账号的令牌刷新、配置页的增删与 CLI 的调用都在改同一份文件,不串行化时
|
|
9
9
|
* 两个并发写入会各自基于自己读到的旧内容覆盖对方。残缺文件会让用户手里只有
|
|
10
10
|
* 一份读不出的凭据,还无法与“从未登录过”区分开。
|
|
11
11
|
*
|
|
@@ -37,12 +37,10 @@ export interface CodeBuddyStoredAccount {
|
|
|
37
37
|
}
|
|
38
38
|
/** 持久化的账号集合。 */
|
|
39
39
|
export interface CodeBuddyStorage {
|
|
40
|
-
/**
|
|
40
|
+
/** 账号列表,顺序即展示顺序;列表第一个在没有 `lastUid` 时兜底。 */
|
|
41
41
|
accounts: CodeBuddyStoredAccount[];
|
|
42
|
-
/** 用户显式指定的默认账号;未指定时缺省。 */
|
|
43
|
-
defaultUid?: string;
|
|
44
42
|
/**
|
|
45
|
-
*
|
|
43
|
+
* 最后一次被手动切换到的账号,作为未选用账号的会话的兜底;所以存在这里
|
|
46
44
|
* 而不是某个会话的文件里 —— 它是账号级的事实,不是某个会话的事实。
|
|
47
45
|
*/
|
|
48
46
|
lastUid?: string;
|
|
@@ -80,7 +78,7 @@ export declare function updateStorage(change: (current: CodeBuddyStorage) => Cod
|
|
|
80
78
|
* 插入一个账号,或替换同 uid 账号的凭据。
|
|
81
79
|
*
|
|
82
80
|
* 同 uid 视为重新登录同一个账号:令牌被替换而不是追加成第二个条目,否则
|
|
83
|
-
*
|
|
81
|
+
* 配置页会出现两个同名徽章,退出其中一个还会留下另一个。
|
|
84
82
|
* @param entry - 刚登录得到的账号。
|
|
85
83
|
*/
|
|
86
84
|
export declare function upsertAccount(entry: CodeBuddyStoredAccount): Promise<void>;
|
|
@@ -94,17 +92,12 @@ export declare function upsertAccount(entry: CodeBuddyStoredAccount): Promise<vo
|
|
|
94
92
|
*/
|
|
95
93
|
export declare function reorderAccounts(uids: readonly string[]): Promise<void>;
|
|
96
94
|
/**
|
|
97
|
-
*
|
|
95
|
+
* 移除若干账号,并清掉指向它们的“最后一次手动切换”的账号。
|
|
98
96
|
* @param uids - 要移除的账号 uid。
|
|
99
97
|
*/
|
|
100
98
|
export declare function removeAccounts(uids: readonly string[]): Promise<void>;
|
|
101
99
|
/**
|
|
102
|
-
*
|
|
103
|
-
* @param uid - 默认账号的 uid;传 `undefined` 取消默认账号。
|
|
104
|
-
*/
|
|
105
|
-
export declare function setDefaultAccount(uid: string | undefined): Promise<void>;
|
|
106
|
-
/**
|
|
107
|
-
* 记下最后一次被手动切换到的账号(没有默认账号时作为兜底)。
|
|
100
|
+
* 记下最后一次被手动切换到的账号,作为未选用账号的会话的兜底。
|
|
108
101
|
* @param uid - 被切换到的账号 uid。
|
|
109
102
|
*/
|
|
110
103
|
export declare function setLastAccount(uid: string): Promise<void>;
|
package/lib/types/usage.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface UsageWindow {
|
|
|
23
23
|
limit?: number;
|
|
24
24
|
/** 窗口重置时刻的 ISO 风格时间戳,当披露了它时。 */
|
|
25
25
|
resetsAt?: string;
|
|
26
|
+
/** 窗口是否为一次性赠送 `true`;可续期主套餐为 `false`。 */
|
|
27
|
+
gift: boolean;
|
|
26
28
|
}
|
|
27
29
|
/** 设置界面所渲染的已解析用量。 */
|
|
28
30
|
export interface UsageSnapshot {
|
|
@@ -41,8 +43,8 @@ export interface UsageSnapshot {
|
|
|
41
43
|
*/
|
|
42
44
|
main?: UsagePool;
|
|
43
45
|
/**
|
|
44
|
-
* 一次性赠送池(
|
|
45
|
-
*
|
|
46
|
+
* 一次性赠送池("裂变包"/"拉新权益包"):它自己的聚合进度条,其提示框列出最早
|
|
47
|
+
* 过期的有效赠送。
|
|
46
48
|
*/
|
|
47
49
|
gift?: GiftUsage;
|
|
48
50
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-llm-codebuddy-power",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "1.
|
|
3
|
+
"description": "A full-featured CodeBuddy (WorkBuddy) provider plugin.",
|
|
4
|
+
"version": "1.3.0",
|
|
5
|
+
"icon": "./icon.svg",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"contributors": [
|
|
7
8
|
"pgnqukezrdxmhjso"
|
|
@@ -19,7 +20,8 @@
|
|
|
19
20
|
"dsh-plugin",
|
|
20
21
|
"cordis",
|
|
21
22
|
"llm",
|
|
22
|
-
"codebuddy"
|
|
23
|
+
"codebuddy",
|
|
24
|
+
"workbuddy"
|
|
23
25
|
],
|
|
24
26
|
"type": "module",
|
|
25
27
|
"main": "lib/index.js",
|
|
@@ -39,6 +41,7 @@
|
|
|
39
41
|
"./package.json": "./package.json"
|
|
40
42
|
},
|
|
41
43
|
"files": [
|
|
44
|
+
"icon.svg",
|
|
42
45
|
"cordis.patch.yml",
|
|
43
46
|
"lib/index.js",
|
|
44
47
|
"lib/client.js",
|
|
@@ -49,11 +52,11 @@
|
|
|
49
52
|
"LICENSE"
|
|
50
53
|
],
|
|
51
54
|
"peerDependencies": {
|
|
52
|
-
"@deepseek-ai/
|
|
53
|
-
"@deepseek-ai/
|
|
54
|
-
"@deepseek-ai/dsh-
|
|
55
|
-
"@deepseek-ai/dsh-
|
|
56
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
55
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
56
|
+
"@deepseek-ai/dsh-home-paths": "^0.1.7-rc.2",
|
|
57
|
+
"@deepseek-ai/dsh-llm": "^0.1.7-rc.2",
|
|
58
|
+
"@deepseek-ai/dsh-tools": "^0.1.7-rc.2",
|
|
59
|
+
"@deepseek-ai/schemastery": "^3.18.4"
|
|
57
60
|
},
|
|
58
61
|
"devDependencies": {
|
|
59
62
|
"@types/node": "^22.15.0",
|
|
@@ -62,28 +65,30 @@
|
|
|
62
65
|
"react": "^18.2.0",
|
|
63
66
|
"react-dom": "^18.2.0",
|
|
64
67
|
"typescript": "^6.0.3",
|
|
65
|
-
"@deepseek-ai/dsh-
|
|
66
|
-
"@deepseek-ai/dsh-
|
|
67
|
-
"@deepseek-ai/
|
|
68
|
-
"@deepseek-ai/dsh-client-
|
|
69
|
-
"@deepseek-ai/
|
|
70
|
-
"@deepseek-ai/dsh-
|
|
71
|
-
"@deepseek-ai/dsh-
|
|
72
|
-
"@deepseek-ai/dsh-client-
|
|
73
|
-
"@deepseek-ai/dsh-
|
|
74
|
-
"@deepseek-ai/dsh-
|
|
75
|
-
"@deepseek-ai/dsh-client-ui-
|
|
76
|
-
"@deepseek-ai/dsh-client-ui-
|
|
77
|
-
"@deepseek-ai/dsh-client-ui-
|
|
78
|
-
"@deepseek-ai/dsh-client-ui-slots": "^0.1.
|
|
79
|
-
"@deepseek-ai/dsh-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/
|
|
68
|
+
"@deepseek-ai/dsh-client-locale": "^0.1.7-rc.2",
|
|
69
|
+
"@deepseek-ai/dsh-attachment": "^0.1.7-rc.2",
|
|
70
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
71
|
+
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.7-rc.2",
|
|
72
|
+
"@deepseek-ai/dsh-client-store": "^0.1.7-rc.2",
|
|
73
|
+
"@deepseek-ai/dsh-client-connection": "^0.1.7-rc.2",
|
|
74
|
+
"@deepseek-ai/dsh-api-remotes": "^0.1.7-rc.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-model-selection": "^0.1.7-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-chat": "^0.1.7-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-agent": "^0.1.7-rc.2",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-settings": "^0.1.7-rc.2",
|
|
79
|
+
"@deepseek-ai/dsh-client-ui-renderer": "^0.1.7-rc.2",
|
|
80
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": "^0.1.7-rc.2",
|
|
81
|
+
"@deepseek-ai/dsh-client-ui-slots": "^0.1.7-rc.2",
|
|
82
|
+
"@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-rc.2",
|
|
83
|
+
"@deepseek-ai/dsh-home-paths": "^0.1.7-rc.2",
|
|
84
|
+
"@deepseek-ai/dsh-client-ui-tool": "^0.1.7-rc.2",
|
|
85
|
+
"@deepseek-ai/dsh-fs": "^0.1.7-rc.2",
|
|
86
|
+
"@deepseek-ai/dsh-llm": "^0.1.7-rc.2",
|
|
87
|
+
"@deepseek-ai/dsh-host-webserver": "^0.1.7-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-session": "^0.1.7-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-tools": "^0.1.7-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-settings": "^0.1.7-rc.2",
|
|
91
|
+
"@deepseek-ai/schemastery": "^3.18.4"
|
|
87
92
|
},
|
|
88
93
|
"dependencies": {
|
|
89
94
|
"eventsource-parser": "^3.1.0"
|
|
@@ -99,6 +104,7 @@
|
|
|
99
104
|
"@deepseek-ai/dsh-client-connection",
|
|
100
105
|
"@deepseek-ai/dsh-client-locale",
|
|
101
106
|
"@deepseek-ai/dsh-client-ui-model-selection",
|
|
107
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager",
|
|
102
108
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
103
109
|
"@deepseek-ai/dsh-client-ui-renderer"
|
|
104
110
|
]
|
|
@@ -110,6 +116,7 @@
|
|
|
110
116
|
"verify": "node ../dsh-pgnqukezrdxmhjso-base/verify.mjs",
|
|
111
117
|
"pub": "pnpm run build && pnpm login --registry=https://registry.npmjs.org && pnpm publish --registry=https://registry.npmjs.org --no-git-checks",
|
|
112
118
|
"pack": "pnpm run build && pnpm pack --pack-destination lib",
|
|
119
|
+
"link-test-i": "pnpm run build && (pnpm dsh plugin --profile pkgtest remove %npm_package_name% & pnpm dsh plugin --profile pkgtest add link:./)",
|
|
113
120
|
"pack-test-i": "pnpm run pack && (pnpm dsh plugin --profile pkgtest remove %npm_package_name% & pnpm dsh plugin --profile pkgtest add ./lib/%npm_package_name%-%npm_package_version%.tgz)",
|
|
114
121
|
"npm-test-i": "pnpm dsh plugin --profile pkgtest remove %npm_package_name% & pnpm dsh plugin --profile pkgtest add --registry=https://registry.npmjs.org %npm_package_name%@%npm_package_version%",
|
|
115
122
|
"test-create": "pnpm dsh --profile pkgtest --from-default-profile web",
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 渲染在侧边栏底部 Settings 触发项上方的用量指示器。
|
|
3
|
-
*
|
|
4
|
-
* 宽列在赠送剩余额度的纯文本行上方显示主池的进度条(可续期额度 —— 自定义配额
|
|
5
|
-
* 上限与危险阈值仅作用于该进度条);赠送行的 tooltip 列出五个最早过期的有效赠送
|
|
6
|
-
* 窗口及其剩余/总量数值。未登录的账号、计量服务故障或空池都不渲染任何内容 ——
|
|
7
|
-
* 该提示纯属附加。窄栏列为主池保留单个圆环,其下是赠送剩余的裸数值。
|
|
8
|
-
*/
|
|
9
|
-
import type { ReactElement } from 'react';
|
|
10
|
-
import type { PropsLocale, PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
11
|
-
import { createCodeBuddyStore } from './store.ts';
|
|
12
|
-
import type { CodeBuddySectionInjected } from './CodeBuddySection.tsx';
|
|
13
|
-
/** 完整组件 props:footer-action 运行时份额 + store + locale + 注入 face。 */
|
|
14
|
-
export type CodeBuddyUsageIndicatorProps = PropsRuntime<'sidebar.footer.action'> & PropsStore<ReturnType<typeof createCodeBuddyStore>> & PropsLocale<'settings.codebuddy'> & CodeBuddySectionInjected;
|
|
15
|
-
/**
|
|
16
|
-
* 两条用量进度条(宽列)或主池圆环(窄栏),仅在存在可用池时渲染。
|
|
17
|
-
* @param props - 组合后的 slot props。
|
|
18
|
-
* @returns 指示器元素;无内容显示时为 null。
|
|
19
|
-
*/
|
|
20
|
-
export declare function UsageIndicator(props: CodeBuddyUsageIndicatorProps): ReactElement | null;
|
|
21
|
-
//# sourceMappingURL=UsageIndicator.d.ts.map
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 参数化的轮询钩子:入参说明「查什么数据」「多久查一次」「这里是否需要它」。
|
|
3
|
-
*
|
|
4
|
-
* 抽成共享钩子而不是各组件自建定时器,是为了让计时器的建立与清理只写一次;节奏仍由
|
|
5
|
-
* 每个消费方按自己那份数据的更新速度给出 —— 两份数据的更新速度不同,不该被迫取同一个值。
|
|
6
|
-
*
|
|
7
|
-
* @module dsh-llm-codebuddy-power/client/poll
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* 启用时立即读取一次数据源,其后每 `intervalMs` 重复;停用时不读取也不计时。
|
|
11
|
-
*
|
|
12
|
-
* `read` 经 ref 持有,因此调用方可以传内联闭包:轮询节奏只由 `intervalMs` 与
|
|
13
|
-
* `active` 决定,不会因为闭包每次渲染都是新身份而反复重建计时器。
|
|
14
|
-
* @param read - 每次轮询要读取的数据。
|
|
15
|
-
* @param intervalMs - 两次读取之间的间隔,单位 ms;由该数据自身的更新速度决定。
|
|
16
|
-
* @param active - 这里是否需要这份数据;为假时不读取也不轮询,由假转真会立即读取一次。
|
|
17
|
-
*/
|
|
18
|
-
export declare function usePolledRead(read: () => void, intervalMs: number, active: boolean): void;
|
|
19
|
-
//# sourceMappingURL=poll.d.ts.map
|