@blueking/chat-x 0.0.45-beta.4 → 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 +6 -9
- 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 -2564
- 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 -153
- package/dist/mcp/generated/docs/chat-input.md +9 -45
- 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 -211
- 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,211 +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 且业务配置了 `onInterruptResume` 时,用户也可以直接在 `ChatInput` 输入文本;容器会将文本转换为单条 Others 回答。
|
|
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`,自由文本输入不会被截获,仍按普通 `onSendMessage` 发送,避免用户输入被静默清空。
|
|
145
|
-
|
|
146
|
-
## 自定义题目渲染(#question slot)
|
|
147
|
-
|
|
148
|
-
默认每道题由 [UserQuestionChoice](/components/agent/user-question-choice) 渲染;业务可覆盖 `#question` slot 接入自定义表单:
|
|
149
|
-
|
|
150
|
-
```vue
|
|
151
|
-
<template>
|
|
152
|
-
<UserQuestionCard
|
|
153
|
-
:interrupt="pendingInterrupt"
|
|
154
|
-
:on-resume="handleResume"
|
|
155
|
-
>
|
|
156
|
-
<template #question="{ question, qIndex, answer, setAnswer, confirm }">
|
|
157
|
-
<!-- 自定义表单:作答有效时 setAnswer(answerItem),无效时 setAnswer(undefined) -->
|
|
158
|
-
<MyCustomForm
|
|
159
|
-
:model="question"
|
|
160
|
-
@change="setAnswer"
|
|
161
|
-
@submit="confirm"
|
|
162
|
-
/>
|
|
163
|
-
</template>
|
|
164
|
-
</UserQuestionCard>
|
|
165
|
-
</template>
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
`ChatContainer` 提供同名 `#interruptQuestion` slot,参数与 `#question` 一致,透传自输入区上方的 `UserQuestionCard`。
|
|
169
|
-
|
|
170
|
-
## API
|
|
171
|
-
|
|
172
|
-
### UserQuestionCard Props
|
|
173
|
-
|
|
174
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
175
|
-
| --------- | ----------------------- | ------ | -------------------------------------- |
|
|
176
|
-
| interrupt | `UserQuestionInterrupt` | — | **必填**,含 `metadata.questions` |
|
|
177
|
-
| onResume | `OnInterruptResume` | — | 完成 / 跳过时触发,签名为 `(payload, interrupt)` |
|
|
178
|
-
|
|
179
|
-
### UserQuestionAnsweredCard Props
|
|
180
|
-
|
|
181
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
182
|
-
| ------- | ---------------------------- | ------------ | ---------------------------- |
|
|
183
|
-
| answers | `UserQuestionAnswerItem[]` | — | 已回答内容列表 |
|
|
184
|
-
| status | `'resolved' \| 'cancelled'` | `'resolved'` | 回显状态,决定展示已回复/已取消 |
|
|
185
|
-
|
|
186
|
-
### UserQuestionCard Slots
|
|
187
|
-
|
|
188
|
-
| 插槽名 | 参数 | 说明 |
|
|
189
|
-
| -------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
|
|
190
|
-
| question | `{ question, qIndex, answer, setAnswer, confirm }` | 自定义单题渲染;未覆盖时回退 [UserQuestionChoice](/components/agent/user-question-choice) |
|
|
191
|
-
|
|
192
|
-
slot 参数说明:
|
|
193
|
-
|
|
194
|
-
| 参数 | 类型 | 说明 |
|
|
195
|
-
| ---------- | ------------------------------------------------- | ---------------------------------------------- |
|
|
196
|
-
| question | `UserQuestionItem` | 原始题目数据 |
|
|
197
|
-
| qIndex | `number` | 题目序号(从 0 开始) |
|
|
198
|
-
| answer | `UserQuestionAnswerItem \| undefined` | 当前题已组装答案,`undefined` 表示未作答 |
|
|
199
|
-
| setAnswer | `(answer: UserQuestionAnswerItem \| undefined) => void` | 写入/清空当前题答案 |
|
|
200
|
-
| confirm | `() => void` | 触发「完成」,等价点击底部完成按钮(需全部已答) |
|
|
201
|
-
|
|
202
|
-
### Events / Expose
|
|
203
|
-
|
|
204
|
-
无。
|
|
205
|
-
|
|
206
|
-
## 关联文档
|
|
207
|
-
|
|
208
|
-
- [中断类型 Interrupt](../../types/interrupt.md)
|
|
209
|
-
- [UserQuestionChoice 选择题](/components/agent/user-question-choice)
|
|
210
|
-
- [InterruptMessage 中断消息](/components/agent/interrupt-message)
|
|
211
|
-
- [ChatContainer 聊天容器](/components/setup/chat-container)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
<!-- AI SUMMARY -->
|
|
2
|
-
## 快速了解
|
|
3
|
-
|
|
4
|
-
UserQuestionCard 默认的选择题渲染组件,封装单选/多选、Others 输入与答案组装。 源码位置:src/components/chat-message/interrupt-message/user-question/user-question-choice.vue。
|
|
5
|
-
|
|
6
|
-
### 关联组件
|
|
7
|
-
- **user-question-card** — 默认通过
|
|
8
|
-
- **user-question-option** — 内部逐条渲染选项行
|
|
9
|
-
- **interrupt** — 答案结构遵循 UserQuestionAnswerItem
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
<!-- FULL DOC -->
|
|
13
|
-
|
|
14
|
-
# UserQuestionChoice 用户问题选择题
|
|
15
|
-
|
|
16
|
-
> **能力域**:Agent 能力
|
|
17
|
-
|
|
18
|
-
## 源码事实
|
|
19
|
-
|
|
20
|
-
- **源码位置**:`src/components/chat-message/interrupt-message/user-question/user-question-choice.vue`
|
|
21
|
-
- **能力说明**:封装 UserQuestion 的选择题交互,负责选项归一化、单选/多选切换、Others 输入校验与 `UserQuestionAnswerItem` 组装。
|
|
22
|
-
|
|
23
|
-
`UserQuestionChoice` 是 [UserQuestionCard](/components/agent/user-question-card) 在 `#question` slot 未覆盖时的**默认渲染**。业务侧也可单独使用,配合 `useUserQuestion` 的 `setAnswer` 接入自定义面板。
|
|
24
|
-
|
|
25
|
-
## 交互能力
|
|
26
|
-
|
|
27
|
-
- **单选 / 多选**:由 `question.multiSelect` 控制;未传时不展示单选/多选标签,但仍按单选行为处理。
|
|
28
|
-
- **Others 自由输入**:前端自动在选项末尾追加 `label: 'others'` 输入项。
|
|
29
|
-
- **实时同步答案**:选择或输入变化时 emit `answer`;作答有效时回传已组装的 `UserQuestionAnswerItem`,无效时回传 `undefined`。
|
|
30
|
-
- **Enter 确认**:Others 输入框按 Enter 触发 `confirm`,等价于点击「完成」按钮(需上层已全部作答)。
|
|
31
|
-
|
|
32
|
-
## 基础用法(单选)
|
|
33
|
-
|
|
34
|
-
```vue
|
|
35
|
-
<template>
|
|
36
|
-
<UserQuestionChoice
|
|
37
|
-
:question="singleQuestion"
|
|
38
|
-
@answer="handleAnswer"
|
|
39
|
-
@confirm="handleConfirm"
|
|
40
|
-
/>
|
|
41
|
-
</template>
|
|
42
|
-
|
|
43
|
-
<script setup lang="ts">
|
|
44
|
-
import { UserQuestionChoice, type UserQuestionAnswerItem } from '@blueking/chat-x';
|
|
45
|
-
|
|
46
|
-
const singleQuestion = {
|
|
47
|
-
header: '请选择实现方案',
|
|
48
|
-
multiSelect: false,
|
|
49
|
-
question: '你希望采用哪种冒泡排序实现?',
|
|
50
|
-
options: [
|
|
51
|
-
{ label: 'basic', description: '基础冒泡排序' },
|
|
52
|
-
{ label: 'optimized', description: '优化版冒泡排序' },
|
|
53
|
-
],
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const handleAnswer = (answer: UserQuestionAnswerItem | undefined) => {
|
|
57
|
-
console.log(answer);
|
|
58
|
-
};
|
|
59
|
-
</script>
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**渲染效果**
|
|
63
|
-
|
|
64
|
-
## 多选
|
|
65
|
-
|
|
66
|
-
```vue
|
|
67
|
-
<UserQuestionChoice
|
|
68
|
-
:question="multiQuestion"
|
|
69
|
-
@answer="handleAnswer"
|
|
70
|
-
/>
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
**渲染效果**
|
|
74
|
-
|
|
75
|
-
## 在 UserQuestionCard 中使用
|
|
76
|
-
|
|
77
|
-
通常无需直接使用本组件;`UserQuestionCard` 默认已在 `#question` slot 回退中挂载:
|
|
78
|
-
|
|
79
|
-
```vue
|
|
80
|
-
<UserQuestionCard :interrupt="interrupt" :on-resume="handleResume" />
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
如需替换某一题的渲染,覆盖 `#question` slot 即可;未覆盖时仍回退到 `UserQuestionChoice`。
|
|
84
|
-
|
|
85
|
-
## API
|
|
86
|
-
|
|
87
|
-
### Props
|
|
88
|
-
|
|
89
|
-
| 属性名 | 类型 | 默认值 | 说明 |
|
|
90
|
-
| -------- | ------------------ | ------ | ---------------------------- |
|
|
91
|
-
| question | `UserQuestionItem` | — | **必填**,含 `options` 等字段 |
|
|
92
|
-
|
|
93
|
-
### Events
|
|
94
|
-
|
|
95
|
-
| 事件名 | 参数 | 说明 |
|
|
96
|
-
| ------- | ----------------------------------------- | ------------------------------------------------------------ |
|
|
97
|
-
| answer | `(answer: UserQuestionAnswerItem \| undefined)` | 作答变化;有效时回传已组装答案,无效(未选/ Others 空)时 `undefined` |
|
|
98
|
-
| confirm | — | 用户在 Others 输入框按 Enter 时触发,上层可绑定「完成」逻辑 |
|
|
99
|
-
|
|
100
|
-
### Slots / Expose
|
|
101
|
-
|
|
102
|
-
无。
|
|
103
|
-
|
|
104
|
-
## 关联文档
|
|
105
|
-
|
|
106
|
-
- [UserQuestionCard 用户问题中断](/components/agent/user-question-card)
|
|
107
|
-
- [UserQuestionOption 用户问题选项](/components/agent/user-question-option)
|
|
108
|
-
- [中断类型 Interrupt](../../types/interrupt.md)
|