文件历史

提交图

2 次代码提交

作者 SHA1 备注 提交日期
Saurav Panda 3de7fe07eb cleanup-zombies: also catch URLError so transient network failures don't abort the loop
A DNS/timeout/socket error during PATCH /browsers/{id} was bubbling out
of the loop, leaving remaining zombies running and still billing.
HTTPError is a subclass of URLError, so the existing clause stays first
and the URLError catch handles only the transport-level failures.
2026-05-05 10:35:26 -07:00
ComBba 84e7a2c0ae feat(domain-skills): add browser-use-cloud (REST + cleanup-zombies)
Adds an operator-facing skill for cloud.browser-use.com / api.browser-use.com,
covering the same REST surface that the harness's own admin.py already
uses (X-Browser-Use-API-Key header, /browsers, /profiles), plus a
companion script for the most common automation -- stopping zombie
sessions older than N minutes.

Live-tested on 2026-05-05 with a real BROWSER_USE_API_KEY:

  POST   /browsers              201 - shape verified incl. liveUrl on live.browser-use.com
  PATCH  /browsers/{id} stop    200 - returns final cost
  GET    /browsers              200 - paginated {items, totalItems, ...}
  GET    /profiles              200 - same envelope
  GET    /profiles/{id}         200 - cookieDomains=None on fresh profiles
  GET    /usage                 404 - no public endpoint, doc'd accordingly
  GET    /                      404 - no root metadata

The cleanup-zombies.py companion is the regression artefact; running it
in dry-run mode is the cheapest smoke test, and a full E2E loop
(spawn -> list -> stop -> re-list) was confirmed end-to-end during
authoring.

Notable wire gotchas surfaced and documented:

- Cost / proxy fields (proxyCost, browserCost, proxyUsedMb) are returned
  as JSON strings, not numbers; cast to float before arithmetic.
- liveUrl host is live.browser-use.com (different from cloud.browser-use.com),
  with the cdp WebSocket encoded as a ?wss= query parameter.
- cookieDomains can be null on a freshly-created profile despite
  list_cloud_profiles' docstring describing it as an array.
- GET /usage returns 404 -- per-session cost lives on each browser
  record; aggregate billing only on the dashboard.

Style follows the claude-ai/share-export (#267) pattern of
markdown-skill-with-companion-py, sized at 222 + 161 LOC. Discovery
under helpers.py:163's current logic would resolve cloud.browser-use.com
to "cloud/" rather than "browser-use-cloud/" -- the skill folder name
mirrors the convention used by claude-ai/, vercel/, and tasksquad-ai/
which are also not auto-discoverable today; PR #165 is the broader fix
for that.

Refs: PR #300 (run.py precedence fix in the same area), PR #267
(claude-ai companion-script pattern), PR #288 (vercel dashboard skill
header style).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:45:53 +09:00