@blueking/chat-x 0.0.51-beta.5 → 0.0.52-dev.1

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 (198) hide show
  1. package/README.md +15 -8
  2. package/dist/ag-ui/types/contents.d.ts +2 -0
  3. package/dist/ag-ui/types/messages.d.ts +6 -1
  4. package/dist/common/constants.d.ts +2 -0
  5. package/dist/components/ai-buttons/add-menu-btn/add-menu-btn.vue.d.ts +24 -0
  6. package/dist/components/chat-content/collapsible-content/collapsible-content.vue.d.ts +28 -0
  7. package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +5 -2
  8. package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +1 -0
  9. package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +1 -1
  10. package/dist/components/chat-input/ai-slash-input/ai-slash-input.vue.d.ts +21 -10
  11. package/dist/components/chat-input/ai-slash-input/command.d.ts +6 -3
  12. package/dist/components/chat-input/ai-slash-input/constants.d.ts +2 -0
  13. package/dist/components/chat-input/ai-slash-input/use-menu-trigger.d.ts +17 -0
  14. package/dist/components/chat-input/build-default-placeholder.d.ts +9 -3
  15. package/dist/components/chat-input/chat-input.vue.d.ts +30 -18
  16. package/dist/components/chat-input/input-menu/constants.d.ts +60 -0
  17. package/dist/components/chat-input/input-menu/index.d.ts +4 -0
  18. package/dist/components/chat-input/input-menu/input-menu-option.vue.d.ts +14 -0
  19. package/dist/components/chat-input/input-menu/input-menu-panel.vue.d.ts +17 -0
  20. package/dist/components/chat-input/input-menu/use-input-menu.d.ts +22 -0
  21. package/dist/components/chat-input/model-selector/types.d.ts +3 -2
  22. package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -1
  23. package/dist/components/chat-message/user-message/user-message.vue.d.ts +1 -1
  24. package/dist/components/mention/create-mention-tippy.d.ts +27 -0
  25. package/dist/components/mention/index.d.ts +4 -0
  26. package/dist/components/{chat-input/ai-slash-input/ai-prompt-list/ai-prompt-list.vue.d.ts → mention/mention-popover.vue.d.ts} +3 -2
  27. package/dist/components/{chat-input/ai-slash-input/ai-skill-list/ai-skill-list.vue.d.ts → mention/mention-tag.vue.d.ts} +7 -3
  28. package/dist/components/{chat-input/ai-slash-input/ai-slash-menu/ai-slash-menu.vue.d.ts → mention/mention-text.vue.d.ts} +3 -3
  29. package/dist/components/resource-icon/index.d.ts +1 -0
  30. package/dist/components/resource-icon/resource-icon.vue.d.ts +11 -0
  31. package/dist/composables/index.d.ts +1 -0
  32. package/dist/composables/use-artifact-preview.d.ts +5 -2
  33. package/dist/composables/use-common.d.ts +0 -9
  34. package/dist/composables/use-global-config.d.ts +4 -0
  35. package/dist/composables/use-input-mention.d.ts +13 -0
  36. package/dist/composables/use-message-group.d.ts +1011 -72
  37. package/dist/icons/index.d.ts +1 -0
  38. package/dist/icons/input.d.ts +21 -0
  39. package/dist/icons/menu-item.d.ts +22 -0
  40. package/dist/index.css +1 -1
  41. package/dist/index.js +4953 -4429
  42. package/dist/index.js.map +1 -1
  43. package/dist/lang/lang.d.ts +13 -3
  44. package/dist/mcp/generated/docs/activity-message.md +3 -3
  45. package/dist/mcp/generated/docs/add-menu-btn.md +91 -0
  46. package/dist/mcp/generated/docs/ai-slash-input.md +72 -26
  47. package/dist/mcp/generated/docs/assistant-message.md +7 -1
  48. package/dist/mcp/generated/docs/chat-container.md +45 -6
  49. package/dist/mcp/generated/docs/chat-input.md +327 -483
  50. package/dist/mcp/generated/docs/collapsible-content.md +78 -0
  51. package/dist/mcp/generated/docs/constants.md +36 -3
  52. package/dist/mcp/generated/docs/execution-summary.md +1 -23
  53. package/dist/mcp/generated/docs/file-artifact-panel.md +24 -5
  54. package/dist/mcp/generated/docs/file-content.md +4 -0
  55. package/dist/mcp/generated/docs/file-upload-btn.md +15 -12
  56. package/dist/mcp/generated/docs/flow-agent-content.md +10 -12
  57. package/dist/mcp/generated/docs/input-menu-panel.md +166 -0
  58. package/dist/mcp/generated/docs/mention-tag.md +83 -0
  59. package/dist/mcp/generated/docs/mention-text.md +86 -0
  60. package/dist/mcp/generated/docs/message-container.md +1 -1
  61. package/dist/mcp/generated/docs/message-render.md +1 -1
  62. package/dist/mcp/generated/docs/message-tools.md +15 -4
  63. package/dist/mcp/generated/docs/messages.md +3 -0
  64. package/dist/mcp/generated/docs/model-selector.md +4 -2
  65. package/dist/mcp/generated/docs/overflow-tips.md +3 -3
  66. package/dist/mcp/generated/docs/resource-icon.md +102 -0
  67. package/dist/mcp/generated/docs/text-content.md +7 -3
  68. package/dist/mcp/generated/docs/theme.md +27 -35
  69. package/dist/mcp/generated/docs/use-artifact-preview.md +7 -3
  70. package/dist/mcp/generated/docs/use-command-selection.md +1 -1
  71. package/dist/mcp/generated/docs/use-container-scroll.md +2 -1
  72. package/dist/mcp/generated/docs/use-flow-node-actions.md +8 -15
  73. package/dist/mcp/generated/docs/use-global-config.md +11 -4
  74. package/dist/mcp/generated/docs/use-input-mention.md +119 -0
  75. package/dist/mcp/generated/docs/use-menu-keydown.md +15 -16
  76. package/dist/mcp/generated/docs/use-message-group.md +3 -6
  77. package/dist/mcp/generated/docs/user-message.md +39 -17
  78. package/dist/mcp/generated/index.json +233 -81
  79. package/dist/types/editor.d.ts +0 -29
  80. package/dist/types/index.d.ts +1 -0
  81. package/dist/types/input-menu.d.ts +46 -0
  82. package/dist/utils/artifact-tags.d.ts +36 -0
  83. package/dist/utils/collect-message-artifacts.d.ts +14 -0
  84. package/dist/utils/file.d.ts +3 -3
  85. package/dist/utils/index.d.ts +2 -1
  86. package/dist/utils/upload-file.d.ts +6 -1
  87. package/package.json +3 -2
  88. package/skills/blueking-chat-x/SKILL.md +143 -0
  89. package/skills/blueking-chat-x/references/_index.md +153 -0
  90. package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
  91. package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
  92. package/skills/blueking-chat-x/references/components/add-menu-btn.md +88 -0
  93. package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
  94. package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
  95. package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
  96. package/skills/blueking-chat-x/references/components/ai-slash-input.md +102 -0
  97. package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
  98. package/skills/blueking-chat-x/references/components/assistant-message.md +504 -0
  99. package/skills/blueking-chat-x/references/components/chat-container.md +912 -0
  100. package/skills/blueking-chat-x/references/components/chat-input.md +614 -0
  101. package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
  102. package/skills/blueking-chat-x/references/components/code-content.md +211 -0
  103. package/skills/blueking-chat-x/references/components/collapsible-content.md +76 -0
  104. package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
  105. package/skills/blueking-chat-x/references/components/content-render.md +233 -0
  106. package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
  107. package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
  108. package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
  109. package/skills/blueking-chat-x/references/components/execution-summary.md +150 -0
  110. package/skills/blueking-chat-x/references/components/file-artifact-panel.md +307 -0
  111. package/skills/blueking-chat-x/references/components/file-content.md +340 -0
  112. package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
  113. package/skills/blueking-chat-x/references/components/file-upload-btn.md +162 -0
  114. package/skills/blueking-chat-x/references/components/flow-agent-content.md +266 -0
  115. package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
  116. package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
  117. package/skills/blueking-chat-x/references/components/image-content.md +182 -0
  118. package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
  119. package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
  120. package/skills/blueking-chat-x/references/components/info-message.md +144 -0
  121. package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
  122. package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
  123. package/skills/blueking-chat-x/references/components/input-menu-panel.md +162 -0
  124. package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
  125. package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
  126. package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
  127. package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
  128. package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
  129. package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
  130. package/skills/blueking-chat-x/references/components/mention-tag.md +79 -0
  131. package/skills/blueking-chat-x/references/components/mention-text.md +83 -0
  132. package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
  133. package/skills/blueking-chat-x/references/components/message-container.md +645 -0
  134. package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
  135. package/skills/blueking-chat-x/references/components/message-render.md +327 -0
  136. package/skills/blueking-chat-x/references/components/message-time.md +177 -0
  137. package/skills/blueking-chat-x/references/components/message-tools.md +427 -0
  138. package/skills/blueking-chat-x/references/components/model-selector.md +157 -0
  139. package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
  140. package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
  141. package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
  142. package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
  143. package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
  144. package/skills/blueking-chat-x/references/components/resource-icon.md +98 -0
  145. package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
  146. package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
  147. package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
  148. package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
  149. package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
  150. package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
  151. package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
  152. package/skills/blueking-chat-x/references/components/text-content.md +80 -0
  153. package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
  154. package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
  155. package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
  156. package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
  157. package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
  158. package/skills/blueking-chat-x/references/components/user-message.md +444 -0
  159. package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
  160. package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
  161. package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
  162. package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
  163. package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
  164. package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
  165. package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +235 -0
  166. package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
  167. package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
  168. package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
  169. package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
  170. package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +164 -0
  171. package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
  172. package/skills/blueking-chat-x/references/composables/use-global-config.md +155 -0
  173. package/skills/blueking-chat-x/references/composables/use-input-mention.md +115 -0
  174. package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +161 -0
  175. package/skills/blueking-chat-x/references/composables/use-message-group.md +244 -0
  176. package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
  177. package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
  178. package/skills/blueking-chat-x/references/directives/index.md +61 -0
  179. package/skills/blueking-chat-x/references/directives/overflow-tips.md +205 -0
  180. package/skills/blueking-chat-x/references/icons/index.md +185 -0
  181. package/skills/blueking-chat-x/references/plugins/index.md +56 -0
  182. package/skills/blueking-chat-x/references/plugins/markdown-container.md +55 -0
  183. package/skills/blueking-chat-x/references/plugins/markdown-latex.md +205 -0
  184. package/skills/blueking-chat-x/references/plugins/markdown-mermaid.md +247 -0
  185. package/skills/blueking-chat-x/references/theme/theme.md +423 -0
  186. package/skills/blueking-chat-x/references/types/constants.md +340 -0
  187. package/skills/blueking-chat-x/references/types/index.md +120 -0
  188. package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
  189. package/skills/blueking-chat-x/references/types/messages.md +556 -0
  190. package/skills/blueking-chat-x/references/types/schema.md +91 -0
  191. package/skills/blueking-chat-x/references/utils/index.md +196 -0
  192. package/skills/blueking-chat-x/scripts/generate-references.mjs +536 -0
  193. package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +0 -28
  194. package/dist/components/chat-input/ai-slash-editor/theme.d.ts +0 -24
  195. package/dist/mcp/generated/docs/ai-prompt-list.md +0 -45
  196. package/dist/mcp/generated/docs/ai-skill-list.md +0 -75
  197. package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
  198. package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
@@ -0,0 +1,233 @@
1
+ # ContentRender 内容渲染器
2
+
3
+ > 能力域:内容渲染 | 导入:`import { ContentRender } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 按 MessageContentType 分发 Markdown、文本、引用、键值、图片等内容。 源码位置:src/components/chat-content/content-render/content-render.vue。
6
+
7
+ **关联**:markdown-content(文本类 Markdown 正文的默认渲染实现)、reference-content(引用文档数组类型的列表渲染)、assistant-message(AI 回复中默认通过本组件渲染正文)
8
+
9
+ ---
10
+
11
+ # ContentRender 内容渲染器
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/chat-content/content-render/content-render.vue`
15
+ - **能力域**:内容渲染
16
+ - **能力说明**:按 MessageContentType 分发 Markdown、文本、引用、键值、图片等内容。
17
+
18
+ > **能力域**:内容渲染
19
+
20
+ 消息内容渲染分发组件,根据 `content` 的 JavaScript 类型自动选择渲染方式:字符串 → `MarkdownContent`(Markdown 渲染),数组 → `ReferenceContent`(引用列表)。
21
+
22
+ ## 渲染管线
23
+
24
+ ```
25
+ ContentRender
26
+ ├── typeof content === 'string' → MarkdownContent(Markdown 渲染)
27
+ │ └── status === 'error' → CommonErrorContent(红色错误图标 + 文本)
28
+ ├── Array.isArray(content) → ReferenceContent(引用文档列表)
29
+ └── 其他 → undefined(不渲染,可通过 slot 自定义)
30
+ ```
31
+
32
+ > **注意**:渲染类型由 `content` 的 JavaScript 类型决定(字符串 vs 数组),`type` prop 仅当传入 `MessageContentType.Text` 时才强制走 `MarkdownContent`,通常不需要显式传递。
33
+
34
+ ## 基础用法(Markdown 文本)
35
+
36
+ 字符串内容自动渲染为 Markdown:
37
+
38
+ ```vue
39
+ <template>
40
+ <ContentRender
41
+ :content="content"
42
+ :status="status"
43
+ />
44
+ </template>
45
+
46
+ <script setup lang="ts">
47
+ import { ContentRender, MessageStatus } from '@blueking/chat-x';
48
+
49
+ const content = '这是一段 **Markdown** 内容,支持 `代码`、**加粗**、*斜体* 等语法。';
50
+ const status = MessageStatus.Complete;
51
+ </script>
52
+ ```
53
+
54
+ **渲染效果**
55
+
56
+ ## Markdown 语法支持
57
+
58
+ `MarkdownContent` 内置了完整的 Markdown 解析能力,使用 `markdown-it` + 多个插件:
59
+
60
+ ### 常用语法(代码、列表、表格)
61
+
62
+ ### 扩展语法
63
+
64
+ | 语法 | 效果 | 插件 |
65
+ | --------------------- | -------------- | ------------------------- |
66
+ | `++文字++` | 下划线(新增) | markdown-it-ins |
67
+ | `==文字==` | 高亮标注 | markdown-it-mark |
68
+ | `^上标^` | 上标 | markdown-it-sup |
69
+ | `~下标~` | 下标 | markdown-it-sub |
70
+ | `[^1]` / `[^1]: 内容` | 脚注 | markdown-it-footnote |
71
+ | `- [x] 任务` | 任务列表 | markdown-it-task-checkbox |
72
+
73
+ ### LaTeX 数学公式
74
+
75
+ 行内公式 `$...$` 和块级公式 `$$...$$`,由 `katex` 渲染:
76
+
77
+ ```vue
78
+ <ContentRender content="行内公式:$E = mc^2$" status="complete" />
79
+ ```
80
+
81
+ ### Mermaid 图表
82
+
83
+ 代码块语言标识为 `mermaid` 时,由 `MermaidContent` 专门渲染:
84
+
85
+ ## 消息状态
86
+
87
+ `status` 只传递给 `MarkdownContent`,对 `ReferenceContent` 无效。
88
+
89
+ | `status` | 渲染行为 |
90
+ | ----------- | ----------------------------------------------------------------- |
91
+ | `complete` | 正常渲染完整 Markdown |
92
+ | `streaming` | 自动补全未闭合的 Markdown 语法(代码块、列表等),节流解析(5ms) |
93
+ | `pending` | 同 `complete`(按当前内容渲染) |
94
+ | `error` | 渲染为 `CommonErrorContent`(红色错误图标 + `content` 文本) |
95
+ | `stop` | 同 `complete` |
96
+
97
+ **错误状态示例**
98
+
99
+ ## 引用文档列表
100
+
101
+ `content` 传入 `ReferenceDocumentContent[]` 数组时,自动渲染为 `ReferenceContent`(引用文档列表):
102
+
103
+ ```vue
104
+ <template>
105
+ <ContentRender :content="referenceContent" />
106
+ </template>
107
+
108
+ <script setup lang="ts">
109
+ import { ContentRender, type ReferenceDocumentContent } from '@blueking/chat-x';
110
+
111
+ const referenceContent: ReferenceDocumentContent[] = [
112
+ {
113
+ name: 'Vue 3 官方文档',
114
+ url: 'https://vuejs.org',
115
+ originFile: 'vue3-guide.md', // 有 originFile 时显示预览和跳转图标
116
+ },
117
+ {
118
+ name: 'TypeScript 手册',
119
+ url: 'https://www.typescriptlang.org',
120
+ originFile: '', // 无 originFile 时不显示操作图标
121
+ },
122
+ ];
123
+ </script>
124
+ ```
125
+
126
+ **渲染效果**(悬停条目查看图标,有 `originFile` 的条目显示预览和跳转图标)
127
+
128
+ ### ReferenceContent 图标显示规则
129
+
130
+ | 条件 | 显示图标 |
131
+ | ------------------------------ | -------------------------------------------- |
132
+ | 始终 | 文档图标(红色) |
133
+ | `url` 和 `originFile` 均不为空 | 预览图标(悬停可见) |
134
+ | `url` 和 `originFile` 均不为空 | 跳转图标(悬停可见,打开 `originFile` 链接) |
135
+
136
+ 无 `originFile` 时只显示文档图标(点击文档名跳转 `url`):
137
+
138
+ ## 自定义渲染(默认插槽)
139
+
140
+ 默认插槽接收 `{ content }` 参数(原始 `content` prop 值),替换整个内容渲染:
141
+
142
+ ```vue
143
+ <template>
144
+ <ContentRender
145
+ :content="content"
146
+ :status="status"
147
+ >
148
+ <template #default="{ content }">
149
+ <div class="custom-content">
150
+ <h3>自定义渲染</h3>
151
+ <pre>{{ JSON.stringify(content, null, 2) }}</pre>
152
+ </div>
153
+ </template>
154
+ </ContentRender>
155
+ </template>
156
+
157
+ <script setup lang="ts">
158
+ import { ContentRender } from '@blueking/chat-x';
159
+
160
+ const content = '自定义内容,由 slot 接管渲染。';
161
+ const status = 'complete';
162
+ </script>
163
+ ```
164
+
165
+ **渲染效果**
166
+
167
+ ## API
168
+
169
+ ### Props
170
+
171
+ | 属性名 | 类型 | 必填 | 说明 |
172
+ | ------- | -------------------------------------- | ---- | ----------------------------------------------------------------------------------------- |
173
+ | content | `string \| ReferenceDocumentContent[]` | ✅ | 内容数据,字符串走 Markdown 渲染,数组走引用文档列表渲染 |
174
+ | status | `MessageStatus` | - | 消息状态,只影响 Markdown 渲染(`error` 时渲染错误样式,`streaming` 时补全语法) |
175
+ | type | `ContentType` | - | 内容类型提示,传入 `MessageContentType.Text` 可强制走 MarkdownContent;通常不需要显式传递 |
176
+
177
+ ### Slots
178
+
179
+ | 插槽名 | 参数 | 说明 |
180
+ | ---------- | -------------------------------------- | ----------------------------------------------------------------------------- |
181
+ | codeHeader | `{ language: string; token: Token[] }` | 代码块头部自定义操作区域,透传给 MarkdownContent → CodeContent 的 header 插槽 |
182
+ | default | `{ content: ContentMap[T] }` | 自定义渲染,接收原始 content prop 值,替换全部默认逻辑 |
183
+
184
+ ## 流式渲染机制
185
+
186
+ `streaming` 状态下,`MarkdownContent` 有以下优化:
187
+
188
+ 1. **语法自动补全**:`completeMarkdownSyntax` 在解析前补全未闭合的代码块、列表等,避免渲染异常
189
+ 2. **节流解析**:`parseMarkdownContent` 节流 5ms(leading + trailing),大幅降低流式输入时的解析开销
190
+ 3. **不完整状态保护**:当正在输入 LaTeX 命令(如 `$\fra...`)时保持之前的渲染结果,避免闪烁
191
+ 4. **CSS contain 性能隔离**:`.ai-markdown-content` 使用 `contain: layout style`,`.ai-markdown-body` 使用 `contain: content`,减少重排影响范围
192
+ 5. **自动滚动**:每个 token 挂载后触发 `toScrollBottom()`(节流 100ms),与 `MessageContainer` 配合实现流式自动滚动
193
+
194
+ ## 类型定义
195
+
196
+ ```typescript
197
+ import { MessageContentType, MessageStatus } from '@blueking/chat-x';
198
+
199
+ // 引用文档内容
200
+ type ReferenceDocumentContent = {
201
+ name: string; // 显示名称(为空时该条目被过滤,不渲染)
202
+ url: string; // 文档访问地址(点击文档名跳转)
203
+ originFile: string; // 原始文件地址(非空时显示预览和跳转图标)
204
+ };
205
+
206
+ // 内容类型(ContentType = keyof ContentMap)
207
+ enum MessageContentType {
208
+ Text = 'text', // 字符串,Markdown 渲染
209
+ ReferenceDocument = 'reference_document', // ReferenceDocumentContent[],引用列表
210
+ Binary = 'binary',
211
+ Function = 'function',
212
+ KeyValue = 'key_value',
213
+ KnowledgeRag = 'knowledge_rag',
214
+ Other = 'other',
215
+ }
216
+ ```
217
+
218
+ > `MessageStatus` 完整取值见 [常量枚举](../../types/constants);本组件主要关心 `error`(错误内容)与流式相关状态。
219
+
220
+ ## 使用场景
221
+
222
+ - **AI 文本回复渲染**:`AssistantMessage` 内部用 `ContentRender` 渲染 AI 回复内容,`status` 配合流式响应
223
+ - **知识库引用展示**:`ActivityMessage` 内部用 `ContentRender` 渲染引用文档列表
224
+ - **代码展示**:Markdown 代码块由 `CodeContent` 自动高亮(Atom One Dark 主题,支持 180+ 语言)
225
+ - **数学公式**:行内 `$...$` 和块级 `$$...$$`,由 KaTeX 渲染
226
+ - **流程图**:Mermaid 代码块自动渲染为 SVG 图表
227
+ - **自定义渲染**:通过 slot 接管渲染,实现表格、图表等自定义内容展示
228
+
229
+ ## 关联组件
230
+
231
+ - [MarkdownContent](/components/rendering/markdown-content) — 字符串 Markdown 正文
232
+ - [ReferenceContent](/components/rendering/reference-content) — 引用文档数组
233
+ - [AssistantMessage](/components/message/assistant-message) — assistant 消息中默认使用
@@ -0,0 +1,191 @@
1
+ # DeleteTool 删除确认按钮
2
+
3
+ > 能力域:工具与反馈 | 未从包入口导出:内部组件,请通过上层组件使用 | since 1.0.0
4
+
5
+ 消息删除二次确认工具。 源码位置:src/components/message-tools/delete-tool/delete-tool.vue。
6
+
7
+ **关联**:tool-btn(删除图标与触发入口)、message-tools(delete 工具 id 时自动采用本组件)
8
+
9
+ ---
10
+
11
+ # DeleteTool 删除确认按钮
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/message-tools/delete-tool/delete-tool.vue`
15
+ - **能力域**:工具与反馈
16
+ - **能力说明**:消息删除二次确认工具。
17
+
18
+ > **能力域**:工具与反馈
19
+
20
+ 删除操作的二次确认组件。点击删除图标后弹出确认弹窗,用户需再次点击"删除"按钮才会触发 `confirm` 事件,防止误删。内部由 `ToolBtn`(触发按钮)+ `Tippy`(确认弹窗)组合实现。
21
+
22
+ > **提示**:此组件通常**不需要手动使用**,`MessageTools` 在工具列表中检测到 `id === 'delete'` 时会自动使用此组件替换普通 `ToolBtn`。
23
+
24
+ ## 组件结构
25
+
26
+ ```
27
+ Tippy(trigger='click',interactive,appendTo=body)
28
+
29
+ ├── ToolBtn(触发按钮,id/name/description/disabled 透传)
30
+
31
+ └── #content: div.ai-delete-confirm(width: 280px)
32
+ ├── .ai-delete-confirm__title "确认删除该回答?"(16px, bold)
33
+ ├── .ai-delete-confirm__desc "删除操作无法撤回,请谨慎操作!"
34
+ └── .ai-delete-confirm__actions(justify-content: flex-end,gap: 8px)
35
+ ├── Button(theme="danger", size="small")→ 点击触发 confirm + 关闭弹窗
36
+ └── Button(size="small")→ 点击触发 cancel + 关闭弹窗
37
+
38
+ disabled=true 时:Tippy onShow 返回 false,弹窗不打开
39
+ ```
40
+
41
+ ## 基础用法
42
+
43
+ ```vue
44
+ <template>
45
+ <DeleteTool
46
+ id="delete"
47
+ name="删除"
48
+ description="删除消息"
49
+ @confirm="handleConfirm"
50
+ @cancel="handleCancel"
51
+ />
52
+ </template>
53
+
54
+ <script setup lang="ts">
55
+ import { DeleteTool } from '@blueking/chat-x';
56
+
57
+ const handleConfirm = () => {
58
+ console.log('用户确认删除,执行删除操作');
59
+ };
60
+
61
+ const handleCancel = () => {
62
+ console.log('用户取消删除');
63
+ };
64
+ </script>
65
+ ```
66
+
67
+ ## 禁用状态
68
+
69
+ `disabled=true` 时,点击按钮不弹出确认弹窗:
70
+
71
+ ```vue
72
+ <template>
73
+ <DeleteTool
74
+ id="delete"
75
+ name="删除"
76
+ description="删除消息"
77
+ :disabled="true"
78
+ @confirm="handleConfirm"
79
+ />
80
+ </template>
81
+ ```
82
+
83
+ ## 在 MessageTools 中的自动使用
84
+
85
+ `MessageTools` 在渲染工具列表时,若检测到 `tool.id === 'delete'`,会自动使用 `DeleteTool` 替换普通 `ToolBtn`,无需手动配置:
86
+
87
+ ```vue
88
+ <template>
89
+ <MessageTools
90
+ :update-tools="updateTools"
91
+ :on-action="handleAction"
92
+ />
93
+ </template>
94
+
95
+ <script setup lang="ts">
96
+ import { MessageTools, type IToolBtn } from '@blueking/chat-x';
97
+
98
+ // delete 会自动使用 DeleteTool 渲染,点击弹确认框,确认后 onAction 触发
99
+ const updateTools: IToolBtn[] = [
100
+ { id: 'like', name: '点赞', description: '点赞' },
101
+ { id: 'unlike', name: '不满意', description: '不满意' },
102
+ { id: 'delete', name: '删除', description: '删除消息' },
103
+ ];
104
+
105
+ const handleAction = async (tool: IToolBtn) => {
106
+ if (tool.id === 'delete') {
107
+ // 只有用户在弹窗中点击"删除"确认后,才会走到这里
108
+ console.log('执行删除:', tool.id);
109
+ }
110
+ };
111
+ </script>
112
+ ```
113
+
114
+ ## API
115
+
116
+ ### Props
117
+
118
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
119
+ | ------------ | -------------------------------------------------------------------------- | ---- | ------ | -------------------------------------------------------------------- |
120
+ | id | `string` | 是 | — | 按钮标识,传 `"delete"` 时显示删除图标 |
121
+ | name | `string` | 否 | — | 按钮名称,`id` 无对应图标时作为文本内容渲染 |
122
+ | description | `string` | 否 | — | `ToolBtn` 的 tooltip 文本;`disabled=true` 时不显示 |
123
+ | disabled | `boolean` | 否 | — | 禁用态;`true` 时点击不弹出确认弹窗,`ToolBtn` 同步禁用 |
124
+ | tippyOptions | `Partial<Omit<TippyOptions, 'getReferenceClientRect' \| 'triggerTarget'>>` | 否 | — | 覆盖确认弹窗(`Tippy`)的默认配置;可覆盖 `placement`、`appendTo` 等 |
125
+
126
+ ### Events
127
+
128
+ | 事件名 | 参数 | 触发时机 |
129
+ | ------- | ---- | ---------------------------------- |
130
+ | confirm | — | 用户在确认弹窗点击"删除"按钮后触发 |
131
+ | cancel | — | 用户在确认弹窗点击"取消"按钮后触发 |
132
+
133
+ ## 类型定义
134
+
135
+ ```typescript
136
+ import type { IToolBtn } from '@blueking/chat-x';
137
+ import type { TippyOptions } from 'vue-tippy';
138
+
139
+ export type DeleteToolProps = IToolBtn & {
140
+ disabled?: boolean;
141
+ tippyOptions?: Partial<Omit<TippyOptions, 'getReferenceClientRect' | 'triggerTarget'>>;
142
+ };
143
+ ```
144
+
145
+ ## 样式说明
146
+
147
+ 确认弹窗(`.ai-delete-confirm`)样式:
148
+
149
+ ```scss
150
+ .ai-delete-confirm {
151
+ width: 280px;
152
+ padding: 16px;
153
+ font-size: 12px;
154
+ color: #4d4f56;
155
+ background: #fff;
156
+ border: 1px solid #dcdee5;
157
+ box-shadow: 0 2px 6px 0 #0000001a;
158
+
159
+ &__title {
160
+ margin-bottom: 6px;
161
+ font-size: 16px;
162
+ font-weight: 600;
163
+ line-height: 22px;
164
+ color: #313238;
165
+ }
166
+
167
+ &__desc {
168
+ margin-bottom: 16px;
169
+ line-height: 20px;
170
+ }
171
+
172
+ &__actions {
173
+ display: flex;
174
+ gap: 8px;
175
+ justify-content: flex-end;
176
+ }
177
+ }
178
+ ```
179
+
180
+ ## 注意事项
181
+
182
+ 1. **确认才触发**:`confirm` 事件只在用户点击弹窗内"删除"按钮后触发;直接点击 `ToolBtn` 触发器不会触发任何业务事件
183
+ 2. **`disabled` 双重保障**:`disabled=true` 时,`ToolBtn` 的 JS 层拦截 click,且 `Tippy` 的 `onShow` 返回 `false`,弹窗不会弹出
184
+ 3. **弹窗挂载至 body**:默认 `appendTo: () => document.body`,避免被父容器 `overflow: hidden` 裁剪
185
+ 4. **组件卸载自动关闭**:`onUnmounted` 时调用 `hide()` 关闭弹窗,防止组件销毁后弹窗残留
186
+ 5. **`MessageTools` 自动处理**:通常不需要直接使用此组件,`MessageTools` 会在 `id === 'delete'` 时自动替换
187
+
188
+ ## 关联组件
189
+
190
+ - [ToolBtn](/components/feedback/tool-btn) — 触发按钮
191
+ - [MessageTools](/components/feedback/message-tools) — 工具栏中 delete 替换入口
@@ -0,0 +1,162 @@
1
+ # DescPanel 描述面板
2
+
3
+ > 能力域:内容渲染 | 未从包入口导出:内部组件,请通过上层组件使用 | since 1.0.0
4
+
5
+ 将文本或 JSON 内容降级为可读描述面板。 源码位置:src/components/tool-call/desc-panel/desc-panel.vue。
6
+
7
+ **关联**:toolcall-render(工具调用详情中渲染描述与参数)、tool-message(工具返回内容同样由 DescPanel 承载)、highlight-keyword(键值与文本匹配关键词高亮)
8
+
9
+ ---
10
+
11
+ # DescPanel 描述面板
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/tool-call/desc-panel/desc-panel.vue`
15
+ - **能力域**:内容渲染
16
+ - **能力说明**:将文本或 JSON 内容降级为可读描述面板。
17
+
18
+ > **能力域**:内容渲染
19
+
20
+ 工具调用(ToolCall)详情面板的描述区域组件,主要用于 `ToolcallRender` 内部的折叠面板中。
21
+
22
+ 将 `desc` 字符串尝试解析为 JSON,解析成功且结果为对象/数组时以键值对列表渲染,否则作为纯文本展示。
23
+
24
+ ## 组件结构
25
+
26
+ ```
27
+ .ai-toolcall-desc(flex column,padding: 0 16px,max-height: 300px,overflow-y: auto,
28
+ font-size: 12px,line-height: 20px,color: #4d4f56,background: #f5f7fa,radius: 2px)
29
+ ├── .desc-title(sticky top: 0,flex + gap 4px,padding: 12px 0 4px,加粗,背景同面板)
30
+ │ ├── {{ title }}
31
+ │ └── .desc-copy(v-if desc;CopyIcon 14×14,margin-left: auto,默认 visibility: hidden)
32
+ └── .desc-panel(flex column,gap: 4px,padding-bottom: 12px)
33
+ ├── [JSON 对象/数组] v-for 逐项渲染 .desc-panel-item
34
+ │ ├── .desc-label → HighlightKeyword(key) + 半角冒号
35
+ │ └── .desc-value → HighlightKeyword(值的文本或 JSON 字符串),`word-break: break-all`
36
+ └── [非 JSON / 解析失败] HighlightKeyword(data),`word-break: break-all`
37
+ ```
38
+
39
+ 面板整体限高 **300px**,超出后内部滚动,`.desc-title` 吸顶不动。纵向留白由标题的 `padding-top` 与内容区的 `padding-bottom` 承担(容器自身不设上下 padding),避免标题吸顶时上方留白漏出滚动内容。
40
+
41
+ > **说明**:键值与纯文本均通过 `HighlightKeyword` 展示,长内容依赖换行与面板宽度展示,**不再**使用 `v-overflow-tips` 悬停气泡。
42
+
43
+ ## 复制原始内容
44
+
45
+ `desc` 有值时,标题右侧渲染复制按钮(`.desc-copy`),默认 `visibility: hidden`,鼠标移入面板后显示,图标默认 `#979ba5`、hover `#3a84ff`:
46
+
47
+ ```typescript
48
+ // 复制的是原始 desc 字符串,而非解析后的展示内容,便于粘贴后二次使用
49
+ const handleCopy = () => {
50
+ if (props.desc) {
51
+ copy(props.desc);
52
+ }
53
+ };
54
+ ```
55
+
56
+ 复制能力来自 [useClipboard](/composables/use-clipboard),复制结果的成功/失败提示由该 composable 统一处理。`desc` 为空时按钮不渲染。
57
+
58
+ ## desc 解析规则
59
+
60
+ `data` 是一个 computed,逻辑如下:
61
+
62
+ ```typescript
63
+ const data = computed(() => {
64
+ try {
65
+ return JSON.parse(props.desc || ''); // desc 为 undefined/''/null 时 parse('') 会抛出
66
+ } catch {
67
+ return props.desc; // 解析失败,原样返回字符串
68
+ }
69
+ });
70
+ ```
71
+
72
+ 模板通过 `typeof data === 'object'` 分支渲染:
73
+
74
+ | desc 值 | JSON.parse 结果 | typeof 结果 | 渲染方式 |
75
+ | ------------------ | --------------- | ----------- | ------------------------ |
76
+ | `'{"a":1}'` | `{ a: 1 }` | `'object'` | 键值对列表 |
77
+ | `'[1,2,3]'` | `[1, 2, 3]` | `'object'` | 索引键值对(0:、1:、2:) |
78
+ | `'{}'` | `{}` | `'object'` | 键值对列表(0 行) |
79
+ | `'"hello"'` | `"hello"` | `'string'` | 纯文本 |
80
+ | `'42'` | `42` | `'number'` | 纯文本 |
81
+ | `'普通文本'` | 解析抛出 | — | 纯文本(原始字符串) |
82
+ | `''` / `undefined` | 解析抛出 | — | 纯文本(空白) |
83
+
84
+ > **嵌套对象**:值本身是对象时,文本区域通过 `JSON.stringify(value)` 展示完整 JSON(`HighlightKeyword` + `word-break: break-all`),不再使用悬停 tooltip。
85
+
86
+ ## 基础用法:JSON 参数
87
+
88
+ ```vue
89
+ <template>
90
+ <DescPanel
91
+ title="工具调用参数"
92
+ desc='{"query": "天气查询", "city": "北京", "unit": "celsius"}'
93
+ />
94
+ </template>
95
+
96
+ <script setup lang="ts">
97
+ import { DescPanel } from '@blueking/chat-x';
98
+ </script>
99
+ ```
100
+
101
+ ## 纯文本描述
102
+
103
+ `desc` 不是合法 JSON 时作为纯文本渲染:
104
+
105
+ ```vue
106
+ <template>
107
+ <DescPanel
108
+ title="执行说明"
109
+ desc="正在查询北京的实时天气,请稍候..."
110
+ />
111
+ </template>
112
+ ```
113
+
114
+ ## JSON 数组
115
+
116
+ JSON 数组同样被视为 `object`,以数组索引(`0:`、`1:`…)作为键渲染:
117
+
118
+ ```vue
119
+ <template>
120
+ <DescPanel
121
+ title="文件列表"
122
+ desc='["report.pdf", "data.csv", "readme.md"]'
123
+ />
124
+ </template>
125
+ ```
126
+
127
+ ## 嵌套 JSON
128
+
129
+ 嵌套对象的值在文本区域直接渲染为 `JSON.stringify(value)` 字符串,便于在面板内换行阅读:
130
+
131
+ ```vue
132
+ <template>
133
+ <DescPanel
134
+ title="API 配置"
135
+ desc='{"endpoint": "/api/search", "headers": {"Authorization": "Bearer xxx", "Content-Type": "application/json"}, "timeout": 5000}'
136
+ />
137
+ </template>
138
+ ```
139
+
140
+ ## 无 desc
141
+
142
+ `desc` 为可选,不传时面板仅显示标题,内容区域为空,复制按钮也不渲染:
143
+
144
+ ## API
145
+
146
+ ### Props
147
+
148
+ | 属性名 | 类型 | 必填 | 说明 |
149
+ | ------ | -------- | ---- | ----------------------------------------------------------------------------------- |
150
+ | title | `string` | ✓ | 面板标题,始终渲染在顶部(吸顶) |
151
+ | desc | `string` | — | 描述内容;尝试 `JSON.parse`,成功且为 `object` 类型时渲染键值对列表,否则渲染纯文本;有值时才渲染复制按钮 |
152
+
153
+ ## 使用场景
154
+
155
+ `DescPanel` 主要由 `ToolcallRender` 在展开的详情面板中使用,渲染两块内容:**描述**(`function.description`)与**参数**(`function.arguments`);工具返回结果则由 `ToolMessage` 再包一层 `DescPanel`(标题「返回内容」)展示。通常不需要手动引入,如需独立使用,直接传入 `title` 和 `desc` 即可。
156
+
157
+ ## 关联组件
158
+
159
+ - [ToolcallRender](/components/agent/toolcall-render) — 主要使用场景
160
+ - [ToolMessage](/components/message/tool-message) — 工具返回内容面板
161
+ - [HighlightKeyword](/components/helper/highlight-keyword) — 键值高亮
162
+ - [useClipboard](/composables/use-clipboard) — 复制按钮能力来源
@@ -0,0 +1,91 @@
1
+ # DetailSection 详情分段
2
+
3
+ > 能力域:Agent 能力 | 未从包入口导出:内部组件,请通过上层组件使用 | since 1.0.0
4
+
5
+ FlowAgent 节点详情中的标题/内容分段容器。 源码位置:src/components/chat-content/flow-agent-content/detail-section.vue。
6
+
7
+ **关联**:flow-agent-node-detail(节点详情中用于承载基础信息、输入参数、输出参数等区块)、simple-table(常作为分段内容展示结构化参数表格)
8
+
9
+ ---
10
+
11
+ # DetailSection 详情分段
12
+
13
+ > **能力域**:Agent 能力
14
+
15
+ `DetailSection` 是 FlowAgent 节点详情页中的轻量分段容器,用于给一组相关信息提供统一标题样式。组件自身只负责渲染标题和默认插槽,不处理数据格式、折叠、空态或表格逻辑。
16
+
17
+ 通常不需要单独接入,主要由 `FlowAgentNodeDetail` 内部组合使用。
18
+
19
+ ## 源码事实
20
+
21
+ - **源码位置**:`src/components/chat-content/flow-agent-content/detail-section.vue`
22
+ - **能力说明**:FlowAgent 节点详情中的标题/内容分段容器。
23
+
24
+ ## 核心能力
25
+
26
+ - **统一标题样式**:标题前带蓝色竖条,标题文本使用详情页统一字号与字重
27
+ - **内容完全透传**:通过默认插槽承载任意内容,如基础信息表单、`SimpleTable` 或自定义说明
28
+ - **无内部状态**:不维护折叠、加载、选择等状态,适合作为详情页布局基础块
29
+
30
+ ## 基础用法
31
+
32
+ ```vue
33
+ <template>
34
+ <DetailSection title="基础信息">
35
+ <div class="info-row">节点名称:采集主机指标</div>
36
+ </DetailSection>
37
+ </template>
38
+
39
+ <script setup lang="ts">
40
+ import DetailSection from '@blueking/chat-x/src/components/chat-content/flow-agent-content/detail-section.vue';
41
+ </script>
42
+ ```
43
+
44
+ **渲染效果**
45
+
46
+ ## 搭配 SimpleTable
47
+
48
+ `DetailSection` 最常见的用法是包裹结构化内容,由外层负责分段标题,内部组件负责数据展示。
49
+
50
+ ```vue
51
+ <template>
52
+ <DetailSection title="输入参数">
53
+ <SimpleTable
54
+ :columns="columns"
55
+ :data="data"
56
+ />
57
+ </DetailSection>
58
+ </template>
59
+ ```
60
+
61
+ ## API
62
+
63
+ ### Props
64
+
65
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
66
+ | ------ | -------- | ---- | ------ | -------- |
67
+ | title | `string` | 是 | — | 分段标题 |
68
+
69
+ ### Emits
70
+
71
+ - 无。
72
+
73
+ ### Slots
74
+
75
+ | 插槽名 | 说明 |
76
+ | ------- | ---------------- |
77
+ | default | 分段主体展示内容 |
78
+
79
+ ### Expose
80
+
81
+ - 无。
82
+
83
+ ## 使用建议
84
+
85
+ - 用于详情页内部的短分段,不建议作为通用卡片或页面 Section 使用。
86
+ - 内容空态应由插槽内组件自行处理,`DetailSection` 不会主动显示空态。
87
+
88
+ ## 关联组件
89
+
90
+ - [FlowAgentNodeDetail](./flow-agent-node-detail.md) — 节点详情主体。
91
+ - [SimpleTable](./simple-table.md) — 分段内常用的轻量表格。