browser-agent-server 1.0.2__tar.gz → 1.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
  2. browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/feature_request.yml +15 -0
  4. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.github/workflows/ci.yml +3 -0
  5. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.github/workflows/release.yml +24 -0
  6. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/CHANGELOG.md +12 -0
  7. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/PKG-INFO +7 -1
  8. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/README.md +6 -0
  9. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/publishing.md +19 -0
  10. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/pyproject.toml +1 -1
  11. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/uv.lock +1 -1
  12. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.gitignore +0 -0
  13. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/AGENTS.md +0 -0
  14. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/LICENSE +0 -0
  15. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/api.md +0 -0
  16. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/architecture.md +0 -0
  17. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/deployment.md +0 -0
  18. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/security.md +0 -0
  19. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/troubleshooting.md +0 -0
  20. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/__init__.py +0 -0
  21. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/chrome.py +0 -0
  22. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/cli.py +0 -0
  23. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/data/browser-agent.service +0 -0
  24. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/server.py +0 -0
  25. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/vision_agent.py +0 -0
  26. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/x11_input.py +0 -0
  27. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_bezier.py +0 -0
  28. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_chrome_state_dir.py +0 -0
  29. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_cli.py +0 -0
  30. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_client.py +0 -0
  31. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_cloudflare.py +0 -0
  32. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_http_api.py +0 -0
  33. {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_ws_frames.py +0 -0
@@ -0,0 +1,33 @@
1
+ name: Bug report
2
+ description: Something in browser-agent-server or the browser-agent CLI misbehaves
3
+ title: "[bug]: "
4
+ labels: [bug]
5
+ body:
6
+ - type: input
7
+ id: version
8
+ attributes:
9
+ label: Daemon version
10
+ description: Output of `browser-agent --version`
11
+ placeholder: browser-agent 1.0.2
12
+ validations:
13
+ required: true
14
+ - type: input
15
+ id: environment
16
+ attributes:
17
+ label: OS / how it runs
18
+ placeholder: Ubuntu 24.04, systemd unit, installed via `uv tool install`
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: what
23
+ attributes:
24
+ label: What happened vs what you expected
25
+ description: Include the exact command or HTTP request, and steps to reproduce if you have them
26
+ validations:
27
+ required: true
28
+ - type: textarea
29
+ id: logs
30
+ attributes:
31
+ label: Logs
32
+ description: "`journalctl -u browser-agent -n 50 --no-pager` or the terminal output"
33
+ render: shell
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Companion project — @vernikr/browser-agent-mcp
4
+ url: https://github.com/vernikr/browser-agent-mcp
5
+ about: Issue with the MCP bridge or an MCP client, not the daemon itself? File it there.
6
+ - name: Docs
7
+ url: https://github.com/vernikr/browser-agent/tree/main/docs
8
+ about: Installation, systemd, API and troubleshooting guides
@@ -0,0 +1,15 @@
1
+ name: Feature request
2
+ description: Suggest an idea for the daemon, CLI, or API
3
+ title: "[feat]: "
4
+ labels: [enhancement]
5
+ body:
6
+ - type: textarea
7
+ id: problem
8
+ attributes:
9
+ label: What problem does this solve for you?
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: solution
14
+ attributes:
15
+ label: Proposed solution / API sketch
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  branches: [main]
6
6
  pull_request:
7
+ schedule:
8
+ - cron: "17 5 * * 1" # Mondays 05:17 UTC — catch bit-rotting deps early
9
+ workflow_dispatch:
7
10
 
8
11
  jobs:
9
12
  python:
@@ -49,6 +49,30 @@ jobs:
49
49
  - uses: pypa/gh-action-pypi-publish@release/v1
50
50
  if: steps.exists.outputs.exists == 'false'
51
51
 
52
+
53
+ deploy:
54
+ needs: pypi
55
+ runs-on: ubuntu-latest
56
+ environment:
57
+ name: prod
58
+ url: http://38.244.152.2:8765/status
59
+ steps:
60
+ # Plain ssh (no third-party action): this key is trusted to drive the prod host.
61
+ # Server side it is pinned to the single command via authorized_keys forced command:
62
+ # command="/usr/local/bin/deploy-browser-agent",no-pty,no-port-forwarding,...
63
+ - name: Deploy exact version to production
64
+ env:
65
+ DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
66
+ DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
67
+ DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
68
+ run: |
69
+ mkdir -p ~/.ssh && chmod 700 ~/.ssh
70
+ printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/ci_deploy_key
71
+ chmod 600 ~/.ssh/ci_deploy_key
72
+ ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null
73
+ VER="${GITHUB_REF_NAME#v}"
74
+ ssh -i ~/.ssh/ci_deploy_key "$DEPLOY_USER@$DEPLOY_HOST" "deploy $VER"
75
+
52
76
  github-release:
53
77
  needs: build
54
78
  runs-on: ubuntu-latest
@@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [1.0.3] - 2026-10-10
9
+
10
+ ### Added
11
+
12
+ - Continuous deployment: after a successful PyPI publish, `release.yml` deploys
13
+ the exact version to the production host over SSH. The CI key is pinned to a
14
+ single forced command (`deploy-browser-agent` on the server): it installs the
15
+ exact pinned version from PyPI via `uv tool`, restarts the unit and
16
+ health-checks `/status`, rolling back to the previous version on failure
17
+ (see docs/publishing.md → Continuous deployment).
18
+
19
+
8
20
  ## [1.0.2] - 2026-10-10
9
21
 
10
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: browser-agent-server
3
- Version: 1.0.2
3
+ Version: 1.0.3
4
4
  Summary: Real headful Chrome on Xvfb with a hardware-level X11 mouse, Cloudflare Turnstile auto-solve and zero-leak CDP. Localhost HTTP API + CLI + Python SDK.
5
5
  Project-URL: Homepage, https://github.com/vernikr/browser-agent
6
6
  Project-URL: Repository, https://github.com/vernikr/browser-agent
@@ -23,6 +23,12 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  # browser-agent
25
25
 
26
+ [![PyPI](https://img.shields.io/pypi/v/browser-agent-server)](https://pypi.org/project/browser-agent-server/)
27
+ [![CI](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml)
28
+ [![Release](https://img.shields.io/github/v/release/vernikr/browser-agent)](https://github.com/vernikr/browser-agent/releases)
29
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](https://pypi.org/project/browser-agent-server/)
30
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
31
+
26
32
  > 🔗 **Companion project:** [`@vernikr/browser-agent-mcp`](https://github.com/vernikr/browser-agent-mcp) — the MCP server that exposes this daemon to LLM agents (Claude Code, Cursor, Freebuff…). The two projects are developed together and speak the HTTP contract in [`docs/api.md`](docs/api.md).
27
33
 
28
34
  **Real headful Chrome on Xvfb with a hardware-level X11 mouse.** One localhost daemon gives any project, script, or AI agent on a Linux box a genuine desktop browser: steered over real XTEST input events on randomized Bézier paths, with zero-leak CDP (no `Runtime.enable`), Cloudflare Turnstile auto-solve, and RAM discipline for tiny VPSes (auto-hibernates to ~12 MB idle).
@@ -1,5 +1,11 @@
1
1
  # browser-agent
2
2
 
3
+ [![PyPI](https://img.shields.io/pypi/v/browser-agent-server)](https://pypi.org/project/browser-agent-server/)
4
+ [![CI](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml)
5
+ [![Release](https://img.shields.io/github/v/release/vernikr/browser-agent)](https://github.com/vernikr/browser-agent/releases)
6
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-blue)](https://pypi.org/project/browser-agent-server/)
7
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
8
+
3
9
  > 🔗 **Companion project:** [`@vernikr/browser-agent-mcp`](https://github.com/vernikr/browser-agent-mcp) — the MCP server that exposes this daemon to LLM agents (Claude Code, Cursor, Freebuff…). The two projects are developed together and speak the HTTP contract in [`docs/api.md`](docs/api.md).
4
10
 
5
11
  **Real headful Chrome on Xvfb with a hardware-level X11 mouse.** One localhost daemon gives any project, script, or AI agent on a Linux box a genuine desktop browser: steered over real XTEST input events on randomized Bézier paths, with zero-leak CDP (no `Runtime.enable`), Cloudflare Turnstile auto-solve, and RAM discipline for tiny VPSes (auto-hibernates to ~12 MB idle).
@@ -30,3 +30,22 @@ Then still tag, so the GitHub Release and CHANGELOG stay in sync: `git tag vX.Y.
30
30
  - Verify: https://pypi.org/pypi/browser-agent-server/json (`info.version`)
31
31
  - Bump CHANGELOG under `[Unreleased]` for the next cycle.
32
32
  - Revoke the manual token once trusted publishing is proven (pypi.org → Account settings → API tokens).
33
+
34
+ ## Continuous deployment (release → production)
35
+
36
+ After the PyPI job succeeds, `release.yml` also runs a `deploy` job that ships the exact
37
+ tag version to the production host — no human SSH needed. Design:
38
+
39
+ - The repo holds three secrets: `DEPLOY_SSH_KEY` (dedicated ed25519 keypair), `DEPLOY_HOST`,
40
+ `DEPLOY_USER`. The key is **not** the admin key; on the server it is pinned in
41
+ `authorized_keys` to a single forced command:
42
+ `command="/usr/local/bin/deploy-browser-agent",no-pty,no-port-forwarding,no-agent-forwarding,no-X11-forwarding`.
43
+ Even if the GitHub secret leaks, it can only redeploy this one daemon.
44
+ - The server-side script accepts only `deploy <semver>` (anything else is rejected), installs
45
+ `browser-agent-server==<ver>` from PyPI (`uv tool install --force --refresh`, with retries
46
+ for registry propagation), restarts the systemd unit and waits for `/status` to report the
47
+ target version. On healthcheck failure it reinstalls the previous version and restarts again.
48
+ - Idempotent: redeploying the version already running is a no-op success.
49
+
50
+ One-time setup on a new host: install `uv` + the package, create/pin the key as above, put the
51
+ three secrets into the repo (Settings → Secrets and variables → Actions), done.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "browser-agent-server"
3
- version = "1.0.2"
3
+ version = "1.0.3"
4
4
  description = "Real headful Chrome on Xvfb with a hardware-level X11 mouse, Cloudflare Turnstile auto-solve and zero-leak CDP. Localhost HTTP API + CLI + Python SDK."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -13,7 +13,7 @@ wheels = [
13
13
 
14
14
  [[package]]
15
15
  name = "browser-agent-server"
16
- version = "1.0.2"
16
+ version = "1.0.3"
17
17
  source = { editable = "." }
18
18
  dependencies = [
19
19
  { name = "trafilatura" },