import React from 'react'; import { MessageResponse } from '../../components/MessageResponse.js'; import { TOOL_SUMMARY_MAX_LENGTH } from '../../constants/toolLimits.js'; import { Box, Text } from '../../ink.js'; import type { ProgressMessage } from '../../types/message.js'; import { truncate } from '../../utils/format.js'; import type { Output, SearchResult, WebSearchProgress } from './WebSearchTool.js'; function getSearchSummary(results: (SearchResult | string | null | undefined)[]): { searchCount: number; totalResultCount: number; } { let searchCount = 0; let totalResultCount = 0; for (const result of results) { if (result != null && typeof result !== 'string') { searchCount++; totalResultCount += result.content?.length ?? 0; } } return { searchCount, totalResultCount }; } export function renderToolUseMessage({ query, allowed_domains, blocked_domains }: Partial<{ query: string; allowed_domains?: string[]; blocked_domains?: string[]; }>, { verbose }: { verbose: boolean; }): React.ReactNode { if (!query) { return null; } let message = ''; if (query) { message += `"${query}"`; } if (verbose) { if (allowed_domains && allowed_domains.length > 0) { message += `, only allowing domains: ${allowed_domains.join(', ')}`; } if (blocked_domains && blocked_domains.length > 0) { message += `, blocking domains: ${blocked_domains.join(', ')}`; } } return message; } export function renderToolUseProgressMessage(progressMessages: ProgressMessage[]): React.ReactNode { if (progressMessages.length === 0) { return null; } const lastProgress = progressMessages[progressMessages.length - 1]; if (!lastProgress?.data) { return null; } const data = lastProgress.data; switch (data.type) { case 'query_update': return Searching: {data.query} ; case 'search_results_received': return Found {data.resultCount} results for "{data.query}" ; default: return null; } } export function renderToolResultMessage(output: Output): React.ReactNode { const { searchCount } = getSearchSummary(output.results ?? []); const timeDisplay = output.durationSeconds >= 1 ? `${Math.round(output.durationSeconds)}s` : `${Math.round(output.durationSeconds * 1000)}ms`; return Did {searchCount} search {searchCount !== 1 ? 'es' : ''} in {timeDisplay} ; } export function getToolUseSummary(input: Partial<{ query: string; }> | undefined): string | null { if (!input?.query) { return null; } return truncate(input.query, TOOL_SUMMARY_MAX_LENGTH); }