# Куда наше ядро вообще может обратиться.
#
# 🔴 Этот файл существует ради обещания клиенту. Мы говорим «телеметрии нет,
# данные уходят только туда, куда вы сами указали» - и здесь это утверждение
# становится проверяемым: сторож deploy/tools/check-egress.py валит сборку,
# если в коде появился адрес, которого тут нет, ИЛИ если тут есть адрес,
# которого больше нет в коде. Второе не мелочь: список читают как перечень
# того, куда мы ходим.
#
# Адресов, которые вписывает сам владелец (эндпоинт своей модели, вебхук
# своего портала, свой сервер узлов), здесь нет и быть не может: они приходят
# из настроек, а не из кода.
#
# Формат: хост - зачем он нужен.

# ---------- модели ----------
chatgpt.com - Codex: обращение к модели, только если владелец вошёл через codex login
auth.openai.com - Codex: обновление токена той же учётной записи
ai-gateway.vercel.sh - шлюз Vercel, только если владелец задал его ключ
api.anthropic.com - Anthropic (Claude): обращение к модели по ключу владельца с console.anthropic.com
gigachat.devices.sberbank.ru - GigaChat: обращение к модели по ключу владельца
ngw.devices.sberbank.ru:9443 - GigaChat: получение временного токена по ключу владельца

# ---------- учебных имён здесь нет ----------
#
# 🔴 Учебное имя в этом файле - прямая неправда, и сторож валит на нём сборку
# отдельным сообщением. Покупатель читает список как перечень того, куда
# уходят его данные; строка «capy.example - пример» означала бы «мы туда
# ходим», а туда не ходит никто и никогда.
#
# Учебными считаются только имена из RFC 2606: зоны .example, .test, .invalid,
# .localhost и example.com, example.net, example.org с поддоменами. Они не
# делегированы, их нельзя купить и по ним нельзя обратиться. Сторож
# check-egress узнаёт их сам и строки в списке для них не требует.
#
# 🔴 Здесь стояло example.org - как «пример ссылки в разборе утверждений». И
# рядом жила поблажка на *.example.ru, наша договорённость об образце. Она и
# была дырой: example.ru - обыкновенный домен в живой зоне .ru, его покупает
# кто угодно, и хост вида чтоугодно.example.ru уезжал бы в код мимо этого
# перечня молча. Убрано 09.09; учебный образец в дереве теперь
# agent.example.com, а сам example.org сторож считает учебным и в списке
# больше не ждёт.

# ---------- каталог MCP-серверов ----------
#
# 🔴 Это НЕ адреса, куда ходим мы. Это записи каталога (capyagent mcp): что
# бывает и что можно подключить. Ходить туда начнёт та установка, где человек
# ВПИСАЛ такой сервер в конфигурацию сам, - и тогда он знает об этом, потому
# что вписывал. Держим их здесь, потому что сторож честно видит их в коде, а
# скрывать от покупателя то, что он и так прочтёт, незачем.
mcp.context7.com - каталожная запись: документация библиотек по MCP
api.githubcopilot.com - каталожная запись: MCP-сервер GitHub

graph.facebook.com - канал WhatsApp (Cloud API), при заданном WHATSAPP_TOKEN.
#   Отправка ответов деловым аккаунтом. Входящие приходят вебхуком к нам, то
#   есть наружу мы ходим только чтобы ответить. Без токена канал не
#   поднимается и в сеть не ходит вовсе.

platform-api2.max.ru - канал MAX (мессенджер VK), при заданном MAX_BOT_TOKEN.
#   Тот же путь, что у Telegram: длинный опрос за событиями и отправка ответов.
#   Без токена канал не поднимается и в сеть не ходит вовсе.

# ---------- голос ----------
stt.api.cloud.yandex.net - распознавание речи Яндекса, при включённом CAPYAGENT_STT
tts.api.cloud.yandex.net - синтез речи Яндекса, при включённом CAPYAGENT_TTS
operation.api.cloud.yandex.net - опрос готовности длинного распознавания там же,
#   только при включённом CAPYAGENT_STT_LONG. Это тот же SpeechKit: короткое
#   голосовое разбирается сразу, длинное ставится в очередь, и адрес нужен,
#   чтобы спросить «готово ли». Выключено по умолчанию.

# ---------- картинки ----------
api.openai.com - рисование картинок, при включённом CAPYAGENT_IMAGE_GEN и ключе владельца
api-key.fusionbrain.ai - Kandinsky, там же
llm.api.cloud.yandex.net - Яндекс: и рисование ART, и ТЕКСТОВАЯ модель YandexGPT.
#   🔴 Хост один на два разных дела. В списке он стоял только как «ART»,
#   и по описанию выходило, что туда уходят подсказки к картинкам. На деле
#   это же адрес /foundationModels/v1/completion (llm/yandexgpt.go:47,173):
#   если владелец выбрал YandexGPT, туда уходит ПЕРЕПИСКА. Список читают как
#   перечень того, куда мы ходим и зачем, поэтому неточное «зачем» здесь
#   хуже отсутствующей строки.
llm.api.cloud.yandex.net:443 - Яндекс ART: опрос готовности той же задачи

# ---------- каналы ----------
api.telegram.org - канал Telegram, при заданном токене бота владельца
discord.com - канал Discord, при заданном токене бота владельца
#   🔴 Приём событий идёт по вебсокету на адрес, который discord.com выдаёт
#   В РАНТАЙМЕ (обычно gateway.discord.gg, discord/channel.go:112-124).
#   Строкой в списке его быть не может: сторож ищет адреса в исходниках, а
#   этого адреса в исходниках нет. Записан здесь словами, потому что молчание
#   означало бы «мы туда не ходим», а мы ходим.

# ---------- обновление ----------
github.com - названная пара перенаправления для capyagent update, ЕСЛИ владелец сам увёл канал на GitHub через CAPYAGENT_UPDATE_BASE. 🔴 Каналом по умолчанию БОЛЬШЕ НЕ является: 05.09 канал вернулся на capyagent.ru, потому что закрытые выпуски GitHub отдают постороннему 404
objects.githubusercontent.com - склад объектов GitHub, куда github.com уводит перенаправлением за самим файлом
#   🔴 Разрешён ровно этот переход и ровно с github.com: правило «за бинарником
#   на чужой хост не идём» осталось, у него появилась одна названная пара.
#   Смысл правила прежний - подменённый манифест не должен уводить нас за
#   исполняемым файлом куда попало.
capyagent.ru - КАНАЛ ВЫПУСКА: манифест и бинарник берутся отсюда по команде capyagent update при CAPYAGENT_UPDATE=1. Он же в заголовке User-Agent к Discord. 🔴 Решение владельца 05.09: канал вернулся сюда с выпусков GitHub, потому что репозиторий остаётся закрытым, а закрытые выпуски отдают постороннему 404 - неотличимо от «выпуска нет»

# ---------- НЕ адреса обращения ----------
# 🔴 Ниже то, что встречается в текстах для человека. Обращений по этим
# адресам код не делает; они в списке потому, что сторож ищет адреса везде, а
# не только там, где вся строка - адрес. Спрятать телеметрию внутри длинной
# строки иначе было бы можно.
# 🔴 Адреса предустановок поставщиков модели. Ими агент пользуется ТОЛЬКО
# если человек выбрал этого поставщика и вписал ключ: в коде это готовые
# значения для настройки CAPYAGENT_LLM_BASE_URL, а не адрес, к которому мы
# ходим сами. Без ключа туда не уходит ни один запрос.
#
# Внесены поимённо, а не маской: обещание клиенту звучит «наружу уходит только
# названное», и маска сделала бы его невыполнимым - под неё однажды попал бы
# адрес, которого никто не называл.
token-plan-sgp.xiaomimimo.com - предустановка поставщика MiMo (agent.AdresMiMoPoUmolchaniyu).
#   🔴 Стоит здесь по той же причине, что и соседи, но честнее сказать больше:
#   это адрес по УМОЛЧАНИЮ, его подставляет экран знакомства, и у того, кто
#   выбрал MiMo и вписал ключ, вся переписка с моделью идёт сюда. Без ключа
#   туда не уходит ни один запрос; свой адрес задаётся настройкой MIMO_BASE.
api.deepseek.com - предустановка поставщика DeepSeek и пример в подсказке о настройке OpenAI-совместимого эндпоинта
openrouter.ai - предустановка поставщика OpenRouter: адрес подставляется в настройку по кнопке
api.groq.com - предустановка поставщика Groq
api.mistral.ai - предустановка поставщика Mistral
api.together.xyz - предустановка поставщика Together AI
capyagent.ru - пример адреса вебхука в тексте ошибки

# ---------------------------------------------------------------------------
# Ссылки, которые открывает ЧЕЛОВЕК. Ядро сюда не ходит.
#
# 🔴 Раздел отдельный нарочно. Список выше читают как перечень того, куда
# уходят данные, и подмешать в него кабинеты поставщиков значило бы соврать в
# самом важном обещании клиенту. Здесь адреса, которые ядро только ПОКАЗЫВАЕТ
# на экране ключей рядом с полем: «где взять этот ключ». Открывает их человек в
# своём браузере, служба к ним не обращается ни разу - это проверяется тем, что
# ни один из них не встречается в коде рядом с http-клиентом.
console.anthropic.com - кабинет Anthropic: где взять ANTHROPIC_API_KEY
console.yandex.cloud - кабинет Яндекс Облака: где взять ключ и каталог
developers.sber.ru - кабинет Сбера: где взять ключ GigaChat
developers.facebook.com - кабинет Meta: где взять токен WhatsApp Cloud API
platform.openai.com - кабинет OpenAI: где взять OPENAI_API_KEY
fusionbrain.ai - кабинет Kandinsky: где взять ключ рисования
brave.com - кабинет Brave Search: где взять ключ поиска
t.me - чат с @BotFather: где завести бота Telegram
www.npmjs.com - страница пакета MCP-сервера в подробностях записи каталога: ссылку открывает человек, ставит пакет npx у него на машине
pypi.org - то же для пакетов Python: ссылку открывает человек, ставит пакет uvx у него на машине
vercel.com - кабинет Vercel: где взять ключ шлюза (сам шлюз - ai-gateway.vercel.sh выше)
