@blueking/chat-x 0.0.43 → 0.0.45-beta.2

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 (149) 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 +0 -3
  4. package/dist/ag-ui/types/index.d.ts +2 -0
  5. package/dist/ag-ui/types/interrupt.d.ts +107 -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-buttons/tool-btn/tool-btn.vue.d.ts +1 -11
  9. package/dist/components/ai-questions/questions-container.vue.d.ts +3 -0
  10. package/dist/components/ai-questions/selection-question.vue.d.ts +3 -0
  11. package/dist/components/chat-content/flow-agent-content/flow-agent-content.vue.d.ts +0 -1
  12. package/dist/components/chat-content/flow-agent-content/flow-agent-node-detail.vue.d.ts +0 -2
  13. package/dist/components/chat-content/index.d.ts +2 -0
  14. package/dist/components/chat-input/ai-slash-input/ai-slash-input.vue.d.ts +1 -3
  15. package/dist/components/chat-input/chat-input.vue.d.ts +10 -9
  16. package/dist/components/chat-input/input-attachment/input-attachment.vue.d.ts +1 -0
  17. package/dist/components/chat-input/{ai-slash-input/ai-skill-list/ai-skill-list.vue.d.ts → input-info-alert.vue.d.ts} +1 -3
  18. package/dist/components/chat-message/interrupt-message/index.d.ts +2 -0
  19. package/dist/components/chat-message/interrupt-message/interrupt-message.vue.d.ts +17 -0
  20. package/dist/components/chat-message/interrupt-message/tool-approval-card.vue.d.ts +8 -0
  21. package/dist/components/chat-message/interrupt-message/user-question/index.d.ts +5 -0
  22. package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +35 -0
  23. package/dist/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue.d.ts +25 -0
  24. package/dist/components/chat-message/interrupt-message/user-question/user-question-card.vue.d.ts +25 -0
  25. package/dist/components/chat-message/interrupt-message/user-question/user-question-choice.vue.d.ts +13 -0
  26. package/dist/components/chat-message/interrupt-message/user-question/user-question-option.vue.d.ts +17 -0
  27. package/dist/components/chat-message/message-container/message-container.vue.d.ts +14 -7
  28. package/dist/components/chat-message/message-render/message-render.vue.d.ts +4 -0
  29. package/dist/components/index.d.ts +3 -5
  30. package/dist/composables/index.d.ts +0 -1
  31. package/dist/composables/use-common.d.ts +1 -1
  32. package/dist/composables/use-custom-tab.d.ts +1 -1
  33. package/dist/composables/use-message-group.d.ts +2004 -227
  34. package/dist/icons/execution.d.ts +0 -3
  35. package/dist/icons/index.d.ts +1 -1
  36. package/dist/icons/interrupt.d.ts +24 -0
  37. package/dist/index.css +1 -1
  38. package/dist/index.js +5059 -4674
  39. package/dist/index.js.map +1 -1
  40. package/dist/lang/lang.d.ts +33 -5
  41. package/dist/mcp/generated/docs/activity-layout.md +138 -0
  42. package/dist/mcp/generated/docs/activity-message.md +18 -28
  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 +144 -93
  53. package/dist/mcp/generated/docs/chat-input.md +45 -9
  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 +11 -6
  65. package/dist/mcp/generated/docs/flow-agent-content.md +212 -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 +204 -0
  75. package/dist/mcp/generated/docs/interrupt.md +282 -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 -31
  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 +70 -12
  86. package/dist/mcp/generated/docs/message-loading.md +120 -0
  87. package/dist/mcp/generated/docs/message-render.md +21 -9
  88. package/dist/mcp/generated/docs/message-tools.md +13 -8
  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 +11 -10
  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 +3 -3
  106. package/dist/mcp/generated/docs/tool-approval-card.md +148 -0
  107. package/dist/mcp/generated/docs/tool-btn.md +15 -41
  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-global-config.md +1 -1
  115. package/dist/mcp/generated/docs/use-menu-keydown.md +1 -1
  116. package/dist/mcp/generated/docs/use-message-group.md +40 -9
  117. package/dist/mcp/generated/docs/use-observer-visible-list.md +1 -1
  118. package/dist/mcp/generated/docs/user-feedback.md +8 -3
  119. package/dist/mcp/generated/docs/user-message.md +10 -5
  120. package/dist/mcp/generated/docs/user-question-answered-card.md +106 -0
  121. package/dist/mcp/generated/docs/user-question-card.md +211 -0
  122. package/dist/mcp/generated/docs/user-question-choice.md +108 -0
  123. package/dist/mcp/generated/docs/user-question-option.md +42 -0
  124. package/dist/mcp/generated/docs/vnode-renderer.md +126 -0
  125. package/dist/mcp/generated/index.json +1062 -551
  126. package/dist/mcp/index.js +0 -0
  127. package/dist/mcp/server.js +1 -1
  128. package/dist/mcp/server.js.map +1 -1
  129. package/dist/mcp/tools/list-components.d.ts +7 -6
  130. package/dist/mcp/tools/list-components.js +23 -29
  131. package/dist/mcp/tools/list-components.js.map +1 -1
  132. package/dist/mcp/tools/search-docs.js +1 -1
  133. package/dist/mcp/tools/search-docs.js.map +1 -1
  134. package/dist/mcp/utils/doc-loader.d.ts +1 -1
  135. package/dist/plugins/index.d.ts +0 -1
  136. package/dist/types/custom.d.ts +0 -1
  137. package/dist/types/editor.d.ts +0 -6
  138. package/dist/types/input.d.ts +1 -1
  139. package/dist/types/tool.d.ts +3 -3
  140. package/dist/utils/index.d.ts +0 -1
  141. package/dist/utils/utils.d.ts +0 -1
  142. package/package.json +23 -21
  143. package/dist/components/chat-content/flow-agent-content/flow-agent-state.d.ts +0 -34
  144. package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +0 -47
  145. package/dist/components/chat-content/flow-agent-content/use-flow-tab.d.ts +0 -18
  146. package/dist/composables/use-full-screen.d.ts +0 -17
  147. package/dist/icons/screen.d.ts +0 -6
  148. package/dist/mcp/generated/docs/use-full-screen.md +0 -114
  149. package/dist/plugins/markdown-bk-inline-style.d.ts +0 -20
@@ -0,0 +1,240 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ 展示 FlowAgent 节点输入、输出、异常、耗时等详情。 源码位置:src/components/chat-content/flow-agent-content/flow-agent-node-detail.vue。
5
+
6
+ ### 关联组件
7
+ - **flow-agent-content** — 节点详情入口由 FlowAgentContent 挂载到自定义 Tab
8
+ - **detail-section** — 详情页内部分段容器
9
+ - **simple-table** — 展示输入参数、插件输出定义与结构化输出
10
+ - **chat-container** — 应用层通过 onCustomTabChange 拉取节点详情并回填
11
+
12
+ ---
13
+ <!-- FULL DOC -->
14
+
15
+ # FlowAgentNodeDetail FlowAgent 节点详情
16
+
17
+ > **能力域**:Agent 能力
18
+
19
+ `FlowAgentNodeDetail` 用于展示 FlowAgent 单个节点的配置与输出详情。它通常被 `FlowAgentContent` 通过自定义 Tab 挂载到侧栏,应用层再根据 `messageUid`、`task_id`、`node_id` 拉取真实节点详情并回填到 `data`。
20
+
21
+ 组件自身只负责详情展示,不负责接口请求、Tab 生命周期或消息定位逻辑。
22
+
23
+ ## 源码事实
24
+
25
+ - **源码位置**:`src/components/chat-content/flow-agent-content/flow-agent-node-detail.vue`
26
+ - **能力说明**:展示 FlowAgent 节点输入、输出、异常、耗时等详情。
27
+
28
+ ## 核心能力
29
+
30
+ - **双 Tab 展示**:内置“节点配置”和“节点输出”两个页签,默认展示“节点配置”
31
+ - **配置详情**:展示流程模板、节点名称、步骤名称、是否可选、失败处理和超时控制
32
+ - **参数表格**:使用 `SimpleTable` 展示输入参数、插件输出定义和结构化输出
33
+ - **加载骨架屏**:`loading` 为 `true` 时展示标题和内容骨架,不渲染真实数据
34
+ - **定位插槽**:提供 `locateButton` 插槽,允许侧栏注入“在对话中定位”等操作按钮
35
+ - **值格式化**:`null` / `undefined` 显示为 `--`,对象值通过 `JSON.stringify` 转为字符串
36
+
37
+ ## 基础用法
38
+
39
+ ```vue
40
+ <template>
41
+ <FlowAgentNodeDetail
42
+ :data="nodeDetailData"
43
+ :loading="false"
44
+ node_id="n1"
45
+ node_name="采集主机指标"
46
+ :task_id="100"
47
+ task_name="主机巡检流程"
48
+ >
49
+ <template #locateButton>
50
+ <button type="button">定位</button>
51
+ </template>
52
+ </FlowAgentNodeDetail>
53
+ </template>
54
+
55
+ <script setup lang="ts">
56
+ import FlowAgentNodeDetail from '@blueking/chat-x/src/components/chat-content/flow-agent-content/flow-agent-node-detail.vue';
57
+ import type { NodeDetailData } from '@blueking/chat-x';
58
+
59
+ const nodeDetailData: Partial<NodeDetailData> = {
60
+ basic_info: {
61
+ node_name: '采集主机指标',
62
+ template_name: '主机巡检流程',
63
+ stage_name: '巡检准备',
64
+ optional: false,
65
+ skippable: true,
66
+ retryable: true,
67
+ error_ignorable: false,
68
+ auto_retry: { enable: true, interval: 30, times: 2 },
69
+ timeout_config: { enable: true, seconds: 300, action: 'forced_fail' },
70
+ },
71
+ inputs: {
72
+ bk_host_id: 10001,
73
+ collect_items: ['cpu', 'memory', 'disk'],
74
+ },
75
+ plugin_output: [
76
+ {
77
+ key: '${cpu_usage}',
78
+ name: 'CPU 使用率',
79
+ type: 'number',
80
+ schema: { description: '当前主机 CPU 使用率', enum: [], type: 'number' },
81
+ },
82
+ ],
83
+ outputs: [{ key: 'cpu_usage', preset: false, value: 23.5 }],
84
+ };
85
+ </script>
86
+ ```
87
+
88
+ **渲染效果**
89
+
90
+ ## 加载态
91
+
92
+ `loading` 为 `true` 时,组件展示骨架屏,标题中的节点名和内容区均不会读取 `data` 展示。
93
+
94
+ ## 空数据
95
+
96
+ 当输入参数、插件输出定义或结构化输出为空时,对应 `SimpleTable` 渲染 `--` 占位行。
97
+
98
+ ## Tab 内容
99
+
100
+ | Tab | 内容 |
101
+ | ---------- | ------------------------------------------------------------ |
102
+ | 节点配置 | 基础信息、失败处理、超时控制、输入参数、插件输出定义 |
103
+ | 节点输出 | 结构化输出,来自 `data.outputs` |
104
+
105
+ `activeTab` 是组件内部状态,不通过 prop 或 expose 暴露。
106
+
107
+ ## 字段展示规则
108
+
109
+ | 区域 | 数据来源 | 展示规则 |
110
+ | ------------ | -------------------------------- | --------------------------------------------- |
111
+ | 流程模板 | `data.basic_info.template_name` | 空值显示 `--` |
112
+ | 节点名称 | `data.basic_info.node_name` | 空值显示 `--` |
113
+ | 步骤名称 | `data.basic_info.stage_name` | 空值显示 `--` |
114
+ | 是否可选 | `data.basic_info.optional` | `true` 显示“是”,否则显示“否” |
115
+ | 失败处理 | `skippable` / `auto_retry.enable` | 支持“手动跳过”和“自动重试”;均无时显示 `--` |
116
+ | 超时控制 | `timeout_config` | 未启用时显示 `--`;`forced_fail` 显示“强制失败” |
117
+ | 输入参数 | `data.inputs` | 对象条目转为 `{ key, value }` 表格 |
118
+ | 插件输出定义 | `data.plugin_output` | 展示名称、变量说明和 KEY |
119
+ | 结构化输出 | `data.outputs` | 展示输出 key 与格式化后的 value |
120
+
121
+ ## 自定义 Tab 联动
122
+
123
+ `FlowAgentContent` 点击节点“详情”时,会将本组件挂载到自定义 Tab,并先传入 `loading: true` 和节点定位参数:
124
+
125
+ ```typescript
126
+ addCustomTab?.({
127
+ label: node.name,
128
+ name: `${task.task_id}|${node.id}|${node.name}`,
129
+ data: {
130
+ component: BkFlowNodeDetail,
131
+ messageUid: props.messageUid,
132
+ props: {
133
+ loading: true,
134
+ node_id: node.id,
135
+ node_name: node.name,
136
+ task_id: task.task_id,
137
+ task_name: task.task_name,
138
+ data: {},
139
+ },
140
+ },
141
+ });
142
+ ```
143
+
144
+ 应用层通常在 `ChatContainer` 的 `onCustomTabChange` 中读取这些参数,请求节点详情后返回新的 `props.data` 和 `props.loading`。
145
+
146
+ ## API
147
+
148
+ ### Props
149
+
150
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
151
+ | --------- | -------------------------- | ---- | ------ | ---------------------------- |
152
+ | data | `Partial<NodeDetailData>` | 是 | — | 节点详情数据 |
153
+ | loading | `boolean` | 否 | — | 是否显示骨架屏 |
154
+ | node_id | `string` | 否 | — | 节点 ID,来自自定义 Tab 参数 |
155
+ | node_name | `string` | 否 | — | 节点名称 |
156
+ | task_id | `number` | 否 | — | 任务 ID |
157
+ | task_name | `string` | 否 | — | 任务名称 |
158
+
159
+ > Props 类型来自 `CustomBkFlowTabData['props'] & { data: Partial<NodeDetailData> }`。
160
+
161
+ ### Emits
162
+
163
+ - 无。
164
+
165
+ ### Slots
166
+
167
+ | 插槽名 | 说明 |
168
+ | ------------ | ---------------------------- |
169
+ | locateButton | 标题栏右侧操作区,如定位按钮 |
170
+
171
+ ### Expose
172
+
173
+ - 无。
174
+
175
+ ## 类型定义
176
+
177
+ ```typescript
178
+ export type CustomBkFlowTabData = CustomTabData<{
179
+ data?: Partial<NodeDetailData>;
180
+ loading?: boolean;
181
+ node_id?: string;
182
+ node_name?: string;
183
+ task_id?: number;
184
+ task_name?: string;
185
+ }>;
186
+
187
+ export interface NodeDetailData {
188
+ inputs: Record<string, unknown>;
189
+ node_id: string;
190
+ task_id: number;
191
+ basic_info: {
192
+ auto_retry: {
193
+ enable: boolean;
194
+ interval: number;
195
+ times: number;
196
+ };
197
+ error_ignorable: boolean;
198
+ node_name: string;
199
+ optional: boolean;
200
+ retryable: boolean;
201
+ skippable: boolean;
202
+ stage_name: string;
203
+ template_name: string;
204
+ timeout_config: {
205
+ action: string;
206
+ enable: boolean;
207
+ seconds: number;
208
+ };
209
+ };
210
+ outputs: Array<{
211
+ key: string;
212
+ preset: boolean;
213
+ value: unknown;
214
+ }>;
215
+ plugin_output: Array<{
216
+ key: string;
217
+ name: string;
218
+ schema: {
219
+ description: string;
220
+ enum: unknown[];
221
+ properties?: Record<string, unknown>;
222
+ type: string;
223
+ };
224
+ type: string;
225
+ }>;
226
+ }
227
+ ```
228
+
229
+ ## 使用建议
230
+
231
+ - 优先由 [FlowAgentContent](./flow-agent-content.md) 通过自定义 Tab 挂载,不建议业务组件手动拼装 Tab 生命周期。
232
+ - 接口请求与数据回填应放在应用层 `ChatContainer` 的 `onCustomTabChange` 链路中处理。
233
+ - `data` 可传 `Partial<NodeDetailData>`,但真实展示依赖 `basic_info`、`inputs`、`plugin_output`、`outputs` 等字段;缺字段时对应区域会降级为空表格或 `--`。
234
+
235
+ ## 关联组件
236
+
237
+ - [FlowAgentContent](./flow-agent-content.md) — 节点详情入口。
238
+ - [DetailSection](./detail-section.md) — 详情分段容器。
239
+ - [SimpleTable](./simple-table.md) — 详情表格。
240
+ - [ChatContainer](../setup/chat-container.md) — 自定义 Tab 数据回填入口。
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- HighlightKeyword 为函数式组件,从 inject 读取关键词并将匹配片段包在带样式 span 中,用于对话内搜索与列表过滤高亮。 ToolcallRender、DescPanel、FlowAgent 等场景组合使用。
4
+ 根据注入关键词高亮文本片段。 源码位置:src/components/highlight-keyword/highlight-keyword.ts。
5
5
 
6
6
  ### 关联组件
7
7
  - **toolcall-render** — 工具调用标题与状态文案高亮
@@ -12,8 +12,13 @@ HighlightKeyword 为函数式组件,从 inject 读取关键词并将匹配片
12
12
  <!-- FULL DOC -->
13
13
 
14
14
  # HighlightKeyword 关键词高亮
15
+ ## 源码事实
15
16
 
16
- > **层级**:原子组件 · **功能域**:辅助组件
17
+ - **源码位置**:`src/components/highlight-keyword/highlight-keyword.ts`
18
+ - **能力域**:辅助能力
19
+ - **能力说明**:根据注入关键词高亮文本片段。
20
+
21
+ > **能力域**:辅助能力
17
22
 
18
23
  函数式组件,用于在文本中高亮匹配的搜索关键词。通过 `useKeywordInject` 从上层注入关键词,自动将匹配部分包裹在带高亮样式的 `<span>` 中。
19
24
 
@@ -139,6 +144,6 @@ const { keywordMatched } = useKeywordMatch(() => [props.title, props.description
139
144
 
140
145
  ## 关联组件
141
146
 
142
- - [ToolcallRender](../molecular/toolcall-render.md) — 工具调用头部高亮
143
- - [DescPanel](./desc-panel.md) — 详情面板键值高亮
144
- - [ExecutionSummary](../molecular/execution-summary.md) — 执行摘要搜索
147
+ - [ToolcallRender](/components/agent/toolcall-render) — 工具调用头部高亮
148
+ - [DescPanel](/components/rendering/desc-panel) — 详情面板键值高亮
149
+ - [ExecutionSummary](/components/agent/execution-summary) — 执行摘要搜索
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- ImageContent Markdown 解析到图片 token 时渲染,对流式拼接中的 URL 做防抖与预加载,并用模块级缓存避免重复闪烁。 三态展示加载中、成功与失败,通常由 MarkdownContent 自动挂载而非业务直接引用。
4
+ 渲染 Markdown 图片 token 源码位置:src/components/markdown-token/image-content/image-content.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **markdown-content** — 解析图片 token 后挂载本组件
@@ -10,10 +10,15 @@ ImageContent 在 Markdown 解析到图片 token 时渲染,对流式拼接中
10
10
  <!-- FULL DOC -->
11
11
 
12
12
  # ImageContent 图片渲染
13
+ ## 源码事实
13
14
 
14
- > **层级**:原子组件 · **功能域**:文件与图片
15
+ - **源码位置**:`src/components/markdown-token/image-content/image-content.vue`
16
+ - **能力域**:媒体文件
17
+ - **能力说明**:渲染 Markdown 图片 token。
15
18
 
16
- Markdown Token 层的图片渲染原子组件,被 `MarkdownContent` 在解析到图片 token 时自动调用,通常无需手动引入。
19
+ > **能力域**:媒体文件
20
+
21
+ Markdown Token 层的图片渲染基础组件,被 `MarkdownContent` 在解析到图片 token 时自动调用,通常无需手动引入。
17
22
 
18
23
  核心能力:**流式 URL 防闪烁**(debounce 稳定判断 + throttle 预加载)、**全局缓存**(模块级 `Set` 跨实例共享)、**三态渲染**(加载中 / 成功 / 失败)。
19
24
 
@@ -175,4 +180,4 @@ URL = 完整 URL → isValidUrl=true → throttle 触发 preloadImage
175
180
 
176
181
  ## 关联组件
177
182
 
178
- - [MarkdownContent](./markdown-content.md) — 图片 token 渲染入口
183
+ - [MarkdownContent](/components/rendering/markdown-content) — 图片 token 渲染入口
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- ImagePreviewGroup 通过 provide/inject 与子级 symbol 注册表管理多个 AiImage,点击任一子图时聚合已注册图片并打开内置全屏预览。 解决同屏多缩略图统一多图浏览与索引切换的需求。
4
+ 通过 provide/inject 管理同组图片预览。 源码位置:src/components/image-preview/image-preview-group.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **ai-image** — 子级注册并参与多图预览集合
@@ -11,8 +11,13 @@ ImagePreviewGroup 通过 provide/inject 与子级 symbol 注册表管理多个 A
11
11
  <!-- FULL DOC -->
12
12
 
13
13
  # ImagePreviewGroup 图片预览组
14
+ ## 源码事实
14
15
 
15
- > **层级**:分子组件 · **功能域**:文件与图片
16
+ - **源码位置**:`src/components/image-preview/image-preview-group.vue`
17
+ - **能力域**:媒体文件
18
+ - **能力说明**:通过 provide/inject 管理同组图片预览。
19
+
20
+ > **能力域**:媒体文件
16
21
 
17
22
  多图预览管理容器。通过 `provide/inject` + `Map<symbol>` 模式管理子级 `AiImage` 的注册与预览状态,点击任意子图片时自动收集所有已注册图片并打开多图预览。
18
23
 
@@ -177,5 +182,5 @@ const IMAGE_PREVIEW_GROUP_KEY: InjectionKey<ImagePreviewGroupContext>;
177
182
 
178
183
  ## 关联组件
179
184
 
180
- - [AiImage](../atomic/ai-image.md) — 子级缩略图与注册
181
- - [ImagePreview](./image-preview.md) — 内置全屏预览
185
+ - [AiImage](/components/medias/ai-image) — 子级缩略图与注册
186
+ - [ImagePreview](/components/medias/image-preview) — 内置全屏预览
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- ImagePreview 通过 Teleport 提供全屏图片预览,支持缩放、旋转、拖拽、下载、键盘与多图切换。 数据源可为 URL 字符串、ImageItem 或 File(自动 ObjectURL 并在关闭时回收)。 通常由 AiImage、ImagePreviewGroup、FileContent 等触发,业务较少直接单独挂载。
4
+ 图片全屏预览容器,支持缩放、旋转、下载工具栏。 源码位置:src/components/image-preview/image-preview.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **ai-image** — 独立模式下由 AiImage 打开预览
@@ -12,8 +12,13 @@ ImagePreview 通过 Teleport 提供全屏图片预览,支持缩放、旋转、
12
12
  <!-- FULL DOC -->
13
13
 
14
14
  # ImagePreview 图片预览
15
+ ## 源码事实
15
16
 
16
- > **层级**:分子组件 · **功能域**:文件与图片
17
+ - **源码位置**:`src/components/image-preview/image-preview.vue`
18
+ - **能力域**:媒体文件
19
+ - **能力说明**:图片全屏预览容器,支持缩放、旋转、下载工具栏。
20
+
21
+ > **能力域**:媒体文件
17
22
 
18
23
  全屏图片预览组件,通过 `Teleport` 渲染到 `body`,支持缩放、旋转、拖拽、下载、键盘导航等功能。`images` 支持传入 URL 字符串、`ImageItem` 对象或 `File` 对象,File 对象会自动通过 `URL.createObjectURL` 生成预览并在关闭/卸载时回收。通常不直接使用,而是配合 `AiImage`、`ImagePreviewGroup` 或 `FileContent` 自动触发。
19
24
 
@@ -219,6 +224,6 @@ type ImageLoadingStatus = 'loading' | 'loaded' | 'error';
219
224
 
220
225
  ## 关联组件
221
226
 
222
- - [AiImage](../atomic/ai-image.md) — 独立模式触发预览
223
- - [ImagePreviewGroup](./image-preview-group.md) — 多图预览容器
224
- - [FileContent](./file-content.md) — 附件列表点击预览
227
+ - [AiImage](/components/medias/ai-image) — 独立模式触发预览
228
+ - [ImagePreviewGroup](/components/medias/image-preview-group) — 多图预览容器
229
+ - [FileContent](/components/medias/file-content) — 附件列表点击预览
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- InfoMessage 以居中虚线分隔条展示系统提示、会话重置、时间戳等非对话信息;content 可为字符串或字符串数组。 由 MessageRender 在 info 角色下渲染,不承载用户与助手轮次内容。
4
+ 渲染居中的系统信息提示。 源码位置:src/components/chat-message/info-message/info-message.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **message-render** — 由 MessageRender 在 role 为 info 时创建
@@ -11,8 +11,13 @@ InfoMessage 以居中虚线分隔条展示系统提示、会话重置、时间
11
11
  <!-- FULL DOC -->
12
12
 
13
13
  # InfoMessage 信息消息
14
+ ## 源码事实
14
15
 
15
- > **层级**:分子组件 · **功能域**:消息展示
16
+ - **源码位置**:`src/components/chat-message/info-message/info-message.vue`
17
+ - **能力域**:消息系统
18
+ - **能力说明**:渲染居中的系统信息提示。
19
+
20
+ > **能力域**:消息系统
16
21
 
17
22
  系统信息分隔组件,在聊天消息列表中以**居中虚线分隔条**的形式展示非对话类信息(会话重置、时间节点、状态变更等)。
18
23
 
@@ -0,0 +1,43 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ ChatInput 底部附件区布局,承载快捷按钮、文件与发送图标。 源码位置:src/components/chat-input/input-attachment/input-attachment.vue。
5
+
6
+ ---
7
+ <!-- FULL DOC -->
8
+
9
+ # InputAttachment 输入附件区
10
+
11
+ > **能力域**:输入交互
12
+
13
+ ## 源码事实
14
+
15
+ - **源码位置**:`src/components/chat-input/input-attachment/input-attachment.vue`
16
+ - **能力说明**:ChatInput 底部附件区布局,承载快捷按钮、文件与发送图标。
17
+
18
+ ## API 摘要
19
+
20
+ ### Props
21
+
22
+ - `{ messageState?: MessageStatus; sendDisabledTip?: string; tippyOptions?: AITippyProps; }`
23
+
24
+ ### Emits
25
+
26
+ - `{ (e: 'sendMessage'): void; (e: 'stopSending'): void; }`
27
+
28
+ ### Slots
29
+
30
+ - `default`
31
+ - `send-icon`
32
+
33
+ ### Expose
34
+
35
+ - 无。
36
+
37
+ ## 组件依赖
38
+
39
+ - 无组件依赖或仅依赖基础库。
40
+
41
+ ## 使用建议
42
+
43
+ - 优先通过上层组合组件使用;直接使用前请确认 props 数据结构来自对应类型定义。
@@ -0,0 +1,42 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ ChatInput 上方的信息提示条。 源码位置:src/components/chat-input/input-info-alert.vue。
5
+
6
+ ---
7
+ <!-- FULL DOC -->
8
+
9
+ # InputInfoAlert 输入提示条
10
+
11
+ > **能力域**:输入交互
12
+
13
+ ## 源码事实
14
+
15
+ - **源码位置**:`src/components/chat-input/input-info-alert.vue`
16
+ - **能力说明**:ChatInput 上方的信息提示条。
17
+
18
+ ## API 摘要
19
+
20
+ ### Props
21
+
22
+ - `{ content: string; }`
23
+
24
+ ### Emits
25
+
26
+ - 无。
27
+
28
+ ### Slots
29
+
30
+ - 无。
31
+
32
+ ### Expose
33
+
34
+ - 无。
35
+
36
+ ## 组件依赖
37
+
38
+ - 无组件依赖或仅依赖基础库。
39
+
40
+ ## 使用建议
41
+
42
+ - 优先通过上层组合组件使用;直接使用前请确认 props 数据结构来自对应类型定义。
@@ -0,0 +1,204 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ 渲染 human-in-the-loop 中断消息,分发工具审批,并回显用户问题回答结果。 源码位置:src/components/chat-message/interrupt-message/interrupt-message.vue。
5
+
6
+ ### 关联组件
7
+ - **message-render** — role 为 interrupt 时渲染本组件
8
+ - **user-question-card** — UserQuestion 待回答面板与回答回显
9
+ - **tool-approval-card** — AIDevToolApproval 专用子卡片
10
+ - **message-container** — 透传 onInterruptResume;末条为 interrupt 时不触发组 hover
11
+
12
+ ---
13
+ <!-- FULL DOC -->
14
+
15
+ # InterruptMessage 中断消息
16
+ ## 源码事实
17
+
18
+ - **源码位置**:`src/components/chat-message/interrupt-message/interrupt-message.vue`
19
+ - **能力域**:Agent 能力
20
+ - **能力说明**:渲染 human-in-the-loop 中断消息,分发工具审批,并回显用户问题回答结果。
21
+
22
+ > **能力域**:Agent 能力
23
+
24
+ human-in-the-loop 中断消息渲染器(导出名 **`InterruptMessageRender`**)。对应 `MessageRole.Interrupt`,解析 `content.outcome` 渲染审批卡片或兜底提示。
25
+
26
+ > 通常由 [MessageRender](/components/message/message-render) 自动调用,无需业务侧直接引入。
27
+ > `UserQuestion` 的待回答卡片由 [ChatContainer](/components/setup/chat-container) 放在输入区上方,本组件只负责 success 后的会话内回答回显。
28
+
29
+ ## 渲染架构
30
+
31
+ ```
32
+ InterruptMessageRender
33
+ ├── content.message(可选)→ 顶部说明文案
34
+ └── content.outcome.type === 'interrupt'
35
+ └── v-for interrupts
36
+ ├── reason === aidev:tool_approval → ToolApprovalCard(透传 onInterruptResume,用于取消审批)
37
+ ├── reason === aidev:user_question → 不在消息内渲染,交由 ChatContainer 输入区挂载
38
+ └── 未注册 reason → 兜底块(item.message 或「暂不支持的中断消息」)
39
+
40
+ content.outcome.type === 'success'
41
+ └── result.reason === aidev:user_question → UserQuestionAnsweredCard 回显回答(支持 #answeredQuestion 透传 #answer)
42
+ ```
43
+
44
+ | `InterruptReason` | 子组件 |
45
+ | ------------------------------ | ------------------- |
46
+ | `aidev:tool_approval` | `ToolApprovalCard` |
47
+ | `aidev:user_question`(待回答) | 输入区 `UserQuestionCard`,本组件不渲染 |
48
+ | `aidev:user_question`(已回答) | `UserQuestionAnsweredCard` |
49
+ | 其他 / 未注册 | 兜底文案区域 |
50
+
51
+ ## 基础用法(待审批)
52
+
53
+ ```vue
54
+ <template>
55
+ <InterruptMessageRender
56
+ :id="message.id"
57
+ :message-id="message.messageId"
58
+ :role="message.role"
59
+ :status="message.status"
60
+ :content="message.content"
61
+ :on-interrupt-resume="handleInterruptResume"
62
+ />
63
+ </template>
64
+
65
+ <script setup lang="ts">
66
+ import {
67
+ InterruptMessageRender,
68
+ APPROVAL_STATUS,
69
+ InterruptReason,
70
+ MessageRole,
71
+ MessageStatus,
72
+ type InterruptMessage,
73
+ } from '@blueking/chat-x';
74
+
75
+ const message: InterruptMessage = {
76
+ id: 'msg_interrupt',
77
+ messageId: 'msg_interrupt',
78
+ role: MessageRole.Interrupt,
79
+ status: MessageStatus.Pending,
80
+ content: {
81
+ message: '算法方案评审单需要您关注',
82
+ outcome: {
83
+ type: 'interrupt',
84
+ interrupts: [
85
+ {
86
+ id: 'interrupt_1',
87
+ reason: InterruptReason.AIDevToolApproval,
88
+ toolCallId: 'tool_call_1',
89
+ metadata: {
90
+ ticket: {
91
+ approvers: ['张三'],
92
+ sn: 'REV-2026-04-24-001',
93
+ status: APPROVAL_STATUS.PENDING,
94
+ submit_time: '2026-04-24 14:30:15',
95
+ title: '算法方案评审单',
96
+ url: 'https://example.com/tickets/001',
97
+ },
98
+ },
99
+ },
100
+ ],
101
+ },
102
+ },
103
+ };
104
+
105
+ const handleInterruptResume = async (payload, interrupt) => {
106
+ // ToolApprovalCard 点击「取消审批」时,payload 为 { action: 'cancel' }
107
+ console.log(payload, interrupt.id);
108
+ };
109
+ </script>
110
+ ```
111
+
112
+ **渲染效果**
113
+
114
+ ## UserQuestion 待回答
115
+
116
+ 待回答的 `UserQuestion` 不在消息内渲染;`ChatContainer` 会找到最近一条待回答中断,并在 `ChatInput` 上方挂载 [UserQuestionCard](/components/agent/user-question-card)。
117
+
118
+ ```vue
119
+ <InterruptMessageRender
120
+ :content="userQuestionMessage.content"
121
+ role="interrupt"
122
+ />
123
+ ```
124
+
125
+ **渲染效果**
126
+
127
+ ## UserQuestion 已回答回显(outcome.success)
128
+
129
+ `outcome.type === 'success'` 且 `result.reason === InterruptReason.UserQuestion` 时,会话内回显用户回答。可通过 `#answeredQuestion` slot 自定义单题回显:
130
+
131
+ ```vue
132
+ <InterruptMessageRender
133
+ :content="userQuestionAnsweredMessage.content"
134
+ role="interrupt"
135
+ >
136
+ <template #answeredQuestion="{ item, index, status }">
137
+ <MyCustomAnswerView :data="item" :index="index" :status="status" />
138
+ </template>
139
+ </InterruptMessageRender>
140
+ ```
141
+
142
+ **渲染效果**
143
+
144
+ ## 其他已 resume(outcome.success)
145
+
146
+ 非 `UserQuestion` 的 success 态不渲染中断卡片,仅保留可选顶部 `content.message`:
147
+
148
+ ## 不支持的中断类型(兜底)
149
+
150
+ ```vue
151
+ <InterruptMessageRender :content="unsupportedContent" role="interrupt" />
152
+ ```
153
+
154
+ **渲染效果**
155
+
156
+ ## 在 MessageContainer 中使用
157
+
158
+ 配置 `onInterruptResume`,由容器经 `MessageRender` 透传到本组件:
159
+
160
+ ```vue
161
+ <MessageContainer
162
+ :messages="messages"
163
+ :on-interrupt-resume="handleInterruptResume"
164
+ />
165
+ ```
166
+
167
+ 当消息组**最后一条**为 `role: 'interrupt'` 时,容器**不会**在鼠标移入时设置 `isHover`,避免误显 AI 工具栏遮挡审批卡片。
168
+
169
+ ## API
170
+
171
+ ### Props
172
+
173
+ 继承 `Partial<InterruptMessage>` 的字段(`id`、`messageId`、`role`、`content`、`status` 等),并额外支持:
174
+
175
+ | 属性名 | 类型 | 默认值 | 说明 |
176
+ | ----------------- | ------------------ | ------ | ----------------------------------------- |
177
+ | content | `InterruptMessage['content']` | — | 含 `message`、`outcome`、`result` 等 |
178
+ | onInterruptResume | `OnInterruptResume` | — | 用户完成中断操作后的回调(可选) |
179
+
180
+ ### Slots
181
+
182
+ | 插槽名 | 参数 | 说明 |
183
+ | ---------------- | ------------------------------------------------- | -------------------------------------------------------------------- |
184
+ | answeredQuestion | `{ item, index, status }` | 自定义 UserQuestion 已回答内容回显,透传给 `UserQuestionAnsweredCard` 的 `#answer` |
185
+
186
+ slot 参数与 [UserQuestionAnsweredCard](/components/agent/user-question-answered-card) 的 `#answer` 一致。
187
+
188
+ ### Events / Expose
189
+
190
+ 无。
191
+
192
+ ## 类型定义
193
+
194
+ ```typescript
195
+ import type { Interrupt, InterruptMessage, OnInterruptResume } from '@blueking/chat-x';
196
+ ```
197
+
198
+ 详见 [中断类型 Interrupt](../../types/interrupt.md)。
199
+
200
+ ## 关联组件
201
+
202
+ - [ToolApprovalCard](/components/agent/tool-approval-card) — AI Dev 审批单卡片
203
+ - [MessageRender](/components/message/message-render) — 按 `role` 派发
204
+ - [MessageContainer](/components/setup/message-container) — 列表容器与 `onInterruptResume` 透传