mirror of
https://github.com/Tencent/BrowserSkill.git
synced 2026-09-10 13:01:23 +08:00
158 lines
4.8 KiB
Markdown
158 lines
4.8 KiB
Markdown
# browser-skill architecture
|
|
|
|
Developer-oriented overview of how the CLI, daemon, and extension fit together.
|
|
Consolidates design §2, §3, §5, and §6.
|
|
|
|
## System diagram
|
|
|
|
```mermaid
|
|
flowchart TB
|
|
subgraph harness [Agent harness]
|
|
Agent[Claude Code / Cursor / Codex]
|
|
end
|
|
|
|
subgraph host [Developer machine]
|
|
Agent -->|shell: bsk ...| CLI[bsk CLI]
|
|
CLI <-->|JSON Lines / UDS| Daemon[bsk daemon]
|
|
Daemon <-->|WebSocket JSON| Ext[bsk extension MV3]
|
|
end
|
|
|
|
subgraph browser [Chromium]
|
|
Ext -->|CDP + WebExt| Tabs[User tabs + Agent Windows]
|
|
end
|
|
|
|
Skill[SKILL.md] -.->|documents workflow| Agent
|
|
```
|
|
|
|
## Components
|
|
|
|
### bsk CLI (`crates/bsk-cli`)
|
|
|
|
- Parses verb-noun subcommands (`bsk session start`, `bsk click`, …).
|
|
- On first use, **auto-spawns** the daemon if `~/.bsk/daemon.lock` is absent or stale.
|
|
- Speaks JSON Lines over `~/.bsk/daemon.sock` (Unix) or a named pipe (Windows).
|
|
- Renders human-readable output by default; `--json` emits structured responses.
|
|
|
|
Key modules:
|
|
|
|
| Module | Role |
|
|
| --- | --- |
|
|
| `cli/` | Clap command tree, per-tool handlers |
|
|
| `ipc_client.rs` | UDS client, line framing |
|
|
| `daemon/` | WS server, session routing, idle shutdown |
|
|
|
|
### bsk daemon (same binary: `bsk daemon`)
|
|
|
|
- Listens on loopback WebSocket (default **52800**) for extensions.
|
|
- Validates `Origin: chrome-extension://…` on handshake.
|
|
- Maintains `browsers` (connected extensions) and `sessions` (Agent Window bindings).
|
|
- **Per-session queue** serializes tool calls targeting one session.
|
|
- Forwards `tool.*` RPCs to the correct extension connection.
|
|
|
|
State files under `~/.bsk/`:
|
|
|
|
| File | Purpose |
|
|
| --- | --- |
|
|
| `daemon.lock` | Advisory lock — single daemon instance |
|
|
| `daemon.json` | `{ sock_path, pid, ws_port, version }` |
|
|
| `daemon.log` | Rolling trace log |
|
|
| `daemon.pid` | PID for status/doctor |
|
|
|
|
### bsk extension (`apps/extension`)
|
|
|
|
WXT / MV3 Chromium extension. Built with React popup and a service worker background.
|
|
|
|
| Directory | Responsibility |
|
|
| --- | --- |
|
|
| `transport/` | Pluggable `Transport` (v1: `WSTransport`) |
|
|
| `tools/` | `ToolDispatcher` → 21 tool handlers |
|
|
| `session-manager/` | Sessions, Agent Window, ref-store (`@e1`) |
|
|
| `browser-driver/` | CDP-backed browser operations |
|
|
| `entrypoints/popup/` | Connection status UI |
|
|
| `content/` | Control overlay in Agent Windows |
|
|
|
|
### bsk-protocol (`crates/bsk-protocol`)
|
|
|
|
Shared Rust types + JSON Schema generation. TypeScript mirrors frame shapes in
|
|
`apps/extension/src/transport/types.ts` (kept in sync via tests and schema dumps).
|
|
|
|
## Typical tool call
|
|
|
|
1. Agent runs `bsk click @e1 --tab-id 42 --session ab12`.
|
|
2. CLI ensures daemon is running, opens UDS, sends one JSON request line.
|
|
3. Daemon resolves session `ab12` → browser client → forwards `tool.click` over WS.
|
|
4. Extension dispatcher validates sandbox rules, invokes CDP via `BrowserDriver`.
|
|
5. Response travels CLI ← daemon ← extension; CLI prints result and exits.
|
|
|
|
## Session and sandbox model
|
|
|
|
- **Session** = opaque ID (4 lowercase letters in v0.1) + dedicated **Agent Window**
|
|
+ session-scoped ref-store + borrow table.
|
|
- **Sandbox-only**: write tools require tabs inside the Agent Window unless the tab
|
|
was **borrowed** from the user profile.
|
|
- **Session stop is mandatory** in agent workflows (`bsk session stop`); idle timeout
|
|
(default 5 min) is a safety net only.
|
|
- Multiple sessions on one browser → multiple Agent Windows, fully isolated.
|
|
|
|
### tab_list scopes
|
|
|
|
| `scope` | Visible tabs |
|
|
| --- | --- |
|
|
| `user` | User profile windows (default) |
|
|
| `agent` | Current session's Agent Window only |
|
|
| `all` | Agent Window + user windows for this session |
|
|
|
|
## Concurrency
|
|
|
|
| Scope | Policy |
|
|
| --- | --- |
|
|
| Same session | Daemon serializes RPCs (ref-store safety) |
|
|
| Different sessions | Parallel |
|
|
| Multiple browsers | `bsk session start --browser <id>` when >1 extension connected |
|
|
|
|
## Module dependency graph
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
subgraph rust [Rust workspace]
|
|
CLI[bsk CLI crate]
|
|
Proto[bsk-protocol]
|
|
CLI --> Proto
|
|
end
|
|
|
|
subgraph ts [Extension]
|
|
BG[background]
|
|
T[Transport]
|
|
D[ToolDispatcher]
|
|
SM[SessionManager]
|
|
BD[BrowserDriver]
|
|
BG --> T
|
|
BG --> D
|
|
D --> SM
|
|
D --> BD
|
|
SM --> BD
|
|
end
|
|
|
|
CLI <-->|JSON protocol| T
|
|
```
|
|
|
|
## Security (v1)
|
|
|
|
- Daemon and WebSocket bind to **loopback** only.
|
|
- Extension origin allow-list at WS upgrade.
|
|
- No credential storage in bsk — cookies stay in the user's browser profile.
|
|
- `evaluate` restricted to Agent Window tabs in sandbox mode.
|
|
|
|
## Repository layout
|
|
|
|
```
|
|
browser-skill/
|
|
├── apps/extension/ # WXT Chromium extension
|
|
├── crates/
|
|
│ ├── bsk-cli/ # `bsk` binary (CLI + daemon)
|
|
│ └── bsk-protocol/ # Wire types + schemas
|
|
├── install.sh # CLI installer (GitHub Releases)
|
|
├── skill/SKILL.md # Agent harness instructions
|
|
└── docs/ # architecture, guides
|
|
```
|