aboutsummaryrefslogtreecommitdiff
path: root/src/domains/readpage
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/readpage
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/readpage')
-rw-r--r--src/domains/readpage/read-page.ts10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/domains/readpage/read-page.ts b/src/domains/readpage/read-page.ts
index 7bf2fdb..bc1a2b1 100644
--- a/src/domains/readpage/read-page.ts
+++ b/src/domains/readpage/read-page.ts
@@ -10,6 +10,7 @@ import {
openIsolatedTab,
waitForIsolatedLoad,
} from "../isolated-tab";
+import { renderExpandableText } from "../render";
import { buildPageCaptureExpr } from "./capture";
import { extractReadable, type PageCapture, type ReadablePage } from "./readability";
@@ -42,12 +43,18 @@ const captureToResult = async (raw: unknown): Promise<Result<ToolOk, ToolErr>> =
const page: ReadablePage = extractReadable(parsed);
const header = `# ${page.title}\n${page.url}\n(${page.wordCount} words)\n\n`;
const truncated = await applyTruncation(header + page.text, "readpage");
+ const summary = `${page.title} ยท ${page.wordCount} words`;
return ok({
text: truncated.text,
details: {
title: page.title,
url: page.url,
wordCount: page.wordCount,
+ render: {
+ summary,
+ body: page.text,
+ ...(truncated.fullOutputPath !== undefined ? { fullOutputPath: truncated.fullOutputPath } : {}),
+ },
...(truncated.fullOutputPath !== undefined ? { fullOutputPath: truncated.fullOutputPath } : {}),
},
});
@@ -106,4 +113,7 @@ export const readPageTool = defineBrowserTool({
if (args.targetId !== undefined && args.targetId.length > 0) return readOwnedTab(client, args.targetId);
return err({ kind: "invalid_state", message: "provide either url or targetId" });
},
+ renderResult(result, expanded, theme) {
+ return renderExpandableText("read_page", result, expanded, theme);
+ },
});