1. useAgentStream: 每轮迭代只创建一个 TraceStep, 状态转换时更新而非新建; tool_result 反向搜索包含 toolCallId 的步骤, 修复工具结果丢失 2. TraceStep: 渲染工具状态图标/结果/错误/耗时; Thought 添加 maxHeight 200+滚动; 展开状态用户操作后不被自动覆盖 3. ToolResultBlock: 移除 500 字符截断, 改为 maxHeight 300+滚动 4. ToolCallCard: 参数区域添加 overflowY auto+wordBreak
29 lines
1.6 KiB
TypeScript
29 lines
1.6 KiB
TypeScript
/**
|
|
* ToolResultBlock — 工具结果块
|
|
*/
|
|
|
|
import { Box, Typography, Stack } from '@mui/material';
|
|
import { FileText } from 'lucide-react';
|
|
import type { ToolCallInfo } from '@renderer/stores/agent-store';
|
|
import { formatDuration } from '@renderer/lib/formatters';
|
|
|
|
interface ToolResultBlockProps { toolCall: ToolCallInfo; }
|
|
|
|
export function ToolResultBlock({ toolCall }: ToolResultBlockProps): React.JSX.Element {
|
|
if (toolCall.status !== 'success' || toolCall.result == null) return <></>;
|
|
const resultStr = typeof toolCall.result === 'string' ? toolCall.result : JSON.stringify(toolCall.result, null, 2);
|
|
|
|
return (
|
|
<Box sx={{ borderRadius: 1.5, border: '1px solid', borderColor: 'divider', borderLeft: '3px solid', borderLeftColor: 'info.main', bgcolor: 'secondary.main', px: 1.5, py: 1, mb: 1, animation: 'fadeInUp 300ms ease-out' }}>
|
|
<Stack direction="row" spacing={1} sx={{ mb: 0.5, alignItems: 'center' }}>
|
|
<FileText size={12} style={{ color: '#22d3ee' }} />
|
|
<Typography variant="caption" sx={{ fontWeight: 500, color: 'text.primary' }}>{toolCall.name} 结果</Typography>
|
|
{toolCall.durationMs != null && <Typography variant="caption" sx={{ ml: 'auto', color: 'text.secondary' }}>{formatDuration(toolCall.durationMs)}</Typography>}
|
|
</Stack>
|
|
<Box component="pre" sx={{ fontSize: 11, borderRadius: 1, px: 1, py: 0.75, overflowX: 'auto', overflowY: 'auto', bgcolor: 'background.default', color: 'text.secondary', fontFamily: "'SF Mono',monospace", maxHeight: 300, m: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-all' }}>
|
|
{resultStr}
|
|
</Box>
|
|
</Box>
|
|
);
|
|
}
|