diff --git a/README.md b/README.md index d2c3852..de8c85a 100644 --- a/README.md +++ b/README.md @@ -734,7 +734,7 @@ A [JSON Schema](agent-browser.schema.json) is available for IDE autocomplete and ```json { - "$schema": "https://raw.githubusercontent.com/vercel-labs/agent-browser/main/agent-browser.schema.json", + "$schema": "https://agent-browser.dev/schema.json", "headed": true } ``` diff --git a/agent-browser.schema.json b/agent-browser.schema.json index b61faeb..48e38ba 100644 --- a/agent-browser.schema.json +++ b/agent-browser.schema.json @@ -147,7 +147,7 @@ }, "idleTimeout": { "type": "string", - "description": "Auto-shutdown the daemon after N ms of inactivity (e.g., '60000')." + "description": "Auto-shutdown the daemon after inactivity (e.g., '30s', '5m', '1h', or raw milliseconds like '60000')." }, "model": { "type": "string", @@ -163,4 +163,4 @@ } }, "additionalProperties": true -} \ No newline at end of file +} diff --git a/cli/src/native/actions.rs b/cli/src/native/actions.rs index 09f713a..2cca7d3 100644 --- a/cli/src/native/actions.rs +++ b/cli/src/native/actions.rs @@ -1064,16 +1064,14 @@ impl DaemonState { } } } - "Page.screencastFrame" => { - // Frame broadcasting and acks are handled in real-time by the - // stream server's background CDP event loop. Here we just - // collect acks as a fallback for non-streaming mode. - if self.stream_server.is_none() { - if let Some(sid) = - event.params.get("sessionId").and_then(|v| v.as_i64()) - { - pending_acks.push(sid); - } + // Frame broadcasting and acks are handled in real-time by the + // stream server's background CDP event loop. Here we just + // collect acks as a fallback for non-streaming mode. + "Page.screencastFrame" if self.stream_server.is_none() => { + if let Some(sid) = + event.params.get("sessionId").and_then(|v| v.as_i64()) + { + pending_acks.push(sid); } } "Page.javascriptDialogOpening" => { diff --git a/cli/src/native/browser.rs b/cli/src/native/browser.rs index ee2b92d..eafac54 100644 --- a/cli/src/native/browser.rs +++ b/cli/src/native/browser.rs @@ -1302,10 +1302,8 @@ async fn poll_network_idle( } } } - "Page.loadEventFired" => { - if p.is_empty() { - idle_start = Some(tokio::time::Instant::now()); - } + "Page.loadEventFired" if p.is_empty() => { + idle_start = Some(tokio::time::Instant::now()); } _ => {} } diff --git a/docs/public/schema.json b/docs/public/schema.json new file mode 100644 index 0000000..48e38ba --- /dev/null +++ b/docs/public/schema.json @@ -0,0 +1,166 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Agent Browser Configuration", + "description": "Configuration file for agent-browser (e.g., agent-browser.json or ~/.agent-browser/config.json)", + "type": "object", + "properties": { + "headed": { + "type": "boolean", + "description": "Show browser window instead of running headless." + }, + "json": { + "type": "boolean", + "description": "Output in JSON format." + }, + "debug": { + "type": "boolean", + "description": "Enable debug output." + }, + "session": { + "type": "string", + "description": "Session identifier." + }, + "sessionName": { + "type": "string", + "description": "Auto-save/load state persistence name." + }, + "executablePath": { + "type": "string", + "description": "Path to a custom browser executable." + }, + "extensions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Paths to browser extensions. Extensions from user-level and project-level configs are concatenated." + }, + "profile": { + "type": "string", + "description": "Path to the browser profile data directory." + }, + "state": { + "type": "string", + "description": "Path to load/save browser state." + }, + "proxy": { + "type": "string", + "description": "Proxy server URL (e.g., http://localhost:8080)." + }, + "proxyBypass": { + "type": "string", + "description": "Comma-separated domains to bypass the proxy (e.g., localhost,*.internal.com)." + }, + "args": { + "type": "string", + "description": "Additional comma-separated launch arguments for the browser." + }, + "userAgent": { + "type": "string", + "description": "Custom User-Agent string." + }, + "provider": { + "type": "string", + "description": "Provider to use, such as 'ios'." + }, + "device": { + "type": "string", + "description": "Device name or identifier for emulation or providers (e.g., 'iPhone 16 Pro')." + }, + "ignoreHttpsErrors": { + "type": "boolean", + "description": "Ignore HTTPS errors during navigation." + }, + "allowFileAccess": { + "type": "boolean", + "description": "Allow file:// URLs to access local files." + }, + "cdp": { + "type": "string", + "description": "Chrome DevTools Protocol endpoint URL." + }, + "autoConnect": { + "type": "boolean", + "description": "Auto-discover and connect to a running Chrome instance." + }, + "annotate": { + "type": "boolean", + "description": "Annotated screenshot with numbered element labels." + }, + "colorScheme": { + "type": "string", + "enum": ["dark", "light", "no-preference"], + "description": "Color scheme preference." + }, + "downloadPath": { + "type": "string", + "description": "Default directory for browser downloads." + }, + "contentBoundaries": { + "type": "boolean", + "description": "Wrap page output in boundary markers for LLM safety." + }, + "maxOutput": { + "type": "integer", + "minimum": 0, + "description": "Max characters for page output (truncates beyond limit)." + }, + "allowedDomains": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Allowed domain patterns (e.g., ['example.com', '*.example.com'])." + }, + "actionPolicy": { + "type": "string", + "description": "Path to action policy JSON file." + }, + "confirmActions": { + "type": "string", + "description": "Comma-separated action categories requiring confirmation." + }, + "confirmInteractive": { + "type": "boolean", + "description": "Enable interactive confirmation prompts (auto-denies if stdin is not a TTY)." + }, + "engine": { + "type": "string", + "enum": ["chrome", "lightpanda"], + "default": "chrome", + "description": "Browser engine to use." + }, + "screenshotDir": { + "type": "string", + "description": "Default screenshot output directory." + }, + "screenshotQuality": { + "type": "integer", + "minimum": 0, + "maximum": 100, + "description": "JPEG quality for screenshots (0-100)." + }, + "screenshotFormat": { + "type": "string", + "enum": ["png", "jpeg"], + "description": "Screenshot format." + }, + "idleTimeout": { + "type": "string", + "description": "Auto-shutdown the daemon after inactivity (e.g., '30s', '5m', '1h', or raw milliseconds like '60000')." + }, + "model": { + "type": "string", + "description": "AI model for chat command (e.g., 'openai/gpt-4o')." + }, + "noAutoDialog": { + "type": "boolean", + "description": "Disable automatic dismissal of alert/beforeunload dialogs." + }, + "headers": { + "type": "string", + "description": "Custom HTTP headers supplied as a JSON-formatted string." + } + }, + "additionalProperties": true +} diff --git a/docs/src/app/configuration/page.mdx b/docs/src/app/configuration/page.mdx index 012ac48..dd3bc94 100644 --- a/docs/src/app/configuration/page.mdx +++ b/docs/src/app/configuration/page.mdx @@ -39,11 +39,11 @@ AGENT_BROWSER_CONFIG=./ci-config.json agent-browser open example.com } ``` -A [JSON Schema](https://github.com/vercel-labs/agent-browser/blob/main/agent-browser.schema.json) is available for IDE autocomplete and validation. Add a `$schema` key to your config file to enable it: +A [JSON Schema](https://agent-browser.dev/schema.json) is available for IDE autocomplete and validation. Add a `$schema` key to your config file to enable it: ```json { - "$schema": "https://raw.githubusercontent.com/vercel-labs/agent-browser/main/agent-browser.schema.json", + "$schema": "https://agent-browser.dev/schema.json", "headed": true } ```