@blueking/chat-x 0.0.51 → 0.0.52-dev.2
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/README.md +15 -8
- package/dist/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/messages.d.ts +6 -1
- package/dist/common/constants.d.ts +2 -0
- package/dist/components/ai-buttons/add-menu-btn/add-menu-btn.vue.d.ts +24 -0
- package/dist/components/chat-content/collapsible-content/collapsible-content.vue.d.ts +28 -0
- package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +5 -2
- package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +1 -0
- package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +1 -1
- package/dist/components/chat-input/ai-slash-input/ai-slash-input.vue.d.ts +21 -10
- package/dist/components/chat-input/ai-slash-input/command.d.ts +6 -3
- package/dist/components/chat-input/ai-slash-input/constants.d.ts +2 -0
- package/dist/components/chat-input/ai-slash-input/use-menu-trigger.d.ts +17 -0
- package/dist/components/chat-input/build-default-placeholder.d.ts +9 -3
- package/dist/components/chat-input/chat-input.vue.d.ts +30 -18
- package/dist/components/chat-input/input-menu/constants.d.ts +60 -0
- package/dist/components/chat-input/input-menu/index.d.ts +4 -0
- package/dist/components/chat-input/input-menu/input-menu-option.vue.d.ts +14 -0
- package/dist/components/chat-input/input-menu/input-menu-panel.vue.d.ts +17 -0
- package/dist/components/chat-input/input-menu/use-input-menu.d.ts +22 -0
- package/dist/components/chat-input/model-selector/types.d.ts +3 -2
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -1
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +1 -1
- package/dist/components/mention/create-mention-tippy.d.ts +27 -0
- package/dist/components/mention/index.d.ts +4 -0
- 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
- 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
- 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
- package/dist/components/resource-icon/index.d.ts +1 -0
- package/dist/components/resource-icon/resource-icon.vue.d.ts +11 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/use-artifact-preview.d.ts +5 -2
- package/dist/composables/use-common.d.ts +0 -9
- package/dist/composables/use-global-config.d.ts +4 -0
- package/dist/composables/use-input-mention.d.ts +13 -0
- package/dist/composables/use-message-group.d.ts +1011 -72
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/input.d.ts +21 -0
- package/dist/icons/menu-item.d.ts +22 -0
- package/dist/index.css +1 -1
- package/dist/index.js +5116 -4595
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +13 -3
- package/dist/mcp/generated/docs/activity-message.md +3 -3
- package/dist/mcp/generated/docs/add-menu-btn.md +91 -0
- package/dist/mcp/generated/docs/ai-selection.md +1 -1
- package/dist/mcp/generated/docs/ai-slash-input.md +72 -26
- package/dist/mcp/generated/docs/assistant-message.md +7 -1
- package/dist/mcp/generated/docs/chat-container.md +45 -6
- package/dist/mcp/generated/docs/chat-input.md +327 -483
- package/dist/mcp/generated/docs/collapsible-content.md +78 -0
- package/dist/mcp/generated/docs/constants.md +36 -3
- package/dist/mcp/generated/docs/execution-summary.md +1 -23
- package/dist/mcp/generated/docs/file-artifact-panel.md +24 -5
- package/dist/mcp/generated/docs/file-content.md +4 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +15 -12
- package/dist/mcp/generated/docs/flow-agent-content.md +10 -12
- package/dist/mcp/generated/docs/input-menu-panel.md +166 -0
- package/dist/mcp/generated/docs/mention-tag.md +83 -0
- package/dist/mcp/generated/docs/mention-text.md +86 -0
- package/dist/mcp/generated/docs/message-container.md +1 -1
- package/dist/mcp/generated/docs/message-render.md +1 -1
- package/dist/mcp/generated/docs/message-tools.md +15 -4
- package/dist/mcp/generated/docs/messages.md +3 -0
- package/dist/mcp/generated/docs/model-selector.md +4 -2
- package/dist/mcp/generated/docs/overflow-tips.md +3 -3
- package/dist/mcp/generated/docs/resource-icon.md +102 -0
- package/dist/mcp/generated/docs/text-content.md +7 -3
- package/dist/mcp/generated/docs/theme.md +27 -35
- package/dist/mcp/generated/docs/use-artifact-preview.md +7 -3
- package/dist/mcp/generated/docs/use-command-selection.md +1 -1
- package/dist/mcp/generated/docs/use-container-scroll.md +2 -1
- package/dist/mcp/generated/docs/use-flow-node-actions.md +8 -15
- package/dist/mcp/generated/docs/use-global-config.md +11 -4
- package/dist/mcp/generated/docs/use-input-mention.md +119 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +15 -16
- package/dist/mcp/generated/docs/use-message-group.md +3 -6
- package/dist/mcp/generated/docs/user-message.md +39 -17
- package/dist/mcp/generated/index.json +233 -81
- package/dist/types/editor.d.ts +0 -29
- package/dist/types/index.d.ts +1 -0
- package/dist/types/input-menu.d.ts +46 -0
- package/dist/utils/artifact-tags.d.ts +36 -0
- package/dist/utils/collect-message-artifacts.d.ts +14 -0
- package/dist/utils/file.d.ts +3 -3
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/upload-file.d.ts +6 -1
- package/package.json +4 -3
- package/skills/blueking-chat-x/SKILL.md +143 -0
- package/skills/blueking-chat-x/references/_index.md +153 -0
- package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
- package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
- package/skills/blueking-chat-x/references/components/add-menu-btn.md +88 -0
- package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
- package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
- package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
- package/skills/blueking-chat-x/references/components/ai-slash-input.md +102 -0
- package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
- package/skills/blueking-chat-x/references/components/assistant-message.md +504 -0
- package/skills/blueking-chat-x/references/components/chat-container.md +912 -0
- package/skills/blueking-chat-x/references/components/chat-input.md +614 -0
- package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
- package/skills/blueking-chat-x/references/components/code-content.md +211 -0
- package/skills/blueking-chat-x/references/components/collapsible-content.md +76 -0
- package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
- package/skills/blueking-chat-x/references/components/content-render.md +233 -0
- package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
- package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
- package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
- package/skills/blueking-chat-x/references/components/execution-summary.md +150 -0
- package/skills/blueking-chat-x/references/components/file-artifact-panel.md +307 -0
- package/skills/blueking-chat-x/references/components/file-content.md +340 -0
- package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
- package/skills/blueking-chat-x/references/components/file-upload-btn.md +162 -0
- package/skills/blueking-chat-x/references/components/flow-agent-content.md +266 -0
- package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
- package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
- package/skills/blueking-chat-x/references/components/image-content.md +182 -0
- package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
- package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
- package/skills/blueking-chat-x/references/components/info-message.md +144 -0
- package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
- package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
- package/skills/blueking-chat-x/references/components/input-menu-panel.md +162 -0
- package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
- package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
- package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
- package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
- package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
- package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
- package/skills/blueking-chat-x/references/components/mention-tag.md +79 -0
- package/skills/blueking-chat-x/references/components/mention-text.md +83 -0
- package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
- package/skills/blueking-chat-x/references/components/message-container.md +645 -0
- package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
- package/skills/blueking-chat-x/references/components/message-render.md +327 -0
- package/skills/blueking-chat-x/references/components/message-time.md +177 -0
- package/skills/blueking-chat-x/references/components/message-tools.md +427 -0
- package/skills/blueking-chat-x/references/components/model-selector.md +157 -0
- package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
- package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
- package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
- package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
- package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
- package/skills/blueking-chat-x/references/components/resource-icon.md +98 -0
- package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
- package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
- package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
- package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
- package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
- package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
- package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
- package/skills/blueking-chat-x/references/components/text-content.md +80 -0
- package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
- package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
- package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
- package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
- package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
- package/skills/blueking-chat-x/references/components/user-message.md +444 -0
- package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
- package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
- package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
- package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
- package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
- package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
- package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +235 -0
- package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
- package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
- package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
- package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
- package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +164 -0
- package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
- package/skills/blueking-chat-x/references/composables/use-global-config.md +155 -0
- package/skills/blueking-chat-x/references/composables/use-input-mention.md +115 -0
- package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +161 -0
- package/skills/blueking-chat-x/references/composables/use-message-group.md +244 -0
- package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
- package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
- package/skills/blueking-chat-x/references/directives/index.md +61 -0
- package/skills/blueking-chat-x/references/directives/overflow-tips.md +205 -0
- package/skills/blueking-chat-x/references/icons/index.md +185 -0
- package/skills/blueking-chat-x/references/plugins/index.md +56 -0
- package/skills/blueking-chat-x/references/plugins/markdown-container.md +55 -0
- package/skills/blueking-chat-x/references/plugins/markdown-latex.md +205 -0
- package/skills/blueking-chat-x/references/plugins/markdown-mermaid.md +247 -0
- package/skills/blueking-chat-x/references/theme/theme.md +423 -0
- package/skills/blueking-chat-x/references/types/constants.md +340 -0
- package/skills/blueking-chat-x/references/types/index.md +120 -0
- package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
- package/skills/blueking-chat-x/references/types/messages.md +556 -0
- package/skills/blueking-chat-x/references/types/schema.md +91 -0
- package/skills/blueking-chat-x/references/utils/index.md +196 -0
- package/skills/blueking-chat-x/scripts/generate-references.mjs +536 -0
- package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +0 -28
- package/dist/components/chat-input/ai-slash-editor/theme.d.ts +0 -24
- package/dist/mcp/generated/docs/ai-prompt-list.md +0 -45
- package/dist/mcp/generated/docs/ai-skill-list.md +0 -75
- package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# MessageLoading 品牌加载
|
|
2
|
+
|
|
3
|
+
> 能力域:辅助能力 | 导入:`import { MessageLoading } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
带品牌图标和逐字渐变动画的加载组件。 源码位置:src/components/message-loading/message-loading.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:loading-message(消息列表加载占位可选择使用品牌加载动效)、ai-loading(更轻量的三点加载动画)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# MessageLoading 品牌加载
|
|
12
|
+
|
|
13
|
+
> **能力域**:辅助能力
|
|
14
|
+
|
|
15
|
+
`MessageLoading` 是带蓝鲸品牌图标和逐字渐变动画的加载组件,用于展示 AI 正在思考、生成或执行任务的等待状态。组件默认显示品牌图标和“加载中...”文案,也支持通过插槽替换图标或文本。
|
|
16
|
+
|
|
17
|
+
与 [AiLoading](./ai-loading.md) 相比,它更偏品牌化、文案化;适合较明显的等待区域,不适合嵌入很紧凑的按钮或状态点。
|
|
18
|
+
|
|
19
|
+
## 源码事实
|
|
20
|
+
|
|
21
|
+
- **源码位置**:`src/components/message-loading/message-loading.vue`
|
|
22
|
+
- **能力说明**:带品牌图标和逐字渐变动画的加载组件。
|
|
23
|
+
|
|
24
|
+
## 核心能力
|
|
25
|
+
|
|
26
|
+
- **品牌图标动画**:默认使用 `AIBluekingIcon`,图标随 `duration` 做透明度和滤镜动画
|
|
27
|
+
- **逐字渐变文本**:未传 `#text` 插槽时,将 `text` 拆成字符逐个渲染,并按 `stagger` 延迟播放
|
|
28
|
+
- **可调尺寸和节奏**:通过 `iconSize`、`gap`、`duration`、`stagger` 控制图标尺寸、间距和动画速度
|
|
29
|
+
- **插槽覆盖**:`#icon` 可替换图标,`#text` 可替换整段文本渲染
|
|
30
|
+
- **无障碍降级**:遵循 `prefers-reduced-motion: reduce`,减少动画效果
|
|
31
|
+
|
|
32
|
+
## 基础用法
|
|
33
|
+
|
|
34
|
+
```vue
|
|
35
|
+
<template>
|
|
36
|
+
<MessageLoading />
|
|
37
|
+
</template>
|
|
38
|
+
|
|
39
|
+
<script setup lang="ts">
|
|
40
|
+
import { MessageLoading } from '@blueking/chat-x';
|
|
41
|
+
</script>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**渲染效果**
|
|
45
|
+
|
|
46
|
+
## 自定义文案和尺寸
|
|
47
|
+
|
|
48
|
+
```vue
|
|
49
|
+
<template>
|
|
50
|
+
<MessageLoading
|
|
51
|
+
text="正在思考中..."
|
|
52
|
+
:icon-size="28"
|
|
53
|
+
:gap="10"
|
|
54
|
+
:duration="2"
|
|
55
|
+
:stagger="0.12"
|
|
56
|
+
/>
|
|
57
|
+
</template>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 自定义插槽
|
|
61
|
+
|
|
62
|
+
传入 `#text` 后,组件不再按字符拆分 `text` prop,而是直接渲染插槽内容;传入 `#icon` 可替换默认品牌图标。
|
|
63
|
+
|
|
64
|
+
```vue
|
|
65
|
+
<template>
|
|
66
|
+
<MessageLoading>
|
|
67
|
+
<template #icon>
|
|
68
|
+
<span class="custom-icon">AI</span>
|
|
69
|
+
</template>
|
|
70
|
+
<template #text>
|
|
71
|
+
正在生成巡检结论
|
|
72
|
+
</template>
|
|
73
|
+
</MessageLoading>
|
|
74
|
+
</template>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## API
|
|
78
|
+
|
|
79
|
+
### Props
|
|
80
|
+
|
|
81
|
+
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|
|
82
|
+
| -------- | -------- | ---- | ----------- | ---------------------------------- |
|
|
83
|
+
| text | `string` | 否 | `'加载中...'` | 逐字动画文案;使用 `#text` 时可不传 |
|
|
84
|
+
| iconSize | `number` | 否 | `32` | 默认图标边长,单位 px |
|
|
85
|
+
| gap | `number` | 否 | `8` | 图标与文字间距,单位 px |
|
|
86
|
+
| duration | `number` | 否 | `1.8` | 单次动画循环时长,单位秒 |
|
|
87
|
+
| stagger | `number` | 否 | `0.135` | 相邻字符动画延迟,单位秒 |
|
|
88
|
+
|
|
89
|
+
### Emits
|
|
90
|
+
|
|
91
|
+
- 无。
|
|
92
|
+
|
|
93
|
+
### Slots
|
|
94
|
+
|
|
95
|
+
| 插槽名 | 说明 |
|
|
96
|
+
| ------ | ------------------------ |
|
|
97
|
+
| icon | 自定义图标区域 |
|
|
98
|
+
| text | 自定义文本区域,覆盖逐字渲染 |
|
|
99
|
+
|
|
100
|
+
### Expose
|
|
101
|
+
|
|
102
|
+
- 无。
|
|
103
|
+
|
|
104
|
+
## 样式与 attrs
|
|
105
|
+
|
|
106
|
+
- 组件设置 `inheritAttrs: false`,会将外部 `class` 合并到根节点,并将除 `class` / `style` 外的 attrs 透传到根节点。
|
|
107
|
+
- 外部对象形式的 `style` 会与 CSS 变量合并;字符串形式 `style` 不会参与合并。
|
|
108
|
+
- 根节点使用 CSS 变量控制动画:`--ai-message-loading-duration`、`--ai-message-loading-stagger`、`--ai-message-loading-gap`。
|
|
109
|
+
|
|
110
|
+
## 使用建议
|
|
111
|
+
|
|
112
|
+
- 页面级或消息级等待态优先使用 `MessageLoading`;紧凑状态点优先使用 [AiLoading](./ai-loading.md)。
|
|
113
|
+
- 需要自定义文本样式时优先使用 `#text` 插槽,避免只依赖全局覆盖内部 class。
|
|
114
|
+
|
|
115
|
+
## 关联组件
|
|
116
|
+
|
|
117
|
+
- [LoadingMessage](../message/loading-message.md) — 消息列表中的加载占位。
|
|
118
|
+
- [AiLoading](./ai-loading.md) — 三点加载动画。
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# MessageRender 消息渲染器
|
|
2
|
+
|
|
3
|
+
> 能力域:消息系统 | 导入:`import { MessageRender } from '@blueking/chat-x'` | since 0.0.20
|
|
4
|
+
|
|
5
|
+
按 message.role 分发到用户、助手、工具、推理、活动、中断等消息组件。 源码位置:src/components/chat-message/message-render/message-render.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:message-container(在 MessageContainer 中按组调用以渲染每条消息)、assistant-message(role 为 assistant 时渲染 AI 回复与工具调用)、user-message(role 为 user 时渲染用户消息)、interrupt-message(role 为 interrupt 时渲染 InterruptMessageRender)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# MessageRender 消息渲染器
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/chat-message/message-render/message-render.vue`
|
|
16
|
+
- **能力域**:消息系统
|
|
17
|
+
- **能力说明**:按 `message.role` 分发到用户、助手、工具、推理、活动、中断等消息组件。
|
|
18
|
+
|
|
19
|
+
> **导出说明**:`MessageRender` **已**从 `@blueking/chat-x` 包入口导出,消费方可直接 import。下文 `MessageRenderComp` 为文档站相对路径 demo,与包入口行为一致。
|
|
20
|
+
|
|
21
|
+
统一的消息渲染入口,通过 `message.role` 派发到对应子组件;由单个 `computed` 完成,无额外状态。
|
|
22
|
+
|
|
23
|
+
## 渲染架构
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
MessageRender
|
|
27
|
+
│
|
|
28
|
+
├── props.message.role
|
|
29
|
+
│ │
|
|
30
|
+
│ ├── 'user' → UserMessage(转发 message + onAction / onInputConfirm /
|
|
31
|
+
│ │ onShortcutConfirm / messageToolsStatus / tippyOptions)
|
|
32
|
+
│ │
|
|
33
|
+
│ ├── 'assistant' → AssistantMessage(转发 message + default slot)
|
|
34
|
+
│ │ └── default slot 默认回退到 ContentRender
|
|
35
|
+
│ │
|
|
36
|
+
│ ├── 'info' → InfoMessage(转发 message)
|
|
37
|
+
│ ├── 'reasoning' → ReasoningMessage(转发 message)
|
|
38
|
+
│ ├── 'tool' → ToolMessage(转发 message)
|
|
39
|
+
│ ├── 'activity' → ActivityMessage(转发 message + onInterruptResume)
|
|
40
|
+
│ ├── 'loading' → LoadingMessage(转发 message)
|
|
41
|
+
│ ├── 'interrupt' → InterruptMessageRender(转发 message + onInterruptResume)
|
|
42
|
+
│ │
|
|
43
|
+
│ └── 其他 / 未知 → null(不渲染任何内容)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> **重要**:`onAction`、`onInputConfirm`、`onShortcutConfirm`、`messageToolsStatus`、`tippyOptions` 这五个 prop **只转发给 `UserMessage`**。`AssistantMessage` 的工具栏由 `MessageContainer` 的 `MessageTools` 组件管理,`MessageRender` 不负责传递。
|
|
47
|
+
|
|
48
|
+
## 基础用法
|
|
49
|
+
|
|
50
|
+
```vue
|
|
51
|
+
<template>
|
|
52
|
+
<MessageRender
|
|
53
|
+
:message="message"
|
|
54
|
+
:on-action="handleAction"
|
|
55
|
+
/>
|
|
56
|
+
</template>
|
|
57
|
+
|
|
58
|
+
<script setup lang="ts">
|
|
59
|
+
import { MessageRender, MessageRole, MessageStatus, type Message, type IToolBtn } from '@blueking/chat-x';
|
|
60
|
+
|
|
61
|
+
const message = {
|
|
62
|
+
id: '1',
|
|
63
|
+
messageId: '1',
|
|
64
|
+
role: MessageRole.Assistant,
|
|
65
|
+
content: '你好!我是 AI 助手,有什么可以帮你的吗?',
|
|
66
|
+
status: MessageStatus.Complete,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
70
|
+
console.log('消息操作:', tool.id);
|
|
71
|
+
};
|
|
72
|
+
</script>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**渲染效果**
|
|
76
|
+
|
|
77
|
+
## 各角色消息
|
|
78
|
+
|
|
79
|
+
### 用户消息(user)
|
|
80
|
+
|
|
81
|
+
`onAction`、`onInputConfirm`、`onShortcutConfirm`、`messageToolsStatus` 在此角色下生效。
|
|
82
|
+
|
|
83
|
+
```vue
|
|
84
|
+
<script setup lang="ts">
|
|
85
|
+
import { MessageRole, MessageStatus, type Message, type IToolBtn, type TagSchema } from '@blueking/chat-x';
|
|
86
|
+
|
|
87
|
+
const message = {
|
|
88
|
+
id: '1',
|
|
89
|
+
messageId: '1',
|
|
90
|
+
role: MessageRole.User,
|
|
91
|
+
content: '你好,请帮我解释一下什么是 Vue 3 的组合式 API',
|
|
92
|
+
status: MessageStatus.Complete,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const handleAction = async (tool: IToolBtn) => {
|
|
96
|
+
console.log('用户消息操作:', tool.id); // delete / copy 等
|
|
97
|
+
};
|
|
98
|
+
const handleInputConfirm = async (content: Message['content'], docSchema: TagSchema) => {
|
|
99
|
+
console.log('编辑确认:', content);
|
|
100
|
+
};
|
|
101
|
+
const handleShortcutConfirm = async (formModel: Record<string, unknown>) => {
|
|
102
|
+
console.log('快捷指令提交:', formModel);
|
|
103
|
+
};
|
|
104
|
+
</script>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**渲染效果**
|
|
108
|
+
|
|
109
|
+
### AI 助手消息(assistant)
|
|
110
|
+
|
|
111
|
+
`message` 中的全部字段(含 `toolCalls`)直接透传给 `AssistantMessage`。
|
|
112
|
+
|
|
113
|
+
```vue
|
|
114
|
+
<script setup lang="ts">
|
|
115
|
+
import { MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
116
|
+
|
|
117
|
+
const message = {
|
|
118
|
+
id: '2',
|
|
119
|
+
messageId: '2',
|
|
120
|
+
role: MessageRole.Assistant,
|
|
121
|
+
content: `## Vue 3 组合式 API\n\n**组合式 API** 是 Vue 3 引入的一种新方式...`,
|
|
122
|
+
status: MessageStatus.Complete,
|
|
123
|
+
};
|
|
124
|
+
</script>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**渲染效果**
|
|
128
|
+
|
|
129
|
+
### 信息消息(info)
|
|
130
|
+
|
|
131
|
+
`content` 为字符串或字符串数组,渲染居中虚线分隔条。
|
|
132
|
+
|
|
133
|
+
### 推理消息(reasoning)
|
|
134
|
+
|
|
135
|
+
`content` 为字符串数组,`duration` 为推理耗时(毫秒)。
|
|
136
|
+
|
|
137
|
+
### 工具调用结果(tool)
|
|
138
|
+
|
|
139
|
+
在 `MessageContainer` 中通常不独立渲染(被注入到 AssistantMessage),单独使用时如下:
|
|
140
|
+
|
|
141
|
+
### 活动消息(activity)
|
|
142
|
+
|
|
143
|
+
### 加载消息(loading)
|
|
144
|
+
|
|
145
|
+
由 `MessageContainer` 自动注入,无需手动使用。
|
|
146
|
+
|
|
147
|
+
## 消息状态
|
|
148
|
+
|
|
149
|
+
### 流式输出(streaming)
|
|
150
|
+
|
|
151
|
+
`status: 'streaming'` 时,默认回退的 `ContentRender` / `MarkdownContent` 会按流式规则补全未闭合语法;内容由外部逐步追加:
|
|
152
|
+
|
|
153
|
+
```vue
|
|
154
|
+
<script setup lang="ts">
|
|
155
|
+
import { ref } from 'vue';
|
|
156
|
+
import { MessageRole, MessageStatus, type Message } from '@blueking/chat-x';
|
|
157
|
+
|
|
158
|
+
const message = ref<Message>({
|
|
159
|
+
id: '1',
|
|
160
|
+
messageId: '1',
|
|
161
|
+
role: MessageRole.Assistant,
|
|
162
|
+
content: '',
|
|
163
|
+
status: MessageStatus.Streaming,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// 模拟流式输出:逐步追加内容
|
|
167
|
+
const chunks = ['正在', '为你', '生成', '答案...'];
|
|
168
|
+
let i = 0;
|
|
169
|
+
const timer = setInterval(() => {
|
|
170
|
+
if (i < chunks.length) {
|
|
171
|
+
message.value.content += chunks[i++];
|
|
172
|
+
} else {
|
|
173
|
+
message.value.status = MessageStatus.Complete;
|
|
174
|
+
clearInterval(timer);
|
|
175
|
+
}
|
|
176
|
+
}, 300);
|
|
177
|
+
</script>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**渲染效果**
|
|
181
|
+
|
|
182
|
+
### 错误状态(error)
|
|
183
|
+
|
|
184
|
+
```vue
|
|
185
|
+
<script setup lang="ts">
|
|
186
|
+
import { MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
187
|
+
|
|
188
|
+
const message = {
|
|
189
|
+
id: '1',
|
|
190
|
+
messageId: '1',
|
|
191
|
+
role: MessageRole.Assistant,
|
|
192
|
+
content: '抱歉,生成回答时发生了错误,请重试。',
|
|
193
|
+
status: MessageStatus.Error,
|
|
194
|
+
};
|
|
195
|
+
</script>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
**渲染效果**
|
|
199
|
+
|
|
200
|
+
## 自定义内容渲染(default slot)
|
|
201
|
+
|
|
202
|
+
`default` slot **仅对 `role: 'assistant'` 生效**,用于替换默认的 `ContentRender`。
|
|
203
|
+
|
|
204
|
+
未提供 slot 时,内部回退为:
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
h(ContentRender, { content: message.content || '', status: message.status }, /* codeHeader */)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
自定义 slot 时,运行时参数来自 `AssistantMessage` 的 `v-bind`,**仅保证 `{ content }`**。需要 `status` 时请从外层 `message.status` 读取(不要依赖 slot 内的 `status`)。
|
|
211
|
+
|
|
212
|
+
```vue
|
|
213
|
+
<template>
|
|
214
|
+
<MessageRender :message="message">
|
|
215
|
+
<template #default="{ content }">
|
|
216
|
+
<MyMarkdownRenderer
|
|
217
|
+
:content="content"
|
|
218
|
+
:streaming="message.status === 'streaming'"
|
|
219
|
+
/>
|
|
220
|
+
</template>
|
|
221
|
+
</MessageRender>
|
|
222
|
+
</template>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
| 参数 | 类型 | 说明 |
|
|
226
|
+
| --------- | -------- | ---------------------------- |
|
|
227
|
+
| `content` | `string` | 消息内容(运行时保证) |
|
|
228
|
+
|
|
229
|
+
## 与 MessageContainer / ChatContainer 配合
|
|
230
|
+
|
|
231
|
+
自定义 `ChatContainer` 的 `#message` 时,插槽参数只有 `message` / `messageToolsStatus` / `onInterruptResume`。用户消息工具相关回调需由外层自行绑定透传,否则删除/编辑/复制会失效(AI 消息工具栏在 `MessageContainer` 内渲染,不受 `#message` 影响):
|
|
232
|
+
|
|
233
|
+
```vue
|
|
234
|
+
<template>
|
|
235
|
+
<ChatContainer
|
|
236
|
+
:messages="messages"
|
|
237
|
+
:message-status="messageStatus"
|
|
238
|
+
:on-agent-action="handleAgentAction"
|
|
239
|
+
:on-user-action="handleUserAction"
|
|
240
|
+
:common-tippy-options="commonTippyOptions"
|
|
241
|
+
>
|
|
242
|
+
<template #message="{ message, messageToolsStatus, onInterruptResume }">
|
|
243
|
+
<MessageRender
|
|
244
|
+
:message="message"
|
|
245
|
+
:message-tools-status="messageToolsStatus"
|
|
246
|
+
:on-action="handleUserAction"
|
|
247
|
+
:on-input-confirm="(content, docSchema) => handleUserInputConfirm(message, content, docSchema)"
|
|
248
|
+
:on-shortcut-confirm="formModel => handleUserShortcutConfirm(message, formModel)"
|
|
249
|
+
:tippy-options="commonTippyOptions"
|
|
250
|
+
:on-interrupt-resume="onInterruptResume"
|
|
251
|
+
>
|
|
252
|
+
<template
|
|
253
|
+
v-if="message.role === 'assistant'"
|
|
254
|
+
#default="{ content }"
|
|
255
|
+
>
|
|
256
|
+
<MyCustomContent
|
|
257
|
+
:content="content"
|
|
258
|
+
:status="message.status"
|
|
259
|
+
/>
|
|
260
|
+
</template>
|
|
261
|
+
<template #codeHeader="{ language, token }">
|
|
262
|
+
<MyCodeActions
|
|
263
|
+
:language="language"
|
|
264
|
+
:token="token"
|
|
265
|
+
/>
|
|
266
|
+
</template>
|
|
267
|
+
</MessageRender>
|
|
268
|
+
</template>
|
|
269
|
+
</ChatContainer>
|
|
270
|
+
</template>
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## API
|
|
274
|
+
|
|
275
|
+
### Props
|
|
276
|
+
|
|
277
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
278
|
+
| ------------------ | -------------------------------------------------------------------------- | ------ | ------------------------------------------------- |
|
|
279
|
+
| message | `Partial<Message>` | — | **必填**,消息对象,`role` 字段决定渲染哪个子组件 |
|
|
280
|
+
| messageTools | `IToolBtn[]` | — | 自定义用户消息工具组;**仅转发给 `UserMessage`** |
|
|
281
|
+
| messageToolsStatus | `MessageToolsStatus` | — | 工具按钮状态;**仅转发给 `UserMessage`** |
|
|
282
|
+
| onAction | `(tool: IToolBtn) => Promise<string[] \| void>` | — | 工具操作回调;**仅转发给 `UserMessage`** |
|
|
283
|
+
| onInputConfirm | `(content: UserMessage['content'], docSchema: TagSchema) => Promise<void>` | — | 用户编辑确认回调;**仅转发给 `UserMessage`** |
|
|
284
|
+
| onInterruptResume | `(payload: InterruptResume, interrupt?: Interrupt) => Promise<void>` | — | 中断 / FlowAgent 节点操作回调;转发给 `InterruptMessageRender` 与 `ActivityMessage`(后者仅 `flow_agent` 子组件消费) |
|
|
285
|
+
| onShortcutConfirm | `(formModel: Record<string, unknown>) => Promise<void>` | — | 用户快捷指令提交回调;**仅转发给 `UserMessage`** |
|
|
286
|
+
| tippyOptions | `Partial<Omit<TippyOptions, 'getReferenceClientRect' \| 'triggerTarget'>>` | — | 自定义 Tippy 配置;**仅转发给 `UserMessage`** |
|
|
287
|
+
|
|
288
|
+
### Slots
|
|
289
|
+
|
|
290
|
+
| 插槽名 | 参数 | 说明 |
|
|
291
|
+
| ---------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
292
|
+
| answeredQuestion | `{ item, index, status }` | 自定义 UserQuestion 已回答回显,透传给 InterruptMessageRender → UserQuestionAnsweredCard 的 `#answer` |
|
|
293
|
+
| codeHeader | `{ language: string; token: Token[] }` | 代码块头部自定义操作区域,透传给 ContentRender → MarkdownContent → CodeContent;**仅对 assistant 生效** |
|
|
294
|
+
| default | `{ content: string }` | 替换 AssistantMessage 内容区;**仅对 assistant 生效**;运行时仅保证 `content`(`status` 请读外层 message) |
|
|
295
|
+
|
|
296
|
+
## 消息类型映射
|
|
297
|
+
|
|
298
|
+
| `MessageRole` | 渲染组件 | prop 路由 | 说明 |
|
|
299
|
+
| ------------- | ------------------ | ------------------------------------------------------------------------------------------------------- | --------------------- |
|
|
300
|
+
| `user` | `UserMessage` | `message` + `onAction` + `onInputConfirm` + `onShortcutConfirm` + `messageTools` + `messageToolsStatus` + `tippyOptions` | 用户发送的消息 |
|
|
301
|
+
| `assistant` | `AssistantMessage` | `message` + `default slot` | AI 助手回复消息 |
|
|
302
|
+
| `info` | `InfoMessage` | `message` | 系统信息 / 会话分隔符 |
|
|
303
|
+
| `reasoning` | `ReasoningMessage` | `message` | AI 思考过程(可折叠) |
|
|
304
|
+
| `tool` | `ToolMessage` | `message` | 工具调用返回结果 |
|
|
305
|
+
| `activity` | `ActivityMessage` | `message` + `onInterruptResume` | 知识检索 / 引用文档 / FlowAgent 执行(节点重试 / 跳过) |
|
|
306
|
+
| `loading` | `LoadingMessage` | `message`(字段被忽略,组件无 Props) | 等待响应的加载占位 |
|
|
307
|
+
| `interrupt` | `InterruptMessageRender` | `message` + `onInterruptResume` | human-in-the-loop 中断 |
|
|
308
|
+
| 其他 / 未知 | — | — | 返回 `null`,不渲染 |
|
|
309
|
+
|
|
310
|
+
## 类型定义
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
import { MessageRole, MessageStatus, MessageToolsStatus, type Message, type IToolBtn } from '@blueking/chat-x';
|
|
314
|
+
|
|
315
|
+
// MessageRole / MessageStatus 完整枚举见 ../../types/constants
|
|
316
|
+
// MessageToolsStatus:Disabled | Hidden(仅转发给 UserMessage)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
> `MessageRole` / `MessageStatus` 完整取值见 [常量枚举](../../types/constants)。
|
|
320
|
+
|
|
321
|
+
## 关联组件
|
|
322
|
+
|
|
323
|
+
- [MessageContainer](/components/setup/message-container) — 内部按组调用以渲染每条消息
|
|
324
|
+
- [AssistantMessage](/components/message/assistant-message) — assistant 角色派发目标
|
|
325
|
+
- [UserMessage](/components/message/user-message) — user 角色派发目标
|
|
326
|
+
- [InterruptMessage 中断消息](/components/agent/interrupt-message) — interrupt 角色派发目标
|
|
327
|
+
- [ToolApprovalCard 审批卡片](/components/agent/tool-approval-card) — AI Dev 审批中断子卡片
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# MessageTime 消息时间
|
|
2
|
+
|
|
3
|
+
> 能力域:工具与反馈 | 导入:`import { MessageTime } from '@blueking/chat-x'` | since 2.1.0
|
|
4
|
+
|
|
5
|
+
按 createdAt 展示消息时间,四档格式:今天 `12:00`、昨天 `昨天 12:00`、今年内更早 `3-12 12:00`、非今年 `2025-3-12 12:00`; 时区取 props.timezone,未传时回退 injectGlobalConfig().timezone(由 ChatContainer 的 timezone prop 注入),都没有则用浏览器时区; 无值或非法时间不渲染任何 DOM。通常通过 MessageTools 的 prepend / append 插槽使用。 源码位置:src/components/message-tools/message-time/message-time.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:message-tools(通过 prepend / append 插槽嵌入工具栏)、user-message(用户消息在工具栏左侧展示时间)、message-container(AI 消息组在工具栏右侧展示本轮回答时间)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# MessageTime 消息时间
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/message-tools/message-time/message-time.vue`
|
|
16
|
+
- **格式化工具**:`src/components/message-tools/message-time/format-message-time.ts`
|
|
17
|
+
- **能力域**:工具与反馈
|
|
18
|
+
- **能力说明**:按「今天 / 昨天 / 今年内 / 跨年」四档格式展示消息创建时间。
|
|
19
|
+
|
|
20
|
+
> **能力域**:工具与反馈
|
|
21
|
+
|
|
22
|
+
展示单条消息(或一组 AI 回答)的创建时间。组件本身只负责格式化与渲染一段文本,**位置由使用方决定**——项目内通过 `MessageTools` 的 `prepend` / `append` 插槽嵌入工具栏。
|
|
23
|
+
|
|
24
|
+
## 格式规则
|
|
25
|
+
|
|
26
|
+
时间按与「今天」的日历日差值分四档,同一档内时分固定 `HH:mm`(24 小时制,补零),月日**不补零**:
|
|
27
|
+
|
|
28
|
+
| 档位 | 判定条件 | 输出示例 |
|
|
29
|
+
| ------------ | ---------------------- | --------------- |
|
|
30
|
+
| 今天 | 与今天同一日历日 | `12:00` |
|
|
31
|
+
| 昨天 | 与今天相差 1 个日历日 | `昨天 12:00` |
|
|
32
|
+
| 今年内更早 | 相差 ≥ 2 天且年份相同 | `3-12 12:00` |
|
|
33
|
+
| 非今年 | 年份不同 | `2025-3-12 12:00` |
|
|
34
|
+
|
|
35
|
+
- 分档与展示取**同一时区**的日历日:既避免「昨天 23:59」与「今天 00:01」因毫秒差不足一天被判成同一天,也避免按浏览器时区分档、按配置时区显示时分导致的错位
|
|
36
|
+
- `昨天` 走 `t('昨天')` 国际化,英文环境输出 `Yesterday 12:00`
|
|
37
|
+
|
|
38
|
+
## 基础用法
|
|
39
|
+
|
|
40
|
+
`createdAt` 接受 ISO 字符串或毫秒时间戳:
|
|
41
|
+
|
|
42
|
+
```vue
|
|
43
|
+
<template>
|
|
44
|
+
<MessageTime :created-at="message.createdAt" />
|
|
45
|
+
</template>
|
|
46
|
+
|
|
47
|
+
<script setup lang="ts">
|
|
48
|
+
import { MessageTime } from '@blueking/chat-x';
|
|
49
|
+
|
|
50
|
+
const message = {
|
|
51
|
+
id: '1',
|
|
52
|
+
messageId: '1',
|
|
53
|
+
role: 'user',
|
|
54
|
+
content: '你好',
|
|
55
|
+
status: 'completed',
|
|
56
|
+
createdAt: '2026-08-17T04:00:00.000Z',
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
> **无值不渲染**:`createdAt` 为空、为空字符串或无法解析成合法时间时,组件不渲染任何 DOM(`v-if`),使用方无需额外判空。
|
|
62
|
+
|
|
63
|
+
## 时区配置
|
|
64
|
+
|
|
65
|
+
时区按以下优先级取值,均未配置时使用**浏览器时区**:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
props.timezone
|
|
69
|
+
└─ 未传 → injectGlobalConfig()?.timezone(由 ChatContainer 的 timezone prop 注入)
|
|
70
|
+
└─ 未配置 → 浏览器时区
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```vue
|
|
74
|
+
<template>
|
|
75
|
+
<!-- 整个会话统一按北京时间展示 -->
|
|
76
|
+
<ChatContainer
|
|
77
|
+
:messages="messages"
|
|
78
|
+
timezone="Asia/Shanghai"
|
|
79
|
+
/>
|
|
80
|
+
</template>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```vue
|
|
84
|
+
<template>
|
|
85
|
+
<!-- 单个实例覆盖全局配置 -->
|
|
86
|
+
<MessageTime
|
|
87
|
+
:created-at="message.createdAt"
|
|
88
|
+
timezone="UTC"
|
|
89
|
+
/>
|
|
90
|
+
</template>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- 取值为 [IANA 时区名](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)(如 `Asia/Shanghai`、`UTC`、`America/New_York`)
|
|
94
|
+
- 传入非法时区名时回退到浏览器时区,不会导致渲染失败
|
|
95
|
+
- 同一时区的 `Intl.DateTimeFormat` 实例内部有缓存,长会话中不会为每条消息重复构造
|
|
96
|
+
|
|
97
|
+
## 在消息工具栏中的使用
|
|
98
|
+
|
|
99
|
+
`MessageTools` 提供 `prepend`(工具图标左侧)与 `append`(工具图标右侧)两个插槽,项目内的时间位置即由此决定:
|
|
100
|
+
|
|
101
|
+
| 场景 | 插槽 | 时间取值 |
|
|
102
|
+
| ------------ | --------- | -------------------------------------------- |
|
|
103
|
+
| 用户消息 | `prepend` | 该条消息的 `createdAt` |
|
|
104
|
+
| AI 消息组 | `append` | 组内**最后一条**带 `createdAt` 的消息,即本轮回答完成时间 |
|
|
105
|
+
|
|
106
|
+
```vue
|
|
107
|
+
<template>
|
|
108
|
+
<MessageTools :on-action="handleAction">
|
|
109
|
+
<template #append>
|
|
110
|
+
<MessageTime :created-at="createdAt" />
|
|
111
|
+
</template>
|
|
112
|
+
</MessageTools>
|
|
113
|
+
</template>
|
|
114
|
+
|
|
115
|
+
<script setup lang="ts">
|
|
116
|
+
import { MessageTime, MessageTools } from '@blueking/chat-x';
|
|
117
|
+
</script>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
> 组内 `reasoning` / `activity` 等子消息不单独展示时间,一个 AI 回答组只显示一次。
|
|
121
|
+
|
|
122
|
+
## API
|
|
123
|
+
|
|
124
|
+
### Props
|
|
125
|
+
|
|
126
|
+
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|
|
127
|
+
| --------- | ------------------ | ---- | ------ | -------------------------------------------------------------------- |
|
|
128
|
+
| createdAt | `number \| string` | 否 | — | 消息创建时间,ISO 字符串或毫秒时间戳;无值或非法时不渲染 |
|
|
129
|
+
| timezone | `string` | 否 | — | IANA 时区名;优先于全局配置,两者都未配置时按浏览器时区展示 |
|
|
130
|
+
|
|
131
|
+
### Events / Slots / Expose
|
|
132
|
+
|
|
133
|
+
无。
|
|
134
|
+
|
|
135
|
+
### 全局配置依赖
|
|
136
|
+
|
|
137
|
+
通过 `injectGlobalConfig()` 读取 `timezone`。祖先需已调用 `useGlobalConfig()`(通常由 `ChatContainer` 的 `timezone` prop 注册);无 Provider 时按浏览器时区展示。
|
|
138
|
+
|
|
139
|
+
## 类型定义
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
export type MessageTimeProps = {
|
|
143
|
+
createdAt?: number | string;
|
|
144
|
+
timezone?: string;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// 独立可用的格式化函数(组件内部使用,未从包入口导出)
|
|
148
|
+
declare const formatMessageTime: (createdAt?: number | string, timezone?: string) => string;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 样式说明
|
|
152
|
+
|
|
153
|
+
```scss
|
|
154
|
+
.ai-message-time {
|
|
155
|
+
flex: none;
|
|
156
|
+
font-size: var(--ai-font-size, 12px);
|
|
157
|
+
line-height: 16px;
|
|
158
|
+
color: $color-text-secondary;
|
|
159
|
+
white-space: nowrap;
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
- 字号跟随 `--ai-font-size`(`ChatContainer` 的 `size` 档位),颜色使用次要文本语义色
|
|
164
|
+
- `flex: none` + `nowrap` 保证在工具栏 flex 布局中不被压缩换行
|
|
165
|
+
|
|
166
|
+
## 注意事项
|
|
167
|
+
|
|
168
|
+
1. **时间来源**:`createdAt` 由消息层(`chat-helper`)写入 `BaseMessage`,组件不参与取数
|
|
169
|
+
2. **不做相对时间**:不提供「几分钟前」这类相对描述,四档格式固定
|
|
170
|
+
3. **空值语义**:不渲染而非渲染占位,工具栏侧的 `prepend` / `append` 包裹容器会因 `:empty` 收起,不留多余间距
|
|
171
|
+
|
|
172
|
+
## 关联组件
|
|
173
|
+
|
|
174
|
+
- [MessageTools](/components/feedback/message-tools) — 通过 `prepend` / `append` 插槽嵌入
|
|
175
|
+
- [UserMessage](/components/message/user-message) — 用户消息时间位置
|
|
176
|
+
- [MessageContainer](/components/setup/message-container) — AI 消息组时间位置
|
|
177
|
+
- [useGlobalConfig](/composables/use-global-config) — `timezone` 全局配置
|