Traffic Inspector (Русский)
§1 Обзор
Заголовок раздела «§1 Обзор»Уникальные особенности Traffic Inspector
Заголовок раздела «Уникальные особенности Traffic Inspector»| Возможность | mitmweb | Charles | Fiddler | OmniRoute Traffic Inspector |
|---|---|---|---|---|
| Веб-интерфейс | ✓ | ✗ | ✗ | ✓ |
| Открытый исходный код | ✓ | ✗ | частично | ✓ |
| Учитывает агентов (определяет, поступил ли запрос от Antigravity/Copilot/и т. д.) | ✗ | ✗ | ✗ | ✓ |
| Учитывает LLM (распознаёт формат OpenAI/Anthropic/Gemini, токены и модель) | ✗ | ✗ | ✗ | ✓ |
| Отображение сопоставления моделей (gemini-3-flash → claude-sonnet-4.7) | ✗ | ✗ | ✗ | ✓ |
| Раздельное отображение задержки прокси и вышестоящего сервера | частично | ✗ | ✗ | ✓ |
| Интеграция с OmniRoute: маршрутизация, резервные варианты и стоимость | ✗ | ✗ | ✗ | ✓ |
| Общесистемная отладка прокси (любое приложение на компьютере) | ✓ | ✓ | ✓ | ✓ |
| Захват по пользовательским хостам (перенаправление DNS для отдельных хостов) | ✓ | ✓ | ✓ | ✓ |
| Режим переменной окружения HTTP_PROXY | ✓ | ✓ | ✓ | ✓ |
| Представление диалога (многоходовые реплики, tool_use/tool_result) | ✗ | ✗ | ✗ | ✓ |
| Объединение потока SSE (восстановление из событий с изменениями) | ✗ | ✗ | ✗ | ✓ |
| Запись сеансов (именованные сеансы с экспортом в .har/.jsonl) | ✗ | ✓ | ✓ | ✓ |
Архитектура в одном абзаце
Заголовок раздела «Архитектура в одном абзаце»TrafficBuffer (src/mitm/inspector/buffer.ts) — это общий кольцевой буфер в памяти (по умолчанию 1000 записей, размер настраивается через INSPECTOR_BUFFER_SIZE). Все источники захвата записывают в него данные через push(). Буфер классифицирует каждую запись с помощью kindDetector.ts (определяет, является ли она запросом к LLM), вычисляет contextKey (SHA-256-отпечаток системного промпта) и рассылает данные всем подписчикам WebSocket через globalTrafficBuffer.subscribe(). Панель управления подключается через GET /api/tools/traffic-inspector/ws, при подключении получает снимок состояния, а затем — события new/update/clear.
§2 Режимы захвата
Заголовок раздела «§2 Режимы захвата»Traffic Inspector поддерживает 5 одновременных источников захвата. Каждый из них можно включать и отключать независимо. Поле source в каждом InterceptedRequest (src/mitm/inspector/types.ts) содержит одно из следующих значений: "agent-bridge", "custom-host", "http-proxy", "system-proxy" или "tproxy".
Режим 1 — AgentBridge (по умолчанию, всегда включён)
Заголовок раздела «Режим 1 — AgentBridge (по умолчанию, всегда включён)»Источник: обработчики AgentBridge (src/mitm/handlers/base.ts)
Механизм: каждый вызов intercept() в MitmHandlerBase вызывает hookBufferStart() перед перенаправлением и hookBufferUpdate() после завершения. Дополнительная настройка не требуется — режим работает сразу после запуска AgentBridge.
Охват: 9 IDE-агентов, настроенных в AgentBridge
Примечание: поле source в InterceptedRequest = "agent-bridge"
Режим 2 — Пользовательские хосты (перенаправление DNS)
Заголовок раздела «Режим 2 — Пользовательские хосты (перенаправление DNS)»Источник: заданный пользователем список хостов (таблица inspector_custom_hosts)
Механизм: добавление хоста через пользовательский интерфейс добавляет 127.0.0.1 <host> в /etc/hosts (требуется sudo). Существующий MITM-сервер AgentBridge (порт 443) динамически генерирует SNI-сертификат для нового хоста.
Охват: любое приложение, использующее добавленный хост; изменять конфигурацию приложения не требуется
Примечание: source = "custom-host"
Примеры использования:
- Мониторинг
api.openai.comиз скриптов Python - Отладка
my-internal-llm.company.com - Захват трафика с мобильных устройств в той же сети (посредством ARP-спуфинга — для опытных пользователей)
Режим 3 — слушатель HTTP_PROXY (порт 8080)
Заголовок раздела «Режим 3 — слушатель HTTP_PROXY (порт 8080)»Источник: приложения, использующие переменные окружения HTTP_PROXY/HTTPS_PROXY
Механизм: дополнительный слушатель на порту 8080 (src/mitm/inspector/httpProxyServer.ts), работающий как стандартный явный HTTP/HTTPS-прокси. Принимает туннели CONNECT (HTTPS) и прямые HTTP-запросы.
Охват: любое приложение, учитывающее переменную окружения HTTP_PROXY; изменение DNS и sudo не требуются
Примечание: source = "http-proxy"
# Быстрый захват для одной команды:HTTPS_PROXY=http://127.0.0.1:8080 curl https://api.openai.com/v1/models
# Постоянный захват в рамках сеанса оболочки:export HTTP_PROXY=http://127.0.0.1:8080export HTTPS_PROXY=http://127.0.0.1:8080Ограничение TLS: для HTTPS-туннелей CONNECT по умолчанию захватываются только метаданные (хост, порт, временные характеристики) — тело TLS не расшифровывается. Для полного анализа тела включите переключатель «Расшифровывать HTTPS в режиме прокси» (необходимо явное включение и доверие к сертификату AgentBridge).
Конфликт портов: если порт 8080 занят, AgentBridge возвращает код 409 со структурированной ошибкой. Измените порт с помощью переменной окружения INSPECTOR_HTTP_PROXY_PORT.
Режим 4 — общесистемный прокси (для опытных пользователей, с явным включением)
Заголовок раздела «Режим 4 — общесистемный прокси (для опытных пользователей, с явным включением)»Источник: настройки прокси на уровне ОС (применяются ко всем приложениям на компьютере)
Механизм: использует API операционной системы для перенаправления всего HTTP/HTTPS-трафика через слушатель HTTP_PROXY:
- macOS:
networksetup -setwebproxy / -setsecurewebproxy - Linux:
gsettings set org.gnome.system.proxy+/etc/environment - Windows:
netsh winhttp set proxy 127.0.0.1:8080Охват: каждое приложение на компьютере, учитывающее системные настройки прокси
Примечание:source="system-proxy"
Механизмы безопасности:
- Таймер автоматического отключения (по умолчанию 30 минут, настраивается через
INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES) - Предыдущее состояние системного прокси сохраняется в БД и восстанавливается при откате
- Если пользователь покидает страницу при активном режиме, на панели управления отображается запрос «Восстановление системного прокси»
- В пользовательском интерфейсе отображается значок
⚠ Для опытных пользователейи флажок явного подтверждения
Режим 5 — прозрачная расшифровка TPROXY (Linux, root, с явным включением)
Заголовок раздела «Режим 5 — прозрачная расшифровка TPROXY (Linux, root, с явным включением)»Источник: TPROXY ядра + маршрутизация на основе политик (src/mitm/tproxy/)
Механизм: новые локальные исходящие TCP-соединения к целевому порту (по умолчанию 443) помечаются в mangle OUTPUT, правило ip rule перенаправляет отмеченные пакеты на локальную доставку, а цель TPROXY в mangle PREROUTING передаёт их прозрачному слушателю (IP_TRANSPARENT) на порту по умолчанию 8443. Слушатель завершает TLS-соединение с помощью конечного сертификата, который динамический центр сертификации выдаёт по запросу для каждого имени хоста SNI, захватывает расшифрованный обмен и перенаправляет запрос к исходному назначению с повторным шифрованием.
Охват: произвольные хосты назначения на целевом порту — без подмены /etc/hosts, переменной окружения HTTP_PROXY и изменения общесистемного прокси. Перехватываемому процессу не требуется изменение конфигурации, но он должен доверять динамическому центру сертификации.
Примечание: source = "tproxy"
Требования: только Linux (IP_TRANSPARENT доступен исключительно в Linux), возможность CAP_NET_ADMIN (root) и нативное дополнение N-API, которое необходимо собрать с помощью набора инструментов C (npm run build:native:tproxy). Если эти компоненты недоступны, переключатель на панели управления отключается и отображает подсказку «Для расшифровки TPROXY требуются Linux, root и нативное дополнение». Правила брандмауэра применяются и отменяются транзакционно (сбой никогда не оставляет правило mangle) и очищаются при перезагрузке. Механизм предотвращения циклов на основе SO_MARK не позволяет повторно перехватывать собственный пересылаемый трафик прокси с повторным шифрованием.
Это крупная подсистема с отдельным руководством для операторов — полный набор правил брандмауэра, динамический центр сертификации для каждого SNI и установщик хранилища доверия, локальный маршрут, сведения о предотвращении циклов и схему конфигурации см. в docs/security/MITM-TPROXY-DECRYPT.md (git; не компилируется в /docs). Переключатель управляется через GET / POST / DELETE /api/tools/agent-bridge/tproxy (обратите внимание: маршрут находится под префиксом AgentBridge, а не Traffic Inspector).
Сравнение режимов захвата
Заголовок раздела «Сравнение режимов захвата»| Режим | Настройка | Sudo? | Охват | Примечания |
|---|---|---|---|---|
| 1. AgentBridge | Автоматическая | Один раз (сертификат+hosts) | 9 IDE-агентов | Включено по умолчанию |
| 2. Пользовательские хосты | Ввод для каждого хоста | Да (файл hosts) | Любое приложение, использующее этот хост | Сохраняется в БД |
| 3. HTTP_PROXY | export HTTPS_PROXY=... |
Нет | Приложения, учитывающие переменные окружения | Порт 8080, по умолчанию без расшифровки TLS |
| 4. Системный | Переключатель + подтверждение | Да | Все приложения на компьютере | Автоматическое отключение через 30 мин |
| 5. Расшифровка TPROXY | Переключатель (Linux + нативное дополнение) | Да (root + установка CA) | Любой хост на целевом порту | Расшифровывает произвольные хосты; по умолчанию отключено — см. docs/security/MITM-TPROXY-DECRYPT.md (git; не включается в сборку /docs) |
§3 Интерфейс
Заголовок раздела «§3 Интерфейс»3.1 Компоновка
Заголовок раздела «3.1 Компоновка»┌─ Инспектор трафика ────────────────────────────────────────────────────┐│ ┌─ Панель источников захвата ──────────────────────────────────────┐ ││ │ [✓ AgentBridge] [✓ Пользовательские хосты (3)] [○ HTTP_PROXY] │ ││ │ [○ Системный] │ ││ └─────────────────────────────────────────────────────────────────────┘ ││ ┌─ Панель фильтров/управления ────────────────────────────────────┐ ││ │ Профиль: (●) Только LLM (○) Пользовательский (○) Все │ ││ │ [⎉ Пауза] [🗑 Очистить] [⬇ .har] [● ЗАПИСЬ сеанса] ● в эфире 482/1k│ ││ └─────────────────────────────────────────────────────────────────────┘ │├══◀▶══════════════════════════════╬══════════════════════════════════════╤╡│ СПИСОК ЗАПРОСОВ (изменяемый) ║ ПАНЕЛЬ СВЕДЕНИЙ ▲ ││ ────────────────────────────── │ ║ [Диалог][Заголовки][Запрос] │ ││ ▎ 14:32 POST 200 12k AG openai ║ [Ответ][Время][LLM][Статистика] │ ││ ▎ 14:31 POST 200 8k CP openai ║ ▼ ││ ▎ 14:31 POST 503 ⚠ KR ... ║ ││ ▎ 14:30 GET 200 3k 🌐 свой ║ │└══════════════════════════════════╝══════════════════════════════════════╝3.2 Список запросов (левая панель)
Заголовок раздела «3.2 Список запросов (левая панель)»- Виртуализированный (
useVirtualList+ResizeObserver): обрабатывает 1000 элементов без зависаний - Автопрокрутка с переключателем для приостановки во время просмотра
- Цветовая кодировка статуса: зелёный (2xx), жёлтый (3xx), красный (4xx/5xx), серый (выполняется)
- Эмодзи агента: 🔵 Antigravity, 🟢 Copilot, 🟠 Kiro, 🟣 Codex, 🔷 Cursor, 🟤 Zed, 🟡 Claude Code, ⚫ Open Code, 🌐 пользовательский хост
- Цветная полоса контекста: левая граница шириной 1px, окрашенная на основе
contextKey(SHA-256 системного промпта), — визуально группирует связанные диалоги - Ленивая загрузка тела: только тело выбранного запроса материализуется на вкладках панели сведений (это позволяет избежать рендеринга 1000 тел размером по 1 МБ)
3.3 Панель сведений — 7 вкладок
Заголовок раздела «3.3 Панель сведений — 7 вкладок»| Вкладка | Содержимое | Примечания |
|---|---|---|
| Диалог | Реплики многоходового диалога (system/user/assistant + tool_use/tool_result) | Нормализуются из формата любого провайдера; отображается только при detectedKind === "llm" |
| Заголовки | Таблицы заголовков запроса и ответа | Конфиденциальные заголовки (Authorization, Cookie, api-key) по умолчанию маскируются; переключатель «Показать секреты» |
| Запрос | Исходное тело, древовидное представление JSON, значок поля модели | Форматированный JSON или исходный текст |
| Ответ | Исходное тело или список событий SSE; переключатель «Исходный ↔ Объединённый» | Средство объединения SSE восстанавливает итоговое сообщение из событий с приращениями |
| Время | Временная диаграмма: накладные расходы прокси и задержка вышестоящего сервера | Общее время, TTFB и размер |
| Сведения LLM | Провайдер, модель, число сообщений, входные/выходные токены, оценка стоимости, сопоставленная цель | Отображается только для запросов LLM |
| Статистика | Recharts: временная шкала задержки, столбчатая диаграмма токенов, диаграмма рассеяния вызовов инструментов | Отображается только при загрузке записанного сеанса |
3.4 Элементы управления панели инструментов
Заголовок раздела «3.4 Элементы управления панели инструментов»| Элемент управления | Действие |
|---|---|
| ⎉ Пауза | Останавливает отображение новых запросов; на значке накапливается «X новых» |
| 🗑 Очистить | Очищает список в интерфейсе (буфер сервера не затрагивается) |
| ⬇ Экспорт .har | Скачивает текущий отфильтрованный список в виде файла HAR |
| ● Записать сеанс | Запускает именованный сеанс записи |
| Выбор профиля | Только LLM / Пользовательские хосты / Все |
| Фильтр хостов | Поиск подстроки в поле host |
| Фильтр агентов | Выпадающий список: Все / по отдельным агентам |
| Фильтр статуса | Все / 2xx / 3xx / 4xx / 5xx / ошибка |
| Фильтр источника | Все / agent-bridge / custom-host / http-proxy / system-proxy / tproxy |
| Фильтр в эфире | Показывать только выполняющиеся (открытые) запросы — переключатель liveOnly (см. §4.6) |
3.5 Панели с изменяемым размером
Заголовок раздела «3.5 Панели с изменяемым размером»- Список и панель сведений разделены перетаскиваемым разделителем
- Ширина списка: минимум 280px, максимум 720px, сохраняется в
localStorage(inspector.listWidth) - Можно свернуть до панели шириной 48px (только значки); щелчок по строке на свёрнутой панели разворачивает её
§4 Функции с поддержкой LLM
Заголовок раздела «§4 Функции с поддержкой LLM»4.1 Определитель типа (src/mitm/inspector/kindDetector.ts)
Заголовок раздела «4.1 Определитель типа (src/mitm/inspector/kindDetector.ts)»Классифицирует каждый запрос как "llm", "app" или "unknown" с использованием 4 сигналов:
- Реестр хостов — около 18 известных имён хостов API LLM (OpenAI, Anthropic, Gemini, Groq, Mistral, Together, Fireworks, Cohere, Perplexity, Hugging Face, OpenRouter, xAI, Moonshot и т. д.)
- Шаблоны путей —
/v1/chat/completions,/v1/messages,/generateContent,/v1/responsesи т. д. - Структура тела — обнаруживает поля
messages[](OpenAI/Claude),contents[](Gemini),prompt,input - Подсказки в user-agent —
codex,claude,gemini,antigravity,kiro,copilot,cursorв строке UA
Пользовательские хосты, добавленные через режим 2, наследуют свой kind из данных формы (по умолчанию — "custom").
4.2 Объединитель SSE (src/mitm/inspector/sseMerger.ts)
Заголовок раздела «4.2 Объединитель SSE (src/mitm/inspector/sseMerger.ts)»Независимая реализация с нуля. Разбор событий соответствует алгоритму server-sent events WHATWG, а реконструкция — общедоступным потоковым схемам OpenAI, Anthropic и Gemini.
Реконструирует итоговое сообщение ассистента из необработанных дельта-событий SSE:
- Anthropic: накапливает
content_block_deltaпо индексу; обрабатываетtext_delta,input_json_delta(вызовы инструментов),thinking_delta - OpenAI: накапливает варианты Chat Completions/вызовы инструментов и выходные элементы Responses API по индексу
- Gemini: накапливает
candidates[i].content.parts - Неизвестный формат: возвращает необработанные события без изменений
На вкладке Response отображается переключатель: «Необработанные события ↔ Объединённый результат».
4.3 Нормализатор диалогов (src/mitm/inspector/conversationNormalizer.ts)
Заголовок раздела «4.3 Нормализатор диалогов (src/mitm/inspector/conversationNormalizer.ts)»Независимая реализация с нуля. Нормализация определяется локальными контрактами чёрного ящика и общедоступными схемами сообщений OpenAI, Anthropic и Gemini; исходный код сторонних реализаций не используется.
Преобразует форматы сообщений OpenAI, Anthropic и Gemini в единый NormalizedConversation перед отображением:
interface NormalizedConversation { request: NormalizedTurn[]; // сообщения / содержимое / запрос из тела запроса response: NormalizedTurn[]; // ответ ассистента (объединённый через sseMerger) contextKey: string | null; // отпечаток системного промпта SHA-256}Типы блоков: text, tool_use, tool_result. Вкладка Conversation использует эту структуру независимо от провайдера.
4.4 Цветовая маркировка ключа контекста (src/mitm/inspector/contextKey.ts)
Заголовок раздела «4.4 Цветовая маркировка ключа контекста (src/mitm/inspector/contextKey.ts)»- Вычисляет
SHA-256системного промпта (первого сообщенияrole:system, поляsystemилиsystemInstructionGemini) - Возвращает 12-символьный шестнадцатеричный префикс (
"a3f9c2...") - Фронтенд сопоставляет ключу детерминированный цвет HSL для полосы у левой границы
- Фильтр «тот же контекст»: щелчок по метке
ctx #a3fдобавляет фильтр, отображающий только запросы с тем же отпечатком
Это позволяет легко визуально различать разные «персоны» или задачи, выполняемые в одном сеансе агента.
4.5 Извлечение метаданных LLM
Заголовок раздела «4.5 Извлечение метаданных LLM»Для запросов LLM вкладка LLM Details извлекает:
interface LlmMetadata { provider: string | null; // "openai" | "anthropic" | "gemini" | ... apiKind: string | null; // "chat.completions" | "messages" | "embeddings" | ... model: string | null; // из тела запроса или ответа messages: number; // количество реплик tokensIn: number | null; // usage.prompt_tokens / usage.input_tokens tokensOut: number | null; // usage.completion_tokens / usage.output_tokens streamed: boolean; // true, если ответ передаётся через SSE mappedTo: string | null; // заголовок x-omniroute-mapped costEstimateUsd: number | null; // оценочная стоимость на основе тарифов OmniRoute}4.6 Фильтр активных запросов в реальном времени
Заголовок раздела «4.6 Фильтр активных запросов в реальном времени»Поле status запроса имеет тип number | "in-flight" | "error" — запись
добавляется со значением "in-flight" сразу после начала запроса и обновляется на месте
при получении ответа (или ошибки). Переключатель «Live» на панели инструментов
(liveOnly, ключ i18n trafficInspector.liveOnly) ограничивает список записями,
у которых status === "in-flight", позволяя отслеживать открытые соединения в реальном времени.
Фильтр представляет собой чистый предикат на стороне клиента в
src/lib/inspector/matchesTrafficFilter.ts:
if (f.liveOnly && req.status !== "in-flight") return false;Состояние переключателя хранится в useTrafficFilters (хуках панели инспектора) и
комбинируется с другими фильтрами (профиль, хост, агент, источник, статус, контекст).
4.7 Определение процесса-источника (Linux)
Заголовок раздела «4.7 Определение процесса-источника (Linux)»В Linux каждый перехваченный запрос можно связать с локальным процессом-источником.
В InterceptedRequest добавляются два необязательных поля:
pid?: number; // идентификатор процесса-источника (только Linux)processName?: string; // имя процесса-источника (только Linux)src/mitm/inspector/processAttribution.ts сопоставляет временный порт клиента
соединения с PID и именем следующим образом:
- Читает
/proc/net/tcpи/proc/net/tcp6, чтобы найти inode сокета для порта (parseProcNetTcpForInode— чистый парсер, тестируемый с помощью фикстур). - Сканирует
/proc/<pid>/fd/в поисках символической ссылки наsocket:[<inode>]. - Читает имя процесса из
/proc/<pid>/comm.
Кэш с TTL в 1 секунду ограничивает затраты на сканирование procfs под нагрузкой. Определение выполняется
по возможности — любая ошибка приводит к возврату null и никогда не блокирует перехват. В
macOS/Windows функция возвращает null (заглушка; поддержка lsof/GetExtendedTcpTable
будет добавлена позднее).
§5 Сеансы
Заголовок раздела «§5 Сеансы»5.1 Запись сеанса
Заголовок раздела «5.1 Запись сеанса»- Нажмите “● Записать сеанс” на панели инструментов → введите имя (необязательно)
- Поток в реальном времени продолжает отображаться как обычно; красный пульсирующий индикатор показывает
◉ ЗАПИСЬ · <имя> · 00:42 · 23 запроса - Нажмите “⏹ Остановить” → снимок сеанса будет сохранён в
inspector_sessions+inspector_session_requests
5.2 Просмотр записанного сеанса
Заголовок раздела «5.2 Просмотр записанного сеанса»Выпадающий список Сеансы на панели инструментов содержит сохранённые сеансы. При выборе одного из них:
- Загружается снимок сеанса (зафиксированное состояние)
- Отображается баннер:
Просмотр записанного сеанса "<имя>" — [Вернуться к данным в реальном времени] - Становится доступна вкладка «Статистика» с агрегированными данными Recharts
5.3 Форматы экспорта
Заголовок раздела «5.3 Форматы экспорта»Каждый сеанс можно экспортировать в следующих форматах:
| Формат | Применение |
|---|---|
| HAR (HTTP Archive 1.2) | Совместим с Chrome DevTools, Charles, Fiddler — импортируется для автономного анализа |
| JSONL | Один InterceptedRequest на строку — совместим с форматом llm-interceptor |
Экспорт выполняется через GET /api/tools/traffic-inspector/sessions/{id}/export.har или с помощью кнопки ⬇ в выпадающем списке «Сеансы».
§6 Безопасность
Заголовок раздела «§6 Безопасность»Traffic Inspector показывает весь перехваченный HTTPS-трафик, включая заголовки авторизации и тела запросов. Реализованы следующие меры защиты:
| Мера | Подробности |
|---|---|
| LOCAL_ONLY | Все маршруты и конечная точка WebSocket доступны только через loopback-интерфейс (ограничение применяется в routeGuard.ts до аутентификации) |
| Маскирование секретов | Линейный сканер maskSecret() скрывает учётные данные Bearer по RFC 6750, ключи с префиксами провайдеров и длинные непрозрачные токены до вызова TrafficBuffer.push() |
| Ограничение размера тела | Тела размером более INSPECTOR_MAX_BODY_KB (по умолчанию 1024 КБ) усекаются с уведомлением "(усечено для повышения производительности)" |
| Очистка заголовков | Имена переводятся в нижний регистр; заголовки фрейминга, hop-by-hop и прокси-аутентификации удаляются; файлы cookie полностью скрываются; значения учётных данных передаются в maskSecret() |
| CSP | На страницах Traffic Inspector применяется строгая политика безопасности содержимого для предотвращения XSS через внедрённые тела ответов |
| По умолчанию данные не сохраняются | TrafficBuffer хранится в памяти и очищается при перезапуске сервера. Сеансы сохраняются только при явном запуске записи |
Применяемые строгие правила
Заголовок раздела «Применяемые строгие правила»| Правило | Применение |
|---|---|
#12 sanitizeErrorMessage |
Все HTTP-ответы с ошибками от маршрутов Traffic Inspector проходят очистку |
#15 + #17 isLocalOnlyPath() |
/api/tools/traffic-inspector/ — LOCAL_ONLY + SPAWN_CAPABLE (команды системного прокси) |
Известные ограничения
Заголовок раздела «Известные ограничения»- Режим общесистемного прокси влияет на все приложения на компьютере, включая VPN-клиенты и SSO. Всегда используйте его с таймером автоматического отключения. Не используйте на компьютерах с общим доступом.
- HTTPS через туннель CONNECT: режим 3 (HTTP_PROXY) перехватывает только метаданные туннеля для HTTPS-адресов, если не включён перехват TLS. Это предусмотренное поведение: прозрачный перехват без доверия приложений к сертификату AgentBridge нарушил бы проверку TLS в этих приложениях.
- Жёстко заданные строки в некоторых компонентах: некоторые компоненты пользовательского интерфейса (F7/F8) содержат небольшое количество жёстко заданных строк, которые ещё не охвачены ключами i18n. Они описаны как известное ограничение в отчёте о пробелах i18n и будут перенесены в ходе последующей доработки. Затронутые строки представляют собой декоративные метки интерфейса, перевод которых не требуется для функционального использования.
§7 Устранение неполадок
Заголовок раздела «§7 Устранение неполадок»Отключение WebSocket
Заголовок раздела «Отключение WebSocket»Если в потоке в реальном времени отображается «Отключено»:
- Убедитесь, что сервер всё ещё работает:
GET /api/tools/traffic-inspector/capture-modes - Перезагрузите страницу — WebSocket повторно подключится и получит новый снимок состояния
- Если сервер был перезапущен, буфер в памяти был очищен — старые записи утрачены, если они не были сохранены в сеансе
Конфликт порта 8080
Заголовок раздела «Конфликт порта 8080»Если режим HTTP_PROXY не запускается:
lsof -i :8080 # найти процессИзмените порт:
INSPECTOR_HTTP_PROXY_PORT=8888Системный прокси не был отключён
Заголовок раздела «Системный прокси не был отключён»Если OmniRoute аварийно завершает работу при активном режиме общесистемного прокси:
macOS:
networksetup -setwebproxystate Wi-Fi offnetworksetup -setsecurewebproxystate Wi-Fi offLinux (GNOME):
gsettings set org.gnome.system.proxy mode 'none'Windows:
netsh winhttp reset proxyПри следующей загрузке панель управления также предложит действие «Отключить системный прокси», если обнаружит, что состояние в БД указывает на активный прокси.
Буфер заполнен
Заголовок раздела «Буфер заполнен»Когда количество записей в буфере достигает INSPECTOR_BUFFER_SIZE (по умолчанию 1000), новые записи вытесняют самые старые. Если важные запросы теряются:
- Увеличьте
INSPECTOR_BUFFER_SIZE(например, до 5000) — это повысит расход памяти, но позволит дольше хранить записи - Запишите сеанс, чтобы сохранить соответствующий временной интервал в БД
§8 Справочник API
Заголовок раздела «§8 Справочник API»Все маршруты имеют атрибуты LOCAL_ONLY (доступны только через loopback-интерфейс) и SPAWN_CAPABLE (команды системного прокси). См. src/server/authz/routeGuard.ts.
Базовый путь: /api/tools/traffic-inspector/
Управление запросами
Заголовок раздела «Управление запросами»| Метод | Путь | Описание |
|---|---|---|
| GET | /requests |
Список запросов (фильтры: ?profile=llm&host=&agent=&status=&source=&sessionId=) |
| GET | /requests/{id} |
Подробные сведения об отдельном запросе |
| DELETE | /requests |
Очистить буфер в памяти |
| POST | /requests/{id}/replay |
Повторно выполнить тот же запрос через маршрутизатор OmniRoute |
| PUT | /requests/{id}/annotation |
Сохранить или обновить примечание к запросу |
WebSocket
Заголовок раздела «WebSocket»| Метод | Путь | Описание |
|---|---|---|
| GET | /ws |
Поток WebSocket в реальном времени. При подключении отправляет snapshot, затем события new/update/clear |
Экспорт
Заголовок раздела «Экспорт»| Метод | Путь | Описание |
|---|---|---|
| GET | /export.har |
Экспорт текущего отфильтрованного списка в HAR 1.2 |
Пользовательские хосты
Заголовок раздела «Пользовательские хосты»| Метод | Путь | Описание |
|---|---|---|
| GET | /hosts |
Получить список пользовательских хостов |
| POST | /hosts |
Добавить хост (автоматически изменяет /etc/hosts) |
| DELETE | /hosts/{host} |
Удалить хост |
| PATCH | /hosts/{host} |
Переключить enabled |
Режимы перехвата
Заголовок раздела «Режимы перехвата»| Метод | Путь | Описание |
|---|---|---|
| GET | /capture-modes |
Состояние режимов AgentBridge / пользовательских хостов / HTTP_PROXY / системного прокси и переключателя tls-intercept |
| POST | /capture-modes/http-proxy |
Запустить/остановить прослушиватель HTTP_PROXY ({action: "start"|"stop"}) |
| POST | /capture-modes/system-proxy |
Применить/отключить общесистемный прокси ({action: "apply"|"revert"}) |
| POST | /capture-modes/tls-intercept |
Переключить расшифровку тела HTTPS в режиме прокси ({enabled: boolean}) |
Расшифровка TPROXY (режим перехвата 5) управляется отдельным маршрутом с префиксом AgentBridge —
GET / POST / DELETE /api/tools/agent-bridge/tproxy— а не через/api/tools/traffic-inspector/. См.docs/security/MITM-TPROXY-DECRYPT.md(в git; не включается в скомпилированную документацию/docs).
| Метод | Путь | Описание |
|---|---|---|
| POST | /sessions |
Начать запись ({name?: string}) |
| PATCH | /sessions/{id} |
Остановить или переименовать ({action: "stop"|"rename", name?: string}) |
| GET | /sessions |
Получить список всех сохранённых сеансов |
| GET | /sessions/{id} |
Снимок сеанса (все запросы) |
| DELETE | /sessions/{id} |
Удалить сеанс |
| GET | /sessions/{id}/export.har |
Экспортировать сеанс в HAR 1.2 |
Внутренний приём данных (резервный механизм D4)
Заголовок раздела «Внутренний приём данных (резервный механизм D4)»| Метод | Путь | Описание |
|---|---|---|
| POST | /internal/ingest |
Принимает перехваченный запрос из сквозного пути server.cjs; требуется заголовок INSPECTOR_INTERNAL_INGEST_TOKEN |
Полные схемы OpenAPI: docs/openapi.yaml → тег Traffic Inspector.
HagiCode
HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.
Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

- SmartСтруктурированные процессы превращают намерение в исполнимый путь от идеи до готового изменения.
- EfficientМультиагентные процессы параллельно продвигают исследование, реализацию и проверку.
- FunHero Dungeon делает длительную совместную разработку наглядной и увлекательной.