aboutsummaryrefslogtreecommitdiff
path: root/src/domains/search
diff options
context:
space:
mode:
authoramankumarsingh77 <amankumarsingh7702@gmail.com>2026-07-08 21:31:37 +0530
committeramankumarsingh77 <amankumarsingh7702@gmail.com>2026-07-08 21:31:37 +0530
commit3f65a30e3f78e749110ad0d883e265b3a59dec13 (patch)
tree388c8694517d0e7d0af1e0a185217f0abccba176 /src/domains/search
parent68bf7fd2988e42343833be09e4115cd7175029d0 (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.ts12
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 => {