diff options
| author | amankumarsingh77 <amankumarsingh7702@gmail.com> | 2026-07-08 21:31:37 +0530 |
|---|---|---|
| committer | amankumarsingh77 <amankumarsingh7702@gmail.com> | 2026-07-08 21:31:37 +0530 |
| commit | 3f65a30e3f78e749110ad0d883e265b3a59dec13 (patch) | |
| tree | 388c8694517d0e7d0af1e0a185217f0abccba176 /src/domains/search | |
| parent | 68bf7fd2988e42343833be09e4115cd7175029d0 (diff) | |
feat: add expand/collapse (Ctrl+O) rendering to web_search and read_page
Both tools dumped full output into the TUI. Add a shared renderExpandableText
helper (src/domains/render.ts) mirroring browser_execute_js: a compact preview
by default, full body on expand via keyHint("app.tools.expand"). Tools stash a
{summary, body, fullOutputPath} render payload in details; the full text still
goes to the LLM via ToolOk.text. Also surfaces engine + result count in the
web_search summary line (closes the S4 observability gap).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'src/domains/search')
| -rw-r--r-- | src/domains/search/web-search.ts | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/domains/search/web-search.ts b/src/domains/search/web-search.ts index e5d343d..41a0f36 100644 --- a/src/domains/search/web-search.ts +++ b/src/domains/search/web-search.ts @@ -9,6 +9,7 @@ import { openIsolatedTab, waitForIsolatedLoad, } from "../isolated-tab"; +import { renderExpandableText } from "../render"; import { buildSerpExtractionExpr } from "./extract"; import { classifySerp, parseGoogleSerp, type SearchResult, type SerpExtraction } from "./google-serp"; @@ -81,13 +82,19 @@ export const webSearchTool = defineBrowserTool({ }); } - const truncated = await applyTruncation(formatResults(args.query, results), "search"); + const body = formatResults(args.query, results); + const truncated = await applyTruncation(body, "search"); return ok({ text: truncated.text, details: { results, engine: "google", query: args.query, + render: { + summary: `${results.length} result(s) · google · "${args.query}"`, + body, + ...(truncated.fullOutputPath !== undefined ? { fullOutputPath: truncated.fullOutputPath } : {}), + }, ...(truncated.fullOutputPath !== undefined ? { fullOutputPath: truncated.fullOutputPath } : {}), }, }); @@ -95,6 +102,9 @@ export const webSearchTool = defineBrowserTool({ await closeIsolatedTab(client, tab); } }, + renderResult(result, expanded, theme) { + return renderExpandableText("web_search", result, expanded, theme); + }, }); const safeParse = (text: string): unknown => { |
