summaryrefslogtreecommitdiff
path: root/packages/cli/src/ui/components/messages/ToolMessage.tsx
blob: 38bc3de16152c2207d734ff2995bb19e31ff0e79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import React from 'react';
import { Box, Text } from 'ink';
import Spinner from 'ink-spinner';
import { ToolCallStatus } from '../../types.js';
import { ToolResultDisplay } from '../../../tools/ToolResult.js';
import DiffRenderer from './DiffRenderer.js';
import { MarkdownRenderer } from '../../utils/MarkdownRenderer.js';

interface ToolMessageProps {
    name: string;
    description: string;
    resultDisplay: ToolResultDisplay | undefined;
    status: ToolCallStatus;
}

const ToolMessage: React.FC<ToolMessageProps> = ({ name, description, resultDisplay, status }) => {
    const statusIndicatorWidth = 3;
    const hasResult = (status === ToolCallStatus.Invoked || status === ToolCallStatus.Canceled) && resultDisplay && resultDisplay.toString().trim().length > 0;

    return (
        <Box paddingX={1} paddingY={0} flexDirection="column">
            {/* Row for Status Indicator and Tool Info */}
            <Box minHeight={1}>
                {/* Status Indicator */}
                <Box minWidth={statusIndicatorWidth}>
                    {status === ToolCallStatus.Pending && <Spinner type="dots" />}
                    {status === ToolCallStatus.Invoked && <Text color="green">✔</Text>}
                    {status === ToolCallStatus.Confirming && <Text color="blue">?</Text>}
                    {status === ToolCallStatus.Canceled && <Text color="red" bold>-</Text>}

                </Box>
                <Box>
                     <Text color="blue" wrap="truncate-end" strikethrough={status === ToolCallStatus.Canceled}>
                        <Text bold>{name}</Text> <Text color="gray">{description}</Text>
                    </Text>
                </Box>
            </Box>

            {hasResult && (
                <Box paddingLeft={statusIndicatorWidth}>
                    <Box flexShrink={1} flexDirection="row">
                        <Text color="gray">↳ </Text>
                        {/* Use default text color (white) or gray instead of dimColor */}
                        {typeof resultDisplay === 'string' && <Box flexDirection='column'>{MarkdownRenderer.render(resultDisplay)}</Box>}
                        {typeof resultDisplay === 'object' && <DiffRenderer diffContent={resultDisplay.fileDiff} />}
                    </Box>
                </Box>
            )}
        </Box>
    );
};

export default ToolMessage;