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.
@@ -10,7 +10,8 @@
10
10
  */
11
11
  import { LlmAdapter } from '@deepseek-ai/dsh-llm';
12
12
  import type { GenerateOptions, LlmModelInfo, LlmProviderInfo, LlmResolvedModelInfo, StreamChunk } from '@deepseek-ai/dsh-llm';
13
- import type { AttachmentStore } from '@deepseek-ai/dsh-attachment';
13
+ import type { ImageAttachmentAccess } from '@deepseek-ai/dsh-llm';
14
+ import type { AttachmentStore, ImageAttachmentRef } from '@deepseek-ai/dsh-attachment';
14
15
  import { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_TOKENS } from './constants.ts';
15
16
  import type { CodeBuddySession } from './session.ts';
16
17
  import type { WireError } from './types.ts';
@@ -32,6 +33,11 @@ export interface CodeBuddyAdapterOptions {
32
33
  options: () => CodeBuddyConnectionOptions;
33
34
  /** 解析持久化附件服务;缺失时拒绝图像输入。 */
34
35
  resolveAttachments: () => AttachmentStore | undefined;
36
+ /**
37
+ * 解析单张图在当前执行世界中的只读路径,随读取提示词交给模型供 `read_image` 读取。
38
+ * 未设置时解析不出路径,用户消息里的图退回内联。
39
+ */
40
+ resolveImageAccess?: (attachments: AttachmentStore, ref: ImageAttachmentRef) => ImageAttachmentAccess | undefined;
35
41
  /** 已设置时,解析用户为单个模型设置的上限(上下文窗口 / 最大输出)。 */
36
42
  resolveOverrides?: (modelId: string) => Promise<ModelOverrides | undefined>;
37
43
  }
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * 通过私有 RPC 通道暴露给 Web 客户端的宿主侧 OAuth 服务。
3
3
  *
4
- * 浏览器登录是长时操作(要等待用户完成登录),因此拆成两个 RPC endpoint:
5
- * `startLogin` 生成握手并返回用户必须打开的 URL,`pollLogin` 检查该握手是否已完成;
4
+ * 浏览器登录是长时操作(要等待用户完成登录),因此拆成三个 RPC endpoint:
5
+ * `startLogin` 生成握手并返回用户必须打开的 URL,`pollLogin` 检查该握手是否已完成,
6
+ * `pendingLogin` 报出仍在轮询的握手(浏览器刷新后据此接回);
6
7
  * 一次完成的登录会**追加**一个账号,而不是取代已有的。`accounts`、`activate`、
7
- * `setDefault`、`logout` 是设置页与会话账号按钮其余时间驱动的读写组合。
8
+ * `logout`、`reorder` 是配置页与会话账号按钮其余时间驱动的读写组合。
8
9
  *
9
10
  * @module dsh-llm-codebuddy-power/auth-service
10
11
  */
@@ -18,8 +19,6 @@ export declare const CODEBUDDY_AUTH_CHANNEL = "/codebuddy";
18
19
  export interface CodeBuddyAccountsResult {
19
20
  /** 已存账号,顺序与磁盘一致。 */
20
21
  accounts: CodeBuddyAccountInfo[];
21
- /** 用户显式指定的默认账号;未指定或缺省时缺省。 */
22
- defaultUid?: string;
23
22
  }
24
23
  /** `startLogin` 返回给客户端的结构。 */
25
24
  export interface CodeBuddyLoginStart {
@@ -27,6 +26,15 @@ export interface CodeBuddyLoginStart {
27
26
  authUrl: string;
28
27
  /** 握手 id;客户端会把它回传给 `pollLogin`。 */
29
28
  state: string;
29
+ /** 握手发起时刻(epoch ms);客户端据此计算截止时间。 */
30
+ startedAt: number;
31
+ }
32
+ /** `pendingLogin` 返回给客户端的结构。 */
33
+ export interface CodeBuddyLoginPending {
34
+ /** 仍在轮询的握手 id。 */
35
+ state: string;
36
+ /** 该握手的发起时刻(epoch ms)。 */
37
+ startedAt: number;
30
38
  }
31
39
  /** `pollLogin` 返回给客户端的结构。 */
32
40
  export interface CodeBuddyLoginPoll {
@@ -79,6 +87,13 @@ export interface CodeBuddyTurnCreditResult {
79
87
  credit: number;
80
88
  /** 本轮扣分用过的账号,按首次使用排序;一轮里切换过账号时会有多个。 */
81
89
  accounts: CodeBuddyTurnCreditAccount[];
90
+ /**
91
+ * 本轮的 CodeBuddy 请求 id,完整值。
92
+ *
93
+ * 与 uid 不同,它不在这里截断:客户端要把它整个复制出来,截断就会复制到一个查不到的
94
+ * id。显示几位由呈现层决定,那里才是可以改的取舍。
95
+ */
96
+ requestId?: string;
82
97
  }
83
98
  /** `creditOf` 返回给客户端的一个账号。 */
84
99
  export interface CodeBuddyTurnCreditAccount {
@@ -89,33 +104,58 @@ export interface CodeBuddyTurnCreditAccount {
89
104
  /**
90
105
  * CodeBuddy 认证 RPC 服务。
91
106
  *
92
- * 握手由 `startLogin` 发起,由 `pollLogin` 轮询至完成,其账号由适配器的
93
- * `CodeBuddySession` 在下一个请求中取用 → 因此通过 UI 完成的登录无需重启
94
- * 即可到达运行中的 harness。`logout` 移除指定账号并使会话缓存失效。
107
+ * 握手由 `startLogin` 发起并**脱手**开跑,客户端经 `pollLogin` 反复查问它是否已结算,
108
+ * 其账号由适配器的 `CodeBuddySession` 在下一个请求中取用 → 因此通过 UI 完成的登录
109
+ * 无需重启即可到达运行中的 harness。`logout` 移除指定账号并使会话缓存失效。
95
110
  */
96
111
  export declare class CodeBuddyAuthService {
97
112
  private readonly session?;
98
- /** 按 state id 索引的进行中握手。 */
113
+ /**
114
+ * 按 state id 索引的握手。
115
+ *
116
+ * 同时存放进行中的与**刚结算、尚在保留窗口内**的条目 —— 后者供客户端取回结果,
117
+ * 由 `settle()` 安排回收,因此本表不是"进行中握手"的集合。
118
+ */
99
119
  private readonly pending;
100
120
  constructor(ctx: Context, session?: CodeBuddySession | undefined);
101
121
  /** 把一次 RPC endpoint 调用路由到对应的处理器。 */
102
122
  private dispatch;
103
123
  /**
104
- * 读取已存账号及其默认账号,不要求必须存在。
124
+ * 读取已存账号,不要求必须存在。
105
125
  * @returns 账号集合;未存任何内容时为空列表。
106
126
  */
107
127
  accounts(): Promise<CodeBuddyAccountsResult>;
108
128
  /**
109
129
  * 发起一次浏览器登录握手。
110
- * @returns 用户必须打开的 URL。
130
+ * @returns 用户必须打开的 URL,以及该握手的 id 与发起时刻。
111
131
  */
112
132
  startLogin(): Promise<CodeBuddyLoginStart>;
133
+ /**
134
+ * 仍在进行的握手。
135
+ *
136
+ * 客户端的「登录中」状态只活在浏览器内存里,刷新即丢,而本表里的握手仍在轮询,
137
+ * 浏览器重新挂载后据此接回(否则界面显示可再次登录,而宿主那边已有一次握手在等,
138
+ * 用户点了就会平白多出第二次)。
139
+ *
140
+ * **只报尚未结算的握手**:已结算的条目会在表里多留一会儿供客户端取结果,若把它们
141
+ * 也算作"进行中",刷新后接回的就是一次已经结束(甚至已经失败)的登录,界面会重新
142
+ * 显示「登录中…」并空转到截止时间。
143
+ *
144
+ * 同时存在多次时给出最近发起的那次:客户端的轮询、取消与超时都只针对一个握手,
145
+ * 而最晚发起的那次正是用户此刻在等的那次。
146
+ * @returns 该握手;没有进行中的登录时缺省。
147
+ */
148
+ pendingLogin(): CodeBuddyLoginPending | undefined;
113
149
  /**
114
150
  * 检查已发起的握手是否完成。
151
+ *
152
+ * **立即返回**,不等待后台握手:`runLogin` 可能还要跑满十分钟,若在这里 await 它,
153
+ * 浏览器的一次请求就会在整个登录窗口内停在待处理,占住一条连接不放;而客户端是
154
+ * 按自己的间隔反复来问的,让它每次都立刻拿到"还没好"才是这条 endpoint 的职责。
115
155
  * @param state - 来自 `startLogin` 的握手 id。
116
156
  * @returns 登录是否完成、账号是否已持久化。
117
157
  */
118
- pollLogin(state: string): Promise<CodeBuddyLoginPoll>;
158
+ pollLogin(state: string): CodeBuddyLoginPoll;
119
159
  /**
120
160
  * 某会话此刻生效的账号。
121
161
  * @param sessionId - dsh 会话身份;为空时按未选定处理。
@@ -139,12 +179,6 @@ export declare class CodeBuddyAuthService {
139
179
  * @returns 该握手是否已被放弃(未知 state 同样是 true)。
140
180
  */
141
181
  cancelLogin(state: string): boolean;
142
- /**
143
- * 指定或取消默认账号。
144
- * @param uid - 默认账号 uid;`undefined` 表示取消默认账号。
145
- * @returns 指定时该账号已存、或取消成功时为 true。
146
- */
147
- setDefault(uid: string | undefined): Promise<boolean>;
148
182
  /**
149
183
  * 移除若干账号。
150
184
  * @param uids - 要移除的账号 uid。
@@ -153,7 +187,7 @@ export declare class CodeBuddyAuthService {
153
187
  /**
154
188
  * 按给定顺序重排账号。
155
189
  *
156
- * 顺序即展示顺序,也是没有默认账号、也没有手动切换记录时的兜底账号,因此这里真的
190
+ * 顺序即展示顺序,也是没有手动切换记录时的兜底账号,因此这里真的
157
191
  * 改变"用谁"。重排会让输入区控件组读到的账号集合顺序变化,故同样使会话缓存失效。
158
192
  * @param uids - 目标顺序上的账号 uid。
159
193
  */
@@ -169,16 +203,28 @@ export declare class CodeBuddyAuthService {
169
203
  */
170
204
  usage(sessionId: string): Promise<CodeBuddyUsageResult>;
171
205
  /**
172
- * 把一次握手推进到持久化的账号。
206
+ * 把一次握手推进到持久化的账号,并把结果写回 {@link pending} 里对应条目。
173
207
  *
174
208
  * 复用 `buildAccount`,使落盘结构与 CLI 登录完全一致。
175
- * 任何失败都返回 `undefined`,让客户端的轮询得到 `done: false`,
209
+ * 任何失败都记为"结算为失败",让客户端的轮询得到 `done: false`,
176
210
  * 从而可以从 `startLogin` 重试。
211
+ *
212
+ * 本方法由 `startLogin` **脱手**调用,`pollLogin` 不 await 它;因此它自己不返回
213
+ * 结果,只负责把结果写进条目并安排回收。
177
214
  */
178
215
  private runLogin;
216
+ /**
217
+ * 记录一次握手的结局,并在保留窗口之后回收该条目。
218
+ *
219
+ * 回收之所以要延迟:客户端是按自己的间隔来问结果的,一结算就删会让那次本已成功的
220
+ * 登录再也答不出 `done: true`。取消过的握手已不在表里,这里的写入自然丢弃。
221
+ * @param state - 握手 id。
222
+ * @param account - 已落盘的账号;失败或取消时为 `undefined`。
223
+ */
224
+ private settle;
179
225
  /**
180
226
  * 供客户端面板使用的增强版 CodeBuddy 目录:应用了促销/等级展示信息与覆盖配置的模型。
181
- * @param sessionId - 用哪个会话的账号读目录;为空时用默认账号。
227
+ * @param sessionId - 用哪个会话的账号读目录;为空时按账号级兜底。
182
228
  * @returns 增强结果;会话不可用或该账号没有目录时为空行。
183
229
  */
184
230
  enrichedModels(sessionId: string): Promise<{
@@ -9,8 +9,7 @@
9
9
  *
10
10
  * 用法:
11
11
  * codebuddy-power 登录并追加账号
12
- * codebuddy-power --status 列出全部账号与默认账号
13
- * codebuddy-power --default <账号> 把某个账号设为默认
12
+ * codebuddy-power --status 列出全部账号
14
13
  * codebuddy-power --logout <账号> 退出一个账号
15
14
  * codebuddy-power --logout --all 退出全部账号
16
15
  * codebuddy-power --no-open 只打印 URL,不打开浏览器
@@ -27,10 +27,9 @@ export interface AccountSwitcherInjected {
27
27
  /** 三个界面偏好的当前值,与设置页同源。 */
28
28
  prefs: HostObservable<CodeBuddyPrefs>;
29
29
  };
30
- /** 读取账号集合与默认账号。 */
30
+ /** 读取账号集合。 */
31
31
  fetchAccounts: () => Promise<{
32
32
  accounts: CodeBuddyAccountView[];
33
- defaultUid: string | null;
34
33
  } | null>;
35
34
  /** 读取该会话此刻生效的账号 uid;没有账号时为 null。 */
36
35
  fetchSessionAccount: () => Promise<string | null>;
@@ -2,7 +2,7 @@
2
2
  * CodeBuddy 设置分区:多账号登录页。
3
3
  *
4
4
  * 展示全部已登录账号(每个账号一个徽章),在此发起浏览器登录以**追加**账号、
5
- * 退出单个或选中的多个账号、指定或取消默认账号;下方是两种登录状态下都渲染的
5
+ * 退出单个或选中的多个账号、拖拽排序;下方是两种登录状态下都渲染的
6
6
  * 界面偏好行。退出是破坏性操作(会删除磁盘上的凭据),因此单个与批量都先弹确认框。
7
7
  * 弹窗可见性由 shell 拥有,故此处不需要关闭控件。
8
8
  */
@@ -14,18 +14,23 @@ import type { CodeBuddyPrefs } from '../prefs.ts';
14
14
  * 设置分区与对话内账号控件共享的、经 RPC 支撑的业务面。每个回调都经 store action
15
15
  * 写入;组件自身不接触 wire。
16
16
  *
17
- * 界面偏好走 `hooks` 隔舱:它与对话输入区的控件组是同一份活来源(用户设置文档里
18
- * 的命名空间),写入经 `setPref`。
17
+ * 界面偏好走 `hooks` 隔舱:它与对话输入区的控件组是同一份活来源(本入口的
18
+ * volatile 配置字段),写入经 `setPref`。
19
19
  */
20
20
  export interface CodeBuddySectionInjected {
21
21
  hooks: {
22
22
  /** 三个界面偏好的当前值,与对话输入区的控件组同源。 */
23
23
  prefs: HostObservable<CodeBuddyPrefs>;
24
24
  };
25
- /** 重新读取账号集合与默认账号,并离开加载阶段。 */
25
+ /** 重新读取账号集合,并离开加载阶段。 */
26
26
  refreshAccounts: () => Promise<void>;
27
27
  /** 发起浏览器登录握手(在新标签页打开鉴权 URL);完成后账号被追加到列表。 */
28
28
  startLogin: () => Promise<void>;
29
+ /**
30
+ * 接回宿主仍在轮询的握手。浏览器刷新后本地状态已丢而宿主的握手还在等,
31
+ * 挂载时调用一次即可让「登录中」继续显示并恢复轮询。
32
+ */
33
+ resumeLogin: () => Promise<void>;
29
34
  /**
30
35
  * 发起一次登录握手并把鉴权 URL 复制到剪贴板(不打开浏览器),用于在别的浏览器或
31
36
  * 机器上完成登录。失败时会发布一条页面级错误。
@@ -34,25 +39,25 @@ export interface CodeBuddySectionInjected {
34
39
  copyLoginLink: () => Promise<boolean>;
35
40
  /**
36
41
  * 放弃一次进行中的登录握手,并把界面从“登录中”收回到可再次发起的状态。
37
- * @returns 是否确已放弃;未知或已完成的握手同样返回 true(取消是幂等的)。
42
+ *
43
+ * 调用方不必等它的结果:取消对界面是即刻生效的,而宿主侧的中止即使慢或失败,
44
+ * 该握手也会在宿主自己的截止时间被回收。
38
45
  */
39
- cancelLogin: (state: string) => Promise<boolean>;
46
+ cancelLogin: (state: string, signal?: AbortSignal) => Promise<void>;
40
47
  /** 按 state id 轮询一次握手;账号持久化后解析为 true。 */
41
- pollLogin: (state: string) => Promise<boolean>;
48
+ pollLogin: (state: string, signal?: AbortSignal) => Promise<boolean>;
42
49
  /** 退出若干账号。 */
43
50
  logoutAccounts: (uids: string[]) => Promise<void>;
44
51
  /**
45
- * 按给定顺序重排账号。顺序即展示顺序,并决定没有默认账号时用谁。
52
+ * 按给定顺序重排账号。顺序即展示顺序,并决定没有手动切换记录时用谁。
46
53
  * @param uids - 目标顺序上的全部账号 uid。
47
54
  */
48
55
  reorderAccounts: (uids: string[]) => Promise<void>;
49
- /** 指定默认账号;`null` 表示取消默认账号。 */
50
- setDefault: (uid: string | null) => Promise<void>;
51
- /** 写入一个界面偏好字段;该写入持久化到用户设置文档。 */
56
+ /** 写入一个界面偏好字段;该写入持久化到本入口的 profile patch。 */
52
57
  setPref: (field: keyof CodeBuddyPrefs, value: boolean | number) => void;
53
58
  }
54
59
  /** 完整组件 props:runtime 份额 + store 份额 + locale seat + inject face。 */
55
- export type CodeBuddySectionProps = PropsRuntime<'settings.section'> & PropsStore<ReturnType<typeof createCodeBuddyStore>> & PropsLocale<'settings.codebuddy'> & InjectFace<CodeBuddySectionInjected>;
60
+ export type CodeBuddySectionProps = PropsRuntime<'plugins.bundle.config'> & PropsStore<ReturnType<typeof createCodeBuddyStore>> & PropsLocale<'settings.codebuddy'> & InjectFace<CodeBuddySectionInjected>;
56
61
  /**
57
62
  * CodeBuddy 设置分区。
58
63
  * @param props - 组合后的 slot props。
@@ -7,9 +7,10 @@
7
7
  * 则渲染,无记录(非 CodeBuddy 轮)渲染为空。与官方 `TurnUsagePanel` 同构:
8
8
  * 图标 + 文字标签,点击无详情面板(仅展示一条合计)。
9
9
  *
10
- * 悬停提示附上本轮用过的账号:账号在扣分那一刻随记录写入(见 host 的
11
- * `recordCredit`),不是悬停时现查 —— 一轮里用户可以切换账号,现查会把整轮
12
- * 说成最后那个账号。
10
+ * 悬停提示附上本轮用过的账号与本轮请求 id:两者都在扣分那一刻随记录写入(见 host 的
11
+ * `recordCredit`),不是悬停时现查 —— 一轮里用户可以切换账号,而请求 id 每轮重铸,
12
+ * 现查会把整轮说成最后那个账号、或报出当前轮的 id。有 id 时点击 pill 复制它的完整值,
13
+ * 因为显示在提示里的那个值就是用户要拿去对账的东西。
13
14
  *
14
15
  * @module dsh-llm-codebuddy-power/client/TurnCreditPill
15
16
  */
@@ -27,7 +28,7 @@ export type TurnCreditPillProps = Pick<AssistantActionOwnerProps, 'messageId'> &
27
28
  /**
28
29
  * 每轮积分 pill。messageId 反查轮号后查该轮记录;无记录渲染为空(未用
29
30
  * CodeBuddy 模型即一轮 0 分也渲染,有记录即证明用了 CodeBuddy)。只显示
30
- * 积分,模型由 dsh 用量自带;悬停给出本轮用过的账号。
31
+ * 积分,模型由 dsh 用量自带;悬停给出本轮用过的账号与本轮请求 id。
31
32
  */
32
33
  export declare function TurnCreditPill(props: TurnCreditPillProps): ReactElement | null;
33
34
  //# sourceMappingURL=TurnCreditPill.d.ts.map
@@ -1,13 +1,13 @@
1
1
  /**
2
- * Web 客户端部分:一个 CodeBuddy 设置页,以及对话框输入区的账号控件。
2
+ * Web 客户端部分:一个 CodeBuddy 配置页(挂在侧边栏插件面板上),以及对话框输入区的账号控件。
3
3
  *
4
- * 在 `settings.section` 中注册一个条目 —— 一个展示全部已登录账号、追加登录、
5
- * 退出单个或选中账号、指定默认账号的 “CodeBuddy” 页面 —— 再在
6
- * `conversation.input.right` 中注册一个条目,在 CodeBuddy 模型按钮左侧渲染当前
4
+ * 在 `plugins.bundle.config` 中注册一个条目 —— 一个展示全部已登录账号、追加登录、
5
+ * 退出单个或选中账号的页面,按本包名派发到插件页本插件自己的卡片上 ——
6
+ * 再在 `conversation.input.right` 中注册一个条目,在 CodeBuddy 模型按钮左侧渲染当前
7
7
  * 会话的额度圆环与账号切换按钮。
8
8
  *
9
- * 两个条目处在**不同作用域**(设置页 root、输入区 session),而一个 store handle
10
- * 只能绑一个作用域,因此它们不共用句柄:设置页持有 store,对话控件按会话经 RPC
9
+ * 两个条目处在**不同作用域**(配置页 root、输入区 session),而一个 store handle
10
+ * 只能绑一个作用域,因此它们不共用句柄:配置页持有 store,对话控件按会话经 RPC
11
11
  * 自取账号集合与用量(见该处的注册注释)。
12
12
  *
13
13
  * @module dsh-llm-codebuddy-power/client
@@ -23,9 +23,6 @@ export declare const en: {
23
23
  logoutSelectedDesc: string;
24
24
  logoutConfirm: string;
25
25
  cancel: string;
26
- chooseDefault: string;
27
- clearDefault: string;
28
- defaultTag: string;
29
26
  nickname: string;
30
27
  uid: string;
31
28
  loginExpires: string;
@@ -55,6 +52,11 @@ export declare const en: {
55
52
  turnCredit: string;
56
53
  turnCreditTip: string;
57
54
  turnCreditAccount: string;
55
+ turnCreditRequestId: string;
56
+ turnCreditCopy: string;
57
+ turnCreditCopyTip: string;
58
+ turnCreditCopied: string;
59
+ turnCreditCopiedTip: string;
58
60
  modelPanelTrigger: string;
59
61
  modelPanelTitle: string;
60
62
  modelPanelEmpty: string;
@@ -79,7 +81,7 @@ export declare const en: {
79
81
  export type CodeBuddyKey = keyof typeof en;
80
82
  declare module '@deepseek-ai/dsh-client-ui-slots' {
81
83
  interface LocaleNamespaceMap {
82
- /** CodeBuddy 设置页与对话内账号控件的文案。 */
84
+ /** CodeBuddy 配置页与对话内账号控件的文案。 */
83
85
  'settings.codebuddy': CodeBuddyKey;
84
86
  }
85
87
  }
@@ -1,14 +1,13 @@
1
1
  /**
2
- * CodeBuddy 页面 store:设置分区共享的账号快照。
2
+ * CodeBuddy 页面 store:配置页共享的账号快照。
3
3
  *
4
- * 客户端插件在设置页条目下挂载本句柄,因此在设置分区里完成的登录、退出或改
5
- * 默认账号无需跨组件接线即可到达同一页面的各个徽章。
4
+ * 客户端插件在配置页条目下挂载本句柄,因此在该页完成的登录、退出或排序
5
+ * 无需跨组件接线即可到达同一页面的各个徽章。
6
6
  *
7
- * **界面偏好不在这里**:它们是 harness 用户设置文档里的一段(见 `../prefs.ts`),
8
- * 由 `./index.ts` 经 `ctx.settingsScope.bind()` 读取,并以一个派生的活快照经
9
- * 注入面的 `hooks` 隔舱同时下发给设置页与对话输入区的控件组 —— 后者处在另一个
10
- * 作用域,共享不了本句柄。偏好此前存在 `localStorage` 并由输入区按 5 秒轮询
11
- * 读取,导致开关与圆环之间有最多一个轮询周期的延迟。
7
+ * **界面偏好不在这里**:它们是插件自己的 volatile 配置字段(见 `../prefs.ts`),
8
+ * 由 `./index.ts` 经 `ctx.configForms.get()` 读取,并以一个派生的活快照经
9
+ * 注入面的 `hooks` 隔舱同时下发给配置页与对话输入区的控件组 —— 后者处在另一个
10
+ * 作用域,共享不了本句柄。
12
11
  *
13
12
  * @module dsh-llm-codebuddy-power/client/store
14
13
  */
@@ -22,7 +21,7 @@ export interface PendingLogin {
22
21
  state: string;
23
22
  /**
24
23
  * 发起时刻(epoch ms)。截止时间据此计算并存进 store —— 放在组件的 effect 里会让
25
- * 每次重新挂载(关闭再打开设置页)都把计时归零,于是反复开关就能把"登录中…"
24
+ * 每次重新挂载(关闭再打开配置页)都把计时归零,于是反复开关就能把"登录中…"
26
25
  * 无限延长。
27
26
  */
28
27
  startedAt: number;
@@ -34,8 +33,6 @@ export interface CodeBuddyState {
34
33
  error: string | null;
35
34
  /** 已存账号;加载中或未登录时为空数组。 */
36
35
  accounts: CodeBuddyAccountView[];
37
- /** 用户显式指定的默认账号 uid;未指定时为 null。 */
38
- defaultUid: string | null;
39
36
  /** 正在轮询浏览器登录握手时非 null。 */
40
37
  loginState: PendingLogin | null;
41
38
  }
@@ -43,16 +40,25 @@ export interface CodeBuddyState {
43
40
  type CodeBuddyActions = {
44
41
  /** 进入加载阶段并丢弃先前的状态/错误。 */
45
42
  start: (draft: CodeBuddyState) => void;
46
- /** 发布账号集合与默认账号,并离开加载阶段。 */
43
+ /** 发布账号集合,并离开加载阶段。 */
47
44
  setAccounts: (draft: CodeBuddyState, result: CodeBuddyAccountsResult) => void;
48
45
  /** 发布页面级失败。 */
49
46
  fail: (draft: CodeBuddyState, message: string) => void;
47
+ /** 丢弃页面级失败,回到可再次发起的阶段。 */
48
+ clearError: (draft: CodeBuddyState) => void;
50
49
  /** 跟踪进行中的浏览器登录握手(null 表示没有)。 */
51
50
  setLoginState: (draft: CodeBuddyState, state: PendingLogin | null) => void;
51
+ /**
52
+ * 采纳宿主报出的握手(仅当本地此刻没有握手时)。
53
+ *
54
+ * 判据放在 action 里而不是调用方:采纳是异步读了一次 RPC 之后才发生的,
55
+ * 期间用户可能刚点了登录;无条件写入会把那次新握手的发起时刻换成宿主的旧时刻。
56
+ */
57
+ adoptLogin: (draft: CodeBuddyState, state: PendingLogin) => void;
52
58
  };
53
59
  /**
54
60
  * 声明 CodeBuddy 页面状态与写入接口。
55
- * @returns store 句柄(在 apply 中挂载于设置页条目下)。
61
+ * @returns store 句柄(在 apply 中挂载于配置页条目下)。
56
62
  */
57
63
  export declare function createCodeBuddyStore(): EngineStoreHandle<CodeBuddyState, CodeBuddyActions>;
58
64
  export {};
@@ -29,13 +29,23 @@ export interface CodeBuddyAccountView {
29
29
  /** host `accounts` endpoint 返回的结构。 */
30
30
  export interface CodeBuddyAccountsResult {
31
31
  accounts: CodeBuddyAccountView[];
32
- /** 用户显式指定的默认账号;未指定时缺省。 */
33
- defaultUid?: string;
34
32
  }
35
33
  /** `startLogin` 的结果结构。 */
36
34
  export interface CodeBuddyLoginStart {
37
35
  authUrl: string;
38
36
  state: string;
37
+ /**
38
+ * 握手发起时刻(epoch ms)。按"可能缺失"声明,与 {@link CodeBuddyAccountView} 同理:
39
+ * 旧宿主不返回该字段,客户端据本机当前时刻兜底。
40
+ */
41
+ startedAt?: number;
42
+ }
43
+ /** `pendingLogin` 的结果结构;没有进行中的登录时缺省。 */
44
+ export interface CodeBuddyLoginPending {
45
+ /** 仍在轮询的握手 id。 */
46
+ state: string;
47
+ /** 该握手的发起时刻(epoch ms)。 */
48
+ startedAt: number;
39
49
  }
40
50
  /** `pollLogin` 的结果结构。 */
41
51
  export interface CodeBuddyLoginPoll {
@@ -138,10 +148,17 @@ export interface CodeBuddyTurnCreditRecord {
138
148
  credit: number;
139
149
  /** 本轮扣分用过的账号,按首次使用排序;一轮里切换过账号时会有多个。 */
140
150
  accounts: CodeBuddyTurnCreditAccountView[];
151
+ /** 本轮的 CodeBuddy 请求 id(完整值);记录写于该字段存在之前时为缺省。 */
152
+ requestId?: string;
141
153
  }
142
154
  /**
143
155
  * 在共享通道上调用一个鉴权 endpoint。该通道调用按设计不做类型约束;
144
156
  * endpoint 所记录的 payload 结构在此唯一的 wire 边界处恢复。
157
+ * @param rpc - 当前连接的 RPC 调用器。
158
+ * @param endpoint - 通道下的 endpoint 名。
159
+ * @param payload - endpoint 自己的请求载荷。
160
+ * @param signal - 可选取消;中止后该请求的连接随即释放,而不是等宿主应答。
161
+ * @returns endpoint 自己声明的结果。
145
162
  */
146
- export declare function authCall<T>(rpc: ClientConnectionRpc, endpoint: string, payload?: unknown): Promise<ConnectionRpcResult<T>>;
163
+ export declare function authCall<T>(rpc: ClientConnectionRpc, endpoint: string, payload?: unknown, signal?: AbortSignal): Promise<ConnectionRpcResult<T>>;
147
164
  //# sourceMappingURL=wire.d.ts.map
@@ -62,6 +62,21 @@ export declare const REQUEST_IMAGE_DIMENSION_LADDER: readonly [1920, 1440, 1080]
62
62
  export declare const LOGIN_TIMEOUT_MS: number;
63
63
  /** 等待浏览器登录完成时的轮询间隔,单位 ms。 */
64
64
  export declare const LOGIN_POLL_INTERVAL_MS = 1000;
65
+ /**
66
+ * 握手结算后在宿主表里保留结果的时长,单位 ms。
67
+ *
68
+ * 逾期即回收,但**客户端是过一会儿才来问的**(它按自己的间隔轮询),所以结果不能
69
+ * 一结算就丢:一丢,那次本已成功的登录就再也答不出 `done: true`,客户端只能干等到
70
+ * 十分钟截止。保留窗口只需覆盖一个客户端轮询周期,取一个宽裕值。
71
+ */
72
+ export declare const LOGIN_RESULT_RETENTION_MS: number;
65
73
  /** 含义为“浏览器登录尚未完成”的服务码。 */
66
74
  export declare const AUTH_PENDING_CODE = 11217;
75
+ /**
76
+ * 一次性赠送活动所用的子产品编码。
77
+ *
78
+ * "裂变包"与"拉新权益包"两类赠送活动各有自己的 `PackageCode`,却共用这一个子产品
79
+ * 编码,而可续期主套餐用的是另一个,因此它是区分赠送与主体的稳定依据。
80
+ */
81
+ export declare const CODEBUDDY_GIFT_SUB_PRODUCT_CODE = "sp_tcaca_codebuddyide_bonus_pack";
67
82
  //# sourceMappingURL=constants.d.ts.map
@@ -11,17 +11,18 @@
11
11
  * @module dsh-llm-codebuddy-power
12
12
  */
13
13
  import type { Context } from '@deepseek-ai/cordis';
14
+ import z from '@deepseek-ai/schemastery';
14
15
  import type { CodeBuddyConnectionOptions } from './adapter.ts';
15
16
  import type { CodeBuddyPrefs, CodeBuddyPrefsConfig } from './prefs.ts';
16
17
  export { CodeBuddyAdapter, httpErrorCode } from './adapter.ts';
17
18
  export type { CodeBuddyAdapterOptions, CodeBuddyConnectionOptions } from './adapter.ts';
18
19
  export { CodeBuddyAuthService, CODEBUDDY_AUTH_CHANNEL } from './auth-service.ts';
19
- export type { CodeBuddyAccountsResult, CodeBuddyLoginStart, CodeBuddyLoginPoll, CodeBuddySessionAccount, CodeBuddyUsageResult, CodeBuddyUsageWindow, } from './auth-service.ts';
20
+ export type { CodeBuddyAccountsResult, CodeBuddyLoginPending, CodeBuddyLoginStart, CodeBuddyLoginPoll, CodeBuddySessionAccount, CodeBuddyUsageResult, CodeBuddyUsageWindow, } from './auth-service.ts';
20
21
  export { CodeBuddySession, NotLoggedInError } from './session.ts';
21
22
  export type { CodeBuddyAccountInfo, TurnCreditAccount, TurnCreditAccountView, TurnCreditRecord, TurnCreditRecordView, } from './session.ts';
22
23
  export { login } from './login.ts';
23
24
  export type { LoginHooks, LoginResult } from './login.ts';
24
- export { getStoragePath, loadStorage, removeAccounts, setDefaultAccount, setLastAccount, updateStorage, upsertAccount, } from './storage.ts';
25
+ export { getStoragePath, loadStorage, removeAccounts, setLastAccount, updateStorage, upsertAccount, } from './storage.ts';
25
26
  export type { CodeBuddyStorage, CodeBuddyStoredAccount } from './storage.ts';
26
27
  export { loadSessionInfo, updateSessionInfo } from './session-store.ts';
27
28
  export type { SessionAccountRef, SessionInfo } from './session-store.ts';
@@ -34,17 +35,18 @@ export type * from './types.ts';
34
35
  export declare const name = "llm-codebuddy-power";
35
36
  /**
36
37
  * 本插件的激活服务。`llm` 承载适配器路由,`tools` 接受文生图工具注册,
37
- * `agents` 用于极简模式会话中按 agent 限制画图工具可见性。生成图片经
38
- * 标准附件通道(attachments.saveImage + uiConversation.imageUrl)持久化与
39
- * 展示,工具注册在附件服务挂载后(`ctx.inject(['attachments'])`)。
38
+ * `agents` 用于极简模式会话中按 agent 限制画图工具可见性。生成图片经标准附件通道
39
+ * (attachments.saveImage + uiConversation.imageUrl)持久化与展示,工具注册在
40
+ * 附件服务挂载后(`ctx.inject(['attachments'])`)。
40
41
  */
41
42
  export declare const inject: string[];
42
43
  /**
43
- * 插件配置。每个字段都是可选的:内置默认值直达公开的 CodeBuddy 服务,且按
44
- * 设计完全没有凭据字段 → 唯一的进入方式是浏览器登录。
44
+ * 插件配置。连接字段都可选:内置默认值直达公开的 CodeBuddy 服务,且按设计完全
45
+ * 没有凭据字段 → 唯一的进入方式是浏览器登录。
45
46
  *
46
- * 界面偏好字段(`CodeBuddyPrefsConfig`)是设置命名空间的 base 层:用户在 Web
47
- * 设置页的写入存在 harness 的用户设置文档里并覆盖它们。
47
+ * 界面偏好字段(`CodeBuddyPrefsConfig`)是 volatile 的:设置表单只能读写 volatile
48
+ * 字段,写入落回本入口的 profile patch,而 volatile 引用原地更新,因此宿主每次
49
+ * 读取都拿到当前值、无需重挂插件。
48
50
  */
49
51
  export interface Config extends CodeBuddyPrefsConfig {
50
52
  /** Chat 端点基址;默认为 CodeBuddy 的 OpenAI 兼容路由。 */
@@ -57,23 +59,43 @@ export interface Config extends CodeBuddyPrefsConfig {
57
59
  streamIdleTimeoutMs?: number;
58
60
  }
59
61
  /**
60
- * 校验并补全原始配置。
62
+ * {@link Config} 的运行时 schema。
61
63
  *
62
- * 编程式构造可以绕过任何 schema,因此边界在此判定,坏值在加载时就带字段名
63
- * 失败,而不是等到请求中途。
64
- * @param config - 原始入口配置。
65
- * @returns 解析出的连接事实。
64
+ * 三个界面偏好字段必须是 volatile 才会被设置表单投影,而 volatile 只从
65
+ * schemastery schema 产生;连接字段保持普通字段,因此不在表单里暴露 ——
66
+ * 它们由 profile 的 cordis.patch.yml 配置。
66
67
  */
67
- export declare function resolveConnectionOptions(config?: Config): CodeBuddyConnectionOptions;
68
+ export declare const Config: z<Schemastery.ObjectS<NoInfer<{
69
+ baseURL: z<string, string, "plain">;
70
+ defaultContextWindow: z<number, number, "plain">;
71
+ defaultMaxTokens: z<number, number, "plain">;
72
+ streamIdleTimeoutMs: z<number, number, "plain">;
73
+ showUsage: z<boolean, boolean, "volatile-defined">;
74
+ dangerPct: z<number, number, "volatile-defined">;
75
+ drawToolInMinimal: z<boolean, boolean, "volatile-defined">;
76
+ }>>, Schemastery.ObjectT<NoInfer<{
77
+ baseURL: z<string, string, "plain">;
78
+ defaultContextWindow: z<number, number, "plain">;
79
+ defaultMaxTokens: z<number, number, "plain">;
80
+ streamIdleTimeoutMs: z<number, number, "plain">;
81
+ showUsage: z<boolean, boolean, "volatile-defined">;
82
+ dangerPct: z<number, number, "volatile-defined">;
83
+ drawToolInMinimal: z<boolean, boolean, "volatile-defined">;
84
+ }>>, "plain">;
68
85
  /**
69
- * 解析界面偏好的部署级 base 层。用户设置文档中的写入覆盖它。
86
+ * 从配置解析连接事实。
70
87
  *
71
- * 与 {@link resolveConnectionOptions} 同理,编程式构造可以绕过任何 schema,
72
- * 因此坏值在此判定并在加载时失败。
73
- * @param config - 原始入口配置。
74
- * @returns 设置命名空间的 base 值。
88
+ * 连接字段在 `Config` 里都是可选的,缺省值即公开的 CodeBuddy 服务。
89
+ * @param config - 入口配置。
90
+ * @returns 解析出的连接事实。
91
+ */
92
+ export declare function resolveConnectionOptions(config: Config): CodeBuddyConnectionOptions;
93
+ /**
94
+ * 读取界面偏好的当前值。
95
+ * @param config - 入口配置。
96
+ * @returns 三个界面偏好。
75
97
  */
76
- export declare function resolvePrefsBase(config?: Config): CodeBuddyPrefs;
98
+ export declare function resolvePrefs(config: Config): CodeBuddyPrefs;
77
99
  /** 挂载插件:解析配置,然后注册路由。 */
78
- export declare function apply(ctx: Context, config?: Config): void;
100
+ export declare function apply(ctx: Context, config: Config): void;
79
101
  //# sourceMappingURL=index.d.ts.map