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 { truncate } from '../../utils/format.js' export function renderToolUseMessage( input: Partial<{ action: string location: string destination: string query: string }>, { verbose }: { verbose: boolean }, ): React.ReactNode { const { action, location, destination, query } = input if (!action || !location) { return null } const actionLabel: Record = { geocode: '地理编码', search_places: '搜索地点', get_directions: '路线规划', plan_trip: '行程规划', } let msg = `${actionLabel[action] || action}: ${location}` if (destination) msg += ` → ${destination}` if (query && verbose) msg += ` (${query})` return msg } export function renderToolUseProgressMessage(): React.ReactNode { return null } export function renderToolResultMessage(output: { action: string region?: string geocoding?: { formattedAddress: string; lat: number; lng: number } places?: unknown[] directions?: { origin: string; destination: string; totalDistance: string; totalDuration: string } error?: string }): React.ReactNode { if (!output) return null if (output.error) { return ( Location error: {output.error} ) } const parts: string[] = [] const regionLabel = output.region === 'china' ? '中国大陆' : '海外' if (output.geocoding) { const g = output.geocoding parts.push(`坐标: ${g.lat}, ${g.lng}`) } if (output.places?.length) { parts.push(`找到 ${output.places.length} 个地点`) } if (output.directions) { const d = output.directions parts.push(`${d.origin} → ${d.destination}: ${d.totalDistance}, ${d.totalDuration}`) } return ( [{regionLabel}] {parts.join(' | ')} ) } export function getToolUseSummary( input: Partial<{ action: string location: string destination: string query: string }> | undefined, ): string | null { if (!input?.action || !input?.location) return null let summary = `${input.action}: ${input.location}` if (input.destination) summary += ` → ${input.destination}` return truncate(summary, TOOL_SUMMARY_MAX_LENGTH) }