diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashOutputTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashOutputTool.tsx index 8c4402436c..71fa6307d2 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashOutputTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashOutputTool.tsx @@ -1,4 +1,5 @@ -import { AccordionItem, Chip, Code } from '@heroui/react' +import type { CollapseProps } from 'antd' +import { Tag } from 'antd' import { CheckCircle, Terminal, XCircle } from 'lucide-react' import { useMemo } from 'react' @@ -15,7 +16,13 @@ interface ParsedBashOutput { tool_use_error?: string } -export function BashOutputTool({ input, output }: { input: BashOutputToolInput; output?: BashOutputToolOutput }) { +export function BashOutputTool({ + input, + output +}: { + input: BashOutputToolInput + output?: BashOutputToolOutput +}): NonNullable[number] { // 解析 XML 输出 const parsedOutput = useMemo(() => { if (!output) return null @@ -84,93 +91,88 @@ export function BashOutputTool({ input, output }: { input: BashOutputToolInput; } as const }, [parsedOutput]) - return ( - + {/* Status Info */} +
+ {parsedOutput.exit_code !== undefined && ( + Exit Code: {parsedOutput.exit_code} + )} + {parsedOutput.timestamp && ( + {new Date(parsedOutput.timestamp).toLocaleString()} + )} +
+ + {/* Standard Output */} + {parsedOutput.stdout && ( +
+
stdout:
+
+            {parsedOutput.stdout}
+          
+
+ )} + + {/* Standard Error */} + {parsedOutput.stderr && ( +
+
stderr:
+
+            {parsedOutput.stderr}
+          
+
+ )} + + {/* Tool Use Error */} + {parsedOutput.tool_use_error && ( +
+
+ + Error: +
+
+            {parsedOutput.tool_use_error}
+          
+
+ )} + + ) : ( + // 原始输出(如果解析失败或非 XML 格式) + output && ( +
+
{output}
+
+ ) + ) + return { + key: AgentToolsType.BashOutput, + label: ( + <> } label="Bash Output" params={
- - {input.bash_id} - + {input.bash_id} {statusConfig && ( - + icon={statusConfig.icon} + style={{ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + gap: '2px' + }}> {statusConfig.text} - + )}
} /> - } - classNames={{ - content: 'space-y-3 px-1' - }}> - {parsedOutput ? ( - <> - {/* Status Info */} -
- {parsedOutput.exit_code !== undefined && ( - - Exit Code: {parsedOutput.exit_code} - - )} - {parsedOutput.timestamp && ( - - {new Date(parsedOutput.timestamp).toLocaleString()} - - )} -
+ + ), - {/* Standard Output */} - {parsedOutput.stdout && ( -
-
stdout:
-
-                {parsedOutput.stdout}
-              
-
- )} - - {/* Standard Error */} - {parsedOutput.stderr && ( -
-
stderr:
-
-                {parsedOutput.stderr}
-              
-
- )} - - {/* Tool Use Error */} - {parsedOutput.tool_use_error && ( -
-
- - Error: -
-
-                {parsedOutput.tool_use_error}
-              
-
- )} - - ) : ( - // 原始输出(如果解析失败或非 XML 格式) - output && ( -
-
{output}
-
- ) - )} -
- ) + children: children + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashTool.tsx index aad9c7ab32..d92b6461a4 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/BashTool.tsx @@ -1,31 +1,35 @@ -import { AccordionItem, Code } from '@heroui/react' +import type { CollapseProps } from 'antd' +import { Tag } from 'antd' import { Terminal } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { BashToolInput as BashToolInputType, BashToolOutput as BashToolOutputType } from './types' -export function BashTool({ input, output }: { input: BashToolInputType; output?: BashToolOutputType }) { +export function BashTool({ + input, + output +}: { + input: BashToolInputType + output?: BashToolOutputType +}): NonNullable[number] { // 如果有输出,计算输出行数 const outputLines = output ? output.split('\n').length : 0 - return ( - } label="Bash" params={input.description} stats={output ? `${outputLines} ${outputLines === 1 ? 'line' : 'lines'}` : undefined} /> - } - subtitle={ - - {input.command} - - }> -
{output}
-
- ) +
+ {input.command} +
+ + ), + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/EditTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/EditTool.tsx index c3c1f9dc5b..a49a89664d 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/EditTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/EditTool.tsx @@ -1,4 +1,4 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FileEdit } from 'lucide-react' import { ToolTitle } from './GenericTools' @@ -28,19 +28,26 @@ export const renderCodeBlock = (content: string, variant: 'old' | 'new') => { ) } -export function EditTool({ input, output }: { input: EditToolInput; output?: EditToolOutput }) { - return ( - } label="Edit" params={input.file_path} />}> - {/* Diff View */} - {/* Old Content */} - {renderCodeBlock(input.old_string, 'old')} - {/* New Content */} - {renderCodeBlock(input.new_string, 'new')} - {/* Output */} - {output} - - ) +export function EditTool({ + input, + output +}: { + input: EditToolInput + output?: EditToolOutput +}): NonNullable[number] { + return { + key: AgentToolsType.Edit, + label: } label="Edit" params={input.file_path} />, + children: ( + <> + {/* Diff View */} + {/* Old Content */} + {renderCodeBlock(input.old_string, 'old')} + {/* New Content */} + {renderCodeBlock(input.new_string, 'new')} + {/* Output */} + {output} + + ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ExitPlanModeTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ExitPlanModeTool.tsx index 1769c384f0..0c0a4ec4a7 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ExitPlanModeTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ExitPlanModeTool.tsx @@ -1,4 +1,4 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { DoorOpen } from 'lucide-react' import ReactMarkdown from 'react-markdown' @@ -6,19 +6,22 @@ import { ToolTitle } from './GenericTools' import type { ExitPlanModeToolInput, ExitPlanModeToolOutput } from './types' import { AgentToolsType } from './types' -export function ExitPlanModeTool({ input, output }: { input: ExitPlanModeToolInput; output?: ExitPlanModeToolOutput }) { - return ( - } - label="ExitPlanMode" - stats={`${input.plan.split('\n\n').length} plans`} - /> - }> - {{input.plan + '\n\n' + (output ?? '')}} - - ) +export function ExitPlanModeTool({ + input, + output +}: { + input: ExitPlanModeToolInput + output?: ExitPlanModeToolOutput +}): NonNullable[number] { + return { + key: AgentToolsType.ExitPlanMode, + label: ( + } + label="ExitPlanMode" + stats={`${input.plan.split('\n\n').length} plans`} + /> + ), + children: {input.plan + '\n\n' + (output ?? '')} + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx index d9e151567e..97e816be1d 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GlobTool.tsx @@ -1,26 +1,29 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FolderSearch } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { GlobToolInput as GlobToolInputType, GlobToolOutput as GlobToolOutputType } from './types' -export function GlobTool({ input, output }: { input: GlobToolInputType; output?: GlobToolOutputType }) { +export function GlobTool({ + input, + output +}: { + input: GlobToolInputType + output?: GlobToolOutputType +}): NonNullable[number] { // 如果有输出,计算文件数量 const lineCount = output ? output.split('\n').filter((line) => line.trim()).length : 0 - return ( - } - label="Glob" - params={input.pattern} - stats={output ? `${lineCount} of output` : undefined} - /> - }> -
{output}
-
- ) + return { + key: 'tool', + label: ( + } + label="Glob" + params={input.pattern} + stats={output ? `${lineCount} ${lineCount === 1 ? 'file' : 'files'}` : undefined} + /> + ), + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GrepTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GrepTool.tsx index 92e1530c74..dbf7e0bbf1 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GrepTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/GrepTool.tsx @@ -1,31 +1,34 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FileSearch } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { GrepToolInput, GrepToolOutput } from './types' -export function GrepTool({ input, output }: { input: GrepToolInput; output?: GrepToolOutput }) { +export function GrepTool({ + input, + output +}: { + input: GrepToolInput + output?: GrepToolOutput +}): NonNullable[number] { // 如果有输出,计算结果行数 const resultLines = output ? output.split('\n').filter((line) => line.trim()).length : 0 - return ( - } - label="Grep" - params={ - <> - {input.pattern} - {input.output_mode && ({input.output_mode})} - - } - stats={output ? `${resultLines} ${resultLines === 1 ? 'line' : 'lines'}` : undefined} - /> - }> -
{output}
-
- ) + return { + key: 'tool', + label: ( + } + label="Grep" + params={ + <> + {input.pattern} + {input.output_mode && ({input.output_mode})} + + } + stats={output ? `${resultLines} ${resultLines === 1 ? 'line' : 'lines'}` : undefined} + /> + ), + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/MultiEditTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/MultiEditTool.tsx index 033fe84676..546fd439dc 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/MultiEditTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/MultiEditTool.tsx @@ -1,4 +1,4 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FileText } from 'lucide-react' import { renderCodeBlock } from './EditTool' @@ -6,18 +6,24 @@ import { ToolTitle } from './GenericTools' import type { MultiEditToolInput, MultiEditToolOutput } from './types' import { AgentToolsType } from './types' -export function MultiEditTool({ input }: { input: MultiEditToolInput; output?: MultiEditToolOutput }) { - return ( - } label="MultiEdit" params={input.file_path} />}> - {input.edits.map((edit, index) => ( -
- {renderCodeBlock(edit.old_string, 'old')} - {renderCodeBlock(edit.new_string, 'new')} -
- ))} -
- ) +export function MultiEditTool({ + input +}: { + input: MultiEditToolInput + output?: MultiEditToolOutput +}): NonNullable[number] { + return { + key: AgentToolsType.MultiEdit, + label: } label="MultiEdit" params={input.file_path} />, + children: ( +
+ {input.edits.map((edit, index) => ( +
+ {renderCodeBlock(edit.old_string, 'old')} + {renderCodeBlock(edit.new_string, 'new')} +
+ ))} +
+ ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/NotebookEditTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/NotebookEditTool.tsx index f15664969c..8f9eb36a2e 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/NotebookEditTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/NotebookEditTool.tsx @@ -1,4 +1,5 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' +import { Tag } from 'antd' import { FileText } from 'lucide-react' import ReactMarkdown from 'react-markdown' @@ -6,14 +7,23 @@ import { ToolTitle } from './GenericTools' import type { NotebookEditToolInput, NotebookEditToolOutput } from './types' import { AgentToolsType } from './types' -export function NotebookEditTool({ input, output }: { input: NotebookEditToolInput; output?: NotebookEditToolOutput }) { - return ( - } label="NotebookEdit" />} - subtitle={input.notebook_path}> - {output} - - ) +export function NotebookEditTool({ + input, + output +}: { + input: NotebookEditToolInput + output?: NotebookEditToolOutput +}): NonNullable[number] { + return { + key: AgentToolsType.NotebookEdit, + label: ( + <> + } label="NotebookEdit" /> + + {input.notebook_path}{' '} + + + ), + children: {output} + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ReadTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ReadTool.tsx index e8f973c822..0b665a9fd4 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ReadTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/ReadTool.tsx @@ -1,4 +1,4 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FileText } from 'lucide-react' import { useMemo } from 'react' import ReactMarkdown from 'react-markdown' @@ -7,7 +7,13 @@ import { ToolTitle } from './GenericTools' import type { ReadToolInput as ReadToolInputType, ReadToolOutput as ReadToolOutputType, TextOutput } from './types' import { AgentToolsType } from './types' -export function ReadTool({ input, output }: { input: ReadToolInputType; output?: ReadToolOutputType }) { +export function ReadTool({ + input, + output +}: { + input: ReadToolInputType + output?: ReadToolOutputType +}): NonNullable[number] { // 移除 system-reminder 标签及其内容的辅助函数 const removeSystemReminderTags = (text: string): string => { // 使用正则表达式匹配 标签及其内容,包括换行符 @@ -53,19 +59,16 @@ export function ReadTool({ input, output }: { input: ReadToolInputType; output?: } }, [outputString]) - return ( - } - label="Read File" - params={input.file_path.split('/').pop()} - stats={stats ? `${stats.lineCount} lines, ${stats.formatSize(stats.fileSize)}` : undefined} - /> - }> - {outputString ? {outputString} : null} - - ) + return { + key: AgentToolsType.Read, + label: ( + } + label="Read File" + params={input.file_path.split('/').pop()} + stats={stats ? `${stats.lineCount} lines, ${stats.formatSize(stats.fileSize)}` : undefined} + /> + ), + children: outputString ? {outputString} : null + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SearchTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SearchTool.tsx index ea569159f1..8eda9dea5f 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SearchTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SearchTool.tsx @@ -1,25 +1,30 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { Search } from 'lucide-react' import { StringInputTool, StringOutputTool, ToolTitle } from './GenericTools' import type { SearchToolInput as SearchToolInputType, SearchToolOutput as SearchToolOutputType } from './types' -export function SearchTool({ input, output }: { input: SearchToolInputType; output?: SearchToolOutputType }) { +export function SearchTool({ + input, + output +}: { + input: SearchToolInputType + output?: SearchToolOutputType +}): NonNullable[number] { // 如果有输出,计算结果数量 const resultCount = output ? output.split('\n').filter((line) => line.trim()).length : 0 - return ( - } - label="Search" - params={`"${input}"`} - stats={output ? `${resultCount} ${resultCount === 1 ? 'result' : 'results'}` : undefined} - /> - }> + return { + key: 'tool', + label: ( + } + label="Search" + params={`"${input}"`} + stats={output ? `${resultCount} ${resultCount === 1 ? 'result' : 'results'}` : undefined} + /> + ), + children: (
{output && ( @@ -28,6 +33,6 @@ export function SearchTool({ input, output }: { input: SearchToolInputType; outp
)} -
- ) + ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SkillTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SkillTool.tsx index 2c68beb184..1c0651a9e1 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SkillTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/SkillTool.tsx @@ -1,16 +1,19 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { PencilRuler } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { SkillToolInput, SkillToolOutput } from './types' -export function SkillTool({ input, output }: { input: SkillToolInput; output?: SkillToolOutput }) { - return ( - } label="Skill" params={input.command} />}> - {output} - - ) +export function SkillTool({ + input, + output +}: { + input: SkillToolInput + output?: SkillToolOutput +}): NonNullable[number] { + return { + key: 'tool', + label: } label="Skill" params={input.command} />, + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TaskTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TaskTool.tsx index 1ca31bf1d2..2c5a4a1c73 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TaskTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TaskTool.tsx @@ -1,21 +1,28 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { Bot } from 'lucide-react' import Markdown from 'react-markdown' import { ToolTitle } from './GenericTools' import type { TaskToolInput as TaskToolInputType, TaskToolOutput as TaskToolOutputType } from './types' -export function TaskTool({ input, output }: { input: TaskToolInputType; output?: TaskToolOutputType }) { - return ( - } label="Task" params={input.description} />}> - {output?.map((item) => ( -
-
{item.type === 'text' ? {item.text} : item.text}
-
- ))} -
- ) +export function TaskTool({ + input, + output +}: { + input: TaskToolInputType + output?: TaskToolOutputType +}): NonNullable[number] { + return { + key: 'tool', + label: } label="Task" params={input.description} />, + children: ( +
+ {output?.map((item) => ( +
+
{item.type === 'text' ? {item.text} : item.text}
+
+ ))} +
+ ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TodoWriteTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TodoWriteTool.tsx index bdc024c73b..b11f73793b 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TodoWriteTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/TodoWriteTool.tsx @@ -1,4 +1,6 @@ -import { AccordionItem, Card, CardBody, Chip } from '@heroui/react' +import { cn } from '@renderer/utils' +import type { CollapseProps } from 'antd' +import { Card } from 'antd' import { CheckCircle, Circle, Clock, ListTodo } from 'lucide-react' import { ToolTitle } from './GenericTools' @@ -30,44 +32,59 @@ const getStatusConfig = (status: TodoItem['status']) => { } } -export function TodoWriteTool({ input }: { input: TodoWriteToolInputType }) { +export function TodoWriteTool({ + input +}: { + input: TodoWriteToolInputType +}): NonNullable[number] { const doneCount = input.todos.filter((todo) => todo.status === 'completed').length - return ( - } - label="Todo Write" - params={`${doneCount} Done`} - stats={`${input.todos.length} ${input.todos.length === 1 ? 'item' : 'items'}`} - /> - }> + + return { + key: AgentToolsType.TodoWrite, + label: ( + } + label="Todo Write" + params={`${doneCount} Done`} + stats={`${input.todos.length} ${input.todos.length === 1 ? 'item' : 'items'}`} + /> + ), + children: (
{input.todos.map((todo, index) => { const statusConfig = getStatusConfig(todo.status) return ( - - -
- - {statusConfig.icon} - -
-
- {todo.status === 'completed' ? {todo.content} : todo.content} +
+ +
+
+
+ {statusConfig.icon} +
+
+
+ {todo.status === 'completed' ? {todo.content} : todo.content} +
+ {todo.status === 'in_progress' && ( +
{todo.activeForm}
+ )}
- {todo.status === 'in_progress' && ( -
{todo.activeForm}
- )}
- -
+ +
) })}
- - ) + ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/UnknownToolRenderer.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/UnknownToolRenderer.tsx index ad26caa549..969eda9507 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/UnknownToolRenderer.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/UnknownToolRenderer.tsx @@ -1,5 +1,5 @@ -import { AccordionItem } from '@heroui/react' import { useCodeStyle } from '@renderer/context/CodeStyleProvider' +import type { CollapseProps } from 'antd' import { Wrench } from 'lucide-react' import { useEffect, useState } from 'react' @@ -11,7 +11,11 @@ interface UnknownToolProps { output?: unknown } -export function UnknownToolRenderer({ toolName = '', input, output }: UnknownToolProps) { +export function UnknownToolRenderer({ + toolName = '', + input, + output +}: UnknownToolProps): NonNullable[number] { const { highlightCode } = useCodeStyle() const [inputHtml, setInputHtml] = useState('') const [outputHtml, setOutputHtml] = useState('') @@ -47,17 +51,16 @@ export function UnknownToolRenderer({ toolName = '', input, output }: UnknownToo return 'Tool' } - return ( - } - label={getToolDisplayName(toolName)} - params={getToolDescription()} - /> - }> + return { + key: 'unknown-tool', + label: ( + } + label={getToolDisplayName(toolName)} + params={getToolDescription()} + /> + ), + children: (
{input !== undefined && (
@@ -83,6 +86,6 @@ export function UnknownToolRenderer({ toolName = '', input, output }: UnknownToo
No data available for this tool
)}
- - ) + ) + } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebFetchTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebFetchTool.tsx index 329be3d373..f54c541459 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebFetchTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebFetchTool.tsx @@ -1,17 +1,19 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { Globe } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { WebFetchToolInput, WebFetchToolOutput } from './types' -export function WebFetchTool({ input, output }: { input: WebFetchToolInput; output?: WebFetchToolOutput }) { - return ( - } label="Web Fetch" params={input.url} />} - subtitle={input.prompt}> - {output} - - ) +export function WebFetchTool({ + input, + output +}: { + input: WebFetchToolInput + output?: WebFetchToolOutput +}): NonNullable[number] { + return { + key: 'tool', + label: } label="Web Fetch" params={input.url} />, + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebSearchTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebSearchTool.tsx index ea38e3d3ce..7042c63afb 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebSearchTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WebSearchTool.tsx @@ -1,26 +1,29 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { Globe } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { WebSearchToolInput, WebSearchToolOutput } from './types' -export function WebSearchTool({ input, output }: { input: WebSearchToolInput; output?: WebSearchToolOutput }) { +export function WebSearchTool({ + input, + output +}: { + input: WebSearchToolInput + output?: WebSearchToolOutput +}): NonNullable[number] { // 如果有输出,计算结果数量 const resultCount = output ? output.split('\n').filter((line) => line.trim()).length : 0 - return ( - } - label="Web Search" - params={input.query} - stats={output ? `${resultCount} ${resultCount === 1 ? 'result' : 'results'}` : undefined} - /> - }> - {output} - - ) + return { + key: 'tool', + label: ( + } + label="Web Search" + params={input.query} + stats={output ? `${resultCount} ${resultCount === 1 ? 'result' : 'results'}` : undefined} + /> + ), + children:
{output}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WriteTool.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WriteTool.tsx index 08644c1c5b..d035163dcc 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WriteTool.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/WriteTool.tsx @@ -1,16 +1,18 @@ -import { AccordionItem } from '@heroui/react' +import type { CollapseProps } from 'antd' import { FileText } from 'lucide-react' import { ToolTitle } from './GenericTools' import type { WriteToolInput, WriteToolOutput } from './types' -export function WriteTool({ input }: { input: WriteToolInput; output?: WriteToolOutput }) { - return ( - } label="Write" params={input.file_path} />}> -
{input.content}
-
- ) +export function WriteTool({ + input +}: { + input: WriteToolInput + output?: WriteToolOutput +}): NonNullable[number] { + return { + key: 'tool', + label: } label="Write" params={input.file_path} />, + children:
{input.content}
+ } } diff --git a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx index 8d1f5eee8f..6ffb5024eb 100644 --- a/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx +++ b/src/renderer/src/pages/home/Messages/Tools/MessageAgentTools/index.tsx @@ -1,10 +1,13 @@ -import { Accordion } from '@heroui/react' import { loggerService } from '@logger' import type { NormalToolResponse } from '@renderer/types' +import type { CollapseProps } from 'antd' +import { Collapse } from 'antd' // 导出所有类型 export * from './types' +import { useMemo } from 'react' + // 导入所有渲染器 import ToolPermissionRequestCard from '../ToolPermissionRequestCard' import { BashOutputTool } from './BashOutputTool' @@ -58,24 +61,27 @@ export function isValidAgentToolsType(toolName: unknown): toolName is AgentTools function renderToolContent(toolName: AgentToolsType, input: ToolInput, output?: ToolOutput) { const Renderer = toolRenderers[toolName] + // eslint-disable-next-line react-hooks/rules-of-hooks + const toolContentItem = useMemo(() => { + const rendered = Renderer + ? Renderer({ input: input as any, output: output as any }) + : UnknownToolRenderer({ input: input as any, output: output as any, toolName }) + return { + ...rendered, + classNames: { + body: 'bg-foreground-50 p-2 text-foreground-900 dark:bg-foreground-100 max-h-96 p-2 overflow-scroll' + } as NonNullable[number]['classNames'] + } as NonNullable[number] + }, [Renderer, input, output, toolName]) + return (
- div:first-child]:!flex-none [&>div:first-child]:flex [&>div:first-child]:flex-col [&>div:first-child]:text-start [&>div:first-child]:max-w-full', - indicator: 'flex-shrink-0', - subtitle: 'text-xs', - content: - 'rounded-md bg-foreground-50 p-2 text-foreground-900 dark:bg-foreground-100 max-h-96 p-2 overflow-scroll', - base: 'space-y-1' - }} - defaultExpandedKeys={toolName === AgentToolsType.TodoWrite ? [AgentToolsType.TodoWrite] : []}> - {Renderer - ? Renderer({ input: input as any, output: output as any }) - : UnknownToolRenderer({ input: input as any, output: output as any, toolName })} - + expandIconPosition="end" + defaultActiveKey={toolName === AgentToolsType.TodoWrite ? [AgentToolsType.TodoWrite] : []} + items={[toolContentItem]} + />
) }