@blueking/chat-x 0.0.45-beta.5 → 0.0.45-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ag-ui/types/constants.d.ts +0 -16
- package/dist/ag-ui/types/contents.d.ts +0 -2
- package/dist/ag-ui/types/index.d.ts +0 -2
- package/dist/ag-ui/types/messages.d.ts +0 -2
- package/dist/components/chat-content/flow-agent-content/flow-agent-content.vue.d.ts +0 -3
- package/dist/components/chat-content/flow-agent-content/use-flow-agent.d.ts +0 -4
- package/dist/components/chat-input/chat-input.vue.d.ts +8 -14
- package/dist/components/chat-input/input-attachment/input-attachment.vue.d.ts +0 -1
- package/dist/components/chat-message/activity-message/activity-message.vue.d.ts +1 -4
- package/dist/components/chat-message/assistant-message/assistant-message.vue.d.ts +1 -1
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +7 -14
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +0 -4
- package/dist/components/index.d.ts +2 -3
- package/dist/composables/use-global-config.d.ts +0 -3
- package/dist/composables/use-message-group.d.ts +823 -2609
- package/dist/icons/index.d.ts +0 -1
- package/dist/index.css +1 -1
- package/dist/index.js +1935 -2552
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +2 -34
- package/dist/mcp/generated/docs/activity-message.md +7 -21
- package/dist/mcp/generated/docs/ai-image.md +4 -9
- package/dist/mcp/generated/docs/ai-loading.md +6 -11
- package/dist/mcp/generated/docs/ai-selection.md +5 -10
- package/dist/mcp/generated/docs/animation-text.md +4 -9
- package/dist/mcp/generated/docs/assistant-message.md +5 -10
- package/dist/mcp/generated/docs/chat-container.md +19 -173
- package/dist/mcp/generated/docs/chat-input.md +10 -78
- package/dist/mcp/generated/docs/cite-content.md +3 -8
- package/dist/mcp/generated/docs/code-content.md +4 -9
- package/dist/mcp/generated/docs/common-error-content.md +5 -10
- package/dist/mcp/generated/docs/constants.md +3 -68
- package/dist/mcp/generated/docs/content-render.md +5 -10
- package/dist/mcp/generated/docs/delete-tool.md +4 -9
- package/dist/mcp/generated/docs/desc-panel.md +4 -9
- package/dist/mcp/generated/docs/execution-summary.md +5 -10
- package/dist/mcp/generated/docs/file-content.md +4 -9
- package/dist/mcp/generated/docs/file-upload-btn.md +5 -10
- package/dist/mcp/generated/docs/highlight-keyword.md +5 -10
- package/dist/mcp/generated/docs/image-content.md +4 -9
- package/dist/mcp/generated/docs/image-preview-group.md +4 -9
- package/dist/mcp/generated/docs/image-preview.md +5 -10
- package/dist/mcp/generated/docs/info-message.md +2 -7
- package/dist/mcp/generated/docs/key-value-content.md +4 -9
- package/dist/mcp/generated/docs/latex-content.md +4 -9
- package/dist/mcp/generated/docs/loading-message.md +6 -11
- package/dist/mcp/generated/docs/markdown-container.md +1 -1
- package/dist/mcp/generated/docs/markdown-content.md +8 -13
- package/dist/mcp/generated/docs/markdown-latex.md +3 -3
- package/dist/mcp/generated/docs/markdown-mermaid.md +3 -3
- package/dist/mcp/generated/docs/mermaid-content.md +4 -9
- package/dist/mcp/generated/docs/message-container.md +11 -69
- package/dist/mcp/generated/docs/message-render.md +11 -23
- package/dist/mcp/generated/docs/message-tools.md +5 -10
- package/dist/mcp/generated/docs/messages.md +11 -75
- package/dist/mcp/generated/docs/overflow-tips.md +4 -4
- package/dist/mcp/generated/docs/reasoning-message.md +5 -10
- package/dist/mcp/generated/docs/reference-content.md +5 -10
- package/dist/mcp/generated/docs/scroll-btn.md +3 -8
- package/dist/mcp/generated/docs/selection-footer.md +4 -9
- package/dist/mcp/generated/docs/shortcut-btn.md +5 -10
- package/dist/mcp/generated/docs/shortcut-btns.md +5 -10
- package/dist/mcp/generated/docs/shortcut-render.md +5 -10
- package/dist/mcp/generated/docs/text-content.md +4 -9
- package/dist/mcp/generated/docs/theme.md +4 -50
- package/dist/mcp/generated/docs/tool-btn.md +4 -9
- package/dist/mcp/generated/docs/tool-message.md +5 -10
- package/dist/mcp/generated/docs/toolcall-render.md +5 -10
- package/dist/mcp/generated/docs/use-animation-text.md +4 -4
- package/dist/mcp/generated/docs/use-clipboard.md +3 -3
- package/dist/mcp/generated/docs/use-command-selection.md +1 -1
- package/dist/mcp/generated/docs/use-custom-tab.md +1 -1
- package/dist/mcp/generated/docs/use-full-screen.md +3 -3
- package/dist/mcp/generated/docs/use-global-config.md +5 -20
- package/dist/mcp/generated/docs/use-menu-keydown.md +1 -1
- package/dist/mcp/generated/docs/use-message-group.md +9 -40
- package/dist/mcp/generated/docs/use-observer-visible-list.md +1 -1
- package/dist/mcp/generated/docs/user-feedback.md +3 -8
- package/dist/mcp/generated/docs/user-message.md +5 -10
- package/dist/mcp/generated/index.json +560 -1103
- package/dist/mcp/index.js +0 -0
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/list-components.d.ts +6 -7
- package/dist/mcp/tools/list-components.js +29 -23
- package/dist/mcp/tools/list-components.js.map +1 -1
- package/dist/mcp/tools/search-docs.js +1 -1
- package/dist/mcp/tools/search-docs.js.map +1 -1
- package/dist/mcp/utils/doc-loader.d.ts +1 -1
- package/package.json +21 -23
- package/dist/ag-ui/types/interrupt.d.ts +0 -137
- package/dist/ag-ui/types/schema.d.ts +0 -42
- package/dist/components/ai-questions/questions-container.vue.d.ts +0 -3
- package/dist/components/ai-questions/selection-question.vue.d.ts +0 -3
- package/dist/components/chat-content/flow-agent-content/use-flow-node-actions.d.ts +0 -32
- package/dist/components/chat-content/index.d.ts +0 -2
- package/dist/components/chat-input/input-info-alert.vue.d.ts +0 -6
- package/dist/components/chat-message/interrupt-message/index.d.ts +0 -2
- package/dist/components/chat-message/interrupt-message/interrupt-message.vue.d.ts +0 -17
- package/dist/components/chat-message/interrupt-message/tool-approval-card.vue.d.ts +0 -8
- package/dist/components/chat-message/interrupt-message/user-question/index.d.ts +0 -5
- package/dist/components/chat-message/interrupt-message/user-question/use-user-question.d.ts +0 -35
- package/dist/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue.d.ts +0 -25
- package/dist/components/chat-message/interrupt-message/user-question/user-question-card.vue.d.ts +0 -25
- package/dist/components/chat-message/interrupt-message/user-question/user-question-choice.vue.d.ts +0 -13
- package/dist/components/chat-message/interrupt-message/user-question/user-question-option.vue.d.ts +0 -17
- package/dist/icons/interrupt.d.ts +0 -24
- package/dist/mcp/generated/docs/activity-layout.md +0 -138
- package/dist/mcp/generated/docs/ai-prompt-list.md +0 -42
- package/dist/mcp/generated/docs/ai-slash-editor.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-input.md +0 -43
- package/dist/mcp/generated/docs/ai-slash-menu.md +0 -42
- package/dist/mcp/generated/docs/detail-section.md +0 -93
- package/dist/mcp/generated/docs/flow-agent-content.md +0 -252
- package/dist/mcp/generated/docs/flow-agent-node-detail.md +0 -240
- package/dist/mcp/generated/docs/input-attachment.md +0 -43
- package/dist/mcp/generated/docs/input-info-alert.md +0 -42
- package/dist/mcp/generated/docs/interrupt-message.md +0 -204
- package/dist/mcp/generated/docs/interrupt.md +0 -354
- package/dist/mcp/generated/docs/knowledge-rag-content.md +0 -126
- package/dist/mcp/generated/docs/message-loading.md +0 -120
- package/dist/mcp/generated/docs/preview-toolbar.md +0 -42
- package/dist/mcp/generated/docs/questions-container.md +0 -88
- package/dist/mcp/generated/docs/reference-doc-content.md +0 -112
- package/dist/mcp/generated/docs/schema.md +0 -93
- package/dist/mcp/generated/docs/selection-question.md +0 -91
- package/dist/mcp/generated/docs/simple-table.md +0 -103
- package/dist/mcp/generated/docs/tool-approval-card.md +0 -148
- package/dist/mcp/generated/docs/use-flow-node-actions.md +0 -124
- package/dist/mcp/generated/docs/user-question-answered-card.md +0 -106
- package/dist/mcp/generated/docs/user-question-card.md +0 -228
- package/dist/mcp/generated/docs/user-question-choice.md +0 -108
- package/dist/mcp/generated/docs/user-question-option.md +0 -42
- package/dist/mcp/generated/docs/vnode-renderer.md +0 -126
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
渲染 AIDevToolApproval 中断的审批信息与取消操作。 源码位置:src/components/chat-message/interrupt-message/tool-approval-card.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **interrupt-message** — InterruptMessageRender 按 reason 派发渲染
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
<!-- FULL DOC -->
|
|
11
|
-
|
|
12
|
-
# ToolApprovalCard 审批卡片
|
|
13
|
-
## 源码事实
|
|
14
|
-
|
|
15
|
-
- **源码位置**:`src/components/chat-message/interrupt-message/tool-approval-card.vue`
|
|
16
|
-
- **能力域**:Agent 能力
|
|
17
|
-
- **能力说明**:渲染 AIDevToolApproval 中断的审批信息与取消操作。
|
|
18
|
-
|
|
19
|
-
> **能力域**:Agent 能力
|
|
20
|
-
|
|
21
|
-
AI Dev 第三方工具审批(`InterruptReason.AIDevToolApproval`)专用卡片,由 [InterruptMessageRender](/components/agent/interrupt-message) 按 `reason` 动态挂载。
|
|
22
|
-
|
|
23
|
-
> **通常不需要单独引入**;仅在需要独立预览卡片样式时使用。
|
|
24
|
-
|
|
25
|
-
## 渲染结构
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
ToolApprovalCard
|
|
29
|
-
├── 标题栏:左侧色条 + 单据标题 + 复制图标 + 状态徽章(评审中/已通过/已拒绝/已撤销等)
|
|
30
|
-
├── 字段区:单据编号、提交时间
|
|
31
|
-
├── 处理人:当前处理人(overflow-tips 省略)
|
|
32
|
-
└── 操作区:查看单据详情(新窗口打开 url)、取消审批(仅 pending / draft)
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
状态徽章样式:
|
|
36
|
-
|
|
37
|
-
| `ticket.status` | 视觉 |
|
|
38
|
-
| --------------------------------------- | -------- |
|
|
39
|
-
| `pending`、`draft` | 蓝色评审中 |
|
|
40
|
-
| `approved` | 绿色通过 |
|
|
41
|
-
| `rejected`、`cancelled`、`expired`、`abandoned` | 红色终态 |
|
|
42
|
-
| `revoked` | 橙色已撤销 |
|
|
43
|
-
|
|
44
|
-
## 基础用法(待审批)
|
|
45
|
-
|
|
46
|
-
> `ToolApprovalCard` 为 `InterruptMessageRender` 内部子组件,**未从 `@blueking/chat-x` 包入口导出**。业务侧通过构造 `InterruptMessage` 触发渲染即可;下方为类型与数据结构参考。
|
|
47
|
-
|
|
48
|
-
```vue
|
|
49
|
-
<template>
|
|
50
|
-
<!-- 业务侧推荐:由 MessageRender / MessageContainer 自动渲染 -->
|
|
51
|
-
<InterruptMessageRender
|
|
52
|
-
:content="interruptMessage.content"
|
|
53
|
-
role="interrupt"
|
|
54
|
-
:status="interruptMessage.status"
|
|
55
|
-
:on-interrupt-resume="handleInterruptResume"
|
|
56
|
-
/>
|
|
57
|
-
</template>
|
|
58
|
-
|
|
59
|
-
<script setup lang="ts">
|
|
60
|
-
import {
|
|
61
|
-
InterruptMessageRender,
|
|
62
|
-
APPROVAL_STATUS,
|
|
63
|
-
InterruptReason,
|
|
64
|
-
MessageRole,
|
|
65
|
-
MessageStatus,
|
|
66
|
-
type InterruptMessage,
|
|
67
|
-
type AIDevToolApprovalInterrupt,
|
|
68
|
-
} from '@blueking/chat-x';
|
|
69
|
-
|
|
70
|
-
const interrupt: AIDevToolApprovalInterrupt = {
|
|
71
|
-
id: 'interrupt_1',
|
|
72
|
-
reason: InterruptReason.AIDevToolApproval,
|
|
73
|
-
toolCallId: 'tool_call_1',
|
|
74
|
-
metadata: {
|
|
75
|
-
ticket: {
|
|
76
|
-
approvers: ['张三', '李四'],
|
|
77
|
-
sn: 'REV-2026-04-24-001',
|
|
78
|
-
status: APPROVAL_STATUS.PENDING,
|
|
79
|
-
submit_time: '2026-04-24 14:30:15',
|
|
80
|
-
title: '算法方案评审单',
|
|
81
|
-
url: 'https://example.com/tickets/001',
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const interruptMessage: InterruptMessage = {
|
|
87
|
-
id: 'msg_1',
|
|
88
|
-
messageId: 'msg_1',
|
|
89
|
-
role: MessageRole.Interrupt,
|
|
90
|
-
status: MessageStatus.Pending,
|
|
91
|
-
content: {
|
|
92
|
-
outcome: { type: 'interrupt', interrupts: [interrupt] },
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const handleInterruptResume = async (payload, interrupt) => {
|
|
97
|
-
console.log(payload, interrupt.id);
|
|
98
|
-
};
|
|
99
|
-
</script>
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**渲染效果**(文档站直接挂载 `ToolApprovalCard` 预览卡片 UI)
|
|
103
|
-
|
|
104
|
-
## 已通过 / 已拒绝 / 已撤销
|
|
105
|
-
|
|
106
|
-
```vue
|
|
107
|
-
<div>
|
|
108
|
-
<InterruptMessageRender
|
|
109
|
-
:content="{ outcome: { type: 'interrupt', interrupts: [approvedInterrupt] } }"
|
|
110
|
-
role="interrupt"
|
|
111
|
-
/>
|
|
112
|
-
<InterruptMessageRender
|
|
113
|
-
:content="{ outcome: { type: 'interrupt', interrupts: [rejectedInterrupt] } }"
|
|
114
|
-
role="interrupt"
|
|
115
|
-
/>
|
|
116
|
-
<InterruptMessageRender
|
|
117
|
-
:content="{ outcome: { type: 'interrupt', interrupts: [revokedInterrupt] } }"
|
|
118
|
-
role="interrupt"
|
|
119
|
-
/>
|
|
120
|
-
</div>
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
**渲染效果**
|
|
124
|
-
|
|
125
|
-
## API
|
|
126
|
-
|
|
127
|
-
### Props
|
|
128
|
-
|
|
129
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
130
|
-
| ----------------- | ---------------------------- | ------ | -------------------------------------------- |
|
|
131
|
-
| interrupt | `AIDevToolApprovalInterrupt` | — | **必填**,含 `metadata.ticket` |
|
|
132
|
-
| onInterruptResume | `OnInterruptResume` | — | 取消审批时触发,签名为 `(payload, interrupt)`,payload 为 `{ operation: InterruptResumeOperation.ApprovalCancel, payload: { interrupt_id } }` |
|
|
133
|
-
|
|
134
|
-
### Events / Slots / Expose
|
|
135
|
-
|
|
136
|
-
无。打开链接、复制剪贴板在组件内部完成;取消审批通过 `onInterruptResume({ operation: InterruptResumeOperation.ApprovalCancel, payload: { interrupt_id: interrupt.id } }, interrupt)` 通知业务侧处理。
|
|
137
|
-
|
|
138
|
-
## 依赖
|
|
139
|
-
|
|
140
|
-
- `bkui-vue`:`Button`、`Loading`
|
|
141
|
-
- `useClipboard` — 复制单据
|
|
142
|
-
- `v-overflow-tips` — 处理人超长省略
|
|
143
|
-
|
|
144
|
-
## 关联组件
|
|
145
|
-
|
|
146
|
-
- [InterruptMessage 中断消息](/components/agent/interrupt-message)
|
|
147
|
-
- [中断类型 Interrupt](../../types/interrupt.md)
|
|
148
|
-
- [常量枚举 Constants](../../types/constants.md) — `APPROVAL_STATUS`、`APPROVAL_STATUS_MAP`
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
useFlowNodeActions 接收 onInterruptResume 与 openNodeDetail,返回 getNodeActions(task, node)。 失败节点按 retryable/skippable 展示重试/跳过,详情恒在末尾;点击 resume 时不传 interrupt。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **flow-agent-content** — FlowAgentContent 内部消费,驱动节点行尾按钮组渲染
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
<!-- FULL DOC -->
|
|
11
|
-
|
|
12
|
-
# useFlowNodeActions 节点行尾操作
|
|
13
|
-
|
|
14
|
-
> **分类**:composable
|
|
15
|
-
|
|
16
|
-
将 FlowAgent 节点行尾的「详情(打开侧栏)」与「重试 / 跳过(回传 Agent resume)」聚合为统一的声明式操作列表。`FlowAgentContent` 只需遍历 `getNodeActions` 返回值渲染按钮,显隐与点击行为均收敛于此 composable。
|
|
17
|
-
|
|
18
|
-
源码:`src/components/chat-content/flow-agent-content/use-flow-node-actions.ts`
|
|
19
|
-
|
|
20
|
-
## 函数签名
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
function useFlowNodeActions(options: {
|
|
24
|
-
/** resume 回调(与第三方审批取消同一回调,按 payload.operation 分流) */
|
|
25
|
-
onInterruptResume: Ref<OnInterruptResume | undefined>;
|
|
26
|
-
/** 打开节点详情侧栏(复用 useFlowTab 的能力) */
|
|
27
|
-
openNodeDetail: (task: BkFlowTask, node: BkFlowNode) => void;
|
|
28
|
-
}): {
|
|
29
|
-
getNodeActions: (task: FlowTaskVM, node: FlowNodeVM) => FlowNodeActionVM[];
|
|
30
|
-
};
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 返回值:FlowNodeActionVM
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
type FlowNodeActionId =
|
|
37
|
-
| 'detail'
|
|
38
|
-
| InterruptResumeOperation.FlowNodeRetry
|
|
39
|
-
| InterruptResumeOperation.FlowNodeSkip;
|
|
40
|
-
|
|
41
|
-
interface FlowNodeActionVM {
|
|
42
|
-
icon: Component;
|
|
43
|
-
id: FlowNodeActionId;
|
|
44
|
-
label: string;
|
|
45
|
-
run: () => void;
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
| 字段 | 说明 |
|
|
50
|
-
| ------- | ------------------------------ |
|
|
51
|
-
| `icon` | 按钮图标组件 |
|
|
52
|
-
| `id` | 唯一标识,用于 `v-for` key |
|
|
53
|
-
| `label` | 国际化文案 |
|
|
54
|
-
| `run` | 点击执行(详情或 resume) |
|
|
55
|
-
|
|
56
|
-
## 操作显隐规则
|
|
57
|
-
|
|
58
|
-
| 操作 | `id` | 显隐条件 | 点击行为 |
|
|
59
|
-
| ---- | ------------------ | ------------------------------------------ | --------------------------------------------- |
|
|
60
|
-
| 重试 | `flow_node_retry` | `convergedState === 'failed'` 且 `retryable` | 调用 `onInterruptResume`,**不传** `interrupt` |
|
|
61
|
-
| 跳过 | `flow_node_skip` | `convergedState === 'failed'` 且 `skippable` | 同上 |
|
|
62
|
-
| 详情 | `detail` | 始终(Share 模式由上层组件隐藏整组) | 调用 `openNodeDetail(task.raw, node.raw)` |
|
|
63
|
-
|
|
64
|
-
展示顺序:重试 → 跳过 → 详情。
|
|
65
|
-
|
|
66
|
-
## resume 负载格式
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
// 重试
|
|
70
|
-
onInterruptResume?.({
|
|
71
|
-
operation: InterruptResumeOperation.FlowNodeRetry,
|
|
72
|
-
payload: { node_id: node.id, task_id: task.task_id },
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
// 跳过
|
|
76
|
-
onInterruptResume?.({
|
|
77
|
-
operation: InterruptResumeOperation.FlowNodeSkip,
|
|
78
|
-
payload: { node_id: node.id, task_id: task.task_id },
|
|
79
|
-
});
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 使用示例
|
|
83
|
-
|
|
84
|
-
`FlowAgentContent` 内部用法(业务侧通常通过 `MessageRender` 传入 `onInterruptResume`,无需直接调用本 composable):
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
import { toRef } from 'vue';
|
|
88
|
-
import { useFlowNodeActions } from '@blueking/chat-x';
|
|
89
|
-
// 或相对路径:'./use-flow-node-actions'
|
|
90
|
-
|
|
91
|
-
const { getNodeActions } = useFlowNodeActions({
|
|
92
|
-
onInterruptResume: toRef(props, 'onInterruptResume'),
|
|
93
|
-
openNodeDetail,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
// 模板中
|
|
97
|
-
// v-for="action in getNodeActions(task, node)" :key="action.id"
|
|
98
|
-
// @click.stop="action.run()"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## 扩展新操作
|
|
102
|
-
|
|
103
|
-
在 `RESUME_ACTION_DEFS` 注册表中追加一项即可,需声明 `visible` 与 `operation` 枚举:
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
const RESUME_ACTION_DEFS: FlowNodeResumeActionDef[] = [
|
|
107
|
-
// 现有:重试、跳过
|
|
108
|
-
{
|
|
109
|
-
icon: MyIcon,
|
|
110
|
-
id: InterruptResumeOperation.MyNewOp, // 需先在 InterruptResumeOperation 扩展
|
|
111
|
-
label: () => t('新操作'),
|
|
112
|
-
visible: node => /* 自定义显隐 */,
|
|
113
|
-
},
|
|
114
|
-
];
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
同时在 `interrupt.ts` 扩展 `InterruptResumeOperation` 与 `FlowNodeResume` 联合类型。
|
|
118
|
-
|
|
119
|
-
## 关联文档
|
|
120
|
-
|
|
121
|
-
- [FlowAgentContent 执行内容](/components/agent/flow-agent-content) — 消费方组件
|
|
122
|
-
- [中断类型 Interrupt](/types/interrupt) — `InterruptResumeOperation`、`FlowNodeResume`、`OnInterruptResume`
|
|
123
|
-
- [ActivityMessage 活动消息](/components/message/activity-message) — `onInterruptResume` 透传链路
|
|
124
|
-
- [MessageRender 消息渲染器](/components/message/message-render) — 顶层透传入口
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
在 UserQuestion resume 成功后回显用户回答或取消状态。 源码位置:src/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **interrupt-message** — outcome.success 且 reason 为 UserQuestion 时挂载本组件
|
|
8
|
-
- **user-question-card** — 待回答面板,与本组件成对出现
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
<!-- FULL DOC -->
|
|
12
|
-
|
|
13
|
-
# UserQuestionAnsweredCard 用户问题回答回显
|
|
14
|
-
|
|
15
|
-
> **能力域**:Agent 能力
|
|
16
|
-
|
|
17
|
-
## 源码事实
|
|
18
|
-
|
|
19
|
-
- **源码位置**:`src/components/chat-message/interrupt-message/user-question/user-question-answered-card.vue`
|
|
20
|
-
- **能力说明**:在 UserQuestion resume 成功后回显用户回答或取消状态。
|
|
21
|
-
|
|
22
|
-
由 [InterruptMessageRender](/components/agent/interrupt-message) 在 `content.outcome.type === 'success'` 且 `result.reason === InterruptReason.UserQuestion` 时渲染。默认逐条展示选择题答案;业务可通过 `#answer` slot 自定义回显形态(如自定义表单字段)。
|
|
23
|
-
|
|
24
|
-
## 基础用法
|
|
25
|
-
|
|
26
|
-
```vue
|
|
27
|
-
<template>
|
|
28
|
-
<UserQuestionAnsweredCard
|
|
29
|
-
:answers="answers"
|
|
30
|
-
status="resolved"
|
|
31
|
-
/>
|
|
32
|
-
</template>
|
|
33
|
-
|
|
34
|
-
<script setup lang="ts">
|
|
35
|
-
import { UserQuestionAnsweredCard, type UserQuestionAnswerItem } from '@blueking/chat-x';
|
|
36
|
-
|
|
37
|
-
const answers: UserQuestionAnswerItem[] = [
|
|
38
|
-
{
|
|
39
|
-
question: '你希望采用哪种实现?',
|
|
40
|
-
multiSelect: false,
|
|
41
|
-
answer: [{ label: 'optimized', description: '优化版' }],
|
|
42
|
-
},
|
|
43
|
-
];
|
|
44
|
-
</script>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**渲染效果**
|
|
48
|
-
|
|
49
|
-
## 已取消(跳过)
|
|
50
|
-
|
|
51
|
-
```vue
|
|
52
|
-
<UserQuestionAnsweredCard
|
|
53
|
-
:answers="[]"
|
|
54
|
-
status="cancelled"
|
|
55
|
-
/>
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**渲染效果**
|
|
59
|
-
|
|
60
|
-
## 自定义回显(#answer slot)
|
|
61
|
-
|
|
62
|
-
当待回答阶段使用了自定义 `#question` 表单时,可通过 `#answer` slot 自定义回显:
|
|
63
|
-
|
|
64
|
-
```vue
|
|
65
|
-
<UserQuestionAnsweredCard
|
|
66
|
-
:answers="answers"
|
|
67
|
-
status="resolved"
|
|
68
|
-
>
|
|
69
|
-
<template #answer="{ item, index, status }">
|
|
70
|
-
<MyCustomAnswerView :data="item" :index="index" :status="status" />
|
|
71
|
-
</template>
|
|
72
|
-
</UserQuestionAnsweredCard>
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
`InterruptMessageRender`、`MessageRender`、`MessageContainer` 提供 `#answeredQuestion` slot,参数与 `#answer` 一致,逐层透传至本组件。使用 `ChatContainer` 时若覆盖了 `#message` 插槽,需在自定义 `MessageRender` 中继续透传 `#answeredQuestion`。
|
|
76
|
-
|
|
77
|
-
## API
|
|
78
|
-
|
|
79
|
-
### Props
|
|
80
|
-
|
|
81
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
82
|
-
| ------- | ---------------------------- | ------------ | -------------------------------------- |
|
|
83
|
-
| answers | `UserQuestionAnswerItem[]` | — | **必填**,已回答内容列表 |
|
|
84
|
-
| status | `'resolved' \| 'cancelled'` | `'resolved'` | resume 状态:`resolved` 已回复,`cancelled` 已取消(跳过) |
|
|
85
|
-
|
|
86
|
-
### Slots
|
|
87
|
-
|
|
88
|
-
| 插槽名 | 参数 | 说明 |
|
|
89
|
-
| ------ | ------------------------------------------------- | ------------------------------------------------------------ |
|
|
90
|
-
| answer | `{ item, index, status }` | 自定义单题回答回显;未覆盖时默认渲染 `answer[].description \|\| label` |
|
|
91
|
-
|
|
92
|
-
| 参数 | 类型 | 说明 |
|
|
93
|
-
| ------ | --------------------------------- | ------------------------ |
|
|
94
|
-
| item | `UserQuestionAnswerItem` | 当前题的回答数据 |
|
|
95
|
-
| index | `number` | 题目序号(从 0 开始) |
|
|
96
|
-
| status | `'resolved' \| 'cancelled'` | 与 Props.status 一致 |
|
|
97
|
-
|
|
98
|
-
### Events / Expose
|
|
99
|
-
|
|
100
|
-
无。
|
|
101
|
-
|
|
102
|
-
## 关联文档
|
|
103
|
-
|
|
104
|
-
- [InterruptMessage 中断消息](/components/agent/interrupt-message)
|
|
105
|
-
- [UserQuestionCard 用户问题中断](/components/agent/user-question-card)
|
|
106
|
-
- [中断类型 Interrupt](../../types/interrupt.md)
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
渲染 UserQuestion 中断的待回答面板,支持单选、多选、Others 与跳过。 源码位置:src/components/chat-message/interrupt-message/user-question/user-question-card.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **interrupt-message** — outcome.success 时挂载 UserQuestionAnsweredCard 回显回答
|
|
8
|
-
- **chat-container** — 检测最近待回答 UserQuestion 并把 UserQuestionCard 放在输入区上方
|
|
9
|
-
- **interrupt** — 定义 UserQuestionInterrupt 与 UserQuestionResume 协议
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
<!-- FULL DOC -->
|
|
13
|
-
|
|
14
|
-
# UserQuestionCard 用户问题中断
|
|
15
|
-
## 源码事实
|
|
16
|
-
|
|
17
|
-
- **源码位置**:`src/components/chat-message/interrupt-message/user-question/user-question-card.vue`
|
|
18
|
-
- **能力域**:Agent 能力
|
|
19
|
-
- **能力说明**:渲染 UserQuestion 中断的待回答面板,支持单选、多选、Others 与跳过。
|
|
20
|
-
|
|
21
|
-
> **能力域**:Agent 能力
|
|
22
|
-
|
|
23
|
-
`UserQuestionCard` 用于渲染 `InterruptReason.UserQuestion`(`'aidev:user_question'`)中断。它通常由 `ChatContainer` 自动挂载到 `ChatInput` 上方,用户回答后通过 `onInterruptResume(payload, interrupt)` 回传 `UserQuestionResume`。
|
|
24
|
-
|
|
25
|
-
## 交互能力
|
|
26
|
-
|
|
27
|
-
- **单选 / 多选**:每道题通过 `multiSelect` 控制选择行为;未传时不展示单选/多选标签,默认仍按单选处理。
|
|
28
|
-
- **Others 自由输入**:默认 [UserQuestionChoice](/components/agent/user-question-choice) 为每道题追加 `label: 'others'` 输入项,输入文本写入 `answer[].description`。
|
|
29
|
-
- **自定义作答形态**:通过 `#question` slot 可替换默认选择题,渲染任意表单;作答有效时调用 `setAnswer` 回传 `UserQuestionAnswerItem`,无效时传 `undefined`。
|
|
30
|
-
- **完成校验**:所有题目均已作答(`setAnswer` 收到有效答案)后才允许点击「完成」。
|
|
31
|
-
- **跳过**:点击「跳过」返回 `status: 'cancelled'` 与空 `answers`。
|
|
32
|
-
- **输入框发送**:存在待回答 UserQuestion 时,用户也可在 `ChatInput` 直接发送;`ChatContainer` 会调用 `onSendMessage` 并在第三参数附带与「跳过」等价的 skip `payload` 及 `interrupt`,输入框内容不会自动清空。
|
|
33
|
-
|
|
34
|
-
## 数据协议
|
|
35
|
-
|
|
36
|
-
待回答中断:
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
const interrupt = {
|
|
40
|
-
id: 'interrupt_user_question',
|
|
41
|
-
reason: InterruptReason.UserQuestion,
|
|
42
|
-
toolCallId: 'tool_call_user_question',
|
|
43
|
-
message: '请选择实现方案',
|
|
44
|
-
metadata: {
|
|
45
|
-
questions: [
|
|
46
|
-
{
|
|
47
|
-
header: '请选择实现方案',
|
|
48
|
-
multiSelect: false,
|
|
49
|
-
question: '你希望采用哪种冒泡排序实现?',
|
|
50
|
-
options: [
|
|
51
|
-
{ label: 'basic', description: '基础冒泡排序' },
|
|
52
|
-
{ label: 'optimized', description: '优化版冒泡排序' },
|
|
53
|
-
],
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
完成回答后生成的 resume:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const payload = {
|
|
64
|
-
interruptId: 'interrupt_user_question',
|
|
65
|
-
reason: InterruptReason.UserQuestion,
|
|
66
|
-
status: 'resolved',
|
|
67
|
-
payload: {
|
|
68
|
-
answers: [
|
|
69
|
-
{
|
|
70
|
-
question: '你希望采用哪种冒泡排序实现?',
|
|
71
|
-
multiSelect: false,
|
|
72
|
-
answer: [{ label: 'optimized', description: '优化版冒泡排序' }],
|
|
73
|
-
},
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
};
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## 基础用法
|
|
80
|
-
|
|
81
|
-
> 业务侧通常不直接使用本组件;推荐构造 `InterruptMessage` 后交给 `ChatContainer` / `MessageContainer` 渲染。下面示例用于说明组件 API 和 payload 形状。
|
|
82
|
-
|
|
83
|
-
```vue
|
|
84
|
-
<template>
|
|
85
|
-
<UserQuestionCard
|
|
86
|
-
:interrupt="pendingInterrupt"
|
|
87
|
-
:on-resume="handleResume"
|
|
88
|
-
/>
|
|
89
|
-
</template>
|
|
90
|
-
|
|
91
|
-
<script setup lang="ts">
|
|
92
|
-
import { InterruptReason, UserQuestionCard, type OnInterruptResume } from '@blueking/chat-x';
|
|
93
|
-
|
|
94
|
-
const pendingInterrupt = {
|
|
95
|
-
id: 'interrupt_user_question',
|
|
96
|
-
reason: InterruptReason.UserQuestion,
|
|
97
|
-
toolCallId: 'tool_call_user_question',
|
|
98
|
-
metadata: {
|
|
99
|
-
questions: [
|
|
100
|
-
{
|
|
101
|
-
header: '请选择实现方案',
|
|
102
|
-
multiSelect: false,
|
|
103
|
-
question: '你希望采用哪种实现?',
|
|
104
|
-
options: [{ label: 'basic', description: '基础冒泡排序' }],
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const handleResume: OnInterruptResume = async (payload, interrupt) => {
|
|
111
|
-
console.log(interrupt.id, payload);
|
|
112
|
-
};
|
|
113
|
-
</script>
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**渲染效果**
|
|
117
|
-
|
|
118
|
-
## 已回答回显
|
|
119
|
-
|
|
120
|
-
`InterruptMessageRender` 在 `content.outcome.type === 'success'` 且 `content.result.reason === InterruptReason.UserQuestion` 时,会在会话内渲染 `UserQuestionAnsweredCard`。
|
|
121
|
-
|
|
122
|
-
```vue
|
|
123
|
-
<UserQuestionAnsweredCard
|
|
124
|
-
:answers="answers"
|
|
125
|
-
status="resolved"
|
|
126
|
-
/>
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**渲染效果**
|
|
130
|
-
|
|
131
|
-
## ChatContainer 自动挂载
|
|
132
|
-
|
|
133
|
-
`ChatContainer` 内部通过 `useMessageGroup` 查找最近一条 `outcome.type === 'interrupt'` 的 `UserQuestion`,并在 `ChatInput` 的 `#interrupt` 插槽中渲染 `UserQuestionCard`:
|
|
134
|
-
|
|
135
|
-
```vue
|
|
136
|
-
<ChatContainer
|
|
137
|
-
v-model="inputValue"
|
|
138
|
-
:messages="messages"
|
|
139
|
-
:on-interrupt-resume="handleResume"
|
|
140
|
-
:on-send-message="handleSendMessage"
|
|
141
|
-
/>
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
- 卡片内「完成 / 跳过」→ `onInterruptResume(payload, interrupt)`
|
|
145
|
-
- 输入框直接发送 → `onSendMessage(content, docSchema, { interrupt, payload })`,其中 `payload` 由 `buildSkipResumePayload(interrupt)` 生成(`status: 'cancelled'`)
|
|
146
|
-
|
|
147
|
-
## 工具函数 buildSkipResumePayload
|
|
148
|
-
|
|
149
|
-
从 `@blueking/chat-x` 导出,用于构造 UserQuestion 的 skip resume(与卡片「跳过」及输入框发送时容器注入的 `options.payload` 一致):
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
import { buildSkipResumePayload, InterruptReason } from '@blueking/chat-x';
|
|
153
|
-
|
|
154
|
-
const payload = buildSkipResumePayload(interrupt);
|
|
155
|
-
// {
|
|
156
|
-
// interruptId: interrupt.id,
|
|
157
|
-
// reason: InterruptReason.UserQuestion,
|
|
158
|
-
// status: 'cancelled',
|
|
159
|
-
// payload: { answers: [] },
|
|
160
|
-
// }
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## 自定义题目渲染(#question slot)
|
|
164
|
-
|
|
165
|
-
默认每道题由 [UserQuestionChoice](/components/agent/user-question-choice) 渲染;业务可覆盖 `#question` slot 接入自定义表单:
|
|
166
|
-
|
|
167
|
-
```vue
|
|
168
|
-
<template>
|
|
169
|
-
<UserQuestionCard
|
|
170
|
-
:interrupt="pendingInterrupt"
|
|
171
|
-
:on-resume="handleResume"
|
|
172
|
-
>
|
|
173
|
-
<template #question="{ question, qIndex, answer, setAnswer, confirm }">
|
|
174
|
-
<!-- 自定义表单:作答有效时 setAnswer(answerItem),无效时 setAnswer(undefined) -->
|
|
175
|
-
<MyCustomForm
|
|
176
|
-
:model="question"
|
|
177
|
-
@change="setAnswer"
|
|
178
|
-
@submit="confirm"
|
|
179
|
-
/>
|
|
180
|
-
</template>
|
|
181
|
-
</UserQuestionCard>
|
|
182
|
-
</template>
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
`ChatContainer` 提供同名 `#interruptQuestion` slot,参数与 `#question` 一致,透传自输入区上方的 `UserQuestionCard`。
|
|
186
|
-
|
|
187
|
-
## API
|
|
188
|
-
|
|
189
|
-
### UserQuestionCard Props
|
|
190
|
-
|
|
191
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
192
|
-
| --------- | ----------------------- | ------ | -------------------------------------- |
|
|
193
|
-
| interrupt | `UserQuestionInterrupt` | — | **必填**,含 `metadata.questions` |
|
|
194
|
-
| onResume | `OnInterruptResume` | — | 完成 / 跳过时触发,签名为 `(payload, interrupt)` |
|
|
195
|
-
|
|
196
|
-
### UserQuestionAnsweredCard Props
|
|
197
|
-
|
|
198
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
199
|
-
| ------- | ---------------------------- | ------------ | ---------------------------- |
|
|
200
|
-
| answers | `UserQuestionAnswerItem[]` | — | 已回答内容列表 |
|
|
201
|
-
| status | `'resolved' \| 'cancelled'` | `'resolved'` | 回显状态,决定展示已回复/已取消 |
|
|
202
|
-
|
|
203
|
-
### UserQuestionCard Slots
|
|
204
|
-
|
|
205
|
-
| 插槽名 | 参数 | 说明 |
|
|
206
|
-
| -------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
|
|
207
|
-
| question | `{ question, qIndex, answer, setAnswer, confirm }` | 自定义单题渲染;未覆盖时回退 [UserQuestionChoice](/components/agent/user-question-choice) |
|
|
208
|
-
|
|
209
|
-
slot 参数说明:
|
|
210
|
-
|
|
211
|
-
| 参数 | 类型 | 说明 |
|
|
212
|
-
| ---------- | ------------------------------------------------- | ---------------------------------------------- |
|
|
213
|
-
| question | `UserQuestionItem` | 原始题目数据 |
|
|
214
|
-
| qIndex | `number` | 题目序号(从 0 开始) |
|
|
215
|
-
| answer | `UserQuestionAnswerItem \| undefined` | 当前题已组装答案,`undefined` 表示未作答 |
|
|
216
|
-
| setAnswer | `(answer: UserQuestionAnswerItem \| undefined) => void` | 写入/清空当前题答案 |
|
|
217
|
-
| confirm | `() => void` | 触发「完成」,等价点击底部完成按钮(需全部已答) |
|
|
218
|
-
|
|
219
|
-
### Events / Expose
|
|
220
|
-
|
|
221
|
-
无。
|
|
222
|
-
|
|
223
|
-
## 关联文档
|
|
224
|
-
|
|
225
|
-
- [中断类型 Interrupt](../../types/interrupt.md)
|
|
226
|
-
- [UserQuestionChoice 选择题](/components/agent/user-question-choice)
|
|
227
|
-
- [InterruptMessage 中断消息](/components/agent/interrupt-message)
|
|
228
|
-
- [ChatContainer 聊天容器](/components/setup/chat-container)
|