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.
- browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/bug_report.yml +33 -0
- browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/config.yml +8 -0
- browser_agent_server-1.0.3/.github/ISSUE_TEMPLATE/feature_request.yml +15 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.github/workflows/ci.yml +3 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.github/workflows/release.yml +24 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/CHANGELOG.md +12 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/PKG-INFO +7 -1
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/README.md +6 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/publishing.md +19 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/pyproject.toml +1 -1
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/uv.lock +1 -1
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/.gitignore +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/AGENTS.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/LICENSE +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/api.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/architecture.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/deployment.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/security.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/docs/troubleshooting.md +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/__init__.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/chrome.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/cli.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/data/browser-agent.service +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/server.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/vision_agent.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/src/browser_agent/x11_input.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_bezier.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_chrome_state_dir.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_cli.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_client.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_cloudflare.py +0 -0
- {browser_agent_server-1.0.2 → browser_agent_server-1.0.3}/tests/test_http_api.py +0 -0
- {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
|
|
@@ -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.
|
|
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
|
+
[](https://pypi.org/project/browser-agent-server/)
|
|
27
|
+
[](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml)
|
|
28
|
+
[](https://github.com/vernikr/browser-agent/releases)
|
|
29
|
+
[](https://pypi.org/project/browser-agent-server/)
|
|
30
|
+
[](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
|
+
[](https://pypi.org/project/browser-agent-server/)
|
|
4
|
+
[](https://github.com/vernikr/browser-agent/actions/workflows/ci.yml)
|
|
5
|
+
[](https://github.com/vernikr/browser-agent/releases)
|
|
6
|
+
[](https://pypi.org/project/browser-agent-server/)
|
|
7
|
+
[](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.
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|