mirror of
https://github.com/actionbook/actionbook.git
synced 2026-09-19 03:28:06 +08:00
b0a7d8dffb
Relax SessionId validation from `^[a-z][a-z0-9-]{1,63}$` to
`^[a-z][a-z0-9_-]{1,63}$`. Also updates sanitize_profile to preserve
underscores rather than mapping them to hyphens.
2162 lines
52 KiB
Markdown
2162 lines
52 KiB
Markdown
# Actionbook CLI v1.0.0 — API Reference
|
|
|
|
> Source document: `cli_prd.md`
|
|
> Date: 2026-03-26
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
**Part I — Principles & Conventions**
|
|
|
|
1. [Design Goals & Principles](#1-design-goals--principles)
|
|
2. [General Conventions](#2-general-conventions)
|
|
3. [Error Protocol](#3-error-protocol)
|
|
4. [Compatibility & Boundary Rules](#4-compatibility--boundary-rules)
|
|
5. [Test Scenarios](#5-test-scenarios)
|
|
|
|
**Part II — Detailed Command Definitions**
|
|
|
|
6. [Non-Browser Commands](#6-non-browser-commands)
|
|
7. [Browser Lifecycle](#7-browser-lifecycle)
|
|
8. [Browser Tab Management](#8-browser-tab-management)
|
|
9. [Browser Navigation](#9-browser-navigation)
|
|
10. [Browser Observation](#10-browser-observation)
|
|
11. [Browser Interaction](#11-browser-interaction)
|
|
12. [Browser Waiting](#12-browser-waiting)
|
|
13. [Browser Cookies](#13-browser-cookies)
|
|
14. [Browser Storage](#14-browser-storage)
|
|
|
|
---
|
|
|
|
## 1. Design Goals & Principles
|
|
|
|
### 1.1 Design Goals
|
|
|
|
- All commands return a unified structure
|
|
- Session-scoped commands always explicitly carry `session_id` and `tab_id`
|
|
- Default text output also has a stable format, no longer just "best-effort readable"
|
|
- This is an entirely new protocol version, not backward-compatible with the legacy response format
|
|
|
|
### 1.2 Design Principles
|
|
|
|
1. `--json` always uses a unified envelope
|
|
2. Text output always uses a fixed header format
|
|
3. Session context is a first-class concept, not hidden in logs
|
|
4. Non-session commands do not return `context`
|
|
5. `session_id` supports semantic naming
|
|
6. `tab_id` uses short IDs, suitable for humans and LLMs to reuse in the terminal
|
|
|
|
### 1.3 ID Conventions
|
|
|
|
#### session_id
|
|
|
|
- **Type:** String
|
|
- **Auto-generated format:** `sN` (e.g. `s1`, `s2`, `s3`) — global counter, mode-agnostic
|
|
- **Manual format:** via `actionbook browser start --set-session-id <SID>` — must match `^[a-z][a-z0-9_-]{1,63}$`
|
|
- **Requirements:**
|
|
- Uniquely identifies a session within the current CLI lifecycle and persisted state
|
|
- **Examples (manual):** `research-google`, `github_login_debug`, `airbnb-form-fill`
|
|
|
|
#### tab_id
|
|
|
|
- **Type:** Short string
|
|
- **Format:** `t1`, `t2`, `t3`, ...
|
|
- **Scope:** Unique within a single session
|
|
- **Notes:**
|
|
- `tab_id` is the external-facing ID
|
|
- If the underlying browser's native tab handle is needed, it can be additionally exposed via `native_tab_id`
|
|
- Users are not allowed to manually name tabs
|
|
|
|
#### Optional Internal IDs
|
|
|
|
If the underlying bridge requires it, the JSON may include:
|
|
- `native_tab_id`
|
|
- `native_window_id`
|
|
|
|
These fields are only used for bridging and debugging, not as primary reference IDs.
|
|
|
|
### 1.4 Default Decisions
|
|
|
|
This version adopts the following defaults:
|
|
|
|
- `session_id` auto-generated as `sN` (s1, s2, …); user-specifiable via `--set-session-id`
|
|
- `tab_id` is a session-scoped short ID `tN`
|
|
- `native_tab_id` is an optional debug-only field
|
|
- Non-session commands omit `context`
|
|
- Both JSON and text output are part of the formal contract
|
|
- Unified envelope; does not continue the legacy response format
|
|
|
|
---
|
|
|
|
## 2. General Conventions
|
|
|
|
### 2.1 Definitions
|
|
|
|
| Symbol | Meaning |
|
|
|------|------|
|
|
| `<selector>` | ref (`@eN`), CSS selector, or XPath |
|
|
| `<coordinates>` | Coordinates in `x,y` format |
|
|
| `<SID>` | Session ID, a semantic string (e.g., `research-google`) |
|
|
| `<TID>` | Tab ID, short ID format `tN` (e.g., `t1`, `t2`) |
|
|
| `<WID>` | Window ID, short ID format `wN` (e.g., `w0`, `w1`) |
|
|
|
|
### 2.2 Global Flags
|
|
|
|
All `browser` subcommands support:
|
|
|
|
| Flag | Type | Description |
|
|
|------|------|------|
|
|
| `--timeout <ms>` | u64 | Timeout in milliseconds |
|
|
| `--json` | bool | JSON output (default is plain text) |
|
|
|
|
### 2.3 Addressing Levels
|
|
|
|
| Level | Requirements | Examples |
|
|
|------|------|------|
|
|
| **Global** | No session/tab | `browser start`, `browser list-sessions` |
|
|
| **Session** | `--session <SID>` | `browser status`, `browser list-tabs`, `cookies *` |
|
|
| **Tab** | `--session <SID> --tab <TID>` | `browser goto`, `browser click`, `storage *` |
|
|
|
|
### 2.4 JSON Envelope (Unified Response Format)
|
|
|
|
```json
|
|
{
|
|
"ok": true,
|
|
"command": "browser snapshot",
|
|
"context": {
|
|
"session_id": "research-google",
|
|
"tab_id": "t1",
|
|
"window_id": "w1",
|
|
"url": "https://google.com",
|
|
"title": "Google"
|
|
},
|
|
"data": {},
|
|
"error": null,
|
|
"meta": {
|
|
"duration_ms": 123,
|
|
"warnings": [],
|
|
"pagination": null,
|
|
"truncated": false
|
|
}
|
|
}
|
|
```
|
|
|
|
**Top-level fields:**
|
|
|
|
| Field | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `ok` | boolean | Yes | Whether the command succeeded |
|
|
| `command` | string | Yes | Normalized command name (e.g., `browser snapshot`) |
|
|
| `context` | object/null | No | Returned only for session commands |
|
|
| `data` | any/null | Yes | Business return value (typically an object; string for help/version; `null` on failure) |
|
|
| `error` | object/null | Yes | Error information (`null` on success) |
|
|
| `meta` | object | Yes | Metadata |
|
|
|
|
**context field rules:**
|
|
- `session_id`: Required for session commands
|
|
- `tab_id`: Required for tab-level commands
|
|
- `window_id`: Returned only in multi-window scenarios
|
|
- `url` / `title`: Returned when known in the current context
|
|
- Special case: `browser start` is a Global-level command (no session input required), but returns `context` after creating a session (containing the newly created session_id and tab_id)
|
|
|
|
**error structure:**
|
|
|
|
```json
|
|
{
|
|
"code": "ELEMENT_NOT_FOUND",
|
|
"message": "Element not found: #submit",
|
|
"retryable": false,
|
|
"details": { "selector": "#submit" }
|
|
}
|
|
```
|
|
|
|
**meta structure:**
|
|
|
|
```json
|
|
{
|
|
"duration_ms": 123,
|
|
"warnings": [],
|
|
"pagination": { "page": 1, "page_size": 10, "total": 42, "has_more": true },
|
|
"truncated": false
|
|
}
|
|
```
|
|
|
|
### 2.5 Text Output Protocol
|
|
|
|
**Non-session commands:** First line has no prefix; output directly.
|
|
|
|
**Session-level commands:**
|
|
```
|
|
[<session_id>]
|
|
<body>
|
|
```
|
|
|
|
**Tab-level commands:**
|
|
```
|
|
[<session_id> <tab_id>] <url>
|
|
<body>
|
|
```
|
|
|
|
**General rules:**
|
|
- Read commands output the body directly
|
|
- Action commands start with `ok <command>`
|
|
- Failures always output `error <CODE>: <message>`
|
|
- Note: Some commands' text output may deviate from the strict format (e.g., `restart` is Session-level but output includes tab_id, `close-tab` is Tab-level but omits URL) — these follow the PRD examples as the source of truth
|
|
|
|
---
|
|
|
|
## 3. Error Protocol
|
|
|
|
### 3.1 Unified Error Response
|
|
|
|
```json
|
|
{
|
|
"ok": false,
|
|
"command": "browser click",
|
|
"context": { "session_id": "research-google", "tab_id": "t1", "url": "https://google.com" },
|
|
"data": null,
|
|
"error": {
|
|
"code": "ELEMENT_NOT_FOUND",
|
|
"message": "Element not found: button[type=submit]",
|
|
"retryable": false,
|
|
"details": { "selector": "button[type=submit]" }
|
|
},
|
|
"meta": { "duration_ms": 3012, "warnings": [], "pagination": null, "truncated": false }
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
error ELEMENT_NOT_FOUND: Element not found: button[type=submit]
|
|
```
|
|
|
|
### 3.2 Recommended Error Codes
|
|
|
|
| Error Code | Description |
|
|
|--------|------|
|
|
| `INVALID_ARGUMENT` | Invalid argument |
|
|
| `SESSION_NOT_FOUND` | Session does not exist |
|
|
| `TAB_NOT_FOUND` | Tab does not exist |
|
|
| `FRAME_NOT_FOUND` | Frame does not exist |
|
|
| `ELEMENT_NOT_FOUND` | Element does not exist |
|
|
| `MULTIPLE_MATCHES` | `query one` matched more than 1 |
|
|
| `INDEX_OUT_OF_RANGE` | `query nth` index out of range |
|
|
| `TIMEOUT` | Operation timed out |
|
|
| `NAVIGATION_FAILED` | Navigation failed |
|
|
| `EVAL_FAILED` | JavaScript execution failed |
|
|
| `ARTIFACT_WRITE_FAILED` | File write failed (screenshot/pdf) |
|
|
| `UNSUPPORTED_OPERATION` | Unsupported operation |
|
|
| `INTERNAL_ERROR` | Internal error |
|
|
|
|
---
|
|
|
|
## 4. Compatibility & Boundary Rules
|
|
|
|
- Non-session commands must omit `context`
|
|
- Session commands must return `context.session_id` as long as the session has been located
|
|
- Tab commands must return `context.tab_id` as long as the tab has been located
|
|
- `data` must always be present; `null` on failure
|
|
- `error` must always be present; `null` on success
|
|
- `command` uses a normalized name, not the raw argv string
|
|
- Text output must not include implementation detail logs
|
|
- Default text output and JSON must be semantically consistent
|
|
|
|
---
|
|
|
|
## 5. Test Scenarios
|
|
|
|
### 5.1 Basic Consistency
|
|
|
|
- `search` / `get` / `setup` / `help` / `--version` do not return `context`
|
|
- Browser commands always return `session_id` when applicable
|
|
- Tab-level commands always return `tab_id`
|
|
|
|
### 5.2 ID Rules
|
|
|
|
- Without `--set-session-id`, the first session is `s1`, the second `s2`, etc. (global counter)
|
|
- `browser start --set-session-id research-google` returns `session_id` = `"research-google"`
|
|
- Opening tabs sequentially within the same session returns `t1`, `t2`, `t3`
|
|
- `native_tab_id` may change, but `tab_id` remains stable for the upper layer
|
|
|
|
### 5.3 Text Format
|
|
|
|
- Snapshot body must not contain extraneous prompt text
|
|
- `text` / `html` / `eval` body outputs the value directly
|
|
- `click` / `fill` / `upload` / `wait` second line always starts with `ok <command>`
|
|
- Errors always follow the format `error <CODE>: <message>`
|
|
|
|
### 5.4 JSON Structure
|
|
|
|
- All commands have `ok` / `command` / `data` / `error` / `meta`
|
|
- Pagination information only appears in `meta.pagination`
|
|
- Truncation information only appears in `meta.truncated`
|
|
|
|
### 5.5 Query Semantics
|
|
|
|
- `browser query one` succeeds only when there is exactly 1 match
|
|
- `browser query one` returns `MULTIPLE_MATCHES` when there are more than 1 match
|
|
- `browser query one` returns `ELEMENT_NOT_FOUND` when there are 0 matches
|
|
- `browser query nth <n>` uses 1-based indexing
|
|
- `browser query nth <n>` returns `INDEX_OUT_OF_RANGE` when `n > count`
|
|
- `browser query all` succeeds with 0 matches, returning an empty array
|
|
- `browser query count` succeeds with 0 matches, returning only `count`
|
|
|
|
### 5.6 Navigation & Context Updates
|
|
|
|
- `goto` / `click` / `back` / `forward` / `reload` update `context.url` after success
|
|
- `context.title` is updated synchronously when the page title is known
|
|
|
|
---
|
|
|
|
## 6. Non-Browser Commands
|
|
|
|
These commands do not return `context`.
|
|
|
|
### 6.1 `actionbook search <query>`
|
|
|
|
Search for actions.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<query>` | string | Yes | Search keywords |
|
|
| `-d, --domain` | string | No | Filter by domain |
|
|
| `-u, --url` | string | No | Filter by URL |
|
|
| `-p, --page` | int | No | Page number, default 1 |
|
|
| `-s, --page-size` | int | No | Items per page, default 10 |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"query": "google login",
|
|
"items": [
|
|
{
|
|
"area_id": "google.com:/login:default",
|
|
"title": "Google Login",
|
|
"summary": "Login form and related actions",
|
|
"score": 0.98,
|
|
"url": "https://google.com/login"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
1 result
|
|
1. google.com:/login:default
|
|
Google Login
|
|
score: 0.98
|
|
https://google.com/login
|
|
```
|
|
|
|
---
|
|
|
|
### 6.2 `actionbook get <area_id>`
|
|
|
|
Get action details.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<area_id>` | string | Yes | Action area ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"area_id": "google.com:/login:default",
|
|
"url": "https://google.com/login",
|
|
"description": "Login page",
|
|
"elements": [
|
|
{
|
|
"element_id": "email",
|
|
"type": "input",
|
|
"description": "Email input",
|
|
"css": "#identifierId",
|
|
"xpath": null,
|
|
"allow_methods": ["fill", "type", "focus"]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
google.com:/login:default
|
|
https://google.com/login
|
|
|
|
Login page
|
|
|
|
[email] input
|
|
description: Email input
|
|
css: #identifierId
|
|
methods: fill, type, focus
|
|
```
|
|
|
|
---
|
|
|
|
### 6.3 `actionbook setup`
|
|
|
|
Interactive configuration wizard.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--target` | string | No | Quick mode only: install skills for the specified agent and skip the setup wizard. Conflicts with `--api-key`, `--browser`, and `--reset`. |
|
|
| `--api-key` | string | No | API Key |
|
|
| `--browser` | string | No | Browser configuration |
|
|
| `--non-interactive` | bool | No | Non-interactive mode |
|
|
| `--reset` | bool | No | Reset configuration |
|
|
|
|
> Setup enters an interactive configuration flow. The PRD does not define a JSON/text return value protocol (interactive commands do not output via `--json`). Return values for non-interactive mode (`--non-interactive`) are pending PRD clarification.
|
|
|
|
---
|
|
|
|
### 6.4 `actionbook help`
|
|
|
|
**JSON `data`:** `"help text here"` (string)
|
|
|
|
**Text output:**
|
|
```
|
|
actionbook browser <subcommand>
|
|
|
|
start Start or attach a browser session
|
|
list-tabs List tabs in a session
|
|
snapshot Capture accessibility snapshot
|
|
```
|
|
|
|
---
|
|
|
|
### 6.5 `actionbook --version`
|
|
|
|
**JSON `data`:** `"1.0.0"` (string)
|
|
|
|
**Text output:** `1.0.0`
|
|
|
|
---
|
|
|
|
## 7. Browser Lifecycle
|
|
|
|
### 7.1 `actionbook browser start`
|
|
|
|
> Addressing level: **Global**
|
|
> command: `browser start`
|
|
|
|
Create or attach to a session. The session_id can be specified via `--set-session-id`; optionally auto-opens an initial tab.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--mode` | `local\|extension\|cloud` | No | Browser mode, default `local` |
|
|
| `--headless` | bool | No | Whether to use headless mode |
|
|
| `--profile` | string | No | Profile to use for the session |
|
|
| `--open-url` | string | No | Navigate to this URL when opening the browser |
|
|
| `--cdp-endpoint` | string | No | Connect to an existing CDP endpoint (does not launch a new browser) |
|
|
| `--header <KEY:VALUE>` | string | No | Only effective with `--cdp-endpoint`, passes headers when connecting |
|
|
| `--set-session-id` | string | No | Specify a semantic session ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"session": {
|
|
"session_id": "research-google",
|
|
"mode": "local",
|
|
"status": "running",
|
|
"headless": false,
|
|
"cdp_endpoint": "ws://127.0.0.1:9222/devtools/browser/..."
|
|
},
|
|
"tab": {
|
|
"tab_id": "t1",
|
|
"url": "https://google.com",
|
|
"title": "Google",
|
|
"native_tab_id": 391
|
|
},
|
|
"reused": false
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
ok browser start
|
|
mode: local
|
|
status: running
|
|
title: Google
|
|
```
|
|
|
|
---
|
|
|
|
### 7.2 `actionbook browser list-sessions`
|
|
|
|
> Addressing level: **Global**
|
|
> command: `browser list-sessions`
|
|
|
|
List all active sessions.
|
|
|
|
**Parameters:** None
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"total_sessions": 1,
|
|
"sessions": [
|
|
{
|
|
"session_id": "research-google",
|
|
"mode": "local",
|
|
"status": "running",
|
|
"headless": false,
|
|
"tabs_count": 2
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
1 session
|
|
[research-google]
|
|
status: running
|
|
tabs: 2
|
|
```
|
|
|
|
---
|
|
|
|
### 7.3 `actionbook browser status --session <SID>`
|
|
|
|
> Addressing level: **Session**
|
|
> command: `browser status`
|
|
|
|
View detailed status of a specified session.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"session": {
|
|
"session_id": "research-google",
|
|
"mode": "local",
|
|
"status": "running",
|
|
"headless": false,
|
|
"tabs_count": 2
|
|
},
|
|
"tabs": [
|
|
{
|
|
"tab_id": "t1",
|
|
"url": "https://google.com",
|
|
"title": "Google"
|
|
}
|
|
],
|
|
"capabilities": {
|
|
"snapshot": true,
|
|
"pdf": true,
|
|
"upload": true
|
|
}
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google]
|
|
status: running
|
|
mode: local
|
|
tabs: 2
|
|
```
|
|
|
|
---
|
|
|
|
### 7.4 `actionbook browser close --session <SID>`
|
|
|
|
> Addressing level: **Session**
|
|
> command: `browser close`
|
|
|
|
Close the specified session and its browser.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"session_id": "research-google",
|
|
"status": "closed",
|
|
"closed_tabs": 2
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google]
|
|
ok browser close
|
|
closed_tabs: 2
|
|
```
|
|
|
|
---
|
|
|
|
### 7.5 `actionbook browser restart --session <SID>`
|
|
|
|
> Addressing level: **Session**
|
|
> command: `browser restart`
|
|
|
|
Close and restart the session with the same profile/mode.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"session": {
|
|
"session_id": "research-google",
|
|
"mode": "local",
|
|
"status": "running",
|
|
"headless": false,
|
|
"tabs_count": 1
|
|
},
|
|
"reopened": true
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1]
|
|
ok browser restart
|
|
status: running
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Browser Tab Management
|
|
|
|
### 8.1 `actionbook browser list-tabs --session <SID>`
|
|
|
|
> Addressing level: **Session**
|
|
> command: `browser list-tabs`
|
|
|
|
List all tabs in a specified session.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"total_tabs": 1,
|
|
"tabs": [
|
|
{
|
|
"tab_id": "t1",
|
|
"url": "https://google.com",
|
|
"title": "Google",
|
|
"native_tab_id": 391
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google]
|
|
1 tab
|
|
[t1] Google
|
|
https://google.com
|
|
```
|
|
|
|
---
|
|
|
|
### 8.2 `actionbook browser new-tab <url>... --session <SID>`
|
|
|
|
> Addressing level: **Session**
|
|
> command: `browser new-tab`
|
|
> alias: `browser open`
|
|
|
|
Open a new tab in the specified session.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<url>` | string[] | Yes | One or more URLs to open |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--new-window` | bool | No | Open in a new window |
|
|
| `--window <WID>` | string | No | Open in a specified window |
|
|
| `--tab <TID>` / `--set-tab-id <TID>` | string | No | Set a custom tab ID. When opening multiple URLs, repeat once per URL in order. |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"tab": {
|
|
"tab_id": "t2",
|
|
"url": "https://example.com",
|
|
"title": "Example Domain",
|
|
"native_tab_id": 392
|
|
},
|
|
"created": true,
|
|
"new_window": false
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t2] https://example.com
|
|
ok browser new-tab
|
|
title: Example Domain
|
|
```
|
|
|
|
When multiple URLs are provided, the command opens them in order. If any URL
|
|
fails, the command exits non-zero and reports both the opened tabs and the
|
|
failed URLs.
|
|
|
|
---
|
|
|
|
### 8.3 `actionbook browser close-tab --session <SID> --tab <TID>`
|
|
|
|
> Addressing level: **Tab**
|
|
> command: `browser close-tab`
|
|
|
|
Close the specified tab.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"closed_tab_id": "t2"
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t2]
|
|
ok browser close-tab
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Browser Navigation
|
|
|
|
All Navigation commands have addressing level: **Tab**, requiring `--session <SID> --tab <TID>`.
|
|
|
|
### 9.1 `actionbook browser goto <url>`
|
|
|
|
> command: `browser goto`
|
|
|
|
Navigate to the specified URL.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<url>` | string | Yes | Target URL |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"kind": "goto",
|
|
"requested_url": "https://google.com/search?q=actionbook",
|
|
"from_url": "https://google.com",
|
|
"to_url": "https://google.com/search?q=actionbook",
|
|
"title": "actionbook - Google Search"
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com/search?q=actionbook
|
|
ok browser goto
|
|
title: actionbook - Google Search
|
|
```
|
|
|
|
---
|
|
|
|
### 9.2 `actionbook browser back`
|
|
|
|
> command: `browser back`
|
|
|
|
Navigate back.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** Same structure as `goto`, with `kind` = `"back"`.
|
|
|
|
> Rule: After a successful goto/back/forward/reload, `context.url` must be updated to the post-navigation URL, and `context.title` is updated synchronously when known.
|
|
|
|
---
|
|
|
|
### 9.3 `actionbook browser forward`
|
|
|
|
> command: `browser forward`
|
|
|
|
Navigate forward.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** Same structure as `goto`, with `kind` = `"forward"`.
|
|
|
|
---
|
|
|
|
### 9.4 `actionbook browser reload`
|
|
|
|
> command: `browser reload`
|
|
|
|
Reload the page.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** Same structure as `goto`, with `kind` = `"reload"`.
|
|
|
|
---
|
|
|
|
## 10. Browser Observation
|
|
|
|
All Observation commands have addressing level: **Tab** (unless otherwise noted).
|
|
|
|
### 10.1 `actionbook browser snapshot`
|
|
|
|
> command: `browser snapshot`
|
|
|
|
Capture an accessibility tree snapshot of the page.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--interactive` | bool | No | Include only interactive elements |
|
|
| `--cursor` | bool | No (default: true) | Include mouse/focus-interactive custom elements (cursor:pointer, onclick, tabindex, etc.) — always enabled by default |
|
|
| `--compact` | bool | No | Compact output, remove empty structural nodes |
|
|
| `--depth <n>` | int | No | Limit maximum tree depth |
|
|
| `--selector <sel>` | string | No | Limit to a specific subtree |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"format": "snapshot",
|
|
"path": "/Users/alice/.actionbook/sessions/s1/snapshot_1711900000000.txt",
|
|
"nodes": [
|
|
{
|
|
"ref": "e1",
|
|
"role": "textbox",
|
|
"name": "Search",
|
|
"value": ""
|
|
}
|
|
],
|
|
"stats": {
|
|
"node_count": 2,
|
|
"interactive_count": 2
|
|
}
|
|
}
|
|
```
|
|
|
|
> Note: snapshot content is saved to a file at `data.path`. To read the content, use the file path directly. `data.nodes` provides the structured tree for programmatic use.
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
Refs are stable across snapshots — if the DOM node stays the same, the ref stays the same.
|
|
output saved to /Users/alice/.actionbook/sessions/s1/snapshot_1711900000000.txt
|
|
```
|
|
|
|
> When truncated, `meta.truncated = true`.
|
|
|
|
---
|
|
|
|
### 10.2 `actionbook browser screenshot <path>`
|
|
|
|
> command: `browser screenshot`
|
|
|
|
Capture a page screenshot.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<path>` | string | Yes | Output file path |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--full` | bool | No | Capture the full page (not just the current viewport) |
|
|
| `--annotate` | bool | No | Overlay numbered labels marking interactive elements, where `[N]` corresponds to ref `@eN` |
|
|
| `--screenshot-quality <0-100>` | int | No | JPEG quality (effective only for jpeg) |
|
|
| `--screenshot-format <png\|jpeg>` | string | No | Image format |
|
|
| `--selector <sel>` | string | No | Limit to a specific sub-region |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"artifact": {
|
|
"path": "/tmp/google.png",
|
|
"mime_type": "image/png",
|
|
"bytes": 183920
|
|
}
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
ok browser screenshot
|
|
path: /tmp/google.png
|
|
```
|
|
|
|
---
|
|
|
|
### 10.3 `actionbook browser pdf <path>`
|
|
|
|
> command: `browser pdf`
|
|
|
|
Save the current page as a PDF (similar to print export).
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<path>` | string | Yes | Output file path |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:** Same as `screenshot`, with `artifact.mime_type` = `"application/pdf"`.
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
ok browser pdf
|
|
path: /tmp/google.pdf
|
|
```
|
|
|
|
---
|
|
|
|
### 10.4 `actionbook browser title`
|
|
|
|
> command: `browser title`
|
|
|
|
Get the page title.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "value": "Google" }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
Google
|
|
```
|
|
|
|
---
|
|
|
|
### 10.5 `actionbook browser url`
|
|
|
|
> command: `browser url`
|
|
|
|
Get the current page URL.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "value": "https://google.com" }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
https://google.com
|
|
```
|
|
|
|
---
|
|
|
|
### 10.6 `actionbook browser viewport`
|
|
|
|
> command: `browser viewport`
|
|
|
|
Get the viewport dimensions.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "width": 1440, "height": 900 }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
1440x900
|
|
```
|
|
|
|
---
|
|
|
|
### 10.7 `actionbook browser query <mode> <query_str>`
|
|
|
|
> command: `browser query`
|
|
|
|
Element query command with cardinality constraints.
|
|
|
|
**Subcommand forms:**
|
|
|
|
```
|
|
actionbook browser query one <query_str> --session <SID> --tab <TID>
|
|
actionbook browser query all <query_str> --session <SID> --tab <TID>
|
|
actionbook browser query nth <n> <query_str> --session <SID> --tab <TID>
|
|
actionbook browser query count <query_str> --session <SID> --tab <TID>
|
|
```
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<mode>` | `one\|all\|nth\|count` | Yes | Query mode |
|
|
| `<query_str>` | string | Yes | CSS selector or extended syntax |
|
|
| `<n>` | int | Required for nth mode | 1-based index |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**Supported `query_str` syntax:**
|
|
- Standard CSS selectors (`.item`, `#some_id`, `.c > .a > input[name=b]`)
|
|
- Extended syntax (jQuery-inspired):
|
|
- `:visible`
|
|
- `:contains(...)`
|
|
- `:has(...)`
|
|
- `:enabled`
|
|
- `:disabled`
|
|
- `:checked`
|
|
|
|
**Matched element structure:**
|
|
|
|
```json
|
|
{
|
|
"selector": ".item:nth-of-type(1)",
|
|
"tag": "div",
|
|
"text": "Item A",
|
|
"visible": true,
|
|
"enabled": true
|
|
}
|
|
```
|
|
|
|
#### mode = `one`
|
|
|
|
- Success condition: exactly 1 match
|
|
- 0 matches -> `ELEMENT_NOT_FOUND`
|
|
- More than 1 match -> `MULTIPLE_MATCHES`
|
|
|
|
**JSON `data` (success):**
|
|
|
|
```json
|
|
{
|
|
"mode": "one",
|
|
"query": ".item",
|
|
"count": 1,
|
|
"item": { "selector": ".item:nth-of-type(1)", "tag": "div", "text": "Item A", "visible": true, "enabled": true }
|
|
}
|
|
```
|
|
|
|
**JSON `error` (multiple matches):**
|
|
|
|
```json
|
|
{
|
|
"code": "MULTIPLE_MATCHES",
|
|
"message": "Query mode 'one' requires exactly 1 match, found 3",
|
|
"retryable": false,
|
|
"details": { "query": ".item", "count": 3, "sample_selectors": [".item:nth-of-type(1)", ".item:nth-of-type(2)", ".item:nth-of-type(3)"] }
|
|
}
|
|
```
|
|
|
|
**Text output (success):**
|
|
```
|
|
[research-google t1] https://example.com
|
|
1 match
|
|
selector: .item:nth-of-type(1)
|
|
text: Item A
|
|
```
|
|
|
|
#### mode = `all`
|
|
|
|
- Always returns a list
|
|
- 0 matches is still considered success, `items = []`
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"mode": "all",
|
|
"query": ".item",
|
|
"count": 3,
|
|
"items": [
|
|
{ "selector": ".item:nth-of-type(1)", "tag": "div", "text": "Item A", "visible": true, "enabled": true }
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
3 matches
|
|
1. .item:nth-of-type(1)
|
|
Item A
|
|
```
|
|
|
|
#### mode = `nth <n>`
|
|
|
|
- `n` is 1-based
|
|
- `n > count` -> `INDEX_OUT_OF_RANGE`
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"mode": "nth",
|
|
"query": ".item",
|
|
"index": 2,
|
|
"count": 3,
|
|
"item": { "selector": ".item:nth-of-type(2)", "tag": "div", "text": "Item B", "visible": true, "enabled": true }
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
match 2/3
|
|
selector: .item:nth-of-type(2)
|
|
text: Item B
|
|
```
|
|
|
|
#### mode = `count`
|
|
|
|
- Only returns the match count, does not return element details
|
|
- 0 matches is still considered success
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"mode": "count",
|
|
"query": ".item",
|
|
"count": 3
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
3
|
|
```
|
|
|
|
---
|
|
|
|
### 10.8 Read Commands (html / text / value / attr / attrs / box / styles)
|
|
|
|
Unified addressing: **Tab**. Unified JSON structure.
|
|
|
|
#### `actionbook browser html <selector>`
|
|
|
|
> command: `browser html`
|
|
|
|
Get the outer HTML of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"target": { "selector": "#title" },
|
|
"value": "<h1 id=\"title\">Example Domain</h1>"
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
<h1 id="title">Example Domain</h1>
|
|
```
|
|
|
|
#### `actionbook browser text <selector>`
|
|
|
|
> command: `browser text`
|
|
|
|
Get the inner text of an element.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | Target element |
|
|
| `--mode <raw\|readability>` | string | No | Text extraction mode |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "#title" }, "value": "Example Domain" }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
Example Domain
|
|
```
|
|
|
|
#### `actionbook browser value <selector>`
|
|
|
|
> command: `browser value`
|
|
|
|
Get the value of an input element.
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "#email" }, "value": "user@example.com" }`
|
|
|
|
#### `actionbook browser attr <selector> <name>`
|
|
|
|
> command: `browser attr`
|
|
|
|
Get a specific attribute of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `<name>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "a.link" }, "value": "https://google.com" }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
https://google.com
|
|
```
|
|
|
|
#### `actionbook browser attrs <selector>`
|
|
|
|
> command: `browser attrs`
|
|
|
|
Get all attributes of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "#btn" }, "value": { "id": "btn", "type": "submit", "class": "primary" } }`
|
|
|
|
**Text output:** Key-value list.
|
|
|
|
#### `actionbook browser box <selector>`
|
|
|
|
> command: `browser box`
|
|
|
|
Get the bounding box of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "#btn" }, "value": { "x": 10, "y": 20, "width": 120, "height": 32 } }`
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
x: 10
|
|
y: 20
|
|
width: 120
|
|
height: 32
|
|
```
|
|
|
|
#### `actionbook browser styles <selector> [names...]`
|
|
|
|
> command: `browser styles`
|
|
|
|
Get the computed styles of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `[names...]` (optional, specify property names), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "target": { "selector": "#btn" }, "value": { "color": "rgb(0,0,0)", "font-size": "14px" } }`
|
|
|
|
**Text output:** Requested style names and values.
|
|
|
|
---
|
|
|
|
### 10.9 `actionbook browser describe <selector>`
|
|
|
|
> command: `browser describe`
|
|
|
|
Return a rule-based summary of an element (deterministically generated, no LLM invocation).
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | Target element |
|
|
| `--nearby` | bool | No | Additionally return one level of shallow nearby context |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**Summary generation rules:**
|
|
- Based on DOM tag, ARIA role, accessible name, label/text/placeholder/value, key attributes (type, href), current state (disabled, checked, selected)
|
|
- No additional semantic inference
|
|
- Assembly priority: role -> name -> qualifiers
|
|
|
|
**`--nearby` constraints:**
|
|
- Only returns 1 level, no recursion
|
|
- At most 1 parent
|
|
- At most 1 previous_sibling / next_sibling each
|
|
- At most 3 children
|
|
- Only returns nodes that have a name, text, or interactive significance
|
|
|
|
**JSON `data` (without --nearby):**
|
|
|
|
```json
|
|
{
|
|
"target": { "selector": "button[type=submit]" },
|
|
"summary": "button \"Google Search\"",
|
|
"role": "button",
|
|
"name": "Google Search",
|
|
"tag": "button",
|
|
"attributes": { "type": "submit" },
|
|
"state": { "visible": true, "enabled": true },
|
|
"nearby": null
|
|
}
|
|
```
|
|
|
|
**JSON `data` (with --nearby):**
|
|
|
|
```json
|
|
{
|
|
"target": { "selector": "button[type=submit]" },
|
|
"summary": "button \"Edit\"",
|
|
"role": "button",
|
|
"name": "Edit",
|
|
"tag": "button",
|
|
"attributes": { "type": "button" },
|
|
"state": { "visible": true, "enabled": true },
|
|
"nearby": {
|
|
"parent": "listitem \"John Smith\"",
|
|
"previous_sibling": "text \"John Smith\"",
|
|
"next_sibling": null,
|
|
"children": []
|
|
}
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
button "Google Search"
|
|
```
|
|
|
|
**Text output (with --nearby):**
|
|
```
|
|
[research-google t1] https://google.com
|
|
button "Edit"
|
|
parent: listitem "John Smith"
|
|
previous_sibling: text "John Smith"
|
|
```
|
|
|
|
---
|
|
|
|
### 10.10 `actionbook browser state <selector>`
|
|
|
|
> command: `browser state`
|
|
|
|
Return the interactive state of an element.
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"target": { "selector": "#search" },
|
|
"state": {
|
|
"visible": true,
|
|
"enabled": true,
|
|
"checked": false,
|
|
"focused": true,
|
|
"editable": true,
|
|
"selected": false
|
|
}
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
visible: true
|
|
enabled: true
|
|
checked: false
|
|
focused: true
|
|
editable: true
|
|
selected: false
|
|
```
|
|
|
|
---
|
|
|
|
### 10.11 `actionbook browser inspect-point <coordinates>`
|
|
|
|
> command: `browser inspect-point`
|
|
|
|
Inspect the element at specified coordinates (recommended for use with screenshot).
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<coordinates>` | string | Yes | Format `x,y` |
|
|
| `--parent-depth <n>` | int | No | Number of parent levels to trace upward |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"point": { "x": 420, "y": 310 },
|
|
"element": {
|
|
"role": "button",
|
|
"name": "Google Search",
|
|
"selector": "input[name=btnK]"
|
|
},
|
|
"parents": [],
|
|
"screenshot_path": null
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
button "Google Search"
|
|
selector: input[name=btnK]
|
|
point: 420,310
|
|
```
|
|
|
|
---
|
|
|
|
### 10.12 `actionbook browser logs console`
|
|
|
|
> command: `browser logs console`
|
|
|
|
Get console logs.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--level <level[,level...]>` | string | No | Filter by level (comma-separated for multiple values) |
|
|
| `--tail <n>` | int | No | Return only the last n entries |
|
|
| `--since <id>` | string | No | Return only logs after the specified ID |
|
|
| `--clear` | bool | No | Clear logs after retrieval |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"items": [
|
|
{
|
|
"id": "log-1",
|
|
"level": "info",
|
|
"text": "App mounted",
|
|
"source": "app.js",
|
|
"timestamp_ms": 1710000000000
|
|
}
|
|
],
|
|
"cleared": false
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
1 log
|
|
info 1710000000000 app.js App mounted
|
|
```
|
|
|
|
---
|
|
|
|
### 10.13 `actionbook browser logs errors`
|
|
|
|
> command: `browser logs errors`
|
|
|
|
Get error logs.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--source <file>` | string | No | Filter by error source file |
|
|
| `--tail <n>` | int | No | Return only the last n entries |
|
|
| `--since <id>` | string | No | Return only logs after the specified ID |
|
|
| `--clear` | bool | No | Clear logs after retrieval |
|
|
|
|
**JSON `data`:** Same structure as `logs console`.
|
|
|
|
---
|
|
|
|
## 11. Browser Interaction
|
|
|
|
All Interaction commands have addressing level: **Tab**.
|
|
|
|
### 11.1 Action Commands (click / hover / focus / press / drag / mouse-move / scroll)
|
|
|
|
Unified JSON `data` structure:
|
|
|
|
```json
|
|
{
|
|
"action": "click",
|
|
"target": { "selector": "button[type=submit]" },
|
|
"changed": {
|
|
"url_changed": false,
|
|
"focus_changed": true
|
|
}
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
ok browser click
|
|
target: button[type=submit]
|
|
```
|
|
|
|
#### `actionbook browser click <selector|coordinates>`
|
|
|
|
> command: `browser click`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector\|coordinates>` | string | Yes | Target element or coordinates |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--new-tab` | bool | No | If the target has an href, open in a new tab |
|
|
| `--button <left\|right\|middle>` | string | No | Mouse button, default left |
|
|
| `--count <n>` | int | No | Click count (2 = double-click) |
|
|
|
|
> Special rule: If the click causes a navigation, `context.url` must be updated to the post-navigation URL.
|
|
|
|
#### `actionbook browser hover <selector>`
|
|
|
|
> command: `browser hover`
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
#### `actionbook browser focus <selector>`
|
|
|
|
> command: `browser focus`
|
|
|
|
**Parameters:** `<selector>` (required), `--session <SID> --tab <TID>`
|
|
|
|
#### `actionbook browser press <key-or-chord>`
|
|
|
|
> command: `browser press`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<key-or-chord>` | string | Yes | Single key or key combination (e.g., `Enter`, `Control+A`, `Shift+Tab`) |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
> Special rule: For chords, the target may be omitted and replaced with `keys`.
|
|
|
|
#### `actionbook browser drag <selector> <selector|coordinates>`
|
|
|
|
> command: `browser drag`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | Drag source element |
|
|
| `<selector\|coordinates>` | string | Yes | Drop target element or coordinates |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--button <left\|right\|middle>` | string | No | Mouse button |
|
|
|
|
#### `actionbook browser mouse-move <coordinates>`
|
|
|
|
> command: `browser mouse-move`
|
|
|
|
Move the mouse to absolute coordinates.
|
|
|
|
**Parameters:** `<coordinates>` (required, format `x,y`), `--session <SID> --tab <TID>`
|
|
|
|
#### `actionbook browser cursor-position`
|
|
|
|
> command: `browser cursor-position`
|
|
|
|
Get the current mouse position.
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "x": 420, "y": 310 }`
|
|
|
|
#### `actionbook browser scroll`
|
|
|
|
> command: `browser scroll`
|
|
|
|
Scroll the page or a container.
|
|
|
|
**Three subcommand forms:**
|
|
|
|
```
|
|
actionbook browser scroll up|down|left|right <pixels> --session <SID> --tab <TID> [--container <selector>]
|
|
actionbook browser scroll top|bottom --session <SID> --tab <TID> [--container <selector>]
|
|
actionbook browser scroll into-view <selector> --session <SID> --tab <TID> [--align <start|center|end|nearest>]
|
|
```
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| Direction/action | `up\|down\|left\|right\|top\|bottom\|into-view` | Yes | Scroll method |
|
|
| `<pixels>` | int | Required for directional scrolling | Scroll distance in pixels |
|
|
| `<selector>` | string | Required for `into-view` | Target element |
|
|
| `--container <selector>` | string | No | Scroll within a specified container |
|
|
| `--align <start\|center\|end\|nearest>` | string | No | Alignment for `into-view` |
|
|
|
|
> Special rule: `data.changed.scroll_changed = true` indicates that scrolling displacement occurred.
|
|
|
|
---
|
|
|
|
### 11.2 Input Commands (type / fill / select / upload)
|
|
|
|
Unified JSON `data` structure:
|
|
|
|
```json
|
|
{
|
|
"action": "fill",
|
|
"target": { "selector": "textarea[name=q]" },
|
|
"value_summary": { "text_length": 10 }
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://google.com
|
|
ok browser fill
|
|
target: textarea[name=q]
|
|
text_length: 10
|
|
```
|
|
|
|
#### `actionbook browser type <selector> <text>`
|
|
|
|
> command: `browser type`
|
|
|
|
Type text character by character (triggers keyboard events).
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | Target element |
|
|
| `<text>` | string | Yes | Text to type |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
#### `actionbook browser fill <selector> <text>`
|
|
|
|
> command: `browser fill`
|
|
|
|
Directly set the value of an input field (triggers input event).
|
|
|
|
**Parameters:** Same as `type`.
|
|
|
|
#### `actionbook browser select <selector> <value>`
|
|
|
|
> command: `browser select`
|
|
|
|
Select a value from a dropdown list.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | `<select>` element |
|
|
| `<value>` | string | Yes | Value to select |
|
|
| `--by-text` | bool | No | Match by display text instead of value attribute |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
> `value_summary` = `{ "value": "...", "by_text": true|false }`
|
|
|
|
#### `actionbook browser upload <selector> <file...>`
|
|
|
|
> command: `browser upload`
|
|
|
|
Upload files to a file input.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | File input element |
|
|
| `<file...>` | string[] | Yes | Absolute file paths (supports multiple) |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
> `value_summary` = `{ "files": ["/abs/path/a.pdf"], "count": 1 }`
|
|
|
|
---
|
|
|
|
### 11.3 `actionbook browser eval <code>`
|
|
|
|
> command: `browser eval`
|
|
|
|
Execute JavaScript in the page context.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<code>` | string | Yes | JavaScript expression |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"value": 42,
|
|
"type": "number",
|
|
"preview": "42"
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
42
|
|
```
|
|
|
|
---
|
|
|
|
## 12. Browser Waiting
|
|
|
|
All Waiting commands have addressing level: **Tab**.
|
|
|
|
Unified JSON `data` structure:
|
|
|
|
```json
|
|
{
|
|
"kind": "element",
|
|
"satisfied": true,
|
|
"elapsed_ms": 182,
|
|
"observed_value": { "selector": "#loaded" }
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
ok browser wait element
|
|
elapsed_ms: 182
|
|
```
|
|
|
|
### 12.1 `actionbook browser wait element <selector>`
|
|
|
|
> command: `browser wait element`
|
|
|
|
Wait for an element to appear in the DOM.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<selector>` | string | Yes | Element selector to wait for |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--timeout <ms>` | u64 | Yes | Timeout in milliseconds |
|
|
|
|
**`data.kind`** = `"element"`
|
|
**`data.observed_value`** = `{ "selector": "#loaded" }`
|
|
|
|
---
|
|
|
|
### 12.2 `actionbook browser wait navigation`
|
|
|
|
> command: `browser wait navigation`
|
|
|
|
Wait for navigation to complete.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--timeout <ms>` | u64 | Yes | Timeout in milliseconds |
|
|
|
|
**`data.kind`** = `"navigation"`
|
|
|
|
---
|
|
|
|
### 12.3 `actionbook browser wait network-idle`
|
|
|
|
> command: `browser wait network-idle`
|
|
|
|
Wait for network to become idle.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--timeout <ms>` | u64 | Yes | Timeout in milliseconds |
|
|
|
|
**`data.kind`** = `"network-idle"`
|
|
|
|
---
|
|
|
|
### 12.4 `actionbook browser wait condition <expression>`
|
|
|
|
> command: `browser wait condition`
|
|
|
|
Wait for a JS expression to become truthy.
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<expression>` | string | Yes | JavaScript expression (should return a truthy value) |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--tab <TID>` | string | Yes | Tab ID |
|
|
| `--timeout <ms>` | u64 | Yes | Timeout in milliseconds |
|
|
|
|
**`data.kind`** = `"condition"`
|
|
|
|
---
|
|
|
|
## 13. Browser Cookies
|
|
|
|
All Cookies commands have addressing level: **Session** (`--session` only, no `--tab` required).
|
|
|
|
### 13.1 `actionbook browser cookies list`
|
|
|
|
> command: `browser cookies list`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--domain <domain>` | string | No | Filter by domain |
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"items": [
|
|
{
|
|
"name": "SID",
|
|
"value": "xxx",
|
|
"domain": ".google.com",
|
|
"path": "/",
|
|
"http_only": true,
|
|
"secure": true,
|
|
"same_site": "Lax",
|
|
"expires": null
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google]
|
|
1 cookie
|
|
SID .google.com /
|
|
```
|
|
|
|
---
|
|
|
|
### 13.2 `actionbook browser cookies get <name>`
|
|
|
|
> command: `browser cookies get`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<name>` | string | Yes | Cookie name |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
|
|
**JSON `data`:** `{ "item": { ...cookie object } }`
|
|
|
|
---
|
|
|
|
### 13.3 `actionbook browser cookies set <name> <value>`
|
|
|
|
> command: `browser cookies set`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `<name>` | string | Yes | Cookie name |
|
|
| `<value>` | string | Yes | Cookie value |
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--domain` | string | No | Domain |
|
|
| `--path` | string | No | Path |
|
|
| `--secure` | bool | No | Secure flag |
|
|
| `--http-only` | bool | No | HttpOnly flag |
|
|
| `--same-site <Strict\|Lax\|None>` | string | No | SameSite policy |
|
|
| `--expires <timestamp>` | f64 | No | Expiration time (Unix timestamp) |
|
|
|
|
**JSON `data`:** `{ "action": "set", "affected": 1, "domain": ".google.com" }`
|
|
|
|
---
|
|
|
|
### 13.4 `actionbook browser cookies delete <name>`
|
|
|
|
> command: `browser cookies delete`
|
|
|
|
**Parameters:** `<name>` (required), `--session <SID>`
|
|
|
|
**JSON `data`:** `{ "action": "delete", "affected": 1 }`
|
|
|
|
---
|
|
|
|
### 13.5 `actionbook browser cookies clear`
|
|
|
|
> command: `browser cookies clear`
|
|
|
|
**Parameters:**
|
|
|
|
| Parameter | Type | Required | Description |
|
|
|------|------|------|------|
|
|
| `--session <SID>` | string | Yes | Session ID |
|
|
| `--domain <domain>` | string | No | Filter by domain |
|
|
|
|
**JSON `data`:** `{ "action": "clear", "affected": 5, "domain": ".google.com" }`
|
|
|
|
---
|
|
|
|
## 14. Browser Storage
|
|
|
|
All Storage commands have addressing level: **Tab** (`--session <SID> --tab <TID>`).
|
|
|
|
Two storage types share the same subcommand structure:
|
|
- `session-storage` -> `window.sessionStorage`
|
|
- `local-storage` -> `window.localStorage`
|
|
|
|
### 14.1 `actionbook browser session-storage|local-storage list`
|
|
|
|
> command: `browser local-storage list` / `browser session-storage list`
|
|
|
|
**Parameters:** `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:**
|
|
|
|
```json
|
|
{
|
|
"storage": "local",
|
|
"items": [
|
|
{ "key": "theme", "value": "dark" }
|
|
]
|
|
}
|
|
```
|
|
|
|
**Text output:**
|
|
```
|
|
[research-google t1] https://example.com
|
|
1 key
|
|
theme=dark
|
|
```
|
|
|
|
---
|
|
|
|
### 14.2 `actionbook browser session-storage|local-storage get <key>`
|
|
|
|
> command: `browser local-storage get` / `browser session-storage get`
|
|
|
|
**Parameters:** `<key>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "storage": "local", "item": { "key": "theme", "value": "dark" } }`
|
|
|
|
---
|
|
|
|
### 14.3 `actionbook browser session-storage|local-storage set <key> <value>`
|
|
|
|
> command: `browser local-storage set` / `browser session-storage set`
|
|
|
|
**Parameters:** `<key>` (required), `<value>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "storage": "local", "action": "set", "affected": 1 }`
|
|
|
|
---
|
|
|
|
### 14.4 `actionbook browser session-storage|local-storage delete <key>`
|
|
|
|
> command: `browser local-storage delete` / `browser session-storage delete`
|
|
|
|
**Parameters:** `<key>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "storage": "local", "action": "delete", "affected": 1 }`
|
|
|
|
---
|
|
|
|
### 14.5 `actionbook browser session-storage|local-storage clear <key>`
|
|
|
|
> command: `browser local-storage clear` / `browser session-storage clear`
|
|
|
|
Clear the stored value for the specified key.
|
|
|
|
**Parameters:** `<key>` (required), `--session <SID> --tab <TID>`
|
|
|
|
**JSON `data`:** `{ "storage": "local", "action": "clear", "affected": 1 }`
|
|
|
|
---
|
|
|
|
## Appendix: Command Overview (70 interfaces total)
|
|
|
|
### Non-Browser Commands (5)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 1 | `search <query>` | — | `search` |
|
|
| 2 | `get <area_id>` | — | `get` |
|
|
| 3 | `setup` | — | `setup` |
|
|
| 4 | `help` | — | `help` |
|
|
| 5 | `--version` | — | `version` |
|
|
|
|
### Browser Lifecycle (5)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 6 | `browser start` | Global | `browser start` |
|
|
| 7 | `browser list-sessions` | Global | `browser list-sessions` |
|
|
| 8 | `browser status` | Session | `browser status` |
|
|
| 9 | `browser close` | Session | `browser close` |
|
|
| 10 | `browser restart` | Session | `browser restart` |
|
|
|
|
### Browser Tab Management (3)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 11 | `browser list-tabs` | Session | `browser list-tabs` |
|
|
| 12 | `browser new-tab` / `open` | Session | `browser new-tab` |
|
|
| 13 | `browser close-tab` | Tab | `browser close-tab` |
|
|
|
|
### Browser Navigation (4)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 14 | `browser goto` | Tab | `browser goto` |
|
|
| 15 | `browser back` | Tab | `browser back` |
|
|
| 16 | `browser forward` | Tab | `browser forward` |
|
|
| 17 | `browser reload` | Tab | `browser reload` |
|
|
|
|
### Browser Observation (17)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 18 | `browser snapshot` | Tab | `browser snapshot` |
|
|
| 19 | `browser screenshot` | Tab | `browser screenshot` |
|
|
| 20 | `browser pdf` | Tab | `browser pdf` |
|
|
| 21 | `browser title` | Tab | `browser title` |
|
|
| 22 | `browser url` | Tab | `browser url` |
|
|
| 23 | `browser viewport` | Tab | `browser viewport` |
|
|
| 24 | `browser query` | Tab | `browser query` |
|
|
| 25 | `browser html` | Tab | `browser html` |
|
|
| 26 | `browser text` | Tab | `browser text` |
|
|
| 27 | `browser value` | Tab | `browser value` |
|
|
| 28 | `browser attr` | Tab | `browser attr` |
|
|
| 29 | `browser attrs` | Tab | `browser attrs` |
|
|
| 30 | `browser box` | Tab | `browser box` |
|
|
| 31 | `browser styles` | Tab | `browser styles` |
|
|
| 32 | `browser describe` | Tab | `browser describe` |
|
|
| 33 | `browser state` | Tab | `browser state` |
|
|
| 34 | `browser inspect-point` | Tab | `browser inspect-point` |
|
|
|
|
### Browser Logging (2)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 35 | `browser logs console` | Tab | `browser logs console` |
|
|
| 36 | `browser logs errors` | Tab | `browser logs errors` |
|
|
|
|
### Browser Interaction (15)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 37 | `browser click` | Tab | `browser click` |
|
|
| 38 | `browser type` | Tab | `browser type` |
|
|
| 39 | `browser fill` | Tab | `browser fill` |
|
|
| 40 | `browser select` | Tab | `browser select` |
|
|
| 41 | `browser hover` | Tab | `browser hover` |
|
|
| 42 | `browser focus` | Tab | `browser focus` |
|
|
| 43 | `browser press` | Tab | `browser press` |
|
|
| 44 | `browser drag` | Tab | `browser drag` |
|
|
| 45 | `browser upload` | Tab | `browser upload` |
|
|
| 46 | `browser eval` | Tab | `browser eval` |
|
|
| 47 | `browser mouse-move` | Tab | `browser mouse-move` |
|
|
| 48 | `browser cursor-position` | Tab | `browser cursor-position` |
|
|
| 49 | `browser scroll (direction)` | Tab | `browser scroll` |
|
|
| 50 | `browser scroll (top/bottom)` | Tab | `browser scroll` |
|
|
| 51 | `browser scroll into-view` | Tab | `browser scroll` |
|
|
|
|
### Browser Waiting (4)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 52 | `browser wait element` | Tab | `browser wait element` |
|
|
| 53 | `browser wait navigation` | Tab | `browser wait navigation` |
|
|
| 54 | `browser wait network-idle` | Tab | `browser wait network-idle` |
|
|
| 55 | `browser wait condition` | Tab | `browser wait condition` |
|
|
|
|
### Browser Cookies (5)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 56 | `browser cookies list` | Session | `browser cookies list` |
|
|
| 57 | `browser cookies get` | Session | `browser cookies get` |
|
|
| 58 | `browser cookies set` | Session | `browser cookies set` |
|
|
| 59 | `browser cookies delete` | Session | `browser cookies delete` |
|
|
| 60 | `browser cookies clear` | Session | `browser cookies clear` |
|
|
|
|
### Browser Storage (10)
|
|
|
|
| # | Command | Addressing Level | command name |
|
|
|---|------|----------|-----------|
|
|
| 61 | `browser session-storage list` | Tab | `browser session-storage list` |
|
|
| 62 | `browser session-storage get` | Tab | `browser session-storage get` |
|
|
| 63 | `browser session-storage set` | Tab | `browser session-storage set` |
|
|
| 64 | `browser session-storage delete` | Tab | `browser session-storage delete` |
|
|
| 65 | `browser session-storage clear` | Tab | `browser session-storage clear` |
|
|
| 66 | `browser local-storage list` | Tab | `browser local-storage list` |
|
|
| 67 | `browser local-storage get` | Tab | `browser local-storage get` |
|
|
| 68 | `browser local-storage set` | Tab | `browser local-storage set` |
|
|
| 69 | `browser local-storage delete` | Tab | `browser local-storage delete` |
|
|
| 70 | `browser local-storage clear` | Tab | `browser local-storage clear` |
|
|
|
|
**Total: 70 interfaces**
|
|
|
|
---
|