@blueking/chat-x 0.0.51-beta.4 → 0.0.51

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.
@@ -130,6 +130,8 @@ export declare const lang: {
130
130
  readonly 全选: "Select All";
131
131
  readonly 确定: "Confirm";
132
132
  readonly '\u4E0A\u4F20\u6587\u4EF6\uFF0C\u6700\u591A\u652F\u6301 {count} \u4E2A\uFF0C\u5355\u4E2A\u6700\u5927 {size}MB': "Upload file, up to {count} files, max {size}MB each";
133
+ readonly '\u652F\u6301\u683C\u5F0F\uFF1A{formats}': "Supported formats: {formats}";
134
+ readonly '\u6709 {count} \u4E2A\u6587\u4EF6\u56E0\u683C\u5F0F\u4E0D\u652F\u6301\u672A\u6DFB\u52A0': "{count} files were not added because the format is not supported";
133
135
  readonly '\u4F60\u597D\uFF0C\u6211\u662F\u5C0F\u9CB8': "Hello, I am BlueKing AI Bot";
134
136
  readonly 清空搜索: "Clear Search";
135
137
  readonly 搜索结果为空: "Search Result is Empty";
@@ -160,4 +162,4 @@ export declare const lang: {
160
162
  readonly '\u5B58\u5728\u4E0A\u4F20\u5931\u8D25\u7684\u6587\u4EF6\uFF0C\u8BF7\u5220\u9664\u540E\u91CD\u8BD5': "Remove failed uploads before sending";
161
163
  readonly 上传失败: "Upload failed";
162
164
  };
163
- export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool" | "Read Skill" | "Calling" | "Reading" | "Tell us your thoughts" | "What makes you satisfied?" | "What makes you dissatisfied?" | "Return Content" | "Edit" | "Deep Thinking" | "Quick Thinking" | "Image to Text" | "Loading image..." | "Failed to load image" | "Thinking..." | "Thinking Completed" | "Thinking Failed" | "Copy Success" | "Copy Failed" | "Return to bottom" | "Stop generating" | "Stopping" | "Duration" | "Yesterday" | "Parameters" | "Description" | "Execution Status" | "Running" | "Success" | "Failed" | "Pending" | "To Be Executed" | "Details" | "Retry" | "Retrying" | "Skipping" | "The task is retrying and cannot be skipped" | "The task is skipping and cannot be retried" | "Node" | "Node Config" | "Node Output" | "Basic Info" | "Flow Template" | "Node Name" | "Step Name" | "Execution Plan" | "Optional" | "Failure Handler" | "Timeout Control" | "Yes" | "No" | "Input Params" | "Output Params" | "Param Name" | "Param Value" | "Name" | "Structured Output" | "Manual Skip" | "No Data" | "Call MCP" | "More" | "Algorithm Plan Review Ticket" | "Reviewing" | "Approving" | "Abandoned" | "Approved" | "Cancelled" | "Expired" | "Rejected" | "Revoked" | "Ticket No." | "Submitted At" | "Current Handler" | "None" | "View Ticket Detail" | "Copy Ticket" | "Copy Ticket Link" | "Cancel Approval" | "Approval Cancelled" | "Refresh Ticket Status" | "This ticket has been rejected and cannot be cancelled" | "This ticket has been approved and cannot be cancelled" | "This ticket has been cancelled, no need to click again" | "Approval cannot be cancelled in the current status" | "There are {count} pending approval tickets in the current conversation. To continue, cancel approval first." | "Unsupported interrupt message" | "Searching" | "Search Completed" | "Upload File" | "Select model" | "Search models" | "Requesting..." | "Cancel satisfied" | "Cancel dissatisfied" | "Confirm delete this answer?" | "This operation cannot be undone. Please proceed with caution!" | "Preview" | "Zoom Out" | "Zoom In" | "Rotate" | "Download" | "Sorry, image loading failed. Please try reloading." | "Reset" | "Reload" | "W" | "H" | "Upload Image" | "Search keyword" | "Select date" | "Locate in Chat" | "Select All" | "Confirm" | "Upload file, up to {count} files, max {size}MB each" | "Hello, I am BlueKing AI Bot" | "Clear Search" | "Search Result is Empty" | "Valid Evidence" | "Full Screen" | "Exit Full Screen" | "Please choose to continue" | "Continue" | "Received: " | "Done" | "Skip" | "Single" | "Multiple" | "Others" | "Completed" | "question(s)" | "Answers" | "Replied" | "Please enter..." | "File Artifacts" | "File List" | "Search file keyword" | "Failed to load preview" | "No file to preview" | "Uploading files, please wait" | "Remove failed uploads before sending" | "Upload failed" | "发送" | "停止" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具" | "读取 Skill" | "正在调用" | "正在读取" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "昨天" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传文件,最多支持 {count} 个,单个最大 {size}MB" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "已完成" | "题" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件" | "文件上传中,请稍候" | "存在上传失败的文件,请删除后重试" | "上传失败";
165
+ export declare const t: (key: keyof typeof lang) => "Send" | "Stop" | "Ask AI" | "Copy" | "Share" | "Like" | "Unsatisfied" | "Delete" | "Quote" | "Regenerate" | "Regenerating will clear the content below" | "Submit" | "Cancel" | "Preview Content" | "Jump to Detail" | "Call Tool" | "Read Skill" | "Calling" | "Reading" | "Tell us your thoughts" | "What makes you satisfied?" | "What makes you dissatisfied?" | "Return Content" | "Edit" | "Deep Thinking" | "Quick Thinking" | "Image to Text" | "Loading image..." | "Failed to load image" | "Thinking..." | "Thinking Completed" | "Thinking Failed" | "Copy Success" | "Copy Failed" | "Return to bottom" | "Stop generating" | "Stopping" | "Duration" | "Yesterday" | "Parameters" | "Description" | "Execution Status" | "Running" | "Success" | "Failed" | "Pending" | "To Be Executed" | "Details" | "Retry" | "Retrying" | "Skipping" | "The task is retrying and cannot be skipped" | "The task is skipping and cannot be retried" | "Node" | "Node Config" | "Node Output" | "Basic Info" | "Flow Template" | "Node Name" | "Step Name" | "Execution Plan" | "Optional" | "Failure Handler" | "Timeout Control" | "Yes" | "No" | "Input Params" | "Output Params" | "Param Name" | "Param Value" | "Name" | "Structured Output" | "Manual Skip" | "No Data" | "Call MCP" | "More" | "Algorithm Plan Review Ticket" | "Reviewing" | "Approving" | "Abandoned" | "Approved" | "Cancelled" | "Expired" | "Rejected" | "Revoked" | "Ticket No." | "Submitted At" | "Current Handler" | "None" | "View Ticket Detail" | "Copy Ticket" | "Copy Ticket Link" | "Cancel Approval" | "Approval Cancelled" | "Refresh Ticket Status" | "This ticket has been rejected and cannot be cancelled" | "This ticket has been approved and cannot be cancelled" | "This ticket has been cancelled, no need to click again" | "Approval cannot be cancelled in the current status" | "There are {count} pending approval tickets in the current conversation. To continue, cancel approval first." | "Unsupported interrupt message" | "Searching" | "Search Completed" | "Upload File" | "Select model" | "Search models" | "Requesting..." | "Cancel satisfied" | "Cancel dissatisfied" | "Confirm delete this answer?" | "This operation cannot be undone. Please proceed with caution!" | "Preview" | "Zoom Out" | "Zoom In" | "Rotate" | "Download" | "Sorry, image loading failed. Please try reloading." | "Reset" | "Reload" | "W" | "H" | "Upload Image" | "Search keyword" | "Select date" | "Locate in Chat" | "Select All" | "Confirm" | "Upload file, up to {count} files, max {size}MB each" | "Supported formats: {formats}" | "{count} files were not added because the format is not supported" | "Hello, I am BlueKing AI Bot" | "Clear Search" | "Search Result is Empty" | "Valid Evidence" | "Full Screen" | "Exit Full Screen" | "Please choose to continue" | "Continue" | "Received: " | "Done" | "Skip" | "Single" | "Multiple" | "Others" | "Completed" | "question(s)" | "Answers" | "Replied" | "Please enter..." | "File Artifacts" | "File List" | "Search file keyword" | "Failed to load preview" | "No file to preview" | "Uploading files, please wait" | "Remove failed uploads before sending" | "Upload failed" | "发送" | "停止" | "问问小鲸" | "复制" | "分享" | "点赞" | "不满意" | "删除" | "引用" | "重新生成" | "重新生成将清空下文内容" | "提交" | "取消" | "预览内容" | "跳转详情" | "调用工具" | "读取 Skill" | "正在调用" | "正在读取" | "说出您的想法" | "什么原因让你满意?" | "什么原因让你不满意?" | "返回内容" | "编辑" | "深度思考" | "快速思考" | "图生文" | "图片加载中..." | "图片加载失败" | "思考中" | "已思考完成" | "思考失败" | "复制成功" | "复制失败" | "返回底部" | "停止生成" | "正在停止" | "耗时" | "昨天" | "参数" | "描述" | "执行情况" | "执行中" | "成功" | "失败" | "挂起" | "待执行" | "详情" | "重试" | "重试中" | "跳过中" | "任务正在重试中,不可跳过" | "任务正在跳过中,不可重试" | "节点" | "节点配置" | "节点输出" | "基础信息" | "流程模板" | "节点名称" | "步骤名称" | "执行方案" | "是否可选" | "失败处理" | "超时控制" | "是" | "否" | "输入参数" | "输出参数" | "参数名" | "参数值" | "名称" | "变量说明" | "结构化输出" | "手动跳过" | "暂无数据" | "调用 MCP" | "更多" | "算法方案评审单" | "评审中" | "审批中" | "已废弃" | "已批准" | "已通过" | "已取消" | "已过期" | "已拒绝" | "已撤销" | "单据编号" | "提交时间" | "当前处理人" | "无" | "查看单据详情" | "复制单据" | "复制单据链接" | "取消审批" | "已取消审批" | "刷新单据状态" | "单据已取消审批" | "该单据已被拒绝,无法取消" | "该单据已通过,无法取消" | "单据已取消,无需重复点击" | "当前状态无法取消审批" | "当前会话有 {count} 个待审批单,如需继续,请先取消审批" | "暂不支持的中断消息" | "检索中" | "检索完成" | "上传文件" | "选择模型" | "搜索模型关键字" | "请求中..." | "取消满意" | "取消不满意" | "确认删除该回答?" | "删除操作无法撤回,请谨慎操作!" | "预览" | "缩小" | "放大" | "旋转" | "下载" | "抱歉,图片加载失败,可尝试重新加载" | "重置" | "重新加载" | "宽" | "高" | "上传图片" | "搜索 关键字" | "选择日期" | "在对话中定位" | "全选" | "确定" | "上传文件,最多支持 {count} 个,单个最大 {size}MB" | "支持格式:{formats}" | "有 {count} 个文件因格式不支持未添加" | "你好,我是小鲸" | "清空搜索" | "搜索结果为空" | "有效证据" | "全屏" | "退出全屏" | "请选择以继续" | "继续" | "收到信息:" | "待审批" | "已审批" | "完成" | "跳过" | "单选" | "多选" | "其他" | "已完成" | "题" | "回答内容" | "已回复" | "请输入..." | "文件产物" | "文件列表" | "搜索文件关键字" | "预览加载失败" | "暂无可预览的文件" | "文件上传中,请稍候" | "存在上传失败的文件,请删除后重试" | "上传失败";
@@ -166,7 +166,7 @@ const collapsed = ref(false); // false = 展开,true = 折叠
166
166
  - **默认激活**:当 `MessageContainer` 已注入滚动上下文(`useContainerScrollProvider`,供 `FlowAgentContent` 内 `useContainerScrollConsumer` 读取)时,组件挂载后若存在 `task.is_active === true` 且 `task.has_confidence === true` 的任务,会自动在侧栏打开该任务的「有效证据」Tab;无滚动 Provider(例如独立演示)时不做自动打开。用户手动切换 Tab 后不再沿用 `is_active` 默认高亮
167
167
  - **选中态**:当前侧栏 Tab 与任务行 / 节点行联动高亮(`is-selected`);任务 Tab 与「有效证据」Tab 均视为该任务的选中态
168
168
  - **节点列表**:每个节点显示状态圆点、名称和耗时;hover 时出现行尾操作按钮组
169
- - **失败节点操作**:失败且 `retryable` / `skippable` 为 `true` 的节点,hover 时额外展示「重试」「跳过」按钮,点击后通过 `onInterruptResume` 回传 Agent(不传 `interrupt`)
169
+ - **失败节点操作**:失败且 `retryable` / `skippable` 为 `true` 的节点,hover 时额外展示「重试」「跳过」按钮,点击后通过 `onInterruptResume` 回传 Agent(不传 `interrupt`)。仅在对话流内出现:侧栏「执行情况」面板(`ExecutionSummary`)内渲染的同一消息只保留「详情」
170
170
  - **节点详情**:点击「详情」会通过 `useCustomTabConsumer` 在 `ChatContainer` 侧边栏新增自定义 Tab,展示节点配置(基础信息、输入参数、输出参数)
171
171
 
172
172
  > `FlowAgentContent` 会读取 `ChatContainer` 注入的 `renderMode`。当 `renderMode === RenderMode.Share` 时,任务行不展示总耗时与「有效证据」,节点列表不展示耗时与「详情」按钮,避免分享预览中出现可交互入口。独立使用 `ActivityMessage` 且没有上层 Provider 时,默认按 `Chat` 模式渲染。
@@ -191,8 +191,8 @@ FlowAgentContent(activityType = 'flow_agent')
191
191
  ├── node.name(HighlightKeyword 支持搜索高亮)
192
192
  ├── node.elapsed_time
193
193
  └── 行尾操作按钮组(hover 显示)
194
- ├── 重试(失败 + retryable)→ onInterruptResume
195
- ├── 跳过(失败 + skippable)→ onInterruptResume
194
+ ├── 重试(失败 + retryable;侧栏执行情况面板内隐藏)→ onInterruptResume
195
+ ├── 跳过(失败 + skippable;侧栏执行情况面板内隐藏)→ onInterruptResume
196
196
  └── 详情 → 打开节点详情 Tab
197
197
  ```
198
198
 
@@ -378,7 +378,7 @@ v-model:visible="selectionVisible"
378
378
  | 属性名 | 类型 | 默认值 | 必填 | 说明 |
379
379
  | ---------------- | ------------ | ------------------- | ---- | ------------------------------------------------------- |
380
380
  | visible | `boolean` | - | ✅ | 控制弹窗显示,必须使用 `v-model:visible` |
381
- | shortcuts | `Shortcut[]` | `DEFAULT_SHORTCUTS` | - | 快捷指令列表,默认为内置「问问小鲸」 |
381
+ | shortcuts | `Shortcut[]` | `DEFAULT_SHORTCUTS` | - | 快捷指令列表;未传或空数组时回退内置「问问小鲸」 |
382
382
  | maxShortcutCount | `number` | `3` | - | 直接展示的最大指令数,超出收起到「更多」菜单 |
383
383
  | offset | `number` | `10` | - | 弹窗与选区的垂直间距(px) |
384
384
  | excludeSelectors | `string[]` | `[]` | - | 排除的 CSS 选择器数组,选区在这些选择器内部时不显示弹窗 |
@@ -134,6 +134,8 @@ ai-chat-container(:data-ai-size="size")
134
134
 
135
135
  侧边栏默认包含「执行情况」Tab,展示所有工具调用和 FlowAgent 类型的 Activity 消息。支持关键词搜索过滤和点击定位到对话中的消息位置。Tab 标签内 `.ai-execution-summary-icon` 固定 16×16px,避免被 flex 压缩。
136
136
 
137
+ 面板内的消息虽与对话流复用同一套渲染链路,但按**只读回看**呈现:`ExecutionSummary` 会 provide 面板上下文,FlowAgent 失败节点在面板内不展示「重试 / 跳过」,只保留「详情」;对话流内不受影响。详见 [ExecutionSummary](/components/agent/execution-summary)。
138
+
137
139
  **展示条件**:侧栏是否渲染只取决于折叠态与是否存在可见 Tab —— `asideCollapsed === false` 且 `displayTabs` 非空即展开,与 `executionGroups`、`keyword`、是否有文件产物均无关。无执行数据时 `ExecutionSummary` 展示自身空态,无文件产物时 `FileArtifactPanel` 展示整块空态。`renderMode === Share` 分享态同样按折叠态展示侧栏(开放只读查看流程智能体详情/证据/执行情况),仅底部输入区保持隐藏。
138
140
 
139
141
  **展开 / 折叠由外部判断(严格受控)**:只要传入了 `asideCollapsed`,折叠态就**一律以外部值为准**。容器内部的展开动作(点击文件卡片预览、`addCustomTab` 打开节点详情等)只发出 `update:asideCollapsed` 请求,外部不改值就不会展开 —— 所以务必用 `v-model:asideCollapsed` 绑定,只写 `:aside-collapsed` 会让这些内部入口失效。完全不传该 prop 时退化为组件内部状态(默认折叠),内部入口照常生效。容器不会因为数据变空而自动收起或重置自定义 Tab。
@@ -330,11 +330,12 @@ const handleSendMessage = async (
330
330
  - **上传中或存在失败附件时禁止发送**(点击、Enter、`triggerSendMessage` 均拦截)。失败附件需用户删除后才能再发;不要把附件 Pending 映射成 `MessageStatus.Pending`
331
331
  - 发送成功后,`uploadFiles` 自动清空
332
332
 
333
- **个数与大小校验(与 `FileUploadBtn` 分工)**:
333
+ **个数、大小与格式校验(与 `FileUploadBtn` 分工)**:
334
334
 
335
335
  - 列表最多保留 **`MAX_UPLOAD_FILES`(9)** 个待发送附件;已满时再次选择/拖入/粘贴文件会弹出 **bkui-vue `Message` 错误提示**(`formatUploadNotAddedMessage`),且不会继续入队。
336
336
  - 在未满的前提下:空文件、单文件大小 **`>= MAX_UPLOAD_FILE_SIZE`(约 2.4MB)** 会被跳过并弹出超大小/个数提示。与已有文件重复的项只去重、不弹这条误导文案。
337
- - `FileUploadBtn` 仅在按钮层过滤**空文件与单文件超大**,把合法文件以数组形式 `upload` 上来;**个数上限与重复校验**在 `ChatInput` `handleUpload` 中统一处理,避免与按钮层各弹一条提示。
337
+ - **文件类型**:默认使用 `DEFAULT_UPLOAD_ACCEPT`(图片 / 文档 / 文本 / 代码扩展名列表)。系统文件选择框带 `accept` 过滤;选择后、拖拽、粘贴仍会再按扩展名校验,不支持的格式弹出「因格式不支持未添加」并不会入队。可通过 `accept` prop 覆盖(空字符串表示不限制)。
338
+ - `FileUploadBtn` 仅在按钮层过滤**空文件与单文件超大**,把合法文件以数组形式 `upload` 上来;**个数上限、重复校验与类型校验**在 `ChatInput` 的 `handleUpload` 中统一处理,避免与按钮层各弹一条提示。
338
339
 
339
340
  **发送内容格式**(有文件时):
340
341
 
@@ -602,6 +603,7 @@ const handleSendMessage = async (
602
603
  | defaultUploadFiles | `UploadFile[]` | - | - | 预设已上传的文件列表 |
603
604
  | sendDisabledTip | `string` | - | - | 业务阻塞发送时的 tooltip 提示;传入后发送按钮置灰,点击、Enter 与 `triggerSendMessage()` 均不会发送 |
604
605
  | supportUpload | `boolean` | `true` | - | 是否显示文件上传按钮 |
606
+ | accept | `string` | `DEFAULT_UPLOAD_ACCEPT` | - | 文件选择框过滤类型,同时用于选择/拖拽/粘贴后的扩展名校验;空字符串表示不限制 |
605
607
  | tippyOptions | `AITippyProps` | — | - | 透传给 FileUploadBtn 和 InputAttachment 的 tooltip 配置 |
606
608
  | onSendMessage | `(content: UserMessage['content'], docSchema: TagSchema, options?: { interrupt?: Interrupt; payload?: InterruptResume }) => Promise<void>` | - | - | 发送消息回调,无文件时 content 为字符串,有文件时为数组;经 [ChatContainer](/components/setup/chat-container) 使用时,存在待回答 UserQuestion 会传入第三参数 `options` |
607
609
  | onStopSending | `() => Promise<void>` | - | - | 停止发送回调,点击停止按钮时触发 |
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- 按消息流提取执行摘要,支持关键词定位和消息渲染。 源码位置:src/components/execution-summary/execution-summary.vue。
4
+ 按消息流提取执行摘要,支持关键词定位和消息渲染。 通过 useExecutionPanelProvider 提供 EXECUTION_PANEL_TOKEN,面板内消息按只读呈现, FlowAgent 失败节点在面板内不展示重试/跳过,只保留详情。 源码位置:src/components/execution-summary/execution-summary.vue。
5
5
 
6
6
  ### 关联组件
7
7
  - **message-render** — 摘要列表内渲染消息内容
@@ -30,6 +30,7 @@
30
30
  - **关键词搜索**:实时过滤匹配的执行记录
31
31
  - **对话定位**:hover 显示「在对话中定位」按钮,点击滚动到对应消息
32
32
  - **空状态处理**:无数据或搜索无结果时显示空状态提示
33
+ - **面板上下文(只读呈现)**:组件 setup 时通过 `useExecutionPanelProvider()` 提供 `EXECUTION_PANEL_TOKEN`,供内部消息组件识别「当前处于侧栏面板内」并隐藏交互操作。目前 `FlowAgentContent` 据此不展示节点「重试 / 跳过」,只保留「详情」
33
34
 
34
35
  ## 基础用法
35
36
 
@@ -93,6 +94,27 @@ ai-execution-summary
93
94
  />
94
95
  ```
95
96
 
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
+
96
118
  ## API
97
119
 
98
120
  ### Props
@@ -19,7 +19,7 @@
19
19
 
20
20
  > **能力域**:输入交互
21
21
 
22
- 聊天输入框内置的文件上传触发按钮,点击后弹出系统文件选择框。内部包含隐藏的 `<input type="file">` 与可见的图标按钮;**不限制文件类型**,在按钮层只对**单文件**做大小与空文件过滤,**已选文件个数上限**由上层(如 `ChatInput`)统一校验并提示,避免按钮与输入区各弹一条错误提示。
22
+ 聊天输入框内置的文件上传触发按钮,点击后弹出系统文件选择框。内部包含隐藏的 `<input type="file">` 与可见的图标按钮;**组件缺省不限制文件类型**(`ChatInput` 会传入对话默认允许列表)。在按钮层只对**单文件**做大小与空文件过滤,**已选文件个数上限与类型校验**由上层(如 `ChatInput`)统一校验并提示,避免按钮与输入区各弹一条错误提示。
23
23
 
24
24
  ## 组件结构
25
25
 
@@ -30,6 +30,7 @@
30
30
  │ 触发后走 handleFileInputChange → 校验 → emit upload → target.value = ''
31
31
  └── span.ai-shortcut-btn.file-upload-btn-icon(热区 32×32px / 圆角 8px;图标字号跟随 --ai-icon-size-sm:small=16px、normal=18px;color: #979ba5;hover: #f0f1f5)
32
32
  v-tippy: "上传文件,最多支持 {count} 个,单个最大 {size}MB"
33
+ 传入 accept 时追加支持格式说明(默认允许列表用分类文案)
33
34
  ({count} / {size} 由 MAX_UPLOAD_FILES 与 MAX_UPLOAD_FILE_SIZE 运行时填充,theme: ai-chat-box,offset: [0, 16],可通过 tippyOptions 扩展)
34
35
  @click → fileInputRef.click()
35
36
  └── <slot> 默认:FileUploadIcon
@@ -63,7 +64,7 @@
63
64
 
64
65
  > `multiple` prop 声明存在但当前模板中 `input` 的 `multiple` 属性为**硬编码**(非 `:multiple="multiple"` 绑定),始终允许多选,该 prop 暂时无实际效果。
65
66
 
66
- > **文件类型不做限制**:组件不再默认 `accept="image/*"`,任意类型文件都可选择。若业务需要收窄,显式传入 `accept`。个数上限由上层(如 `ChatInput` 的 `MAX_UPLOAD_FILES`)控制,详见 [ChatInput 文件上传](/components/input/chat-input#file-upload)。
67
+ > **文件类型默认不限制**:组件本身不再默认 `accept="image/*"`。`ChatInput` 会传入对话默认允许列表;独立使用时若需收窄,显式传入 `accept`。个数上限与类型校验由上层(如 `ChatInput`)控制,详见 [ChatInput 文件上传](/components/input/chat-input#file-upload)。
67
68
 
68
69
  ## 基础用法
69
70
 
@@ -107,7 +108,7 @@
107
108
  </template>
108
109
  ```
109
110
 
110
- > `accept` 仅影响文件选择框的过滤 UI,不做服务端验证,请在 `upload` 回调中自行校验 MIME 类型。
111
+ > `accept` 仅影响本组件的文件选择框过滤 UI。`ChatInput` 会在选择/拖拽/粘贴后再按扩展名校验;独立使用 `FileUploadBtn` 时请在 `upload` 回调中自行校验。
111
112
 
112
113
  ## 自定义图标
113
114
 
@@ -33,6 +33,7 @@
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` 读取。因此重试 / 跳过只出现在对话流内的执行情况
36
37
 
37
38
  ## 状态映射
38
39
 
@@ -94,7 +95,7 @@
94
95
 
95
96
  ## 失败节点重试 / 跳过
96
97
 
97
- 失败节点(`convergedState === 'failed'`)且具备对应能力位时,hover 行尾展示「重试」或「跳过」按钮。点击后:
98
+ 失败节点(`convergedState === 'failed'`)且具备对应能力位时,在**对话流内**的执行情况 hover 行尾展示「重试」或「跳过」按钮(侧栏「执行情况」面板与 Share 分享态不展示,见下方显隐条件)。点击后:
98
99
 
99
100
  1. 节点行添加 `is-pending` class,按钮组常驻显示(设计稿:鼠标移出后仍可见进行中反馈)
100
101
  2. 被点击按钮进入 loading +「重试中 / 跳过中」,重试与跳过均禁用(`is-disabled`,置灰色 `#c4c6cc`)
@@ -125,11 +126,11 @@ onInterruptResume?.({
125
126
 
126
127
  | 按钮 | 显隐条件 | 进行中表现 | `operation` |
127
128
  | ---- | ------------------------------------- | ---------------------------------- | ---------------------- |
128
- | 重试 | 失败态且 `node.retryable === true` | loading +「重试中」,二者均禁用 | `flow_node_retry` |
129
- | 跳过 | 失败态且 `node.skippable === true` | loading +「跳过中」,二者均禁用 | `flow_node_skip` |
130
- | 详情 | 始终展示(含 Share 分享态) | 不受 pending 影响 | —(打开侧栏 Tab,不走 resume) |
129
+ | 重试 | 失败态且 `node.retryable === true`;且不在 Share 分享态、不在侧栏「执行情况」面板内 | loading +「重试中」,二者均禁用 | `flow_node_retry` |
130
+ | 跳过 | 失败态且 `node.skippable === true`;且不在 Share 分享态、不在侧栏「执行情况」面板内 | loading +「跳过中」,二者均禁用 | `flow_node_skip` |
131
+ | 详情 | 始终展示(含 Share 分享态与侧栏面板) | 不受 pending 影响 | —(打开侧栏 Tab,不走 resume) |
131
132
 
132
- 行尾操作由内部 composable [`useFlowNodeActions`](/composables/use-flow-node-actions) 聚合为声明式列表,组件层仅遍历渲染。
133
+ 行尾操作由内部 composable [`useFlowNodeActions`](/composables/use-flow-node-actions) 聚合为声明式列表,组件层仅遍历渲染;两类只读场景合并为它的 `hideResumeActions` 入参。
133
134
 
134
135
  ## 节点详情联动
135
136
 
@@ -176,9 +177,9 @@ ActivityLayout(activity-type=flow_agent,v-model:collapsed)
176
177
  └── node-trailing(含 Share 分享态)
177
178
  ├── node-time(节点耗时,hover / pending 时隐藏)
178
179
  └── node-actions(hover 或 `is-pending` 时显示,间距 12px)
179
- ├── node-action-btn「重试」(失败 + retryable;Share 态隐藏;进行中 loading + 禁用)
180
- ├── node-action-btn「跳过」(失败 + skippable;Share 态隐藏;进行中 loading + 禁用)
181
- └── node-action-btn「详情」(始终可用,含 Share 态,点击挂载详情 Tab)
180
+ ├── node-action-btn「重试」(失败 + retryable;Share 态与侧栏面板隐藏;进行中 loading + 禁用)
181
+ ├── node-action-btn「跳过」(失败 + skippable;Share 态与侧栏面板隐藏;进行中 loading + 禁用)
182
+ └── node-action-btn「详情」(始终可用,含 Share 态与侧栏面板,点击挂载详情 Tab)
182
183
  ```
183
184
 
184
185
  ## API
@@ -254,8 +255,9 @@ interface BkFlowNode {
254
255
  4. **`task_outputs` 暂不渲染**:模板中任务输出展示区块已注释,传入也不会显示。
255
256
  5. **未知状态兜底为 `running`**:`getConvergedState` 对未识别的原始状态统一归为运行中。
256
257
  6. **Share 模式只读查看**:`RenderMode.Share` 下保留节点/任务耗时与「详情」「有效证据」查看入口,仅过滤「重试 / 跳过」等交互式 resume 操作(由 `useFlowNodeActions` 的 `hideResumeActions` 收敛)。
257
- 7. **`onInterruptResume` 透传链路**:`MessageRender` `ActivityMessage` `FlowAgentContent`;未传入时重试 / 跳过按钮仍展示但点击无回调。
258
- 8. **pending 自动收敛**:`useFlowNodeActions` `task_id:node_id:retry` pending 键;节点重试再次失败(`retry` +1)后键变化,进行中态自动解除,无需手动清理。
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)后键变化,进行中态自动解除,无需手动清理。
259
261
 
260
262
  ## 关联组件
261
263
 
@@ -1,7 +1,7 @@
1
1
  <!-- AI SUMMARY -->
2
2
  ## 快速了解
3
3
 
4
- useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions 与 isNodePending。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击后进入 pending 防重复提交, 以 task_id:node_id:retry 为键自动收敛;点击 resume 时不传 interrupt。
4
+ useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions 与 isNodePending。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击后进入 pending 防重复提交, 以 task_id:node_id:retry 为键自动收敛;点击 resume 时不传 interrupt。 hideResumeActions 为 true 时只返回详情,覆盖 Share 分享态与侧栏「执行情况」面板两类只读场景。
5
5
 
6
6
  ### 关联组件
7
7
  - **flow-agent-content** — FlowAgentContent 内部消费,驱动节点行尾按钮组渲染
@@ -21,7 +21,7 @@ useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeA
21
21
 
22
22
  ```typescript
23
23
  function useFlowNodeActions(options: {
24
- /** 隐藏重试 / 跳过等交互式 resume 操作(分享态只读,仅保留「详情」查看入口) */
24
+ /** 隐藏重试 / 跳过等交互式 resume 操作(分享态、侧栏执行情况面板等只读场景,仅保留「详情」查看入口) */
25
25
  hideResumeActions?: Ref<boolean>;
26
26
  /** resume 回调(与第三方审批取消同一回调,按 payload.operation 分流) */
27
27
  onInterruptResume: Ref<OnInterruptResume | undefined>;
@@ -71,13 +71,16 @@ interface FlowNodeActionVM {
71
71
 
72
72
  | 操作 | `id` | 显隐条件 | 点击行为 |
73
73
  | ---- | ------------------ | ------------------------------------------ | --------------------------------------------- |
74
- | 重试 | `flow_node_retry` | `convergedState === 'failed'` 且 `retryable` | 调用 `onInterruptResume`,**不传** `interrupt` |
75
- | 跳过 | `flow_node_skip` | `convergedState === 'failed'` 且 `skippable` | 同上 |
76
- | 详情 | `detail` | 始终(含 Share 分享态) | 调用 `openNodeDetail(task.raw, node.raw)` |
74
+ | 重试 | `flow_node_retry` | `convergedState === 'failed'` 且 `retryable`,且 `hideResumeActions` 为 `false` | 调用 `onInterruptResume`,**不传** `interrupt` |
75
+ | 跳过 | `flow_node_skip` | `convergedState === 'failed'` 且 `skippable`,且 `hideResumeActions` 为 `false` | 同上 |
76
+ | 详情 | `detail` | 始终(不受 `hideResumeActions` 影响) | 调用 `openNodeDetail(task.raw, node.raw)` |
77
77
 
78
78
  展示顺序:重试 → 跳过 → 详情。
79
79
 
80
- > **分享态过滤**:传入 `hideResumeActions`(`Ref<boolean>`,如 `RenderMode.Share`)为 `true` 时,`getNodeActions` 直接过滤掉重试 / 跳过,仅返回「详情」查看入口;用于只读分享场景放开查看、禁止交互。
80
+ > **只读场景过滤**:`hideResumeActions` `true` 时,`getNodeActions` 直接过滤掉重试 / 跳过,仅返回「详情」查看入口,用于放开查看、禁止交互的场景。`FlowAgentContent` 目前把两类只读场景并入该入参:
81
+ >
82
+ > - `RenderMode.Share` 分享态
83
+ > - 侧栏「执行情况」面板内(`ExecutionSummary` 通过 `EXECUTION_PANEL_TOKEN` 提供上下文,组件用 `useExecutionPanelInject` 读取)
81
84
 
82
85
  ## pending 态与防重复提交
83
86
 
@@ -115,9 +118,13 @@ import { toRef } from 'vue';
115
118
  import { useFlowNodeActions } from '@blueking/chat-x';
116
119
  // 或相对路径:'./use-flow-node-actions'
117
120
 
121
+ // 是否处于侧栏「执行情况」面板内;缺省 false,即对话流内渲染
122
+ // useExecutionPanelInject 来自内部 src/composables/use-common.ts,未从包入口导出
123
+ const isInExecutionPanel = useExecutionPanelInject();
124
+
118
125
  const { getNodeActions, isNodePending } = useFlowNodeActions({
119
- // 分享态只读:过滤重试 / 跳过,仅保留详情
120
- hideResumeActions: computed(() => renderMode.value === RenderMode.Share),
126
+ // 分享态与侧栏执行情况面板均只读:过滤重试 / 跳过,仅保留详情
127
+ hideResumeActions: computed(() => renderMode.value === RenderMode.Share || isInExecutionPanel),
121
128
  onInterruptResume: toRef(props, 'onInterruptResume'),
122
129
  openNodeDetail,
123
130
  });
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "2.0.0",
3
- "generatedAt": "2026-09-02T10:24:59.007Z",
3
+ "generatedAt": "2026-09-11T08:30:33.082Z",
4
4
  "domains": {
5
5
  "setup": {
6
6
  "label": "对话搭建",
@@ -139,7 +139,7 @@
139
139
  "slug": "execution-summary",
140
140
  "kind": "component",
141
141
  "description": "按消息流提取执行摘要,支持关键词定位和消息渲染。",
142
- "aiSummary": "按消息流提取执行摘要,支持关键词定位和消息渲染。 源码位置:src/components/execution-summary/execution-summary.vue。",
142
+ "aiSummary": "按消息流提取执行摘要,支持关键词定位和消息渲染。 通过 useExecutionPanelProvider 提供 EXECUTION_PANEL_TOKEN,面板内消息按只读呈现, FlowAgent 失败节点在面板内不展示重试/跳过,只保留详情。 源码位置:src/components/execution-summary/execution-summary.vue。",
143
143
  "relatedComponents": [
144
144
  {
145
145
  "slug": "message-render",
@@ -1736,7 +1736,7 @@
1736
1736
  "slug": "use-flow-node-actions",
1737
1737
  "kind": "composable",
1738
1738
  "description": "聚合 FlowAgent 节点行尾操作(详情 / 重试 / 跳过)为声明式视图模型列表,显隐与 resume 回调收敛于此。",
1739
- "aiSummary": "useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions 与 isNodePending。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击后进入 pending 防重复提交, 以 task_id:node_id:retry 为键自动收敛;点击 resume 时不传 interrupt。",
1739
+ "aiSummary": "useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions 与 isNodePending。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击后进入 pending 防重复提交, 以 task_id:node_id:retry 为键自动收敛;点击 resume 时不传 interrupt。 hideResumeActions 为 true 时只返回详情,覆盖 Share 分享态与侧栏「执行情况」面板两类只读场景。",
1740
1740
  "relatedComponents": [
1741
1741
  {
1742
1742
  "slug": "flow-agent-content",
@@ -32,3 +32,14 @@ export declare const formatFileSize: (file?: File) => string;
32
32
  * 未成功添加的文件统一提示(中文在数量为 1 时不带「n个」前缀)
33
33
  */
34
34
  export declare const formatUploadNotAddedMessage: (count: number, maxMb: string, isEn: boolean) => string;
35
+ /** 将 accept 规范串拆成去重、小写、排序后的 token,便于比较与匹配 */
36
+ export declare const normalizeAcceptTokens: (accept: string) => string[];
37
+ /** 当前 accept 是否就是对话默认允许列表(忽略顺序与大小写) */
38
+ export declare const isDefaultUploadAccept: (accept?: string) => boolean;
39
+ /** 默认允许列表的分类说明,与 ALLOWED_UPLOAD_EXTENSIONS 同源;每一类单独一行 */
40
+ export declare const formatDefaultUploadAcceptTip: (isEn: boolean) => string;
41
+ /**
42
+ * 按 input accept 规则判断文件是否允许上传。
43
+ * accept 为空表示不限制;支持扩展名、精确 mime、以及 mime 通配(含全部类型)。
44
+ */
45
+ export declare const isFileAcceptedByAccept: (file: File, accept?: string) => boolean;
@@ -3,5 +3,6 @@ export * from './file-type';
3
3
  export * from './markdown-completer';
4
4
  export * from './merge-tools-by-id';
5
5
  export { completeMarkdownSyntax } from './stream-markdown-completer';
6
+ export * from './upload-accept';
6
7
  export * from './upload-file';
7
8
  export * from './utils';
@@ -0,0 +1,9 @@
1
+ /** 对话上传允许的扩展名(含点),分类仅用于 tooltip 展示 */
2
+ export declare const ALLOWED_UPLOAD_EXTENSIONS: {
3
+ readonly image: readonly [".gif", ".jpeg", ".jpg", ".png", ".webp"];
4
+ readonly document: readonly [".doc", ".docx", ".ppt", ".pptx", ".xls", ".xlsx", ".pdf", ".epub", ".mobi", ".csv"];
5
+ readonly text: readonly [".txt", ".md", ".rst", ".log", ".json", ".xml", ".yaml", ".yml", ".toml", ".ini", ".conf", ".html", ".css", ".scss", ".sql"];
6
+ readonly code: readonly [".py", ".js", ".jsx", ".ts", ".tsx", ".vue", ".java", ".go", ".c", ".cpp", ".h", ".hpp", ".cs", ".php", ".rb", ".rs", ".kt", ".swift", ".sh", ".bash"];
7
+ };
8
+ /** 系统文件选择框 / 校验共用的默认 accept */
9
+ export declare const DEFAULT_UPLOAD_ACCEPT: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/chat-x",
3
- "version": "0.0.51-beta.4",
3
+ "version": "0.0.51",
4
4
  "description": "蓝鲸智云 AI Chat 组件库 —— 遵循 AG-UI,为 AI Agent 和人类开发者共同设计的对话 UI 组件库。",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -79,7 +79,7 @@
79
79
  "vitepress": "2.0.0-alpha.16",
80
80
  "vitest": "^4.0.18",
81
81
  "vue-tsc": "^3.1.4",
82
- "@blueking/chat-helper": "0.0.12-beta.30"
82
+ "@blueking/chat-helper": "0.0.12-beta.32"
83
83
  },
84
84
  "scripts": {
85
85
  "dev": "vite --config vite.config.ts",