arena-bridge 0.5.0__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 (34) hide show
  1. arena_bridge-0.5.0/LICENSE +21 -0
  2. arena_bridge-0.5.0/PKG-INFO +306 -0
  3. arena_bridge-0.5.0/README.md +284 -0
  4. arena_bridge-0.5.0/arena_bridge/__init__.py +3 -0
  5. arena_bridge-0.5.0/arena_bridge/__main__.py +4 -0
  6. arena_bridge-0.5.0/arena_bridge/approvals.py +90 -0
  7. arena_bridge-0.5.0/arena_bridge/audit.py +29 -0
  8. arena_bridge-0.5.0/arena_bridge/browser.py +668 -0
  9. arena_bridge-0.5.0/arena_bridge/cdp.py +83 -0
  10. arena_bridge-0.5.0/arena_bridge/cli.py +521 -0
  11. arena_bridge-0.5.0/arena_bridge/config.py +112 -0
  12. arena_bridge-0.5.0/arena_bridge/device.py +58 -0
  13. arena_bridge-0.5.0/arena_bridge/engine.py +704 -0
  14. arena_bridge-0.5.0/arena_bridge/hub.py +302 -0
  15. arena_bridge-0.5.0/arena_bridge/mac.py +552 -0
  16. arena_bridge-0.5.0/arena_bridge/mcp.py +75 -0
  17. arena_bridge-0.5.0/arena_bridge/policy.py +57 -0
  18. arena_bridge-0.5.0/arena_bridge/prompt.py +114 -0
  19. arena_bridge-0.5.0/arena_bridge/selfupdate.py +77 -0
  20. arena_bridge-0.5.0/arena_bridge/server.py +218 -0
  21. arena_bridge-0.5.0/arena_bridge/service.py +75 -0
  22. arena_bridge-0.5.0/arena_bridge/trust.py +90 -0
  23. arena_bridge-0.5.0/arena_bridge/tunnel.py +41 -0
  24. arena_bridge-0.5.0/arena_bridge/ws.py +125 -0
  25. arena_bridge-0.5.0/arena_bridge.egg-info/PKG-INFO +306 -0
  26. arena_bridge-0.5.0/arena_bridge.egg-info/SOURCES.txt +32 -0
  27. arena_bridge-0.5.0/arena_bridge.egg-info/dependency_links.txt +1 -0
  28. arena_bridge-0.5.0/arena_bridge.egg-info/entry_points.txt +2 -0
  29. arena_bridge-0.5.0/arena_bridge.egg-info/top_level.txt +1 -0
  30. arena_bridge-0.5.0/pyproject.toml +34 -0
  31. arena_bridge-0.5.0/setup.cfg +4 -0
  32. arena_bridge-0.5.0/test/test_bridge.py +384 -0
  33. arena_bridge-0.5.0/test/test_browser.py +208 -0
  34. arena_bridge-0.5.0/test/test_mac.py +162 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 arena-bridge contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,306 @@
1
+ Metadata-Version: 2.4
2
+ Name: arena-bridge
3
+ Version: 0.5.0
4
+ Summary: Give a cloud AI agent (Arena.ai Agent Mode, Claude, Cursor, ...) controlled access to your own machine over HTTP/MCP: files, shell, Chrome and the macOS desktop, with an approval gate, trust windows and an audit log.
5
+ License: MIT
6
+ Project-URL: Homepage, https://github.com/vernikr-personal/arena-bridge
7
+ Project-URL: Repository, https://github.com/vernikr-personal/arena-bridge
8
+ Project-URL: Issues, https://github.com/vernikr-personal/arena-bridge/issues
9
+ Project-URL: Changelog, https://github.com/vernikr-personal/arena-bridge/blob/main/CHANGELOG.md
10
+ Keywords: mcp,arena,agent,agent-mode,remote-control,macos,chrome,cdp,peekaboo,automation,sandbox,mcp-server
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: MacOS :: MacOS X
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Classifier: Topic :: Utilities
18
+ Requires-Python: >=3.9
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE
21
+ Dynamic: license-file
22
+
23
+ <div align="center">
24
+ <img src="docs/cover.png" alt="arena-bridge" width="100%">
25
+ </div>
26
+
27
+ <h1 align="center">arena-bridge</h1>
28
+
29
+ <p align="center"><b>Облачный ИИ-агент получает управление вашим компьютером — и только с вашего разрешения.</b></p>
30
+
31
+ <p align="center">
32
+ <a href="https://www.npmjs.com/package/arena-bridge"><img src="https://img.shields.io/npm/v/arena-bridge.svg?style=flat-square" alt="npm"></a>
33
+ <a href="https://www.npmjs.com/package/arena-bridge"><img src="https://img.shields.io/npm/dm/arena-bridge.svg?style=flat-square" alt="downloads"></a>
34
+ <img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="license">
35
+ <img src="https://img.shields.io/badge/node-%3E%3D18-green.svg?style=flat-square" alt="node">
36
+ <img src="https://img.shields.io/badge/dependencies-0-brightgreen.svg?style=flat-square" alt="dependencies">
37
+ <img src="https://img.shields.io/badge/tests-92%20passed-brightgreen.svg?style=flat-square" alt="tests">
38
+ </p>
39
+
40
+ <p align="center">
41
+ <code>npm i -g arena-bridge</code> &nbsp;→&nbsp; <code>arena-bridge setup</code> &nbsp;→&nbsp; вставьте готовый промпт в чат с агентом
42
+ </p>
43
+
44
+ ---
45
+
46
+ ## Что это
47
+
48
+ Облачный агент (Arena.ai Agent Mode, Claude, Cursor, любой MCP-клиент) работает в песочнице
49
+ с выходом в интернет, но не имеет доступа к вашему компьютеру. `arena-bridge` — это маленький
50
+ HTTP-сервис на вашей машине: он слушает только localhost, выставляется наружу туннелем
51
+ (cloudflared / ngrok / Tailscale) и отдаёт агенту инструменты, которые вы ему разрешили:
52
+
53
+ * **файлы и шелл** — прочитать, найти, изменить, запустить;
54
+ * **Chrome** — свой браузер агента (headless или с окном) или ваш настоящий Chrome на порту 9222;
55
+ * **macOS-десктоп** — скриншоты, мышь, клавиатура, приложения (через Peekaboo);
56
+ * **процессы** — фоновые дев-серверы с чтением вывода.
57
+
58
+ Всё, что меняет состояние, проходит через гейт подтверждений, а каждое действие пишется в журнал.
59
+ Без вашего `arena-bridge approve` агент ничего не сделает. Наблюдать за машиной можно без
60
+ подтверждений, а работать «без вопросов» — внутри окна доверия, которое вы открываете сами.
61
+
62
+ ---
63
+
64
+ ## Быстрый старт
65
+
66
+ ```bash
67
+ # 1. установить
68
+ npm i -g arena-bridge
69
+
70
+ # 2. один раз: создать конфиг, проверить машину, поднять API + туннель
71
+ arena-bridge setup --root ~/projects --root ~/Documents
72
+
73
+ # 3. скопировать блок «Paste this into the agent chat» и вставить его в чат с агентом
74
+ ```
75
+
76
+ `setup` печатает готовый промпт и публичный URL. Дальше — просто говорите агенту задачу.
77
+
78
+ Нужен туннель? Поставьте `cloudflared` (`brew install cloudflared` или бинарник в `/usr/local/bin`).
79
+ Подойдёт и любой другой: `ngrok http 8787`, `tailscale funnel --bg 8787`.
80
+
81
+ ### В фоне, чтобы не открывать терминал
82
+
83
+ ```bash
84
+ arena-bridge service install # launchd: стартует вместе с системой, URL всегда живой
85
+ arena-bridge url # текущий публичный URL
86
+ ```
87
+
88
+ ### Python
89
+
90
+ ```bash
91
+ pipx install arena-bridge # или: pip install arena-bridge
92
+ arena-bridge setup --root ~/projects
93
+ ```
94
+
95
+ ---
96
+
97
+ ## Что агент умеет
98
+
99
+ | Группа | Инструменты | Что это |
100
+ | --- | --- | --- |
101
+ | Файлы | `list_dir` `read_file` `write_file` `edit_file` `delete_path` `search_files` `file_get` `file_put` | работа с файлами в разрешённых папках |
102
+ | Шелл | `bash` `sysinfo` | команды и сведения о машине |
103
+ | Процессы | `start_process` `read_process_output` `write_process` `kill_process` | фоновые дев-серверы |
104
+ | Chrome | `chrome_launch` `chrome_attach` `chrome_open` `chrome_navigate` `chrome_snapshot` `chrome_click` `chrome_type` `chrome_press` `chrome_screenshot` `chrome_evaluate` `chrome_tabs` `chrome_stop` | браузер через CDP |
105
+ | Десктоп | `mac_see` `mac_click` `mac_type` `mac_key` `mac_scroll` `mac_move` `mac_drag` `mac_apps` `mac_windows` `mac_app_launch` `mac_app_focus` `mac_app_quit` `mac_permissions` | macOS через Peekaboo |
106
+
107
+ Полный каталог с JSON-схемами: `GET /tools` или `arena-bridge tools`.
108
+
109
+ ### Как выбрать инструмент
110
+
111
+ | Агент хочет | Инструмент |
112
+ | --- | --- |
113
+ | прочитать страницу | `chrome_snapshot` (`{"mode":"ax"}` — роли и имена, `{"mode":"text"}`, `{"mode":"html"}`) |
114
+ | кликнуть на странице | `chrome_click` (CSS-селектор или видимый текст) |
115
+ | работать в вашем залогиненном Chrome | `chrome_attach` (порт 9222) и те же `chrome_*` |
116
+ | посмотреть на экран или нативное приложение | `mac_see` (скриншот + id кликабельных элементов) |
117
+ | кликнуть в нативном приложении | `mac_click` (id элемента, видимый текст или координаты) |
118
+ | напечатать | `mac_type`, затем `mac_key` для Enter/Tab/cmd+s |
119
+ | посмотреть файлы | `list_dir` (только верхний уровень; глубже — `{"recursive":true}`) |
120
+
121
+ ---
122
+
123
+ ## Управление Chrome
124
+
125
+ Свой минимальный CDP-клиент внутри пакета: **ни puppeteer, ни playwright не нужны**.
126
+
127
+ ```jsonc
128
+ // браузер агента: свой профиль, без ваших cookie
129
+ {"tool": "chrome_launch", "args": {"headless": true, "url": "https://example.com"}}
130
+ // прочитать структуру страницы
131
+ {"tool": "chrome_snapshot", "args": {"mode": "ax"}}
132
+ // кликнуть и ввести
133
+ {"tool": "chrome_click", "args": {"text": "Sign in"}}
134
+ {"tool": "chrome_type", "args": {"selector": "input[name=q]", "text": "hello", "submit": true}}
135
+ // скриншот
136
+ {"tool": "chrome_screenshot", "args": {"path": "shot.png"}}
137
+ ```
138
+
139
+ * `headless: true` — без окна (по умолчанию), `headless: false` — видимое окно;
140
+ * профиль отдельный (`~/.arena-bridge/chrome-profile-*`), в ваши сессии агент не попадает;
141
+ * действия в браузере агента подтверждения не требуют — это его песочница.
142
+
143
+ **Ваш настоящий Chrome** (с вашими логинами) — через `chrome_attach`:
144
+
145
+ ```bash
146
+ open -na "Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-debug"
147
+ ```
148
+
149
+ ```jsonc
150
+ {"tool": "chrome_attach", "args": {"port": 9222}}
151
+ ```
152
+
153
+ Любое действие в присоединённом браузере требует локального подтверждения. Инструментов чтения
154
+ cookies и localStorage нет.
155
+
156
+ ---
157
+
158
+ ## Управление macOS-десктопом
159
+
160
+ Через [Peekaboo](https://github.com/openclaw/Peekaboo) (это же использует и MCP-режим Peekaboo):
161
+
162
+ ```jsonc
163
+ {"tool": "mac_see", "args": {"app": "Safari", "mode": "window"}} // скриншот + id элементов
164
+ {"tool": "mac_click", "args": {"on": "B3"}} // клик по id из mac_see
165
+ {"tool": "mac_type", "args": {"text": "hello", "submit": true}}
166
+ {"tool": "mac_key", "args": {"key": "cmd+s"}}
167
+ {"tool": "mac_apps", "args": {}} // что запущено
168
+ {"tool": "mac_permissions", "args": {}} // чего не хватает в macOS
169
+ ```
170
+
171
+ Установить Peekaboo: `brew install peekaboo` (или бинарник в `/usr/local/bin/peekaboo`).
172
+ macOS спросит разрешения **Screen Recording** и **Accessibility** для терминала, из которого
173
+ запущен мост — без них скриншоты и клики не работают; `mac_permissions` покажет, что не так.
174
+
175
+ ---
176
+
177
+ ## Доверенное окно: работать без подтверждений
178
+
179
+ ```bash
180
+ arena-bridge trust --for 2h # всё, на 2 часа
181
+ arena-bridge trust --for 30m --tools bash # только команды
182
+ arena-bridge trust --for 1h --paths ~/projects/my-app # только эта папка
183
+ arena-bridge trust --status
184
+ arena-bridge trust --off
185
+ ```
186
+
187
+ * окно снимает требование **подтверждения**, но не снимает **политику путей**: за пределами
188
+ `roots` и в защищённых каталогах по-прежнему `PROTECTED`;
189
+ * `--paths` ограничивает доверие конкретными папками; `bash` под такое ограничение не попадает —
190
+ чтобы доверять командам, укажите `--tools bash` явно;
191
+ * окно живёт локально (`~/.arena-bridge/trust.json`), агент открыть его не может;
192
+ * после истечения срока подтверждения возвращаются сами, а все действия остаются в журнале.
193
+
194
+ ---
195
+
196
+ ## Безопасность
197
+
198
+ | Токен | Кто знает | Что позволяет |
199
+ | --- | --- | --- |
200
+ | `token` | агент | вызывать инструменты по HTTP/MCP |
201
+ | `deviceToken` | только устройство | подключаться к хабу |
202
+ | `localToken` | только вы | подтверждать запросы и открывать окно доверия |
203
+
204
+ * **Агент не может одобрить сам себя**: `POST /approvals/:id` требует локальный токен.
205
+ * **Пути ограничены**: всё вне `roots` — `PROTECTED`. Защищённый список по умолчанию включает
206
+ `~/.ssh`, `~/.aws`, `~/.arena-bridge`, `~/.npmrc`, профили браузеров, ключи.
207
+ * **Подтверждения**: `bash`, запись, удаление, управление вашим Chrome и десктопом ждут
208
+ `arena-bridge approve <id>`. Ответ `APPROVAL_PENDING` содержит `approval_id` — покажите его
209
+ пользователю и повторите вызов один раз.
210
+ * **Журнал**: `~/.arena-bridge/audit.log` (JSONL) — кто, что и когда вызвал.
211
+ * **Транспорт**: сервер слушает `127.0.0.1`, наружу — только туннель с HTTPS.
212
+
213
+ ```bash
214
+ arena-bridge rotate # новый агентский токен (действует мгновенно)
215
+ arena-bridge rotate --device # новый девайсный токен
216
+ arena-bridge audit -n 50 # что происходило
217
+ ```
218
+
219
+ ---
220
+
221
+ ## Команды
222
+
223
+ | Команда | Что делает |
224
+ | --- | --- |
225
+ | `setup` | конфиг + проверка машины + API + туннель + готовый промпт |
226
+ | `init` | создать `~/.arena-bridge/config.json` с токенами (`--root` повторяемый) |
227
+ | `start` | локальный API-сервер |
228
+ | `tunnel` | API + облачный туннель, печатает промпт |
229
+ | `hub` / `connect` | режим «хаб»: VPS принимает подключения многих машин |
230
+ | `prompt` | готовый промпт для чата с агентом |
231
+ | `tools` | каталог инструментов в JSON |
232
+ | `trust` | окно доверия (`--for`, `--tools`, `--paths`, `--off`, `--status`) |
233
+ | `approvals` / `approve <id>` | ожидающие подтверждения и ответ на них (`--deny`) |
234
+ | `audit [-n N]` | журнал действий |
235
+ | `doctor` | проверка установки, токенов, путей, Peekaboo, Chrome |
236
+ | `url` | текущий публичный URL |
237
+ | `version` | установленная и последняя версии |
238
+ | `update` | обновить пакет с npm (`--check` — только проверить) |
239
+ | `service` | macOS-фоновый сервис: `install` / `uninstall` / `status` |
240
+ | `rotate` | сменить агентский или девайсный токен |
241
+
242
+ ---
243
+
244
+ ## API и MCP
245
+
246
+ ```
247
+ GET /health liveness (без авторизации)
248
+ GET /tools каталог инструментов с JSON-схемами
249
+ GET /prompt этот промпт для агента
250
+ GET /approvals ожидающие подтверждения
251
+ POST /call {"tool":"bash","args":{...}}
252
+ POST /exec {"command":"...","cwd":"...","timeout_sec":120}
253
+ GET|PUT|DELETE /files?path=/abs/path
254
+ POST /approvals/:id {"decision":"approve"|"deny"} — только по локальному токену
255
+ POST /mcp MCP Streamable HTTP (protocolVersion 2025-06-18)
256
+ ```
257
+
258
+ ```bash
259
+ curl -sS -X POST "https://<ваш-url>/call" \
260
+ -H "Authorization: Bearer $ARENA_BRIDGE_TOKEN" \
261
+ -H "Content-Type: application/json" \
262
+ -d '{"tool":"sysinfo","args":{}}'
263
+ ```
264
+
265
+ ---
266
+
267
+ ## Разработка
268
+
269
+ ```bash
270
+ npm install # зависимостей нет — только dev-тесты
271
+ npm test # 50 тестов Node: direct, approval, trust, MCP, hub, туннель, Chrome, десктоп
272
+ npm run test:python # 42 теста Python: то же самое
273
+ ```
274
+
275
+ Тесты не требуют ни Chrome, ни Peekaboo: используются фейковые CDP- и Peekaboo-серверы
276
+ (`test/fake-cdp.mjs`, `test/fake-peekaboo.sh`).
277
+
278
+ ```
279
+ src/ Node-реализация (zero dependencies)
280
+ ws.mjs минимальный WebSocket-клиент
281
+ cdp.mjs клиент Chrome DevTools Protocol
282
+ browser.mjs 12 инструментов chrome_*
283
+ mac.mjs 13 инструментов mac_* (Peekaboo)
284
+ trust.mjs окно доверия
285
+ policy.mjs проверка путей (roots / protected)
286
+ engine.mjs каталог, гейт подтверждений, аудит
287
+ direct.mjs HTTP-сервер
288
+ hub.mjs хаб для нескольких машин
289
+ cli.mjs команды
290
+ arena_bridge/ тот же функционал на Python (stdlib only)
291
+ ```
292
+
293
+ ## Частые проблемы
294
+
295
+ | Симптом | Что делать |
296
+ | --- | --- |
297
+ | `port 8787 is already in use` | остановите старый экземпляр (`Ctrl+C`) или `arena-bridge start --port 8788` |
298
+ | туннель не поднимается | `cloudflared` по умолчанию использует QUIC и может быть заблокирован — `arena-bridge tunnel --protocol http2` (это поведение по умолчанию) |
299
+ | агент не видит файлы | проверьте `arena-bridge doctor` и `roots` в `~/.arena-bridge/config.json`; вне `roots` всё равно `PROTECTED` |
300
+ | `APPROVAL_PENDING` | покажите пользователю `arena-bridge approve <id>` или откройте `arena-bridge trust --for 1h` |
301
+ | скриншоты не работают | `mac_permissions` — выдайте терминалу Screen Recording и Accessibility |
302
+ | `peekaboo_not_found` | поставьте Peekaboo или укажите путь: `arena-bridge init` + `peekabooPath` в конфиге |
303
+
304
+ ## Лицензия
305
+
306
+ MIT
@@ -0,0 +1,284 @@
1
+ <div align="center">
2
+ <img src="docs/cover.png" alt="arena-bridge" width="100%">
3
+ </div>
4
+
5
+ <h1 align="center">arena-bridge</h1>
6
+
7
+ <p align="center"><b>Облачный ИИ-агент получает управление вашим компьютером — и только с вашего разрешения.</b></p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/arena-bridge"><img src="https://img.shields.io/npm/v/arena-bridge.svg?style=flat-square" alt="npm"></a>
11
+ <a href="https://www.npmjs.com/package/arena-bridge"><img src="https://img.shields.io/npm/dm/arena-bridge.svg?style=flat-square" alt="downloads"></a>
12
+ <img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="license">
13
+ <img src="https://img.shields.io/badge/node-%3E%3D18-green.svg?style=flat-square" alt="node">
14
+ <img src="https://img.shields.io/badge/dependencies-0-brightgreen.svg?style=flat-square" alt="dependencies">
15
+ <img src="https://img.shields.io/badge/tests-92%20passed-brightgreen.svg?style=flat-square" alt="tests">
16
+ </p>
17
+
18
+ <p align="center">
19
+ <code>npm i -g arena-bridge</code> &nbsp;→&nbsp; <code>arena-bridge setup</code> &nbsp;→&nbsp; вставьте готовый промпт в чат с агентом
20
+ </p>
21
+
22
+ ---
23
+
24
+ ## Что это
25
+
26
+ Облачный агент (Arena.ai Agent Mode, Claude, Cursor, любой MCP-клиент) работает в песочнице
27
+ с выходом в интернет, но не имеет доступа к вашему компьютеру. `arena-bridge` — это маленький
28
+ HTTP-сервис на вашей машине: он слушает только localhost, выставляется наружу туннелем
29
+ (cloudflared / ngrok / Tailscale) и отдаёт агенту инструменты, которые вы ему разрешили:
30
+
31
+ * **файлы и шелл** — прочитать, найти, изменить, запустить;
32
+ * **Chrome** — свой браузер агента (headless или с окном) или ваш настоящий Chrome на порту 9222;
33
+ * **macOS-десктоп** — скриншоты, мышь, клавиатура, приложения (через Peekaboo);
34
+ * **процессы** — фоновые дев-серверы с чтением вывода.
35
+
36
+ Всё, что меняет состояние, проходит через гейт подтверждений, а каждое действие пишется в журнал.
37
+ Без вашего `arena-bridge approve` агент ничего не сделает. Наблюдать за машиной можно без
38
+ подтверждений, а работать «без вопросов» — внутри окна доверия, которое вы открываете сами.
39
+
40
+ ---
41
+
42
+ ## Быстрый старт
43
+
44
+ ```bash
45
+ # 1. установить
46
+ npm i -g arena-bridge
47
+
48
+ # 2. один раз: создать конфиг, проверить машину, поднять API + туннель
49
+ arena-bridge setup --root ~/projects --root ~/Documents
50
+
51
+ # 3. скопировать блок «Paste this into the agent chat» и вставить его в чат с агентом
52
+ ```
53
+
54
+ `setup` печатает готовый промпт и публичный URL. Дальше — просто говорите агенту задачу.
55
+
56
+ Нужен туннель? Поставьте `cloudflared` (`brew install cloudflared` или бинарник в `/usr/local/bin`).
57
+ Подойдёт и любой другой: `ngrok http 8787`, `tailscale funnel --bg 8787`.
58
+
59
+ ### В фоне, чтобы не открывать терминал
60
+
61
+ ```bash
62
+ arena-bridge service install # launchd: стартует вместе с системой, URL всегда живой
63
+ arena-bridge url # текущий публичный URL
64
+ ```
65
+
66
+ ### Python
67
+
68
+ ```bash
69
+ pipx install arena-bridge # или: pip install arena-bridge
70
+ arena-bridge setup --root ~/projects
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Что агент умеет
76
+
77
+ | Группа | Инструменты | Что это |
78
+ | --- | --- | --- |
79
+ | Файлы | `list_dir` `read_file` `write_file` `edit_file` `delete_path` `search_files` `file_get` `file_put` | работа с файлами в разрешённых папках |
80
+ | Шелл | `bash` `sysinfo` | команды и сведения о машине |
81
+ | Процессы | `start_process` `read_process_output` `write_process` `kill_process` | фоновые дев-серверы |
82
+ | Chrome | `chrome_launch` `chrome_attach` `chrome_open` `chrome_navigate` `chrome_snapshot` `chrome_click` `chrome_type` `chrome_press` `chrome_screenshot` `chrome_evaluate` `chrome_tabs` `chrome_stop` | браузер через CDP |
83
+ | Десктоп | `mac_see` `mac_click` `mac_type` `mac_key` `mac_scroll` `mac_move` `mac_drag` `mac_apps` `mac_windows` `mac_app_launch` `mac_app_focus` `mac_app_quit` `mac_permissions` | macOS через Peekaboo |
84
+
85
+ Полный каталог с JSON-схемами: `GET /tools` или `arena-bridge tools`.
86
+
87
+ ### Как выбрать инструмент
88
+
89
+ | Агент хочет | Инструмент |
90
+ | --- | --- |
91
+ | прочитать страницу | `chrome_snapshot` (`{"mode":"ax"}` — роли и имена, `{"mode":"text"}`, `{"mode":"html"}`) |
92
+ | кликнуть на странице | `chrome_click` (CSS-селектор или видимый текст) |
93
+ | работать в вашем залогиненном Chrome | `chrome_attach` (порт 9222) и те же `chrome_*` |
94
+ | посмотреть на экран или нативное приложение | `mac_see` (скриншот + id кликабельных элементов) |
95
+ | кликнуть в нативном приложении | `mac_click` (id элемента, видимый текст или координаты) |
96
+ | напечатать | `mac_type`, затем `mac_key` для Enter/Tab/cmd+s |
97
+ | посмотреть файлы | `list_dir` (только верхний уровень; глубже — `{"recursive":true}`) |
98
+
99
+ ---
100
+
101
+ ## Управление Chrome
102
+
103
+ Свой минимальный CDP-клиент внутри пакета: **ни puppeteer, ни playwright не нужны**.
104
+
105
+ ```jsonc
106
+ // браузер агента: свой профиль, без ваших cookie
107
+ {"tool": "chrome_launch", "args": {"headless": true, "url": "https://example.com"}}
108
+ // прочитать структуру страницы
109
+ {"tool": "chrome_snapshot", "args": {"mode": "ax"}}
110
+ // кликнуть и ввести
111
+ {"tool": "chrome_click", "args": {"text": "Sign in"}}
112
+ {"tool": "chrome_type", "args": {"selector": "input[name=q]", "text": "hello", "submit": true}}
113
+ // скриншот
114
+ {"tool": "chrome_screenshot", "args": {"path": "shot.png"}}
115
+ ```
116
+
117
+ * `headless: true` — без окна (по умолчанию), `headless: false` — видимое окно;
118
+ * профиль отдельный (`~/.arena-bridge/chrome-profile-*`), в ваши сессии агент не попадает;
119
+ * действия в браузере агента подтверждения не требуют — это его песочница.
120
+
121
+ **Ваш настоящий Chrome** (с вашими логинами) — через `chrome_attach`:
122
+
123
+ ```bash
124
+ open -na "Google Chrome" --args --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-debug"
125
+ ```
126
+
127
+ ```jsonc
128
+ {"tool": "chrome_attach", "args": {"port": 9222}}
129
+ ```
130
+
131
+ Любое действие в присоединённом браузере требует локального подтверждения. Инструментов чтения
132
+ cookies и localStorage нет.
133
+
134
+ ---
135
+
136
+ ## Управление macOS-десктопом
137
+
138
+ Через [Peekaboo](https://github.com/openclaw/Peekaboo) (это же использует и MCP-режим Peekaboo):
139
+
140
+ ```jsonc
141
+ {"tool": "mac_see", "args": {"app": "Safari", "mode": "window"}} // скриншот + id элементов
142
+ {"tool": "mac_click", "args": {"on": "B3"}} // клик по id из mac_see
143
+ {"tool": "mac_type", "args": {"text": "hello", "submit": true}}
144
+ {"tool": "mac_key", "args": {"key": "cmd+s"}}
145
+ {"tool": "mac_apps", "args": {}} // что запущено
146
+ {"tool": "mac_permissions", "args": {}} // чего не хватает в macOS
147
+ ```
148
+
149
+ Установить Peekaboo: `brew install peekaboo` (или бинарник в `/usr/local/bin/peekaboo`).
150
+ macOS спросит разрешения **Screen Recording** и **Accessibility** для терминала, из которого
151
+ запущен мост — без них скриншоты и клики не работают; `mac_permissions` покажет, что не так.
152
+
153
+ ---
154
+
155
+ ## Доверенное окно: работать без подтверждений
156
+
157
+ ```bash
158
+ arena-bridge trust --for 2h # всё, на 2 часа
159
+ arena-bridge trust --for 30m --tools bash # только команды
160
+ arena-bridge trust --for 1h --paths ~/projects/my-app # только эта папка
161
+ arena-bridge trust --status
162
+ arena-bridge trust --off
163
+ ```
164
+
165
+ * окно снимает требование **подтверждения**, но не снимает **политику путей**: за пределами
166
+ `roots` и в защищённых каталогах по-прежнему `PROTECTED`;
167
+ * `--paths` ограничивает доверие конкретными папками; `bash` под такое ограничение не попадает —
168
+ чтобы доверять командам, укажите `--tools bash` явно;
169
+ * окно живёт локально (`~/.arena-bridge/trust.json`), агент открыть его не может;
170
+ * после истечения срока подтверждения возвращаются сами, а все действия остаются в журнале.
171
+
172
+ ---
173
+
174
+ ## Безопасность
175
+
176
+ | Токен | Кто знает | Что позволяет |
177
+ | --- | --- | --- |
178
+ | `token` | агент | вызывать инструменты по HTTP/MCP |
179
+ | `deviceToken` | только устройство | подключаться к хабу |
180
+ | `localToken` | только вы | подтверждать запросы и открывать окно доверия |
181
+
182
+ * **Агент не может одобрить сам себя**: `POST /approvals/:id` требует локальный токен.
183
+ * **Пути ограничены**: всё вне `roots` — `PROTECTED`. Защищённый список по умолчанию включает
184
+ `~/.ssh`, `~/.aws`, `~/.arena-bridge`, `~/.npmrc`, профили браузеров, ключи.
185
+ * **Подтверждения**: `bash`, запись, удаление, управление вашим Chrome и десктопом ждут
186
+ `arena-bridge approve <id>`. Ответ `APPROVAL_PENDING` содержит `approval_id` — покажите его
187
+ пользователю и повторите вызов один раз.
188
+ * **Журнал**: `~/.arena-bridge/audit.log` (JSONL) — кто, что и когда вызвал.
189
+ * **Транспорт**: сервер слушает `127.0.0.1`, наружу — только туннель с HTTPS.
190
+
191
+ ```bash
192
+ arena-bridge rotate # новый агентский токен (действует мгновенно)
193
+ arena-bridge rotate --device # новый девайсный токен
194
+ arena-bridge audit -n 50 # что происходило
195
+ ```
196
+
197
+ ---
198
+
199
+ ## Команды
200
+
201
+ | Команда | Что делает |
202
+ | --- | --- |
203
+ | `setup` | конфиг + проверка машины + API + туннель + готовый промпт |
204
+ | `init` | создать `~/.arena-bridge/config.json` с токенами (`--root` повторяемый) |
205
+ | `start` | локальный API-сервер |
206
+ | `tunnel` | API + облачный туннель, печатает промпт |
207
+ | `hub` / `connect` | режим «хаб»: VPS принимает подключения многих машин |
208
+ | `prompt` | готовый промпт для чата с агентом |
209
+ | `tools` | каталог инструментов в JSON |
210
+ | `trust` | окно доверия (`--for`, `--tools`, `--paths`, `--off`, `--status`) |
211
+ | `approvals` / `approve <id>` | ожидающие подтверждения и ответ на них (`--deny`) |
212
+ | `audit [-n N]` | журнал действий |
213
+ | `doctor` | проверка установки, токенов, путей, Peekaboo, Chrome |
214
+ | `url` | текущий публичный URL |
215
+ | `version` | установленная и последняя версии |
216
+ | `update` | обновить пакет с npm (`--check` — только проверить) |
217
+ | `service` | macOS-фоновый сервис: `install` / `uninstall` / `status` |
218
+ | `rotate` | сменить агентский или девайсный токен |
219
+
220
+ ---
221
+
222
+ ## API и MCP
223
+
224
+ ```
225
+ GET /health liveness (без авторизации)
226
+ GET /tools каталог инструментов с JSON-схемами
227
+ GET /prompt этот промпт для агента
228
+ GET /approvals ожидающие подтверждения
229
+ POST /call {"tool":"bash","args":{...}}
230
+ POST /exec {"command":"...","cwd":"...","timeout_sec":120}
231
+ GET|PUT|DELETE /files?path=/abs/path
232
+ POST /approvals/:id {"decision":"approve"|"deny"} — только по локальному токену
233
+ POST /mcp MCP Streamable HTTP (protocolVersion 2025-06-18)
234
+ ```
235
+
236
+ ```bash
237
+ curl -sS -X POST "https://<ваш-url>/call" \
238
+ -H "Authorization: Bearer $ARENA_BRIDGE_TOKEN" \
239
+ -H "Content-Type: application/json" \
240
+ -d '{"tool":"sysinfo","args":{}}'
241
+ ```
242
+
243
+ ---
244
+
245
+ ## Разработка
246
+
247
+ ```bash
248
+ npm install # зависимостей нет — только dev-тесты
249
+ npm test # 50 тестов Node: direct, approval, trust, MCP, hub, туннель, Chrome, десктоп
250
+ npm run test:python # 42 теста Python: то же самое
251
+ ```
252
+
253
+ Тесты не требуют ни Chrome, ни Peekaboo: используются фейковые CDP- и Peekaboo-серверы
254
+ (`test/fake-cdp.mjs`, `test/fake-peekaboo.sh`).
255
+
256
+ ```
257
+ src/ Node-реализация (zero dependencies)
258
+ ws.mjs минимальный WebSocket-клиент
259
+ cdp.mjs клиент Chrome DevTools Protocol
260
+ browser.mjs 12 инструментов chrome_*
261
+ mac.mjs 13 инструментов mac_* (Peekaboo)
262
+ trust.mjs окно доверия
263
+ policy.mjs проверка путей (roots / protected)
264
+ engine.mjs каталог, гейт подтверждений, аудит
265
+ direct.mjs HTTP-сервер
266
+ hub.mjs хаб для нескольких машин
267
+ cli.mjs команды
268
+ arena_bridge/ тот же функционал на Python (stdlib only)
269
+ ```
270
+
271
+ ## Частые проблемы
272
+
273
+ | Симптом | Что делать |
274
+ | --- | --- |
275
+ | `port 8787 is already in use` | остановите старый экземпляр (`Ctrl+C`) или `arena-bridge start --port 8788` |
276
+ | туннель не поднимается | `cloudflared` по умолчанию использует QUIC и может быть заблокирован — `arena-bridge tunnel --protocol http2` (это поведение по умолчанию) |
277
+ | агент не видит файлы | проверьте `arena-bridge doctor` и `roots` в `~/.arena-bridge/config.json`; вне `roots` всё равно `PROTECTED` |
278
+ | `APPROVAL_PENDING` | покажите пользователю `arena-bridge approve <id>` или откройте `arena-bridge trust --for 1h` |
279
+ | скриншоты не работают | `mac_permissions` — выдайте терминалу Screen Recording и Accessibility |
280
+ | `peekaboo_not_found` | поставьте Peekaboo или укажите путь: `arena-bridge init` + `peekabooPath` в конфиге |
281
+
282
+ ## Лицензия
283
+
284
+ MIT
@@ -0,0 +1,3 @@
1
+ """arena-bridge — controlled remote access to your own machine for cloud AI agents."""
2
+
3
+ __version__ = "0.5.0"
@@ -0,0 +1,4 @@
1
+ from .cli import main
2
+
3
+ if __name__ == "__main__":
4
+ main()