claude-code-best/src/components/messages/AdvisorMessage.tsx
2026-05-01 21:39:30 +08:00

71 lines
2.2 KiB
TypeScript

import figures from 'figures';
import React from 'react';
import { Box, Text } from '@anthropic/ink';
import type { AdvisorBlock } from '../../utils/advisor.js';
import { renderModelName } from '../../utils/model/model.js';
import { jsonStringify } from '../../utils/slowOperations.js';
import { CtrlOToExpand } from '../CtrlOToExpand.js';
import { MessageResponse } from '../MessageResponse.js';
import { ToolUseLoader } from '../ToolUseLoader.js';
type Props = {
block: AdvisorBlock;
addMargin: boolean;
resolvedToolUseIDs: Set<string>;
erroredToolUseIDs: Set<string>;
shouldAnimate: boolean;
verbose: boolean;
advisorModel?: string;
};
export function AdvisorMessage({
block,
addMargin,
resolvedToolUseIDs,
erroredToolUseIDs,
shouldAnimate,
verbose,
advisorModel,
}: Props): React.ReactNode {
if (block.type === 'server_tool_use') {
const input = block.input && Object.keys(block.input).length > 0 ? jsonStringify(block.input) : null;
return (
<Box marginTop={addMargin ? 1 : 0} paddingRight={2} flexDirection="row">
<ToolUseLoader
shouldAnimate={shouldAnimate}
isUnresolved={!resolvedToolUseIDs.has(block.id)}
isError={erroredToolUseIDs.has(block.id)}
/>
<Text bold>Advising</Text>
{advisorModel ? <Text dimColor> using {renderModelName(advisorModel)}</Text> : null}
{input ? <Text dimColor> · {input}</Text> : null}
</Box>
);
}
let body: React.ReactNode;
switch (block.content.type) {
case 'advisor_tool_result_error':
body = <Text color="error">Advisor unavailable ({block.content.error_code})</Text>;
break;
case 'advisor_result':
body = verbose ? (
<Text dimColor>{block.content.text}</Text>
) : (
<Text dimColor>
{figures.tick} Advisor has reviewed the conversation and will apply the feedback <CtrlOToExpand />
</Text>
);
break;
case 'advisor_redacted_result':
body = <Text dimColor>{figures.tick} Advisor has reviewed the conversation and will apply the feedback</Text>;
break;
}
return (
<Box paddingRight={2}>
<MessageResponse>{body}</MessageResponse>
</Box>
);
}