{"version":3,"file":"tui-C9_iShYS.mjs","names":[],"sources":["../src/tui.ts"],"sourcesContent":["import { stripVTControlCharacters } from \"node:util\";\n\nimport stringWidth from \"string-width\";\n\nimport type { ProviderCapabilities, ProviderResultLimit } from \"./core/provider.ts\";\nimport type { ProviderStatus } from \"./core/resolve.ts\";\n\n/** Web tools with dedicated Pi and OMP presentation. */\nexport type WebToolName = \"web_search\" | \"web_search_image\" | \"web_read\" | \"web_providers\";\n\n/** Colors used by the shared web presentation. */\nexport type StatusColor =\n  | \"accent\"\n  | \"dim\"\n  | \"error\"\n  | \"muted\"\n  | \"success\"\n  | \"toolOutput\"\n  | \"toolTitle\";\n\n/** Theme methods shared by the Pi and OMP render adapters. */\nexport interface StatusTheme {\n  readonly fg?: (color: StatusColor, text: string) => string;\n  readonly bold?: (text: string) => string;\n}\n\n/** Render state fields exposed across Pi and OMP. */\nexport interface RenderOptions {\n  readonly expanded?: boolean;\n  readonly isPartial?: boolean;\n  readonly spinnerFrame?: number;\n  readonly executionStarted?: boolean;\n  readonly viewportWidth?: number;\n}\n\n/** Width-aware component shared by the Pi and OMP adapters. */\nexport interface ViewportText {\n  readonly render: (width: number) => string[];\n  readonly invalidate: () => void;\n}\n\n/** Small common result shape consumed by both host renderers. */\nexport interface RenderedToolResult {\n  readonly content?: readonly unknown[];\n  readonly details?: unknown;\n  readonly isError?: boolean;\n}\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst FIELD_WIDTH = 88;\nconst META_WIDTH = 48;\nconst FIELD_SCAN_LIMIT = 2048;\nconst PREVIEW_LINES = 10;\nconst PREVIEW_WIDTH = 180;\nconst TERMINAL_UNSAFE = /[\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}]/gu;\nconst TERMINAL_CONTENT_UNSAFE =\n  /[\\p{Cc}\\p{Zl}\\p{Zp}\\u061C\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u206F]/gu;\nconst TERMINAL_CONTENT_SEPARATOR = /[\\p{Zl}\\p{Zp}]/u;\nconst TERMINAL_LAYOUT = new Set([\"\\t\", \"\\n\"]);\nconst MALFORMED_SURROGATE = /\\p{Cs}/gu;\nlet graphemeSegmenter: Intl.Segmenter | undefined;\n\nfunction getGraphemeSegmenter(): Intl.Segmenter {\n  return (graphemeSegmenter ??= new Intl.Segmenter(undefined, { granularity: \"grapheme\" }));\n}\n\nconst PRESENTATION: Readonly<Record<WebToolName, { symbol: string; label: string }>> = {\n  web_search: { symbol: \"⌕\", label: \"Web Search\" },\n  web_search_image: { symbol: \"▧\", label: \"Search by Image\" },\n  web_read: { symbol: \"↗\", label: \"Web Read\" },\n  web_providers: { symbol: \"◫\", label: \"Web Providers\" },\n};\n\nfunction cutAt(text: string, end: number): string {\n  const last = text.codePointAt(end - 1);\n  const splitsPair = last !== undefined && (last > 0xffff || (last >= 0xd800 && last <= 0xdbff));\n  return text.slice(0, splitsPair ? end - 1 : end);\n}\n\nfunction clip(text: string, max: number): string {\n  if (max <= 0) return \"\";\n  if (stringWidth(text) <= max) return text;\n  let clipped = \"\";\n  let width = 0;\n  for (const { segment } of getGraphemeSegmenter().segment(text)) {\n    const segmentWidth = stringWidth(segment);\n    if (width + segmentWidth > max - 1) break;\n    clipped += segment;\n    width += segmentWidth;\n  }\n  return `${clipped}…`;\n}\n\nfunction cleanTerminalText(text: string, preserveLayout = false): string {\n  const cleaned = stripVTControlCharacters(text.replace(MALFORMED_SURROGATE, \" \")).replace(\n    preserveLayout ? TERMINAL_CONTENT_UNSAFE : TERMINAL_UNSAFE,\n    (character) => (preserveLayout ? replaceContentControl(character) : \" \"),\n  );\n  return preserveLayout ? cleaned : cleaned.replaceAll(/\\p{Zs}+/gu, \" \");\n}\n\nfunction replaceContentControl(character: string): string {\n  if (TERMINAL_LAYOUT.has(character)) return character;\n  return TERMINAL_CONTENT_SEPARATOR.test(character) ? \" \" : \"\";\n}\n\n/** Sanitize one untrusted value before it reaches a terminal component.\n * @param value - Value crossing the terminal boundary.\n * @param max - Maximum rendered field width.\n * @returns {string} Terminal-safe single-line text.\n */\nexport function sanitizeTerminalText(value: unknown, max = FIELD_WIDTH): string {\n  const text = String(value);\n  const bounded = text.length > FIELD_SCAN_LIMIT ? `${cutAt(text, FIELD_SCAN_LIMIT - 1)}…` : text;\n  return clip(cleanTerminalText(bounded).replaceAll(/\\s+/g, \" \").trim(), max);\n}\n\n/** Sanitize untrusted terminal content while preserving tabs and line breaks.\n * @param value - Value crossing the terminal boundary.\n * @returns {string} Text safe for terminal output with its layout intact.\n */\nexport function sanitizeTerminalContent(value: unknown): string {\n  return cleanTerminalText(String(value).replaceAll(/\\r\\n?/g, \"\\n\"), true);\n}\n\n/**\n * Format one provider's machine-readable capability matrix for terminal and model text.\n * @param status - Provider status fields carrying capability metadata.\n * @returns {string} Compact capability labels.\n */\nexport function formatProviderCapabilities(\n  status: Readonly<Pick<ProviderStatus, \"capabilities\" | \"searchFilters\" | \"searchCategories\">>,\n): string {\n  const { capabilities } = status;\n  return [\n    `operations=${supportedOperations(capabilities) || \"none\"}`,\n    `filters=${joinCapabilityValues(status.searchFilters) || \"none\"}`,\n    optionalCapabilityList(\"categories\", status.searchCategories),\n    optionalCapabilityList(\"contentOptions\", capabilities.search.contentOptions),\n    capabilities.search.pagination === true ? \"pagination=continuation\" : undefined,\n    formatResultLimit(\"searchLimit\", capabilities.search.resultLimit),\n    formatResultLimit(\"imageLimit\", capabilities.searchImage.resultLimit),\n    optionalCapabilityList(\"resultFields\", capabilities.search.resultFields),\n    optionalCapabilityList(\"readOptions\", capabilities.read.options),\n    optionalCapabilityList(\"formats\", capabilities.read.formats),\n  ]\n    .filter((label): label is string => label !== undefined)\n    .join(\" \");\n}\n\nfunction supportedOperations(capabilities: Readonly<ProviderCapabilities>): string {\n  return ([\"search\", \"searchImage\", \"read\"] as const)\n    .filter((operation) => capabilities[operation].supported)\n    .join(\",\");\n}\n\nfunction joinCapabilityValues(values: readonly string[] | undefined): string {\n  return values?.map((value) => sanitizeTerminalText(value)).join(\",\") ?? \"\";\n}\n\nfunction optionalCapabilityList(\n  name: string,\n  values: readonly string[] | undefined,\n): string | undefined {\n  const joined = joinCapabilityValues(values);\n  return joined ? `${name}=${joined}` : undefined;\n}\n\nfunction formatResultLimit(\n  name: string,\n  limit: Readonly<ProviderResultLimit> | undefined,\n): string | undefined {\n  if (!limit) return undefined;\n  if (limit.default === undefined) return `${name}=max:${limit.maximum}`;\n  const maximum = limit.maximum === undefined ? \"\" : `..${limit.maximum}`;\n  return `${name}=${limit.default}${maximum}`;\n}\n\nfunction paint(theme: Readonly<StatusTheme>, color: StatusColor, text: string): string {\n  return theme.fg ? theme.fg(color, text) : text;\n}\n\nfunction viewportWidth(options: Readonly<RenderOptions> | undefined): number {\n  const width = options?.viewportWidth;\n  return width === undefined || !Number.isFinite(width)\n    ? PREVIEW_WIDTH\n    : Math.max(1, Math.floor(width));\n}\n\n/** Create a component that lays out its immutable content at the host viewport width.\n * @param renderText - Width-aware text factory.\n * @returns {ViewportText} Host-neutral component.\n */\nexport function createViewportText(renderText: (width: number) => string): ViewportText {\n  let cachedWidth: number | undefined;\n  let cachedLines: string[] | undefined;\n  return {\n    render(width: number) {\n      const constrainedWidth = Math.max(1, Math.floor(width));\n      if (cachedWidth !== constrainedWidth || cachedLines === undefined) {\n        cachedWidth = constrainedWidth;\n        cachedLines = renderText(constrainedWidth).split(\"\\n\");\n      }\n      return cachedLines;\n    },\n    invalidate() {\n      cachedWidth = undefined;\n      cachedLines = undefined;\n    },\n  };\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n  return typeof value === \"object\" && value !== null;\n}\n\nfunction scalar(record: Readonly<Record<string, unknown>>, key: string): string | undefined {\n  const value = record[key];\n  if (typeof value === \"string\" && value.length > 0) return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n  return undefined;\n}\n\nfunction listLength(record: Readonly<Record<string, unknown>>, key: string): number | undefined {\n  const value = record[key];\n  return Array.isArray(value) ? value.length : undefined;\n}\n\nfunction callIcon(\n  options: Readonly<RenderOptions> | undefined,\n): Readonly<{ glyph: string; color: StatusColor }> {\n  if (options?.isPartial === false) return { glyph: \"✓\", color: \"success\" };\n  if (options?.spinnerFrame !== undefined) {\n    return {\n      glyph: SPINNER_FRAMES[options.spinnerFrame % SPINNER_FRAMES.length] ?? \"⠋\",\n      color: \"accent\",\n    };\n  }\n  return options?.executionStarted === true\n    ? { glyph: \"◌\", color: \"accent\" }\n    : { glyph: \"·\", color: \"muted\" };\n}\n\nfunction inputSubject(name: WebToolName, record: Readonly<Record<string, unknown>>): string {\n  if (name === \"web_search\") {\n    const query = record.query;\n    return Array.isArray(query)\n      ? `${query.length} queries`\n      : sanitizeTerminalText(query ?? \"Search\", FIELD_WIDTH);\n  }\n  if (name === \"web_read\") {\n    const url = record.url;\n    return Array.isArray(url) ? `${url.length} pages` : sanitizeTerminalText(url ?? \"Page\");\n  }\n  if (name === \"web_search_image\") return sanitizeTerminalText(record.url ?? \"Image\");\n  return \"Provider registry\";\n}\n\nfunction searchInputMeta(record: Readonly<Record<string, unknown>>): string[] {\n  const maxResults = scalar(record, \"maxResults\");\n  const filterCount = [\n    \"includeDomains\",\n    \"excludeDomains\",\n    \"sources\",\n    \"categories\",\n    \"category\",\n    \"startPublishedDate\",\n    \"endPublishedDate\",\n  ].filter((key) => record[key] !== undefined).length;\n  return [\n    ...(maxResults ? [`top ${sanitizeTerminalText(maxResults, META_WIDTH)}`] : []),\n    ...(filterCount > 0 ? [`${filterCount} filter${filterCount === 1 ? \"\" : \"s\"}`] : []),\n  ];\n}\n\nfunction readInputMeta(record: Readonly<Record<string, unknown>>): string[] {\n  const format = scalar(record, \"format\");\n  const maxTokens = scalar(record, \"maxTokens\");\n  return [\n    ...(format ? [sanitizeTerminalText(format, META_WIDTH)] : []),\n    ...(maxTokens ? [`${sanitizeTerminalText(maxTokens, META_WIDTH)} tokens`] : []),\n  ];\n}\n\nfunction inputMeta(name: WebToolName, record: Readonly<Record<string, unknown>>): string[] {\n  const provider = scalar(record, \"provider\");\n  const operationMeta =\n    name === \"web_search\"\n      ? searchInputMeta(record)\n      : name === \"web_search_image\"\n        ? searchInputMeta(record).slice(0, 1)\n        : name === \"web_read\"\n          ? readInputMeta(record)\n          : [];\n  return [\n    ...(provider ? [sanitizeTerminalText(provider, META_WIDTH)] : []),\n    ...operationMeta,\n  ].slice(0, 4);\n}\n\n/** Return the symbol and label used by native tool menus.\n * @param name - Registered web tool name.\n * @returns {string} Stable symbol and label.\n */\nexport function webToolTitle(name: WebToolName): string {\n  const item = PRESENTATION[name];\n  return `${item.symbol} ${item.label}`;\n}\n\n/** Render one compact, terminal-safe tool call row.\n * @param name - Registered web tool name.\n * @param args - Untrusted model arguments.\n * @param options - Host render state.\n * @param theme - Active host theme.\n * @returns {string} One terminal row.\n */\nexport function renderWebToolCall(\n  name: WebToolName,\n  args: unknown,\n  options: Readonly<RenderOptions> | undefined,\n  theme: Readonly<StatusTheme>,\n): string {\n  const record = isRecord(args) ? args : {};\n  const icon = callIcon(options);\n  const title = webToolTitle(name);\n  const width = viewportWidth(options);\n  const prefixText = `${icon.glyph} ${title}`;\n  const prefixWidth = stringWidth(prefixText);\n  if (prefixWidth >= width) return paint(theme, icon.color, clip(prefixText, width));\n\n  const subject = inputSubject(name, record);\n  const meta = inputMeta(name, record);\n  const tail = clip([subject, meta.join(\" · \")].filter(Boolean).join(\" \"), width - prefixWidth - 1);\n  const prefix = [\n    paint(theme, icon.color, icon.glyph),\n    paint(theme, \"toolTitle\", theme.bold ? theme.bold(title) : title),\n  ].join(\" \");\n  return tail ? `${prefix} ${paint(theme, \"dim\", tail)}` : prefix;\n}\n\nfunction resultText(result: Readonly<RenderedToolResult>): string {\n  const content = result.content;\n  if (content?.length === 1) {\n    const first = content[0];\n    return isRecord(first) && typeof first.text === \"string\" ? first.text.trimEnd() : \"\";\n  }\n  const parts: string[] = [];\n  for (const part of content ?? []) {\n    if (isRecord(part) && typeof part.text === \"string\") parts.push(part.text);\n  }\n  return parts.join(\"\\n\").trimEnd();\n}\n\nfunction detailText(record: Readonly<Record<string, unknown>>, key: string): string | undefined {\n  const value = record[key];\n  if (typeof value !== \"string\" || value.length === 0) return undefined;\n  return value.length > FIELD_SCAN_LIMIT ? `${cutAt(value, FIELD_SCAN_LIMIT - 1)}…` : value;\n}\n\nfunction searchResultPreview(item: unknown): string[] {\n  if (!isRecord(item)) return [];\n  const title = detailText(item, \"title\");\n  const url = detailText(item, \"url\") ?? detailText(item, \"pageUrl\");\n  const snippet = detailText(item, \"snippet\");\n  return [title, url, snippet].filter((value): value is string => value !== undefined);\n}\n\nfunction searchPreview(details: unknown): string | undefined {\n  if (!isRecord(details)) return undefined;\n  if (Array.isArray(details.results)) {\n    return details.results.slice(0, 4).flatMap(searchResultPreview).join(\"\\n\") || undefined;\n  }\n  if (!Array.isArray(details.outcomes)) return undefined;\n  const lines = details.outcomes.slice(0, 3).flatMap((outcome) => {\n    if (!isRecord(outcome)) return [];\n    const query = detailText(outcome, \"query\");\n    const error = detailText(outcome, \"error\");\n    const results = Array.isArray(outcome.results)\n      ? outcome.results.slice(0, 2).flatMap(searchResultPreview)\n      : [];\n    return [query, error, ...results].filter((value): value is string => value !== undefined);\n  });\n  return lines.join(\"\\n\") || undefined;\n}\n\nfunction readPreview(details: unknown): string | undefined {\n  if (!isRecord(details)) return undefined;\n  const result = isRecord(details.result) ? details.result : undefined;\n  if (result && typeof result.content === \"string\") return result.content;\n  if (!Array.isArray(details.outcomes)) return undefined;\n  const lines = details.outcomes.slice(0, PREVIEW_LINES).flatMap((outcome) => {\n    if (!isRecord(outcome)) return [];\n    const url = detailText(outcome, \"url\");\n    const error = detailText(outcome, \"error\");\n    const provider = detailText(outcome, \"provider\");\n    return [url, error ?? provider].filter((value): value is string => value !== undefined);\n  });\n  return lines.join(\"\\n\") || undefined;\n}\n\nfunction providersPreview(details: unknown): string | undefined {\n  if (!isRecord(details) || !Array.isArray(details.providers)) return undefined;\n  const lines = details.providers.slice(0, PREVIEW_LINES + 1).flatMap((provider) => {\n    if (!isRecord(provider)) return [];\n    const name = detailText(provider, \"name\");\n    if (!name) return [];\n    const state =\n      provider.configured !== true\n        ? \"not configured\"\n        : provider.reachable === false\n          ? \"unreachable\"\n          : \"configured\";\n    return [`${name} · ${state}`];\n  });\n  return lines.join(\"\\n\") || undefined;\n}\n\nfunction structuredPreview(name: WebToolName, details: unknown): string | undefined {\n  if (name === \"web_search\" || name === \"web_search_image\") return searchPreview(details);\n  if (name === \"web_read\") return readPreview(details);\n  return providersPreview(details);\n}\n\nfunction previewText(\n  name: WebToolName,\n  result: Readonly<RenderedToolResult>,\n  text: string,\n): string {\n  const trimmed = text.trimStart();\n  const serialized = trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\");\n  return serialized ? (structuredPreview(name, result.details) ?? text) : text;\n}\n\nfunction failedItems(items: readonly unknown[]): number {\n  return items.filter((item) => isRecord(item) && typeof item.error === \"string\").length;\n}\n\nfunction batchMeta(items: readonly unknown[], label: string): string[] {\n  const failed = failedItems(items);\n  return [`${items.length} ${label}`, ...(failed > 0 ? [`${failed} failed`] : [])];\n}\n\nfunction successfulProvidersMeta(details: Readonly<Record<string, unknown>>): string | undefined {\n  const count = listLength(details, \"successfulProviders\");\n  if (count === undefined) return undefined;\n  return `${count} provider${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction scalarSearchMeta(details: Readonly<Record<string, unknown>>): string[] {\n  const count = scalar(details, \"count\") ?? listLength(details, \"results\")?.toString();\n  const provider = scalar(details, \"provider\") ?? successfulProvidersMeta(details);\n  const errors = listLength(details, \"errors\") ?? 0;\n  const meta = count ? [`${sanitizeTerminalText(count, META_WIDTH)} results`] : [];\n  if (provider) meta.push(sanitizeTerminalText(provider, META_WIDTH));\n  if (errors > 0) meta.push(`${errors} provider error${errors === 1 ? \"\" : \"s\"}`);\n  return meta;\n}\n\nfunction searchMeta(details: unknown): string[] {\n  if (Array.isArray(details)) return batchMeta(details, \"queries\");\n  if (!isRecord(details)) return [];\n  const outcomes = details.mode === \"batch\" ? details.outcomes : undefined;\n  return Array.isArray(outcomes) ? batchMeta(outcomes, \"queries\") : scalarSearchMeta(details);\n}\n\nfunction imageMeta(details: unknown): string[] {\n  const results = Array.isArray(details)\n    ? details.length\n    : isRecord(details) && Array.isArray(details.results)\n      ? details.results.length\n      : undefined;\n  const provider = isRecord(details) ? scalar(details, \"provider\") : undefined;\n  return [\n    ...(results === undefined ? [] : [`${results} matches`]),\n    ...(provider ? [sanitizeTerminalText(provider, META_WIDTH)] : []),\n  ];\n}\n\nfunction scalarReadMeta(details: Readonly<Record<string, unknown>>): string[] {\n  const provider = scalar(details, \"effectiveProvider\") ?? scalar(details, \"provider\");\n  const result = isRecord(details.result) ? details.result : undefined;\n  const content = result && typeof result.content === \"string\" ? result.content : undefined;\n  const attempts = listLength(details, \"attempts\") ?? 0;\n  const meta = provider ? [sanitizeTerminalText(provider, META_WIDTH)] : [];\n  if (content) meta.push(`${content.length.toLocaleString(\"en\")} chars`);\n  meta.push(...readTruncationMeta(result));\n  if (attempts > 1) meta.push(`${attempts} attempts`);\n  return meta;\n}\n\nfunction readTruncationMeta(result: Readonly<Record<string, unknown>> | undefined): string[] {\n  return result?.truncated === true ? [\"truncated\"] : [];\n}\n\nfunction readMeta(details: unknown): string[] {\n  if (Array.isArray(details)) return batchMeta(details, \"pages\");\n  if (!isRecord(details)) return [];\n  const outcomes = details.mode === \"batch\" ? details.outcomes : undefined;\n  return Array.isArray(outcomes) ? batchMeta(outcomes, \"pages\") : scalarReadMeta(details);\n}\n\nfunction providersMeta(details: unknown): string[] {\n  const record = isRecord(details) ? details : {};\n  const providers = Array.isArray(record.providers) ? record.providers : [];\n  const configured = providers.filter(\n    (provider) => isRecord(provider) && provider.configured === true,\n  ).length;\n  const reachable = providers.filter(\n    (provider) =>\n      isRecord(provider) && provider.reachable !== false && provider.configured === true,\n  ).length;\n  return [\n    `${configured}/${providers.length} configured`,\n    ...(configured > 0 ? [`${reachable} reachable`] : []),\n  ];\n}\n\nfunction resultMeta(name: WebToolName, details: unknown): string[] {\n  if (name === \"web_search\") return searchMeta(details).slice(0, 4);\n  if (name === \"web_search_image\") return imageMeta(details).slice(0, 4);\n  if (name === \"web_read\") return readMeta(details).slice(0, 4);\n  return providersMeta(details).slice(0, 4);\n}\n\nfunction firstLine(text: string): string {\n  const newline = text.indexOf(\"\\n\");\n  return newline === -1 ? text : text.slice(0, newline);\n}\n\nfunction previewBody(text: string, theme: Readonly<StatusTheme>, width: number): string[] {\n  const lines: string[] = [];\n  const indent = width > 2 ? \"  \" : \"\";\n  const contentWidth = Math.max(1, Math.min(PREVIEW_WIDTH, width - stringWidth(indent)));\n  let offset = 0;\n  while (offset < text.length && lines.length < PREVIEW_LINES) {\n    const windowEnd = Math.min(text.length, offset + FIELD_SCAN_LIMIT);\n    const window = text.slice(offset, windowEnd);\n    const newline = window.indexOf(\"\\n\");\n    const rawLine = newline === -1 ? window : window.slice(0, newline);\n    const line = clip(cleanTerminalText(rawLine).trimEnd(), contentWidth);\n    lines.push(`${indent}${paint(theme, \"toolOutput\", line)}`);\n    if (newline !== -1) {\n      offset += newline + 1;\n    } else if (windowEnd < text.length) {\n      break;\n    } else {\n      offset = text.length;\n    }\n  }\n  if (offset < text.length) {\n    const marker = clip(\"… preview truncated\", contentWidth);\n    lines.push(`${indent}${paint(theme, \"muted\", marker)}`);\n  }\n  return lines;\n}\n\nfunction activityLabel(name: WebToolName): string {\n  if (name === \"web_search\") return \"Searching\";\n  if (name === \"web_search_image\") return \"Matching image\";\n  if (name === \"web_read\") return \"Reading\";\n  return \"Checking providers\";\n}\n\nfunction renderFailure(\n  text: string,\n  options: Readonly<RenderOptions>,\n  theme: Readonly<StatusTheme>,\n): string {\n  const width = viewportWidth(options);\n  if (width === 1) return paint(theme, \"error\", \"✗\");\n  const description = sanitizeTerminalText(firstLine(text) || \"Request failed\", width - 2);\n  return `${paint(theme, \"error\", \"✗\")} ${paint(theme, \"dim\", description)}`;\n}\n\nfunction resultVerb(name: WebToolName): string {\n  if (name === \"web_search\") return \"found\";\n  if (name === \"web_search_image\") return \"matched\";\n  if (name === \"web_read\") return \"read\";\n  return \"checked\";\n}\n\nfunction renderPartial(\n  name: WebToolName,\n  options: Readonly<RenderOptions>,\n  theme: Readonly<StatusTheme>,\n): string {\n  const icon = callIcon(options);\n  const width = viewportWidth(options);\n  if (width === 1) return paint(theme, icon.color, icon.glyph);\n  const activity = clip(activityLabel(name), width - 2);\n  return `${paint(theme, icon.color, icon.glyph)} ${paint(theme, \"dim\", activity)}`;\n}\n\nfunction renderSummary(\n  name: WebToolName,\n  meta: readonly string[],\n  options: Readonly<RenderOptions>,\n  theme: Readonly<StatusTheme>,\n): string {\n  const verb = resultVerb(name);\n  const prefixText = `✓ ${verb}`;\n  const width = viewportWidth(options);\n  const prefixWidth = stringWidth(prefixText);\n  if (prefixWidth >= width) return paint(theme, \"success\", clip(prefixText, width));\n  const tail = clip(meta.join(\" · \"), width - prefixWidth - 1);\n  const prefix = `${paint(theme, \"success\", \"✓\")} ${paint(theme, \"accent\", verb)}`;\n  return tail ? `${prefix} ${paint(theme, \"muted\", tail)}` : prefix;\n}\n\n/** Render a result summary and a bounded expanded preview.\n * @param name - Registered web tool name.\n * @param result - Tool content and structured details.\n * @param isError - Failure flag supplied by the host adapter.\n * @param options - Host render state.\n * @param theme - Active host theme.\n * @returns {string} Compact summary with an optional preview.\n */\nexport function renderWebToolResult(\n  name: WebToolName,\n  result: Readonly<RenderedToolResult>,\n  isError: boolean,\n  options: Readonly<RenderOptions>,\n  theme: Readonly<StatusTheme>,\n): string {\n  if (isError || result.isError === true) {\n    return renderFailure(resultText(result), options, theme);\n  }\n  if (options.isPartial === true) return renderPartial(name, options, theme);\n  const text = resultText(result);\n  const meta = resultMeta(name, result.details);\n  const header = renderSummary(name, meta, options, theme);\n  const body =\n    options.expanded === true && text\n      ? previewBody(previewText(name, result, text), theme, viewportWidth(options))\n      : [];\n  return body.length > 0 ? [header, ...body].join(\"\\n\") : header;\n}\n"],"mappings":"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"}