@blueking/chat-x 0.0.4 → 0.0.6

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 (83) hide show
  1. package/dist/index.css +1 -1
  2. package/dist/index.js +2 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp/generated/docs/activity-message.md +428 -0
  5. package/dist/mcp/generated/docs/ai-image.md +227 -0
  6. package/dist/mcp/generated/docs/ai-loading.md +129 -0
  7. package/dist/mcp/generated/docs/ai-selection.md +436 -0
  8. package/dist/mcp/generated/docs/animation-text.md +199 -0
  9. package/dist/mcp/generated/docs/assistant-message.md +424 -0
  10. package/dist/mcp/generated/docs/chat-container.md +365 -0
  11. package/dist/mcp/generated/docs/chat-input.md +625 -0
  12. package/dist/mcp/generated/docs/cite-content.md +138 -0
  13. package/dist/mcp/generated/docs/code-content.md +199 -0
  14. package/dist/mcp/generated/docs/common-error-content.md +70 -0
  15. package/dist/mcp/generated/docs/constants.md +216 -0
  16. package/dist/mcp/generated/docs/content-render.md +238 -0
  17. package/dist/mcp/generated/docs/delete-tool.md +188 -0
  18. package/dist/mcp/generated/docs/desc-panel.md +139 -0
  19. package/dist/mcp/generated/docs/execution-summary.md +126 -0
  20. package/dist/mcp/generated/docs/file-content.md +300 -0
  21. package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
  22. package/dist/mcp/generated/docs/flow-message.md +305 -0
  23. package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
  24. package/dist/mcp/generated/docs/image-content.md +178 -0
  25. package/dist/mcp/generated/docs/image-preview-group.md +181 -0
  26. package/dist/mcp/generated/docs/image-preview.md +224 -0
  27. package/dist/mcp/generated/docs/info-message.md +124 -0
  28. package/dist/mcp/generated/docs/key-value-content.md +124 -0
  29. package/dist/mcp/generated/docs/latex-content.md +196 -0
  30. package/dist/mcp/generated/docs/loading-message.md +171 -0
  31. package/dist/mcp/generated/docs/markdown-content.md +186 -0
  32. package/dist/mcp/generated/docs/markdown-latex.md +208 -0
  33. package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
  34. package/dist/mcp/generated/docs/mermaid-content.md +185 -0
  35. package/dist/mcp/generated/docs/message-container.md +534 -0
  36. package/dist/mcp/generated/docs/message-render.md +329 -0
  37. package/dist/mcp/generated/docs/message-tools.md +376 -0
  38. package/dist/mcp/generated/docs/messages.md +472 -0
  39. package/dist/mcp/generated/docs/overflow-tips.md +209 -0
  40. package/dist/mcp/generated/docs/reasoning-message.md +233 -0
  41. package/dist/mcp/generated/docs/reference-content.md +132 -0
  42. package/dist/mcp/generated/docs/scroll-btn.md +155 -0
  43. package/dist/mcp/generated/docs/selection-footer.md +75 -0
  44. package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
  45. package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
  46. package/dist/mcp/generated/docs/shortcut-render.md +418 -0
  47. package/dist/mcp/generated/docs/text-content.md +74 -0
  48. package/dist/mcp/generated/docs/theme.md +388 -0
  49. package/dist/mcp/generated/docs/tool-btn.md +254 -0
  50. package/dist/mcp/generated/docs/tool-message.md +217 -0
  51. package/dist/mcp/generated/docs/toolcall-render.md +299 -0
  52. package/dist/mcp/generated/docs/use-animation-text.md +198 -0
  53. package/dist/mcp/generated/docs/use-clipboard.md +206 -0
  54. package/dist/mcp/generated/docs/use-command-selection.md +128 -0
  55. package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
  56. package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
  57. package/dist/mcp/generated/docs/use-global-config.md +154 -0
  58. package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
  59. package/dist/mcp/generated/docs/use-message-group.md +175 -0
  60. package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
  61. package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
  62. package/dist/mcp/generated/docs/user-feedback.md +229 -0
  63. package/dist/mcp/generated/docs/user-message.md +347 -0
  64. package/dist/mcp/generated/index.json +1311 -0
  65. package/dist/mcp/index.d.ts +2 -0
  66. package/dist/mcp/index.js +42 -0
  67. package/dist/mcp/index.js.map +1 -0
  68. package/dist/mcp/server.d.ts +2 -0
  69. package/dist/mcp/server.js +43 -0
  70. package/dist/mcp/server.js.map +1 -0
  71. package/dist/mcp/tools/get-component-doc.d.ts +19 -0
  72. package/dist/mcp/tools/get-component-doc.js +60 -0
  73. package/dist/mcp/tools/get-component-doc.js.map +1 -0
  74. package/dist/mcp/tools/list-components.d.ts +35 -0
  75. package/dist/mcp/tools/list-components.js +147 -0
  76. package/dist/mcp/tools/list-components.js.map +1 -0
  77. package/dist/mcp/tools/search-docs.d.ts +14 -0
  78. package/dist/mcp/tools/search-docs.js +82 -0
  79. package/dist/mcp/tools/search-docs.js.map +1 -0
  80. package/dist/mcp/utils/doc-loader.d.ts +35 -0
  81. package/dist/mcp/utils/doc-loader.js +64 -0
  82. package/dist/mcp/utils/doc-loader.js.map +1 -0
  83. package/package.json +5 -7
@@ -0,0 +1,347 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ UserMessage 渲染右对齐用户消息,支持文本、附件、文本/结构化引用、快捷指令与内联编辑。需处理 onAction、onInputConfirm、 onShortcutConfirm 等回调;messageToolsStatus 控制工具栏。由 MessageRender 在 user 角色下使用,常与多选联动。
5
+
6
+ ### 关联组件
7
+ - **message-render** — 由 MessageRender 在 role 为 user 时创建
8
+ - **message-tools** — 消息工具栏交互与状态由 MessageTools 体系承载
9
+ - **message-container** — 嵌入列表时由 MessageContainer 管理分组与多选
10
+
11
+ ---
12
+ <!-- FULL DOC -->
13
+
14
+ # UserMessage 用户消息
15
+
16
+ > **层级**:分子组件 · **功能域**:消息展示
17
+
18
+ 用户消息展示组件,右对齐显示用户发送的消息内容。支持纯文本、多媒体(图片/文件)、文本引用、结构化引用、快捷指令等多种内容形式,以及消息的内联编辑功能。
19
+
20
+ ## 组件结构
21
+
22
+ **正常模式**
23
+
24
+ ```
25
+ .ai-user-message(align-items: flex-end,gap: 6px,font-size: 12px)
26
+ ├── CiteContent(v-if:cite 为字符串)
27
+ │ 紧凑条带(高 28px,灰色 #f5f7fa),引用图标 + 单行截断文本
28
+
29
+ ├── [Binary 图片区] v-if binaryImageFiles.length
30
+ │ .ai-user-message-binary-files → FileContent(readonly=true,图片统一渲染,支持点击预览)
31
+
32
+ ├── [Binary 非图片文件区] v-for binaryNonImageFiles
33
+ │ .ai-user-message-binary-files → FileContent(readonly=true,每个文件独立渲染)
34
+
35
+ ├── .ai-user-message-content(气泡:bg #e1ecff,padding 8×12,border-radius 4px)
36
+ │ v-if: cite 为数组 → KeyValueContent(title + key/value 列表)
37
+ │ v-else-if: content → MarkdownContent × N(每个 text 项一个实例)
38
+
39
+ └── MessageTools(.ai-user-message-tools)
40
+ v-if: messageToolsStatus !== 'hidden'
41
+ visibility: hidden(默认)→ visible(:hover 时)
42
+ tools: [copy, cite, edit],updateTools: []
43
+ ```
44
+
45
+ **编辑模式**(点击 `edit` 按钮后 `isEdit=true`)
46
+
47
+ ```
48
+ .ai-user-message
49
+ ├── CiteContent(同上,不受编辑模式影响)
50
+
51
+ ├── ShortcutRender(v-if: shortcut 有值)
52
+ │ @close → isEdit=false
53
+ │ @submit(formModel) → onShortcutConfirm(formModel) + isEdit=false
54
+
55
+ └── ChatInput(v-else,带自定义 #send-icon slot)
56
+ v-model: editContent(仅含文本内容,数组时取第一个 text 项)
57
+ defaultUploadFiles: binaryFiles
58
+ #send-icon slot → .user-edit-footer
59
+ Button "取消" → isEdit=false
60
+ Button primary "发送" → chatInputRef.triggerSendMessage() + isEdit=false
61
+ ```
62
+
63
+ ## 基础用法
64
+
65
+ `content` 为字符串时,通过 `MarkdownContent` 渲染(支持 Markdown 语法)。
66
+
67
+ ```vue
68
+ <template>
69
+ <UserMessage
70
+ :content="content"
71
+ :on-action="handleAction"
72
+ />
73
+ </template>
74
+
75
+ <script setup lang="ts">
76
+ import { UserMessage, type IToolBtn } from '@blueking/chat-x';
77
+
78
+ const content = '你好,请帮我分析以下这段 Python 代码的性能瓶颈。';
79
+
80
+ const handleAction = async (tool: IToolBtn) => {
81
+ console.log('工具操作:', tool.id);
82
+ };
83
+ </script>
84
+ ```
85
+
86
+ > **工具栏**:鼠标悬停时,消息下方出现「复制」「引用」「编辑」三个操作按钮(CSS `visibility` 切换,始终占位)。
87
+
88
+ ## 多媒体消息
89
+
90
+ `content` 为数组时,同时支持文本(`type: 'text'`)和二进制文件(`type: 'binary'`)。组件将 `binary` 项按图片和非图片分为两组:
91
+
92
+ - **图片文件**(`binaryImageFiles`):判断 `url` 存在或 `mimeType` / `file.type` 以 `image/` 开头的文件,统一放入一个 `FileContent`(`readonly=true`)中渲染,支持点击缩略图全屏预览
93
+ - **非图片文件**(`binaryNonImageFiles`):每个文件单独渲染在 `FileContent`(`readonly=true`)中
94
+
95
+ `text` 项按顺序各渲染一个 `MarkdownContent`。
96
+
97
+ ```vue
98
+ <script setup lang="ts">
99
+ import { UserMessage, MessageContentType } from '@blueking/chat-x';
100
+
101
+ const content = [
102
+ {
103
+ type: MessageContentType.Binary, // 'binary'
104
+ url: 'https://example.com/screenshot.png',
105
+ mimeType: 'image/png',
106
+ filename: 'screenshot.png',
107
+ },
108
+ {
109
+ type: MessageContentType.Text, // 'text'
110
+ text: '请帮我分析这张架构图,指出其中的问题。',
111
+ },
112
+ ];
113
+ </script>
114
+ ```
115
+
116
+ ## 带引用的消息
117
+
118
+ 通过 `property.extra.cite` 传入引用内容,支持两种格式,渲染位置不同:
119
+
120
+ | `cite` 类型 | 渲染组件 | 渲染位置 |
121
+ | ------------------------- | ------------------------------------------------ | ---------------- |
122
+ | `string` | `CiteContent`(紧凑条带,高 28px,文本单行截断) | 气泡**外部上方** |
123
+ | `{ title?, data[] }` 对象 | `KeyValueContent`(键值对列表) | 气泡**内部** |
124
+
125
+ ### 文本引用
126
+
127
+ `cite` 为字符串时,在气泡上方显示一个带引用图标的灰色条带(`#f5f7fa`),文本过长时截断。
128
+
129
+ ```vue
130
+ <script setup lang="ts">
131
+ import { UserMessage } from '@blueking/chat-x';
132
+
133
+ const content = '这段代码每次循环都发起请求,应该如何优化?';
134
+ const property = {
135
+ extra: {
136
+ cite: '// 原始代码\nfor (let i = 0; i < arr.length; i++) {\n fetch(`/api/${arr[i]}`)\n}',
137
+ },
138
+ };
139
+ </script>
140
+ ```
141
+
142
+ ### 结构化引用(键值对)
143
+
144
+ `cite` 为对象 `{ title?, data: { key, value }[] }` 时,引用内容渲染在气泡**内部**(`KeyValueContent` 组件):
145
+
146
+ ```vue
147
+ <script setup lang="ts">
148
+ import { UserMessage } from '@blueking/chat-x';
149
+
150
+ const content = '请帮我分析这份报表的数据趋势。';
151
+ const property = {
152
+ extra: {
153
+ cite: {
154
+ title: '销售数据分析',
155
+ data: [
156
+ { key: '报表名称', value: '2024 年 Q4 销售报表' },
157
+ { key: '时间范围', value: '2024年10月 - 12月' },
158
+ { key: '数据量', value: '12,580 条' },
159
+ ],
160
+ },
161
+ },
162
+ };
163
+ </script>
164
+ ```
165
+
166
+ ## 快捷指令消息
167
+
168
+ 当消息来自快捷指令时,`property.extra.shortcut` 中携带快捷指令对象。在**编辑模式**下,组件渲染 `ShortcutRender` 代替普通 `ChatInput`。
169
+
170
+ `shortcut` computed 支持两条来源路径:
171
+
172
+ ```
173
+ 1. property.extra.shortcut 有值 → 直接使用
174
+ 2. property.extra.cite 为对象 + property.extra.context 有值
175
+ → 从 cite.data 和 context 动态构建 ShortcutComponent[] 数组
176
+ ```
177
+
178
+ ```vue
179
+ <script setup lang="ts">
180
+ import { UserMessage } from '@blueking/chat-x';
181
+
182
+ const content = '请帮我翻译这段文字';
183
+ const property = {
184
+ extra: {
185
+ shortcut: {
186
+ id: 'translate',
187
+ name: '翻译',
188
+ components: [
189
+ {
190
+ type: 'select',
191
+ key: 'targetLang',
192
+ name: '目标语言',
193
+ default: 'en',
194
+ options: [
195
+ { label: '英文', value: 'en' },
196
+ { label: '中文', value: 'zh' },
197
+ ],
198
+ },
199
+ {
200
+ type: 'textarea',
201
+ key: 'content',
202
+ name: '翻译内容',
203
+ fillBack: true,
204
+ default: '请帮我翻译这段文字',
205
+ },
206
+ ],
207
+ formModel: { targetLang: 'en', content: '请帮我翻译这段文字' },
208
+ },
209
+ },
210
+ };
211
+ </script>
212
+ ```
213
+
214
+ ## 消息编辑
215
+
216
+ 点击「编辑」按钮后进入编辑模式,根据消息类型呈现不同界面:
217
+
218
+ | 消息类型 | 编辑界面 | 确认回调 |
219
+ | -------------------------------------------- | ----------------------------------------------------- | ------------------- |
220
+ | 普通文本 / 含文件消息 | `ChatInput`(自定义 `#send-icon`,含"取消/发送"按钮) | `onInputConfirm` |
221
+ | 含 `property.extra.shortcut` 或 cite+context | `ShortcutRender` | `onShortcutConfirm` |
222
+
223
+ **`editContent` 的初始化逻辑**(仅文本部分,二进制文件通过 `defaultUploadFiles` 恢复):
224
+
225
+ ```
226
+ content 为 string → editContent = content
227
+ textContent 为 string → editContent = textContent
228
+ textContent 为 array → editContent = textContent[0]?.text(取第一个文本项)
229
+ binaryFiles 有值 → 进入编辑模式(editContent 可为空)
230
+ ```
231
+
232
+ ```vue
233
+ <template>
234
+ <UserMessage
235
+ :content="content"
236
+ :on-action="handleAction"
237
+ :on-input-confirm="handleInputConfirm"
238
+ :on-shortcut-confirm="handleShortcutConfirm"
239
+ />
240
+ </template>
241
+
242
+ <script setup lang="ts">
243
+ import { UserMessage, type IToolBtn, type TagSchema } from '@blueking/chat-x';
244
+
245
+ const content = '请帮我优化这段代码';
246
+
247
+ const handleAction = async (tool: IToolBtn) => {
248
+ // tool.id === 'edit' → 组件内部自动切换编辑模式
249
+ // tool.id === 'copy' → 自动复制(字符串直接复制,数组 JSON.stringify 后复制)
250
+ // tool.id === 'cite' → 由外部 onAction 处理(组件内无内置行为)
251
+ console.log('工具:', tool.id);
252
+ };
253
+
254
+ const handleInputConfirm = async (content: string | InputContent[], docSchema: TagSchema) => {
255
+ console.log('编辑后内容:', content);
256
+ // 重新发送消息
257
+ };
258
+
259
+ const handleShortcutConfirm = async (formModel: Record<string, unknown>) => {
260
+ console.log('快捷指令表单:', formModel);
261
+ // 重新发送快捷指令
262
+ };
263
+ </script>
264
+ ```
265
+
266
+ ## 工具按钮
267
+
268
+ 工具栏使用 CSS `visibility` 控制可见性(非 `display`),始终占位,hover 时显示:
269
+
270
+ **内置工具列表(`CONST_USER_MESSAGE_TOOLS`)**
271
+
272
+ | 工具 ID | 名称 | 内置行为 |
273
+ | ------- | ---- | -------------------------------------------- |
274
+ | `copy` | 复制 | 字符串直接复制;数组 `JSON.stringify` 后复制 |
275
+ | `cite` | 引用 | 无内置行为,需通过 `onAction` 外部处理 |
276
+ | `edit` | 编辑 | 切换 `isEdit=true`,进入编辑模式 |
277
+
278
+ ```vue
279
+ <!-- 隐藏工具按钮(从 DOM 移除,不占位) -->
280
+ <UserMessage :content="content" message-tools-status="hidden" />
281
+
282
+ <!-- 禁用工具按钮(保留占位,不可点击,无 hover 效果) -->
283
+ <UserMessage :content="content" message-tools-status="disabled" />
284
+ ```
285
+
286
+ ## API
287
+
288
+ ### Props
289
+
290
+ | 属性名 | 类型 | 说明 |
291
+ | ------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------- |
292
+ | content | `string \| InputContent[]` | 消息内容,字符串或含 text/binary 的数组 |
293
+ | property | `{ extra?: MessageExtra }` | 消息附加属性,包含引用、快捷指令、context 等信息 |
294
+ | messageToolsStatus | `MessageToolsStatus` | 工具按钮状态,`disabled` 禁用、`hidden` 从 DOM 移除 |
295
+ | onAction | `(tool: IToolBtn) => Promise<void>` | 工具按钮回调;`copy`/`edit` 有内置行为,`cite` 需外部处理 |
296
+ | onInputConfirm | `(content: string \| InputContent[], docSchema: TagSchema) => Promise<void>` | 普通消息编辑确认回调 |
297
+ | onShortcutConfirm | `(formModel: Record<string, unknown>) => Promise<void>` | 快捷指令消息编辑确认回调 |
298
+ | tippyOptions | `Partial<Omit<TippyOptions, 'getReferenceClientRect' \| 'triggerTarget'>>` | 自定义工具栏 Tippy 配置,透传给内部 `MessageTools` 组件 |
299
+
300
+ ## 类型定义
301
+
302
+ ```typescript
303
+ // 文本内容项
304
+ interface TextInputContent {
305
+ type: 'text'; // MessageContentType.Text
306
+ text: string;
307
+ }
308
+
309
+ // 二进制内容项(图片、文件)
310
+ interface BinaryContent {
311
+ type: 'binary'; // MessageContentType.Binary
312
+ url?: string;
313
+ mimeType?: string;
314
+ filename?: string;
315
+ }
316
+
317
+ type InputContent = TextInputContent | BinaryContent;
318
+
319
+ // 消息附加属性
320
+ interface MessageExtra {
321
+ // 文本引用(字符串):渲染在气泡外 CiteContent
322
+ cite?: string;
323
+
324
+ // 结构化引用(对象):渲染在气泡内 KeyValueContent;与 context 配合可重建 ShortcutRender
325
+ cite?: {
326
+ title?: string;
327
+ data: Array<{ key: string; value: string }>;
328
+ };
329
+
330
+ // 快捷指令:编辑时渲染 ShortcutRender(优先于 cite+context 路径)
331
+ shortcut?: Shortcut;
332
+
333
+ // 上下文变量:与结构化 cite 配合,在编辑模式下动态构建 ShortcutComponent[]
334
+ context?: Array<{
335
+ __key: string;
336
+ __label: string;
337
+ __value: string;
338
+ fillBack?: boolean;
339
+ }>;
340
+ }
341
+ ```
342
+
343
+ ## 关联组件
344
+
345
+ - [MessageRender](./message-render.md) — user 角色由其实例化
346
+ - [MessageTools](./message-tools.md) — 工具栏交互
347
+ - [MessageContainer](./message-container.md) — 列表与多选容器