@blueking/chat-x 0.0.45-beta.7 → 0.0.45-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +1 -1
  2. package/dist/ag-ui/types/constants.d.ts +16 -0
  3. package/dist/ag-ui/types/contents.d.ts +2 -0
  4. package/dist/ag-ui/types/index.d.ts +2 -0
  5. package/dist/ag-ui/types/interrupt.d.ts +152 -0
  6. package/dist/ag-ui/types/messages.d.ts +2 -0
  7. package/dist/ag-ui/types/schema.d.ts +42 -0
  8. package/dist/components/ai-questions/questions-container.vue.d.ts +3 -0
  9. package/dist/components/ai-questions/selection-question.vue.d.ts +3 -0
  10. package/dist/components/chat-content/flow-agent-content/flow-agent-content.vue.d.ts +3 -0
  11. package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +4 -0
  12. package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +32 -0
  13. package/dist/components/chat-content/index.d.ts +2 -0
  14. package/dist/components/chat-input/ai-slash-input/command.d.ts +1 -2
  15. package/dist/components/chat-input/ai-slash-input/constants.d.ts +0 -4
  16. package/dist/components/chat-input/chat-input.vue.d.ts +14 -8
  17. package/dist/components/chat-input/input-attachment/input-attachment.vue.d.ts +1 -0
  18. package/dist/components/chat-input/input-info-alert.vue.d.ts +6 -0
  19. package/dist/components/chat-message/activity-message/activity-message.vue.d.ts +4 -1
  20. package/dist/components/chat-message/assistant-message/assistant-message.vue.d.ts +1 -1
  21. package/dist/components/chat-message/interrupt-message/index.d.ts +2 -0
  22. package/dist/components/chat-message/interrupt-message/interrupt-message.vue.d.ts +17 -0
  23. package/dist/components/chat-message/interrupt-message/tool-approval-card.vue.d.ts +9 -0
  24. package/dist/components/chat-message/interrupt-message/user-question/index.d.ts +5 -0
  25. package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +35 -0
  26. package/dist/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue.d.ts +25 -0
  27. package/dist/components/chat-message/interrupt-message/user-question/user-question-card.vue.d.ts +25 -0
  28. package/dist/components/chat-message/interrupt-message/user-question/user-question-choice.vue.d.ts +13 -0
  29. package/dist/components/chat-message/interrupt-message/user-question/user-question-option.vue.d.ts +17 -0
  30. package/dist/components/chat-message/message-container/message-container.vue.d.ts +14 -7
  31. package/dist/components/chat-message/message-render/message-render.vue.d.ts +4 -0
  32. package/dist/components/index.d.ts +3 -2
  33. package/dist/composables/use-global-config.d.ts +3 -0
  34. package/dist/composables/use-message-group.d.ts +2224 -355
  35. package/dist/icons/index.d.ts +1 -0
  36. package/dist/icons/interrupt.d.ts +24 -0
  37. package/dist/index.css +1 -1
  38. package/dist/index.js +2557 -1937
  39. package/dist/index.js.map +1 -1
  40. package/dist/lang/lang.d.ts +34 -2
  41. package/dist/mcp/generated/docs/activity-layout.md +138 -0
  42. package/dist/mcp/generated/docs/activity-message.md +21 -7
  43. package/dist/mcp/generated/docs/ai-image.md +9 -4
  44. package/dist/mcp/generated/docs/ai-loading.md +11 -6
  45. package/dist/mcp/generated/docs/ai-prompt-list.md +42 -0
  46. package/dist/mcp/generated/docs/ai-selection.md +10 -5
  47. package/dist/mcp/generated/docs/ai-slash-editor.md +43 -0
  48. package/dist/mcp/generated/docs/ai-slash-input.md +43 -0
  49. package/dist/mcp/generated/docs/ai-slash-menu.md +42 -0
  50. package/dist/mcp/generated/docs/animation-text.md +9 -4
  51. package/dist/mcp/generated/docs/assistant-message.md +10 -5
  52. package/dist/mcp/generated/docs/chat-container.md +173 -19
  53. package/dist/mcp/generated/docs/chat-input.md +78 -10
  54. package/dist/mcp/generated/docs/cite-content.md +8 -3
  55. package/dist/mcp/generated/docs/code-content.md +9 -4
  56. package/dist/mcp/generated/docs/common-error-content.md +10 -5
  57. package/dist/mcp/generated/docs/constants.md +68 -3
  58. package/dist/mcp/generated/docs/content-render.md +10 -5
  59. package/dist/mcp/generated/docs/delete-tool.md +9 -4
  60. package/dist/mcp/generated/docs/desc-panel.md +9 -4
  61. package/dist/mcp/generated/docs/detail-section.md +93 -0
  62. package/dist/mcp/generated/docs/execution-summary.md +10 -5
  63. package/dist/mcp/generated/docs/file-content.md +9 -4
  64. package/dist/mcp/generated/docs/file-upload-btn.md +10 -5
  65. package/dist/mcp/generated/docs/flow-agent-content.md +252 -0
  66. package/dist/mcp/generated/docs/flow-agent-node-detail.md +240 -0
  67. package/dist/mcp/generated/docs/highlight-keyword.md +10 -5
  68. package/dist/mcp/generated/docs/image-content.md +9 -4
  69. package/dist/mcp/generated/docs/image-preview-group.md +9 -4
  70. package/dist/mcp/generated/docs/image-preview.md +10 -5
  71. package/dist/mcp/generated/docs/info-message.md +7 -2
  72. package/dist/mcp/generated/docs/input-attachment.md +43 -0
  73. package/dist/mcp/generated/docs/input-info-alert.md +42 -0
  74. package/dist/mcp/generated/docs/interrupt-message.md +216 -0
  75. package/dist/mcp/generated/docs/interrupt.md +377 -0
  76. package/dist/mcp/generated/docs/key-value-content.md +9 -4
  77. package/dist/mcp/generated/docs/knowledge-rag-content.md +126 -0
  78. package/dist/mcp/generated/docs/latex-content.md +9 -4
  79. package/dist/mcp/generated/docs/loading-message.md +11 -6
  80. package/dist/mcp/generated/docs/markdown-container.md +1 -1
  81. package/dist/mcp/generated/docs/markdown-content.md +13 -8
  82. package/dist/mcp/generated/docs/markdown-latex.md +3 -3
  83. package/dist/mcp/generated/docs/markdown-mermaid.md +3 -3
  84. package/dist/mcp/generated/docs/mermaid-content.md +9 -4
  85. package/dist/mcp/generated/docs/message-container.md +74 -16
  86. package/dist/mcp/generated/docs/message-loading.md +120 -0
  87. package/dist/mcp/generated/docs/message-render.md +23 -11
  88. package/dist/mcp/generated/docs/message-tools.md +10 -5
  89. package/dist/mcp/generated/docs/messages.md +75 -11
  90. package/dist/mcp/generated/docs/overflow-tips.md +4 -4
  91. package/dist/mcp/generated/docs/preview-toolbar.md +42 -0
  92. package/dist/mcp/generated/docs/questions-container.md +88 -0
  93. package/dist/mcp/generated/docs/reasoning-message.md +10 -5
  94. package/dist/mcp/generated/docs/reference-content.md +10 -5
  95. package/dist/mcp/generated/docs/reference-doc-content.md +112 -0
  96. package/dist/mcp/generated/docs/schema.md +93 -0
  97. package/dist/mcp/generated/docs/scroll-btn.md +8 -3
  98. package/dist/mcp/generated/docs/selection-footer.md +9 -4
  99. package/dist/mcp/generated/docs/selection-question.md +91 -0
  100. package/dist/mcp/generated/docs/shortcut-btn.md +10 -5
  101. package/dist/mcp/generated/docs/shortcut-btns.md +10 -5
  102. package/dist/mcp/generated/docs/shortcut-render.md +10 -5
  103. package/dist/mcp/generated/docs/simple-table.md +103 -0
  104. package/dist/mcp/generated/docs/text-content.md +9 -4
  105. package/dist/mcp/generated/docs/theme.md +50 -4
  106. package/dist/mcp/generated/docs/tool-approval-card.md +164 -0
  107. package/dist/mcp/generated/docs/tool-btn.md +9 -4
  108. package/dist/mcp/generated/docs/tool-message.md +10 -5
  109. package/dist/mcp/generated/docs/toolcall-render.md +10 -5
  110. package/dist/mcp/generated/docs/use-animation-text.md +4 -4
  111. package/dist/mcp/generated/docs/use-clipboard.md +3 -3
  112. package/dist/mcp/generated/docs/use-command-selection.md +1 -1
  113. package/dist/mcp/generated/docs/use-custom-tab.md +1 -1
  114. package/dist/mcp/generated/docs/use-flow-node-actions.md +124 -0
  115. package/dist/mcp/generated/docs/use-full-screen.md +3 -3
  116. package/dist/mcp/generated/docs/use-global-config.md +20 -5
  117. package/dist/mcp/generated/docs/use-menu-keydown.md +1 -1
  118. package/dist/mcp/generated/docs/use-message-group.md +42 -10
  119. package/dist/mcp/generated/docs/use-observer-visible-list.md +1 -1
  120. package/dist/mcp/generated/docs/user-feedback.md +8 -3
  121. package/dist/mcp/generated/docs/user-message.md +18 -13
  122. package/dist/mcp/generated/docs/user-question-answered-card.md +106 -0
  123. package/dist/mcp/generated/docs/user-question-card.md +228 -0
  124. package/dist/mcp/generated/docs/user-question-choice.md +108 -0
  125. package/dist/mcp/generated/docs/user-question-option.md +42 -0
  126. package/dist/mcp/generated/docs/vnode-renderer.md +126 -0
  127. package/dist/mcp/generated/index.json +1105 -562
  128. package/dist/mcp/server.js +1 -1
  129. package/dist/mcp/server.js.map +1 -1
  130. package/dist/mcp/tools/list-components.d.ts +7 -6
  131. package/dist/mcp/tools/list-components.js +23 -29
  132. package/dist/mcp/tools/list-components.js.map +1 -1
  133. package/dist/mcp/tools/search-docs.js +1 -1
  134. package/dist/mcp/tools/search-docs.js.map +1 -1
  135. package/dist/mcp/utils/doc-loader.d.ts +1 -1
  136. package/dist/types/editor.d.ts +0 -1
  137. package/dist/utils/utils.d.ts +2 -2
  138. package/package.json +4 -3
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- ToolMessage 展示工具(Function Call)执行返回,内部用 DescPanel JSON 解析为 key-value 或纯文本。通常不单独使用: ToolcallRender 在 toolCall.toolMessage 有值时内联渲染;独立 role 为 tool 的消息由 MessageRender 统一渲染。核心关注 content 与 error
4
+ 渲染工具返回内容,JSON 场景交给 DescPanel 展示。 源码位置:src/components/chat-message/tool-message/tool-message.vue
5
5
 
6
6
  ### 关联组件
7
7
  - **assistant-message** — 结果常作为 assistant 消息中 toolCall.toolMessage 内联展示
@@ -12,8 +12,13 @@ ToolMessage 展示工具(Function Call)执行返回,内部用 DescPanel
12
12
  <!-- FULL DOC -->
13
13
 
14
14
  # ToolMessage 工具消息
15
+ ## 源码事实
15
16
 
16
- > **层级**:分子组件 · **功能域**:消息展示
17
+ - **源码位置**:`src/components/chat-message/tool-message/tool-message.vue`
18
+ - **能力域**:消息系统
19
+ - **能力说明**:渲染工具返回内容,JSON 场景交给 DescPanel 展示。
20
+
21
+ > **能力域**:消息系统
17
22
 
18
23
  工具(Function Call)执行结果展示组件。内部通过 `DescPanel` 渲染,标题固定为"返回内容",支持将 JSON 自动解析为 key-value 列表。
19
24
 
@@ -212,6 +217,6 @@ interface ToolMessage {
212
217
 
213
218
  ## 关联组件
214
219
 
215
- - [AssistantMessage](./assistant-message.md) — toolCall.toolMessage 内联场景
216
- - [MessageRender](./message-render.md) — 独立 tool 消息派发
217
- - [DescPanel](../atomic/desc-panel.md) — 返回内容面板
220
+ - [AssistantMessage](/components/message/assistant-message) — toolCall.toolMessage 内联场景
221
+ - [MessageRender](/components/message/message-render) — 独立 tool 消息派发
222
+ - [DescPanel](/components/rendering/desc-panel) — 返回内容面板
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- ToolcallRender 折叠展示一次工具/MCP 调用:头部显示名称、状态色、耗时与 MCP 标识,展开区展示参数与返回。 内部组合 DescPanel 与 HighlightKeyword;可在详情底部内联 ToolMessage 结果。
4
+ 渲染 assistant toolCalls,展示工具调用状态、参数和结果。 源码位置:src/components/tool-call/toolcall-render/toolcall-render.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **desc-panel** — 详情区展示参数与描述文本
@@ -12,8 +12,13 @@ ToolcallRender 折叠展示一次工具/MCP 调用:头部显示名称、状态
12
12
  <!-- FULL DOC -->
13
13
 
14
14
  # ToolcallRender 工具调用渲染器
15
+ ## 源码事实
15
16
 
16
- > **层级**:分子组件 · **功能域**:工具与反馈
17
+ - **源码位置**:`src/components/tool-call/toolcall-render/toolcall-render.vue`
18
+ - **能力域**:Agent 能力
19
+ - **能力说明**:渲染 assistant toolCalls,展示工具调用状态、参数和结果。
20
+
21
+ > **能力域**:Agent 能力
17
22
 
18
23
  展示 AI 调用外部工具/函数过程与结果的渲染组件。由**可折叠头部**和**详情面板**组成,根据 `status` 自动切换颜色和状态文案,支持 MCP 调用识别和内联结果展示。
19
24
 
@@ -294,6 +299,6 @@ interface ToolMessage {
294
299
 
295
300
  ## 关联组件
296
301
 
297
- - [DescPanel](../atomic/desc-panel.md) — 描述与参数面板
298
- - [HighlightKeyword](../atomic/highlight-keyword.md) — 标题高亮
299
- - [ToolMessage](./tool-message.md) — 内联工具返回
302
+ - [DescPanel](/components/rendering/desc-panel) — 描述与参数面板
303
+ - [HighlightKeyword](/components/helper/highlight-keyword) — 标题高亮
304
+ - [ToolMessage](/components/message/tool-message) — 内联工具返回
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- useAnimationText 接收 MaybeRef<string> 与可选 AnimationConfig(fadeDuration、easing),返回 chunks 与 animationStyle。 监听文本变化:前缀追加则增量拆分为新 chunk 并触发动画,否则重置为单 chunk,适合流式输出逐段淡入。 全局样式已含 ai-markdown-fade-in。AnimationText 原子组件内部封装同一逻辑。
4
+ useAnimationText 接收 MaybeRef<string> 与可选 AnimationConfig(fadeDuration、easing),返回 chunks 与 animationStyle。 监听文本变化:前缀追加则增量拆分为新 chunk 并触发动画,否则重置为单 chunk,适合流式输出逐段淡入。 全局样式已含 ai-markdown-fade-in。AnimationText 组件内部封装同一逻辑。
5
5
 
6
6
  ### 关联组件
7
7
  - **animation-text** — 封装 chunks 与样式渲染
@@ -126,7 +126,7 @@ useAnimationText 接收 MaybeRef<string> 与可选 AnimationConfig(fadeDuratio
126
126
  </script>
127
127
  ```
128
128
 
129
- > 详见 [AnimationText 组件文档](/components/atomic/animation-text)。
129
+ > 详见 [AnimationText 组件文档](/components/rendering/animation-text)。
130
130
 
131
131
  ## API
132
132
 
@@ -194,5 +194,5 @@ function useAnimationText(
194
194
 
195
195
  ## 关联组件
196
196
 
197
- - [AnimationText](../components/atomic/animation-text.md) — 默认封装组件
198
- - [MarkdownContent](../components/atomic/markdown-content.md) — 富文本流式展示场景。
197
+ - [AnimationText](../components/rendering/animation-text) — 默认封装组件
198
+ - [MarkdownContent](../components/rendering/markdown-content) — 富文本流式展示场景。
@@ -201,6 +201,6 @@ export const useClipboard = () => {
201
201
 
202
202
  ## 关联组件
203
203
 
204
- - [CodeContent](../components/atomic/code-content.md) — 代码块复制
205
- - [MessageContainer](../components/molecular/message-container.md) — 助手消息复制
206
- - [UserMessage](../components/molecular/user-message.md) — 用户消息复制
204
+ - [CodeContent](../components/rendering/code-content) — 代码块复制
205
+ - [MessageContainer](../components/setup/message-container) — 助手消息复制
206
+ - [UserMessage](../components/message/user-message) — 用户消息复制
@@ -148,4 +148,4 @@ export const useCommandSelection = () => {
148
148
 
149
149
  ## 关联组件
150
150
 
151
- - [ChatInput](../components/molecular/chat-input.md) — AiSlashInput 子模块使用
151
+ - [ChatInput](../components/input/chat-input) — AiSlashInput 子模块使用
@@ -124,4 +124,4 @@ interface CustomTab<T = Record<string, unknown>> {
124
124
 
125
125
  ## 关联组件
126
126
 
127
- - [ChatContainer](../components/molecular/chat-container.md) — 侧栏 Tab 与自定义面板
127
+ - [ChatContainer](../components/setup/chat-container) — 侧栏 Tab 与自定义面板
@@ -0,0 +1,124 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions(task, node)。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击 resume 时不传 interrupt。
5
+
6
+ ### 关联组件
7
+ - **flow-agent-content** — FlowAgentContent 内部消费,驱动节点行尾按钮组渲染
8
+
9
+ ---
10
+ <!-- FULL DOC -->
11
+
12
+ # useFlowNodeActions 节点行尾操作
13
+
14
+ > **分类**:composable
15
+
16
+ 将 FlowAgent 节点行尾的「详情(打开侧栏)」与「重试 / 跳过(回传 Agent resume)」聚合为统一的声明式操作列表。`FlowAgentContent` 只需遍历 `getNodeActions` 返回值渲染按钮,显隐与点击行为均收敛于此 composable。
17
+
18
+ 源码:`src/components/chat-content/flow-agent-content/use-flow-node-actions.ts`
19
+
20
+ ## 函数签名
21
+
22
+ ```typescript
23
+ function useFlowNodeActions(options: {
24
+ /** resume 回调(与第三方审批取消同一回调,按 payload.operation 分流) */
25
+ onInterruptResume: Ref<OnInterruptResume | undefined>;
26
+ /** 打开节点详情侧栏(复用 useFlowTab 的能力) */
27
+ openNodeDetail: (task: BkFlowTask, node: BkFlowNode) => void;
28
+ }): {
29
+ getNodeActions: (task: FlowTaskVM, node: FlowNodeVM) => FlowNodeActionVM[];
30
+ };
31
+ ```
32
+
33
+ ## 返回值:FlowNodeActionVM
34
+
35
+ ```typescript
36
+ type FlowNodeActionId =
37
+ | 'detail'
38
+ | InterruptResumeOperation.FlowNodeRetry
39
+ | InterruptResumeOperation.FlowNodeSkip;
40
+
41
+ interface FlowNodeActionVM {
42
+ icon: Component;
43
+ id: FlowNodeActionId;
44
+ label: string;
45
+ run: () => void;
46
+ }
47
+ ```
48
+
49
+ | 字段 | 说明 |
50
+ | ------- | ------------------------------ |
51
+ | `icon` | 按钮图标组件 |
52
+ | `id` | 唯一标识,用于 `v-for` key |
53
+ | `label` | 国际化文案 |
54
+ | `run` | 点击执行(详情或 resume) |
55
+
56
+ ## 操作显隐规则
57
+
58
+ | 操作 | `id` | 显隐条件 | 点击行为 |
59
+ | ---- | ------------------ | ------------------------------------------ | --------------------------------------------- |
60
+ | 重试 | `flow_node_retry` | `convergedState === 'failed'` 且 `retryable` | 调用 `onInterruptResume`,**不传** `interrupt` |
61
+ | 跳过 | `flow_node_skip` | `convergedState === 'failed'` 且 `skippable` | 同上 |
62
+ | 详情 | `detail` | 始终(Share 模式由上层组件隐藏整组) | 调用 `openNodeDetail(task.raw, node.raw)` |
63
+
64
+ 展示顺序:重试 → 跳过 → 详情。
65
+
66
+ ## resume 负载格式
67
+
68
+ ```typescript
69
+ // 重试
70
+ onInterruptResume?.({
71
+ operation: InterruptResumeOperation.FlowNodeRetry,
72
+ payload: { node_id: node.id, task_id: task.task_id },
73
+ });
74
+
75
+ // 跳过
76
+ onInterruptResume?.({
77
+ operation: InterruptResumeOperation.FlowNodeSkip,
78
+ payload: { node_id: node.id, task_id: task.task_id },
79
+ });
80
+ ```
81
+
82
+ ## 使用示例
83
+
84
+ `FlowAgentContent` 内部用法(业务侧通常通过 `MessageRender` 传入 `onInterruptResume`,无需直接调用本 composable):
85
+
86
+ ```typescript
87
+ import { toRef } from 'vue';
88
+ import { useFlowNodeActions } from '@blueking/chat-x';
89
+ // 或相对路径:'./use-flow-node-actions'
90
+
91
+ const { getNodeActions } = useFlowNodeActions({
92
+ onInterruptResume: toRef(props, 'onInterruptResume'),
93
+ openNodeDetail,
94
+ });
95
+
96
+ // 模板中
97
+ // v-for="action in getNodeActions(task, node)" :key="action.id"
98
+ // @click.stop="action.run()"
99
+ ```
100
+
101
+ ## 扩展新操作
102
+
103
+ 在 `RESUME_ACTION_DEFS` 注册表中追加一项即可,需声明 `visible` 与 `operation` 枚举:
104
+
105
+ ```typescript
106
+ const RESUME_ACTION_DEFS: FlowNodeResumeActionDef[] = [
107
+ // 现有:重试、跳过
108
+ {
109
+ icon: MyIcon,
110
+ id: InterruptResumeOperation.MyNewOp, // 需先在 InterruptResumeOperation 扩展
111
+ label: () => t('新操作'),
112
+ visible: node => /* 自定义显隐 */,
113
+ },
114
+ ];
115
+ ```
116
+
117
+ 同时在 `interrupt.ts` 扩展 `InterruptResumeOperation` 与 `FlowNodeResume` 联合类型。
118
+
119
+ ## 关联文档
120
+
121
+ - [FlowAgentContent 执行内容](/components/agent/flow-agent-content) — 消费方组件
122
+ - [中断类型 Interrupt](/types/interrupt) — `InterruptResumeOperation`、`FlowNodeResume`、`OnInterruptResume`
123
+ - [ActivityMessage 活动消息](/components/message/activity-message) — `onInterruptResume` 透传链路
124
+ - [MessageRender 消息渲染器](/components/message/message-render) — 顶层透传入口
@@ -65,7 +65,7 @@ useFullScreen(target?)
65
65
 
66
66
  `ChatContainer` 将侧栏包裹在 `.ai-full-screen-wrapper` 中,通过 `useFullScreen(fullScreenRef)` 控制侧栏全屏;Tab 栏 `#setting` 插槽内的 `ToolBtn` 使用自定义插槽渲染 `FullScreenIcon` / `UnFullScreenIcon`。
67
67
 
68
- 详见 [ChatContainer 侧栏全屏](../components/molecular/chat-container.md#侧栏全屏)。
68
+ 详见 [ChatContainer 侧栏全屏](../components/setup/chat-container.md#侧栏全屏)。
69
69
 
70
70
  ## API
71
71
 
@@ -110,5 +110,5 @@ declare function useFullScreen(target?: MaybeRef<HTMLElement | null>): UseFullSc
110
110
 
111
111
  ## 关联组件
112
112
 
113
- - [ChatContainer](../components/molecular/chat-container.md) — 内置侧栏全屏按钮
114
- - [ToolBtn](../components/atomic/tool-btn.md) — 全屏按钮自定义插槽
113
+ - [ChatContainer](../components/setup/chat-container.md) — 内置侧栏全屏按钮
114
+ - [ToolBtn](../components/feedback/tool-btn.md) — 全屏按钮自定义插槽
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- useGlobalConfig 接收 GlobalConfig(含 supportUpload: ComputedRef<boolean>),以 GLOBAL_CONFIG_TOKEN provide 给后代; injectGlobalConfig 在子组件中取出配置,无 Provider 时返回 undefined。ChatContainer 在 setup 中调用 useGlobalConfig; UserMessage 等通过 injectGlobalConfig 读取 supportUpload。
4
+ useGlobalConfig 接收 GlobalConfig(含 size?: ComputedRef<AiSizeMode>、supportUpload: ComputedRef<boolean>),以 GLOBAL_CONFIG_TOKEN provide 给后代; injectGlobalConfig 在子组件中取出配置,无 Provider 时返回 undefined。ChatContainer 在 setup 中调用 useGlobalConfig 注入 size 与 supportUpload后代组件可通过 injectGlobalConfig 读取配置;字号主题主要通过根节点 data-ai-size 与 CSS 变量生效。
5
5
 
6
6
  ### 关联组件
7
7
  - **chat-container** — 根容器调用 useGlobalConfig 注入 supportUpload
@@ -13,14 +13,20 @@ useGlobalConfig 接收 GlobalConfig(含 supportUpload: ComputedRef<boolean>)
13
13
 
14
14
  > **分类**:composable
15
15
 
16
- 在聊天容器根组件与子组件之间通过 Vue `provide` / `inject` 共享**全局展示相关配置**(当前主要为是否支持上传 `supportUpload`)。与 Teleport 插槽 ID 无关。
16
+ 在聊天容器根组件与子组件之间通过 Vue `provide` / `inject` 共享**全局展示相关配置**(当前包括字号主题档位 `size`、是否支持上传 `supportUpload`)。与 Teleport 插槽 ID 无关。
17
+
18
+ > 字号主题主要通过 `ChatContainer` 根节点的 `data-ai-size` 与 CSS 变量(`--ai-font-size` 等)生效;`GlobalConfig.size` 供后代在逻辑层读取当前档位,样式层无需逐组件传参。
17
19
 
18
20
  ## 工作原理
19
21
 
20
22
  ```
21
23
  ChatContainer(根)
22
- ├── useGlobalConfig({ supportUpload: computed(() => props.supportUpload ?? false) })
23
- │ └── provide(GLOBAL_CONFIG_TOKEN, { supportUpload })
24
+ ├── :data-ai-size="size"(CSS 变量作用域)
25
+ ├── useGlobalConfig({
26
+ │ size: computed(() => props.size ?? 'small'),
27
+ │ supportUpload: computed(() => props.supportUpload ?? false),
28
+ │ })
29
+ │ └── provide(GLOBAL_CONFIG_TOKEN, { size, supportUpload })
24
30
 
25
31
  └── MessageContainer → … → UserMessage 等
26
32
 
@@ -43,10 +49,12 @@ UserMessage(后代)
43
49
  import { useGlobalConfig } from '@blueking/chat-x';
44
50
 
45
51
  const props = defineProps<{
52
+ size?: 'normal' | 'small';
46
53
  supportUpload?: boolean;
47
54
  }>();
48
55
 
49
56
  useGlobalConfig({
57
+ size: computed(() => props.size ?? 'small'),
50
58
  supportUpload: computed(() => props.supportUpload ?? false),
51
59
  });
52
60
  </script>
@@ -75,11 +83,15 @@ import type { ComputedRef } from 'vue';
75
83
 
76
84
  export const GLOBAL_CONFIG_TOKEN: unique symbol;
77
85
 
86
+ export type AiSizeMode = 'normal' | 'small';
87
+
78
88
  export type GlobalConfig = {
89
+ size?: ComputedRef<AiSizeMode>;
79
90
  supportUpload: ComputedRef<boolean>;
80
91
  };
81
92
 
82
93
  export function useGlobalConfig(options: GlobalConfig): {
94
+ size?: ComputedRef<AiSizeMode>;
83
95
  supportUpload: ComputedRef<boolean>;
84
96
  };
85
97
 
@@ -96,12 +108,14 @@ export function injectGlobalConfig(): GlobalConfig | undefined;
96
108
 
97
109
  | 字段 | 说明 |
98
110
  | --------------- | ------------------------------------------------------------------------ |
111
+ | `size` | 可选。字号主题档位 `normal`(14px)/ `small`(12px),与 `ChatContainer.size` 对齐 |
99
112
  | `supportUpload` | 是否支持上传,与根容器 `ChatContainer` 的 `supportUpload` 等展示策略对齐 |
100
113
 
101
114
  ### `useGlobalConfig(options)`
102
115
 
103
116
  | 参数 | 说明 |
104
117
  | ----------------------- | ------------------------------------------------------------------------------------- |
118
+ | `options.size` | 可选。字号主题档位,建议使用 `computed(() => props.size ?? 'small')` 与根 props 同步 |
105
119
  | `options.supportUpload` | 是否支持上传,建议使用 `computed(() => props.supportUpload ?? false)` 与根 props 同步 |
106
120
 
107
121
  - 调用后立即 `provide(GLOBAL_CONFIG_TOKEN, options)`。
@@ -122,4 +136,5 @@ export function injectGlobalConfig(): GlobalConfig | undefined;
122
136
 
123
137
  ## 关联组件
124
138
 
125
- - [ChatContainer](../components/molecular/chat-container.md) — 调用 `useGlobalConfig` 注入 `supportUpload`
139
+ - [ChatContainer](../components/setup/chat-container) — 调用 `useGlobalConfig` 注入 `size` 与 `supportUpload`
140
+ - [主题配置](../theme/theme) — `data-ai-size` 与 CSS 变量说明
@@ -161,4 +161,4 @@ useMenuKeydown<T>(props: {
161
161
 
162
162
  ## 关联组件
163
163
 
164
- - [ChatInput](../components/molecular/chat-input.md) — `@` 菜单与 `/` 提示词列表
164
+ - [ChatInput](../components/input/chat-input) — `@` 菜单与 `/` 提示词列表
@@ -23,10 +23,13 @@ useMessageGroup 接收 keyword、messages、selectedUserMessages,通过 watchE
23
23
  function useMessageGroup(options: {
24
24
  keyword?: ShallowRef<string>;
25
25
  messages: ComputedRef<Message[]>;
26
+ renderMode?: MaybeRef<RenderMode>;
26
27
  selectedUserMessages: Ref<Message[] | undefined>;
27
28
  }): {
28
29
  messageGroups: Ref<MessageGroup[]>;
29
30
  executionGroups: ComputedRef<MessageGroup[]>;
31
+ pendingApprovalCount: ComputedRef<number>;
32
+ pendingApprovalTipText: ComputedRef<string>;
30
33
  isShareMode: ShallowRef<boolean>;
31
34
  isAllSelected: ComputedRef<boolean>;
32
35
  onToggleShareAll: (isAllSelected: boolean) => void;
@@ -57,7 +60,7 @@ role=user role=tool 其他 role
57
60
  成组 后 continue
58
61
 
59
62
  ④ 遍历结束后将剩余 assistantMessages 推入 list
60
- ⑤ 末尾为 user 消息 → 追加 Loading 消息组
63
+ ⑤ 末尾为 user 消息 → 追加 Loading 消息组(`renderMode` 为 `Share` 时不追加)
61
64
  ```
62
65
 
63
66
  注入的占位 Loading 消息使用固定 id:`LOADING_MESSAGE_ID`(`'__loading__'`,定义于 `common/constants`)。`ChatContainer` 据此判断是否在「请求中」阶段,并向 `ChatInput` / `MessageContainer` 下传 `MessageStatus.Fetching`,与流式中的停止、防重复发送行为对齐。
@@ -113,6 +116,24 @@ const isExecutionMessage = (m: Message): boolean => {
113
116
  | toolCall | `function.name`、`mcpName`、`description`、`arguments`、`id` |
114
117
  | flow_agent | 各任务 `task_name`、各节点 `name` |
115
118
 
119
+ ## 待审批统计
120
+
121
+ `useMessageGroup` 会统计消息列表中处于待审批状态的 AI Dev 审批中断:
122
+
123
+ ```typescript
124
+ const pendingApprovalStatusSet = new Set([APPROVAL_STATUS.PENDING, APPROVAL_STATUS.DRAFT]);
125
+ ```
126
+
127
+ 当 `MessageRole.Interrupt` 消息的 `content.outcome.type === 'interrupt'`,且其中断项满足 `reason === InterruptReason.AIDevToolApproval`、`metadata.ticket.status` 为 `pending` 或 `draft` 时,计入 `pendingApprovalCount`。
128
+
129
+ `pendingApprovalTipText` 根据数量生成输入区提示文案:
130
+
131
+ ```typescript
132
+ '当前会话有 {count} 个待审批单,如需继续,请先取消审批'
133
+ ```
134
+
135
+ `ChatContainer` 会消费该返回值,向 `ChatInput` 传入 `sendDisabledTip` 并在输入区上方展示提示,从而阻止继续发送。
136
+
116
137
  ## 分享模式
117
138
 
118
139
  `useMessageGroup` 提供完整的分享模式支持:
@@ -142,12 +163,21 @@ const keyword = shallowRef('');
142
163
  const messages = computed(() => props.messages);
143
164
  const selectedUserMessages = deepRef<Message[]>([]);
144
165
 
145
- const { messageGroups, executionGroups, isShareMode, isAllSelected, onToggleShareAll, onCancelShare, onConfirmShare } =
146
- useMessageGroup({
147
- keyword,
148
- messages,
149
- selectedUserMessages,
150
- });
166
+ const {
167
+ messageGroups,
168
+ executionGroups,
169
+ pendingApprovalCount,
170
+ pendingApprovalTipText,
171
+ isShareMode,
172
+ isAllSelected,
173
+ onToggleShareAll,
174
+ onCancelShare,
175
+ onConfirmShare,
176
+ } = useMessageGroup({
177
+ keyword,
178
+ messages,
179
+ selectedUserMessages,
180
+ });
151
181
  ```
152
182
 
153
183
  ## 返回值说明
@@ -156,6 +186,8 @@ const { messageGroups, executionGroups, isShareMode, isAllSelected, onToggleShar
156
186
  | ---------------- | ----------------------------- | --------------------------------------------------------------------------- |
157
187
  | messageGroups | `Ref<MessageGroup[]>` | 完整消息分组列表 |
158
188
  | executionGroups | `ComputedRef<MessageGroup[]>` | 仅包含执行类消息的分组(工具调用 + FlowAgent),自动提取 `userMessageTitle` |
189
+ | pendingApprovalCount | `ComputedRef<number>` | 当前消息中待审批 AI Dev 审批中断的数量 |
190
+ | pendingApprovalTipText | `ComputedRef<string>` | 待审批阻塞发送提示文案;无待审批时为空字符串 |
159
191
  | isShareMode | `ShallowRef<boolean>` | 是否处于分享模式 |
160
192
  | isAllSelected | `ComputedRef<boolean>` | 所有用户消息组是否全部选中 |
161
193
  | onToggleShareAll | `(checked: boolean) => void` | 切换全选 |
@@ -181,6 +213,6 @@ interface MessageGroup {
181
213
 
182
214
  ## 关联组件
183
215
 
184
- - [ChatContainer](../components/molecular/chat-container.md) — 调用 useMessageGroup 并下传分组
185
- - [MessageContainer](../components/molecular/message-container.md) — 渲染 messageGroups
186
- - [ExecutionSummary](../components/molecular/execution-summary.md) — 消费 executionGroups
216
+ - [ChatContainer](../components/setup/chat-container) — 调用 useMessageGroup 并下传分组
217
+ - [MessageContainer](../components/setup/message-container) — 渲染 messageGroups
218
+ - [ExecutionSummary](../components/agent/execution-summary) — 消费 executionGroups
@@ -186,4 +186,4 @@ function useObserverVisibleList<T>(
186
186
 
187
187
  ## 关联组件
188
188
 
189
- - [ShortcutBtns](../components/atomic/shortcut-btns.md) — 快捷指令条与「更多」
189
+ - [ShortcutBtns](../components/input/shortcut-btns.md) — 快捷指令条与「更多」
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- UserFeedback 在点赞或踩之后展示原因收集面板:多选预设标签、补充说明与异步加载原因列表(骨架屏)。 由 MessageTools 在 like/unlike 流程中挂载,提交后向父级回传原因列表与备注。
4
+ 用户反馈弹层,提交踩/反馈原因。 源码位置:src/components/message-tools/user-feedback/user-feedback.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **message-tools** — 点赞/踩操作触发并收集反馈
@@ -10,8 +10,13 @@ UserFeedback 在点赞或踩之后展示原因收集面板:多选预设标签
10
10
  <!-- FULL DOC -->
11
11
 
12
12
  # MessageUserFeedback 用户反馈
13
+ ## 源码事实
13
14
 
14
- > **层级**:分子组件 · **功能域**:工具与反馈
15
+ - **源码位置**:`src/components/message-tools/user-feedback/user-feedback.vue`
16
+ - **能力域**:工具与反馈
17
+ - **能力说明**:用户反馈弹层,提交踩/反馈原因。
18
+
19
+ > **能力域**:工具与反馈
15
20
 
16
21
  AI 消息点赞/踩后收集用户具体反馈原因的弹出面板。支持多选预设原因标签、补充文字说明(textarea)、异步加载原因列表(骨架屏)。
17
22
 
@@ -226,4 +231,4 @@ loading=false,展示原因标签列表
226
231
 
227
232
  ## 关联组件
228
233
 
229
- - [MessageTools](./message-tools.md) — 点赞/踩入口与反馈联动
234
+ - [MessageTools](/components/feedback/message-tools) — 点赞/踩入口与反馈联动
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构化引用、快捷指令与内联编辑。需处理 onAction、onInputConfirm、 onShortcutConfirm 等回调;messageToolsStatus 控制工具栏。由 MessageRender 在 user 角色下使用,常与多选联动。
4
+ 渲染用户消息,支持文本、键值、Markdown、引用、文件和编辑态输入。 源码位置:src/components/chat-message/user-message/user-message.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **message-render** — 由 MessageRender 在 role 为 user 时创建
@@ -12,8 +12,13 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
12
12
  <!-- FULL DOC -->
13
13
 
14
14
  # UserMessage 用户消息
15
+ ## 源码事实
15
16
 
16
- > **层级**:分子组件 · **功能域**:消息展示
17
+ - **源码位置**:`src/components/chat-message/user-message/user-message.vue`
18
+ - **能力域**:消息系统
19
+ - **能力说明**:渲染用户消息,支持文本、键值、Markdown、引用、文件和编辑态输入。
20
+
21
+ > **能力域**:消息系统
17
22
 
18
23
  用户消息展示组件,右对齐显示用户发送的消息内容。支持纯文本、多媒体(图片/文件)、文本引用、结构化引用、快捷指令等多种内容形式,以及消息的内联编辑功能。
19
24
 
@@ -34,7 +39,7 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
34
39
 
35
40
  ├── .ai-user-message-content(气泡:bg #e1ecff,padding 8×12,border-radius 4px)
36
41
  │ v-if: cite 为数组 → KeyValueContent(title + key/value 列表)
37
- │ v-else-if: content → TextContent × N(textParts 中每个文本片段一个实例)
42
+ │ v-else-if: content → MarkdownContent × N(每个 text 项一个实例)
38
43
 
39
44
  └── MessageTools(.ai-user-message-tools)
40
45
  v-if: messageToolsStatus !== 'hidden'
@@ -53,7 +58,7 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
53
58
  │ @submit(formModel) → onShortcutConfirm(formModel) + isEdit=false
54
59
 
55
60
  └── ChatInput(v-else,带自定义 #send-icon slot)
56
- v-model: editContent(取 textParts[0],即第一个文本片段)
61
+ v-model: editContent(仅含文本内容,数组时取第一个 text 项)
57
62
  defaultUploadFiles: binaryFiles
58
63
  #send-icon slot → .user-edit-footer
59
64
  Button "取消" → isEdit=false
@@ -62,7 +67,7 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
62
67
 
63
68
  ## 基础用法
64
69
 
65
- `content` 为字符串时,通过 `TextContent` 渲染(内部使用 `MarkdownContent`,支持 Markdown 语法)。
70
+ `content` 为字符串时,通过 `MarkdownContent` 渲染(支持 Markdown 语法)。
66
71
 
67
72
  ```vue
68
73
  <template>
@@ -92,7 +97,7 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
92
97
  - **图片文件**(`binaryImageFiles`):判断 `url` 存在或 `mimeType` / `file.type` 以 `image/` 开头的文件,统一放入一个 `FileContent`(`readonly=true`)中渲染,支持点击缩略图全屏预览
93
98
  - **非图片文件**(`binaryNonImageFiles`):每个文件单独渲染在 `FileContent`(`readonly=true`)中
94
99
 
95
- `text` 项经 `textParts` 计算属性统一为 `string[]`,按顺序各渲染一个 `TextContent`。
100
+ `text` 项按顺序各渲染一个 `MarkdownContent`。
96
101
 
97
102
  ```vue
98
103
  <script setup lang="ts">
@@ -223,12 +228,12 @@ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构
223
228
  **`editContent` 的初始化逻辑**(仅文本部分,二进制文件通过 `defaultUploadFiles` 恢复):
224
229
 
225
230
  ```
226
- textParts 有值 → editContent = textParts[0](取第一个文本片段)
227
- binaryFiles 有值进入编辑模式(editContent 可为空)
231
+ content 为 string → editContent = content
232
+ textContent string → editContent = textContent
233
+ textContent 为 array → editContent = textContent[0]?.text(取第一个文本项)
234
+ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
228
235
  ```
229
236
 
230
- `textParts` 由 `content` 统一计算:`string` 转为单元素数组,`InputContent[]` 则过滤出 `type: 'text'` 且非空的项并映射为 `string[]`。
231
-
232
237
  ```vue
233
238
  <template>
234
239
  <UserMessage
@@ -346,6 +351,6 @@ interface MessageExtra {
346
351
 
347
352
  ## 关联组件
348
353
 
349
- - [MessageRender](./message-render.md) — user 角色由其实例化
350
- - [MessageTools](./message-tools.md) — 工具栏交互
351
- - [MessageContainer](./message-container.md) — 列表与多选容器
354
+ - [MessageRender](/components/message/message-render) — user 角色由其实例化
355
+ - [MessageTools](/components/feedback/message-tools) — 工具栏交互
356
+ - [MessageContainer](/components/setup/message-container) — 列表与多选容器