71 lines
2.2 KiB
TypeScript
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>
|
|
);
|
|
}
|