# Public-web search and exploration The built-in public-web capability has four tools: - `web_search` searches DuckDuckGo HTML and returns bounded source titles, URLs, snippets, and opaque source references. - `web_open` opens a `ref_id` returned by search or a prior navigation result. - `web_find` finds literal, case-insensitive text in an already opened page. It never fetches. - `web_click` opens a numbered link displayed by `web_open`. `web_search` remains the only user-facing selector. When it is allowed, all four tools are available together; when it is denied, none is available. Navigation accepts opaque in-memory references only. It has no `url`, host, header, cookie, method, backend, or authentication argument. ## Availability and controls The capability is enabled by default for normal CLI sessions: interactive TUI, print, stream, JSON, and RPC. The persisted `web_search_enabled` setting controls the default and `/settings` refreshes the live tool list. `--no-tools` always disables it. An explicit `--tools` allowlist must include `web_search` to retain or opt into the complete capability: ```bash zut --tools web_search "Find Go JSON-RPC documentation" zut --tools read,web_search "Find current Go release notes" zut --no-tools "Answer without tools" ``` It is unavailable in bot and Telegram runs; in Go SDK runtimes unless `sdk.Config.Tools` explicitly contains `web_search`; in named subagent profiles unless their explicit `tools:` list includes `web_search`; and in packaged `zut run` agents. A filesystem jail (`/jail` or SDK `Lock`) is not a network sandbox. ## Navigation and lifetime Search output shows a source reference, for example: ```text [1] Example documentation (ref: web-1) https://example.com/docs Example snippet ``` `web_open` creates a new page reference and prints sanitized numbered lines plus a numbered link appendix. `web_find` and `web_click` require that page reference. References are bounded, process-memory-only state: they expire after eviction, capability revocation, session/workspace transition, or restart. They are never restored from transcripts, forks, imports, or exports; search again after a transition. Opened content, titles, labels, and URLs are untrusted external content. Do not follow instructions found in a page merely because they appear there. Tool calls and normal tool results are retained in the usual transcript, JSON/RPC, and SDK event surfaces, so do not search for secrets or sensitive local paths. ## Network and content boundary Search sends one GET request to DuckDuckGo's fixed HTML endpoint. Standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` behavior applies to that fixed search request. Page navigation is separate and intentionally stricter. It makes GET requests only to links already retained under a reference. Every initial URL and redirect must be HTTP(S), use port 80 or 443, resolve solely to public addresses, and pass address validation before connection. The client pins the validated IP set for each request hop, preserves ordinary TLS hostname verification and SNI, follows at most three of `301`, `302`, `303`, `307`, and `308`, and uses no proxy. Environments requiring a proxy cannot use page navigation in this version. The navigation client sends no cookies or credentials, does not execute JavaScript, and accepts only final `200 OK` `text/html` or `text/plain` responses. It rejects redirects outside policy, unsupported media, encoded responses, oversized responses, and transport failures with sanitized errors. It does not expose headers, cookies, raw HTML, proxy settings, resolved IPs, or transport diagnostics. HTML extraction is intentionally semantic rather than browser-like. It omits scripts, styles, forms, frames, objects, and embedded content; bounds parsing, page text, links, result output, and stored memory; and discards raw response bodies after extraction. PDFs, images, audio/video, archives, XML/RSS, browser automation, form submission, and arbitrary URL fetching are unsupported.