import type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs';
import React from 'react';
import { MessageResponse } from 'src/components/MessageResponse.js';
import { extractTag } from 'src/utils/messages.js';
import { FallbackToolUseErrorMessage } from 'src/components/FallbackToolUseErrorMessage.js';
import { TOOL_SUMMARY_MAX_LENGTH } from 'src/constants/toolLimits.js';
import { Text } from '@anthropic/ink';
import { FILE_NOT_FOUND_CWD_NOTE, getDisplayPath } from 'src/utils/file.js';
import { truncate } from 'src/utils/format.js';
import { GrepTool } from '../GrepTool/GrepTool.js';
export function userFacingName(): string {
return 'Search';
}
export function renderToolUseMessage(
{ pattern, path }: Partial<{ pattern: string; path: string }>,
{ verbose }: { verbose: boolean },
): React.ReactNode {
if (!pattern) {
return null;
}
if (!path) {
return `pattern: "${pattern}"`;
}
return `pattern: "${pattern}", path: "${verbose ? path : getDisplayPath(path)}"`;
}
export function renderToolUseErrorMessage(
result: ToolResultBlockParam['content'],
{ verbose }: { verbose: boolean },
): React.ReactNode {
if (!verbose && typeof result === 'string' && extractTag(result, 'tool_use_error')) {
const errorMessage = extractTag(result, 'tool_use_error');
if (errorMessage?.includes(FILE_NOT_FOUND_CWD_NOTE)) {
return (
File not found
);
}
return (
Error searching files
);
}
return ;
}
// Note: GlobTool reuses GrepTool's renderToolResultMessage
export const renderToolResultMessage = GrepTool.renderToolResultMessage;
export function getToolUseSummary(input: Partial<{ pattern: string; path: string }> | undefined): string | null {
if (!input?.pattern) {
return null;
}
return truncate(input.pattern, TOOL_SUMMARY_MAX_LENGTH);
}