@webskill/chatbot 0.2.0 → 0.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/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AgentLoopConfig, ApprovalScope, BridgeCapabilities, ExternalSkillProvider, ExternalToolSource, FileSystemProvider, HookRunner, InteractionRequest, InteractionResponse, LifecycleEventInit, LlmClient, NetworkPolicy, Page, PageQuery, RenderBlock, RenderResultRequest, RunSnapshot, RunSnapshotListEntry, ScriptExecutor, SessionStore, SkillCatalogEntry, SkillIntegrityGuard, SkillOutcomeReporter, SkillStateGuard, UiBridge, UiSpecDrafts, UiSpecEvent, UiSpecSnapshot, UiSurfaceActionRequest, UiSurfaceActionResponse } from "@webskill/sdk";
1
+ import { AgentLoopConfig, ApprovalScope, BridgeCapabilities, ExternalSkillProvider, ExternalToolSource, FileSystemProvider, HookRunner, InteractionRequest, InteractionResponse, LifecycleEventInit, LlmClient, NetworkPolicy, Page, PageQuery, RenderBlock, RenderResultRequest, RunSnapshot, RunSnapshotListEntry, RuntimePhase, ScriptExecutor, SessionStore, SkillCatalogEntry, SkillIntegrityGuard, SkillOutcomeReporter, SkillStateGuard, UiBridge, UiSpecDrafts, UiSpecEvent, UiSpecSnapshot, UiSurfaceActionRequest, UiSurfaceActionResponse, UserProfile, UserProfileEntry, UserProfileExport, WebSkillErrorCode, diffUserProfile } from "@webskill/sdk";
2
2
  import { SandboxMode, TypeScriptSupportOptions } from "@webskill/sdk/browser";
3
3
  import { CustomSurfaceActionEvent, ReactBridgeState, SpecInteractionChannel, SurfaceRegistry, UiSurfaceActionEvent } from "@webskill/sdk/ui-react";
4
4
  import { PagePerceptionPolicy, PerceptionRecord, SkillCandidateSink, TodoItem } from "@webskill/sdk/agent";
@@ -103,6 +103,18 @@ interface RuntimeRemoteUrlConfig {
103
103
  }
104
104
  /** `chrome-builtin` 走浏览器 Prompt API,无端点与密钥;其余三档是云端 HTTP 协议 */
105
105
  type RuntimeLlmProvider = 'openai-compatible' | 'anthropic' | 'google' | 'chrome-builtin';
106
+ /**
107
+ * 单个模型的能力声明(FR-11.4 / FR-14.2)。`image` 缺省视为 `false`:
108
+ * 猜测支持会把图片发给纯文本模型,拿到的是 provider 的不可读报错。
109
+ * `tools` 反过来,缺省视为 `true`:云端模型几乎都支持,默认关会把存量配置里
110
+ * 没标能力的条目全部降级成纯对话。
111
+ * @experimental
112
+ */
113
+ interface RuntimeLlmCapabilities {
114
+ image: boolean;
115
+ /** 是否支持原生工具调用;false 时 Agent 走纯对话路径 */
116
+ tools: boolean;
117
+ }
106
118
  /**
107
119
  * 单个模型条目。`id` 稳定,会话记录与消息归属存的是它,用户改名不影响历史;
108
120
  * `label` 只用于展示——同一个 `model` 可能配了两个不同的 `baseUrl`(公司代理与直连),
@@ -116,6 +128,7 @@ interface RuntimeLlmEntry {
116
128
  apiKey?: string;
117
129
  model: string;
118
130
  requestTimeoutMs?: number;
131
+ capabilities?: RuntimeLlmCapabilities;
119
132
  }
120
133
  /** 模型列表 + 默认项。`defaultId` 由 `mergeRuntimeConfigDefaults` 归一到真实存在的条目 */
121
134
  interface RuntimeLlmSelection {
@@ -129,8 +142,6 @@ interface RuntimeLlmSelection {
129
142
  * `skillGeneration`:技能自动生成,默认**关闭**——会把对话内容写进持久化的候选,
130
143
  * 属于新增攻击面(AC-G7 判据一)。
131
144
  * `generativeUi`:生成式 UI,默认**关闭**——catalog 描述约 14 KB 计入每次请求。
132
- * `formAutofill`:跨会话表单自动填充,默认**关闭**(FR-5.10)——会把用户亲手填的内容
133
- * (可能是手机号、地址)跨会话持久化,属新增攻击面。
134
145
  * `uiPresets`:开放给模型的场景预设,默认全开——预设本体按需加载,
135
146
  * 只有名字与一行摘要计入请求;置空列表等于完全关闭预设。
136
147
  */
@@ -138,7 +149,6 @@ interface RuntimeAgentCapabilitiesConfig {
138
149
  todo: boolean;
139
150
  skillGeneration: boolean;
140
151
  generativeUi: boolean;
141
- formAutofill: boolean;
142
152
  /** 串行委派(FR-11.8):默认关。一句话可能展开成多个子 run,调用量对用户不可预期 */
143
153
  delegation: boolean;
144
154
  uiPresets: string[];
@@ -152,6 +162,51 @@ type UnsignedSkillPolicy = 'allow' | 'warn' | 'deny';
152
162
  interface RuntimeSecurityConfig {
153
163
  unsignedSkills: UnsignedSkillPolicy;
154
164
  }
165
+ /** 生成式 UI 的渲染器档位。ui-kit 不依赖 `@webskill/ui`,因此这里写字面量联合 @experimental */
166
+ type RuntimeRendererId = 'native' | 'a2ui' | 'openui' | 'vercel';
167
+ /**
168
+ * 外观配置(0.6.0 FR-20.1)。0.5.x 之前外观由宿主自持并单独存一份,
169
+ * 导致 chatbot 与 console 各看各的;纳入 `RuntimeConfig` 后两端共用同一份。
170
+ * `dictationLang` 只对 chatbot 有意义(console 无语音输入),但同属外观段。
171
+ * @experimental
172
+ */
173
+ interface RuntimeAppearanceConfig {
174
+ theme: 'light' | 'dark';
175
+ locale: Locale;
176
+ renderer: RuntimeRendererId;
177
+ dictationLang: string;
178
+ }
179
+ /**
180
+ * 多模态输入配置(0.6.0 FR-11.3 / FR-11.6 / FR-12.3)。
181
+ * `imageAttachments` 与 `pageImageCapture` 默认都关(AC-G5):
182
+ * 两者都会把图像随请求外发给模型提供方,属新增攻击面。
183
+ * @experimental
184
+ */
185
+ interface RuntimeMultimodalConfig {
186
+ imageAttachments: boolean;
187
+ /** 页面图像抓取总开关(FR-12.3);关时感知只走纯文本路径 */
188
+ pageImageCapture: boolean;
189
+ /** 附件与取像共用 */
190
+ maxImageBytes: number;
191
+ /** 附件与取像共用 */
192
+ maxImagesPerMessage: number;
193
+ }
194
+ /**
195
+ * 用户画像配置(0.6.0 FR-19.6)。`enabled` 默认**关**(AC-G5):
196
+ * 开启后会把用户的提问与填写持久化到本地,属新增攻击面;
197
+ * `encrypted` 默认**开**——它不新增采集,只决定已采集的数据怎么落盘,默认明文无正当理由。
198
+ * chatbot 与 console 共用这一份。
199
+ * @experimental
200
+ */
201
+ interface RuntimeUserProfileConfig {
202
+ enabled: boolean;
203
+ /** 画像注入系统提示的字节上限(FR-19.4) */
204
+ injectMaxBytes: number;
205
+ /** 行为记录容量上限,超出淘汰最旧(FR-19.2) */
206
+ recordLimit: number;
207
+ /** 本地存储加密(FR-19.5) */
208
+ encrypted: boolean;
209
+ }
155
210
  /** @experimental */
156
211
  interface RuntimeConfig {
157
212
  loop: RuntimeLoopConfig;
@@ -166,6 +221,11 @@ interface RuntimeConfig {
166
221
  llm: RuntimeLlmSelection;
167
222
  agentCapabilities: RuntimeAgentCapabilitiesConfig;
168
223
  security: RuntimeSecurityConfig;
224
+ appearance: RuntimeAppearanceConfig;
225
+ multimodal: RuntimeMultimodalConfig;
226
+ userProfile: RuntimeUserProfileConfig;
227
+ /** 被用户删掉的自动模型条目 id(FR-14.3):删一次就不该再自己长回来 */
228
+ dismissedAutoEntries: readonly string[];
169
229
  }
170
230
  /** @experimental */
171
231
  interface RuntimeConfigStore {
@@ -178,44 +238,41 @@ interface RuntimeConfigStore {
178
238
  load(): Promise<RuntimeConfig>;
179
239
  save(config: RuntimeConfig): Promise<void>;
180
240
  reset(): Promise<void>;
241
+ /**
242
+ * Subscribes to configuration changes; returns an unsubscribe function.
243
+ * Optional: stores without it degrade to the previous behaviour where hosts
244
+ * remount consumers after a save.
245
+ */
246
+ subscribe?(listener: () => void): () => void;
181
247
  }
182
248
  //#endregion
183
- //#region ../ui-kit/src/runtime-config/preferences.d.ts
184
- /** 导出结构的版本;导入时逐字校验,不做向前兼容猜测 */
185
- declare const PREFERENCE_EXPORT_VERSION = 1;
249
+ //#region ../ui-kit/src/runtime-config/stores.d.ts
186
250
  /**
187
- * 模型条目的可导出形态。`Omit<RuntimeLlmEntry, 'apiKey'>` 让**编译期**就放不进密钥——
188
- * 靠「序列化时记得删」依赖开发者不忘记,靠类型则依赖编译器(FR-5.2)。
189
- * @experimental
251
+ * `RuntimeConfigStore` 的两个实现(0.6.0 FR-20.1)。0.5.x 之前 SDK 只有接口没有实现,
252
+ * 每个宿主自己写一份 localStorage 读写,「chatbot 与 console 读同一份配置」靠宿主恰好传了
253
+ * 同一个对象,不是 SDK 保证。
190
254
  */
191
- type PreferenceLlmEntry = Omit<RuntimeLlmEntry, 'apiKey'>;
192
- /** 宿主自己持有的外观状态(不在 `RuntimeConfig` 里,由调用方传入) @experimental */
193
- interface PreferenceAppearance {
194
- theme?: string;
195
- locale?: string;
196
- renderer?: string;
197
- }
255
+ /** 默认存储键;外观也在这份配置里,宿主不应再开第二个键存主题 @experimental */
256
+ declare const DEFAULT_RUNTIME_CONFIG_STORAGE_KEY = "webskill.runtime-config";
198
257
  /** @experimental */
199
- interface PreferenceExport {
200
- version: typeof PREFERENCE_EXPORT_VERSION;
201
- exportedAt: string;
202
- preferences: {
203
- appearance?: PreferenceAppearance;
204
- interaction?: {
205
- missingParams?: string;
206
- confirmations?: string;
207
- };
208
- models?: readonly PreferenceLlmEntry[];
209
- agentCapabilities?: {
210
- todo?: boolean;
211
- skillGeneration?: boolean;
212
- generativeUi?: boolean;
213
- formAutofill?: boolean;
214
- delegation?: boolean;
215
- uiPresets?: string[];
216
- };
217
- };
258
+ interface LocalStorageRuntimeConfigStoreOptions {
259
+ key?: string;
260
+ /** 注入存储实现,便于测试与非 window 环境;缺省取 `globalThis.localStorage` */
261
+ storage?: Storage;
218
262
  }
263
+ /**
264
+ * localStorage 实现。跨标签页同步经 `storage` 事件——该事件只在**其他**标签页写入时触发,
265
+ * 因此本标签页 `save()` 后需要自行通知订阅者。
266
+ * 存储不可用(SSR、隐私模式、配额满)时退化为内存,不抛错:配置读写失败不该让宿主白屏。
267
+ * @experimental
268
+ */
269
+ declare function createLocalStorageRuntimeConfigStore(options?: LocalStorageRuntimeConfigStoreOptions): RuntimeConfigStore;
270
+ /** 内存实现:测试、SSR、以及宿主明确不想持久化时使用。 @experimental */
271
+ declare function createMemoryRuntimeConfigStore(initial?: Partial<RuntimeConfig>): RuntimeConfigStore;
272
+ //#endregion
273
+ //#region src/core/attachmentKind.d.ts
274
+ /** 附件在模型侧的内容形态(0.6.0 FR-11.2) @experimental */
275
+ type ChatAttachmentKind = 'text' | 'image' | 'file';
219
276
  //#endregion
220
277
  //#region src/core/types.d.ts
221
278
  /**
@@ -277,11 +334,32 @@ interface ChatAttachmentInput {
277
334
  /** 相对 `attachmentsRoot` 的路径 */
278
335
  path: string;
279
336
  size: number;
337
+ /** 注入模型的内容形态;决定 send 时读文本还是读二进制 */
338
+ kind: ChatAttachmentKind;
339
+ /** 图片经压缩时的原始字节数,供 UI 显示「3.2 MB → 1.8 MB」(FR-11.3) */
340
+ originalSize?: number;
280
341
  }
281
342
  /** 随消息持久化的附件元数据 @experimental */
282
- interface ChatAttachmentMeta extends ChatAttachmentInput {
283
- /** 注入模型的内容形态;text 以外的类型当前不接收(runtime 只收纯文本 prompt) */
284
- kind: 'text';
343
+ type ChatAttachmentMeta = ChatAttachmentInput;
344
+ /**
345
+ * 归并后的显示相位。进行中通道与历史通道共用这一个结构:
346
+ * 各存一份正是「运行细节首轮后消失」的根因(需求 17 条目 10-6)。
347
+ * @experimental
348
+ */
349
+ interface ChatRunPhase {
350
+ phase: RuntimePhase;
351
+ at: number;
352
+ /** 下一个步进到达时回填 */
353
+ endedAt?: number;
354
+ /** 由结构化 `LifecycleEvent.data` 派生的一句摘要 */
355
+ note?: string;
356
+ }
357
+ /** 本轮发生的一次已提交交互(FR-17.8:提交后表单保留所填值) @experimental */
358
+ interface ChatInteractionRecord {
359
+ id: string;
360
+ request: InteractionRequest;
361
+ /** 提交时的表单值;文件类字段已在引擎侧脱敏 */
362
+ submittedValues?: unknown;
285
363
  }
286
364
  /** @stable */
287
365
  interface ChatMessage {
@@ -291,6 +369,12 @@ interface ChatMessage {
291
369
  ts: string;
292
370
  /** user 消息携带的附件(旧会话文件无该字段) */
293
371
  attachments?: ChatAttachmentMeta[];
372
+ /**
373
+ * 随消息持久化的系统提示(例如「图片超出数量上限,未发送 X」,FR-11.3)。
374
+ * 放在消息里而不是 toast:toast 会消失,用户回头就查不到这次到底发了什么。
375
+ * @experimental
376
+ */
377
+ notice?: string;
294
378
  /** assistant 消息所属 run */
295
379
  runId?: string;
296
380
  /** 该 run 激活的技能(消息底部 badges) */
@@ -317,6 +401,18 @@ interface ChatMessage {
317
401
  * 写在消息上而不是会话上:切换模型只对后续消息生效,已有消息的归属不能被改写。
318
402
  */
319
403
  model?: string;
404
+ /**
405
+ * 该轮的生命周期相位快照(FR-17.7)。不持久化它,live 状态一丢「运行细节」入口就消失,
406
+ * 表现为容器高度先减后增。
407
+ * @experimental
408
+ */
409
+ phases?: ChatRunPhase[];
410
+ /**
411
+ * 该轮发生的交互及其终态(FR-17.8)。交互卡归属发起它的那条消息,
412
+ * 后续结果另开新消息,而不是就地改写原表单。
413
+ * @experimental
414
+ */
415
+ interactions?: ChatInteractionRecord[];
320
416
  }
321
417
  /** @stable */
322
418
  interface ChatSessionMeta {
@@ -328,6 +424,17 @@ interface ChatSessionMeta {
328
424
  /** 用户已手动重命名:后续 send 不再用首条消息覆盖标题 */
329
425
  titleLocked?: boolean;
330
426
  }
427
+ /**
428
+ * 会话列表页:除了数据,还得告诉 UI「为什么是空的」(FR-21.4 / FR-21.11)。 @experimental
429
+ */
430
+ interface ChatSessionListResult {
431
+ items: ChatSessionMeta[];
432
+ nextCursor?: string;
433
+ /** `'ok'` = 正常列举;`'missing-root'` = 会话目录不存在(多半是 chatRoot 配错) */
434
+ source: 'ok' | 'missing-root';
435
+ /** 读不动而被跳过的会话文件名 */
436
+ skipped: readonly string[];
437
+ }
331
438
  /** @stable */
332
439
  type ChatEvent = {
333
440
  type: 'run-started';
@@ -368,6 +475,8 @@ type ChatEvent = {
368
475
  status: 'completed' | 'failed' | 'cancelled';
369
476
  output: string;
370
477
  activeSkillNames: string[];
478
+ /** 终止原因对应的稳定错误码(仅非正常结束时):UI 据此分类提示,不再压平为 RUN_FAILED */
479
+ code?: WebSkillErrorCode;
371
480
  } | {
372
481
  type: 'todo-changed';
373
482
  runId: string;
@@ -380,6 +489,8 @@ type ChatEvent = {
380
489
  type: 'interaction-requested';
381
490
  id: string;
382
491
  requestType: InteractionRequest['type'];
492
+ /** 等待对象的可读名称(表单标题 / 问题正文):等待指示器要说清在等什么(FR-21.3) */
493
+ label?: string;
383
494
  } | {
384
495
  type: 'interaction-resolved';
385
496
  id: string;
@@ -388,6 +499,21 @@ type ChatEvent = {
388
499
  } | LifecycleChatEvent | {
389
500
  type: 'session-updated';
390
501
  session: ChatSessionMeta;
502
+ } |
503
+ /**
504
+ * 会话结束(需求 19 FR-19.3):切换、删除、归档、引擎释放各算一次。
505
+ * 用户画像的自动提炼挂在这个事件上——没有它就只能靠定时器猜「聊完了没」。
506
+ * @experimental
507
+ */
508
+ {
509
+ type: 'session-ended';
510
+ sessionId: string;
511
+ reason: 'switched' | 'deleted' | 'archived' | 'closed';
512
+ } |
513
+ /** 画像提炼完成(需求 19 FR-19.3):设置面板据此刷新列表 @experimental */
514
+ {
515
+ type: 'user-profile-updated';
516
+ profile: UserProfile;
391
517
  } | {
392
518
  type: 'warning';
393
519
  message: string;
@@ -544,6 +670,8 @@ declare class ChatEngine {
544
670
  * 重装配 runtime 以换掉客户端;已落盘的消息不受影响。
545
671
  */
546
672
  setModel(entryId: string | undefined): void;
673
+ /** 会话文件所在目录:「存储未初始化」提示要把路径写给用户看 @experimental */
674
+ get sessionsRoot(): string;
547
675
  /** 渲染框架热切换:复合桥按档分发,无需重装配 runtime(会话句柄保留) */
548
676
  setRenderer(renderer: RendererKind): void;
549
677
  /** 非 native 三档共用的交互通道(Chatbot 的 SpecInteraction 订阅/attach;core 只产出 catalog 节点树) */
@@ -560,8 +688,11 @@ declare class ChatEngine {
560
688
  * 会话列表页。归档会话也返回:UI 自己分区展示。
561
689
  * `limit` 不给默认值——缺省属于 `SessionStore` 实现,在这里兜底就等于只下推了一半。
562
690
  */
563
- listSessions(options?: PageQuery): Promise<Page<ChatSessionMeta>>;
564
- createSession(): Promise<ChatSessionMeta>;
691
+ listSessions(options?: PageQuery): Promise<ChatSessionListResult>;
692
+ /** `title` 缺省时会话先无标题,首条消息发出时再按内容补(FR-21.8) */
693
+ createSession(options?: {
694
+ title?: string;
695
+ }): Promise<ChatSessionMeta>;
565
696
  /**
566
697
  * 选中会话并取**最新**一页历史(页内时间升序)。
567
698
  * 返回全量 `ChatMessage[]` 的旧签名已移除:长会话下它强迫每个调用方拿全量。
@@ -590,13 +721,18 @@ declare class ChatEngine {
590
721
  /**
591
722
  * 驱动当前 session 的一轮 run。同 session 并发由 runtime session handle 内部
592
723
  * 队列串行化(此处直接 await);UI 层应在 send 期间禁用输入。
593
- * 附件正文按 `attachmentsRoot` 内的路径读回并拼进 prompt(runtime 只收纯文本)。
724
+ * 附件按 `attachmentsRoot` 内的路径读回并构造 `LlmContentPart[]`(FR-11.2)。
594
725
  */
595
726
  send(text: string, attachments?: readonly ChatAttachmentInput[]): Promise<void>;
596
727
  /** 附件落盘根目录(composer 附件适配器写入,send 时读回) */
597
728
  get attachmentsRoot(): string;
598
729
  /** 取消进行中的 run(Composer Stop 按钮);run 未找到/已结束返回 false */
599
730
  cancel(runId: string): boolean;
731
+ /**
732
+ * 释放引擎:取消进行中的 run、退订全部事件、丢弃装配缓存。
733
+ * 宿主重挂组件时用它收尾;只是换配置的话用 `reloadConfig()`,不要 dispose。
734
+ */
735
+ dispose(): Promise<void>;
600
736
  /** 列出 interrupted run(InterruptedBanner 数据源);版本不受支持的项带 unsupported 标记 */
601
737
  listInterrupted(): Promise<RunSnapshotListEntry[]>;
602
738
  /**
@@ -604,12 +740,36 @@ declare class ChatEngine {
604
740
  * 完成后与 send 同路径(assistant 消息持久化 + run-completed + trace 落盘)。
605
741
  */
606
742
  resume(runId: string): Promise<void>;
743
+ /** 读取当前画像(FR-19.3:可见) @experimental */
744
+ readUserProfile(): Promise<UserProfile>;
745
+ /** 已记录的行为条数;设置面板用它告诉用户「清除」会删掉什么 @experimental */
746
+ countBehaviorRecords(): Promise<number>;
747
+ /** 删除单条画像结论(FR-19.3:可编辑可删除) @experimental */
748
+ deleteUserProfileEntry(id: string): Promise<UserProfile>;
749
+ /** 清除全部行为记录(FR-19.8)。与清除画像是两个独立操作 @experimental */
750
+ clearBehaviorRecords(): Promise<void>;
751
+ /** 清除提炼出的画像(FR-19.8) @experimental */
752
+ clearUserProfile(): Promise<void>;
607
753
  /**
608
- * 清除跨会话表单填写历史(FR-5.11)。不传 `fieldKey` 即整体清空。
609
- * 与开关分开:关掉开关只是停止召回,用户往往还想把已存的内容删干净。
754
+ * 一并清除记录与画像,并销毁加密密钥(FR-19.8:关闭总开关时的「一并清除」)。
755
+ * 密钥留着就等于给残留密文留了一把能解开的钥匙。
610
756
  * @experimental
611
757
  */
612
- clearFormAutofill(fieldKey?: string): Promise<void>;
758
+ clearUserProfileData(): Promise<void>;
759
+ /**
760
+ * 手动提炼(FR-19.3)。与会话结束后的自动提炼同一条路径,
761
+ * 区别只在于这里的失败会抛给调用方——用户点了按钮就该看到结果。
762
+ * @experimental
763
+ */
764
+ refineUserProfile(): Promise<UserProfile>;
765
+ /** 导出画像(FR-19.7)。`excludeIds` 来自导出前的审阅界面 @experimental */
766
+ exportUserProfile(excludeIds?: readonly string[]): Promise<UserProfileExport>;
767
+ /** 导入前的差异(FR-19.7):由 UI 展示并确认后才调用 `applyUserProfileImport` @experimental */
768
+ diffUserProfileImport(incoming: UserProfileExport): Promise<ReturnType<typeof diffUserProfile> & {
769
+ origin: string;
770
+ }>;
771
+ /** 确认后落库(FR-19.7) @experimental */
772
+ applyUserProfileImport(incoming: UserProfileExport): Promise<UserProfile>;
613
773
  }
614
774
  //#endregion
615
775
  //#region src/core/interactionBridge.d.ts
@@ -658,6 +818,12 @@ interface CompositeUiBridgeDeps {
658
818
  getInteractionChannel(): SpecInteractionChannel;
659
819
  /** 渲染档能力表(省略用 DEFAULT_RENDERER_CAPABILITIES) */
660
820
  capabilities?: Readonly<Record<RendererKind, RendererCapability>>;
821
+ /**
822
+ * 交互结束(含取消)后的回调,带完整请求与应答。
823
+ * `interaction-resolved` 事件不带值,而切分消息需要把用户填的内容留在表单上(FR-17.8)。
824
+ * @experimental
825
+ */
826
+ onResolved?(request: InteractionRequest, response: InteractionResponse): void;
661
827
  emit(event: ChatEvent): void;
662
828
  }
663
829
  /**
@@ -698,11 +864,23 @@ declare const chatbotDictionary: {
698
864
  'header.sessions': string;
699
865
  'header.settings': string;
700
866
  'header.console': string;
867
+ 'header.theme.light': string;
868
+ 'header.theme.dark': string;
701
869
  'session.title': string;
702
870
  'session.new': string;
703
871
  'session.searchPlaceholder': string;
704
872
  'session.empty': string;
873
+ 'session.missingRoot': string;
874
+ 'session.skipped': string;
705
875
  'session.delete': string;
876
+ 'session.actions': string;
877
+ 'session.menu.rename': string;
878
+ 'session.menu.archive': string;
879
+ 'session.menu.unarchive': string;
880
+ 'session.menu.delete': string;
881
+ 'session.delete.confirmTitle': string;
882
+ 'session.delete.confirmDescription': string;
883
+ 'common.cancel': string;
706
884
  'session.rename': string;
707
885
  'session.renameInput': string;
708
886
  'session.archive': string;
@@ -741,6 +919,8 @@ declare const chatbotDictionary: {
741
919
  'tool.args': string;
742
920
  'tool.denied.reason': string;
743
921
  'tool.failed.reason': string;
922
+ 'tool.notFound.reason': string;
923
+ 'tool.exhausted.reason': string;
744
924
  'cot.thinking': string;
745
925
  'cot.thought': string;
746
926
  'cot.summary': string;
@@ -750,6 +930,9 @@ declare const chatbotDictionary: {
750
930
  'trace.skill': string;
751
931
  'perception.reading': string;
752
932
  'perception.excluded': string;
933
+ 'perception.images': string;
934
+ 'perception.imagesOmitted': string;
935
+ 'perception.imageFailures': string;
753
936
  'trace.phase.route': string;
754
937
  'trace.phase.activate': string;
755
938
  'trace.phase.execute': string;
@@ -767,16 +950,25 @@ declare const chatbotDictionary: {
767
950
  'interaction.form.title': string;
768
951
  'interaction.select.title': string;
769
952
  'interaction.authorize.title': string;
953
+ 'interaction.filePick.title': string;
954
+ 'interaction.filePick.choose': string;
955
+ 'interaction.filePick.decline': string;
956
+ 'interaction.filePick.selected': string;
770
957
  'interaction.authorize.description': string;
771
958
  'interaction.authorize.capability': string;
772
959
  'interaction.authorize.details': string;
773
960
  'interaction.origin': string;
961
+ 'interaction.submitted': string;
774
962
  'interaction.submit': string;
775
963
  'interaction.cancel': string;
776
964
  'interaction.confirm': string;
777
965
  'interaction.allow': string;
778
966
  'interaction.deny': string;
779
967
  'interaction.required': string;
968
+ 'interaction.wait': string;
969
+ 'interaction.wait.inPanel': string;
970
+ 'interaction.wait.fallback': string;
971
+ 'interaction.wait.locate': string;
780
972
  'result.artifacts': string;
781
973
  'result.download': string;
782
974
  'result.file': string;
@@ -798,14 +990,38 @@ declare const chatbotDictionary: {
798
990
  'composer.attachments': string;
799
991
  'composer.addAttachment': string;
800
992
  'composer.removeAttachment': string;
993
+ 'composer.attachment.kind.text': string;
994
+ 'composer.attachment.kind.image': string;
995
+ 'composer.attachment.kind.file': string;
996
+ 'composer.attachment.compressed': string;
801
997
  'composer.model': string;
802
998
  'composer.model.demo': string;
999
+ 'composer.plainChatOnly': string;
1000
+ 'composer.menu': string;
1001
+ 'composer.pageCapture': string;
1002
+ 'composer.pageCapture.disabled.setting': string;
1003
+ 'composer.pageCapture.disabled.model': string;
1004
+ 'composer.addAttachment.imagesOff': string;
1005
+ 'composer.addAttachment.modelNoImages': string;
803
1006
  'composer.dictate': string;
804
1007
  'composer.dictate.stop': string;
805
1008
  'composer.dictate.recording': string;
806
1009
  'composer.dictate.api-missing': string;
807
1010
  'composer.dictate.insecure-context': string;
808
1011
  'settings.title': string;
1012
+ 'settings.group.general': string;
1013
+ 'settings.group.models': string;
1014
+ 'settings.group.agent': string;
1015
+ 'settings.group.multimodal': string;
1016
+ 'settings.group.privacy': string;
1017
+ 'settings.general.title': string;
1018
+ 'settings.general.description': string;
1019
+ 'settings.privacy.title': string;
1020
+ 'settings.privacy.description': string;
1021
+ 'settings.model.actions': string;
1022
+ 'settings.model.removeConfirmTitle': string;
1023
+ 'settings.model.removeConfirmDescription': string;
1024
+ 'settings.model.isDefault': string;
809
1025
  'settings.model.title': string;
810
1026
  'settings.model.description': string;
811
1027
  'settings.model.empty': string;
@@ -858,40 +1074,62 @@ declare const chatbotDictionary: {
858
1074
  'settings.agent.skillGenerationNote': string;
859
1075
  'settings.agent.delegation': string;
860
1076
  'settings.agent.delegationNote': string;
861
- 'settings.agent.formAutofill': string;
862
- 'settings.agent.formAutofillNote': string;
863
- 'settings.agent.formAutofillClear': string;
864
- 'settings.agent.formAutofillCleared': string;
865
- 'settings.preferences.title': string;
866
- 'settings.preferences.description': string;
867
- 'settings.preferences.export': string;
868
- 'settings.preferences.import': string;
869
- 'settings.preferences.exported': string;
870
- 'settings.preferences.imported': string;
1077
+ 'settings.privacy.enabled': string;
1078
+ 'settings.privacy.enabledRisk': string;
1079
+ 'settings.privacy.encrypted': string;
1080
+ 'settings.privacy.encryptedNote': string;
1081
+ 'settings.privacy.injectMaxBytes': string;
1082
+ 'settings.privacy.injectMaxBytesNote': string;
1083
+ 'settings.privacy.recordLimit': string;
1084
+ 'settings.privacy.recordLimitNote': string;
1085
+ 'settings.privacy.disableClearPrompt': string;
1086
+ 'settings.privacy.disableClearConfirm': string;
1087
+ 'settings.privacy.disableClearKeep': string;
1088
+ 'settings.privacy.profileTitle': string;
1089
+ 'settings.privacy.profileNote': string;
1090
+ 'settings.privacy.profileEmpty': string;
1091
+ 'settings.privacy.profileDelete': string;
1092
+ 'settings.privacy.refine': string;
1093
+ 'settings.privacy.export': string;
1094
+ 'settings.privacy.import': string;
1095
+ 'settings.privacy.clearRecords': string;
1096
+ 'settings.privacy.clearProfile': string;
1097
+ 'settings.privacy.clearConfirm': string;
1098
+ 'settings.privacy.exportReview': string;
1099
+ 'settings.privacy.exportConfirm': string;
1100
+ 'settings.privacy.importDiff': string;
1101
+ 'settings.model.image': string;
1102
+ 'settings.model.imageNote': string;
1103
+ 'settings.model.tools': string;
1104
+ 'settings.model.toolsNote': string;
1105
+ 'settings.model.builtinFixed': string;
1106
+ 'settings.capability.plainChat': string;
1107
+ 'settings.multimodal.title': string;
1108
+ 'settings.multimodal.description': string;
1109
+ 'settings.multimodal.imageAttachments': string;
1110
+ 'settings.multimodal.imageAttachmentsRisk': string;
1111
+ 'settings.multimodal.pageImageCapture': string;
1112
+ 'settings.multimodal.pageImageCaptureRisk': string;
1113
+ 'settings.multimodal.maxImages': string;
1114
+ 'settings.multimodal.maxImagesNote': string;
1115
+ 'settings.multimodal.maxImageBytes': string;
1116
+ 'settings.multimodal.maxImageBytesNote': string;
871
1117
  'settings.voice.title': string;
872
1118
  'settings.voice.description': string;
873
1119
  'settings.voice.lang': string;
874
1120
  'settings.voice.langFollow': string;
875
- 'settings.appearance.title': string;
876
- 'settings.appearance.description': string;
877
- 'settings.theme': string;
878
- 'settings.theme.light': string;
879
- 'settings.theme.dark': string;
880
- 'settings.language': string;
881
- 'settings.language.en': string;
882
- 'settings.language.zh': string;
883
- 'settings.renderer': string;
884
- 'settings.renderer.description': string;
885
- 'settings.renderer.native': string;
886
- 'settings.renderer.a2ui': string;
887
- 'settings.renderer.openui': string;
888
- 'settings.renderer.vercel': string;
889
1121
  'vercel.preview.title': string;
890
1122
  'vercel.preview.badge': string;
891
1123
  'vercel.preview.description': string;
892
1124
  'surface.legacy.placeholder': string;
893
1125
  'error.title': string;
894
1126
  'error.suggestion': string;
1127
+ 'error.suggestion.LLM_UNAVAILABLE': string;
1128
+ 'error.suggestion.LLM_REQUEST_FAILED': string;
1129
+ 'error.suggestion.RUN_TIMEOUT': string;
1130
+ 'error.suggestion.RUN_INTERACTION_TIMEOUT': string;
1131
+ 'error.suggestion.RUN_MAX_TURNS_EXCEEDED': string;
1132
+ 'error.suggestion.TOOL_RESOLUTION_EXHAUSTED': string;
895
1133
  'error.dismiss': string;
896
1134
  };
897
1135
  zh: {
@@ -899,11 +1137,23 @@ declare const chatbotDictionary: {
899
1137
  'header.sessions': string;
900
1138
  'header.settings': string;
901
1139
  'header.console': string;
1140
+ 'header.theme.light': string;
1141
+ 'header.theme.dark': string;
902
1142
  'session.title': string;
903
1143
  'session.new': string;
904
1144
  'session.searchPlaceholder': string;
905
1145
  'session.empty': string;
1146
+ 'session.missingRoot': string;
1147
+ 'session.skipped': string;
906
1148
  'session.delete': string;
1149
+ 'session.actions': string;
1150
+ 'session.menu.rename': string;
1151
+ 'session.menu.archive': string;
1152
+ 'session.menu.unarchive': string;
1153
+ 'session.menu.delete': string;
1154
+ 'session.delete.confirmTitle': string;
1155
+ 'session.delete.confirmDescription': string;
1156
+ 'common.cancel': string;
907
1157
  'session.rename': string;
908
1158
  'session.renameInput': string;
909
1159
  'session.archive': string;
@@ -942,6 +1192,8 @@ declare const chatbotDictionary: {
942
1192
  'tool.args': string;
943
1193
  'tool.denied.reason': string;
944
1194
  'tool.failed.reason': string;
1195
+ 'tool.notFound.reason': string;
1196
+ 'tool.exhausted.reason': string;
945
1197
  'cot.thinking': string;
946
1198
  'cot.thought': string;
947
1199
  'cot.summary': string;
@@ -951,6 +1203,9 @@ declare const chatbotDictionary: {
951
1203
  'trace.skill': string;
952
1204
  'perception.reading': string;
953
1205
  'perception.excluded': string;
1206
+ 'perception.images': string;
1207
+ 'perception.imagesOmitted': string;
1208
+ 'perception.imageFailures': string;
954
1209
  'trace.phase.route': string;
955
1210
  'trace.phase.activate': string;
956
1211
  'trace.phase.execute': string;
@@ -968,16 +1223,25 @@ declare const chatbotDictionary: {
968
1223
  'interaction.form.title': string;
969
1224
  'interaction.select.title': string;
970
1225
  'interaction.authorize.title': string;
1226
+ 'interaction.filePick.title': string;
1227
+ 'interaction.filePick.choose': string;
1228
+ 'interaction.filePick.decline': string;
1229
+ 'interaction.filePick.selected': string;
971
1230
  'interaction.authorize.description': string;
972
1231
  'interaction.authorize.capability': string;
973
1232
  'interaction.authorize.details': string;
974
1233
  'interaction.origin': string;
1234
+ 'interaction.submitted': string;
975
1235
  'interaction.submit': string;
976
1236
  'interaction.cancel': string;
977
1237
  'interaction.confirm': string;
978
1238
  'interaction.allow': string;
979
1239
  'interaction.deny': string;
980
1240
  'interaction.required': string;
1241
+ 'interaction.wait': string;
1242
+ 'interaction.wait.inPanel': string;
1243
+ 'interaction.wait.fallback': string;
1244
+ 'interaction.wait.locate': string;
981
1245
  'result.artifacts': string;
982
1246
  'result.download': string;
983
1247
  'result.file': string;
@@ -999,14 +1263,38 @@ declare const chatbotDictionary: {
999
1263
  'composer.attachments': string;
1000
1264
  'composer.addAttachment': string;
1001
1265
  'composer.removeAttachment': string;
1266
+ 'composer.attachment.kind.text': string;
1267
+ 'composer.attachment.kind.image': string;
1268
+ 'composer.attachment.kind.file': string;
1269
+ 'composer.attachment.compressed': string;
1002
1270
  'composer.model': string;
1003
1271
  'composer.model.demo': string;
1272
+ 'composer.plainChatOnly': string;
1273
+ 'composer.menu': string;
1274
+ 'composer.pageCapture': string;
1275
+ 'composer.pageCapture.disabled.setting': string;
1276
+ 'composer.pageCapture.disabled.model': string;
1277
+ 'composer.addAttachment.imagesOff': string;
1278
+ 'composer.addAttachment.modelNoImages': string;
1004
1279
  'composer.dictate': string;
1005
1280
  'composer.dictate.stop': string;
1006
1281
  'composer.dictate.recording': string;
1007
1282
  'composer.dictate.api-missing': string;
1008
1283
  'composer.dictate.insecure-context': string;
1009
1284
  'settings.title': string;
1285
+ 'settings.group.general': string;
1286
+ 'settings.group.models': string;
1287
+ 'settings.group.agent': string;
1288
+ 'settings.group.multimodal': string;
1289
+ 'settings.group.privacy': string;
1290
+ 'settings.general.title': string;
1291
+ 'settings.general.description': string;
1292
+ 'settings.privacy.title': string;
1293
+ 'settings.privacy.description': string;
1294
+ 'settings.model.actions': string;
1295
+ 'settings.model.removeConfirmTitle': string;
1296
+ 'settings.model.removeConfirmDescription': string;
1297
+ 'settings.model.isDefault': string;
1010
1298
  'settings.model.title': string;
1011
1299
  'settings.model.description': string;
1012
1300
  'settings.model.empty': string;
@@ -1059,40 +1347,62 @@ declare const chatbotDictionary: {
1059
1347
  'settings.agent.skillGenerationNote': string;
1060
1348
  'settings.agent.delegation': string;
1061
1349
  'settings.agent.delegationNote': string;
1062
- 'settings.agent.formAutofill': string;
1063
- 'settings.agent.formAutofillNote': string;
1064
- 'settings.agent.formAutofillClear': string;
1065
- 'settings.agent.formAutofillCleared': string;
1066
- 'settings.preferences.title': string;
1067
- 'settings.preferences.description': string;
1068
- 'settings.preferences.export': string;
1069
- 'settings.preferences.import': string;
1070
- 'settings.preferences.exported': string;
1071
- 'settings.preferences.imported': string;
1350
+ 'settings.privacy.enabled': string;
1351
+ 'settings.privacy.enabledRisk': string;
1352
+ 'settings.privacy.encrypted': string;
1353
+ 'settings.privacy.encryptedNote': string;
1354
+ 'settings.privacy.injectMaxBytes': string;
1355
+ 'settings.privacy.injectMaxBytesNote': string;
1356
+ 'settings.privacy.recordLimit': string;
1357
+ 'settings.privacy.recordLimitNote': string;
1358
+ 'settings.privacy.disableClearPrompt': string;
1359
+ 'settings.privacy.disableClearConfirm': string;
1360
+ 'settings.privacy.disableClearKeep': string;
1361
+ 'settings.privacy.profileTitle': string;
1362
+ 'settings.privacy.profileNote': string;
1363
+ 'settings.privacy.profileEmpty': string;
1364
+ 'settings.privacy.profileDelete': string;
1365
+ 'settings.privacy.refine': string;
1366
+ 'settings.privacy.export': string;
1367
+ 'settings.privacy.import': string;
1368
+ 'settings.privacy.clearRecords': string;
1369
+ 'settings.privacy.clearProfile': string;
1370
+ 'settings.privacy.clearConfirm': string;
1371
+ 'settings.privacy.exportReview': string;
1372
+ 'settings.privacy.exportConfirm': string;
1373
+ 'settings.privacy.importDiff': string;
1374
+ 'settings.model.image': string;
1375
+ 'settings.model.imageNote': string;
1376
+ 'settings.model.tools': string;
1377
+ 'settings.model.toolsNote': string;
1378
+ 'settings.model.builtinFixed': string;
1379
+ 'settings.capability.plainChat': string;
1380
+ 'settings.multimodal.title': string;
1381
+ 'settings.multimodal.description': string;
1382
+ 'settings.multimodal.imageAttachments': string;
1383
+ 'settings.multimodal.imageAttachmentsRisk': string;
1384
+ 'settings.multimodal.pageImageCapture': string;
1385
+ 'settings.multimodal.pageImageCaptureRisk': string;
1386
+ 'settings.multimodal.maxImages': string;
1387
+ 'settings.multimodal.maxImagesNote': string;
1388
+ 'settings.multimodal.maxImageBytes': string;
1389
+ 'settings.multimodal.maxImageBytesNote': string;
1072
1390
  'settings.voice.title': string;
1073
1391
  'settings.voice.description': string;
1074
1392
  'settings.voice.lang': string;
1075
1393
  'settings.voice.langFollow': string;
1076
- 'settings.appearance.title': string;
1077
- 'settings.appearance.description': string;
1078
- 'settings.theme': string;
1079
- 'settings.theme.light': string;
1080
- 'settings.theme.dark': string;
1081
- 'settings.language': string;
1082
- 'settings.language.en': string;
1083
- 'settings.language.zh': string;
1084
- 'settings.renderer': string;
1085
- 'settings.renderer.description': string;
1086
- 'settings.renderer.native': string;
1087
- 'settings.renderer.a2ui': string;
1088
- 'settings.renderer.openui': string;
1089
- 'settings.renderer.vercel': string;
1090
1394
  'vercel.preview.title': string;
1091
1395
  'vercel.preview.badge': string;
1092
1396
  'vercel.preview.description': string;
1093
1397
  'surface.legacy.placeholder': string;
1094
1398
  'error.title': string;
1095
1399
  'error.suggestion': string;
1400
+ 'error.suggestion.LLM_UNAVAILABLE': string;
1401
+ 'error.suggestion.LLM_REQUEST_FAILED': string;
1402
+ 'error.suggestion.RUN_TIMEOUT': string;
1403
+ 'error.suggestion.RUN_INTERACTION_TIMEOUT': string;
1404
+ 'error.suggestion.RUN_MAX_TURNS_EXCEEDED': string;
1405
+ 'error.suggestion.TOOL_RESOLUTION_EXHAUSTED': string;
1096
1406
  'error.dismiss': string;
1097
1407
  };
1098
1408
  };
@@ -1103,11 +1413,23 @@ declare const useT: () => TranslateFn<{
1103
1413
  'header.sessions': string;
1104
1414
  'header.settings': string;
1105
1415
  'header.console': string;
1416
+ 'header.theme.light': string;
1417
+ 'header.theme.dark': string;
1106
1418
  'session.title': string;
1107
1419
  'session.new': string;
1108
1420
  'session.searchPlaceholder': string;
1109
1421
  'session.empty': string;
1422
+ 'session.missingRoot': string;
1423
+ 'session.skipped': string;
1110
1424
  'session.delete': string;
1425
+ 'session.actions': string;
1426
+ 'session.menu.rename': string;
1427
+ 'session.menu.archive': string;
1428
+ 'session.menu.unarchive': string;
1429
+ 'session.menu.delete': string;
1430
+ 'session.delete.confirmTitle': string;
1431
+ 'session.delete.confirmDescription': string;
1432
+ 'common.cancel': string;
1111
1433
  'session.rename': string;
1112
1434
  'session.renameInput': string;
1113
1435
  'session.archive': string;
@@ -1146,6 +1468,8 @@ declare const useT: () => TranslateFn<{
1146
1468
  'tool.args': string;
1147
1469
  'tool.denied.reason': string;
1148
1470
  'tool.failed.reason': string;
1471
+ 'tool.notFound.reason': string;
1472
+ 'tool.exhausted.reason': string;
1149
1473
  'cot.thinking': string;
1150
1474
  'cot.thought': string;
1151
1475
  'cot.summary': string;
@@ -1155,6 +1479,9 @@ declare const useT: () => TranslateFn<{
1155
1479
  'trace.skill': string;
1156
1480
  'perception.reading': string;
1157
1481
  'perception.excluded': string;
1482
+ 'perception.images': string;
1483
+ 'perception.imagesOmitted': string;
1484
+ 'perception.imageFailures': string;
1158
1485
  'trace.phase.route': string;
1159
1486
  'trace.phase.activate': string;
1160
1487
  'trace.phase.execute': string;
@@ -1172,16 +1499,25 @@ declare const useT: () => TranslateFn<{
1172
1499
  'interaction.form.title': string;
1173
1500
  'interaction.select.title': string;
1174
1501
  'interaction.authorize.title': string;
1502
+ 'interaction.filePick.title': string;
1503
+ 'interaction.filePick.choose': string;
1504
+ 'interaction.filePick.decline': string;
1505
+ 'interaction.filePick.selected': string;
1175
1506
  'interaction.authorize.description': string;
1176
1507
  'interaction.authorize.capability': string;
1177
1508
  'interaction.authorize.details': string;
1178
1509
  'interaction.origin': string;
1510
+ 'interaction.submitted': string;
1179
1511
  'interaction.submit': string;
1180
1512
  'interaction.cancel': string;
1181
1513
  'interaction.confirm': string;
1182
1514
  'interaction.allow': string;
1183
1515
  'interaction.deny': string;
1184
1516
  'interaction.required': string;
1517
+ 'interaction.wait': string;
1518
+ 'interaction.wait.inPanel': string;
1519
+ 'interaction.wait.fallback': string;
1520
+ 'interaction.wait.locate': string;
1185
1521
  'result.artifacts': string;
1186
1522
  'result.download': string;
1187
1523
  'result.file': string;
@@ -1203,14 +1539,38 @@ declare const useT: () => TranslateFn<{
1203
1539
  'composer.attachments': string;
1204
1540
  'composer.addAttachment': string;
1205
1541
  'composer.removeAttachment': string;
1542
+ 'composer.attachment.kind.text': string;
1543
+ 'composer.attachment.kind.image': string;
1544
+ 'composer.attachment.kind.file': string;
1545
+ 'composer.attachment.compressed': string;
1206
1546
  'composer.model': string;
1207
1547
  'composer.model.demo': string;
1548
+ 'composer.plainChatOnly': string;
1549
+ 'composer.menu': string;
1550
+ 'composer.pageCapture': string;
1551
+ 'composer.pageCapture.disabled.setting': string;
1552
+ 'composer.pageCapture.disabled.model': string;
1553
+ 'composer.addAttachment.imagesOff': string;
1554
+ 'composer.addAttachment.modelNoImages': string;
1208
1555
  'composer.dictate': string;
1209
1556
  'composer.dictate.stop': string;
1210
1557
  'composer.dictate.recording': string;
1211
1558
  'composer.dictate.api-missing': string;
1212
1559
  'composer.dictate.insecure-context': string;
1213
1560
  'settings.title': string;
1561
+ 'settings.group.general': string;
1562
+ 'settings.group.models': string;
1563
+ 'settings.group.agent': string;
1564
+ 'settings.group.multimodal': string;
1565
+ 'settings.group.privacy': string;
1566
+ 'settings.general.title': string;
1567
+ 'settings.general.description': string;
1568
+ 'settings.privacy.title': string;
1569
+ 'settings.privacy.description': string;
1570
+ 'settings.model.actions': string;
1571
+ 'settings.model.removeConfirmTitle': string;
1572
+ 'settings.model.removeConfirmDescription': string;
1573
+ 'settings.model.isDefault': string;
1214
1574
  'settings.model.title': string;
1215
1575
  'settings.model.description': string;
1216
1576
  'settings.model.empty': string;
@@ -1263,40 +1623,62 @@ declare const useT: () => TranslateFn<{
1263
1623
  'settings.agent.skillGenerationNote': string;
1264
1624
  'settings.agent.delegation': string;
1265
1625
  'settings.agent.delegationNote': string;
1266
- 'settings.agent.formAutofill': string;
1267
- 'settings.agent.formAutofillNote': string;
1268
- 'settings.agent.formAutofillClear': string;
1269
- 'settings.agent.formAutofillCleared': string;
1270
- 'settings.preferences.title': string;
1271
- 'settings.preferences.description': string;
1272
- 'settings.preferences.export': string;
1273
- 'settings.preferences.import': string;
1274
- 'settings.preferences.exported': string;
1275
- 'settings.preferences.imported': string;
1626
+ 'settings.privacy.enabled': string;
1627
+ 'settings.privacy.enabledRisk': string;
1628
+ 'settings.privacy.encrypted': string;
1629
+ 'settings.privacy.encryptedNote': string;
1630
+ 'settings.privacy.injectMaxBytes': string;
1631
+ 'settings.privacy.injectMaxBytesNote': string;
1632
+ 'settings.privacy.recordLimit': string;
1633
+ 'settings.privacy.recordLimitNote': string;
1634
+ 'settings.privacy.disableClearPrompt': string;
1635
+ 'settings.privacy.disableClearConfirm': string;
1636
+ 'settings.privacy.disableClearKeep': string;
1637
+ 'settings.privacy.profileTitle': string;
1638
+ 'settings.privacy.profileNote': string;
1639
+ 'settings.privacy.profileEmpty': string;
1640
+ 'settings.privacy.profileDelete': string;
1641
+ 'settings.privacy.refine': string;
1642
+ 'settings.privacy.export': string;
1643
+ 'settings.privacy.import': string;
1644
+ 'settings.privacy.clearRecords': string;
1645
+ 'settings.privacy.clearProfile': string;
1646
+ 'settings.privacy.clearConfirm': string;
1647
+ 'settings.privacy.exportReview': string;
1648
+ 'settings.privacy.exportConfirm': string;
1649
+ 'settings.privacy.importDiff': string;
1650
+ 'settings.model.image': string;
1651
+ 'settings.model.imageNote': string;
1652
+ 'settings.model.tools': string;
1653
+ 'settings.model.toolsNote': string;
1654
+ 'settings.model.builtinFixed': string;
1655
+ 'settings.capability.plainChat': string;
1656
+ 'settings.multimodal.title': string;
1657
+ 'settings.multimodal.description': string;
1658
+ 'settings.multimodal.imageAttachments': string;
1659
+ 'settings.multimodal.imageAttachmentsRisk': string;
1660
+ 'settings.multimodal.pageImageCapture': string;
1661
+ 'settings.multimodal.pageImageCaptureRisk': string;
1662
+ 'settings.multimodal.maxImages': string;
1663
+ 'settings.multimodal.maxImagesNote': string;
1664
+ 'settings.multimodal.maxImageBytes': string;
1665
+ 'settings.multimodal.maxImageBytesNote': string;
1276
1666
  'settings.voice.title': string;
1277
1667
  'settings.voice.description': string;
1278
1668
  'settings.voice.lang': string;
1279
1669
  'settings.voice.langFollow': string;
1280
- 'settings.appearance.title': string;
1281
- 'settings.appearance.description': string;
1282
- 'settings.theme': string;
1283
- 'settings.theme.light': string;
1284
- 'settings.theme.dark': string;
1285
- 'settings.language': string;
1286
- 'settings.language.en': string;
1287
- 'settings.language.zh': string;
1288
- 'settings.renderer': string;
1289
- 'settings.renderer.description': string;
1290
- 'settings.renderer.native': string;
1291
- 'settings.renderer.a2ui': string;
1292
- 'settings.renderer.openui': string;
1293
- 'settings.renderer.vercel': string;
1294
1670
  'vercel.preview.title': string;
1295
1671
  'vercel.preview.badge': string;
1296
1672
  'vercel.preview.description': string;
1297
1673
  'surface.legacy.placeholder': string;
1298
1674
  'error.title': string;
1299
1675
  'error.suggestion': string;
1676
+ 'error.suggestion.LLM_UNAVAILABLE': string;
1677
+ 'error.suggestion.LLM_REQUEST_FAILED': string;
1678
+ 'error.suggestion.RUN_TIMEOUT': string;
1679
+ 'error.suggestion.RUN_INTERACTION_TIMEOUT': string;
1680
+ 'error.suggestion.RUN_MAX_TURNS_EXCEEDED': string;
1681
+ 'error.suggestion.TOOL_RESOLUTION_EXHAUSTED': string;
1300
1682
  'error.dismiss': string;
1301
1683
  };
1302
1684
  zh: {
@@ -1304,11 +1686,23 @@ declare const useT: () => TranslateFn<{
1304
1686
  'header.sessions': string;
1305
1687
  'header.settings': string;
1306
1688
  'header.console': string;
1689
+ 'header.theme.light': string;
1690
+ 'header.theme.dark': string;
1307
1691
  'session.title': string;
1308
1692
  'session.new': string;
1309
1693
  'session.searchPlaceholder': string;
1310
1694
  'session.empty': string;
1695
+ 'session.missingRoot': string;
1696
+ 'session.skipped': string;
1311
1697
  'session.delete': string;
1698
+ 'session.actions': string;
1699
+ 'session.menu.rename': string;
1700
+ 'session.menu.archive': string;
1701
+ 'session.menu.unarchive': string;
1702
+ 'session.menu.delete': string;
1703
+ 'session.delete.confirmTitle': string;
1704
+ 'session.delete.confirmDescription': string;
1705
+ 'common.cancel': string;
1312
1706
  'session.rename': string;
1313
1707
  'session.renameInput': string;
1314
1708
  'session.archive': string;
@@ -1347,6 +1741,8 @@ declare const useT: () => TranslateFn<{
1347
1741
  'tool.args': string;
1348
1742
  'tool.denied.reason': string;
1349
1743
  'tool.failed.reason': string;
1744
+ 'tool.notFound.reason': string;
1745
+ 'tool.exhausted.reason': string;
1350
1746
  'cot.thinking': string;
1351
1747
  'cot.thought': string;
1352
1748
  'cot.summary': string;
@@ -1356,6 +1752,9 @@ declare const useT: () => TranslateFn<{
1356
1752
  'trace.skill': string;
1357
1753
  'perception.reading': string;
1358
1754
  'perception.excluded': string;
1755
+ 'perception.images': string;
1756
+ 'perception.imagesOmitted': string;
1757
+ 'perception.imageFailures': string;
1359
1758
  'trace.phase.route': string;
1360
1759
  'trace.phase.activate': string;
1361
1760
  'trace.phase.execute': string;
@@ -1373,16 +1772,25 @@ declare const useT: () => TranslateFn<{
1373
1772
  'interaction.form.title': string;
1374
1773
  'interaction.select.title': string;
1375
1774
  'interaction.authorize.title': string;
1775
+ 'interaction.filePick.title': string;
1776
+ 'interaction.filePick.choose': string;
1777
+ 'interaction.filePick.decline': string;
1778
+ 'interaction.filePick.selected': string;
1376
1779
  'interaction.authorize.description': string;
1377
1780
  'interaction.authorize.capability': string;
1378
1781
  'interaction.authorize.details': string;
1379
1782
  'interaction.origin': string;
1783
+ 'interaction.submitted': string;
1380
1784
  'interaction.submit': string;
1381
1785
  'interaction.cancel': string;
1382
1786
  'interaction.confirm': string;
1383
1787
  'interaction.allow': string;
1384
1788
  'interaction.deny': string;
1385
1789
  'interaction.required': string;
1790
+ 'interaction.wait': string;
1791
+ 'interaction.wait.inPanel': string;
1792
+ 'interaction.wait.fallback': string;
1793
+ 'interaction.wait.locate': string;
1386
1794
  'result.artifacts': string;
1387
1795
  'result.download': string;
1388
1796
  'result.file': string;
@@ -1404,14 +1812,38 @@ declare const useT: () => TranslateFn<{
1404
1812
  'composer.attachments': string;
1405
1813
  'composer.addAttachment': string;
1406
1814
  'composer.removeAttachment': string;
1815
+ 'composer.attachment.kind.text': string;
1816
+ 'composer.attachment.kind.image': string;
1817
+ 'composer.attachment.kind.file': string;
1818
+ 'composer.attachment.compressed': string;
1407
1819
  'composer.model': string;
1408
1820
  'composer.model.demo': string;
1821
+ 'composer.plainChatOnly': string;
1822
+ 'composer.menu': string;
1823
+ 'composer.pageCapture': string;
1824
+ 'composer.pageCapture.disabled.setting': string;
1825
+ 'composer.pageCapture.disabled.model': string;
1826
+ 'composer.addAttachment.imagesOff': string;
1827
+ 'composer.addAttachment.modelNoImages': string;
1409
1828
  'composer.dictate': string;
1410
1829
  'composer.dictate.stop': string;
1411
1830
  'composer.dictate.recording': string;
1412
1831
  'composer.dictate.api-missing': string;
1413
1832
  'composer.dictate.insecure-context': string;
1414
1833
  'settings.title': string;
1834
+ 'settings.group.general': string;
1835
+ 'settings.group.models': string;
1836
+ 'settings.group.agent': string;
1837
+ 'settings.group.multimodal': string;
1838
+ 'settings.group.privacy': string;
1839
+ 'settings.general.title': string;
1840
+ 'settings.general.description': string;
1841
+ 'settings.privacy.title': string;
1842
+ 'settings.privacy.description': string;
1843
+ 'settings.model.actions': string;
1844
+ 'settings.model.removeConfirmTitle': string;
1845
+ 'settings.model.removeConfirmDescription': string;
1846
+ 'settings.model.isDefault': string;
1415
1847
  'settings.model.title': string;
1416
1848
  'settings.model.description': string;
1417
1849
  'settings.model.empty': string;
@@ -1464,40 +1896,62 @@ declare const useT: () => TranslateFn<{
1464
1896
  'settings.agent.skillGenerationNote': string;
1465
1897
  'settings.agent.delegation': string;
1466
1898
  'settings.agent.delegationNote': string;
1467
- 'settings.agent.formAutofill': string;
1468
- 'settings.agent.formAutofillNote': string;
1469
- 'settings.agent.formAutofillClear': string;
1470
- 'settings.agent.formAutofillCleared': string;
1471
- 'settings.preferences.title': string;
1472
- 'settings.preferences.description': string;
1473
- 'settings.preferences.export': string;
1474
- 'settings.preferences.import': string;
1475
- 'settings.preferences.exported': string;
1476
- 'settings.preferences.imported': string;
1899
+ 'settings.privacy.enabled': string;
1900
+ 'settings.privacy.enabledRisk': string;
1901
+ 'settings.privacy.encrypted': string;
1902
+ 'settings.privacy.encryptedNote': string;
1903
+ 'settings.privacy.injectMaxBytes': string;
1904
+ 'settings.privacy.injectMaxBytesNote': string;
1905
+ 'settings.privacy.recordLimit': string;
1906
+ 'settings.privacy.recordLimitNote': string;
1907
+ 'settings.privacy.disableClearPrompt': string;
1908
+ 'settings.privacy.disableClearConfirm': string;
1909
+ 'settings.privacy.disableClearKeep': string;
1910
+ 'settings.privacy.profileTitle': string;
1911
+ 'settings.privacy.profileNote': string;
1912
+ 'settings.privacy.profileEmpty': string;
1913
+ 'settings.privacy.profileDelete': string;
1914
+ 'settings.privacy.refine': string;
1915
+ 'settings.privacy.export': string;
1916
+ 'settings.privacy.import': string;
1917
+ 'settings.privacy.clearRecords': string;
1918
+ 'settings.privacy.clearProfile': string;
1919
+ 'settings.privacy.clearConfirm': string;
1920
+ 'settings.privacy.exportReview': string;
1921
+ 'settings.privacy.exportConfirm': string;
1922
+ 'settings.privacy.importDiff': string;
1923
+ 'settings.model.image': string;
1924
+ 'settings.model.imageNote': string;
1925
+ 'settings.model.tools': string;
1926
+ 'settings.model.toolsNote': string;
1927
+ 'settings.model.builtinFixed': string;
1928
+ 'settings.capability.plainChat': string;
1929
+ 'settings.multimodal.title': string;
1930
+ 'settings.multimodal.description': string;
1931
+ 'settings.multimodal.imageAttachments': string;
1932
+ 'settings.multimodal.imageAttachmentsRisk': string;
1933
+ 'settings.multimodal.pageImageCapture': string;
1934
+ 'settings.multimodal.pageImageCaptureRisk': string;
1935
+ 'settings.multimodal.maxImages': string;
1936
+ 'settings.multimodal.maxImagesNote': string;
1937
+ 'settings.multimodal.maxImageBytes': string;
1938
+ 'settings.multimodal.maxImageBytesNote': string;
1477
1939
  'settings.voice.title': string;
1478
1940
  'settings.voice.description': string;
1479
1941
  'settings.voice.lang': string;
1480
1942
  'settings.voice.langFollow': string;
1481
- 'settings.appearance.title': string;
1482
- 'settings.appearance.description': string;
1483
- 'settings.theme': string;
1484
- 'settings.theme.light': string;
1485
- 'settings.theme.dark': string;
1486
- 'settings.language': string;
1487
- 'settings.language.en': string;
1488
- 'settings.language.zh': string;
1489
- 'settings.renderer': string;
1490
- 'settings.renderer.description': string;
1491
- 'settings.renderer.native': string;
1492
- 'settings.renderer.a2ui': string;
1493
- 'settings.renderer.openui': string;
1494
- 'settings.renderer.vercel': string;
1495
1943
  'vercel.preview.title': string;
1496
1944
  'vercel.preview.badge': string;
1497
1945
  'vercel.preview.description': string;
1498
1946
  'surface.legacy.placeholder': string;
1499
1947
  'error.title': string;
1500
1948
  'error.suggestion': string;
1949
+ 'error.suggestion.LLM_UNAVAILABLE': string;
1950
+ 'error.suggestion.LLM_REQUEST_FAILED': string;
1951
+ 'error.suggestion.RUN_TIMEOUT': string;
1952
+ 'error.suggestion.RUN_INTERACTION_TIMEOUT': string;
1953
+ 'error.suggestion.RUN_MAX_TURNS_EXCEEDED': string;
1954
+ 'error.suggestion.TOOL_RESOLUTION_EXHAUSTED': string;
1501
1955
  'error.dismiss': string;
1502
1956
  };
1503
1957
  }>;
@@ -1529,9 +1983,12 @@ type ResolvedChatLayout = 'fullscreen' | 'embedded' | 'mobile';
1529
1983
  interface ChatbotProps {
1530
1984
  adapter: ChatbotHostAdapter;
1531
1985
  config?: ChatbotConfig;
1532
- /** 界面语言(默认 'en';SettingsDrawer 内切换后经 onAppearanceChange 通知宿主) */
1986
+ /**
1987
+ * 界面语言(默认 'en')。**传了 `config.runtimeConfig` 时本属性被忽略**:
1988
+ * 0.6.0 起外观配置的唯一真值源是配置存储(FR-20.1)。
1989
+ */
1533
1990
  locale?: Locale;
1534
- /** 主题(默认 'light';'dark' 时根 div 挂 .dark 类) */
1991
+ /** 主题(默认 'light')。同上:有配置源时被忽略 */
1535
1992
  theme?: ChatTheme;
1536
1993
  /** 交互渲染框架档(默认 'native';'a2ui' 需宿主安装 optional peer @a2ui/lit) */
1537
1994
  renderer?: RendererKind;
@@ -1716,34 +2173,50 @@ interface SettingsDrawerProps {
1716
2173
  * 缺省时模型区只读展示(宿主没接配置源,谈不上持久化)。
1717
2174
  */
1718
2175
  runtimeConfig?: RuntimeConfigStore;
1719
- theme: ChatTheme;
1720
- locale: Locale;
1721
- /** 当前渲染框架档(Appearance 区可切换;缺 optional peer 的档位置灰) */
1722
- renderer?: RendererKind;
1723
2176
  /**
1724
2177
  * 语音识别语言(BCP-47);空串即跟随界面语言(FR-7.7)。
1725
2178
  * @experimental
1726
2179
  */
1727
2180
  dictationLang?: string;
1728
- /** 主题/语言切换时回调(宿主借此持久化;内部 state 由 Chatbot 跟随) */
2181
+ /** 语音语言切换时回调(写回同一份外观配置) */
1729
2182
  onAppearanceChange?(next: AppearanceChange): void;
1730
- /** 保存/清除成功后回调(Chatbot 借此触发 engine.reloadConfig) */
1731
- onSaved(): void;
1732
2183
  /**
1733
- * 清除跨会话表单填写历史(FR-5.11)。不注入即不渲染按钮(R11)。
2184
+ * 当前选中的模型条目 id(FR-14.4):它不支持工具时,Agent 能力开关置灰。
1734
2185
  * @experimental
1735
2186
  */
1736
- onClearFormAutofill?(): Promise<void>;
2187
+ selectedModelId?: string;
2188
+ /** 保存/清除成功后回调(Chatbot 借此触发 engine.reloadConfig) */
2189
+ onSaved(): void;
1737
2190
  /**
1738
- * 导出偏好时回调(FR-5.1):不注入时默认触发浏览器下载;
1739
- * 宿主要改成写入自己的存储(或复制到剪贴板)时接本回调。
2191
+ * 用户画像的读写入口(需求 19)。不注入即整段画像 UI 不渲染(R11)——
2192
+ * 没有数据源时展示一个空列表比不展示更容易让人以为「记录丢了」。
1740
2193
  * @experimental
1741
2194
  */
1742
- onExportPreferences?(data: PreferenceExport): void;
2195
+ userProfileApi?: UserProfileApi;
1743
2196
  onClose(): void;
1744
2197
  }
1745
- /** 设置抽屉:模型列表(增删改 / 设默认 / 逐条探测)+ 流式与 temperature + Agent 能力 + 外观 @stable */
1746
- declare function SettingsDrawer({ open, runtimeConfig, theme, locale, renderer, dictationLang, onAppearanceChange, onSaved, onClearFormAutofill, onExportPreferences, onClose }: SettingsDrawerProps): import("react").JSX.Element;
2198
+ /** 设置面板对画像数据的最小依赖面;实现由 Chatbot ChatEngine 装配 @experimental */
2199
+ interface UserProfileApi {
2200
+ read(): Promise<UserProfile>;
2201
+ refine(): Promise<UserProfile>;
2202
+ deleteEntry(id: string): Promise<UserProfile>;
2203
+ clearRecords(): Promise<void>;
2204
+ clearProfile(): Promise<void>;
2205
+ /** 记录与画像一并清除(关闭总开关时的追问) */
2206
+ clearAll(): Promise<void>;
2207
+ /** `excludeIds` 来自导出前的逐条审阅 */
2208
+ export(excludeIds: readonly string[]): Promise<UserProfileExport>;
2209
+ diffImport(incoming: UserProfileExport): Promise<UserProfileImportDiff>;
2210
+ applyImport(incoming: UserProfileExport): Promise<UserProfile>;
2211
+ }
2212
+ /** @experimental */
2213
+ interface UserProfileImportDiff {
2214
+ added: readonly UserProfileEntry[];
2215
+ updated: readonly UserProfileEntry[];
2216
+ origin: string;
2217
+ }
2218
+ /** 设置抽屉:模型列表(增删改 / 设默认 / 逐条探测)+ 流式与 temperature + Agent 能力 + 语音语言 @stable */
2219
+ declare function SettingsDrawer({ open, runtimeConfig, dictationLang, selectedModelId, onAppearanceChange, onSaved, userProfileApi: profileApi, onClose }: SettingsDrawerProps): import("react").JSX.Element;
1747
2220
  //#endregion
1748
2221
  //#region src/react/ErrorCard.d.ts
1749
2222
  /** @stable */
@@ -1756,4 +2229,4 @@ interface ErrorCardProps {
1756
2229
  /** 结构化错误卡:错误码徽章 + 描述 + 建议(engine error 事件 / 失败 run) @stable */
1757
2230
  declare function ErrorCard({ code, message, onDismiss }: ErrorCardProps): import("react").JSX.Element;
1758
2231
  //#endregion
1759
- export { A2uiSurfaceHost, type A2uiSurfaceHostProps, A2uiSurfaceSnapshotHost, type A2uiSurfaceSnapshotHostProps, type AppearanceChange, type ChatAttachmentInput, type ChatAttachmentMeta, ChatEngine, type ChatEngineOptions, type ChatEvent, type ChatLayout, type ChatMessage, type ChatSessionMeta, type ChatTheme, type ChatToolCall, Chatbot, type ChatbotConfig, type ChatbotGovernancePorts, type ChatbotHostAdapter, type ChatbotProps, CompositeUiBridge, type CompositeUiBridgeDeps, DEFAULT_RENDERER_CAPABILITIES, type DownloadableFile, ErrorCard, type ErrorCardProps, InteractionCard, type InteractionCardProps, InterruptedBanner, type InterruptedBannerProps, type Locale, OpenUiSurfaceHost, type OpenUiSurfaceHostProps, OpenUiSurfaceSnapshotHost, type OpenUiSurfaceSnapshotHostProps, type RendererCapability, type RendererKind, type ResolvedChatLayout, ResultBlockList, type ResultBlockListProps, ResultBlocksPro, type ResultBlocksProProps, type RunSnapshot, type SandboxExecutorDeps, SettingsDrawer, type SettingsDrawerProps, SkillBadges, SpecInteraction, type SpecInteractionProps, VercelPayloadPreview, type VercelPayloadPreviewProps, VercelSurfaceHost, type VercelSurfaceHostProps, VercelSurfaceSnapshotHost, type VercelSurfaceSnapshotHostProps, chatbotDictionary, configureA2uiMarkdown, probeA2uiAvailability, probeOpenUiAvailability, useT };
2232
+ export { A2uiSurfaceHost, type A2uiSurfaceHostProps, A2uiSurfaceSnapshotHost, type A2uiSurfaceSnapshotHostProps, type AppearanceChange, type ChatAttachmentInput, type ChatAttachmentMeta, ChatEngine, type ChatEngineOptions, type ChatEvent, type ChatInteractionRecord, type ChatLayout, type ChatMessage, type ChatRunPhase, type ChatSessionListResult, type ChatSessionMeta, type ChatTheme, type ChatToolCall, Chatbot, type ChatbotConfig, type ChatbotGovernancePorts, type ChatbotHostAdapter, type ChatbotProps, CompositeUiBridge, type CompositeUiBridgeDeps, DEFAULT_RENDERER_CAPABILITIES, DEFAULT_RUNTIME_CONFIG_STORAGE_KEY, type DownloadableFile, ErrorCard, type ErrorCardProps, InteractionCard, type InteractionCardProps, InterruptedBanner, type InterruptedBannerProps, type Locale, OpenUiSurfaceHost, type OpenUiSurfaceHostProps, OpenUiSurfaceSnapshotHost, type OpenUiSurfaceSnapshotHostProps, type RendererCapability, type RendererKind, type ResolvedChatLayout, ResultBlockList, type ResultBlockListProps, ResultBlocksPro, type ResultBlocksProProps, type RunSnapshot, type RuntimeAppearanceConfig, type RuntimeConfig, type RuntimeConfigStore, type RuntimeRendererId, type SandboxExecutorDeps, SettingsDrawer, type SettingsDrawerProps, SkillBadges, SpecInteraction, type SpecInteractionProps, type UserProfileApi, type UserProfileImportDiff, VercelPayloadPreview, type VercelPayloadPreviewProps, VercelSurfaceHost, type VercelSurfaceHostProps, VercelSurfaceSnapshotHost, type VercelSurfaceSnapshotHostProps, chatbotDictionary, configureA2uiMarkdown, createLocalStorageRuntimeConfigStore, createMemoryRuntimeConfigStore, probeA2uiAvailability, probeOpenUiAvailability, useT };