Как устроен Claude Code изнутри: разбор утечки 512 000 строк исходного кода
31 марта 2026 года из npm-пакета Claude Code утёк полный исходный код — 512 000 строк TypeScript. Разбираю архитектурные решения, которые делают этот агентный CLI быстрее конкурентов, и скрытые фичи, которые намекают на будущее Anthropic.
31 марта 2026 года исследователь Chaofan Shou обнаружил, что npm-пакет Claude Code версии 2.1.88 содержит файл main.js.map — source map, из которого восстанавливается полный исходный код. Не эксплойт, не взлом — просто .npmignore не исключил служебный файл. Anthropic закрыли дыру за часы, но зеркала на GitHub разошлись мгновенно.
Результат: 512 000 строк строго типизированного TypeScript, ~1 900 файлов, главный компонент main.tsx на 785 КБ. Это не обёртка над чат-API. Это полноценная агентная система с собственным рендерером, оркестратором и системой управления памятью.
Разберу ключевые архитектурные решения — почему они работают и что из этого можно вынести для собственных агентных систем.
Потоковый агентный цикл: streaming + parallel tools
Центральный модуль — QueryEngine.ts, 46 000 строк. Один файл управляет всеми вызовами LLM API, стримингом, кэшированием и оркестрацией инструментов.
Ключевое решение: инструменты запускаются параллельно с генерацией текста, а не после неё. В классическом агентном цикле модель генерирует ответ → парсит tool calls → выполняет → получает результат → генерирует снова. Последовательный цикл. В Claude Code поток токенов и исполнение инструментов идут одновременно.
Почему это быстрее: латентность определяется самым длинным параллельным путём, а не суммой всех шагов. Если модель вызывает три инструмента, они стартуют одновременно. Пока один читает файл, другой выполняет bash-команду, третий проверяет git-статус — модель уже получает первые результаты и продолжает генерацию.
Это не тривиально в реализации. Нужен механизм, который корректно обрабатывает частичные результаты, отменяет зависимые инструменты при ошибке, и управляет контекстным бюджетом в реальном времени.
40+ инструментов с изолированными правами
Система инструментов — не плоский список функций. Каждый инструмент — самостоятельный модуль с собственной input-схемой (Zod v4), уровнем привилегий и логикой исполнения.
BashTool может менять состояние системы — у него одни права. FileReadTool только читает — другие права. Нет глобального переключателя «разрешить всё» или «запретить всё». Каждый инструмент проходит собственную проверку перед выполнением.
Базовое определение инструмента — ~29 000 строк TypeScript. Кажется много, но это цена строгой валидации, изоляции и обработки ошибок на каждой границе.
Самый интересный инструмент — AgentTool. Он позволяет системе порождать суб-агентов как обычный вызов инструмента. Никакого отдельного оркестрационного слоя: суб-агент — такой же первоклассный элемент реестра, как чтение файла или запуск bash.
3-уровневая оркестрация: workers → coordinators → teams
Многоагентная система работает по паттерну «mailbox»:
- Worker — агент, выполняющий конкретную задачу в изолированном Git worktree
- Coordinator — управляющий агент, раздающий задачи workers и контролирующий результаты
- Team — группа координаторов для масштабных задач
Критический элемент: worker не может самостоятельно одобрить опасную операцию. Он отправляет запрос в «почтовый ящик» координатора и ждёт. Координатор оценивает и решает. Атомарный механизм claim не позволяет двум workers обработать один и тот же запрос одновременно.
Изоляция через Git worktrees — элегантное решение. Каждый worker получает собственную рабочую копию репозитория. Параллельные агенты не затирают файлы друг друга, а результаты мёржатся через стандартный git.
Prompt caching: static/dynamic граница
Claude Code использует двухслойное кэширование промптов, оптимизированное под особенности API Anthropic.
Статическая часть — системный промпт, описания инструментов, базовые инструкции. Эта часть одинакова между запросами и кэшируется на стороне API. При повторных вызовах эти токены не пересчитываются.
Динамическая часть — текущий контекст диалога, результаты инструментов, пользовательские файлы. Она меняется с каждым запросом.
Граница между ними тщательно выверена. Чем больше попадает в статическую часть — тем выше процент cache hit и тем дешевле каждый запрос. Потому системный промпт и описания инструментов структурированы так, чтобы оставаться стабильными максимально долго.
3 стратегии сжатия контекста
Для длинных сессий критична работа с контекстным окном. Claude Code использует три стратегии:
MicroCompact — локальное редактирование кэшированного контента без API-вызовов. Старые выводы инструментов обрезаются прямо в памяти. Быстро, бесплатно, прозрачно.
AutoCompact — срабатывает при приближении к потолку контекстного окна. Резервирует буфер в 13 000 токенов, генерирует структурированное саммари до 20 000 токенов. Встроенный circuit breaker: после трёх неудачных попыток сжатия — остановка. Никаких бесконечных циклов.
Full Compact — полное сжатие диалога с повторной инъекцией недавно использованных файлов (до 5 000 токенов на файл), активных планов и схем навыков. После сжатия рабочий бюджет сбрасывается до 50 000 токенов.
Это проектирование «от отказа»: система заранее готова к тому, что контекст закончится, и знает, что с этим делать.
Полноценный Vim и кастомный React-рендерер
Два неожиданных компонента:
Vim-режим реализован как конечный автомат (FSM) с 11 состояниями. Не эмуляция пяти команд — полноценная поддержка модального редактирования с visual mode, операторами и motion-командами. Для CLI-инструмента, целевая аудитория которого — разработчики, это попадание в потребность.
React 19 рендерер с double-buffered rendering для терминального UI. Claude Code использует React + Ink (библиотека для CLI-интерфейсов на React-компонентах). Double buffering устраняет мерцание при быстром обновлении экрана — критично, когда streaming-вывод обновляет терминал десятки раз в секунду.
Стек: Bun вместо Node.js (быстрый старт, нативная компиляция), React + Ink для UI, Zod v4 для валидации. Нестандартный, но внутренне согласованный выбор.
Скрытые фичи: KAIROS, autoDream, ULTRAPLAN, Buddy
108 модулей скрыты за feature flags и удалены из production-сборки через compile-time dead code elimination в Bun. Самые интересные:
KAIROS — фоновый daemon
KAIROS (от греческого «подходящий момент») — персистентный ассистент, работающий в фоне даже при закрытом терминале. Отправляет периодические «tick»-запросы, ведёт append-only логи наблюдений, может проактивно поднимать вопросы через флаг PROACTIVE.
Упоминается в коде больше 150 раз. Это не заглушка — это архитектура будущего продукта.
autoDream — консолидация памяти
Когда пользователь уходит в idle или вызывает SleepTool, запускается autoDream — «рефлексивный проход по файлам памяти». Промпт инструктирует Claude Code: сканировать транскрипты дня, извлекать новую информацию, консолидировать её без дубликатов и противоречий, удалять устаревшие воспоминания. Цель — «синтезировать то, что узнал за день, в устойчивые организованные воспоминания, чтобы будущие сессии ориентировались быстро».
ULTRAPLAN — 30-минутное планирование на Opus
Выносит фазу планирования на облачный Cloud Container Runtime с моделью Opus 4.6. До 30 минут на разработку плана. Результат можно утвердить через браузер или телефон до начала выполнения. Для сложных задач, где ошибка в плане стоит дорого — осмысленная архитектура.
Buddy — Tamagotchi-пет
Виртуальный компаньон: 18 видов (утка, дракон, аксолотль, капибара, гриб, призрак...), уровни редкости от Common до Legendary (1% шанс), 5 характеристик (DEBUGGING, PATIENCE, CHAOS, WISDOM, SNARK), косметические шляпы. Вид определяется детерминированно из хэша userId — один пользователь всегда получает одного и того же питомца.
По внутренним комментариям (неподтверждённым), тизер планировался на 1–7 апреля, полный запуск — май 2026.
Undercover Mode и этический контекст
Отдельно стоит упомянуть: код содержит проверку USER_TYPE === "ant", идентифицирующую сотрудников Anthropic. При работе в публичном репозитории автоматически включается Undercover Mode: инъекция промпта «не раскрывать, что ты ИИ», удаление Co-Authored-By из git-метаданных, скрытие внутренних кодовых имён.
Ирония: система Undercover Mode, созданная для предотвращения утечек внутренних кодовых имён, сама утекла в .map-файле.
90% кода написано самим Claude Code
По данным анализа коммитов и метаданных, ~90% кодовой базы написано при помощи Claude Code. Инструмент буквально создал сам себя. Это и доказательство зрелости агентного подхода к разработке, и интересный философский кейс — автореферентная система, где продукт и инструмент его создания совпадают.
Что это значит для индустрии
Для архитекторов агентных систем: паттерны из Claude Code — mailbox-координация, трёхуровневое сжатие контекста, изоляция инструментов — экспортируемы. Необязательно воспроизводить 512 000 строк, чтобы использовать ключевые идеи.
Для рынка AI-инструментов: KAIROS + autoDream намекают на переход от реактивных ассистентов к проактивным. Anthropic строит не просто кодинг-агента, а persistent agent — систему, которая понимает контекст работы пользователя без повторных объяснений.
Для вопросов безопасности: утечка произошла из-за одного пропущенного правила в .npmignore. Ни одна система подготовки к утечкам (включая Undercover Mode) не спасла от банальной ошибки в конфигурации пайплайна. Это урок для любой команды, которая публикует npm-пакеты.
Claude Code — не просто CLI-обёртка над API. Это полноценная операционная система для агентной разработки, спроектированная от отказоустойчивости, а не от фич. И самое интересное — то, что скрыто за feature flags, говорит о будущем больше, чем то, что доступно сегодня.