{"record":{"id":"3ce1f0e2594daca1","repo":"zeroclaw-labs/zeroclaw","slug":"browser-tool-enabled-but-no-allowed-domains-config","errorCode":null,"errorMessage":"Browser tool enabled but no allowed_domains configured. Add [browser].allowed_domains in config.toml","messagePattern":"Browser tool enabled but no allowed_domains configured\\. Add \\[browser\\]\\.allowed_domains in config\\.toml","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-tools/src/browser.rs","lineNumber":463,"sourceCode":"        // Block file:// URLs — browser file access bypasses all SSRF and\n        // domain-allowlist controls and can exfiltrate arbitrary local files.\n        if url.starts_with(\"file://\") {\n            anyhow::bail!(\"file:// URLs are not allowed in browser automation\");\n        }\n\n        if !url.starts_with(\"https://\") && !url.starts_with(\"http://\") {\n            anyhow::bail!(\"Only http:// and https:// URLs are allowed\");\n        }\n\n        let parsed = reqwest::Url::parse(url)\n            .map_err(|e| anyhow::Error::msg(format!(\"Invalid URL format: {e}\")))?;\n\n        if !parsed.username().is_empty() || parsed.password().is_some() {\n            anyhow::bail!(\"URL userinfo is not allowed\");\n        }\n\n        if self.allowed_domains.is_empty() && self.allowed_private_hosts.is_empty() {\n            anyhow::bail!(\n                \"Browser tool enabled but no allowed_domains configured. \\\n                Add [browser].allowed_domains in config.toml\"\n            );\n        }\n\n        let host_str = parsed\n            .host_str()\n            .ok_or_else(|| anyhow::Error::msg(\"URL must include a host\"))?;\n\n        let is_ipv6 = host_str.parse::<std::net::Ipv6Addr>().is_ok();\n        let host = if is_ipv6 {\n            format!(\"[{host_str}]\")\n        } else {\n            host_str.to_lowercase()\n        };\n\n        let private_host = domain_guard::is_private_or_local_host(&host);\n        let private_host_allowed = private_host","sourceCodeStart":445,"sourceCodeEnd":481,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-tools/src/browser.rs#L445-L481","documentation":"Error \"Browser tool enabled but no allowed_domains configured. Add [browser].allowed_domains in config.toml\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-tools/src/browser.rs:463 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add [browser].allowed_domains in config.toml listing permitted hosts."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}