Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
Прокси-сниффер HTTP(S) для Windows вместо Charles, которым управляет Claude Code через MCP
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Прокси-сниффер HTTP(S) для Windows вместо Charles, которым ИИ-агент управляет сам. Телефон, эмулятор или браузер
шлют трафик через AgentProxy, каждый завершённый запрос попадает в историю, а Claude Code читает её, ищет нужные
запросы и ждёт новые через MCP-сервер agentproxy — без кликов в окне сниффера. Подменять ответы (map local,
rewrite, ошибки, задержки) Claude тоже может сам — правилами подмены.
Этот раздел — инструкция для ИИ-агента. Дай Claude ссылку на репозиторий и попроси поставить AgentProxy.
curl -fL -o "$TEMP/AgentProxySetup.exe" https://github.com/aokazantsev/AgentProxy/releases/latest/download/AgentProxySetup.exe
digest у файла в последнем релизе). Команда печатает OK
или MISMATCH; при MISMATCH или пустом digest установщик не запускать и сказать пользователю:
expected=$(curl -s https://api.github.com/repos/aokazantsev/AgentProxy/releases/latest | grep -o '"digest": *"sha256:[0-9a-f]*"' | grep -o '[0-9a-f]\{64\}'); actual=$(sha256sum "$TEMP/AgentProxySetup.exe" | cut -d' ' -f1); [ -n "$expected" ] && [ "$expected" = "$actual" ] && echo OK || echo MISMATCH
"$TEMP/AgentProxySetup.exe" --silent
Код выхода 0 — успех, журнал установки — %TEMP%\AgentProxy-setup.log. Установщик кладёт программу в
%LOCALAPPDATA%\Programs\AgentProxy, включает автозапуск, запускает программу и подключает Claude Code:
MCP-сервер agentproxy, скилл agentproxy и хуки. Ключи: --noautostart, --dir="<папка>",
--option:claude=0 (не подключать Claude Code; поверх установки с подключённой интеграцией — снять её), --option:crashReports=1 (отправлять автору отчёты о сбоях — только если пользователь прямо согласился:
в отчёт уходит хвост журнала программы или движка, состав — раздел «Журналы для самопроверки»),
--option:usageStatistics=0 (не отправлять анонимную статистику использования — раздел «Статистика и проверка
обновлений»; без ключа статистика включается, если пользователь не выключал её раньше: выключенная остаётся
выключенной).
Ключи пишутся и через / (/silent), но из Git Bash — только через --: Git Bash превращает /silent в путь."$LOCALAPPDATA/Programs/AgentProxy/agentproxy.cmd" status --wait 30
Команда ждёт до 30 секунд, пока движок поднимется после установки. "running": true и код 0 — движок работает
("paused": "charles" и код 0 — работает, прокси выключен на время Charles, раздел «Рядом с Charles»), claude.mcp, claude.skill, claude.hooks — интеграция на месте.agentproxy подхватывается сразу и
описывает подключение устройства. Если в %LOCALAPPDATA%\AgentProxy\usage-statistics.txt стоит on (ставили без
--option:usageStatistics=0, и пользователь не выключал статистику раньше) — обязательно сказать, что
включена анонимная статистика использования: что уходит (раздел «Статистика и проверка обновлений» — счётчики
пунктов меню и вызовов инструментов MCP по имени, настройки и состояние, без запросов, адресов и путей) и как
выключить — снять галку в «Настройках…» программы в трее или переустановить с --option:usageStatistics=0.Обновление: пользователь нажимает в трее «Проверить обновление…» → «Установить сейчас» (или щёлкает уведомление о новой версии). Интеграция с Claude Code обновляется сама при первом запуске новой версии, а хуки сообщают открытым сессиям, что нового.
Прокси слушает только 127.0.0.1:8890, устройство подключается через adb reverse — по USB или Wi-Fi-отладке,
без открытия портов в брандмауэре. Claude включает и выключает прокси устройства сам инструментом device_proxy, а доходит ли трафик и что мешает —
проверяет check_connection; команды ниже — то же руками.
adb reverse tcp:8890 tcp:8890
adb shell settings put global http_proxy 127.0.0.1:8890
Корневой сертификат ставится на устройство один раз: с включённым прокси открыть в браузере устройства
http://mitm.it и следовать инструкции для Android. Приложение увидит HTTPS, если доверяет пользовательским
сертификатам (network_security_config с <certificates src="user"/> в debug-сборке).
После работы прокси на устройстве выключается, иначе без запущенного AgentProxy у него пропадёт интернет:
adb shell settings put global http_proxy :0
adb reverse --remove tcp:8890
Через adb reverse все устройства приходят на ПК с одного адреса, поэтому device_proxy enable даёт каждому устройству
свой порт на ПК: телефон по-прежнему смотрит на 127.0.0.1:8890, а adb reverse tcp:8890 tcp:<порт ПК> ведёт его в
отдельный порт прокси. Порт выдаётся по serial (свободный после последнего выданного, начиная выше порта прокси: обычно 8892, 8893…), хранится в
device-ports.json и переживает перезапуск движка; занятый другой программой порт при запуске заменяется новым.
Запоминаются 32 устройства: 33-е вытесняет то, которое включали давнее всех, и его порт закрывается (у отладки по
Wi-Fi serial меняется при каждом подключении). Каждый
запрос в истории несёт device — serial устройства; трафик самого ПК и устройств, подключённых командами выше на общий
порт, — без устройства.
Так несколько тредов Claude работают каждый со своим телефоном и не видят чужого: list_flows, wait_for_flow,
wait_for_event, list_events и монитор фильтруются по device, check_connection с serial считает трафик одного
устройства, правило с device подменяет ответы только ему (без device — всем, как раньше), clear_flows с device и
delete_rule с all и device чистят историю и правила только этого устройства. Пауза на время Charles снимает и возвращает прокси каждому устройству на его
порт.
Галка «Выключать прокси, пока запущен Charles» в «Настройках…» (по умолчанию выключена) нужна, когда на этом ПК
пользуются и Charles. Пока запущен Charles.exe, AgentProxy не слушает свой порт, а устройство, у которого прокси
смотрит на AgentProxy, снимается с него: http_proxy :0 и adb reverse --remove. Новые соединения телефона идут в
Charles, если он задан прокси Wi-Fi, иначе напрямую; уже открытые (WebSocket, SSE, keep-alive) доживают через AgentProxy
до закрытия — чтобы всё ушло в Charles, приложение перезапустить. Значок в трее серый, уведомление и меню пишут «выключен, пока работает Charles». Когда Charles
закроют, прокси включается сам и возвращает прокси тем устройствам, которые снял, если они подключены и прокси на них
за это время никто не задал. Монитор, история, MCP и HTTP API работают и на паузе: proxy_status показывает
paused: "charles", check_connection — вердикт paused_for_charles, device_proxy enable отказывает. Галка хранится
в settings.json: установка поверх её не трогает, снимает её пользователь или «Сбросить настройки» установщика. Снятие
галки перезапускает движок, и прокси устройствам, снятым на паузе, уже не возвращается — включить заново (device_proxy enable). Порт прокси должен отличаться от порта Charles: иначе движок при запущенном Charles не стартует («порт занят»).
| Инструмент MCP | Что делает |
|---|---|
proxy_status | версия, порт, число записанных запросов и правил подмены, ссылки на сертификат |
list_flows | сводка запросов, свежие сверху, фильтры по хосту, пути, методу, коду, ошибкам, применённому правилу, виду (обычный запрос, SSE, WebSocket), открытым потокам и устройству |
get_flow | запрос целиком: заголовки и тела в кодировке ответа, JSON отформатирован (raw — без форматирования; тело в истории — после правил) |
wait_for_flow | ждёт запрос, который приложение отправит после вызова |
list_events | события SSE-потока или WebSocket-соединения: направление, имя, данные; открытый поток читается по мере роста |
wait_for_event | ждёт событие по направлению, имени или тексту в одном потоке или в любом потоке под фильтры хоста и пути |
send_event | отправляет сообщение в открытое WebSocket-соединение — приложению как от сервера или серверу как от приложения; в SSE-поток, который держит правило sse, — событие (data, event, id, retry) или разрыв (close) |
clear_flows | очищает историю (с device — одного устройства); открытые SSE и WebSocket остаются и продолжают записываться |
add_rule | добавляет правило подмены: ответ от прокси, правка запроса и ответа, обрыв, задержка, свой поток SSE, правка и обрыв событий SSE и WebSocket; с device — только для одного устройства |
list_rules | правила по порядку проверки, сколько раз сработало каждое с запуска движка |
update_rule | меняет правило, включает и выключает его |
delete_rule | удаляет одно правило, все или все правила одного устройства |
device_proxy | включает и выключает прокси на Android-устройстве через adb (adb reverse на свой порт ПК и http_proxy), показывает прежнее значение, порт ПК и состояние после вызова; устройство выбирается по serial, одно подключённое — само |
check_connection |
То же доступно по HTTP: GET /api/status, GET /api/flows?host=..., GET /api/flows/<id>,
GET /api/flows/wait?path=..., DELETE /api/flows, GET /api/events?flow=<id> и GET /api/events/wait (события потока), POST /api/events/send, GET/POST /api/rules (GET ?id= — одно правило целиком), DELETE /api/rules (все правила, ?device=<serial> — правила одного устройства),
PATCH/DELETE /api/rules/<id>, GET /api/log?source=engine&level=warning&lines=50, GET/POST /api/device (прокси устройства; тело POST — {"action": "enable"}), GET /api/connection (проверка подключения), сертификат — /api/ca.pem, /api/ca.cer. Монитор для человека —
http://127.0.0.1:8891/: список, группы одинаковых запросов или дерево хостов и путей, сортировка по столбцам,
фильтры по устройству, методу и коду, закрепление хостов правой кнопкой мыши (GET/POST /api/monitor/pins). У потока в списке
метка SSE или WS (● — открыт), в деталях — события, список растёт сам.
По engine.log и log.txt видно, исправен ли сам прокси. Claude читает их инструментом read_log и, когда запрос не виден, правило не сработало или ответ не тот, сначала сверяется с журналом: он отделяет сбой AgentProxy от поведения приложения или сервера. В журналах нет тел и заголовков запросов, путей и параметров адреса, серийных номеров устройств, вывода adb и пути к adb; в строках правил стоят метод, хост, номер записи истории и итог, в отказах правил — пути к файлам ответов (body_file). Хвост журнала в 100 КБ уходит в отчёт о сбое, только если пользователь согласился.
Замена map local и rewrite из Charles. Правило — условие (host, path, method, url_regex; host и path
работают как фильтры list_flows) и действие:
| Действие | Что делает |
|---|---|
respond | отвечает сам, сервер не получает запрос: текст или локальный файл (body_file, читается на каждый запрос), код 200–599 и заголовки |
rewrite | запрос уходит на сервер, по дороге меняются заголовки запроса, код, заголовки и тело ответа (целиком или заменой текста) |
drop | обрывает запрос без ответа: HTTP/1 — закрывает соединение, HTTP/2 — сбрасывает поток |
delay | только замедляет: задержка delay_ms и скорость download_kbps/upload_kbps; эти поля есть и у остальных действий, кроме events |
cut | отвечает сервер, а прокси обрывает ответ посреди тела: после after_bytes байт или after_percent от Content-Length; HTTP/1.1 — закрывает соединение без конца тела, HTTP/2 — сбрасывает поток |
sse | отвечает открытым потоком Server-Sent Events, сервер не получает запрос: body — первые события при подключении, дальше события шлёт Claude через send_event, разрыв — close |
events | меняет события потоков SSE и WebSocket настоящего сервера: заменяет текст в данных (replace) или данные целиком (event_data), рвёт соединение приложения на нужном событии (close: до него или после); event_contains выбирает события, direction — от сервера или от приложения |
Скорость (замена throttling из Charles) задаётся в кбит/с: download_kbps — ответ клиенту, upload_kbps — тело
запроса от клиента; работает и для ответов сервера, и для ответов правил. Так проверяются загрузчики, прогресс
скачивания и загрузки файлов. Скорость правила общая на все его запросы и соединения, как одна медленная сеть;
запрос под несколькими правилами идёт по самому медленному и учитывается только в нём.
Замедляется соединение клиента, пока по нему идёт подходящий запрос: на HTTP/1.1 это ровно этот запрос. Хосту из условия host такого правила прокси даёт новым соединениям только
HTTP/1.1, чтобы не замедлять соседние запросы в общем соединении HTTP/2; без host, для соединения, открытого до правила,
и для клиента, который умеет только HTTP/2 (gRPC), соединение замедляется целиком, пока не закроется. У подходящего
запроса в истории видно, что и как замедлено.
Подходящие правила применяются по порядку, respond, drop и sse завершают цепочку. Правило events выбирает
поток при его открытии и дальше действует на каждое событие; его times считает потоки, а не запросы, поэтому
close с times: 1 действует только на первый подходящий поток и пропускает переподключение. times ограничивает правило
первыми N запросами (у cut — оборванными ответами) — так собираются сценарии: два ответа с ошибкой, потом успешный (счёт — по запросам: оборванный запрос клиент
повторяет сам); счёт идёт с запуска движка и после
перезапуска начинается заново. Правило с respond, drop или sse и условием host работает и для HTTPS-хоста, который
сейчас недоступен: соединение с сервером для такого хоста откладывается до запроса. respond и sse читают тело запроса
целиком; про загрузки больше 64 МБ — раздел «Ограничения». У каждого запроса в истории видно, какие правила к нему
применились. Тело ответа не правится у ответов больше 64 МБ (в том числе после распаковки), а SSE правится только по
событиям, правилом events, — такая пометка тоже видна у запроса. Правила хранятся в rules.json и действуют, пока их не удалят: хук старта сессии
напоминает Claude о включённых правилах.
| Что | Где | Зачем |
|---|---|---|
MCP-сервер agentproxy | ~/.claude.json, mcpServers | инструменты из таблицы выше |
Скилл agentproxy | ~/.claude/skills/agentproxy/SKILL.md и rules.md | как подключить устройство, HTTP API без MCP, что делать, если трафика не видно; rules.md — справочник правил подмены (условия, кодировки, CORS, пределы, правка тела), его Claude читает перед первым add_rule или update_rule в задаче и при разборе, почему правило не сработало |
Хук SessionStart | ~/.claude/settings.json | в начале сессии Claude узнаёт, работает ли прокси и на каком порту, сколько правил подмены включено и нет ли проблемы с их файлом; после обновления — что нового |
Хук UserPromptSubmit | ~/.claude/settings.json | уже открытая сессия узнаёт об обновлении программы на следующем сообщении; запрос к 127.0.0.1, процесс не запускается |
Подключить и отключить — пункт трея или agentproxy.cmd claude install|uninstall|status. Чужие хуки, серверы и
настройки не трогаются; файл settings.json, который является ссылкой, остаётся ссылкой.
AgentProxy рассчитан на ПК с одним пользователем Windows. API и MCP на 127.0.0.1 не требуют пароля: любой
процесс на этом ПК, в том числе другого пользователя Windows, может прочитать историю запросов и добавить правила
подмены. Пока движок
выключен, программа, занявшая его порт API, получит запросы хука UserPromptSubmit Claude Code. На ПК, где
работают несколько людей, AgentProxy не ставить или отключать интеграцию с Claude Code, когда он не нужен.
Через прокси к его собственным портам не пройти: соединение с ними на 127.0.0.1 отклоняется, а запросы через прокси
к портам с такими номерами получают служебный заголовок, по которому API их не принимает, даже если приложение
подменило ответ DNS (rebinding). Остальные локальные сервисы ПК через прокси доступны
намеренно — так отлаживается локальный бэкенд с устройства. Страница, открытая в браузере устройства, может послать
запрос такому сервису по имени, которое ведёт на 127.0.0.1. Ответ она не прочитает, но сам запрос, например POST формы, дойдёт.
WebSocket-сообщение прокси держит в памяти целиком, пока оно не придёт до конца, а сжатое (permessage-deflate) —
после распаковки, без предела: сообщение в сотни мегабайт или сжатая «бомба» от сервера раздувают память движка.
Чаты, котировки и уведомления шлют килобайты, на них это не сказывается.
Поток правила sse живёт на внутренних портах движка (127.0.0.1, случайные, пускают только запрос с одноразовым ключом, который ставит сам прокси); правило видят подключения, открытые после него, — приложение нужно переподключить. Открытых потоков правил не больше 50 (дальше ответ 503), события приложение получает сразу, а повторное подключение (Last-Event-ID) начинается с первых событий правила заново. Раз в 4 минуты прокси пишет в такой поток комментарий : keepalive, иначе mitmproxy рвёт соединение без данных через 10 минут. Событие, записанное в истории, принято прокси: прочитало ли его приложение, по истории не видно.
Правило cut обрывает так же, как оборвался бы сервер: на HTTP/1.1 соединение закрывается без конца тела, на HTTP/2
сбрасывается только поток этого ответа. Приложение видит обрыв сети посреди загрузки — так проверяются докачка по
Range, повторы и недокачанные файлы. times считает оборванные ответы: с times: 1 обрывается только первый ответ, дошедший до точки (HEAD и пропущенные ответы правило не тратят), повтор проходит целиком; оборванным может оказаться и побочный или брошенный приложением запрос — какой именно, видно в истории; вместе с
download_kbps в том же правиле обрыв приходит посреди медленной загрузки. На HTTP/2 приложение получает не больше
заданных байт: данные, не влезшие в окно потока, при сбросе пропадают. Байты считаются как их шлёт сервер (сжатые,
если он сжимает). Не обрываются ответы правил respond и sse, ответы без тела, ответы не длиннее точки обрыва, ответ без длины клиенту HTTP/1.0, ответ под
правкой тела (он уходит целиком), SSE, ответ при after_percent без Content-Length и ответ, до точки которого правило
уже исчерпали, выключили или удалили, ответ, оборванный раньше клиентом или сервером, и ответ, который раньше
рвёт другое правило cut, — причина видна у запроса в истории, а у оборванного там видно, на каком байте.
Обрыв встроен в обработку ответов mitmproxy: при его обновлении сквозные тесты проверяют, что он работает.
Правило events рвёт соединение приложения целиком: на HTTP/2 вместе с потоком обрываются соседние запросы того же
соединения. Хосту из условия host такого правила прокси даёт новым соединениям только HTTP/1.1, где поток идёт
отдельным соединением (кроме клиента, который умеет только HTTP/2); правило на исходящие сообщения хост не переводит:
WebSocket через прокси и так идёт по HTTP/1.1. Ответ сервера со строкой HTTP/1.0 идёт клиенту
«до закрытия», и обрыв для приложения выглядит обычным концом ответа. Сжатый поток SSE (Content-Encoding) правило не меняет: нужен ещё rewrite, который просит
сервер не сжимать. Событие SSE больше 1 МБ правило пропускает вместе с остатком потока без правки.
Правила подмены держат тело в памяти не больше 64 МБ. Ответ длиннее идёт без правки: при известной длине в историю
пишется его начало, как обычно, а у ответа без длины (chunked) тело и размер в историю не попадают.
Загрузку длиннее 64 МБ respond не перехватывает: при известной длине обрывает сразу, а загрузка без длины (chunked)
доходит до сервера целиком, и только потом клиент получает обрыв. Задержка отсчитывается после тела запроса: под
rewrite и delay загрузка без длины или больше предела записи в историю уходит на сервер сразу, а задержка держит
ответ; respond загрузку до 64 МБ на сервер не отправляет. drop с задержкой у
загрузки больше 64 МБ или без длины обрывает сразу, без задержки.
Ограничение скорости встроено в обработку соединений mitmproxy: при его обновлении сквозные тесты проверяют, что оно
работает. Загрузку меньше сетевых буферов (сотни килобайт) клиент отдаёт сразу и потом ждёт ответа — замедление видно
на файлах от мегабайта; у телефона, подключённого через device_proxy (adb), буфер больше 10 МБ, и прогресс загрузки
с него не проверить. Длительность запроса в истории не включает замедленную доставку ответа клиенту. Таймаут
чтения приложения ловит паузу без данных, а не медленную отдачу: по HTTPS данные приходят записями TLS по 16 КБ, и
таймаут срабатывает, только если такая запись идёт дольше него; по HTTP паузы короткие.
История хранит последние 5000 запросов (max_flows), а по объёму вместе с адресами и заголовками — около 512 МБ (файл доходит до ~600 МБ); старые
записи удаляются. Файл flows.db после очистки не уменьшается: освободившееся место занимают новые записи.
check_connection делает вывод по косвенным признакам: прокси не знает, какое приложение проверяется. Отказы TLS
системных сервисов (Google Play и подобные никогда не принимают пользовательский сертификат) видны рядом с трафиком
приложения, а пока через прокси идут только они — вердикт «сертификат отвергнут»; подсказки поэтому с условиями
(«если среди хостов есть хосты приложения…»). Окно проверки по умолчанию — 5 минут: после починки старые отказы
других хостов ещё видны, хост, который расшифровался после своего отказа, из отказов уходит сам.
Раз в сутки программа сама проверяет, вышла ли новая версия на GitHub, и показывает уведомление «Вышла версия X»; щелчок открывает окно обновления. Выключается галкой в «Настройках…».
Анонимная статистика использования помогает автору понять, сколько людей пользуется программой и какие инструменты нужны
Claude. Раз в час, пока программа запущена, на aokazantsev.ru (сервер в России) уходят счётчики за текущие и
неотправленные прошлые сутки (до недели): случайный номер установки, версия программы и Windows, сколько раз
программа запускалась и сама находила новую версию, сколько раз нажимались пункты меню, значок в трее, настройки и
обновление, сколько раз Claude вызывал каждый инструмент MCP (имя инструмента и число; вызовы через HTTP API не считаются), и
текущее состояние: работает ли движок, проверяются ли сертификаты серверов, включено ли выключение на время Charles,
подключён ли Claude Code, включены ли автозапуск, проверка обновлений и отчёты о сбоях, сколько правил подмены и сколько из них включено. Запросы, ответы,
адреса, хосты, заголовки, тела, содержимое правил, имена пользователя и компьютера и пути в статистику не попадают;
IP-адрес сервер не хранит. Галка в установщике включена по умолчанию, выключить — там же или в «Настройках…»; тихая
установка — ключ --option:usageStatistics=0. Выбор хранится в %LOCALAPPDATA%\AgentProxy\usage-statistics.txt
(on — статистика отправляется, off или нет файла — нет); установщик без ключа и галка в его окне берут прежний
выбор, а если файла нет — включают. Выключение удаляет накопленные счётчики. Включённую статистику программа
один раз показывает уведомлением в трее (что уходит — коротко и ссылкой на этот раздел), когда движок запустился или
сообщил о проблеме, — последним, вслед за уведомлением о проблеме; щелчок открывает «Настройки…»
с галкой выключения: так о ней узнаёт и тот, кто не видел окна
установщика (тихая установка, «Установить сейчас» в окне обновления). Метка «уведомление показано» —
usage-notice.txt рядом с выбором статистики.
| Файл | Что |
|---|---|
%LOCALAPPDATA%\Programs\AgentProxy | программа, встроенный Python и движок |
%LOCALAPPDATA%\AgentProxy\settings.json | порты (proxy_port, api_port), verify_upstream, yield_to_charles (выключать прокси, пока запущен Charles), max_flows, max_body_bytes, adb_path (путь к adb.exe через /, если его нет в PATH и в Android SDK; движок читает файл при запуске — после правки «Перезапустить движок») |
%LOCALAPPDATA%\AgentProxy\log.txt | журнал программы в трее: запуск движка, коды выхода, перезапуски, обновления |
%LOCALAPPDATA%\AgentProxy\engine.log | журнал движка: итог правил по каждому запросу (хост без пути и параметров, номер записи истории), изменения и отказы правил, отказы закрепления хостов в мониторе (без имени хоста), запросы с ошибкой, ошибки аддонов, отказы TLS, пауза на время Charles и число снятых и возвращённых устройств, старт и стоп; одинаковые строки прореживаются |
%LOCALAPPDATA%\AgentProxy\cli.log | журнал командной строки и хука старта сессии |
%LOCALAPPDATA%\AgentProxy\flows.db | история запросов (SQLite, последние 5000) |
%LOCALAPPDATA%\AgentProxy\rules.json | правила подмены (при работающем движке руками не править) |
%LOCALAPPDATA%\AgentProxy\monitor.json | хосты, закреплённые в мониторе; «Сбросить настройки» в установщике их снимает |
%LOCALAPPDATA%\AgentProxy\device-ports.json | порт ПК каждого устройства по его serial |
%LOCALAPPDATA%\AgentProxy\certs | корневой сертификат прокси |
%LOCALAPPDATA%\AgentProxy\usage-*.txt, update-check*.txt | выбор статистики (usage-statistics.txt), неотправленные счётчики за последние дни (до недели), номер установки, отметка «уведомление о статистике показано», время последней проверки обновления и отметка «проверка выключена» |
Удаление — «Приложения» Windows или Uninstall.exe --silent из папки программы: снимает интеграцию с Claude Code,
автозапуск и удаляет данные вместе с сертификатом.
Нужны Python 3.12+ (py) для сборки и .NET Framework 4.8 (есть в Windows).
| Задача | Команда |
|---|---|
| Встроенный Python и зависимости | py tools\runtime.py fetch |
| Обновить зафиксированные версии | py tools\runtime.py lock |
Пересобрать значок src\app.ico | py tools\make_icon.py (нужен Pillow: py -m pip install pillow) |
| Все тесты (движок и C#) | test.cmd |
| Только тесты движка | py tools\test.py |
| Программа без запуска | build.cmd nostart |
| Установщик | build-installer.cmd → dist\AgentProxySetup.exe |
Зависимости движка зафиксированы с хешами (engine\requirements.lock), встроенный Python — по хешу
(engine\python-embed.sha256). Устройство и правила работы — CLAUDE.md.
MIT. mitmproxy — MIT, Python — PSF License.
проверка подключения одним вызовом: слушает ли прокси, прокси устройства и adb reverse, идёт ли трафик и с какого времени, отказы TLS (сертификат не стоит, пиннинг, старая версия TLS), недоступные с ПК хосты и отказы проверки сертификата сервера за последние минуты, вердикт и что делать дальше |
read_log | журналы самого AgentProxy (движок и трей): что применилось из правил и почему, отказы, ошибки, обрывы, перезапуски; фильтры по уровню, тексту и времени |