31 марта 2026 года наружу вывалились исходники Claude Code — через sourcemap в npm-пакете. История сама по себе комичная: продукт, призванный помогать писать код, случайно опубликовал не просто дебажные данные, а почти анатомический атлас самого себя.
Но меня интересует не сам факт утечки, а более приземлённый вопрос: что там внутри? Если убрать обычное «вау, утекло», остаётся другая интонация — ну-ка, посмотрим, что тут у нас (или «там у них»?), и нормально ли написан код.
Да, написано с головой. Даже с душой. Но и с очень характерными симптомами продукта, который из «удобного CLI для общения с моделью» давно превратился в маленькую операционную систему для одного терминала.
Сразу неприятная правда: это не аккуратный git checkout
Первое, что бросается в глаза: перед нами не идеальный репозиторий разработчика. Нет привычных package.json, tsconfig.json и прочей обвязки. Вместо этого — смесь TypeScript-кода, следов сборки и трансформаций.
Часть импортов ведёт на файлы, которых в этой копии нет: assistant/index.ts, assistant/gate.ts, proactive/index.js, daemon/main.js, environment-runner/main.js и KAIROS-специфичные инструменты. Это важно: наружу попал не git-репозиторий, а огромный snapshot, восстановленный из sourcemap. Перед нами — крупный, но местами неполный слепок клиентского кода.
Например, screens/REPL.tsx начинается с react/compiler-runtime — это уже не чистый TSX, а результат трансформаций React Compiler. А main.tsx выглядит ближе к исходнику: там ранние profileCheckpoint, префетч keychain, параллельный MDM-read и другие оптимизации старта.
Это ключевая оговорка: мы смотрим не на музейный экспонат, а на крупную, но рваную выгрузку внутренностей. Выводы лучше делать осторожно: не «вот весь секретный продукт», а «вот очень говорящий срез того, как клиент реально устроен».
Первое впечатление: это не «маленький CLI»
Снаружи Claude Code позиционируется как CLI для разработчика. Внутри — это скорее фреймворк для терминальной среды, к которому приделали команду claude.
entrypoints/cli.tsx — настоящий вокзал маршрутов:
- лёгкая ветка для --version;
- отдельный путь для вывода system prompt;
- режимы для MCP-серверов;
- daemon;
- remote-control и bridge-режим;
- фоновые сессии ps/logs/attach/kill;
- environment-runner;
- self-hosted-runner;
- работа через tmux и worktree.
Это не «запуск чата в терминале». Это многорежимный рантайм, у которого CLI — всего лишь фасад.
Здесь появляется раздвоение между симпатией и скепсисом.
Симпатия: команда понимает цену быстрого старта. В cli.tsx почти всё тяжёлое подгружается динамически. Комментарии прямолинейны: All imports are dynamic to minimize module evaluation for fast paths, Fast-path for --version has zero imports beyond this file, workers are lean.
Пользовательская польза проста: если вы просите что-то элементарное, система не должна разворачивать полмира. Это не косметика — это нормальная инженерия для большого CLI.
Скепсис: когда продукт знает про daemon, bridge, remote, self-hosted runner, tmux, worktree, MCP и UI одновременно, он перестаёт быть CLI. Он становится похож на аэропорт, где на схеме уже страшно, а жить можно только потому, что повсюду указатели.
Главный герой этой пьесы: огромный main.tsx
Любая система рано или поздно выдаёт точку гравитационного коллапса. У Claude Code это — main.tsx.
Большой entrypoint — не преступление. Но когда через один файл проходят:
- инициализация;
- выбор режима;
- system prompt;
- tool pool;
- feature flags;
- remote-сессии;
- KAIROS/Proactive;
- structured output;
- запуск UI;
- восстановление сессий;
— это уже не «точка входа», а центральная нервная система.
Плюс: все ключевые развилки в одном месте — архитектуру удобно читать. Минус: файл превращается в склад компромиссов. В коде мелькают конструкции вроде «сначала включим proactive mode до getTools(), иначе SleepTool.isEnabled() не сработает». Это не баг, а следствие масштаба.
Хороший инженерный запах смешан со следами долгой эволюции. В начале кто-то хотел написать аккуратный CLI. Потом он обрастал режимами, те начали конфликтовать, и их повесили на feature-флаги. Результат — перед нами.
Технически это React-приложение, которое притворяется терминалом
Ещё один важный момент: Claude Code — это не «суровый консольный бинарник». Это React-приложение на Ink, живущее в терминале.
Из-за этого screens/REPL.tsx — не просто экран чата, а полноценный фронтенд-комбайн:
- уведомления;
- модалки;
- IDE-интеграция;
- MCP-соединения;
- плагины;
- загрузка навыков;
- teammate-режим;
- remote-callout;
- dialog priority;
- transcript mode;
- floating UI;
- и, конечно, Buddy.
Это объясняет характер продукта. Claude Code не просто «посылает промпт и печатает ответ». Он постоянно синхронизирует состояние, фильтрует инструменты, подмешивает плагины, решает, какой режим активен, и рендерит всё это в терминал.
Иными словами: это фронтенд. Просто фронтенд, которому тесно в браузере, и он переехал в терминал — со всеми травмами.
Перед нами не один агент, а диспетчерская
Самый важный архитектурный вывод: Claude Code построен не вокруг «главной модели», а вокруг оркестрации.
AgentTool в tools/AgentTool/AgentTool.tsx — не декоративная добавка, а один из главных механизмов системы. Агента можно:
- запустить синхронно;
- отправить в background;
- изолировать в отдельный worktree;
- в некоторых сборках — увести в remote;
- сделать teammate в команде;
- ограничить набором доступных агентов;
- посадить на другой permission mode.
Это уже не «у нас есть субагенты». Это уровень «у нас есть инфраструктура жизненного цикла субагентов».
Особенно впечатляют детали:
- для async-агентов — отдельная регистрация, прогресс и уведомления;
- worker получает собственный tool pool, а не просто наследует от родителя;
- worktree-изоляция создаётся как часть маршрута исполнения;
- fork-path заботится о кэш-идентичности system prompt и набора tools.
Здесь видно взрослую инженерную мысль: не просто «давайте позовём вторую модель», а «давайте сделаем так, чтобы она не сломала контекст, права, cwd и жизненный цикл».
Это одна из сильнейших частей системы. Многие AI-инструменты красиво показывают слово «agents», а внутри — один Promise.all и молитва. Здесь не так. Здесь агентность доведена до состояния инфраструктуры.
При этом они понимают: агентность легко превращается в балаган
Показательный пример — встроенный Explore-агент в tools/AgentTool/built-in/exploreAgent.ts.
Это не просто роль, а почти педагогически выписанный характер:
- только чтение;
- никаких write/edit/delete;
- никаких redirect и heredoc;
- максимум поиска и анализа;
- по возможности — параллельные grep/read-вызовы.
Это хороший момент для понимания философии Claude Code. Команда не доверяет даже своим агентам настолько, чтобы оставлять поведение «ну он сам разберётся». Каждый режим стараются ограничить не только технически, но и риторически — через системную инструкцию.
Продукт строится на двух тезисах:
- Мы хотим дать модели больше самостоятельности.
- Мы понимаем, что без намордника она поведёт себя как стажёр на третий день после дедлайна.
Это разумный взгляд на современные агентные системы.
Инструменты здесь оркестрируются всерьёз, а не для демо
Отдельно впечатлил слой исполнения инструментов.
В services/tools/toolOrchestration.ts вызовы делятся на concurrency-safe и всё остальное. Система не просто запускает инструменты подряд — она группирует read-only и безопасные вызовы в параллельные пачки, а рискованные гоняет сериализованно.
Дальше — services/tools/StreamingToolExecutor.ts. Здесь видно, что люди уже натерпелись реальных проблем:
- отдельная логика отмены соседних tool call, если один из параллельных упал;
- различие между user_interrupted, sibling_error и streaming_fallback;
- аккуратная буферизация результатов для правильного порядка вывода;
- учёт поведения инструментов при interrupt.
Здесь заканчивается «прототип для AI» и начинается продукт. Прототип умеет делать tool call. Продукт — переживать, что он застрянет, будет прерван, конфликтнет с соседним и сломает UI.
Паранойя в Bash-слое заслуживает отдельной премии
Маркетингово: Claude Code — «попроси модель выполнить команду». В коде: «мы потратили чудовищное количество сил на то, чтобы команда не стала способом самоубийства».
Файлы tools/BashTool/bashPermissions.ts и tools/BashTool/bashSecurity.ts выглядят как коллективный дневник команды, которую уже укусил shell.
Там блокируются вещи, о которых многие вспоминают раз в год:
- command substitution;
- process substitution;
- heredoc-краевые случаи;
- zsh equals expansion;
- zmodload, ztcp, zpty и другие радости;
- обфусцированные флаги;
- опасные префиксы через env, sudo, nice, timeout;
- странные формы whitespace и экранирования.
Это выглядит почти маниакально, но в хорошем смысле. Потому что видно: Claude Code писали не те, кто обсуждает «агентов будущего» на слайдах, а те, кто уже видел, как LLM ломает shell.
С инженерной точки зрения — один из самых зрелых слоёв. С эстетической — напоминание, что вся AI-магия быстро упирается в банальное: «а теперь не дай модели пробить дыру через bash».
Дальше начинается самое человеческое: Buddy, Dream и прочая психотерапия для CLI
Самые обсуждаемые фрагменты утечки — не orchestration и не permissions, а вещи, которые делают продукт неожиданно человечным.
Каталог buddy/ выглядит так, будто дизайнер и геймдизайнер внезапно получили свободу в корпоративном CLI.
Buddy — терминальный компаньон с ASCII-спрайтами, пузырями речи, анимацией, сердечками после «погладить» и тизером на 1–7 апреля 2026 года. В buddy/useBuddyNotification.tsx это оформлено с расчётом на пояса времени и «растянутый» вирусный эффект. А buddy/CompanionSprite.tsx содержит систему рендеринга: тайминги, fade, narrow-mode, reserved columns, idle sequence.
Смешно, что вокруг Buddy уже выросла мифология. README рисует одних существ, а реальный buddy/types.ts — гораздо прозаичнее: duck, goose, blob, cat, capybara, robot, mushroom, chonk. Утёкший код моментально оброс фанфиком — ещё один повод читать файлы, а не пересказы.
Самая забавная деталь — в промпте buddy/prompt.ts: модели прямо говорят, что рядом сидит существо, которое отвечает в отдельном пузыре, и ей лучше не лезть с болтовнёй.
Это иллюстрация того, во что превращаются современные AI-продукты. С одной стороны — серьёзный инструмент. С другой — терминальный питомец, которому нужно место в layout, реплики и режим «не мешайся, когда говорит зверёк».
Это не нелепо. Это закономерная стадия эволюции продукта, который хочет жить рядом с человеком дольше пяти минут.
Если Buddy — маркетинговая человечность, то autoDream — архитектурная поэзия.
В services/autoDream/autoDream.ts живёт механизм фоновой консолидации памяти. Не «сохранить заметку», а именно dream: отдельный forked subagent, который запускается при:
- прошедших часах с последней консолидации;
- накоплении новых сессий;
- удачном взятии lock.
А в services/autoDream/consolidationPrompt.ts это оформлено как ритуал:
- Осмотреться.
- Собрать свежий сигнал.
- Сконсолидировать память.
- Подчистить индекс и противоречия.
Самое прекрасное — не название, а дисциплина. «Сон» не дают запускать слишком часто. Ему ограничивают инструменты. Ему объясняют, что транскрипты большие — читать целиком не надо. Ему велят переводить относительные даты в абсолютные. Это хороший инженерный дизайн, замаскированный под художественный термин.
То есть да, Claude Code буквально «видит сны». Но с lock-файлом, дедупликацией и read-only Bash. Это важное уточнение.
Undercover Mode: самая смешная и самая показательная часть
Если выбрать один фрагмент, передающий дух всей утечки, — это utils/undercover.ts.
Там живёт режим для работы сотрудников Anthropic в публичных репозиториях. И написан он серьёзно:
- не палить внутренние имена моделей;
- не светить внутренние project names;
- не писать «Generated with Claude Code»;
- не добавлять AI-attribution;
- если не уверены, что репозиторий внутренний — работаем undercover.
Продукт умеет делать вид, что он не продукт.
Можно спорить о корпоративной этике, но как инженерный артефакт это бесценно. Он показывает два факта:
- Claude Code используется в реальной работе с публичными репозиториями.
- Команда осознаёт репутационные и информационные риски.
Это холодный душ для тех, кто думает про AI-кодинг как про «просто интерфейс к модели». Это ещё и контроль утечек, атрибуции, prompt-режимов, привилегий и даже риторики commit message.
KAIROS, PROACTIVE и привкус отсутствующего куска пазла
По коду видно: в продукте есть или планировался слой «постоянно живущего» ассистента: KAIROS, PROACTIVE, Brief-режим, push-нотификации.
Но есть оговорка: в этой выгрузке это читается неравномерно.
main.tsx и screens/REPL.tsx ссылаются на assistant/index.js, assistant/gate.js и другие KAIROS-сущности. При этом каталог assistant/ почти пуст — там только assistant/sessionHistory.ts. То же с proactive/index.js и инструментами отправки файлов/нотификаций: код знает о них, но модули отсутствуют.
Это антидот против конспирологии. Исходников много, но не всё дошло одинаково. Где-то — полный слой. Где-то — только интерфейсы, флаги, вызовы и контуры.
Поэтому про KAIROS правильнее говорить так: код подтверждает существование этой линии развития, но не даёт весь внутренний модуль целиком.
Плагины: да, система есть; нет, в этом репо она не раскрыта полностью
У пользователя может возникнуть вопрос: «А где, собственно, все плагины?»
С одной стороны, плагинная инфраструктура серьёзная:
- hooks/useManagePlugins.ts загружает plugin commands, agents, hooks, MCP и LSP;
- services/plugins/PluginInstallationManager.ts — фоновые установки и авто-refresh;
- services/mcp/MCPConnectionManager.tsx — нормальный connection layer;
- skills/bundledSkills.ts — ленивая распаковка встроенных навыков.
С другой — в этой копии картина скромная:
- в plugins/ — две заготовки;
- plugins/bundled/index.ts говорит, что встроенные плагины не зарегистрированы;
- реальная «начинка» живёт в bundled skills, MCP-интеграциях и внешних маркетплейсах.
Формально архитектура огромная. Практически — в этой выгрузке она видна как каркас и загрузчик, а не как коллекция готовых расширений. Это ещё одна причина не повторять «утёк весь Claude Code»: утёк большой пласт клиентского кода, но из-за способа утечки не все слои представлены одинаково.
Это типично: самое сложное — не написать плагин, а построить систему загрузки, доверия, политик, hot-reload, MCP-подключения и обновления маркетплейса. Именно это и видно в коде.
Самая «вкусная» археология: hidden modes и фичефлаги
Если убрать эмоции и посчитать feature(...), выясняется: самый частый персонаж в коде — не Claude, не Tool, не Agent, а флаг.
Часто всплывают: KAIROS, TRANSCRIPT_CLASSIFIER, TEAMMEM, VOICE_MODE, BASH_CLASSIFIER, KAIROS_BRIEF, PROACTIVE, COORDINATOR_MODE, BRIDGE_MODE, BUDDY, CHICAGO_MCP, ULTRAPLAN, BG_SESSIONS, AGENT_TRIGGERS, WEB_BROWSER_TOOL, TERMINAL_PANEL, REVIEW_ARTIFACT, CCR_MIRROR и другие.
Это ключевой момент: Claude Code живёт не как монолит, а как набор режимов, собираемых и вырезаемых рантаймом через GrowthBook-конфиги вроде tengu_ultraplan_model, tengu_remote_backend, tengu_onyx_plover, tengu_ccr_bridge.
Нужна дисциплина формулировки. Наличие флага не означает shipped-функцию. Корректнее: код подтверждает существование реализованной или частично реализованной линии продукта, скрытой за compile-time и runtime gates.
KAIROS и PROACTIVE: Claude, который не ждёт, пока его позовут
Это самый жирный скрытый пласт. В main.tsx KAIROS и PROACTIVE встречаются постоянно: ранние require('./assistant/index.js'), ветки brief mode, отдельная активация assistant mode, каналы, UX-поток, подготовка под teammate context.
Снаружи это читается так: внутри давно есть или серьёзно прорабатывался режим «постоянно живущего» помощника, который существует рядом с пользователем. В этом направлении — KAIROS_BRIEF, KAIROS_CHANNELS, KAIROS_PUSH_NOTIFICATION, KAIROS_GITHUB_WEBHOOKS.
Оговорка: в этой выгрузке KAIROS виден по каркасу, вызовам и гейтам, а не по полному модулю. Линия продукта есть, но внутренний assistant-слой не раскрыт целиком.
ULTRAPLAN: режим, в котором Claude уходит думать отдельно от вас
ULTRAPLAN — один из самых красивых артефактов как продуктовая идея. В commands/ultraplan.tsx — 30-минутный таймаут, работа с удалённой CCR-сессией, браузерный approval loop, polling статуса и развилка «выполнять дальше удалённо или телепортировать план обратно локально».
Это не «покажи chain-of-thought», а отдельный планировочный ритуал с удалённой инфраструктурой. И смешно, что рядом есть keyword trigger для ultraplan в utils/processUserInput/processUserInput.ts.
В коде просматривается режим «дай мне полчаса отдельно подумать и потом вернись с планом». Для статьи — подарок.
BUDDY: скрытый тамагочи, которого никто не просил, но все бы обсуждали
BUDDY встречается реже, но как культурный артефакт он мощнее половины enterprise-фич. В buddy/CompanionSprite.tsx — полноценный UI-движок для терминального зверька: idle sequence, fade-out пузыря, narrow-mode, резервация колонок, сердечки после pet interaction. В buddy/prompt.ts модели объясняют, что рядом сидит существо, и лучше ему не мешать.
Это напоминание: серьёзные AI-продукты неизбежно обрастают не только precision/recall, но и характером. А потом кто-то пишет в production-коде систему показа пузыря речи для ASCII-питомца.
BRIDGE_MODE, CCR_MIRROR и remote-control: терминал как тонкий клиент к удалённой среде
По entrypoints/cli.tsx, bridge/ и remote/ видно: у Claude Code есть не один «локальный» режим. BRIDGE_MODE открывает remote-control/bridge path, CCR_AUTO_CONNECT и CCR_MIRROR намекают на связь с Claude Code on the web и удалёнными контейнерами, а tengu_remote_backend в main.tsx подчёркивает, что remote backend — отдельная ось продукта.
Флаги рассказывают о стратегии лучше презентации. Строят не просто CLI, а связку «локальный интерфейс + удалённая среда + мост между ними».
TEAMMEM, autoDream и память как отдельный продукт внутри продукта
Обычный AI-клиент хранит историю. Claude Code строит мемориальную бюрократию.
TEAMMEM размазан по claudemd, teamMemorySync и memory-компонентам; autoDream живёт через tengu_onyx_plover; EXTRACT_MEMORIES и session memory накладываются сверху. В сумме: память — не «удобная опция», а отдельный продуктовый слой со своей синхронизацией, лимитами, watch-логикой, защитой от секретов и фоновым уходом за собой.
Это один из лучших сюжетов: AI-индустрия много говорит о «долговременной памяти», но редко показывает, сколько скучной инженерии стоит за этим.
CHICAGO_MCP, WEB_BROWSER_TOOL и прочие боковые ходы
Есть и менее громкие, но характерные режимы.
CHICAGO_MCP включает отдельный computer-use MCP path. WEB_BROWSER_TOOL влияет на Claude-in-Chrome hint. TERMINAL_PANEL, QUICK_SEARCH, HISTORY_PICKER, MESSAGE_ACTIONS, AUTO_THEME, WORKFLOW_SCRIPTS — это уже не базовая функциональность, а превращение терминального клиента в полноценную оболочку.
Это в духе больших продуктов: сначала «ещё одна опция», потом «ещё один режим», потом понимаешь, что строишь собственную настольную среду — только в тексте.
BG_SESSIONS, DAEMON, SELF_HOSTED_RUNNER, BYOC_ENVIRONMENT_RUNNER
Здесь особенно ломается наивная картина «CLI = один процесс, один запрос, один ответ». В entrypoints/cli.tsx отдельно живут BG_SESSIONS, DAEMON, SELF_HOSTED_RUNNER, BYOC_ENVIRONMENT_RUNNER. Система строится под длинноживущие процессы, фоновую жизнь, внешние окружения и сценарии, где локальная консоль — не главный актор.
Это делает код тяжелее, но честнее. Команда не притворяется, что продукт останется «маленьким terminal helper». Они уже пишут платформу.
И всё это вместе выглядит не как беспорядок, а как метод выживания
Из хорошего:
- можно держать внутренние и внешние сборки рядом;
- можно dogfood-ить фичи на сотрудниках;
- можно жёстко выкидывать код через dead code elimination;
- можно быстро катать эксперименты без ломания продукта;
- можно вести параллельно несколько линий развития: CLI, remote, assistant, memory, plugins, MCP.
Из плохого:
- архитектура читается как слоёный пирог решений;
- некоторые инварианты хрупки — порядок инициализации зависит от флагов;
- постороннему код напоминает археологию внутренних экспериментов и A/B-тестов;
- отдельные подсистемы — скорее контур, чем раскрытый модуль.
У такого продукта почти нет другого пути. Когда одновременно строишь CLI, агентную платформу, терминальный UI, память, remote-контур и полигон для новых режимов, feature-флаг перестаёт быть слабостью. Он становится способом не развалиться по дороге.
Так нормально ли это написано?
Мой ответ: да, в целом — сильно. Но сильно как большой живой продукт, а не как изящная учебная архитектура.
Что здесь хорошо:
- внимание к startup performance;
- оркестрация субагентов сделана серьёзно;
- permission и Bash-безопасность проработаны болезненно тщательно;
- terminal UI не выглядит игрушкой;
- memory, MCP, plugins и remote-режимы связаны в одну систему, а не в россыпь демо-модулей.
Что болит:
- слишком много центростремительности вокруг main.tsx;
- фичефлагов столько, что код напоминает карту политических союзов в поздней античности;
- некоторые подсистемы — почти отдельные продукты внутри продукта;
- сама выгрузка показывает, насколько много важного вынесено в недостающие куски, маркетплейсы и внутренние сборки.
Главный вывод — не язвительный, а уважительный.
Claude Code в этой утечке не выглядит «обёрткой над API». Он выглядит как тяжёлый, амбициозный, иногда перегруженный, но вполне серьёзный программный продукт. Со своими шрамами. Со своими перегибами. Со своим корпоративным желанием быть и удобным, и безопасным, и расширяемым, и чуть-чуть живым.
А ещё он выглядит как продукт, который хочет стать не просто CLI, а средой обитания для модели.
Buddy внизу экрана. Сны по ночам. Undercover в публичных репозиториях. Агентные команды. Remote-сеансы. MCP. Плагины. Огромный REPL на React.
В какой-то момент понимаешь: смотришь не на «клиент для Claude», а на первую неловкую, но вполне рабочую попытку собрать персональную операционную систему для AI-помощника.
Это и есть самая интересная часть всей истории.