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)
}