@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,427 @@
1
+ # MessageTools 消息工具栏
2
+
3
+ > 能力域:工具与反馈 | 导入:`import { MessageTools } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 消息悬浮工具栏,组合复制、删除、反馈等工具按钮;提供 prepend / append 两端插槽承载消息时间等附加内容。 源码位置:src/components/message-tools/message-tools.vue。
6
+
7
+ **关联**:tool-btn(普通工具项由 ToolBtn 渲染)、user-feedback(like/unlike 时弹出反馈表单)、delete-tool(id 为 delete 时替换为带确认的删除按钮)、message-time(通过 prepend / append 插槽嵌入消息时间)
8
+
9
+ ---
10
+
11
+ # MessageTools 消息工具栏
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/message-tools/message-tools.vue`
15
+ - **能力域**:工具与反馈
16
+ - **能力说明**:消息悬浮工具栏,组合复制、删除、反馈等工具按钮。
17
+
18
+ > **能力域**:工具与反馈
19
+
20
+ AI 消息的操作工具栏组件,由**左侧消息工具区**和**右侧更新工具区**两部分组成,中间以分隔线分隔;两端另有 `prepend` / `append` 插槽用于挂载消息时间等附加内容。仅 `like` / `unlike` 按钮会弹出反馈表单(`UserFeedback`),其余按钮直接触发 `onAction`。
21
+
22
+ ## 组件结构
23
+
24
+ ```
25
+ ┌───────────────────────────────────────────────────────────────────────┐
26
+ │ .ai-message-tools-container(display: flex,gap: 4px) │
27
+ │ ┌────────┐ ┌─────────────────────┐ │ ┌───────────────┐ ┌───────┐ │
28
+ │ │#prepend│ │ messageTools │ │ │ updateTools │ │#append│ │
29
+ │ │ │ │ copy rebuild share │ │ │ like unlike… │ │ │ │
30
+ │ └────────┘ └─────────────────────┘ │ └───────────────┘ └───────┘ │
31
+ │ 插槽区 左侧区域 分隔线 右侧区域 插槽区 │
32
+ └───────────────────────────────────────────────────────────────────────┘
33
+ ```
34
+
35
+ - 分隔线(`.ai-divider`)与**右侧更新工具区**均仅在 `updateTools` 非空时渲染
36
+ - `updateTools` 中 `id` 为 `like` / `unlike` 的按钮被 `Tippy` 弹窗包裹,点击后展示 `UserFeedback` 反馈表单
37
+ - `updateTools` 中 `id` 为 `delete` 的按钮使用 `DeleteTool` 组件,点击后展示**确认删除弹窗**(含"删除"/"取消"按钮),确认后触发 `onAction`
38
+ - `updateTools` 中其他按钮直接触发 `onAction`,不弹表单
39
+ - `messageTools` 中 `id` 为 `delete` 的按钮同样使用 `DeleteTool` 组件弹确认框
40
+
41
+ ## 基础用法
42
+
43
+ ```vue
44
+ <template>
45
+ <MessageTools
46
+ :on-action="handleAction"
47
+ @feedback="handleFeedback"
48
+ />
49
+ </template>
50
+
51
+ <script setup lang="ts">
52
+ import { MessageTools, type IToolBtn } from '@blueking/chat-x';
53
+
54
+ // like / unlike 必须返回 Promise<string[]>,作为反馈表单的选项
55
+ const handleAction = async (tool: IToolBtn) => {
56
+ if (tool.id === 'like' || tool.id === 'unlike') {
57
+ return ['回答准确', '信息全面', '表达清晰', '解决了问题'];
58
+ }
59
+ };
60
+
61
+ // 用户在反馈表单点击"提交"后触发
62
+ const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
63
+ console.log('反馈:', tool.id, reasonList, otherReason);
64
+ };
65
+ </script>
66
+ ```
67
+
68
+ **渲染效果**
69
+
70
+ ## 反馈交互流程
71
+
72
+ 点赞(`like`)和不满意(`unlike`)按钮的完整交互流程:
73
+
74
+ ```
75
+ 用户点击 like/unlike
76
+
77
+
78
+ 调用 onAction(tool)(显示 loading 状态)
79
+
80
+
81
+ onAction 返回 string[](反馈选项列表)
82
+
83
+
84
+ 弹出 UserFeedback 表单(显示选项)
85
+
86
+ ┌────┴────┐
87
+ 取消 提交
88
+ │ │
89
+ 关闭弹窗 emit('feedback', tool, reasonList, otherReason)
90
+
91
+
92
+ 按钮切换为激活图标(activeLike / activeUnLike)
93
+ ↑ 再次点击同一按钮 → 取消激活并关闭弹窗(不触发 feedback)
94
+ ```
95
+
96
+ **图标切换说明**:
97
+
98
+ | 状态 | `like` 按钮图标 | `like` Tooltip | `unlike` 按钮图标 | `unlike` Tooltip |
99
+ | ------------ | ------------------------ | ---------------- | -------------------------- | ---------------- |
100
+ | 未提交 | `like`(空心) | 原始 description | `unlike`(空心) | 原始 description |
101
+ | 已提交点赞 | `activeLike`(实心填充) | 取消满意 | `unlike`(空心) | 原始 description |
102
+ | 已提交不满意 | `like`(空心) | 原始 description | `activeUnLike`(实心填充) | 取消不满意 |
103
+
104
+ > 激活态下 tooltip 内容自动切换为"取消满意"/"取消不满意",用于提示用户再次点击可取消评价。
105
+
106
+ ## 默认工具列表
107
+
108
+ ### messageTools(左侧)
109
+
110
+ ```typescript
111
+ const CONST_MESSAGE_TOOLS = [
112
+ { id: 'copy', name: '复制', description: '复制' },
113
+ { id: 'rebuild', name: '重新生成', description: '重新生成将清空下文内容' },
114
+ { id: 'share', name: '分享', description: '分享' },
115
+ ];
116
+ ```
117
+
118
+ 用户消息的内置列表(`CONST_USER_MESSAGE_TOOLS`,由 [UserMessage](/components/message/user-message) 使用):
119
+
120
+ ```typescript
121
+ const CONST_USER_MESSAGE_TOOLS = [
122
+ { id: 'copy', name: '复制', description: '复制' },
123
+ { id: 'edit', name: '编辑', description: '编辑' },
124
+ { id: 'delete', name: '删除', description: '删除' },
125
+ ];
126
+ ```
127
+
128
+ > `cite`(引用)已从两份内置列表中移除,后续不再支持;`ToolBtn` 仍保留该 id 的图标,业务侧可自行把它作为自定义按钮传入。
129
+
130
+ ### updateTools(右侧)
131
+
132
+ ```typescript
133
+ const CONST_UPDATE_TOOLS = [
134
+ { id: 'like', name: '点赞', description: '点赞' },
135
+ { id: 'unlike', name: '不满意', description: '不满意' },
136
+ { id: 'delete', name: '删除', description: '删除' },
137
+ ];
138
+ ```
139
+
140
+ > **注意**:`delete` 在 `updateTools` 中**不弹反馈表单**,而是弹出确认删除弹窗(`DeleteTool`)。用户确认后才触发 `onAction`,取消则不触发。
141
+
142
+ ## 内置图标 ID
143
+
144
+ `ToolBtn` 会根据 `tool.id` 自动匹配图标,支持以下 ID:
145
+
146
+ | ID | 图标说明 |
147
+ | -------------- | ------------------------------------ |
148
+ | `copy` | 复制 |
149
+ | `cite` | 引用(不再属于内置列表,可用于自定义按钮) |
150
+ | `rebuild` | 重新生成 |
151
+ | `share` | 分享 |
152
+ | `like` | 点赞(空心) |
153
+ | `unlike` | 不满意(空心) |
154
+ | `delete` | 删除 |
155
+ | `edit` | 编辑 |
156
+ | `activeLike` | 点赞已激活(实心,由组件内部使用) |
157
+ | `activeUnLike` | 不满意已激活(实心,由组件内部使用) |
158
+
159
+ > ID 不在列表中时,按钮显示 `tool.name` 文本。
160
+
161
+ ## 仅显示消息工具(不含反馈)
162
+
163
+ 将 `updateTools` 设为空数组可去掉右侧反馈按钮和分隔线:
164
+
165
+ ```vue
166
+ <template>
167
+ <MessageTools
168
+ :message-tools="messageTools"
169
+ :update-tools="[]"
170
+ :on-action="handleAction"
171
+ />
172
+ </template>
173
+
174
+ <script setup lang="ts">
175
+ import { MessageTools, type IToolBtn } from '@blueking/chat-x';
176
+
177
+ const messageTools: IToolBtn[] = [
178
+ { id: 'copy', name: '复制', description: '复制' },
179
+ { id: 'cite', name: '引用', description: '引用' },
180
+ ];
181
+
182
+ const handleAction = async (tool: IToolBtn) => {
183
+ console.log('操作:', tool.id);
184
+ };
185
+ </script>
186
+ ```
187
+
188
+ **渲染效果**
189
+
190
+ ## 自定义工具列表
191
+
192
+ `messageTools` 和 `updateTools` 均可完全替换:
193
+
194
+ ```vue
195
+ <template>
196
+ <MessageTools
197
+ :message-tools="customMessageTools"
198
+ :update-tools="customUpdateTools"
199
+ :on-action="handleAction"
200
+ @feedback="handleFeedback"
201
+ />
202
+ </template>
203
+
204
+ <script setup lang="ts">
205
+ import { MessageTools, type IToolBtn } from '@blueking/chat-x';
206
+
207
+ const customMessageTools: IToolBtn[] = [
208
+ { id: 'copy', name: '复制', description: '复制消息内容' },
209
+ { id: 'rebuild', name: '重新生成', description: '重新生成回答' },
210
+ { id: 'custom-action', name: '自定义', description: '自定义操作' }, // 无图标,显示文本
211
+ ];
212
+
213
+ // like / unlike 仍会触发反馈弹窗;delete 弹确认框,确认后触发 onAction
214
+ const customUpdateTools: IToolBtn[] = [
215
+ { id: 'like', name: '有帮助', description: '这个回答对我有帮助' },
216
+ { id: 'unlike', name: '没帮助', description: '这个回答没有帮助' },
217
+ { id: 'delete', name: '删除', description: '删除消息' },
218
+ ];
219
+
220
+ const handleAction = async (tool: IToolBtn) => {
221
+ if (tool.id === 'like' || tool.id === 'unlike') {
222
+ return ['回答准确', '信息全面', '表达清晰', '解决了问题'];
223
+ }
224
+ console.log('操作:', tool.id);
225
+ };
226
+
227
+ const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
228
+ console.log('反馈:', tool.id, reasonList, otherReason);
229
+ };
230
+ </script>
231
+ ```
232
+
233
+ **渲染效果**
234
+
235
+ ## 两端插槽(prepend / append)
236
+
237
+ `prepend`(工具图标左侧)与 `append`(工具图标右侧)用于在工具栏两端挂载附加内容,项目内用于放置 [MessageTime 消息时间](/components/feedback/message-time):
238
+
239
+ | 场景 | 使用插槽 | 效果 |
240
+ | --------- | --------- | --------------------------------------- |
241
+ | 用户消息 | `prepend` | 时间显示在工具图标左侧 |
242
+ | AI 消息组 | `append` | 时间显示在工具图标右侧 |
243
+
244
+ ```vue
245
+ <template>
246
+ <MessageTools :on-action="handleAction">
247
+ <template #append>
248
+ <MessageTime :created-at="createdAt" />
249
+ </template>
250
+ </MessageTools>
251
+ </template>
252
+
253
+ <script setup lang="ts">
254
+ import { MessageTime, MessageTools } from '@blueking/chat-x';
255
+ </script>
256
+ ```
257
+
258
+ - 插槽包裹容器(`.ai-message-tools-prepend` / `.ai-message-tools-append`)仅在对应插槽传入时渲染
259
+ - 插槽内容为空时(如消息无 `createdAt`,`MessageTime` 不渲染任何 DOM),包裹容器命中 `:empty` 被收起,不会留下多余间距
260
+
261
+ ## 工具栏状态控制
262
+
263
+ `messageToolsStatus` 控制工具栏整体状态:
264
+
265
+ | 值 | 效果 |
266
+ | ----------- | ---------------------------------------------------------------------- |
267
+ | `undefined` | 默认,按钮正常可点击,hover 有 tooltip |
268
+ | `disabled` | 按钮显示但不可点击,tooltip 不显示,反馈弹窗无法打开 |
269
+ | `hidden` | `MessageContainer` 检测到此值时不渲染 `MessageTools`(组件自身不处理) |
270
+
271
+ > `hidden` 由 `MessageContainer` 在外部用 `v-if` 判断,`MessageTools` 本身不感知该值。
272
+
273
+ **禁用状态**
274
+
275
+ ```vue
276
+ <template>
277
+ <MessageTools
278
+ :message-tools-status="MessageToolsStatus.Disabled"
279
+ :on-action="handleAction"
280
+ @feedback="handleFeedback"
281
+ />
282
+ </template>
283
+ ```
284
+
285
+ ## 自定义 Tippy 配置
286
+
287
+ 反馈弹窗的 `Tippy` 默认配置如下,可通过 `tippyOptions` 覆盖:
288
+
289
+ ```typescript
290
+ // 内部默认值
291
+ {
292
+ arrow: false,
293
+ interactive: true,
294
+ offset: [0, 6],
295
+ theme: 'ai-chat-box-light light',
296
+ trigger: 'click',
297
+ appendTo: () => document.body,
298
+ }
299
+ ```
300
+
301
+ ```vue
302
+ <template>
303
+ <MessageTools
304
+ :on-action="handleAction"
305
+ :tippy-options="tippyOptions"
306
+ @feedback="handleFeedback"
307
+ />
308
+ </template>
309
+
310
+ <script setup lang="ts">
311
+ import { MessageTools, type IToolBtn } from '@blueking/chat-x';
312
+
313
+ const tippyOptions = {
314
+ placement: 'top', // 弹窗方向
315
+ offset: [0, 12], // 偏移量
316
+ appendTo: () => document.querySelector('#my-container') || document.body,
317
+ };
318
+
319
+ const handleAction = async (tool: IToolBtn) => {
320
+ if (tool.id === 'like' || tool.id === 'unlike') {
321
+ return ['回答准确', '信息全面'];
322
+ }
323
+ };
324
+ const handleFeedback = (tool: IToolBtn, reasonList: string[], otherReason: string) => {
325
+ console.log('反馈:', tool.id, reasonList);
326
+ };
327
+ </script>
328
+ ```
329
+
330
+ > **注意**:`content`、`theme`、`getReferenceClientRect`、`triggerTarget` 四个选项由组件内部管理,不可通过 `tippyOptions` 覆盖。
331
+
332
+ ## 在 MessageContainer 中的使用
333
+
334
+ `MessageContainer` 在每个 Assistant 消息组底部自动渲染 `MessageTools`,无需手动引入:
335
+
336
+ ```vue
337
+ <template>
338
+ <MessageContainer
339
+ :messages="messages"
340
+ :message-status="messageStatus"
341
+ :message-tools-status="messageToolsStatus"
342
+ :on-agent-action="handleAgentAction"
343
+ :on-agent-feedback="handleAgentFeedback"
344
+ @stop-streaming="handleStopStreaming"
345
+ />
346
+ </template>
347
+
348
+ <script setup lang="ts">
349
+ import { computed, ref } from 'vue';
350
+ import { MessageContainer, MessageStatus, MessageToolsStatus, type Message, type IToolBtn } from '@blueking/chat-x';
351
+
352
+ const messageStatus = ref(MessageStatus.Complete);
353
+
354
+ // 流式输出时禁用工具栏,避免误操作
355
+ const messageToolsStatus = computed(() =>
356
+ messageStatus.value === MessageStatus.Streaming ? MessageToolsStatus.Disabled : undefined,
357
+ );
358
+
359
+ // copy 操作由 MessageContainer 内部自动处理(无需在此实现)
360
+ const handleAgentAction = async (tool: IToolBtn, messages: Message[]) => {
361
+ if (tool.id === 'like' || tool.id === 'unlike') {
362
+ return ['回答准确', '信息全面', '表达清晰'];
363
+ }
364
+ };
365
+
366
+ const handleAgentFeedback = (tool: IToolBtn, messages: Message[], reasonList: string[], otherReason: string) => {
367
+ console.log('反馈提交:', tool.id, reasonList, otherReason);
368
+ };
369
+
370
+ const handleStopStreaming = () => {
371
+ messageStatus.value = MessageStatus.Stop;
372
+ };
373
+ </script>
374
+ ```
375
+
376
+ ## API
377
+
378
+ ### Props
379
+
380
+ | 属性名 | 类型 | 默认值 | 说明 |
381
+ | ------------------ | -------------------------------------------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
382
+ | messageTools | `IToolBtn[]` | `CONST_MESSAGE_TOOLS` | 左侧工具列表 |
383
+ | updateTools | `IToolBtn[]` | `CONST_UPDATE_TOOLS` | 右侧工具列表(`like`/`unlike` 弹反馈表单,`delete` 弹确认框,其他直接触发 `onAction`) |
384
+ | messageToolsStatus | `MessageToolsStatus` | — | 工具栏状态:`disabled` 禁用按钮和弹窗 |
385
+ | onAction | `(tool: IToolBtn, content?: UserMessage['content'], docSchema?: TagSchema) => Promise<string[] \| void>` | — | 工具操作回调;`like`/`unlike` 需返回 `string[]` 作为反馈选项;`delete` 确认后触发;`content`、`docSchema` 为可选参数,供上层扩展使用 |
386
+ | tippyOptions | `AITippyProps` | — | 覆盖反馈弹窗和删除确认弹窗的默认配置;可覆盖 `placement` 等 |
387
+
388
+ ### Events
389
+
390
+ | 事件名 | 参数 | 触发时机 |
391
+ | -------- | ------------------------------------------------------------- | ------------------------------------------ |
392
+ | feedback | `(tool: IToolBtn, reasonList: string[], otherReason: string)` | 用户在反馈表单点击"提交"后触发(not 取消) |
393
+
394
+ ### Slots
395
+
396
+ | 插槽名 | 作用域参数 | 说明 |
397
+ | ------- | ---------- | ------------------------------------------------ |
398
+ | prepend | — | 工具图标左侧的附加内容,如用户消息的时间 |
399
+ | append | — | 工具图标右侧的附加内容,如 AI 消息组的时间 |
400
+
401
+ ## 类型定义
402
+
403
+ ```typescript
404
+ import { MessageToolsStatus, type IToolBtn } from '@blueking/chat-x';
405
+ import type { Component, VNode } from 'vue';
406
+
407
+ interface IToolBtn {
408
+ id?: (string & {}) | ToolIcons; // 工具唯一标识;命中 ToolIconsMap 显示内置图标,否则显示 name 文本;支持业务自定义字符串
409
+ name?: string; // 工具名称,无对应图标时显示;也用作 tooltip fallback
410
+ description?: string; // tooltip 文本
411
+ icon?: Component | VNode; // 自定义图标(组件/VNode),优先级高于内置 ToolIconsMap[id]
412
+ hidden?: boolean; // 按 id 合并时隐藏该按钮(仅在 MessageContainer/ChatContainer 合并语义下生效)
413
+ triggerSelection?: boolean; // 标记点击后进入多选态(复用 share 选择流程),确认走 confirmShare
414
+ }
415
+
416
+ enum MessageToolsStatus {
417
+ Disabled = 'disabled', // 禁用:按钮显示但不可点击,弹窗不打开
418
+ Hidden = 'hidden', // 隐藏:由 MessageContainer 外部 v-if 控制,组件本身不处理
419
+ }
420
+ ```
421
+
422
+ ## 关联组件
423
+
424
+ - [ToolBtn](/components/feedback/tool-btn) — 单项工具按钮
425
+ - [UserFeedback](/components/feedback/user-feedback) — 点赞/踩反馈面板
426
+ - [DeleteTool](/components/feedback/delete-tool) — 删除二次确认
427
+ - [MessageTime](/components/feedback/message-time) — 两端插槽内的消息时间
@@ -0,0 +1,157 @@
1
+ # ModelSelector 模型选择器
2
+
3
+ > 能力域:输入交互 | 导入:`import { ModelSelector } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 聊天输入区的模型下拉选择器,支持搜索过滤、能力标签与键盘导航。 源码位置:src/components/chat-input/model-selector/model-selector.vue。
6
+
7
+ **关联**:chat-input(传入 models 后在发送按钮左侧默认渲染)、input-attachment(通过 before-send 插槽与发送按钮成组布局)
8
+
9
+ ---
10
+
11
+ # ModelSelector 模型选择器
12
+
13
+ ## 源码事实
14
+
15
+ - **源码位置**:`src/components/chat-input/model-selector/model-selector.vue`
16
+ - **能力域**:输入交互
17
+ - **能力说明**:基于 Tippy 下拉的模型选择器,包含触发器、搜索面板与能力标签展示;数据过滤逻辑由 `useModelSelector` composable 承担。
18
+
19
+ > **能力域**:输入交互
20
+
21
+ 可在 [ChatInput](/components/input/chat-input) 传入 `models` 后自动出现在发送按钮左侧,也可单独使用。
22
+
23
+ ## 组件结构
24
+
25
+ ```
26
+ ModelSelector(Tippy 容器,theme: ai-model-selector)
27
+ ├── ModelSelectorTrigger(触发器:图标 + 名称 + 箭头)
28
+ └── ModelSelectorPanel(下拉面板)
29
+ ├── 搜索框(展开后自动聚焦)
30
+ └── 模型列表(支持键盘导航、选中态、禁用态、能力标签)
31
+ ```
32
+
33
+ ## 基础用法
34
+
35
+ 选中值为模型的 `llm_name`;能力标签由组件依据 `property`(`support_thinking` / `support_thinking_quick` / `support_vision`)自动派生,无需调用方传入。
36
+
37
+ ```vue
38
+ <template>
39
+ <ModelSelector
40
+ v-model="selectedModel"
41
+ :models="models"
42
+ @change="handleModelChange"
43
+ />
44
+ </template>
45
+
46
+ <script setup lang="ts">
47
+ import { ref } from 'vue';
48
+ import { ModelSelector, type IModelOption } from '@blueking/chat-x';
49
+
50
+ // 选中值为 llm_name
51
+ const selectedModel = ref('DeepSeek-V4-Pro-Online-32k');
52
+ const models: IModelOption[] = [
53
+ {
54
+ id: 119,
55
+ llm_code: 'DeepSeek-V4-Pro-Online-32k',
56
+ llm_name: 'DeepSeek-V4-Pro-Online-32k',
57
+ llm_type: 'chat.completion',
58
+ space_auth_mode: 'APPLY',
59
+ user_auth_mode: 'PUBLIC',
60
+ max_token_size: 4096,
61
+ icon: 'https://example.com/deepseek.png',
62
+ description: 'DeepSeek-V4-Pro 旗舰版本,支持超长上下文与复杂任务处理',
63
+ base_model: 'deepseek',
64
+ tag_names: [],
65
+ // support_thinking → 深度思考、support_vision → 图生文
66
+ property: { support_thinking: true, support_vision: true, max_model_len: 32000 },
67
+ },
68
+ ];
69
+
70
+ const handleModelChange = (model: IModelOption) => {
71
+ console.log('选中模型:', model);
72
+ };
73
+ </script>
74
+ ```
75
+
76
+ ## API
77
+
78
+ ### Props
79
+
80
+ | 属性名 | 类型 | 默认值 | 说明 |
81
+ | ----------------- | -------------------------------------------------------------------------- | ---------------- | -------------------------------------- |
82
+ | disabled | `boolean` | `false` | 是否禁用整个选择器 |
83
+ | models | `IModelOption[]` | `[]` | 可选模型列表 |
84
+ | placeholder | `string` | `选择模型` | trigger 无选中时的占位文案 |
85
+ | searchPlaceholder | `string` | `搜索模型关键字` | 搜索框占位文案 |
86
+ | tippyOptions | `Partial<Omit<TippyOptions, 'getReferenceClientRect' \| 'triggerTarget'>>` | — | 透传给 Tippy 的额外配置 |
87
+
88
+ ### v-model
89
+
90
+ | 属性名 | 类型 | 说明 |
91
+ | ------ | -------- | ----------------------------- |
92
+ | — | `string` | 当前选中模型的 `llm_name` 值 |
93
+
94
+ ### Events
95
+
96
+ | 事件名 | 参数 | 说明 |
97
+ | ------ | ----------------------- | -------------------- |
98
+ | change | `(model: IModelOption)` | 用户选中模型时触发 |
99
+
100
+ ## 类型定义
101
+
102
+ ```typescript
103
+ import type { IModelCapability, IModelOption, IModelProperty, ModelCapabilityTheme } from '@blueking/chat-x';
104
+
105
+ type ModelCapabilityTheme = 'default' | 'primary' | 'success' | 'warning';
106
+
107
+ // 能力标签由组件依据 property 派生(文案走内置 i18n)
108
+ interface IModelCapability {
109
+ theme?: ModelCapabilityTheme;
110
+ text: string;
111
+ }
112
+
113
+ // 模型能力属性,决定派生出的能力标签
114
+ interface IModelProperty {
115
+ agent_type?: string;
116
+ default?: boolean;
117
+ is_self_host?: boolean;
118
+ max_model_len?: number;
119
+ support_summary?: boolean;
120
+ support_thinking?: boolean; // → 深度思考
121
+ support_thinking_quick?: boolean; // → 快速思考
122
+ support_tools?: boolean;
123
+ support_vision?: boolean; // → 图生文
124
+ support_window?: boolean;
125
+ }
126
+
127
+ // 模型选项,贴合后端模型接口结构
128
+ interface IModelOption {
129
+ base_model?: string;
130
+ description?: string; // 选项 hover 的 title 提示
131
+ disabled?: boolean; // 前端扩展字段,禁用项不可选中
132
+ icon?: Component | string; // 图标 URL 或 Vue 组件,由 ResourceIcon 渲染
133
+ id: number;
134
+ llm_code: string;
135
+ llm_name: string; // 展示名,同时作为选中值
136
+ llm_type: string;
137
+ max_token_size: number;
138
+ property: IModelProperty;
139
+ space_auth_mode: string;
140
+ tag_names?: string[];
141
+ user_auth_mode: string;
142
+ }
143
+ ```
144
+
145
+ ## 注意事项
146
+
147
+ 1. `models` 为空或 `disabled` 为 `true` 时,下拉不会展开。
148
+ 2. 选中值为模型的 `llm_name`;能力标签由组件依据 `property` 的 `support_thinking` / `support_thinking_quick` / `support_vision` 派生,文案走内置 i18n。
149
+ 3. `description` 会作为选项 hover 的 `title` 提示展示。
150
+ 4. 展开面板后会自动聚焦搜索框;列表支持键盘上下选择与 Enter 确认(复用 `useMenuKeydown`)。
151
+ 5. 图标由 [ResourceIcon](/components/helper/resource-icon) 渲染(`type="model"`):支持图片 URL 或 Vue 组件,URL 加载失败自动回退到内置兜底图标;未提供 `icon` 时不渲染图标位。
152
+
153
+ ## 关联组件
154
+
155
+ - [ChatInput](/components/input/chat-input):传入 `models` 后默认在发送按钮左侧渲染本组件,也可通过 `#model-selector` 插槽完全自定义。
156
+ - [ChatContainer](/components/setup/chat-container):透传 `models` 与 `v-model:selected-model`,并向上 emit `modelChange`。
157
+ - [ResourceIcon](/components/helper/resource-icon):触发器与选项的图标渲染。
@@ -0,0 +1,42 @@
1
+ # PreviewToolbar 图片预览工具栏
2
+
3
+ > 能力域:媒体文件 | 未从包入口导出:内部组件,请通过上层组件使用 | since 1.0.0
4
+
5
+ 图片预览的缩放、旋转、下载等工具按钮。 源码位置:src/components/image-preview/preview-toolbar.vue。
6
+
7
+ ---
8
+
9
+ # PreviewToolbar 图片预览工具栏
10
+
11
+ > **能力域**:媒体文件
12
+
13
+ ## 源码事实
14
+
15
+ - **源码位置**:`src/components/image-preview/preview-toolbar.vue`
16
+ - **能力说明**:图片预览的缩放、旋转、下载等工具按钮。
17
+
18
+ ## API 摘要
19
+
20
+ ### Props
21
+
22
+ - `{ activeIndex: number; currentImageInfo?: null | { resolution?: string; width?: number }; isMultiple: boolean; showInfo: boolean; total: number; }`
23
+
24
+ ### Emits
25
+
26
+ - `{ (e: 'zoomIn'): void; (e: 'zoomOut'): void; (e: 'rotate'): void; (e: 'reset'): void; (e: 'download'): void; }`
27
+
28
+ ### Slots
29
+
30
+ - `extra`
31
+
32
+ ### Expose
33
+
34
+ - 无。
35
+
36
+ ## 组件依赖
37
+
38
+ - 无组件依赖或仅依赖基础库。
39
+
40
+ ## 使用建议
41
+
42
+ - 优先通过上层组合组件使用;直接使用前请确认 props 数据结构来自对应类型定义。