@blueking/chat-x 0.0.5 → 0.0.7
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/components/ai-selection/ai-selection.vue.d.ts +2 -2
- package/dist/components/index.d.ts +2 -1
- package/dist/index.css +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- 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 +402 -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,138 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
CiteContent 在输入区上方以紧凑条带展示被引用文本片段,单行截断并可选关闭按钮移除引用。 常与 ChatInput 的引用预览区配合,不执行 HTML 渲染。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **chat-input** — 输入区展示待发送引用内容
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
<!-- FULL DOC -->
|
|
11
|
+
|
|
12
|
+
# CiteContent 引用内容
|
|
13
|
+
|
|
14
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
15
|
+
|
|
16
|
+
展示被引用文本片段的紧凑条带组件。固定高度 28px,左侧引用图标 + 单行截断文本 + 可选关闭图标,背景灰色(`#f5f7fa`)。
|
|
17
|
+
|
|
18
|
+
常见于两处:
|
|
19
|
+
|
|
20
|
+
- **`UserMessage`**:`property.extra.cite` 为字符串时,渲染在消息气泡上方
|
|
21
|
+
- **`ChatInput`**:通过 `v-model:cite` 绑定,渲染在输入框顶部,关闭后清空引用
|
|
22
|
+
|
|
23
|
+
## 组件结构
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
.ai-cite-content(flex,height: 28px,padding: 0 8px,gap: 4px,bg: #f5f7fa,border-radius: 4px,margin-bottom: 4px)
|
|
27
|
+
├── CiteIcon(14×14px,color: #979ba5,始终显示)
|
|
28
|
+
├── .ai-cite-content-text(flex: 1,单行截断,color: #979ba5,overflow: hidden,text-overflow: ellipsis)
|
|
29
|
+
│ {{ content }}(Vue 文本插值,XSS 安全)
|
|
30
|
+
└── CloseIcon(14×14px,color: #979ba5,v-if="onClose",hover: #4d4f56)
|
|
31
|
+
@click → onClose(content)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 基础用法
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<template>
|
|
38
|
+
<CiteContent content="这是一段被引用的文本" />
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup lang="ts">
|
|
42
|
+
import { CiteContent } from '@blueking/chat-x';
|
|
43
|
+
</script>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 可关闭引用
|
|
47
|
+
|
|
48
|
+
传入 `onClose` 函数后,右侧显示关闭图标;点击时将当前 `content` 作为参数回传给 `onClose`:
|
|
49
|
+
|
|
50
|
+
```vue
|
|
51
|
+
<template>
|
|
52
|
+
<CiteContent
|
|
53
|
+
v-if="showCite"
|
|
54
|
+
content="这是一段可关闭的引用文本"
|
|
55
|
+
:on-close="handleClose"
|
|
56
|
+
/>
|
|
57
|
+
</template>
|
|
58
|
+
|
|
59
|
+
<script setup lang="ts">
|
|
60
|
+
import { CiteContent } from '@blueking/chat-x';
|
|
61
|
+
|
|
62
|
+
const handleClose = (content: string) => {
|
|
63
|
+
// content 即当前引用文本,可用于日志或状态清除
|
|
64
|
+
console.log('关闭引用:', content);
|
|
65
|
+
};
|
|
66
|
+
</script>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 长文本截断
|
|
70
|
+
|
|
71
|
+
文本超出容器宽度时自动单行截断(`text-overflow: ellipsis`),始终保持 28px 高度不变形:
|
|
72
|
+
|
|
73
|
+
## 与 ChatInput 配合
|
|
74
|
+
|
|
75
|
+
`ChatInput` 通过 `v-model:cite` 内置了 `CiteContent`,当 `cite` 有值时自动渲染在输入框顶部(`input-header` slot 位置);用户点击关闭时,内部调用 `citeModel.value = ''` 清空引用:
|
|
76
|
+
|
|
77
|
+
```vue
|
|
78
|
+
<template>
|
|
79
|
+
<ChatInput
|
|
80
|
+
v-model="inputValue"
|
|
81
|
+
v-model:cite="citeText"
|
|
82
|
+
/>
|
|
83
|
+
</template>
|
|
84
|
+
|
|
85
|
+
<script setup lang="ts">
|
|
86
|
+
import { ref } from 'vue';
|
|
87
|
+
import { ChatInput } from '@blueking/chat-x';
|
|
88
|
+
|
|
89
|
+
const inputValue = ref('');
|
|
90
|
+
const citeText = ref('');
|
|
91
|
+
|
|
92
|
+
// 用户通过 AiSelection 划词后,将选中文本赋值给 citeText
|
|
93
|
+
// ChatInput 会自动在顶部显示 CiteContent,用户点击关闭时 citeText 自动清空
|
|
94
|
+
function onUserSelectText(selectedText: string) {
|
|
95
|
+
citeText.value = selectedText;
|
|
96
|
+
}
|
|
97
|
+
</script>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 与 UserMessage 配合
|
|
101
|
+
|
|
102
|
+
`UserMessage` 在 `property.extra.cite` 为字符串时,自动在气泡上方渲染 `CiteContent`(不带关闭按钮):
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
const message = {
|
|
106
|
+
role: 'user',
|
|
107
|
+
content: '这段代码有什么性能问题?',
|
|
108
|
+
property: {
|
|
109
|
+
extra: {
|
|
110
|
+
// 字符串类型 → 渲染 CiteContent(气泡外上方)
|
|
111
|
+
cite: 'for (let i = 0; i < arr.length; i++) {\n fetch(`/api/${arr[i]}`)\n}',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## API
|
|
118
|
+
|
|
119
|
+
### Props
|
|
120
|
+
|
|
121
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
122
|
+
| ------- | --------------------------- | ---- | --------------------------------------------------------- |
|
|
123
|
+
| content | `string` | ✓ | 引用的文本内容;使用 Vue 文本插值渲染,XSS 安全 |
|
|
124
|
+
| onClose | `(content: string) => void` | — | 关闭回调;传入后右侧显示关闭图标,点击时将 `content` 回传 |
|
|
125
|
+
|
|
126
|
+
> **XSS 安全**:`content` 通过 `{{ content }}` 文本插值渲染,不会执行 HTML 标签或脚本。
|
|
127
|
+
|
|
128
|
+
## 样式说明
|
|
129
|
+
|
|
130
|
+
| 元素 | 关键样式 |
|
|
131
|
+
| ------------------------ | --------------------------------------------------------------------------------------------------- |
|
|
132
|
+
| `.ai-cite-content` | `height: 28px`,`padding: 0 8px`,`background: #f5f7fa`,`margin-bottom: 4px`(为下方内容留出间距) |
|
|
133
|
+
| `.ai-cite-content-text` | `flex: 1`,`white-space: nowrap`,`overflow: hidden`,`text-overflow: ellipsis`,`color: #979ba5` |
|
|
134
|
+
| `CiteIcon` / `CloseIcon` | `14×14px`,`color: #979ba5`;CloseIcon hover 变为 `#4d4f56` |
|
|
135
|
+
|
|
136
|
+
## 关联组件
|
|
137
|
+
|
|
138
|
+
- [ChatInput](../molecular/chat-input.md) — 引用区常见挂载位置
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
CodeContent 接收 markdown-it 的 fence/code_block token,按行 highlight.js 高亮并带语言标签与复制。 必填 props 为 token 数组;mounted 事件用于滚动联动等。 由 MarkdownContent 在解析代码块时挂载,面向流式增量更新。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **markdown-content** — 解析 Markdown 后生成 fence token 并渲染本组件
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
<!-- FULL DOC -->
|
|
11
|
+
|
|
12
|
+
# CodeContent 代码块渲染
|
|
13
|
+
|
|
14
|
+
> **层级**:原子组件 · **功能域**:内容渲染
|
|
15
|
+
|
|
16
|
+
代码块渲染原子组件,专为 **Markdown 流式输出**设计。接收 `markdown-it` token 数组,基于 `highlight.js`(github-dark 主题)实现逐行语法高亮,顶部固定深色头部展示语言名和复制按钮。
|
|
17
|
+
|
|
18
|
+
## 组件结构
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
.code-content-wrapper(width: 100%,margin-bottom: 12px)
|
|
22
|
+
├── .code-content-header(height: 40px,bg: #2f333d,border: 1px solid #1a1a1a)
|
|
23
|
+
│ ├── .code-header-language(color: #999,显示 token.info 原始字符串)
|
|
24
|
+
│ └── ToolBtn id="copy"(点击复制 codeRef.innerText)
|
|
25
|
+
│
|
|
26
|
+
└── .hljs-pre(bg: #282c34,padding: 8×16,overflow-x: auto)
|
|
27
|
+
└── <code class="hljs language-{raw-info}">
|
|
28
|
+
├── v-for completedLines
|
|
29
|
+
│ <span class="code-line" v-html="line.html" /> + '\n'
|
|
30
|
+
│ (已完成行,经过 hljs.highlight 高亮)
|
|
31
|
+
└── v-if currentLineText
|
|
32
|
+
<span class="code-line current-line" v-html="currentLineHtml" />
|
|
33
|
+
(最后一行,也经过 highlightLine,用 .current-line 标识正在输入)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 基础用法
|
|
37
|
+
|
|
38
|
+
`token` 接收 `markdown-it` 解析生成的 token 数组,组件从中提取第一个 `fence` 或 `code_block` token 渲染:
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<template>
|
|
42
|
+
<CodeContent
|
|
43
|
+
:token="codeTokens"
|
|
44
|
+
@mounted="handleMounted"
|
|
45
|
+
/>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script setup lang="ts">
|
|
49
|
+
import { CodeContent } from '@blueking/chat-x';
|
|
50
|
+
import type { Token } from 'markdown-it';
|
|
51
|
+
|
|
52
|
+
const codeTokens: Token[] = [
|
|
53
|
+
{
|
|
54
|
+
type: 'fence',
|
|
55
|
+
tag: 'code',
|
|
56
|
+
info: 'typescript',
|
|
57
|
+
content: 'const greeting = "Hello, World!";\nconsole.log(greeting);',
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const handleMounted = ({ el }: { el: HTMLElement | null }) => {
|
|
62
|
+
// el 是 <code> 元素的 DOM 引用(通过懒加载 getter 访问)
|
|
63
|
+
console.log('代码块已渲染:', el);
|
|
64
|
+
};
|
|
65
|
+
</script>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**TypeScript**
|
|
69
|
+
|
|
70
|
+
**Python**
|
|
71
|
+
|
|
72
|
+
**SQL**
|
|
73
|
+
|
|
74
|
+
## 流式渲染
|
|
75
|
+
|
|
76
|
+
组件的核心设计场景。流式输入时,每次 `token[].content` 追加新内容,只更新最后一行,已完成的行通过**内容比较复用缓存**,无需重新高亮:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
content 变化 → watch(immediate: true, deep: true) → processContent()
|
|
80
|
+
→ split('\n')
|
|
81
|
+
→ 除最后一行:与 completedLines 对比,内容未变则复用,否则重新 highlightLine
|
|
82
|
+
→ 最后一行:highlightLine 并赋值给 currentLineHtml(v-html 渲染)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**注意**:当 content 以 `\n` 结尾时,`split('\n')` 末尾为 `''`,`currentLineText = ''`,`.current-line` 元素不渲染(`v-if="currentLineText"`)。
|
|
86
|
+
|
|
87
|
+
```vue
|
|
88
|
+
<script setup lang="ts">
|
|
89
|
+
import { ref } from 'vue';
|
|
90
|
+
import { CodeContent } from '@blueking/chat-x';
|
|
91
|
+
|
|
92
|
+
const streamingTokens = ref([{ type: 'fence', tag: 'code', info: 'typescript', content: '' }]);
|
|
93
|
+
|
|
94
|
+
async function simulateStream() {
|
|
95
|
+
let content = '';
|
|
96
|
+
for (const char of fullCode) {
|
|
97
|
+
await new Promise(r => setTimeout(r, 20));
|
|
98
|
+
content += char;
|
|
99
|
+
// 每次只更新 content,token 数组引用可保持同一个对象(deep watch)
|
|
100
|
+
streamingTokens.value = [{ type: 'fence', tag: 'code', info: 'typescript', content }];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
</script>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 语言识别
|
|
107
|
+
|
|
108
|
+
### 内置别名映射
|
|
109
|
+
|
|
110
|
+
组件在 `MarkdownLanguageMap` 中维护了 3 个常用别名,`info` 字段使用别名时自动映射:
|
|
111
|
+
|
|
112
|
+
| `info` 值 | 映射后 | 说明 |
|
|
113
|
+
| --------- | ------------ | ---- |
|
|
114
|
+
| `js` | `javascript` | — |
|
|
115
|
+
| `ts` | `typescript` | — |
|
|
116
|
+
| `py` | `python` | — |
|
|
117
|
+
|
|
118
|
+
### 解析优先级
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
1. MarkdownLanguageMap[info] → 尝试别名映射
|
|
122
|
+
2. hljs.getLanguage(mappedLang) → 检查 hljs 是否支持
|
|
123
|
+
3. 提取文件扩展名(如 "index.ts" → "ts")→ 再次查询 hljs
|
|
124
|
+
4. 均不匹配 → resolveLanguage 返回 null → 对内容进行 HTML 转义(非高亮)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> **注意**:`code` 元素的 class 使用原始 `token.info`(`language-{info}`),不是解析后的语言名。即 `info: 'js'` → `class="language-js"`,但高亮时用 `javascript`。
|
|
128
|
+
|
|
129
|
+
### 未知语言(HTML 转义)
|
|
130
|
+
|
|
131
|
+
当语言无法识别时,内容经过 HTML 转义(`<` `>` `&` `"`)后直接渲染,不进行语法高亮:
|
|
132
|
+
|
|
133
|
+
### 无语言标识
|
|
134
|
+
|
|
135
|
+
`info` 为空字符串时,语言区域留空,内容同样走 HTML 转义路径:
|
|
136
|
+
|
|
137
|
+
## 高亮缓存
|
|
138
|
+
|
|
139
|
+
每行代码的高亮结果缓存在组件实例内部的 `Map<string, string>` 中(key 为 `"${lang}:${lineContent}"`),最大容量 500 条;超限后清除前 250 条(LRU 近似):
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
const lineHighlightCache = new Map<string, string>();
|
|
143
|
+
const MAX_CACHE_SIZE = 500;
|
|
144
|
+
|
|
145
|
+
// 超限时清理前半部分
|
|
146
|
+
if (lineHighlightCache.size > MAX_CACHE_SIZE) {
|
|
147
|
+
const keys = Array.from(lineHighlightCache.keys()).slice(0, MAX_CACHE_SIZE / 2);
|
|
148
|
+
keys.forEach(k => lineHighlightCache.delete(k));
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## API
|
|
153
|
+
|
|
154
|
+
### Props
|
|
155
|
+
|
|
156
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
157
|
+
| ------ | --------- | ---- | ------------------------------------------------------------------------ |
|
|
158
|
+
| token | `Token[]` | ✓ | markdown-it token 数组;组件提取其中第一个 `fence` 或 `code_block` token |
|
|
159
|
+
|
|
160
|
+
### Events
|
|
161
|
+
|
|
162
|
+
| 事件名 | 参数类型 | 触发时机 |
|
|
163
|
+
| ------- | ----------------------------- | --------------------------------------------------------------------------------- |
|
|
164
|
+
| mounted | `{ el: HTMLElement \| null }` | 每次 `token` 变化后 `nextTick` 完成时;`el` 为 `<code>` 元素引用(懒加载 getter) |
|
|
165
|
+
|
|
166
|
+
> **`mounted` 频率**:由于 `watch` 设置了 `immediate: true` 和 `deep: true`,每次 `token` 内容变化(包括初始化)都会触发 `mounted` 事件。
|
|
167
|
+
|
|
168
|
+
## Token 结构
|
|
169
|
+
|
|
170
|
+
组件从 token 数组中提取第一个匹配的 token:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// 组件接受的 token 格式(只使用这 3 个字段)
|
|
174
|
+
interface CodeToken {
|
|
175
|
+
type: 'fence' | 'code_block'; // 触发提取的条件
|
|
176
|
+
info: string; // 语言标识(如 'typescript'),显示在头部
|
|
177
|
+
content: string; // 代码内容(换行符 '\n' 分隔多行)
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
完整 Token 类型从 `markdown-it` 包引入:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import type { Token } from 'markdown-it';
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 样式说明
|
|
188
|
+
|
|
189
|
+
| 区域 | 关键样式 |
|
|
190
|
+
| ----------------------- | ------------------------------------------------------------------------------------ |
|
|
191
|
+
| `.code-content-header` | `height: 40px`,`background: #2f333d`,`border: 1px solid #1a1a1a`,圆角仅顶部 `6px` |
|
|
192
|
+
| `.code-header-language` | `color: #999`,`font-size: 12px`,`margin-right: auto`(推复制按钮到右侧) |
|
|
193
|
+
| `.hljs-pre` | `background: #282c34`,`padding: 8px 16px`,`overflow-x: auto`,圆角仅底部 `6px` |
|
|
194
|
+
| `code` | `color: #abb2bf`,`font-size: 13px`,`line-height: 1.5`,等宽字体栈 |
|
|
195
|
+
| `.code-line` | `display: inline`(保持行内流式拼接) |
|
|
196
|
+
|
|
197
|
+
## 关联组件
|
|
198
|
+
|
|
199
|
+
- [MarkdownContent](./markdown-content.md) — 解析并传入 code fence token
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
CommonErrorContent 以红色错误图标加文案展示失败态,布局为 flex 横排,文本为纯文本插值。 在 MarkdownContent、ReasoningMessage 等链路上当 status 为 error 时自动替换内容区。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **markdown-content** — Markdown 渲染错误态展示
|
|
8
|
+
- **reasoning-message** — 推理消息错误态展示
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# CommonErrorContent 通用错误内容
|
|
14
|
+
|
|
15
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
16
|
+
|
|
17
|
+
错误状态消息渲染原子组件。红色 `ErrorIcon`(14×14px,绝对定位)+ 文本区域,`display: flex` 水平排列。
|
|
18
|
+
|
|
19
|
+
通常由上层组件在 `status === 'error'` 时自动渲染,无需手动使用。
|
|
20
|
+
|
|
21
|
+
## 组件结构
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
.ai-error-content(position: relative,display: flex,align-items: center)
|
|
25
|
+
├── ErrorIcon(position: absolute,top: 2px,left: 0,flex: 0 0 14px,14×14px,color: #ea3636)
|
|
26
|
+
└── .ai-error-content-text(flex: 1,margin-left: 20px,font-size: 12px,line-height: 20px,color: #4d4f56)
|
|
27
|
+
└── {{ content }}(Vue 文本插值,XSS 安全;content 为 undefined 时渲染空文本)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 基础用法
|
|
31
|
+
|
|
32
|
+
```vue
|
|
33
|
+
<template>
|
|
34
|
+
<CommonErrorContent content="请求失败,请稍后重试" />
|
|
35
|
+
</template>
|
|
36
|
+
|
|
37
|
+
<script setup lang="ts">
|
|
38
|
+
import { CommonErrorContent } from '@blueking/chat-x';
|
|
39
|
+
</script>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 典型错误场景
|
|
43
|
+
|
|
44
|
+
## 不传 content
|
|
45
|
+
|
|
46
|
+
`content` 为可选,缺省时只渲染 `ErrorIcon`:
|
|
47
|
+
|
|
48
|
+
## 使用场景
|
|
49
|
+
|
|
50
|
+
组件库内部有两处自动使用:
|
|
51
|
+
|
|
52
|
+
| 使用方 | 触发条件 | 传入内容 |
|
|
53
|
+
| ------------------ | -------------------- | --------------------------------------------- |
|
|
54
|
+
| `MarkdownContent` | `status === 'error'` | `content`(字符串) |
|
|
55
|
+
| `ReasoningMessage` | `status === 'error'` | `content?.join('\n') \|\| ''`(数组转字符串) |
|
|
56
|
+
|
|
57
|
+
即 `AssistantMessage` / `ReasoningMessage` 在错误状态时,内容区域会自动替换为此组件,无需手动引入。
|
|
58
|
+
|
|
59
|
+
## API
|
|
60
|
+
|
|
61
|
+
### Props
|
|
62
|
+
|
|
63
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
64
|
+
| ------- | -------- | ---- | --------------------------------------------------------------- |
|
|
65
|
+
| content | `string` | — | 错误提示文本;使用 Vue 文本插值渲染,XSS 安全;缺省时仅显示图标 |
|
|
66
|
+
|
|
67
|
+
## 关联组件
|
|
68
|
+
|
|
69
|
+
- [MarkdownContent](./markdown-content.md) — Markdown 错误态
|
|
70
|
+
- [ReasoningMessage](../molecular/reasoning-message.md) — 推理错误态
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
汇总 MessageRole、MessageStatus、MessageContentType、MessageToolsStatus、MessageState、Z-Index 与 CONST_MESSAGE_TOOLS 等导出常量。 用于构造消息、配置 MessageContainer 工具栏与输入态,以及层级与默认快捷指令。与类型 messages 配套使用。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-tools** — 默认工具 ID 与展示
|
|
8
|
+
- **chat-input** — MessageState 与快捷指令
|
|
9
|
+
- **message-container** — 工具栏与消息态
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# 常量枚举
|
|
15
|
+
|
|
16
|
+
> **分类**:type
|
|
17
|
+
|
|
18
|
+
`@blueking/chat-x` 导出的常量和枚举类型。
|
|
19
|
+
|
|
20
|
+
## 消息相关
|
|
21
|
+
|
|
22
|
+
### MessageRole
|
|
23
|
+
|
|
24
|
+
消息角色枚举:
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
enum MessageRole {
|
|
28
|
+
User = 'user',
|
|
29
|
+
Assistant = 'assistant',
|
|
30
|
+
System = 'system',
|
|
31
|
+
Developer = 'developer',
|
|
32
|
+
Guide = 'guide',
|
|
33
|
+
Hidden = 'hidden',
|
|
34
|
+
HiddenAssistant = 'hidden-assistant',
|
|
35
|
+
HiddenGuide = 'hidden-guide',
|
|
36
|
+
HiddenSystem = 'hidden-system',
|
|
37
|
+
HiddenUser = 'hidden-user',
|
|
38
|
+
Info = 'info',
|
|
39
|
+
Loading = 'loading',
|
|
40
|
+
Pause = 'pause',
|
|
41
|
+
Placeholder = 'placeholder',
|
|
42
|
+
Reasoning = 'reasoning',
|
|
43
|
+
TemplateAssistant = 'template-assistant',
|
|
44
|
+
TemplateGuide = 'template-guide',
|
|
45
|
+
TemplateHidden = 'template-hidden',
|
|
46
|
+
TemplateSystem = 'template-system',
|
|
47
|
+
TemplateUser = 'template-user',
|
|
48
|
+
Tool = 'tool',
|
|
49
|
+
Activity = 'activity',
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### MessageStatus
|
|
54
|
+
|
|
55
|
+
消息状态枚举:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
enum MessageStatus {
|
|
59
|
+
Pending = 'pending',
|
|
60
|
+
Streaming = 'streaming',
|
|
61
|
+
Complete = 'complete',
|
|
62
|
+
Error = 'error',
|
|
63
|
+
Stop = 'stop',
|
|
64
|
+
Disabled = 'disabled',
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### MessageContentType
|
|
69
|
+
|
|
70
|
+
消息内容类型枚举:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
enum MessageContentType {
|
|
74
|
+
Binary = 'binary',
|
|
75
|
+
Function = 'function',
|
|
76
|
+
KeyValue = 'key-value',
|
|
77
|
+
KnowledgeRag = 'knowledge-rag',
|
|
78
|
+
Other = 'other',
|
|
79
|
+
ReferenceDocument = 'reference-document',
|
|
80
|
+
Text = 'text',
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### MessageToolsStatus
|
|
85
|
+
|
|
86
|
+
消息工具栏状态枚举:
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
enum MessageToolsStatus {
|
|
90
|
+
Disabled = 'disabled', // 禁用状态,按钮显示但不可点击
|
|
91
|
+
Hidden = 'hidden', // 隐藏状态,工具栏完全隐藏
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 输入状态
|
|
96
|
+
|
|
97
|
+
### MessageState
|
|
98
|
+
|
|
99
|
+
输入框消息状态:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const MessageState = {
|
|
103
|
+
ACTIVE: 'active',
|
|
104
|
+
DISABLED: 'disabled',
|
|
105
|
+
LOADING: 'loading',
|
|
106
|
+
} as const;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Z-Index 常量
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// 全局 chat-x 组件 Z-Index
|
|
113
|
+
const CHAT_Z_INDEX = 9999;
|
|
114
|
+
|
|
115
|
+
// 编辑器组件 Z-Index
|
|
116
|
+
const EDITOR_Z_INDEX = 10000;
|
|
117
|
+
|
|
118
|
+
// 编辑器菜单 Z-Index
|
|
119
|
+
const EDITOR_MENU_Z_INDEX = 10001;
|
|
120
|
+
|
|
121
|
+
// 快捷指令菜单 Z-Index
|
|
122
|
+
const SHORTCUT_MENU_Z_INDEX = 10002;
|
|
123
|
+
|
|
124
|
+
// 划选弹窗 Z-Index
|
|
125
|
+
const SELECTION_Z_INDEX = 10003;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## 默认工具按钮
|
|
129
|
+
|
|
130
|
+
### CONST_MESSAGE_TOOLS
|
|
131
|
+
|
|
132
|
+
消息工具按钮列表:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const CONST_MESSAGE_TOOLS: IToolBtn[] = [
|
|
136
|
+
{ id: 'copy', name: '复制', description: '复制' },
|
|
137
|
+
{ id: 'cite', name: '引用', description: '引用' },
|
|
138
|
+
{ id: 'rebuild', name: '重新生成', description: '重新生成' },
|
|
139
|
+
{ id: 'share', name: '分享', description: '分享' },
|
|
140
|
+
];
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### CONST_USER_MESSAGE_TOOLS
|
|
144
|
+
|
|
145
|
+
用户消息工具按钮列表:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const CONST_USER_MESSAGE_TOOLS: IToolBtn[] = [
|
|
149
|
+
{ id: 'copy', name: '复制', description: '复制' },
|
|
150
|
+
{ id: 'cite', name: '引用', description: '引用' },
|
|
151
|
+
{ id: 'edit', name: '编辑', description: '编辑' },
|
|
152
|
+
{ id: 'delete', name: '删除', description: '删除' },
|
|
153
|
+
];
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### CONST_UPDATE_TOOLS
|
|
157
|
+
|
|
158
|
+
更新工具按钮列表(点赞/不满意):
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
const CONST_UPDATE_TOOLS: IToolBtn[] = [
|
|
162
|
+
{ id: 'like', name: '点赞', description: '点赞' },
|
|
163
|
+
{ id: 'unlike', name: '不满意', description: '不满意' },
|
|
164
|
+
{ id: 'delete', name: '删除', description: '删除' },
|
|
165
|
+
];
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## 默认快捷指令
|
|
169
|
+
|
|
170
|
+
### DEFAULT_SHORTCUTS
|
|
171
|
+
|
|
172
|
+
默认快捷指令列表:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const DEFAULT_SHORTCUTS: Shortcut[] = [{ id: 'ask-whale', name: '问问小鲸' }];
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 使用示例
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import {
|
|
182
|
+
MessageRole,
|
|
183
|
+
MessageStatus,
|
|
184
|
+
MessageContentType,
|
|
185
|
+
MessageToolsStatus,
|
|
186
|
+
CHAT_Z_INDEX,
|
|
187
|
+
CONST_MESSAGE_TOOLS,
|
|
188
|
+
DEFAULT_SHORTCUTS,
|
|
189
|
+
} from '@blueking/chat-x';
|
|
190
|
+
|
|
191
|
+
// 创建消息
|
|
192
|
+
const message = {
|
|
193
|
+
id: '1',
|
|
194
|
+
messageId: 1,
|
|
195
|
+
role: MessageRole.User,
|
|
196
|
+
content: '你好',
|
|
197
|
+
status: MessageStatus.Complete,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// 检查消息状态
|
|
201
|
+
if (message.status === MessageStatus.Streaming) {
|
|
202
|
+
console.log('消息正在流式输出中...');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// 使用默认工具按钮
|
|
206
|
+
console.log(
|
|
207
|
+
'可用工具:',
|
|
208
|
+
CONST_MESSAGE_TOOLS.map(t => t.name),
|
|
209
|
+
);
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 关联组件
|
|
213
|
+
|
|
214
|
+
- [MessageTools](../components/molecular/message-tools.md) — 消息工具栏
|
|
215
|
+
- [ChatInput](../components/molecular/chat-input.md) — 输入与状态
|
|
216
|
+
- [MessageContainer](../components/molecular/message-container.md) — 工具与消息展示
|