feat(site): bb-sites adapters — turn any site into a structured-data CLI
Release binaries / Build macOS ARM64 (push) Has been cancelled
Release binaries / Build macOS x64 (push) Has been cancelled
Release binaries / Build Linux ARM64 (push) Has been cancelled
Release binaries / Build Linux musl ARM64 (push) Has been cancelled
Release binaries / Build Linux musl x64 (push) Has been cancelled
Release binaries / Build Linux x64 (push) Has been cancelled
Release binaries / Build Windows x64 (push) Has been cancelled
Release binaries / Attach binaries to GitHub Release (push) Has been cancelled

Add `chrome-use site` — run community bb-sites adapters over chrome-use's
stealth transport. An adapter is a per-command JS function that calls a
site's own JSON API from inside your logged-in tab (your cookies, same-origin
fetch, the site's modules) and returns clean JSON — no clicking/scraping.

- site update   fetch the upstream bb-sites pack into ~/.chrome-use/sites
- site list     list installed adapters (name/cmd)
- site info     show an adapter's @meta (args, domain, capabilities)
- site <name>/<cmd> [args]  navigate to its domain (reuse tab if already there) + eval, return JSON

chrome-use ships zero adapter code; `site update` fetches epiral/bb-sites at
runtime (like a package manager). Adapters remain their authors' property.

cli/src/site.rs (load/parse/build_eval/list/update/map_args + tests), wired
via commands.rs (parse), actions.rs (handle_site), main.rs (CLI dispatch).
Docs in README, README.zh, skill-data/core. Verified live: github/issues
returned 30 real issues as JSON over the relay.
This commit is contained in:
leeguooooo
2026-06-17 16:02:40 +09:00
parent c667e0e704
commit d81bc01645
11 changed files with 516 additions and 3 deletions
+42
View File
@@ -1315,6 +1315,7 @@ pub async fn execute_command(cmd: &Value, state: &mut DaemonState) -> Value {
"title" => handle_title(state).await,
"content" => handle_content(state).await,
"evaluate" => handle_evaluate(cmd, state).await,
"site" => handle_site(cmd, state).await,
"close" => handle_close(state).await,
"stealth_status" => handle_stealth_status(state).await,
"snapshot" => handle_snapshot(cmd, state).await,
@@ -2698,6 +2699,47 @@ async fn handle_evaluate(cmd: &Value, state: &DaemonState) -> Result<Value, Stri
Ok(json!({ "result": result, "origin": url }))
}
/// Run a site adapter: navigate to its `@meta.domain` (only if we're not already
/// there — the point is to run as you, in the page that's already open) and eval
/// the adapter function in the site's own logged-in page. The CLI/commands.rs has
/// already loaded the adapter and built the `script`; here we just place the page
/// and evaluate. Never disrupts the user's foreground tab — navigation happens on
/// the daemon's own tab (same as every other command on the relay).
async fn handle_site(cmd: &Value, state: &mut DaemonState) -> Result<Value, String> {
let domain = cmd
.get("domain")
.and_then(|v| v.as_str())
.ok_or("site: missing 'domain'")?
.to_string();
let script = cmd
.get("script")
.and_then(|v| v.as_str())
.ok_or("site: missing 'script'")?
.to_string();
let current = match state.browser.as_ref() {
Some(mgr) => mgr.get_url().await.unwrap_or_default(),
None => String::new(),
};
let on_domain = url::Url::parse(&current)
.ok()
.and_then(|u| u.host_str().map(|h| h.to_string()))
.map(|h| h == domain || h.ends_with(&format!(".{domain}")))
.unwrap_or(false);
if !on_domain {
let nav = json!({ "url": format!("https://{domain}/") });
handle_navigate(&nav, state).await?;
}
let eval_cmd = json!({ "script": script });
let out = handle_evaluate(&eval_cmd, state).await?;
Ok(json!({
"result": out.get("result").cloned().unwrap_or(Value::Null),
"origin": out.get("origin").cloned().unwrap_or(Value::Null),
"domain": domain,
}))
}
/// Local stealth self-check: reports the active mode, live fingerprint probes,
/// and the list of applied overrides — so an agent (or human) can confirm
/// stealth is working without driving an external detector, and audit exactly