From c5c42df5976ed63faac2adcf3b04a4ad2f519b32 Mon Sep 17 00:00:00 2001 From: amankumarsingh77 Date: Wed, 8 Jul 2026 21:13:15 +0530 Subject: feat: add browser_web_search tool (real-Chrome SERP scrape, no API key) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thin query→ranked-links primitive. Isolated-attach tab lifecycle mirroring browser_open_urls (never touches the user's current tab); pure Google SERP parser with semantic (a h3) extraction and redirect unwrapping; CAPTCHA and no-results surfaced as invalid_state + details.reason. Fixture-based parser tests (9 scenarios). Establishes the isolated-tab lifecycle and tsx+fixture test convention that browser_read_page and deep-research build on. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/registry.ts | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/registry.ts') diff --git a/src/registry.ts b/src/registry.ts index 22e2fa6..c7ff5c8 100644 --- a/src/registry.ts +++ b/src/registry.ts @@ -19,6 +19,7 @@ import { consoleTool } from "./domains/console"; import { snapshotTool } from "./domains/snapshot"; import { executeJsTool, runScriptTool } from "./domains/js"; import { setupTool } from "./domains/setup"; +import { webSearchTool } from "./domains/search/web-search"; // Mutation tools that modify page / browser state are marked `serialized: true` // so they run through a shared async mutex. Observation / read-only tools are @@ -61,6 +62,8 @@ const TOOLS: ReadonlyArray = [ snapshotTool, executeJsTool, runScriptTool, + // Opens and owns an isolated tab to scrape a SERP — same class as openUrlsTool. + { ...webSearchTool, serialized: true }, ]; export const registerAllTools = (pi: ExtensionAPI, client: BrowserClient): void => { -- cgit v1.2.3