@blueking/chat-x 0.0.50 → 0.0.51-beta.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.
Files changed (147) hide show
  1. package/dist/ag-ui/types/contents.d.ts +2 -0
  2. package/dist/ag-ui/types/messages.d.ts +5 -0
  3. package/dist/common/constants.d.ts +1 -1
  4. package/dist/components/ai-buttons/file-upload-btn/file-upload-btn.vue.d.ts +0 -2
  5. package/dist/components/chat-content/file-content/file-content.vue.d.ts +5 -2
  6. package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +12 -0
  7. package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +21 -0
  8. package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +1 -1
  9. package/dist/components/chat-input/build-default-placeholder.d.ts +7 -0
  10. package/dist/components/chat-input/chat-input.vue.d.ts +1 -1
  11. package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -0
  12. package/dist/components/chat-message/message-render/message-render.vue.d.ts +2 -0
  13. package/dist/components/chat-message/user-message/user-message.vue.d.ts +3 -1
  14. package/dist/components/index.d.ts +2 -1
  15. package/dist/components/message-tools/message-time/format-message-time.d.ts +8 -0
  16. package/dist/components/message-tools/message-time/message-time.vue.d.ts +8 -0
  17. package/dist/components/message-tools/message-tools.vue.d.ts +11 -1
  18. package/dist/composables/use-custom-tab.d.ts +5 -3
  19. package/dist/composables/use-global-config.d.ts +3 -0
  20. package/dist/composables/use-message-group.d.ts +150 -72
  21. package/dist/icons/execution.d.ts +6 -0
  22. package/dist/icons/tools.d.ts +3 -0
  23. package/dist/index.css +1 -1
  24. package/dist/index.js +3124 -2837
  25. package/dist/index.js.map +1 -1
  26. package/dist/lang/lang.d.ts +8 -7
  27. package/dist/mcp/generated/docs/ai-slash-input.md +2 -0
  28. package/dist/mcp/generated/docs/assistant-message.md +9 -7
  29. package/dist/mcp/generated/docs/chat-container.md +38 -32
  30. package/dist/mcp/generated/docs/chat-input.md +18 -12
  31. package/dist/mcp/generated/docs/cite-content.md +3 -3
  32. package/dist/mcp/generated/docs/desc-panel.md +32 -10
  33. package/dist/mcp/generated/docs/execution-summary.md +3 -3
  34. package/dist/mcp/generated/docs/file-artifact-panel.md +6 -4
  35. package/dist/mcp/generated/docs/file-content.md +89 -73
  36. package/dist/mcp/generated/docs/file-upload-btn.md +16 -18
  37. package/dist/mcp/generated/docs/message-container.md +3 -0
  38. package/dist/mcp/generated/docs/message-render.md +2 -1
  39. package/dist/mcp/generated/docs/message-time.md +180 -0
  40. package/dist/mcp/generated/docs/message-tools.md +47 -12
  41. package/dist/mcp/generated/docs/messages.md +9 -0
  42. package/dist/mcp/generated/docs/toolcall-render.md +82 -43
  43. package/dist/mcp/generated/docs/use-artifact-preview.md +19 -17
  44. package/dist/mcp/generated/docs/use-custom-tab.md +12 -8
  45. package/dist/mcp/generated/docs/use-global-config.md +15 -5
  46. package/dist/mcp/generated/docs/user-message.md +9 -0
  47. package/dist/mcp/generated/docs/user-question-card.md +2 -0
  48. package/dist/mcp/generated/index.json +46 -6
  49. package/dist/types/input.d.ts +6 -0
  50. package/dist/utils/file.d.ts +7 -1
  51. package/dist/utils/index.d.ts +2 -0
  52. package/dist/utils/merge-tools-by-id.d.ts +6 -0
  53. package/dist/utils/upload-file.d.ts +35 -0
  54. package/package.json +3 -2
  55. package/skills/blueking-chat-x/SKILL.md +139 -0
  56. package/skills/blueking-chat-x/references/_index.md +131 -0
  57. package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
  58. package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
  59. package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
  60. package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
  61. package/skills/blueking-chat-x/references/components/ai-prompt-list.md +44 -0
  62. package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
  63. package/skills/blueking-chat-x/references/components/ai-skill-list.md +73 -0
  64. package/skills/blueking-chat-x/references/components/ai-slash-editor.md +43 -0
  65. package/skills/blueking-chat-x/references/components/ai-slash-input.md +56 -0
  66. package/skills/blueking-chat-x/references/components/ai-slash-menu.md +42 -0
  67. package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
  68. package/skills/blueking-chat-x/references/components/assistant-message.md +498 -0
  69. package/skills/blueking-chat-x/references/components/chat-container.md +869 -0
  70. package/skills/blueking-chat-x/references/components/chat-input.md +769 -0
  71. package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
  72. package/skills/blueking-chat-x/references/components/code-content.md +211 -0
  73. package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
  74. package/skills/blueking-chat-x/references/components/content-render.md +233 -0
  75. package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
  76. package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
  77. package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
  78. package/skills/blueking-chat-x/references/components/execution-summary.md +128 -0
  79. package/skills/blueking-chat-x/references/components/file-artifact-panel.md +289 -0
  80. package/skills/blueking-chat-x/references/components/file-content.md +319 -0
  81. package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
  82. package/skills/blueking-chat-x/references/components/file-upload-btn.md +159 -0
  83. package/skills/blueking-chat-x/references/components/flow-agent-content.md +264 -0
  84. package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
  85. package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
  86. package/skills/blueking-chat-x/references/components/image-content.md +182 -0
  87. package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
  88. package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
  89. package/skills/blueking-chat-x/references/components/info-message.md +144 -0
  90. package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
  91. package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
  92. package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
  93. package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
  94. package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
  95. package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
  96. package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
  97. package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
  98. package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
  99. package/skills/blueking-chat-x/references/components/message-container.md +645 -0
  100. package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
  101. package/skills/blueking-chat-x/references/components/message-render.md +327 -0
  102. package/skills/blueking-chat-x/references/components/message-time.md +177 -0
  103. package/skills/blueking-chat-x/references/components/message-tools.md +416 -0
  104. package/skills/blueking-chat-x/references/components/model-selector.md +155 -0
  105. package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
  106. package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
  107. package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
  108. package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
  109. package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
  110. package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
  111. package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
  112. package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
  113. package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
  114. package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
  115. package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
  116. package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
  117. package/skills/blueking-chat-x/references/components/text-content.md +77 -0
  118. package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
  119. package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
  120. package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
  121. package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
  122. package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
  123. package/skills/blueking-chat-x/references/components/user-message.md +424 -0
  124. package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
  125. package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
  126. package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
  127. package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
  128. package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
  129. package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
  130. package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +231 -0
  131. package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
  132. package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
  133. package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
  134. package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
  135. package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +157 -0
  136. package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
  137. package/skills/blueking-chat-x/references/composables/use-global-config.md +148 -0
  138. package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +163 -0
  139. package/skills/blueking-chat-x/references/composables/use-message-group.md +247 -0
  140. package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
  141. package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
  142. package/skills/blueking-chat-x/references/theme/theme.md +431 -0
  143. package/skills/blueking-chat-x/references/types/constants.md +307 -0
  144. package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
  145. package/skills/blueking-chat-x/references/types/messages.md +553 -0
  146. package/skills/blueking-chat-x/references/types/schema.md +91 -0
  147. package/skills/blueking-chat-x/scripts/generate-references.mjs +314 -0
@@ -0,0 +1,212 @@
1
+ # InterruptMessage 中断消息
2
+
3
+ > 能力域:Agent 能力 | 导入:`import { InterruptMessage } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 渲染 human-in-the-loop 中断消息,分发工具审批,并按 reason 回显 resume 结果(审批单 / 用户回答)。 源码位置:src/components/chat-message/interrupt-message/interrupt-message.vue。
6
+
7
+ **关联**:message-render(role 为 interrupt 时渲染本组件)、user-question-card(UserQuestion 待回答面板与回答回显)、tool-approval-card(AIDevToolApproval 专用子卡片)、message-container(透传 onInterruptResume;末条为 interrupt 时不触发组 hover)
8
+
9
+ ---
10
+
11
+ # InterruptMessage 中断消息
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/chat-message/interrupt-message/interrupt-message.vue`
15
+ - **能力域**:Agent 能力
16
+ - **能力说明**:渲染 human-in-the-loop 中断消息,分发工具审批,并按 `result.reason` 回显 resume 结果。
17
+
18
+ > **能力域**:Agent 能力
19
+
20
+ human-in-the-loop 中断消息渲染器(导出名 **`InterruptMessageRender`**)。对应 `MessageRole.Interrupt`,解析 `content.outcome` 渲染审批卡片或兜底提示。
21
+
22
+ > 通常由 [MessageRender](/components/message/message-render) 自动调用,无需业务侧直接引入。
23
+ > `UserQuestion` 的待回答卡片由 [ChatContainer](/components/setup/chat-container) 放在输入区上方,本组件在 `outcome.success` 时按 `result.reason` 回显审批单或用户回答。
24
+
25
+ ## 渲染架构
26
+
27
+ ```
28
+ InterruptMessageRender
29
+ ├── content.message(可选)→ 顶部说明文案
30
+ └── content.outcome.type === 'interrupt'
31
+ └── v-for interrupts
32
+ ├── reason === aidev:tool_approval → ToolApprovalCard(透传 onInterruptResume,用于取消审批)
33
+ ├── reason === aidev:user_question → 不在消息内渲染,交由 ChatContainer 输入区挂载
34
+ └── 未注册 reason → 兜底块(item.message 或「暂不支持的中断消息」)
35
+
36
+ content.outcome.type === 'success'
37
+ └── resultRenderers[result.reason]
38
+ ├── aidev:tool_approval → ToolApprovalCard(可交互回显,透传 onInterruptResume)
39
+ └── aidev:user_question → UserQuestionAnsweredCard(支持 #answeredQuestion 透传 #answer)
40
+ ```
41
+
42
+ | `InterruptReason` | 子组件 |
43
+ | ------------------------------ | ------------------- |
44
+ | `aidev:tool_approval`(待审批) | `ToolApprovalCard` |
45
+ | `aidev:tool_approval`(已处理) | `ToolApprovalCard`(可交互回显,仍可取消 / 刷新) |
46
+ | `aidev:user_question`(待回答) | 输入区 `UserQuestionCard`,本组件不渲染 |
47
+ | `aidev:user_question`(已回答) | `UserQuestionAnsweredCard` |
48
+ | 其他 / 未注册 | 兜底文案区域 |
49
+
50
+ ## 基础用法(待审批)
51
+
52
+ ```vue
53
+ <template>
54
+ <InterruptMessageRender
55
+ :id="message.id"
56
+ :message-id="message.messageId"
57
+ :role="message.role"
58
+ :status="message.status"
59
+ :content="message.content"
60
+ :on-interrupt-resume="handleInterruptResume"
61
+ />
62
+ </template>
63
+
64
+ <script setup lang="ts">
65
+ import {
66
+ InterruptMessageRender,
67
+ APPROVAL_STATUS,
68
+ InterruptReason,
69
+ MessageRole,
70
+ MessageStatus,
71
+ type InterruptMessage,
72
+ } from '@blueking/chat-x';
73
+
74
+ const message: InterruptMessage = {
75
+ id: 'msg_interrupt',
76
+ messageId: 'msg_interrupt',
77
+ role: MessageRole.Interrupt,
78
+ status: MessageStatus.Pending,
79
+ content: {
80
+ message: '算法方案评审单需要您关注',
81
+ outcome: {
82
+ type: 'interrupt',
83
+ interrupts: [
84
+ {
85
+ id: 'interrupt_1',
86
+ reason: InterruptReason.AIDevToolApproval,
87
+ toolCallId: 'tool_call_1',
88
+ metadata: {
89
+ ticket: {
90
+ approvers: ['张三'],
91
+ sn: 'REV-2026-04-24-001',
92
+ status: APPROVAL_STATUS.PENDING,
93
+ submit_time: '2026-04-24 14:30:15',
94
+ title: '算法方案评审单',
95
+ url: 'https://example.com/tickets/001',
96
+ },
97
+ },
98
+ },
99
+ ],
100
+ },
101
+ },
102
+ };
103
+
104
+ const handleInterruptResume = async (payload, interrupt) => {
105
+ // ToolApprovalCard 点击「取消审批」时,payload 为 ToolApprovalResume
106
+ console.log(payload, interrupt?.id);
107
+ };
108
+ </script>
109
+ ```
110
+
111
+ **渲染效果**
112
+
113
+ ## UserQuestion 待回答
114
+
115
+ 待回答的 `UserQuestion` 不在消息内渲染;`ChatContainer` 会找到最近一条待回答中断,并在 `ChatInput` 上方挂载 [UserQuestionCard](/components/agent/user-question-card)。
116
+
117
+ ```vue
118
+ <InterruptMessageRender
119
+ :content="userQuestionMessage.content"
120
+ role="interrupt"
121
+ />
122
+ ```
123
+
124
+ **渲染效果**
125
+
126
+ ## AIDevToolApproval 已处理回显(outcome.success)
127
+
128
+ `outcome.type === 'success'` 且 `result.reason === InterruptReason.AIDevToolApproval` 时,会话内以可交互 `ToolApprovalCard` 回显审批单(`readonly: false`):待审批态仍可取消 / 刷新,终态展示置灰的取消按钮。`resultRenderers` 须与 interrupt 态一样透传 `onInterruptResume`,否则取消 / 刷新无回调。`result.payload.metadata` 需透传中断时的 `metadata`(含 `ticket`):
129
+
130
+ ```vue
131
+ <InterruptMessageRender
132
+ :content="resumedMessage.content"
133
+ role="interrupt"
134
+ />
135
+ ```
136
+
137
+ **渲染效果**
138
+
139
+ ## UserQuestion 已回答回显(outcome.success)
140
+
141
+ `outcome.type === 'success'` 且 `result.reason === InterruptReason.UserQuestion` 时,会话内回显用户回答。可通过 `#answeredQuestion` slot 自定义单题回显:
142
+
143
+ ```vue
144
+ <InterruptMessageRender
145
+ :content="userQuestionAnsweredMessage.content"
146
+ role="interrupt"
147
+ >
148
+ <template #answeredQuestion="{ item, index, status }">
149
+ <MyCustomAnswerView :data="item" :index="index" :status="status" />
150
+ </template>
151
+ </InterruptMessageRender>
152
+ ```
153
+
154
+ **渲染效果**
155
+
156
+ ## 不支持的中断类型(兜底)
157
+
158
+ ```vue
159
+ <InterruptMessageRender :content="unsupportedContent" role="interrupt" />
160
+ ```
161
+
162
+ **渲染效果**
163
+
164
+ ## 在 MessageContainer 中使用
165
+
166
+ 配置 `onInterruptResume`,由容器经 `MessageRender` 透传到本组件:
167
+
168
+ ```vue
169
+ <MessageContainer
170
+ :messages="messages"
171
+ :on-interrupt-resume="handleInterruptResume"
172
+ />
173
+ ```
174
+
175
+ 当消息组**最后一条**为 `role: 'interrupt'` 时,容器**不会**在鼠标移入时设置 `isHover`,避免误显 AI 工具栏遮挡审批卡片。
176
+
177
+ ## API
178
+
179
+ ### Props
180
+
181
+ 继承 `Partial<InterruptMessage>` 的字段(`id`、`messageId`、`role`、`content`、`status` 等),并额外支持:
182
+
183
+ | 属性名 | 类型 | 默认值 | 说明 |
184
+ | ----------------- | ------------------ | ------ | ----------------------------------------- |
185
+ | content | `InterruptMessage['content']` | — | 含 `message`、`outcome`、`result` 等 |
186
+ | onInterruptResume | `OnInterruptResume` | — | 用户完成中断操作后的回调(可选) |
187
+
188
+ ### Slots
189
+
190
+ | 插槽名 | 参数 | 说明 |
191
+ | ---------------- | ------------------------------------------------- | -------------------------------------------------------------------- |
192
+ | answeredQuestion | `{ item, index, status }` | 自定义 UserQuestion 已回答内容回显,透传给 `UserQuestionAnsweredCard` 的 `#answer` |
193
+
194
+ slot 参数与 [UserQuestionAnsweredCard](/components/agent/user-question-answered-card) 的 `#answer` 一致。
195
+
196
+ ### Events / Expose
197
+
198
+ 无。
199
+
200
+ ## 类型定义
201
+
202
+ ```typescript
203
+ import type { Interrupt, InterruptMessage, OnInterruptResume } from '@blueking/chat-x';
204
+ ```
205
+
206
+ 详见 [中断类型 Interrupt](../../types/interrupt.md)。
207
+
208
+ ## 关联组件
209
+
210
+ - [ToolApprovalCard](/components/agent/tool-approval-card) — AI Dev 审批单卡片
211
+ - [MessageRender](/components/message/message-render) — 按 `role` 派发
212
+ - [MessageContainer](/components/setup/message-container) — 列表容器与 `onInterruptResume` 透传
@@ -0,0 +1,128 @@
1
+ # KeyValueContent 键值内容
2
+
3
+ > 能力域:内容渲染 | 导入:`import { KeyValueContent } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 以键值列表展示结构化内容。 源码位置:src/components/chat-content/key-value-content/key-value-content.vue。
6
+
7
+ **关联**:user-message(用户消息内展示结构化附加信息)
8
+
9
+ ---
10
+
11
+ # KeyValueContent 键值对内容
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/chat-content/key-value-content/key-value-content.vue`
15
+ - **能力域**:内容渲染
16
+ - **能力说明**:以键值列表展示结构化内容。
17
+
18
+ > **能力域**:内容渲染
19
+
20
+ 键值对列表展示基础组件,每行以 `key : value` 格式渲染一条数据,支持可选标题栏(带 `ThinkingIcon`)。
21
+
22
+ 主要被 `UserMessage` 内部用于渲染结构化引用内容(`property.extra.cite.data`),通常不需要手动引入。
23
+
24
+ ## 组件结构
25
+
26
+ ```
27
+ div.ai-key-value-content(flex column,gap: 8px,font-size: 12px,color: #4d4f56)
28
+ ├── [v-if="title"] div.ai-key-value-title(flex,gap: 4px,font-size: 12px,font-weight: 700,color: #3a84ff)
29
+ │ ├── ThinkingIcon(14×14px)
30
+ │ └── {{ title }}
31
+ └── div.ai-key-value-content(flex column,无 gap) ← 与外层同名嵌套
32
+ └── div.key-value-item × N(flex row,gap: 3px,min-height: 20px)
33
+ ├── div.item-key → {{ item.key }}(flex: 0 0 auto,font-weight: bold,color: #333)
34
+ ├── ":" → 硬编码文本节点,冒号不属于任何 div
35
+ └── div.item-value → {{ item.value }}(overflow hidden,ellipsis,`word-break: break-all` 允许多行换行)
36
+ ```
37
+
38
+ > **注意**:内层也是 `.ai-key-value-content` 类(与外层同名),仅用于布局,无额外样式差异。
39
+ > **注意**:`v-for` 使用 `item.key` 作为 `:key`,`content` 中的 `key` 字段必须唯一,否则触发 Vue 重复 key 警告。
40
+ > **注意**:`item.value` 在单行方向仍可能因 `text-overflow: ellipsis` 显示省略,但配合 `word-break: break-all` 长串会优先换行展示,**无 tooltip**(与 `DescPanel` 不同)。
41
+
42
+ ## 基础用法
43
+
44
+ ```vue
45
+ <template>
46
+ <KeyValueContent :content="data" />
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { KeyValueContent } from '@blueking/chat-x';
51
+
52
+ const data = [
53
+ { key: '名称', value: '蓝鲸智云' },
54
+ { key: '版本', value: 'v3.0' },
55
+ { key: '状态', value: '运行中' },
56
+ ];
57
+ </script>
58
+ ```
59
+
60
+ ## 带标题
61
+
62
+ 传入 `title` 时,顶部显示 `ThinkingIcon` + 标题文本(蓝色加粗):
63
+
64
+ ```vue
65
+ <template>
66
+ <KeyValueContent
67
+ title="模型参数"
68
+ :content="[
69
+ { key: '模型', value: 'GPT-4' },
70
+ { key: '温度', value: '0.7' },
71
+ { key: '最大 Token', value: '2048' },
72
+ { key: '频率惩罚', value: '0.5' },
73
+ ]"
74
+ />
75
+ </template>
76
+ ```
77
+
78
+ ## 超长 value 换行
79
+
80
+ `.item-value` 使用 `word-break: break-all`,长 URL 或长文本会在容器内换行;仍保留 `overflow: hidden` 与 `text-overflow: ellipsis` 以约束极端情况,**悬停无 tooltip**:
81
+
82
+ ## API
83
+
84
+ ### Props
85
+
86
+ | 属性名 | 类型 | 必填 | 说明 |
87
+ | ------- | ----------------------------------- | ---- | ----------------------------------------------------------------- |
88
+ | content | `{ key: string; value: string; }[]` | ✓ | 键值对数组;`key` 同时作为 `v-for` 的 `:key`,需保证唯一 |
89
+ | title | `string` | — | 标题文本;传入后在列表上方渲染 `ThinkingIcon + title`(蓝色加粗) |
90
+
91
+ ## 使用场景
92
+
93
+ `KeyValueContent` 由 `UserMessage` 内部使用,渲染结构化引用内容(`property.extra.cite` 为对象类型时):
94
+
95
+ ```typescript
96
+ // UserMessage 内部逻辑(简化)
97
+ const citeTitle = computed(() => {
98
+ const cite = props.property?.extra?.cite;
99
+ return cite && typeof cite !== 'string' ? cite.title : undefined;
100
+ });
101
+
102
+ const citeContent = computed(() => {
103
+ const cite = props.property?.extra?.cite;
104
+ return cite && typeof cite !== 'string' ? cite.data : cite;
105
+ });
106
+ // citeContent 为数组时 → <KeyValueContent :content="citeContent" :title="citeTitle" />
107
+ // citeContent 为字符串时 → <CiteContent :content="citeContent" />
108
+ ```
109
+
110
+ 如需在用户消息中展示结构化引用,将 `property.extra.cite` 设置为以下格式即可:
111
+
112
+ ```typescript
113
+ const message = {
114
+ // ...
115
+ property: {
116
+ extra: {
117
+ cite: {
118
+ title: '引用标题',
119
+ data: [{ key: '字段名', value: '字段值' }],
120
+ },
121
+ },
122
+ },
123
+ };
124
+ ```
125
+
126
+ ## 关联组件
127
+
128
+ - [UserMessage](/components/message/user-message) — 键值气泡展示
@@ -0,0 +1,122 @@
1
+ # KnowledgeRagContent 知识召回内容
2
+
3
+ > 能力域:Agent 能力 | 导入:`import { KnowledgeRagContent } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 渲染知识召回活动,包含加载态、Markdown 内容与引用来源。 源码位置:src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue。
6
+
7
+ **关联**:activity-message(activityType 为 knowledge_rag 时分发到本组件)、activity-layout(提供可折叠的活动容器外壳)、markdown-content(渲染知识召回摘要正文)、reference-content(渲染召回引用来源列表)
8
+
9
+ ---
10
+
11
+ # KnowledgeRagContent 知识召回内容
12
+
13
+ > **能力域**:Agent 能力
14
+
15
+ `KnowledgeRagContent` 用于渲染知识召回活动内容,包含活动标题、加载态、Markdown 摘要和引用来源列表。它是 `ActivityMessage` 在 `activityType === 'knowledge_rag'` 时使用的具体内容组件。
16
+
17
+ 通常不需要直接使用,`MessageRender -> ActivityMessage` 会根据消息类型自动分发到本组件。
18
+
19
+ ## 源码事实
20
+
21
+ - **源码位置**:`src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue`
22
+ - **能力说明**:渲染知识召回活动,包含加载态、Markdown 内容与引用来源。
23
+
24
+ ## 核心能力
25
+
26
+ - **活动外壳**:基于 `ActivityLayout` 渲染可折叠活动区域,默认展开
27
+ - **状态标题**:`status` 为 `pending` / `streaming` 时标题显示“检索中”并展示 Loading;其他状态显示“检索完成”
28
+ - **Markdown 摘要**:使用 `MarkdownContent` 渲染 `content.content`
29
+ - **引用来源**:使用 `ReferenceContent` 渲染 `content.referenceDocument`
30
+ - **空值兜底**:正文缺失时传入空字符串,引用缺失时传入空数组
31
+
32
+ ## 基础用法
33
+
34
+ ```vue
35
+ <template>
36
+ <KnowledgeRagContent
37
+ v-model:collapsed="collapsed"
38
+ :content="content"
39
+ status="complete"
40
+ />
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { ref } from 'vue';
45
+ import KnowledgeRagContent from '@blueking/chat-x/src/components/chat-content/knowledge-rag-content/knowledge-rag-content.vue';
46
+ import type { KnowledgeRagMessageContent } from '@blueking/chat-x';
47
+
48
+ const collapsed = ref(false);
49
+
50
+ const content: KnowledgeRagMessageContent = {
51
+ content: '根据知识库检索,**蓝鲸智云** 常见 Agent 接入流程包括...',
52
+ referenceDocument: [
53
+ { name: 'Agent 接入指南', url: 'https://example.com/agent-guide', originFile: 'https://example.com/docs/agent-guide' },
54
+ ],
55
+ };
56
+ </script>
57
+ ```
58
+
59
+ **渲染效果**
60
+
61
+ ## 检索中状态
62
+
63
+ 当消息状态为 `pending` 或 `streaming` 时,标题区域显示 Loading,标题文案为“检索中”。
64
+
65
+ ## 折叠状态
66
+
67
+ `collapsed` 通过 `v-model:collapsed` 与 `ActivityLayout` 双向绑定,适合由父级活动消息统一控制展开/收起。
68
+
69
+ ## API
70
+
71
+ ### Props
72
+
73
+ | 属性名 | 类型 | 必填 | 默认值 | 说明 |
74
+ | ---------- | ---------------------------- | ---- | ------ | ---------------------------------------- |
75
+ | content | `KnowledgeRagMessageContent` | 否 | — | 知识召回摘要与引用来源 |
76
+ | messageUid | `string` | 否 | — | 所属消息唯一标识,当前组件暂未直接使用 |
77
+ | status | `MessageStatus` | 否 | — | 消息状态,影响标题文案与 Loading 显示 |
78
+
79
+ ### Models
80
+
81
+ | 名称 | 类型 | 默认值 | 说明 |
82
+ | --------- | --------- | ------- | ---------------- |
83
+ | collapsed | `boolean` | `false` | 活动内容是否折叠 |
84
+
85
+ ### Emits
86
+
87
+ - 无显式 emits;`v-model:collapsed` 会产生 `update:collapsed`。
88
+
89
+ ### Slots
90
+
91
+ - 无。
92
+
93
+ ### Expose
94
+
95
+ - 无。
96
+
97
+ ## 类型定义
98
+
99
+ ```typescript
100
+ export type KnowledgeRagMessageContent = {
101
+ content: string;
102
+ referenceDocument: ReferenceDocumentContent[];
103
+ };
104
+
105
+ export type ReferenceDocumentContent = {
106
+ name: string;
107
+ originFile: string;
108
+ url: string;
109
+ };
110
+ ```
111
+
112
+ ## 使用建议
113
+
114
+ - 业务接入时优先通过 [ActivityMessage](../message/activity-message.md) 或完整消息链路使用,避免重复判断 `activityType`。
115
+ - `referenceDocument` 为空时组件仍会渲染正文区域,引用列表由 `ReferenceContent` 处理空数组。
116
+
117
+ ## 关联组件
118
+
119
+ - [ActivityMessage](../message/activity-message.md) — 活动消息分发入口。
120
+ - [ActivityLayout](../helper/activity-layout.md) — 折叠活动外壳。
121
+ - [MarkdownContent](../rendering/markdown-content.md) — Markdown 摘要渲染。
122
+ - [ReferenceContent](../rendering/reference-content.md) — 引用来源列表。
@@ -0,0 +1,200 @@
1
+ # LatexContent LaTeX 公式
2
+
3
+ > 能力域:内容渲染 | 导入:`import { LatexContent } from '@blueking/chat-x'` | since 1.0.0
4
+
5
+ 使用 KaTeX 渲染 LaTeX 公式内容。 源码位置:src/components/markdown-token/latex-content/latex-content.vue。
6
+
7
+ **关联**:markdown-content(插件解析 $...$ / $$...$$ 后生成数学 token 并挂载本组件)
8
+
9
+ ---
10
+
11
+ # LatexContent LaTeX 公式渲染
12
+ ## 源码事实
13
+
14
+ - **源码位置**:`src/components/markdown-token/latex-content/latex-content.vue`
15
+ - **能力域**:内容渲染
16
+ - **能力说明**:使用 KaTeX 渲染 LaTeX 公式内容。
17
+
18
+ > **能力域**:内容渲染
19
+
20
+ Markdown Token 层的 LaTeX 公式渲染基础组件,基于 **KaTeX** 实现。被 `MarkdownContent` 在解析到数学公式 token 时自动调用,通常无需手动引入。
21
+
22
+ 核心能力:**流式防抖渲染**(throttle 100ms)、**语法自动补全**(`completeLatexContent`)、**渐进式降级重试**(最多 5 次)、**错误静默**(错误文本白色不可见)。
23
+
24
+ ## 组件结构与 Token 渲染路径
25
+
26
+ ```
27
+ props.token(Token[])
28
+
29
+ ├─ token.type === 'math_block'(单块且 token.length ≤ 1)
30
+ │ wrapperTag = 'div',wrapperClass = 'ai-block-latex-content'
31
+ │ └─ <div class="ai-block-latex-wrapper">
32
+ │ └─ renderLatexToken(token) → <span class="block-katex">KaTeX HTML</span>
33
+
34
+ ├─ token.type === 'math_inline'(或混合 token 数组)
35
+ │ wrapperTag = 'span',wrapperClass = 'ai-inline-latex-content'
36
+ │ └─ renderLatexToken(token) → <span class="inline-katex">KaTeX HTML</span>
37
+
38
+ ├─ token.type === 'inline'(含 children)
39
+ │ └─ renderInlineChildren(token.children)
40
+ │ ├─ math_inline → renderLatexToken(递归)
41
+ │ ├─ text → escapeHtml
42
+ │ ├─ softbreak → '\n'
43
+ │ ├─ hardbreak → '<br>'
44
+ │ ├─ code_inline → '<code>...</code>'
45
+ │ ├─ strong_open/close → '<strong>' / '</strong>'
46
+ │ ├─ em_open/close → '<em>' / '</em>'
47
+ │ ├─ s_open/close → '<s>' / '</s>'
48
+ │ ├─ link_open/close → '<a href="...">...</a>'
49
+ │ ├─ image → '<img src="..." alt="...">'
50
+ │ └─ 未知类型 → escapeHtml(token.content)
51
+
52
+ ├─ token.type === 'paragraph_open/close' → '<p>' / '</p>'
53
+ └─ token.type === 'text' / 其他 → escapeHtml(token.content)
54
+ ```
55
+
56
+ ### displayMode 判断规则
57
+
58
+ ```typescript
59
+ // renderLatexToken 内部
60
+ const displayMode = token.type === 'math_block' || token.meta?.displayMode === true;
61
+ // math_inline 也可通过 meta.displayMode=true 强制块级渲染
62
+ ```
63
+
64
+ ## 基础用法:块级公式
65
+
66
+ ```vue
67
+ <template>
68
+ <LatexContent :token="token" />
69
+ </template>
70
+
71
+ <script setup lang="ts">
72
+ import { LatexContent } from '@blueking/chat-x';
73
+ import type { Token } from 'markdown-it';
74
+
75
+ const token: Token[] = [{ type: 'math_block', content: 'E = mc^2' } as Token];
76
+ </script>
77
+ ```
78
+
79
+ ## 行内公式
80
+
81
+ `math_inline` 类型,包装为 `span.ai-inline-latex-content`,嵌入文字流中渲染:
82
+
83
+ ```vue
84
+ <template>
85
+ <!-- 行内公式 -->
86
+ <LatexContent :token="[{ type: 'math_inline', content: 'a^2 + b^2 = c^2' }]" />
87
+ </template>
88
+ ```
89
+
90
+ ## 混合 inline token(文字 + 公式)
91
+
92
+ 传入 `inline` token 并带 `children` 时,`renderInlineChildren` 逐一处理文本、公式、标记:
93
+
94
+ ## 积分与根号
95
+
96
+ ## 矩阵
97
+
98
+ ## 对齐环境
99
+
100
+ ## 流式渲染防闪烁
101
+
102
+ 组件针对流式 Markdown 输入进行了优化:**100ms throttle**(leading + trailing)避免每字符重渲染,**`completeLatexContent`** 在每次渲染前自动补全不完整语法:
103
+
104
+ ```vue
105
+ <template>
106
+ <LatexContent :token="streamingTokens" />
107
+ </template>
108
+
109
+ <script setup lang="ts">
110
+ import { ref } from 'vue';
111
+ import { LatexContent } from '@blueking/chat-x';
112
+
113
+ const streamingTokens = ref([{ type: 'math_block', content: '' }]);
114
+
115
+ const simulate = async () => {
116
+ const formula = '\\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}';
117
+ let content = '';
118
+ for (const char of formula) {
119
+ await new Promise(r => setTimeout(r, 50));
120
+ content += char;
121
+ streamingTokens.value = [{ type: 'math_block', content }];
122
+ }
123
+ };
124
+ </script>
125
+ ```
126
+
127
+ ## 语法自动补全(completeLatexContent)
128
+
129
+ 在每次调用 KaTeX 前,组件先通过 `completeLatexContent` 修复不完整语法,处理顺序为:
130
+
131
+ | 步骤 | 处理内容 | 示例 |
132
+ | ---- | --------------------------------------------------------------------- | --------------------------------------------- |
133
+ | 0 | 不完整 `\begin{env` → 猜测环境名补全 `\begin{env}\end{env}` | `\begin{pma` → `\begin{pmatrix}\end{pmatrix}` |
134
+ | 0.1 | 不完整 `\end{env` → 猜测环境名补全 | `\end{alig` → `\end{aligned}` |
135
+ | 0.2 | 末尾不完整命令 `\begi` → 若匹配已知命令前缀则移除,完整命令则补全参数 | `\frac` → `\frac{}{}` |
136
+ | 1 | 未闭合 `{}` → 补全缺失的 `}` | `\frac{a}{b` → `\frac{a}{b}` |
137
+ | 2 | 未闭合 `[]` → 补全缺失的 `]` | `\sqrt[3` → `\sqrt[3]` |
138
+ | 3 | 双参数命令缺第二个参数 → 追加 `{}` | `\frac{a}` → `\frac{a}{}` |
139
+ | 4 | `\begin{env}` 无对应 `\end{env}` → 追加 `\end{env}` | `\begin{matrix}...` → `...\end{matrix}` |
140
+
141
+ **可猜测的环境名**(`COMMON_ENVS`):`aligned`、`align`、`equation`、`gather`、`matrix`、`pmatrix`、`bmatrix`、`vmatrix`、`cases`、`array`、`split`、`multline`
142
+
143
+ **双参数命令**(`TWO_ARG_COMMANDS`):`frac`、`dfrac`、`tfrac`、`binom`、`cfrac`、`overset`、`underset` 等
144
+
145
+ **单参数命令**(`ONE_ARG_COMMANDS`):`sqrt`、`text`、`mathbf`、`hat`、`vec`、`overline`、`boxed` 等
146
+
147
+ ## 渐进式降级重试(tryRenderKatex)
148
+
149
+ 补全后仍渲染失败时,最多重试 5 次,每次尝试两种裁剪策略:
150
+
151
+ ```
152
+ 尝试 completeLatexContent(content) → KaTeX 渲染
153
+ 失败 →
154
+ 策略 1:移除末尾不完整命令(正则 /\\[a-zA-Z]+(\{[^{}]*\})*\s*$/)
155
+ 策略 2:移除未闭合 {(正则 /\{[^{}]*$/)
156
+ 若仍失败 → 返回 null
157
+ → 渲染 <span class="katex-loading" style="color: #666; font-style: italic;">原始文本(HTML 转义)</span>
158
+ ```
159
+
160
+ > **错误静默**:KaTeX 以 `errorColor: '#fff'`(白色)渲染错误文本,错误不可见。若检测到 HTML 中含 `katex-error` 类或 `color:#cc0000`,也视为渲染失败,降级为 `katex-loading` 显示原始文本。
161
+
162
+ ## API
163
+
164
+ ### Props
165
+
166
+ | 属性名 | 类型 | 必填 | 说明 |
167
+ | ------ | --------- | ---- | ------------------------------------------------------------------------------------------------------------------------ |
168
+ | token | `Token[]` | ✓ | markdown-it Token 数组;支持 `math_block`、`math_inline`、`inline`(含 children)、`paragraph_open/close`、`text` 等类型 |
169
+
170
+ ### Token 结构
171
+
172
+ ```typescript
173
+ // math_block / math_inline
174
+ {
175
+ type: 'math_block' | 'math_inline';
176
+ content: string; // LaTeX 公式字符串
177
+ meta?: { displayMode?: boolean }; // true → 块级渲染(math_inline 可用此强制块级)
178
+ }
179
+
180
+ // inline(含行内标记 + 公式混排)
181
+ {
182
+ type: 'inline';
183
+ children: Token[]; // 子 token 列表
184
+ }
185
+ ```
186
+
187
+ ## 样式说明
188
+
189
+ | 类名 | 标签 | 作用 |
190
+ | ----------------------- | ------ | ------------------------------------------------------------------------------------------- |
191
+ | `.ai-block-latex-content` | `div` | 单一 `math_block` 时的外层,`text-align: center`,`overflow: auto hidden`,`margin: 16px 0` |
192
+ | `.ai-inline-latex-content` | `span` | 混合/行内时的外层,`display: inline`,`vertical-align: baseline` |
193
+ | `.ai-block-latex-wrapper` | `div` | 每个 `math_block` token 的包装,`text-align: center`,`margin: 16px 0` |
194
+ | `.block-katex` | `span` | 块级 KaTeX 输出 |
195
+ | `.inline-katex` | `span` | 行内 KaTeX 输出 |
196
+ | `.katex-loading` | `span` | 渲染失败降级态,斜体灰色显示原始 LaTeX 文本 |
197
+
198
+ ## 关联组件
199
+
200
+ - [MarkdownContent](/components/rendering/markdown-content) — 数学公式 token 的来源与挂载