@blueking/chat-x 0.0.51-beta.5 → 0.0.52-dev.1

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 (198) hide show
  1. package/README.md +15 -8
  2. package/dist/ag-ui/types/contents.d.ts +2 -0
  3. package/dist/ag-ui/types/messages.d.ts +6 -1
  4. package/dist/common/constants.d.ts +2 -0
  5. package/dist/components/ai-buttons/add-menu-btn/add-menu-btn.vue.d.ts +24 -0
  6. package/dist/components/chat-content/collapsible-content/collapsible-content.vue.d.ts +28 -0
  7. package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +5 -2
  8. package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +1 -0
  9. package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +1 -1
  10. package/dist/components/chat-input/ai-slash-input/ai-slash-input.vue.d.ts +21 -10
  11. package/dist/components/chat-input/ai-slash-input/command.d.ts +6 -3
  12. package/dist/components/chat-input/ai-slash-input/constants.d.ts +2 -0
  13. package/dist/components/chat-input/ai-slash-input/use-menu-trigger.d.ts +17 -0
  14. package/dist/components/chat-input/build-default-placeholder.d.ts +9 -3
  15. package/dist/components/chat-input/chat-input.vue.d.ts +30 -18
  16. package/dist/components/chat-input/input-menu/constants.d.ts +60 -0
  17. package/dist/components/chat-input/input-menu/index.d.ts +4 -0
  18. package/dist/components/chat-input/input-menu/input-menu-option.vue.d.ts +14 -0
  19. package/dist/components/chat-input/input-menu/input-menu-panel.vue.d.ts +17 -0
  20. package/dist/components/chat-input/input-menu/use-input-menu.d.ts +22 -0
  21. package/dist/components/chat-input/model-selector/types.d.ts +3 -2
  22. package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -1
  23. package/dist/components/chat-message/user-message/user-message.vue.d.ts +1 -1
  24. package/dist/components/mention/create-mention-tippy.d.ts +27 -0
  25. package/dist/components/mention/index.d.ts +4 -0
  26. 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
  27. 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
  28. 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
  29. package/dist/components/resource-icon/index.d.ts +1 -0
  30. package/dist/components/resource-icon/resource-icon.vue.d.ts +11 -0
  31. package/dist/composables/index.d.ts +1 -0
  32. package/dist/composables/use-artifact-preview.d.ts +5 -2
  33. package/dist/composables/use-common.d.ts +0 -9
  34. package/dist/composables/use-global-config.d.ts +4 -0
  35. package/dist/composables/use-input-mention.d.ts +13 -0
  36. package/dist/composables/use-message-group.d.ts +1011 -72
  37. package/dist/icons/index.d.ts +1 -0
  38. package/dist/icons/input.d.ts +21 -0
  39. package/dist/icons/menu-item.d.ts +22 -0
  40. package/dist/index.css +1 -1
  41. package/dist/index.js +4953 -4429
  42. package/dist/index.js.map +1 -1
  43. package/dist/lang/lang.d.ts +13 -3
  44. package/dist/mcp/generated/docs/activity-message.md +3 -3
  45. package/dist/mcp/generated/docs/add-menu-btn.md +91 -0
  46. package/dist/mcp/generated/docs/ai-slash-input.md +72 -26
  47. package/dist/mcp/generated/docs/assistant-message.md +7 -1
  48. package/dist/mcp/generated/docs/chat-container.md +45 -6
  49. package/dist/mcp/generated/docs/chat-input.md +327 -483
  50. package/dist/mcp/generated/docs/collapsible-content.md +78 -0
  51. package/dist/mcp/generated/docs/constants.md +36 -3
  52. package/dist/mcp/generated/docs/execution-summary.md +1 -23
  53. package/dist/mcp/generated/docs/file-artifact-panel.md +24 -5
  54. package/dist/mcp/generated/docs/file-content.md +4 -0
  55. package/dist/mcp/generated/docs/file-upload-btn.md +15 -12
  56. package/dist/mcp/generated/docs/flow-agent-content.md +10 -12
  57. package/dist/mcp/generated/docs/input-menu-panel.md +166 -0
  58. package/dist/mcp/generated/docs/mention-tag.md +83 -0
  59. package/dist/mcp/generated/docs/mention-text.md +86 -0
  60. package/dist/mcp/generated/docs/message-container.md +1 -1
  61. package/dist/mcp/generated/docs/message-render.md +1 -1
  62. package/dist/mcp/generated/docs/message-tools.md +15 -4
  63. package/dist/mcp/generated/docs/messages.md +3 -0
  64. package/dist/mcp/generated/docs/model-selector.md +4 -2
  65. package/dist/mcp/generated/docs/overflow-tips.md +3 -3
  66. package/dist/mcp/generated/docs/resource-icon.md +102 -0
  67. package/dist/mcp/generated/docs/text-content.md +7 -3
  68. package/dist/mcp/generated/docs/theme.md +27 -35
  69. package/dist/mcp/generated/docs/use-artifact-preview.md +7 -3
  70. package/dist/mcp/generated/docs/use-command-selection.md +1 -1
  71. package/dist/mcp/generated/docs/use-container-scroll.md +2 -1
  72. package/dist/mcp/generated/docs/use-flow-node-actions.md +8 -15
  73. package/dist/mcp/generated/docs/use-global-config.md +11 -4
  74. package/dist/mcp/generated/docs/use-input-mention.md +119 -0
  75. package/dist/mcp/generated/docs/use-menu-keydown.md +15 -16
  76. package/dist/mcp/generated/docs/use-message-group.md +3 -6
  77. package/dist/mcp/generated/docs/user-message.md +39 -17
  78. package/dist/mcp/generated/index.json +233 -81
  79. package/dist/types/editor.d.ts +0 -29
  80. package/dist/types/index.d.ts +1 -0
  81. package/dist/types/input-menu.d.ts +46 -0
  82. package/dist/utils/artifact-tags.d.ts +36 -0
  83. package/dist/utils/collect-message-artifacts.d.ts +14 -0
  84. package/dist/utils/file.d.ts +3 -3
  85. package/dist/utils/index.d.ts +2 -1
  86. package/dist/utils/upload-file.d.ts +6 -1
  87. package/package.json +3 -2
  88. package/skills/blueking-chat-x/SKILL.md +143 -0
  89. package/skills/blueking-chat-x/references/_index.md +153 -0
  90. package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
  91. package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
  92. package/skills/blueking-chat-x/references/components/add-menu-btn.md +88 -0
  93. package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
  94. package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
  95. package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
  96. package/skills/blueking-chat-x/references/components/ai-slash-input.md +102 -0
  97. package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
  98. package/skills/blueking-chat-x/references/components/assistant-message.md +504 -0
  99. package/skills/blueking-chat-x/references/components/chat-container.md +912 -0
  100. package/skills/blueking-chat-x/references/components/chat-input.md +614 -0
  101. package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
  102. package/skills/blueking-chat-x/references/components/code-content.md +211 -0
  103. package/skills/blueking-chat-x/references/components/collapsible-content.md +76 -0
  104. package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
  105. package/skills/blueking-chat-x/references/components/content-render.md +233 -0
  106. package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
  107. package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
  108. package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
  109. package/skills/blueking-chat-x/references/components/execution-summary.md +150 -0
  110. package/skills/blueking-chat-x/references/components/file-artifact-panel.md +307 -0
  111. package/skills/blueking-chat-x/references/components/file-content.md +340 -0
  112. package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
  113. package/skills/blueking-chat-x/references/components/file-upload-btn.md +162 -0
  114. package/skills/blueking-chat-x/references/components/flow-agent-content.md +266 -0
  115. package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
  116. package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
  117. package/skills/blueking-chat-x/references/components/image-content.md +182 -0
  118. package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
  119. package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
  120. package/skills/blueking-chat-x/references/components/info-message.md +144 -0
  121. package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
  122. package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
  123. package/skills/blueking-chat-x/references/components/input-menu-panel.md +162 -0
  124. package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
  125. package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
  126. package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
  127. package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
  128. package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
  129. package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
  130. package/skills/blueking-chat-x/references/components/mention-tag.md +79 -0
  131. package/skills/blueking-chat-x/references/components/mention-text.md +83 -0
  132. package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
  133. package/skills/blueking-chat-x/references/components/message-container.md +645 -0
  134. package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
  135. package/skills/blueking-chat-x/references/components/message-render.md +327 -0
  136. package/skills/blueking-chat-x/references/components/message-time.md +177 -0
  137. package/skills/blueking-chat-x/references/components/message-tools.md +427 -0
  138. package/skills/blueking-chat-x/references/components/model-selector.md +157 -0
  139. package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
  140. package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
  141. package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
  142. package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
  143. package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
  144. package/skills/blueking-chat-x/references/components/resource-icon.md +98 -0
  145. package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
  146. package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
  147. package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
  148. package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
  149. package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
  150. package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
  151. package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
  152. package/skills/blueking-chat-x/references/components/text-content.md +80 -0
  153. package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
  154. package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
  155. package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
  156. package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
  157. package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
  158. package/skills/blueking-chat-x/references/components/user-message.md +444 -0
  159. package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
  160. package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
  161. package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
  162. package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
  163. package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
  164. package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
  165. package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +235 -0
  166. package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
  167. package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
  168. package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
  169. package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
  170. package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +164 -0
  171. package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
  172. package/skills/blueking-chat-x/references/composables/use-global-config.md +155 -0
  173. package/skills/blueking-chat-x/references/composables/use-input-mention.md +115 -0
  174. package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +161 -0
  175. package/skills/blueking-chat-x/references/composables/use-message-group.md +244 -0
  176. package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
  177. package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
  178. package/skills/blueking-chat-x/references/directives/index.md +61 -0
  179. package/skills/blueking-chat-x/references/directives/overflow-tips.md +205 -0
  180. package/skills/blueking-chat-x/references/icons/index.md +185 -0
  181. package/skills/blueking-chat-x/references/plugins/index.md +56 -0
  182. package/skills/blueking-chat-x/references/plugins/markdown-container.md +55 -0
  183. package/skills/blueking-chat-x/references/plugins/markdown-latex.md +205 -0
  184. package/skills/blueking-chat-x/references/plugins/markdown-mermaid.md +247 -0
  185. package/skills/blueking-chat-x/references/theme/theme.md +423 -0
  186. package/skills/blueking-chat-x/references/types/constants.md +340 -0
  187. package/skills/blueking-chat-x/references/types/index.md +120 -0
  188. package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
  189. package/skills/blueking-chat-x/references/types/messages.md +556 -0
  190. package/skills/blueking-chat-x/references/types/schema.md +91 -0
  191. package/skills/blueking-chat-x/references/utils/index.md +196 -0
  192. package/skills/blueking-chat-x/scripts/generate-references.mjs +536 -0
  193. package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +0 -28
  194. package/dist/components/chat-input/ai-slash-editor/theme.d.ts +0 -24
  195. package/dist/mcp/generated/docs/ai-prompt-list.md +0 -45
  196. package/dist/mcp/generated/docs/ai-skill-list.md +0 -75
  197. package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
  198. package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
@@ -0,0 +1,78 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ CollapsibleContent 用 ResizeObserver 持续测量插槽真实高度,超过 maxHeight(默认 200px)才折叠并显示切换按钮; 折叠通过外层 max-height + overflow hidden 实现,展开态可由 v-model:expanded 受控,便于「全部展开」这类批量操作。 源码位置:src/components/chat-content/collapsible-content/collapsible-content.vue。
5
+
6
+ ### 关联组件
7
+ - **user-message** — 用户消息正文超过 200px 时折叠
8
+ - **activity-layout** — 活动消息的另一种折叠布局
9
+
10
+ ---
11
+ <!-- FULL DOC -->
12
+
13
+ # CollapsibleContent 折叠内容
14
+
15
+ > **能力域**:内容渲染
16
+
17
+ ## 源码事实
18
+
19
+ - **源码位置**:`src/components/chat-content/collapsible-content/collapsible-content.vue`
20
+ - **能力说明**:默认插槽内容高度超过 `maxHeight` 时折叠,并在下方渲染「显示更多 / 收起」;未超出时**不渲染**切换按钮。
21
+ - **切换按钮配色**:默认 `$color-text-secondary`(#979ba5),hover 转 `$color-text`(#4d4f56),箭头图标随展开态旋转。
22
+
23
+ ## 实现要点
24
+
25
+ - **高度测量与折叠分离**:折叠由外层 `max-height` + `overflow: hidden` 实现,真实高度始终从内层测量容器读取,因此折叠状态不会污染测量结果。
26
+ - **持续跟踪高度**:内容可能因为图片加载、流式追加或窗口缩放而变高,用 `ResizeObserver` 持续观测而非只测一次;`ResizeObserver` 不可用时不折叠(降级为完整展示)。
27
+ - **展开态可受控**:`v-model:expanded` 允许外部驱动,便于实现「全部展开」;不绑定时组件内部自持。
28
+
29
+ ## 用法
30
+
31
+ ::: info 内部组件
32
+ 本组件不在包入口导出,由消息组件内部使用。
33
+ :::
34
+
35
+ ```vue
36
+ <template>
37
+ <CollapsibleContent :max-height="200">
38
+ <TextContent :content="content" />
39
+ </CollapsibleContent>
40
+
41
+ <!-- 外部受控展开态 -->
42
+ <CollapsibleContent v-model:expanded="allExpanded" :max-height="120">
43
+ <MarkdownContent :content="content" />
44
+ </CollapsibleContent>
45
+ </template>
46
+ ```
47
+
48
+ **渲染效果**(阈值 120px,可用按钮切换展开态)
49
+
50
+ ## API
51
+
52
+ ### Props
53
+
54
+ | 属性名 | 类型 | 默认值 | 必填 | 说明 |
55
+ | --------- | -------- | ------ | ---- | ---------------------------------------------- |
56
+ | maxHeight | `number` | `200` | - | 折叠态下内容区最大高度(px),超出才出现按钮 |
57
+ | expanded | `boolean` | `false` | - | 展开态,支持 `v-model:expanded` |
58
+
59
+ ### Emits
60
+
61
+ | 事件名 | 参数 | 触发时机 |
62
+ | --------------- | ------------------- | ------------------ |
63
+ | update:expanded | `(value: boolean)` | 点击切换按钮 |
64
+
65
+ ### Slots
66
+
67
+ | 插槽名 | 说明 |
68
+ | ------- | ---------------- |
69
+ | default | 被折叠的内容 |
70
+
71
+ ## 使用方
72
+
73
+ [UserMessage](/components/message/user-message) 用它把用户消息正文限制在 `CONST_USER_MESSAGE_MAX_HEIGHT`(200px)以内。
74
+
75
+ ## 关联组件
76
+
77
+ - [UserMessage](/components/message/user-message) — 用户消息正文折叠
78
+ - [ActivityLayout](/components/helper/activity-layout) — 活动消息的折叠布局
@@ -227,8 +227,7 @@ const SELECTION_Z_INDEX = 10003;
227
227
  ```typescript
228
228
  const CONST_MESSAGE_TOOLS: IToolBtn[] = [
229
229
  { id: 'copy', name: '复制', description: '复制' },
230
- { id: 'cite', name: '引用', description: '引用' },
231
- { id: 'rebuild', name: '重新生成', description: '重新生成' },
230
+ { id: 'rebuild', name: '重新生成', description: '重新生成将清空下文内容' },
232
231
  { id: 'share', name: '分享', description: '分享' },
233
232
  ];
234
233
  ```
@@ -240,12 +239,21 @@ const CONST_MESSAGE_TOOLS: IToolBtn[] = [
240
239
  ```typescript
241
240
  const CONST_USER_MESSAGE_TOOLS: IToolBtn[] = [
242
241
  { id: 'copy', name: '复制', description: '复制' },
243
- { id: 'cite', name: '引用', description: '引用' },
244
242
  { id: 'edit', name: '编辑', description: '编辑' },
245
243
  { id: 'delete', name: '删除', description: '删除' },
246
244
  ];
247
245
  ```
248
246
 
247
+ > `cite`(引用)已从两份列表移除,后续不再支持。
248
+
249
+ ### CONST_USER_MESSAGE_MAX_HEIGHT
250
+
251
+ 用户消息正文的折叠阈值(px),超出后由 [CollapsibleContent](/components/rendering/collapsible-content) 折叠并展示「显示更多」:
252
+
253
+ ```typescript
254
+ const CONST_USER_MESSAGE_MAX_HEIGHT = 200;
255
+ ```
256
+
249
257
  ### CONST_UPDATE_TOOLS
250
258
 
251
259
  更新工具按钮列表(点赞/不满意):
@@ -268,6 +276,27 @@ const CONST_UPDATE_TOOLS: IToolBtn[] = [
268
276
  const DEFAULT_SHORTCUTS: Shortcut[] = [{ id: 'ask-whale', name: '问问小鲸' }];
269
277
  ```
270
278
 
279
+ ## 上传常量
280
+
281
+ 与 [ChatInput 文件上传](/components/input/chat-input#file-upload) 共用。完整扩展名列表见源码 `src/utils/upload-accept.ts`。
282
+
283
+ ```typescript
284
+ const ALLOWED_UPLOAD_EXTENSIONS = {
285
+ image: ['.gif', '.jpeg', '.jpg', '.png', '.webp'],
286
+ document: ['.doc', '.docx', '.ppt', '.pptx', '.xls', '.xlsx', '.pdf' /* ... */],
287
+ text: ['.txt', '.md', '.json' /* ... */],
288
+ code: ['.py', '.js', '.ts', '.vue' /* ... */],
289
+ };
290
+
291
+ /** 「文件」项 / 拖拽 / 粘贴的默认 accept,以及入队校验默认值 */
292
+ const DEFAULT_UPLOAD_ACCEPT = Object.values(ALLOWED_UPLOAD_EXTENSIONS).flat().join(',');
293
+ ```
294
+
295
+ | 常量 | 说明 |
296
+ | ---- | ---- |
297
+ | `ALLOWED_UPLOAD_EXTENSIONS` | 默认允许的扩展名分类(含点);分类用于 tooltip 展示 |
298
+ | `DEFAULT_UPLOAD_ACCEPT` | `ChatInput.accept` 缺省值 |
299
+
271
300
  ## 使用示例
272
301
 
273
302
  ```typescript
@@ -280,6 +309,7 @@ import {
280
309
  CHAT_Z_INDEX,
281
310
  CONST_MESSAGE_TOOLS,
282
311
  DEFAULT_SHORTCUTS,
312
+ DEFAULT_UPLOAD_ACCEPT,
283
313
  } from '@blueking/chat-x';
284
314
 
285
315
  // 创建消息
@@ -301,6 +331,9 @@ console.log(
301
331
  '可用工具:',
302
332
  CONST_MESSAGE_TOOLS.map(t => t.name),
303
333
  );
334
+
335
+ // 上传:「文件」项 / 拖拽 / 粘贴用 DEFAULT_UPLOAD_ACCEPT(已含图片扩展名)
336
+ const filePickerAccept = DEFAULT_UPLOAD_ACCEPT;
304
337
  ```
305
338
 
306
339
  ## 关联组件
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- 按消息流提取执行摘要,支持关键词定位和消息渲染。 通过 useExecutionPanelProvider 提供 EXECUTION_PANEL_TOKEN,面板内消息按只读呈现, FlowAgent 失败节点在面板内不展示重试/跳过,只保留详情。 源码位置:src/components/execution-summary/execution-summary.vue。
4
+ 按消息流提取执行摘要,支持关键词定位和消息渲染。 源码位置:src/components/execution-summary/execution-summary.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **message-render** — 摘要列表内渲染消息内容
@@ -30,7 +30,6 @@
30
30
  - **关键词搜索**:实时过滤匹配的执行记录
31
31
  - **对话定位**:hover 显示「在对话中定位」按钮,点击滚动到对应消息
32
32
  - **空状态处理**:无数据或搜索无结果时显示空状态提示
33
- - **面板上下文(只读呈现)**:组件 setup 时通过 `useExecutionPanelProvider()` 提供 `EXECUTION_PANEL_TOKEN`,供内部消息组件识别「当前处于侧栏面板内」并隐藏交互操作。目前 `FlowAgentContent` 据此不展示节点「重试 / 跳过」,只保留「详情」
34
33
 
35
34
  ## 基础用法
36
35
 
@@ -94,27 +93,6 @@ ai-execution-summary
94
93
  />
95
94
  ```
96
95
 
97
- ## 面板内的消息按只读呈现
98
-
99
- 面板与对话流复用同一套渲染链路(`MessageRender` → `ContentRender` → 具体内容组件),但面板定位是「回看执行过程」,不承载操作。为此组件在 setup 阶段 provide 面板上下文:
100
-
101
- ```typescript
102
- // 源码:src/composables/use-common.ts(内部上下文,未从包入口导出)
103
- import { useExecutionPanelProvider } from '../../composables/use-common';
104
-
105
- // 面板身份在组件树中恒定,provide 常量 true 即可,无需响应式
106
- useExecutionPanelProvider();
107
- ```
108
-
109
- 内容组件用 `useExecutionPanelInject()` 读取(缺省 `false`,即对话流内)。当前的差异:
110
-
111
- | 内容 | 对话流内 | 侧栏「执行情况」面板内 |
112
- | ---- | -------- | ---------------------- |
113
- | FlowAgent 失败节点「重试 / 跳过」 | 展示(依赖 `retryable` / `skippable`) | **不展示** |
114
- | FlowAgent 节点「详情」 | 展示 | 展示 |
115
-
116
- 新增内容组件若也需要区分这两种场景,同样注入 `useExecutionPanelInject()` 即可,不必扩展 props。`EXECUTION_PANEL_TOKEN` 与这两个函数同属 `use-common.ts` 的内部上下文,未从 `@blueking/chat-x` 包入口导出,仅供库内组件使用。详见 [FlowAgentContent](/components/agent/flow-agent-content)。
117
-
118
96
  ## API
119
97
 
120
98
  ### Props
@@ -1,13 +1,14 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- 汇总当前会话所有 AssistantMessage 的 artifacts(按 outputId 去重),支持关键词搜索、列表选中与下载; 预览区委托 ArtifactPreviewHost:由 resolveFileKind 把扩展名归入 code / markdown / html / text / image / binary 六类, 前四类走 text_from_download 拉正文(code 交给 highlight.js 高亮),image / binary 走 preview_url; download_url / preview_url 经 onArtifactClick 每次异步获取(无 URL 缓存,并发去重); 预览重载键为 outputId:type;重试再次调用 load() 重新取链。 源码位置:src/components/chat-message/assistant-message/message-artifacts/file-artifact-panel.vue。
4
+ 汇总当前会话所有 AssistantMessage 的 artifacts(按 outputId 去重),支持关键词搜索、列表选中、复制、引用到输入框与下载; 预览区委托 ArtifactPreviewHost:由 resolveFileKind 把扩展名归入 code / markdown / html / text / image / binary 六类, 前四类走 text_from_download 拉正文(code 交给 highlight.js 高亮),image / binary 走 preview_url; download_url / preview_url 经 onArtifactClick 每次异步获取(无 URL 缓存,并发去重); 预览重载键为 outputId:type;重试再次调用 load() 重新取链。 源码位置:src/components/chat-message/assistant-message/message-artifacts/file-artifact-panel.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **assistant-message** — 文件产物来源于 AssistantMessage.property.artifacts
8
8
  - **chat-container** — 面板挂载在侧栏「文件产物」Tab(固定、不可关闭),并通过 onArtifactClick 异步取链
9
9
  - **execution-summary** — 同为 ChatContainer 侧栏 Tab 面板,交互形态一致
10
10
  - **message-loading** — ArtifactPreviewHost 取链 / 拉取正文过程使用 MessageLoading
11
+ - **mention-tag** — 引用后文件以资源标签形态进入输入框
11
12
 
12
13
  ---
13
14
  <!-- FULL DOC -->
@@ -32,9 +33,10 @@
32
33
  - **唯一命中**:以 `outputId` 作为会话内唯一键(同 `outputId` 视为同一文件);文件名可能重复,不可作唯一键
33
34
  - **关键词搜索**:按文件名实时过滤列表
34
35
  - **整块空态**:`artifacts` 为空时不渲染列表与预览区,整块展示 bkui `Exception`「暂无数据」(Tab 常驻,无数据也可正常打开侧栏)
35
- - **异步取链**:`AIFileInfo` 本身不含 `url` / `previewUrl`,通过 `ChatContainer` 的 `onArtifactClick` 按 `outputId` 获取 `download_url` / `preview_url`(TTL 8 分钟缓存;预览重试会 `force` 刷新)
36
+ - **异步取链**:`AIFileInfo` 本身不含 `url` / `previewUrl`,通过 `ChatContainer` 的 `onArtifactClick` 按 `outputId` 获取 `download_url` / `preview_url`(不做 URL 缓存,每次重新取链;同文件进行中的请求并发去重)
37
+ - **引用到输入框**:预览头提供「引用」按钮(位于下载左侧),点击后该文件以资源标签形态进入输入框
36
38
  - **职责拆分**:
37
- - **面板本身**:列表、搜索、预览头(文件名 / 图标 / 下载)
39
+ - **面板本身**:列表、搜索、预览头(文件名 / 图标 / 复制 / 引用 / 下载)
38
40
  - **`ArtifactPreviewHost`**:按策略加载正文或预览 URL,分派到对应 renderer;展示 loading / empty / error(含重试)
39
41
  - **未传 `onArtifactClick`**:下载按钮隐藏,预览区展示无数据
40
42
 
@@ -175,6 +177,21 @@ ArtifactFileCard(点击文件卡片)
175
177
  - `ChatContainer` 通过 `useArtifactPreviewProvider` 提供上下文,并把「打开侧栏 Tab」这一副作用以 `onOpen` 注入,保持 composable 职责单一
176
178
  - 侧栏「文件产物」Tab 固定不可关闭,`order: -1` 排在「执行情况」之前;**常驻不随产物有无增删**,无产物时由面板展示整块空态
177
179
 
180
+ ## 引用到输入框
181
+
182
+ 预览头与消息区文件卡片都提供「引用」入口(设计稿中位于下载左侧),点击后文件以资源标签形态追加进输入框,等价于用户在 `@` 菜单里选中它:
183
+
184
+ ```
185
+ 预览头 / 文件卡片「引用」
186
+ └─ useInputMentionConsumer()?.insertMention(toArtifactMenuItem(file))
187
+ └─ ChatContainer 提供的 insertMention
188
+ └─ ChatInput.insertMention → AiSlashInput.appendMention(追加到文档末尾)
189
+ ```
190
+
191
+ - **入口显隐**:`useInputMentionConsumer()` 为 `undefined`(没有输入框,如 `Share` 只读态)时不渲染引用按钮,无需额外开关
192
+ - **id 一致性**:统一走 [`toArtifactMenuItem`](/utils/#会话产物收集) 生成菜单条目,与 `@` 菜单里自动收集的产物同源;id 不一致会导致去重与已插入标签匹配同时失效
193
+ - **消息区文件卡片**:`ArtifactFileCard` 右侧操作区 hover 时显示,引用在下载左侧
194
+
178
195
  ## 唯一键规则
179
196
 
180
197
  会话内以 **`outputId`** 作为文件产物唯一键:
@@ -283,11 +300,13 @@ type AIFileInfo = {
283
300
 
284
301
  ## 关联 Composable
285
302
 
286
- 预览**命中与取链**由 [useArtifactPreview](/composables/use-artifact-preview) 提供(Provider / Consumer + `ARTIFACT_PREVIEW_TOKEN`)。**正文加载与渲染**由内部 `useArtifactPreviewLoader` + `ArtifactPreviewHost` 完成,不在该 composable 内。
303
+ 预览**命中与取链**由 [useArtifactPreview](/composables/use-artifact-preview) 提供(Provider / Consumer + `ARTIFACT_PREVIEW_TOKEN`)。**正文加载与渲染**由内部 `useArtifactPreviewLoader` + `ArtifactPreviewHost` 完成,不在该 composable 内。**引用到输入框**由 [useInputMention](/composables/use-input-mention) 提供。
287
304
 
288
305
  ## 关联组件
289
306
 
290
307
  - [AssistantMessage](/components/message/assistant-message) — 文件产物来源(`property.artifacts`)
291
308
  - [ChatContainer](/components/setup/chat-container) — 侧栏「文件产物」Tab 挂载场景,提供 `onArtifactClick`
292
309
  - [MessageLoading](/components/helper/message-loading) — Host 预览区异步加载态
293
- - [ExecutionSummary](/components/agent/execution-summary) — 同为侧栏 Tab 面板
310
+ - [ExecutionSummary](/components/agent/execution-summary) — 同为侧栏 Tab 面板
311
+ - [MentionTag](/components/rendering/mention-tag) — 引用后在输入框内的标签形态
312
+ - [useInputMention](/composables/use-input-mention) — 引用入口的上下文来源
@@ -220,6 +220,10 @@ MIME 为 `image/*` 时渲染为图片缩略图(`cursor: zoom-in`)。点击
220
220
  </template>
221
221
  ```
222
222
 
223
+ ## 上传文件预览
224
+
225
+ 具有 `outputId` 且不处于上传中 / 失败态的附件,在 `ChatContainer` 内点击会通过统一的文件产物侧栏预览,使用 `onArtifactClick` 获取预览和下载链接。图片缩略图链接失效时仍可按 `outputId` 重新取链;无 `outputId` 的图片继续使用原有图片预览。
226
+
223
227
  ## API
224
228
 
225
229
  ### Props
@@ -4,6 +4,7 @@
4
4
  文件选择按钮,封装 input[type=file] 并输出选择事件。 源码位置:src/components/ai-buttons/file-upload-btn/file-upload-btn.vue。
5
5
 
6
6
  ### 关联组件
7
+ - **add-menu-btn** — ChatInput 内部已改用 + 号聚合菜单承载上传入口
7
8
  - **chat-input** — 输入区附件上传按钮常见挂载位置
8
9
  - **file-content** — 选中文件常以列表形式展示待发送内容
9
10
 
@@ -19,7 +20,11 @@
19
20
 
20
21
  > **能力域**:输入交互
21
22
 
22
- 聊天输入框内置的文件上传触发按钮,点击后弹出系统文件选择框。内部包含隐藏的 `<input type="file">` 与可见的图标按钮;**组件缺省不限制文件类型**(`ChatInput` 会传入对话默认允许列表)。在按钮层只对**单文件**做大小与空文件过滤,**已选文件个数上限与类型校验**由上层(如 `ChatInput`)统一校验并提示,避免按钮与输入区各弹一条错误提示。
23
+ ::: warning ChatInput 已不再使用本按钮
24
+ 输入区重构后,`ChatInput` 的上传入口改为左下角 [AddMenuBtn](/components/input/add-menu-btn) 聚合菜单里的「文件」项(内部走自持的隐藏 `input[type=file]`)。本组件仍保留在源码中并可用于自建输入区,但**不会**出现在 `ChatInput` 的默认布局里,也**未从包入口导出**——文档站示例经相对路径引入。
25
+ :::
26
+
27
+ 文件上传触发按钮,点击后弹出系统文件选择框。内部包含隐藏的 `<input type="file">` 与可见的图标按钮;**不限制文件类型**,在按钮层只对**单文件**做大小与空文件过滤,**已选文件个数上限**由上层统一校验并提示,避免按钮与输入区各弹一条错误提示。
23
28
 
24
29
  ## 组件结构
25
30
 
@@ -30,7 +35,6 @@
30
35
  │ 触发后走 handleFileInputChange → 校验 → emit upload → target.value = ''
31
36
  └── span.ai-shortcut-btn.file-upload-btn-icon(热区 32×32px / 圆角 8px;图标字号跟随 --ai-icon-size-sm:small=16px、normal=18px;color: #979ba5;hover: #f0f1f5)
32
37
  v-tippy: "上传文件,最多支持 {count} 个,单个最大 {size}MB"
33
- 传入 accept 时追加支持格式说明(默认允许列表用分类文案)
34
38
  ({count} / {size} 由 MAX_UPLOAD_FILES 与 MAX_UPLOAD_FILE_SIZE 运行时填充,theme: ai-chat-box,offset: [0, 16],可通过 tippyOptions 扩展)
35
39
  @click → fileInputRef.click()
36
40
  └── <slot> 默认:FileUploadIcon
@@ -41,7 +45,7 @@
41
45
  ```
42
46
  用户选择文件
43
47
 
44
- ├─ 遍历所选文件:size > 0 且 size < MAX_UPLOAD_FILE_SIZE(约 2.4MB)→ 加入 toEmit
48
+ ├─ 遍历所选文件:size > 0 且 size < MAX_UPLOAD_FILE_SIZE(45MB)→ 加入 toEmit
45
49
  │ size 为 0 或 ≥ 上限 → sizeRejected += 1
46
50
 
47
51
  ├─ sizeRejected > 0 → bkui-vue Message.error(formatUploadNotAddedMessage,说明可能超大或超出个数等)
@@ -55,16 +59,16 @@
55
59
 
56
60
  | 场景 | 结果 |
57
61
  | ------------------------------------------------------------ | -------------------------------------------------------------------- |
58
- | 一次多选超过上层允许个数(如 `ChatInput` 内已达 3 个) | **ChatInput** toast 并丢弃/不计入,不在本按钮内按个数提前拦截 |
62
+ | 一次多选超过上层允许个数 | 由**上层**(如输入区)toast 并丢弃 / 不计入,不在本按钮内按个数提前拦截 |
59
63
  | 部分文件因空文件或单文件超大被过滤 | 弹出错误 toast;若仍有合法文件,**仍触发** `upload`(payload 为合法子集) |
60
64
  | 全部被过滤(均为空或超大) | 仅 toast,**不触发** `upload` |
61
65
  | `file.size === 0` | 计入未添加提示,不进入 `upload` payload |
62
- | `file.size >= MAX_UPLOAD_FILE_SIZE`(与全局常量一致,约 2.4MB) | 计入未添加提示,不进入 `upload` payload(比较为严格 `<`) |
66
+ | `file.size >= MAX_UPLOAD_FILE_SIZE`(与全局常量一致,45MB) | 计入未添加提示,不进入 `upload` payload(比较为严格 `<`) |
63
67
  | 选择后取消 | `files.length === 0`,不触发 `upload` |
64
68
 
65
69
  > `multiple` prop 声明存在但当前模板中 `input` 的 `multiple` 属性为**硬编码**(非 `:multiple="multiple"` 绑定),始终允许多选,该 prop 暂时无实际效果。
66
70
 
67
- > **文件类型默认不限制**:组件本身不再默认 `accept="image/*"`。`ChatInput` 会传入对话默认允许列表;独立使用时若需收窄,显式传入 `accept`。个数上限与类型校验由上层(如 `ChatInput`)控制,详见 [ChatInput 文件上传](/components/input/chat-input#file-upload)。
71
+ > **文件类型不做限制**:组件不再默认 `accept="image/*"`,任意类型文件都可选择。若业务需要收窄,显式传入 `accept`。个数上限由上层控制(`MAX_UPLOAD_FILES`),详见 [ChatInput 文件上传](/components/input/chat-input#file-upload)。
68
72
 
69
73
  ## 基础用法
70
74
 
@@ -74,8 +78,6 @@
74
78
  </template>
75
79
 
76
80
  <script setup lang="ts">
77
- import { FileUploadBtn } from '@blueking/chat-x';
78
-
79
81
  const handleUpload = (files: File[]) => {
80
82
  console.log(
81
83
  '选中文件:',
@@ -108,7 +110,7 @@
108
110
  </template>
109
111
  ```
110
112
 
111
- > `accept` 仅影响本组件的文件选择框过滤 UI。`ChatInput` 会在选择/拖拽/粘贴后再按扩展名校验;独立使用 `FileUploadBtn` 时请在 `upload` 回调中自行校验。
113
+ > `accept` 仅影响文件选择框的过滤 UI,不做服务端验证,请在 `upload` 回调中自行校验 MIME 类型。
112
114
 
113
115
  ## 自定义图标
114
116
 
@@ -136,7 +138,7 @@
136
138
 
137
139
  | 事件名 | 参数 | 说明 |
138
140
  | ------ | ----------------- | ----------------------------------------------------------------------------------------- |
139
- | upload | `(files: File[])` | 当存在至少一个合法文件时触发;`files` 为过滤掉空文件与单文件超大(`size >= MAX_UPLOAD_FILE_SIZE`,约 2.4MB)后的数组;个数截断不在此组件内完成 |
141
+ | upload | `(files: File[])` | 当存在至少一个合法文件时触发;`files` 为过滤掉空文件与单文件超大(`size >= MAX_UPLOAD_FILE_SIZE`,45MB)后的数组;个数截断不在此组件内完成 |
140
142
 
141
143
  ### Slots
142
144
 
@@ -146,7 +148,7 @@
146
148
 
147
149
  ## 使用场景
148
150
 
149
- `FileUploadBtn` `ChatInput` 组件内置,当 `ChatInput` `supportUpload` prop 为 `true`(默认值)时自动渲染。一般不需要单独引入,除非构建完全自定义的输入区域。
151
+ 仅在**自建输入区**时使用。若使用 `ChatInput`,上传能力由 `supportUpload`(默认 `true`)开启,入口是 + 号菜单里的「文件」项、拖拽与粘贴,无需再挂本按钮。
150
152
 
151
153
  ## 类型定义
152
154
 
@@ -158,5 +160,6 @@ type AITippyProps = Partial<Pick<TippyOptions, 'appendTo' | 'placement' | 'zInde
158
160
 
159
161
  ## 关联组件
160
162
 
161
- - [ChatInput](/components/input/chat-input) — 默认内置上传入口
163
+ - [AddMenuBtn](/components/input/add-menu-btn) — `ChatInput` 现行的上传 / 资源入口
164
+ - [ChatInput](/components/input/chat-input) — 上传能力与校验规则
162
165
  - [FileContent](/components/medias/file-content) — 选中文件列表展示
@@ -33,7 +33,6 @@
33
33
  - **重试 / 跳过进行中态**:点击后节点行进入 `is-pending`,按钮组常驻显示(无需 hover);进行中按钮切换为 loading +「重试中 / 跳过中」,重试与跳过互斥禁用;被阻塞按钮 hover 显示提示(如「任务正在重试中,不可跳过」);详情不受影响。pending 以 `task_id:node_id:retry` 为键,后端 `retry` 计数变化后自动失效
34
34
  - **详情入口联动**:「详情」按钮点击后通过自定义 Tab 挂载 `FlowAgentNodeDetail`
35
35
  - **分享态只读查看**:`RenderMode.Share` 下保留耗时、「详情」「有效证据」等只读查看入口,仅隐藏「重试 / 跳过」等交互式 resume 操作
36
- - **侧栏执行情况面板只读**:侧栏「执行情况」Tab 内经 `ExecutionSummary` 渲染的同一组件同样只保留「详情」,不展示「重试 / 跳过」;面板身份由 `ExecutionSummary` 通过 `EXECUTION_PANEL_TOKEN` 提供,组件以 `useExecutionPanelInject` 读取。因此重试 / 跳过只出现在对话流内的执行情况
37
36
 
38
37
  ## 状态映射
39
38
 
@@ -95,7 +94,7 @@
95
94
 
96
95
  ## 失败节点重试 / 跳过
97
96
 
98
- 失败节点(`convergedState === 'failed'`)且具备对应能力位时,在**对话流内**的执行情况 hover 行尾展示「重试」或「跳过」按钮(侧栏「执行情况」面板与 Share 分享态不展示,见下方显隐条件)。点击后:
97
+ 失败节点(`convergedState === 'failed'`)且具备对应能力位时,hover 行尾展示「重试」或「跳过」按钮。点击后:
99
98
 
100
99
  1. 节点行添加 `is-pending` class,按钮组常驻显示(设计稿:鼠标移出后仍可见进行中反馈)
101
100
  2. 被点击按钮进入 loading +「重试中 / 跳过中」,重试与跳过均禁用(`is-disabled`,置灰色 `#c4c6cc`)
@@ -126,11 +125,11 @@ onInterruptResume?.({
126
125
 
127
126
  | 按钮 | 显隐条件 | 进行中表现 | `operation` |
128
127
  | ---- | ------------------------------------- | ---------------------------------- | ---------------------- |
129
- | 重试 | 失败态且 `node.retryable === true`;且不在 Share 分享态、不在侧栏「执行情况」面板内 | loading +「重试中」,二者均禁用 | `flow_node_retry` |
130
- | 跳过 | 失败态且 `node.skippable === true`;且不在 Share 分享态、不在侧栏「执行情况」面板内 | loading +「跳过中」,二者均禁用 | `flow_node_skip` |
131
- | 详情 | 始终展示(含 Share 分享态与侧栏面板) | 不受 pending 影响 | —(打开侧栏 Tab,不走 resume) |
128
+ | 重试 | 失败态且 `node.retryable === true` | loading +「重试中」,二者均禁用 | `flow_node_retry` |
129
+ | 跳过 | 失败态且 `node.skippable === true` | loading +「跳过中」,二者均禁用 | `flow_node_skip` |
130
+ | 详情 | 始终展示(含 Share 分享态) | 不受 pending 影响 | —(打开侧栏 Tab,不走 resume) |
132
131
 
133
- 行尾操作由内部 composable [`useFlowNodeActions`](/composables/use-flow-node-actions) 聚合为声明式列表,组件层仅遍历渲染;两类只读场景合并为它的 `hideResumeActions` 入参。
132
+ 行尾操作由内部 composable [`useFlowNodeActions`](/composables/use-flow-node-actions) 聚合为声明式列表,组件层仅遍历渲染。
134
133
 
135
134
  ## 节点详情联动
136
135
 
@@ -177,9 +176,9 @@ ActivityLayout(activity-type=flow_agent,v-model:collapsed)
177
176
  └── node-trailing(含 Share 分享态)
178
177
  ├── node-time(节点耗时,hover / pending 时隐藏)
179
178
  └── node-actions(hover 或 `is-pending` 时显示,间距 12px)
180
- ├── node-action-btn「重试」(失败 + retryable;Share 态与侧栏面板隐藏;进行中 loading + 禁用)
181
- ├── node-action-btn「跳过」(失败 + skippable;Share 态与侧栏面板隐藏;进行中 loading + 禁用)
182
- └── node-action-btn「详情」(始终可用,含 Share 态与侧栏面板,点击挂载详情 Tab)
179
+ ├── node-action-btn「重试」(失败 + retryable;Share 态隐藏;进行中 loading + 禁用)
180
+ ├── node-action-btn「跳过」(失败 + skippable;Share 态隐藏;进行中 loading + 禁用)
181
+ └── node-action-btn「详情」(始终可用,含 Share 态,点击挂载详情 Tab)
183
182
  ```
184
183
 
185
184
  ## API
@@ -255,9 +254,8 @@ interface BkFlowNode {
255
254
  4. **`task_outputs` 暂不渲染**:模板中任务输出展示区块已注释,传入也不会显示。
256
255
  5. **未知状态兜底为 `running`**:`getConvergedState` 对未识别的原始状态统一归为运行中。
257
256
  6. **Share 模式只读查看**:`RenderMode.Share` 下保留节点/任务耗时与「详情」「有效证据」查看入口,仅过滤「重试 / 跳过」等交互式 resume 操作(由 `useFlowNodeActions` 的 `hideResumeActions` 收敛)。
258
- 7. **侧栏「执行情况」面板同为只读**:面板内经 `ExecutionSummary` → `MessageRender` 渲染的本组件不展示「重试 / 跳过」,只保留「详情」;判定来自 `useExecutionPanelInject()`(内部上下文,未从包入口导出;缺省 `false`),与 Share 态一起并入 `hideResumeActions`。因此脱离 `ExecutionSummary` 独立使用组件时,行为与对话流内一致。
259
- 8. **`onInterruptResume` 透传链路**:`MessageRender` `ActivityMessage` `FlowAgentContent`;未传入时重试 / 跳过按钮仍展示但点击无回调。
260
- 9. **pending 自动收敛**:`useFlowNodeActions` 以 `task_id:node_id:retry` 为 pending 键;节点重试再次失败(`retry` +1)后键变化,进行中态自动解除,无需手动清理。
257
+ 7. **`onInterruptResume` 透传链路**:`MessageRender` `ActivityMessage` `FlowAgentContent`;未传入时重试 / 跳过按钮仍展示但点击无回调。
258
+ 8. **pending 自动收敛**:`useFlowNodeActions` `task_id:node_id:retry` pending 键;节点重试再次失败(`retry` +1)后键变化,进行中态自动解除,无需手动清理。
261
259
 
262
260
  ## 关联组件
263
261
 
@@ -0,0 +1,166 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ InputMenuPanel 渲染输入框菜单:分组标题 + InputMenuOption 条目 + 「更多 +N」折叠开关, 内置键盘上下导航与 Esc 关闭;分组数据由 useInputMenu 纯数据逻辑算出(按触发方式筛类型 → 关键字过滤 → 分组 → 折叠 → 扁平化)。 源码位置:src/components/chat-input/input-menu/(input-menu-panel.vue、input-menu-option.vue、use-input-menu.ts、constants.ts)。
5
+
6
+ ### 关联组件
7
+ - **chat-input** — 上层持有触发态与数据源并渲染本面板
8
+ - **ai-slash-input** — 触发方式与过滤关键字由编辑器 menuChange 抛出
9
+ - **add-menu-btn** — + 号唤起 plus 触发的聚合菜单
10
+ - **resource-icon** — 条目左侧图标由 ResourceIcon 渲染
11
+
12
+ ---
13
+ <!-- FULL DOC -->
14
+
15
+ # InputMenuPanel 输入框菜单
16
+
17
+ > **能力域**:输入交互
18
+
19
+ ## 源码事实
20
+
21
+ - **面板**:`src/components/chat-input/input-menu/input-menu-panel.vue`
22
+ - **条目**:`src/components/chat-input/input-menu/input-menu-option.vue`
23
+ - **数据逻辑**:`src/components/chat-input/input-menu/use-input-menu.ts`
24
+ - **分组定义**:`src/components/chat-input/input-menu/constants.ts`
25
+ - **能力说明**:`@` `/` `\` 与左下角 + 号共用同一个面板与同一份 `menuSources`,差异只体现在「展示哪些分组」。
26
+
27
+ ## 布局与交互
28
+
29
+ - 面板由 [ChatInput](/components/input/chat-input) 绝对定位在输入框**正上方 8px**、与输入框等宽,**不跟随光标**;最大高度 400px,超出滚动。
30
+ - 键盘导航由 [useMenuKeydown](/composables/use-menu-keydown) 提供:`↑` / `↓` 移动高亮,`Enter` 选中,高亮项滚动进可视区;结果集变化后高亮回到首项。
31
+ - `Esc` 在**捕获阶段**监听并 emit `close`,避免被编辑器先行消费。
32
+ - 面板滚动时关闭条目描述气泡,防止气泡与列表错位。
33
+ - 条目 `disabled` 时不可选中,也不进入键盘导航序列。
34
+ - 条目名称过长时用 `v-overflow-tips` 展示完整名称;`description` 非空时 hover 弹出「类型:名称 + 描述」气泡(与 [MentionTag](/components/rendering/mention-tag) 同一套气泡)。
35
+
36
+ ## 分组与触发方式
37
+
38
+ | 触发方式 | 分组顺序 |
39
+ | -------- | --------------------------------------------------------- |
40
+ | `/` | Skill、MCP、工具 |
41
+ | `@` | 知识库、会话产物 |
42
+ | `\` | Prompt |
43
+ | `plus` | 添加、Skill、MCP、工具、知识库、会话产物、Prompt |
44
+
45
+ 分组静态定义(`MENU_GROUP_DEFS`):
46
+
47
+ | `key` | 标题 | 覆盖 `type` |
48
+ | --------------- | -------- | ---------------------- |
49
+ | `add` | 添加 | `file` |
50
+ | `skill` | Skill | `skill` |
51
+ | `mcp` | MCP | `mcp` |
52
+ | `tool` | 工具 | `tool` |
53
+ | `knowledgebase` | 知识库 | `knowledgebase`、`doc` |
54
+ | `artifact` | 会话产物 | `artifact` |
55
+ | `prompt` | Prompt | `prompt` |
56
+
57
+ - 组内无匹配条目时,`useInputMenu` **不产出该分组**(初始化与搜索过滤后均如此);全部组都为空时 `groups` 为空数组,`ChatInput` 因此不弹出面板。
58
+ - 面板组件本身若被传入 `items` 为空的分组,仍会渲染标题并展示「暂无数据」。`ChatInput` 默认路径不会走到这一支。
59
+ - `DIVIDED_GROUP_KEYS` 决定哪些分组下方画分隔线,目前为 `['add']`。
60
+ - `getMenuTypeLabel(type)` 由分组定义反查生成,菜单分组标题与标签气泡标题共用一份映射(`file` 映射到「添加」)。
61
+
62
+ ## 渲染示例
63
+
64
+ ## useInputMenu
65
+
66
+ 面板只负责渲染,分组结果由 `useInputMenu` 计算,可脱离 UI 单独单测。流程为:**按触发方式筛类型 → 按关键字过滤 → 分组 → 应用折叠阈值 → 扁平化供键盘导航**。
67
+
68
+ ::: info 内部模块
69
+ 面板、条目与 `useInputMenu` 都不在包入口导出,仅供 [ChatInput](/components/input/chat-input) 内部使用;`IInputMenuItem`、`MenuTrigger` 等类型从包入口导出。
70
+ :::
71
+
72
+ ```typescript
73
+ import { computed, shallowRef } from 'vue';
74
+
75
+ const trigger = shallowRef<MenuTrigger | null>(null);
76
+ const keyword = shallowRef('');
77
+
78
+ const { groups, flatItems, hasContent, toggleGroup } = useInputMenu({
79
+ sources: computed(() => availableSources.value),
80
+ keyword,
81
+ trigger,
82
+ groupItemLimit: computed(() => props.menuGroupItemLimit),
83
+ });
84
+ ```
85
+
86
+ ### 参数
87
+
88
+ | 参数 | 类型 | 说明 |
89
+ | ---------------- | --------------------------------------------- | ---------------------------------------- |
90
+ | `sources` | `Ref<IInputMenuItem[]>` | 全部可选项 |
91
+ | `keyword` | `Ref<string>` | 过滤关键字(触发符之后用户输入的文本) |
92
+ | `trigger` | `Ref<MenuTrigger \| null>` | 当前触发方式,`null` 表示菜单未激活 |
93
+ | `groupItemLimit` | `Ref<number>` | 每个分组默认展示条数上限(内部下限为 1) |
94
+
95
+ ### 返回值
96
+
97
+ | 字段 | 类型 | 说明 |
98
+ | ------------- | ------------------------------- | ------------------------------------------------ |
99
+ | `groups` | `ComputedRef<IInputMenuGroup[]>` | 渲染用分组(已应用过滤与折叠) |
100
+ | `flatItems` | `ComputedRef<IInputMenuItem[]>` | 当前可见且可选中的条目,顺序与面板一致 |
101
+ | `hasContent` | `ComputedRef<boolean>` | 面板是否有内容,供上层决定显隐 |
102
+ | `toggleGroup` | `(key: MenuGroupKey) => void` | 切换某个分组的展开 / 折叠 |
103
+
104
+ > 关键字或触发方式变化时,内部会清空手动展开状态——结果集已完全不同,沿用旧状态会造成误导。
105
+
106
+ ## API
107
+
108
+ ### InputMenuPanel Props
109
+
110
+ | 属性名 | 类型 | 必填 | 说明 |
111
+ | --------- | -------------------- | ---- | -------------------------------------- |
112
+ | groups | `IInputMenuGroup[]` | ✅ | 分组数据 |
113
+ | flatItems | `IInputMenuItem[]` | ✅ | 可选中条目的扁平序列,供键盘导航 |
114
+
115
+ ### InputMenuPanel Emits
116
+
117
+ | 事件名 | 参数 | 触发时机 |
118
+ | ----------- | -------------------------- | ---------------------------- |
119
+ | select | `(item: IInputMenuItem)` | 点击条目或按 Enter 选中 |
120
+ | toggleGroup | `(key: string)` | 点击「更多 +N / 收起」 |
121
+ | close | `()` | 按下 Esc |
122
+
123
+ ### InputMenuOption Props / Emits
124
+
125
+ | 名称 | 类型 | 说明 |
126
+ | -------- | ------------------------ | -------------------------- |
127
+ | `item` | `IInputMenuItem` | 条目数据 |
128
+ | `active` | `boolean` | 键盘导航选中态 |
129
+ | `select` | `(item: IInputMenuItem)` | 条目未禁用时点击触发 |
130
+
131
+ ### 类型定义
132
+
133
+ ```typescript
134
+ /** 面板渲染用的分组(已应用关键字过滤与折叠阈值) */
135
+ interface IInputMenuGroup {
136
+ key: string;
137
+ /** 分组标题的中文文案 key,渲染时经 t() 转换 */
138
+ name: string;
139
+ /** 当前可见条目 */
140
+ items: IInputMenuItem[];
141
+ /** 被折叠隐藏的条数,为 0 表示无需折叠 */
142
+ restCount: number;
143
+ /** 是否已展开全部条目 */
144
+ expanded: boolean;
145
+ /** 分组下方是否需要分隔线 */
146
+ divided: boolean;
147
+ }
148
+
149
+ type MenuGroupKey = 'add' | 'skill' | 'mcp' | 'tool' | 'knowledgebase' | 'artifact' | 'prompt';
150
+
151
+ /** 字符触发符,plus 由按钮唤起不在其中 */
152
+ const CHAR_TRIGGERS = ['@', '/', '\\'] as const;
153
+
154
+ /** 分组默认最多展示的条数 */
155
+ const DEFAULT_GROUP_ITEM_LIMIT = 4;
156
+ ```
157
+
158
+ `IInputMenuItem` 与 `MenuTrigger` 见 [ChatInput 类型定义](/components/input/chat-input#类型定义)。
159
+
160
+ ## 关联组件
161
+
162
+ - [ChatInput](/components/input/chat-input) — 菜单数据源、触发态与选中后的动作分发
163
+ - [AiSlashInput](/components/input/ai-slash-input) — 触发方式与关键字的来源
164
+ - [AddMenuBtn](/components/input/add-menu-btn) — `plus` 触发入口
165
+ - [ResourceIcon](/components/helper/resource-icon) — 条目图标
166
+ - [useMenuKeydown](/composables/use-menu-keydown) — 键盘导航