source dump of claude code
at main 101 lines 12 kB view raw
1import React from 'react'; 2import { MessageResponse } from '../../components/MessageResponse.js'; 3import { TOOL_SUMMARY_MAX_LENGTH } from '../../constants/toolLimits.js'; 4import { Box, Text } from '../../ink.js'; 5import type { ProgressMessage } from '../../types/message.js'; 6import { truncate } from '../../utils/format.js'; 7import type { Output, SearchResult, WebSearchProgress } from './WebSearchTool.js'; 8function getSearchSummary(results: (SearchResult | string | null | undefined)[]): { 9 searchCount: number; 10 totalResultCount: number; 11} { 12 let searchCount = 0; 13 let totalResultCount = 0; 14 for (const result of results) { 15 if (result != null && typeof result !== 'string') { 16 searchCount++; 17 totalResultCount += result.content?.length ?? 0; 18 } 19 } 20 return { 21 searchCount, 22 totalResultCount 23 }; 24} 25export function renderToolUseMessage({ 26 query, 27 allowed_domains, 28 blocked_domains 29}: Partial<{ 30 query: string; 31 allowed_domains?: string[]; 32 blocked_domains?: string[]; 33}>, { 34 verbose 35}: { 36 verbose: boolean; 37}): React.ReactNode { 38 if (!query) { 39 return null; 40 } 41 let message = ''; 42 if (query) { 43 message += `"${query}"`; 44 } 45 if (verbose) { 46 if (allowed_domains && allowed_domains.length > 0) { 47 message += `, only allowing domains: ${allowed_domains.join(', ')}`; 48 } 49 if (blocked_domains && blocked_domains.length > 0) { 50 message += `, blocking domains: ${blocked_domains.join(', ')}`; 51 } 52 } 53 return message; 54} 55export function renderToolUseProgressMessage(progressMessages: ProgressMessage<WebSearchProgress>[]): React.ReactNode { 56 if (progressMessages.length === 0) { 57 return null; 58 } 59 const lastProgress = progressMessages[progressMessages.length - 1]; 60 if (!lastProgress?.data) { 61 return null; 62 } 63 const data = lastProgress.data; 64 switch (data.type) { 65 case 'query_update': 66 return <MessageResponse> 67 <Text dimColor>Searching: {data.query}</Text> 68 </MessageResponse>; 69 case 'search_results_received': 70 return <MessageResponse> 71 <Text dimColor> 72 Found {data.resultCount} results for &quot;{data.query}&quot; 73 </Text> 74 </MessageResponse>; 75 default: 76 return null; 77 } 78} 79export function renderToolResultMessage(output: Output): React.ReactNode { 80 const { 81 searchCount 82 } = getSearchSummary(output.results ?? []); 83 const timeDisplay = output.durationSeconds >= 1 ? `${Math.round(output.durationSeconds)}s` : `${Math.round(output.durationSeconds * 1000)}ms`; 84 return <Box justifyContent="space-between" width="100%"> 85 <MessageResponse height={1}> 86 <Text> 87 Did {searchCount} search 88 {searchCount !== 1 ? 'es' : ''} in {timeDisplay} 89 </Text> 90 </MessageResponse> 91 </Box>; 92} 93export function getToolUseSummary(input: Partial<{ 94 query: string; 95}> | undefined): string | null { 96 if (!input?.query) { 97 return null; 98 } 99 return truncate(input.query, TOOL_SUMMARY_MAX_LENGTH); 100} 101//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIk1lc3NhZ2VSZXNwb25zZSIsIlRPT0xfU1VNTUFSWV9NQVhfTEVOR1RIIiwiQm94IiwiVGV4dCIsIlByb2dyZXNzTWVzc2FnZSIsInRydW5jYXRlIiwiT3V0cHV0IiwiU2VhcmNoUmVzdWx0IiwiV2ViU2VhcmNoUHJvZ3Jlc3MiLCJnZXRTZWFyY2hTdW1tYXJ5IiwicmVzdWx0cyIsInNlYXJjaENvdW50IiwidG90YWxSZXN1bHRDb3VudCIsInJlc3VsdCIsImNvbnRlbnQiLCJsZW5ndGgiLCJyZW5kZXJUb29sVXNlTWVzc2FnZSIsInF1ZXJ5IiwiYWxsb3dlZF9kb21haW5zIiwiYmxvY2tlZF9kb21haW5zIiwiUGFydGlhbCIsInZlcmJvc2UiLCJSZWFjdE5vZGUiLCJtZXNzYWdlIiwiam9pbiIsInJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UiLCJwcm9ncmVzc01lc3NhZ2VzIiwibGFzdFByb2dyZXNzIiwiZGF0YSIsInR5cGUiLCJyZXN1bHRDb3VudCIsInJlbmRlclRvb2xSZXN1bHRNZXNzYWdlIiwib3V0cHV0IiwidGltZURpc3BsYXkiLCJkdXJhdGlvblNlY29uZHMiLCJNYXRoIiwicm91bmQiLCJnZXRUb29sVXNlU3VtbWFyeSIsImlucHV0Il0sInNvdXJjZXMiOlsiVUkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1lc3NhZ2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvTWVzc2FnZVJlc3BvbnNlLmpzJ1xuaW1wb3J0IHsgVE9PTF9TVU1NQVJZX01BWF9MRU5HVEggfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdG9vbExpbWl0cy5qcydcbmltcG9ydCB7IEJveCwgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgUHJvZ3Jlc3NNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7IHRydW5jYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LmpzJ1xuaW1wb3J0IHR5cGUge1xuICBPdXRwdXQsXG4gIFNlYXJjaFJlc3VsdCxcbiAgV2ViU2VhcmNoUHJvZ3Jlc3MsXG59IGZyb20gJy4vV2ViU2VhcmNoVG9vbC5qcydcblxuZnVuY3Rpb24gZ2V0U2VhcmNoU3VtbWFyeShcbiAgcmVzdWx0czogKFNlYXJjaFJlc3VsdCB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpW10sXG4pOiB7XG4gIHNlYXJjaENvdW50OiBudW1iZXJcbiAgdG90YWxSZXN1bHRDb3VudDogbnVtYmVyXG59IHtcbiAgbGV0IHNlYXJjaENvdW50ID0gMFxuICBsZXQgdG90YWxSZXN1bHRDb3VudCA9IDBcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHR5cGVvZiByZXN1bHQgIT09ICdzdHJpbmcnKSB7XG4gICAgICBzZWFyY2hDb3VudCsrXG4gICAgICB0b3RhbFJlc3VsdENvdW50ICs9IHJlc3VsdC5jb250ZW50Py5sZW5ndGggPz8gMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNlYXJjaENvdW50LCB0b3RhbFJlc3VsdENvdW50IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VNZXNzYWdlKFxuICB7XG4gICAgcXVlcnksXG4gICAgYWxsb3dlZF9kb21haW5zLFxuICAgIGJsb2NrZWRfZG9tYWlucyxcbiAgfTogUGFydGlhbDx7XG4gICAgcXVlcnk6IHN0cmluZ1xuICAgIGFsbG93ZWRfZG9tYWlucz86IHN0cmluZ1tdXG4gICAgYmxvY2tlZF9kb21haW5zPzogc3RyaW5nW11cbiAgfT4sXG4gIHsgdmVyYm9zZSB9OiB7IHZlcmJvc2U6IGJvb2xlYW4gfSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG1lc3NhZ2UgPSAnJ1xuXG4gIGlmIChxdWVyeSkge1xuICAgIG1lc3NhZ2UgKz0gYFwiJHtxdWVyeX1cImBcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgaWYgKGFsbG93ZWRfZG9tYWlucyAmJiBhbGxvd2VkX2RvbWFpbnMubGVuZ3RoID4gMCkge1xuICAgICAgbWVzc2FnZSArPSBgLCBvbmx5IGFsbG93aW5nIGRvbWFpbnM6ICR7YWxsb3dlZF9kb21haW5zLmpvaW4oJywgJyl9YFxuICAgIH1cblxuICAgIGlmIChibG9ja2VkX2RvbWFpbnMgJiYgYmxvY2tlZF9kb21haW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCwgYmxvY2tpbmcgZG9tYWluczogJHtibG9ja2VkX2RvbWFpbnMuam9pbignLCAnKX1gXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvb2xVc2VQcm9ncmVzc01lc3NhZ2UoXG4gIHByb2dyZXNzTWVzc2FnZXM6IFByb2dyZXNzTWVzc2FnZTxXZWJTZWFyY2hQcm9ncmVzcz5bXSxcbik6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGlmIChwcm9ncmVzc01lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBsYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzc01lc3NhZ2VzW3Byb2dyZXNzTWVzc2FnZXMubGVuZ3RoIC0gMV1cbiAgaWYgKCFsYXN0UHJvZ3Jlc3M/LmRhdGEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgZGF0YSA9IGxhc3RQcm9ncmVzcy5kYXRhXG5cbiAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICBjYXNlICdxdWVyeV91cGRhdGUnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1lc3NhZ2VSZXNwb25zZT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5TZWFyY2hpbmc6IHtkYXRhLnF1ZXJ5fTwvVGV4dD5cbiAgICAgICAgPC9NZXNzYWdlUmVzcG9uc2U+XG4gICAgICApXG4gICAgY2FzZSAnc2VhcmNoX3Jlc3VsdHNfcmVjZWl2ZWQnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE1lc3NhZ2VSZXNwb25zZT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIEZvdW5kIHtkYXRhLnJlc3VsdENvdW50fSByZXN1bHRzIGZvciAmcXVvdDt7ZGF0YS5xdWVyeX0mcXVvdDtcbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgIDwvTWVzc2FnZVJlc3BvbnNlPlxuICAgICAgKVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUb29sUmVzdWx0TWVzc2FnZShvdXRwdXQ6IE91dHB1dCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgc2VhcmNoQ291bnQgfSA9IGdldFNlYXJjaFN1bW1hcnkob3V0cHV0LnJlc3VsdHMgPz8gW10pXG4gIGNvbnN0IHRpbWVEaXNwbGF5ID1cbiAgICBvdXRwdXQuZHVyYXRpb25TZWNvbmRzID49IDFcbiAgICAgID8gYCR7TWF0aC5yb3VuZChvdXRwdXQuZHVyYXRpb25TZWNvbmRzKX1zYFxuICAgICAgOiBgJHtNYXRoLnJvdW5kKG91dHB1dC5kdXJhdGlvblNlY29uZHMgKiAxMDAwKX1tc2BcblxuICByZXR1cm4gKFxuICAgIDxCb3gganVzdGlmeUNvbnRlbnQ9XCJzcGFjZS1iZXR3ZWVuXCIgd2lkdGg9XCIxMDAlXCI+XG4gICAgICA8TWVzc2FnZVJlc3BvbnNlIGhlaWdodD17MX0+XG4gICAgICAgIDxUZXh0PlxuICAgICAgICAgIERpZCB7c2VhcmNoQ291bnR9IHNlYXJjaFxuICAgICAgICAgIHtzZWFyY2hDb3VudCAhPT0gMSA/ICdlcycgOiAnJ30gaW4ge3RpbWVEaXNwbGF5fVxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L01lc3NhZ2VSZXNwb25zZT5cbiAgICA8L0JveD5cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9vbFVzZVN1bW1hcnkoXG4gIGlucHV0OiBQYXJ0aWFsPHsgcXVlcnk6IHN0cmluZyB9PiB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWlucHV0Py5xdWVyeSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIHRydW5jYXRlKGlucHV0LnF1ZXJ5LCBUT09MX1NVTU1BUllfTUFYX0xFTkdUSClcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsS0FBSyxNQUFNLE9BQU87QUFDekIsU0FBU0MsZUFBZSxRQUFRLHFDQUFxQztBQUNyRSxTQUFTQyx1QkFBdUIsUUFBUSwrQkFBK0I7QUFDdkUsU0FBU0MsR0FBRyxFQUFFQyxJQUFJLFFBQVEsY0FBYztBQUN4QyxjQUFjQyxlQUFlLFFBQVEsd0JBQXdCO0FBQzdELFNBQVNDLFFBQVEsUUFBUSx1QkFBdUI7QUFDaEQsY0FDRUMsTUFBTSxFQUNOQyxZQUFZLEVBQ1pDLGlCQUFpQixRQUNaLG9CQUFvQjtBQUUzQixTQUFTQyxnQkFBZ0JBLENBQ3ZCQyxPQUFPLEVBQUUsQ0FBQ0gsWUFBWSxHQUFHLE1BQU0sR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FDdEQsRUFBRTtFQUNESSxXQUFXLEVBQUUsTUFBTTtFQUNuQkMsZ0JBQWdCLEVBQUUsTUFBTTtBQUMxQixDQUFDLENBQUM7RUFDQSxJQUFJRCxXQUFXLEdBQUcsQ0FBQztFQUNuQixJQUFJQyxnQkFBZ0IsR0FBRyxDQUFDO0VBRXhCLEtBQUssTUFBTUMsTUFBTSxJQUFJSCxPQUFPLEVBQUU7SUFDNUIsSUFBSUcsTUFBTSxJQUFJLElBQUksSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxFQUFFO01BQ2hERixXQUFXLEVBQUU7TUFDYkMsZ0JBQWdCLElBQUlDLE1BQU0sQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLElBQUksQ0FBQztJQUNqRDtFQUNGO0VBRUEsT0FBTztJQUFFSixXQUFXO0lBQUVDO0VBQWlCLENBQUM7QUFDMUM7QUFFQSxPQUFPLFNBQVNJ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