@blueking/chat-x 0.0.5 → 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.
- package/dist/mcp/generated/docs/activity-message.md +428 -0
- package/dist/mcp/generated/docs/ai-image.md +227 -0
- package/dist/mcp/generated/docs/ai-loading.md +129 -0
- package/dist/mcp/generated/docs/ai-selection.md +436 -0
- package/dist/mcp/generated/docs/animation-text.md +199 -0
- package/dist/mcp/generated/docs/assistant-message.md +424 -0
- package/dist/mcp/generated/docs/chat-container.md +365 -0
- package/dist/mcp/generated/docs/chat-input.md +625 -0
- package/dist/mcp/generated/docs/cite-content.md +138 -0
- package/dist/mcp/generated/docs/code-content.md +199 -0
- package/dist/mcp/generated/docs/common-error-content.md +70 -0
- package/dist/mcp/generated/docs/constants.md +216 -0
- package/dist/mcp/generated/docs/content-render.md +238 -0
- package/dist/mcp/generated/docs/delete-tool.md +188 -0
- package/dist/mcp/generated/docs/desc-panel.md +139 -0
- package/dist/mcp/generated/docs/execution-summary.md +126 -0
- package/dist/mcp/generated/docs/file-content.md +300 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
- package/dist/mcp/generated/docs/flow-message.md +305 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
- package/dist/mcp/generated/docs/image-content.md +178 -0
- package/dist/mcp/generated/docs/image-preview-group.md +181 -0
- package/dist/mcp/generated/docs/image-preview.md +224 -0
- package/dist/mcp/generated/docs/info-message.md +124 -0
- package/dist/mcp/generated/docs/key-value-content.md +124 -0
- package/dist/mcp/generated/docs/latex-content.md +196 -0
- package/dist/mcp/generated/docs/loading-message.md +171 -0
- package/dist/mcp/generated/docs/markdown-content.md +186 -0
- package/dist/mcp/generated/docs/markdown-latex.md +208 -0
- package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
- package/dist/mcp/generated/docs/mermaid-content.md +185 -0
- package/dist/mcp/generated/docs/message-container.md +534 -0
- package/dist/mcp/generated/docs/message-render.md +329 -0
- package/dist/mcp/generated/docs/message-tools.md +376 -0
- package/dist/mcp/generated/docs/messages.md +472 -0
- package/dist/mcp/generated/docs/overflow-tips.md +209 -0
- package/dist/mcp/generated/docs/reasoning-message.md +233 -0
- package/dist/mcp/generated/docs/reference-content.md +132 -0
- package/dist/mcp/generated/docs/scroll-btn.md +155 -0
- package/dist/mcp/generated/docs/selection-footer.md +75 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
- package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
- package/dist/mcp/generated/docs/shortcut-render.md +418 -0
- package/dist/mcp/generated/docs/text-content.md +74 -0
- package/dist/mcp/generated/docs/theme.md +388 -0
- package/dist/mcp/generated/docs/tool-btn.md +254 -0
- package/dist/mcp/generated/docs/tool-message.md +217 -0
- package/dist/mcp/generated/docs/toolcall-render.md +299 -0
- package/dist/mcp/generated/docs/use-animation-text.md +198 -0
- package/dist/mcp/generated/docs/use-clipboard.md +206 -0
- package/dist/mcp/generated/docs/use-command-selection.md +128 -0
- package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
- package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
- package/dist/mcp/generated/docs/use-global-config.md +154 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
- package/dist/mcp/generated/docs/use-message-group.md +175 -0
- package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
- package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
- package/dist/mcp/generated/docs/user-feedback.md +229 -0
- package/dist/mcp/generated/docs/user-message.md +347 -0
- package/dist/mcp/generated/index.json +1311 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +42 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +43 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-component-doc.d.ts +19 -0
- package/dist/mcp/tools/get-component-doc.js +60 -0
- package/dist/mcp/tools/get-component-doc.js.map +1 -0
- package/dist/mcp/tools/list-components.d.ts +35 -0
- package/dist/mcp/tools/list-components.js +147 -0
- package/dist/mcp/tools/list-components.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts +14 -0
- package/dist/mcp/tools/search-docs.js +82 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/dist/mcp/utils/doc-loader.d.ts +35 -0
- package/dist/mcp/utils/doc-loader.js +64 -0
- package/dist/mcp/utils/doc-loader.js.map +1 -0
- package/package.json +5 -7
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ContentRender 按消息 content 类型分发:字符串走 Markdown 管线,数组可走引用文档等;可扩展自定义 slot。 主要 props 为 content、status,与 MessageRender、AssistantMessage 等配合使用。 内置与 MarkdownContent、ReferenceContent 等原子/分子组件衔接。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **markdown-content** — 文本类 Markdown 正文的默认渲染实现
|
|
8
|
+
- **reference-content** — 引用文档数组类型的列表渲染
|
|
9
|
+
- **assistant-message** — AI 回复中默认通过本组件渲染正文
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ContentRender 内容渲染器
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:内容渲染
|
|
17
|
+
|
|
18
|
+
消息内容渲染分发组件,根据 `content` 的 JavaScript 类型自动选择渲染方式:字符串 → `MarkdownContent`(Markdown 渲染),数组 → `ReferenceContent`(引用列表)。
|
|
19
|
+
|
|
20
|
+
## 渲染管线
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
ContentRender
|
|
24
|
+
├── typeof content === 'string' → MarkdownContent(Markdown 渲染)
|
|
25
|
+
│ └── status === 'error' → CommonErrorContent(红色错误图标 + 文本)
|
|
26
|
+
├── Array.isArray(content) → ReferenceContent(引用文档列表)
|
|
27
|
+
└── 其他 → undefined(不渲染,可通过 slot 自定义)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
> **注意**:渲染类型由 `content` 的 JavaScript 类型决定(字符串 vs 数组),`type` prop 仅当传入 `MessageContentType.Text` 时才强制走 `MarkdownContent`,通常不需要显式传递。
|
|
31
|
+
|
|
32
|
+
## 基础用法(Markdown 文本)
|
|
33
|
+
|
|
34
|
+
字符串内容自动渲染为 Markdown:
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<template>
|
|
38
|
+
<ContentRender
|
|
39
|
+
:content="content"
|
|
40
|
+
:status="status"
|
|
41
|
+
/>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<script setup lang="ts">
|
|
45
|
+
import { ContentRender, MessageStatus } from '@blueking/chat-x';
|
|
46
|
+
|
|
47
|
+
const content = '这是一段 **Markdown** 内容,支持 `代码`、**加粗**、*斜体* 等语法。';
|
|
48
|
+
const status = MessageStatus.Complete;
|
|
49
|
+
</script>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**渲染效果**
|
|
53
|
+
|
|
54
|
+
## Markdown 语法支持
|
|
55
|
+
|
|
56
|
+
`MarkdownContent` 内置了完整的 Markdown 解析能力,使用 `markdown-it` + 多个插件:
|
|
57
|
+
|
|
58
|
+
### 常用语法(代码、列表、表格)
|
|
59
|
+
|
|
60
|
+
### 扩展语法
|
|
61
|
+
|
|
62
|
+
| 语法 | 效果 | 插件 |
|
|
63
|
+
| --------------------- | -------------- | ------------------------- |
|
|
64
|
+
| `++文字++` | 下划线(新增) | markdown-it-ins |
|
|
65
|
+
| `==文字==` | 高亮标注 | markdown-it-mark |
|
|
66
|
+
| `^上标^` | 上标 | markdown-it-sup |
|
|
67
|
+
| `~下标~` | 下标 | markdown-it-sub |
|
|
68
|
+
| `[^1]` / `[^1]: 内容` | 脚注 | markdown-it-footnote |
|
|
69
|
+
| `- [x] 任务` | 任务列表 | markdown-it-task-checkbox |
|
|
70
|
+
|
|
71
|
+
### LaTeX 数学公式
|
|
72
|
+
|
|
73
|
+
行内公式 `$...$` 和块级公式 `$$...$$`,由 `katex` 渲染:
|
|
74
|
+
|
|
75
|
+
```vue
|
|
76
|
+
<ContentRender content="行内公式:$E = mc^2$" status="complete" />
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Mermaid 图表
|
|
80
|
+
|
|
81
|
+
代码块语言标识为 `mermaid` 时,由 `MermaidContent` 专门渲染:
|
|
82
|
+
|
|
83
|
+
## 消息状态
|
|
84
|
+
|
|
85
|
+
`status` 只传递给 `MarkdownContent`,对 `ReferenceContent` 无效。
|
|
86
|
+
|
|
87
|
+
| `status` | 渲染行为 |
|
|
88
|
+
| ----------- | ----------------------------------------------------------------- |
|
|
89
|
+
| `complete` | 正常渲染完整 Markdown |
|
|
90
|
+
| `streaming` | 自动补全未闭合的 Markdown 语法(代码块、列表等),节流解析(5ms) |
|
|
91
|
+
| `pending` | 同 `complete`(按当前内容渲染) |
|
|
92
|
+
| `error` | 渲染为 `CommonErrorContent`(红色错误图标 + `content` 文本) |
|
|
93
|
+
| `stop` | 同 `complete` |
|
|
94
|
+
|
|
95
|
+
**错误状态示例**
|
|
96
|
+
|
|
97
|
+
## 引用文档列表
|
|
98
|
+
|
|
99
|
+
`content` 传入 `ReferenceDocumentContent[]` 数组时,自动渲染为 `ReferenceContent`(引用文档列表):
|
|
100
|
+
|
|
101
|
+
```vue
|
|
102
|
+
<template>
|
|
103
|
+
<ContentRender :content="referenceContent" />
|
|
104
|
+
</template>
|
|
105
|
+
|
|
106
|
+
<script setup lang="ts">
|
|
107
|
+
import { ContentRender, type ReferenceDocumentContent } from '@blueking/chat-x';
|
|
108
|
+
|
|
109
|
+
const referenceContent: ReferenceDocumentContent[] = [
|
|
110
|
+
{
|
|
111
|
+
name: 'Vue 3 官方文档',
|
|
112
|
+
url: 'https://vuejs.org',
|
|
113
|
+
originFile: 'vue3-guide.md', // 有 originFile 时显示预览和跳转图标
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'TypeScript 手册',
|
|
117
|
+
url: 'https://www.typescriptlang.org',
|
|
118
|
+
originFile: '', // 无 originFile 时不显示操作图标
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
</script>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**渲染效果**(悬停条目查看图标,有 `originFile` 的条目显示预览和跳转图标)
|
|
125
|
+
|
|
126
|
+
### ReferenceContent 图标显示规则
|
|
127
|
+
|
|
128
|
+
| 条件 | 显示图标 |
|
|
129
|
+
| ------------------------------ | -------------------------------------------- |
|
|
130
|
+
| 始终 | 文档图标(红色) |
|
|
131
|
+
| `url` 和 `originFile` 均不为空 | 预览图标(悬停可见) |
|
|
132
|
+
| `url` 和 `originFile` 均不为空 | 跳转图标(悬停可见,打开 `originFile` 链接) |
|
|
133
|
+
|
|
134
|
+
无 `originFile` 时只显示文档图标(点击文档名跳转 `url`):
|
|
135
|
+
|
|
136
|
+
## 自定义渲染(默认插槽)
|
|
137
|
+
|
|
138
|
+
默认插槽接收 `{ content }` 参数(原始 `content` prop 值),替换整个内容渲染:
|
|
139
|
+
|
|
140
|
+
```vue
|
|
141
|
+
<template>
|
|
142
|
+
<ContentRender
|
|
143
|
+
:content="content"
|
|
144
|
+
:status="status"
|
|
145
|
+
>
|
|
146
|
+
<template #default="{ content }">
|
|
147
|
+
<div class="custom-content">
|
|
148
|
+
<h3>自定义渲染</h3>
|
|
149
|
+
<pre>{{ JSON.stringify(content, null, 2) }}</pre>
|
|
150
|
+
</div>
|
|
151
|
+
</template>
|
|
152
|
+
</ContentRender>
|
|
153
|
+
</template>
|
|
154
|
+
|
|
155
|
+
<script setup lang="ts">
|
|
156
|
+
import { ContentRender } from '@blueking/chat-x';
|
|
157
|
+
|
|
158
|
+
const content = '自定义内容,由 slot 接管渲染。';
|
|
159
|
+
const status = 'complete';
|
|
160
|
+
</script>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**渲染效果**
|
|
164
|
+
|
|
165
|
+
## API
|
|
166
|
+
|
|
167
|
+
### Props
|
|
168
|
+
|
|
169
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
170
|
+
| ------- | -------------------------------------- | ---- | ----------------------------------------------------------------------------------------- |
|
|
171
|
+
| content | `string \| ReferenceDocumentContent[]` | ✅ | 内容数据,字符串走 Markdown 渲染,数组走引用文档列表渲染 |
|
|
172
|
+
| status | `MessageStatus` | - | 消息状态,只影响 Markdown 渲染(`error` 时渲染错误样式,`streaming` 时补全语法) |
|
|
173
|
+
| type | `ContentType` | - | 内容类型提示,传入 `MessageContentType.Text` 可强制走 MarkdownContent;通常不需要显式传递 |
|
|
174
|
+
|
|
175
|
+
### Slots
|
|
176
|
+
|
|
177
|
+
| 插槽名 | 参数 | 说明 |
|
|
178
|
+
| ------- | ---------------------------- | ------------------------------------------------------ |
|
|
179
|
+
| default | `{ content: ContentMap[T] }` | 自定义渲染,接收原始 content prop 值,替换全部默认逻辑 |
|
|
180
|
+
|
|
181
|
+
## 流式渲染机制
|
|
182
|
+
|
|
183
|
+
`streaming` 状态下,`MarkdownContent` 有以下优化:
|
|
184
|
+
|
|
185
|
+
1. **语法自动补全**:`completeMarkdownSyntax` 在解析前补全未闭合的代码块、列表等,避免渲染异常
|
|
186
|
+
2. **节流解析**:`parseMarkdownContent` 节流 5ms(leading + trailing),大幅降低流式输入时的解析开销
|
|
187
|
+
3. **不完整状态保护**:当正在输入 LaTeX 命令(如 `$\fra...`)时保持之前的渲染结果,避免闪烁
|
|
188
|
+
4. **CSS contain 性能隔离**:`.markdown-content` 使用 `contain: layout style`,`.markdown-body` 使用 `contain: content`,减少重排影响范围
|
|
189
|
+
5. **自动滚动**:每个 token 挂载后触发 `toScrollBottom()`(节流 100ms),与 `MessageContainer` 配合实现流式自动滚动
|
|
190
|
+
|
|
191
|
+
## 类型定义
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
import { MessageContentType, MessageStatus } from '@blueking/chat-x';
|
|
195
|
+
|
|
196
|
+
// 引用文档内容
|
|
197
|
+
type ReferenceDocumentContent = {
|
|
198
|
+
name: string; // 显示名称(为空时该条目被过滤,不渲染)
|
|
199
|
+
url: string; // 文档访问地址(点击文档名跳转)
|
|
200
|
+
originFile: string; // 原始文件地址(非空时显示预览和跳转图标)
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// 内容类型(ContentType = keyof ContentMap)
|
|
204
|
+
enum MessageContentType {
|
|
205
|
+
Text = 'text', // 字符串,Markdown 渲染
|
|
206
|
+
ReferenceDocument = 'reference_document', // ReferenceDocumentContent[],引用列表
|
|
207
|
+
Binary = 'binary',
|
|
208
|
+
Function = 'function',
|
|
209
|
+
KeyValue = 'key-value',
|
|
210
|
+
KnowledgeRag = 'knowledge_rag',
|
|
211
|
+
Other = 'other',
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// 消息状态
|
|
215
|
+
enum MessageStatus {
|
|
216
|
+
Pending = 'pending',
|
|
217
|
+
Streaming = 'streaming',
|
|
218
|
+
Complete = 'complete',
|
|
219
|
+
Error = 'error',
|
|
220
|
+
Stop = 'stop',
|
|
221
|
+
Disabled = 'disabled',
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## 使用场景
|
|
226
|
+
|
|
227
|
+
- **AI 文本回复渲染**:`AssistantMessage` 内部用 `ContentRender` 渲染 AI 回复内容,`status` 配合流式响应
|
|
228
|
+
- **知识库引用展示**:`ActivityMessage` 内部用 `ContentRender` 渲染引用文档列表
|
|
229
|
+
- **代码展示**:Markdown 代码块由 `CodeContent` 自动高亮(Atom One Dark 主题,支持 180+ 语言)
|
|
230
|
+
- **数学公式**:行内 `$...$` 和块级 `$$...$$`,由 KaTeX 渲染
|
|
231
|
+
- **流程图**:Mermaid 代码块自动渲染为 SVG 图表
|
|
232
|
+
- **自定义渲染**:通过 slot 接管渲染,实现表格、图表等自定义内容展示
|
|
233
|
+
|
|
234
|
+
## 关联组件
|
|
235
|
+
|
|
236
|
+
- [MarkdownContent](../atomic/markdown-content.md) — 字符串 Markdown 正文
|
|
237
|
+
- [ReferenceContent](../atomic/reference-content.md) — 引用文档数组
|
|
238
|
+
- [AssistantMessage](./assistant-message.md) — assistant 消息中默认使用
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
DeleteTool 在点击删除图标后弹出 Tippy 确认层,需再次点击「删除」才 emit confirm,避免误删。 触发器为 ToolBtn;MessageTools 在工具 id 为 delete 时用本组件替换普通 ToolBtn。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **tool-btn** — 删除图标与触发入口
|
|
8
|
+
- **message-tools** — delete 工具 id 时自动采用本组件
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# DeleteTool 删除确认按钮
|
|
14
|
+
|
|
15
|
+
> **层级**:分子组件 · **功能域**:工具与反馈
|
|
16
|
+
|
|
17
|
+
删除操作的二次确认组件。点击删除图标后弹出确认弹窗,用户需再次点击"删除"按钮才会触发 `confirm` 事件,防止误删。内部由 `ToolBtn`(触发按钮)+ `Tippy`(确认弹窗)组合实现。
|
|
18
|
+
|
|
19
|
+
> **提示**:此组件通常**不需要手动使用**,`MessageTools` 在工具列表中检测到 `id === 'delete'` 时会自动使用此组件替换普通 `ToolBtn`。
|
|
20
|
+
|
|
21
|
+
## 组件结构
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Tippy(trigger='click',interactive,appendTo=body)
|
|
25
|
+
│
|
|
26
|
+
├── ToolBtn(触发按钮,id/name/description/disabled 透传)
|
|
27
|
+
│
|
|
28
|
+
└── #content: div.ai-delete-confirm(width: 280px)
|
|
29
|
+
├── .ai-delete-confirm__title "确认删除该回答?"(16px, bold)
|
|
30
|
+
├── .ai-delete-confirm__desc "删除操作无法撤回,请谨慎操作!"
|
|
31
|
+
└── .ai-delete-confirm__actions(justify-content: flex-end,gap: 8px)
|
|
32
|
+
├── Button(theme="danger", size="small")→ 点击触发 confirm + 关闭弹窗
|
|
33
|
+
└── Button(size="small")→ 点击触发 cancel + 关闭弹窗
|
|
34
|
+
|
|
35
|
+
disabled=true 时:Tippy onShow 返回 false,弹窗不打开
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 基础用法
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<template>
|
|
42
|
+
<DeleteTool
|
|
43
|
+
id="delete"
|
|
44
|
+
name="删除"
|
|
45
|
+
description="删除消息"
|
|
46
|
+
@confirm="handleConfirm"
|
|
47
|
+
@cancel="handleCancel"
|
|
48
|
+
/>
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<script setup lang="ts">
|
|
52
|
+
import { DeleteTool } from '@blueking/chat-x';
|
|
53
|
+
|
|
54
|
+
const handleConfirm = () => {
|
|
55
|
+
console.log('用户确认删除,执行删除操作');
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const handleCancel = () => {
|
|
59
|
+
console.log('用户取消删除');
|
|
60
|
+
};
|
|
61
|
+
</script>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 禁用状态
|
|
65
|
+
|
|
66
|
+
`disabled=true` 时,点击按钮不弹出确认弹窗:
|
|
67
|
+
|
|
68
|
+
```vue
|
|
69
|
+
<template>
|
|
70
|
+
<DeleteTool
|
|
71
|
+
id="delete"
|
|
72
|
+
name="删除"
|
|
73
|
+
description="删除消息"
|
|
74
|
+
:disabled="true"
|
|
75
|
+
@confirm="handleConfirm"
|
|
76
|
+
/>
|
|
77
|
+
</template>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 在 MessageTools 中的自动使用
|
|
81
|
+
|
|
82
|
+
`MessageTools` 在渲染工具列表时,若检测到 `tool.id === 'delete'`,会自动使用 `DeleteTool` 替换普通 `ToolBtn`,无需手动配置:
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<template>
|
|
86
|
+
<MessageTools
|
|
87
|
+
:update-tools="updateTools"
|
|
88
|
+
:on-action="handleAction"
|
|
89
|
+
/>
|
|
90
|
+
</template>
|
|
91
|
+
|
|
92
|
+
<script setup lang="ts">
|
|
93
|
+
import { MessageTools, type IToolBtn } from '@blueking/chat-x';
|
|
94
|
+
|
|
95
|
+
// delete 会自动使用 DeleteTool 渲染,点击弹确认框,确认后 onAction 触发
|
|
96
|
+
const updateTools: IToolBtn[] = [
|
|
97
|
+
{ id: 'like', name: '点赞', description: '点赞' },
|
|
98
|
+
{ id: 'unlike', name: '不满意', description: '不满意' },
|
|
99
|
+
{ id: 'delete', name: '删除', description: '删除消息' },
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
103
|
+
if (tool.id === 'delete') {
|
|
104
|
+
// 只有用户在弹窗中点击"删除"确认后,才会走到这里
|
|
105
|
+
console.log('执行删除:', tool.id);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
</script>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## API
|
|
112
|
+
|
|
113
|
+
### Props
|
|
114
|
+
|
|
115
|
+
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|
|
116
|
+
| ------------ | -------------------------------------------------------------------------- | ---- | ------ | -------------------------------------------------------------------- |
|
|
117
|
+
| id | `string` | 是 | — | 按钮标识,传 `"delete"` 时显示删除图标 |
|
|
118
|
+
| name | `string` | 否 | — | 按钮名称,`id` 无对应图标时作为文本内容渲染 |
|
|
119
|
+
| description | `string` | 否 | — | `ToolBtn` 的 tooltip 文本;`disabled=true` 时不显示 |
|
|
120
|
+
| disabled | `boolean` | 否 | — | 禁用态;`true` 时点击不弹出确认弹窗,`ToolBtn` 同步禁用 |
|
|
121
|
+
| tippyOptions | `Partial<Omit<TippyOptions, 'getReferenceClientRect' \| 'triggerTarget'>>` | 否 | — | 覆盖确认弹窗(`Tippy`)的默认配置;可覆盖 `placement`、`appendTo` 等 |
|
|
122
|
+
|
|
123
|
+
### Events
|
|
124
|
+
|
|
125
|
+
| 事件名 | 参数 | 触发时机 |
|
|
126
|
+
| ------- | ---- | ---------------------------------- |
|
|
127
|
+
| confirm | — | 用户在确认弹窗点击"删除"按钮后触发 |
|
|
128
|
+
| cancel | — | 用户在确认弹窗点击"取消"按钮后触发 |
|
|
129
|
+
|
|
130
|
+
## 类型定义
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import type { IToolBtn } from '@blueking/chat-x';
|
|
134
|
+
import type { TippyOptions } from 'vue-tippy';
|
|
135
|
+
|
|
136
|
+
export type DeleteToolProps = IToolBtn & {
|
|
137
|
+
disabled?: boolean;
|
|
138
|
+
tippyOptions?: Partial<Omit<TippyOptions, 'getReferenceClientRect' | 'triggerTarget'>>;
|
|
139
|
+
};
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## 样式说明
|
|
143
|
+
|
|
144
|
+
确认弹窗(`.ai-delete-confirm`)样式:
|
|
145
|
+
|
|
146
|
+
```scss
|
|
147
|
+
.ai-delete-confirm {
|
|
148
|
+
width: 280px;
|
|
149
|
+
padding: 16px;
|
|
150
|
+
font-size: 12px;
|
|
151
|
+
color: #4d4f56;
|
|
152
|
+
background: #fff;
|
|
153
|
+
border: 1px solid #dcdee5;
|
|
154
|
+
box-shadow: 0 2px 6px 0 #0000001a;
|
|
155
|
+
|
|
156
|
+
&__title {
|
|
157
|
+
margin-bottom: 6px;
|
|
158
|
+
font-size: 16px;
|
|
159
|
+
font-weight: 600;
|
|
160
|
+
line-height: 22px;
|
|
161
|
+
color: #313238;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
&__desc {
|
|
165
|
+
margin-bottom: 16px;
|
|
166
|
+
line-height: 20px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
&__actions {
|
|
170
|
+
display: flex;
|
|
171
|
+
gap: 8px;
|
|
172
|
+
justify-content: flex-end;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## 注意事项
|
|
178
|
+
|
|
179
|
+
1. **确认才触发**:`confirm` 事件只在用户点击弹窗内"删除"按钮后触发;直接点击 `ToolBtn` 触发器不会触发任何业务事件
|
|
180
|
+
2. **`disabled` 双重保障**:`disabled=true` 时,`ToolBtn` 的 JS 层拦截 click,且 `Tippy` 的 `onShow` 返回 `false`,弹窗不会弹出
|
|
181
|
+
3. **弹窗挂载至 body**:默认 `appendTo: () => document.body`,避免被父容器 `overflow: hidden` 裁剪
|
|
182
|
+
4. **组件卸载自动关闭**:`onUnmounted` 时调用 `hide()` 关闭弹窗,防止组件销毁后弹窗残留
|
|
183
|
+
5. **`MessageTools` 自动处理**:通常不需要直接使用此组件,`MessageTools` 会在 `id === 'delete'` 时自动替换
|
|
184
|
+
|
|
185
|
+
## 关联组件
|
|
186
|
+
|
|
187
|
+
- [ToolBtn](../atomic/tool-btn.md) — 触发按钮
|
|
188
|
+
- [MessageTools](./message-tools.md) — 工具栏中 delete 替换入口
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
DescPanel 将描述字符串尝试 JSON 解析为键值列表展示,否则按纯文本输出,用于工具调用详情折叠区。 内部对键与值使用 HighlightKeyword 支持搜索高亮。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **toolcall-render** — 工具调用详情中渲染描述与参数
|
|
8
|
+
- **highlight-keyword** — 键值与文本匹配关键词高亮
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# DescPanel 描述面板
|
|
14
|
+
|
|
15
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
16
|
+
|
|
17
|
+
工具调用(ToolCall)详情面板的描述区域组件,主要用于 `ToolcallRender` 内部的折叠面板中。
|
|
18
|
+
|
|
19
|
+
将 `desc` 字符串尝试解析为 JSON,解析成功且结果为对象/数组时以键值对列表渲染,否则作为纯文本展示。
|
|
20
|
+
|
|
21
|
+
## 组件结构
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
.toolcall-desc(flex column,gap: 4px,padding: 12px,background: #f5f7fa)
|
|
25
|
+
├── .desc-title(font-size: 12px,font-weight: bold,color: #313238,margin-bottom: 6px)
|
|
26
|
+
│ └── {{ title }}
|
|
27
|
+
└── .desc-panel(flex column,gap: 4px)
|
|
28
|
+
├── [JSON 对象/数组] v-for 逐项渲染 .desc-panel-item
|
|
29
|
+
│ ├── .desc-label → "{{ key }}:"
|
|
30
|
+
│ └── .desc-value(overflow hidden,ellipsis,nowrap)
|
|
31
|
+
│ └── v-overflow-tips → hover 时显示完整内容
|
|
32
|
+
│ · value 为对象/数组时,tooltip 显示 JSON.stringify(value)
|
|
33
|
+
│ · value 为原始值时,tooltip 显示原始值
|
|
34
|
+
└── [非 JSON / 解析失败] 直接渲染 {{ data }}(纯文本)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## desc 解析规则
|
|
38
|
+
|
|
39
|
+
`data` 是一个 computed,逻辑如下:
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
const data = computed(() => {
|
|
43
|
+
try {
|
|
44
|
+
return JSON.parse(props.desc || ''); // desc 为 undefined/''/null 时 parse('') 会抛出
|
|
45
|
+
} catch {
|
|
46
|
+
return props.desc; // 解析失败,原样返回字符串
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
模板通过 `typeof data === 'object'` 分支渲染:
|
|
52
|
+
|
|
53
|
+
| desc 值 | JSON.parse 结果 | typeof 结果 | 渲染方式 |
|
|
54
|
+
| ------------------ | --------------- | ----------- | ------------------------ |
|
|
55
|
+
| `'{"a":1}'` | `{ a: 1 }` | `'object'` | 键值对列表 |
|
|
56
|
+
| `'[1,2,3]'` | `[1, 2, 3]` | `'object'` | 索引键值对(0:、1:、2:) |
|
|
57
|
+
| `'{}'` | `{}` | `'object'` | 键值对列表(0 行) |
|
|
58
|
+
| `'"hello"'` | `"hello"` | `'string'` | 纯文本 |
|
|
59
|
+
| `'42'` | `42` | `'number'` | 纯文本 |
|
|
60
|
+
| `'普通文本'` | 解析抛出 | — | 纯文本(原始字符串) |
|
|
61
|
+
| `''` / `undefined` | 解析抛出 | — | 纯文本(空白) |
|
|
62
|
+
|
|
63
|
+
> **嵌套对象**:值本身是对象时,`{{ value }}` 渲染为 `[object Object]`,但 `v-overflow-tips` 的 tooltip 会显示 `JSON.stringify(value)` 的完整内容,方便查看原始结构。
|
|
64
|
+
|
|
65
|
+
## 基础用法:JSON 参数
|
|
66
|
+
|
|
67
|
+
```vue
|
|
68
|
+
<template>
|
|
69
|
+
<DescPanel
|
|
70
|
+
title="工具调用参数"
|
|
71
|
+
desc='{"query": "天气查询", "city": "北京", "unit": "celsius"}'
|
|
72
|
+
/>
|
|
73
|
+
</template>
|
|
74
|
+
|
|
75
|
+
<script setup lang="ts">
|
|
76
|
+
import { DescPanel } from '@blueking/chat-x';
|
|
77
|
+
</script>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 纯文本描述
|
|
81
|
+
|
|
82
|
+
`desc` 不是合法 JSON 时作为纯文本渲染:
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<template>
|
|
86
|
+
<DescPanel
|
|
87
|
+
title="执行说明"
|
|
88
|
+
desc="正在查询北京的实时天气,请稍候..."
|
|
89
|
+
/>
|
|
90
|
+
</template>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## JSON 数组
|
|
94
|
+
|
|
95
|
+
JSON 数组同样被视为 `object`,以数组索引(`0:`、`1:`…)作为键渲染:
|
|
96
|
+
|
|
97
|
+
```vue
|
|
98
|
+
<template>
|
|
99
|
+
<DescPanel
|
|
100
|
+
title="文件列表"
|
|
101
|
+
desc='["report.pdf", "data.csv", "readme.md"]'
|
|
102
|
+
/>
|
|
103
|
+
</template>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 嵌套 JSON
|
|
107
|
+
|
|
108
|
+
嵌套对象的值通过 `v-overflow-tips` 悬停后显示 JSON.stringify 结果,文本区域显示 `[object Object]`:
|
|
109
|
+
|
|
110
|
+
```vue
|
|
111
|
+
<template>
|
|
112
|
+
<DescPanel
|
|
113
|
+
title="API 配置"
|
|
114
|
+
desc='{"endpoint": "/api/search", "headers": {"Authorization": "Bearer xxx", "Content-Type": "application/json"}, "timeout": 5000}'
|
|
115
|
+
/>
|
|
116
|
+
</template>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 无 desc
|
|
120
|
+
|
|
121
|
+
`desc` 为可选,不传时面板仅显示标题,内容区域为空:
|
|
122
|
+
|
|
123
|
+
## API
|
|
124
|
+
|
|
125
|
+
### Props
|
|
126
|
+
|
|
127
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
128
|
+
| ------ | -------- | ---- | ----------------------------------------------------------------------------------- |
|
|
129
|
+
| title | `string` | ✓ | 面板标题,始终渲染在顶部 |
|
|
130
|
+
| desc | `string` | — | 描述内容;尝试 `JSON.parse`,成功且为 `object` 类型时渲染键值对列表,否则渲染纯文本 |
|
|
131
|
+
|
|
132
|
+
## 使用场景
|
|
133
|
+
|
|
134
|
+
`DescPanel` 由 `ToolcallRender` 内部在折叠面板中使用,分别用于渲染工具调用的 **输入参数**(`arguments`)和 **输出结果**(`toolMessage.description`)。通常不需要手动引入,如需独立使用,直接传入 `title` 和 `desc` 即可。
|
|
135
|
+
|
|
136
|
+
## 关联组件
|
|
137
|
+
|
|
138
|
+
- [ToolcallRender](../molecular/toolcall-render.md) — 主要使用场景
|
|
139
|
+
- [HighlightKeyword](./highlight-keyword.md) — 键值高亮
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ExecutionSummary 以时间线汇总工具调用与 FlowAgent 等活动记录,支持关键词过滤与 HighlightKeyword 高亮。 点击可 emit 定位到会话中对应消息;内部用 MessageRender 渲染摘要条目中的消息片段。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-render** — 摘要列表内渲染消息内容
|
|
8
|
+
- **highlight-keyword** — 搜索关键词注入与高亮
|
|
9
|
+
- **chat-container** — 常与侧栏「执行情况」Tab 组合
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ExecutionSummary 执行摘要
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:辅助组件
|
|
17
|
+
|
|
18
|
+
执行摘要面板组件,以时间线形式展示对话中的工具调用和 FlowAgent 活动记录。支持关键词搜索过滤和点击定位到对话中的消息位置。
|
|
19
|
+
|
|
20
|
+
通常不需要直接使用,`ChatContainer` 会在侧边栏的「执行情况」Tab 中自动渲染。
|
|
21
|
+
|
|
22
|
+
## 核心能力
|
|
23
|
+
|
|
24
|
+
- **时间线布局**:每组消息按时间节点排列,带连接线
|
|
25
|
+
- **关键词搜索**:实时过滤匹配的执行记录
|
|
26
|
+
- **对话定位**:hover 显示「在对话中定位」按钮,点击滚动到对应消息
|
|
27
|
+
- **空状态处理**:无数据或搜索无结果时显示空状态提示
|
|
28
|
+
|
|
29
|
+
## 基础用法
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<template>
|
|
33
|
+
<ExecutionSummary
|
|
34
|
+
:message-groups="executionGroups"
|
|
35
|
+
@locate-message-group="handleLocate"
|
|
36
|
+
@update-keyword="handleUpdateKeyword"
|
|
37
|
+
/>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<script setup lang="ts">
|
|
41
|
+
import { ExecutionSummary, type MessageGroup } from '@blueking/chat-x';
|
|
42
|
+
|
|
43
|
+
const handleLocate = (uuid: string, group: MessageGroup) => {
|
|
44
|
+
const dom = document.getElementById(uuid);
|
|
45
|
+
dom?.scrollIntoView({ behavior: 'smooth' });
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const handleUpdateKeyword = (keyword: string) => {
|
|
49
|
+
console.log('搜索关键词:', keyword);
|
|
50
|
+
};
|
|
51
|
+
</script>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**渲染效果**(包含搜索过滤和定位功能,hover 消息组可看到「在对话中定位」按钮)
|
|
55
|
+
|
|
56
|
+
## 组件结构
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
execution-summary
|
|
60
|
+
├── execution-summary-header
|
|
61
|
+
│ └── Input(关键词搜索框,clearable)
|
|
62
|
+
└── execution-summary-content
|
|
63
|
+
├── 有数据时:
|
|
64
|
+
│ └── content-item × N(时间线节点)
|
|
65
|
+
│ ├── timeline-dot(时间节点圆点)
|
|
66
|
+
│ ├── content-item-time(格式化时间)
|
|
67
|
+
│ ├── content-item-locate(hover 显示定位按钮)
|
|
68
|
+
│ ├── content-item-messages(MessageRender × N)
|
|
69
|
+
│ └── timeline-line(连接线,最后一项不显示)
|
|
70
|
+
└── 无数据时:
|
|
71
|
+
└── Exception(空状态)+ 清空搜索按钮
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 空状态
|
|
75
|
+
|
|
76
|
+
当 `messageGroups` 为空数组时,显示空状态提示:
|
|
77
|
+
|
|
78
|
+
## 与 ChatContainer 配合
|
|
79
|
+
|
|
80
|
+
`ChatContainer` 通过 `useMessageGroup` 计算 `executionGroups`(仅包含工具调用和 FlowAgent 消息),并传给 `ExecutionSummary`:
|
|
81
|
+
|
|
82
|
+
```vue
|
|
83
|
+
<!-- ChatContainer 内部 -->
|
|
84
|
+
<ExecutionSummary
|
|
85
|
+
:message-groups="executionGroups"
|
|
86
|
+
@locate-message-group="handleLocateMessageGroup"
|
|
87
|
+
@update-keyword="handleUpdateKeyword"
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## API
|
|
92
|
+
|
|
93
|
+
### Props
|
|
94
|
+
|
|
95
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
96
|
+
| ------------- | ---------------- | ---- | ---------------- |
|
|
97
|
+
| messageGroups | `MessageGroup[]` | ✓ | 执行摘要消息分组 |
|
|
98
|
+
|
|
99
|
+
### Events
|
|
100
|
+
|
|
101
|
+
| 事件名 | 参数 | 说明 |
|
|
102
|
+
| ------------------ | ------------------------------------- | ------------------------ |
|
|
103
|
+
| locateMessageGroup | `(uuid: string, group: MessageGroup)` | 点击「在对话中定位」按钮 |
|
|
104
|
+
| updateKeyword | `(keyword: string)` | 搜索关键词变更 |
|
|
105
|
+
|
|
106
|
+
## 类型定义
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { type MessageGroup } from '@blueking/chat-x';
|
|
110
|
+
|
|
111
|
+
interface MessageGroup {
|
|
112
|
+
uuid: string;
|
|
113
|
+
type: MessageRole;
|
|
114
|
+
messages: Message[];
|
|
115
|
+
checked: boolean;
|
|
116
|
+
isHover: boolean;
|
|
117
|
+
pause?: boolean;
|
|
118
|
+
startTime?: number;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 关联组件
|
|
123
|
+
|
|
124
|
+
- [MessageRender](./message-render.md) — 摘要内消息渲染
|
|
125
|
+
- [HighlightKeyword](../atomic/highlight-keyword.md) — 搜索高亮
|
|
126
|
+
- [ChatContainer](./chat-container.md) — 侧栏挂载场景
|