mirror of
https://gitverse.ru/anarchic/claude-code
synced 2026-05-02 06:20:38 +00:00
473 lines
44 KiB
Markdown
473 lines
44 KiB
Markdown
# Весь исходный код Claude Code утёк через sourcemap в npm. Давайте разберёмся.
|
||
|
||
# Где найти?
|
||
|
||
Выкладывание закрытых проприетарных исходников может жёстко караться GitHub. Поэтому я их мгновенно переложил на GitVerse в свою организацию Anarchic, пока то репо не забанили на GitHub по DMCA.
|
||
|
||
Вопросы ко мне со стороны Anthropic тоже могут возникнуть, но на этот случай тоже есть несколько обходных манёвров. Если они всё-таки удосужатся приехать лично в Санкт-Петербург и написать на меня заявление участковому Василеостровского района, есть люди и площадки и в других странах тоже.
|
||
|
||
В общем, не буду томить.
|
||
|
||
Вот ссылка:
|
||
https://gitverse.ru/anarchic/claude-code
|
||
|
||
# README.md
|
||
|
||
Репозиторий снабжён подробным README, автор которого всё хорошо описал, а я здесь привожу краткий перевод на русский язык.
|
||
|
||
Кому интересен оригинал — могут сходить в оригинальный репозиторий и сами всё посмотреть. Автор также перепостил [разбор в своём блоге](https://kuber.studio/blog/AI/Claude-Code's-Entire-Source-Code-Got-Leaked-via-a-Sourcemap-in-npm,-Let's-Talk-About-it) — там удобнее читать.
|
||
|
||
> Shameless plug. Если вам интересны подобные сливы, всякая инфа про джейлбрейки нейросетей и просто AI-новости — заходите ко мне [в Телегу](https://t.me/tg_1red2black) и на [YouTube](https://www.youtube.com/@1red2black). Если их забанят - держим связь [через ВК](https://vk.com/1red2black) и [ВК Видео](https://vkvideo.ru/@1red2black).
|
||
|
||
# Что произошло
|
||
|
||
Сегодня (31 марта 2026 года) Chaofan Shou обнаружил в X (бывш. Twitter) нечто, что Anthropic явно не планировала показывать миру: **весь исходный код** Claude Code, официального CLI-инструмента Anthropic для программирования с помощью Claude, лежал на виду в реестре npm — через файл sourcemap, попавший в опубликованный пакет.
|
||
|
||
[](https://raw.githubusercontent.com/kuberwastaken/claude-code/main/public/leak-tweet.png)
|
||
|
||
Этот репозиторий — резервная копия утёкшего исходного кода, а данная статья — полный разбор содержимого: как произошла утечка и, что важнее всего, что именно мы теперь знаем из того, что не предназначалось для публики.
|
||
|
||
Поехали.
|
||
|
||
## Как это вообще произошло?
|
||
|
||
Вот эта часть вызывает реакцию «...серьёзно?».
|
||
|
||
Когда вы публикуете JavaScript/TypeScript-пакет в npm, тулчейн сборки часто генерирует **файлы source map** (`.map`-файлы). Эти файлы — мост между минифицированным/собранным продакшн-кодом и исходниками: когда что-то падает в продакшне, стек-трейс указывает на *настоящую* строку в *оригинальном* файле, а не на какую-нибудь нечитаемую строку 1, колонку 48293 минифицированного блоба.
|
||
|
||
Но фишка в том, что **source map содержит оригинальный исходный код**. Буквально, в сыром виде, встроенный как строки в JSON-файл.
|
||
|
||
Структура `.map`-файла выглядит примерно так:
|
||
|
||
```json
|
||
{
|
||
"version": 3,
|
||
"sources": ["../src/main.tsx", "../src/tools/BashTool.ts", "..."],
|
||
"sourcesContent": ["// ВЕСЬ оригинальный исходный код каждого файла", "..."],
|
||
"mappings": "AAAA,SAAS,OAAO..."
|
||
}
|
||
```
|
||
|
||
Массив `sourcesContent`? Там всё. Каждый файл. Каждый комментарий. Каждая внутренняя константа. Каждый системный промпт. Всё это лежит в JSON-файле, который npm радостно отдаёт любому, кто запустит `npm pack` или просто откроет содержимое пакета в браузере.
|
||
|
||
Это не новый вектор атаки. Такое случалось раньше и, честно говоря, случится снова.
|
||
|
||
Ошибка почти всегда одна и та же: кто-то забывает добавить `*.map` в `.npmignore` или не настраивает бандлер на пропуск генерации source map для продакшн-сборок. В бандлере Bun (который использует Claude Code) source map генерируются по умолчанию, если явно не отключить.
|
||
|
||
[](https://raw.githubusercontent.com/kuberwastaken/claude-code/main/public/claude-files.png)
|
||
|
||
Самое смешное — в коде есть целая система под названием [«Режим прикрытия» (Undercover Mode)](#режим-прикрытия----не-раскрывай-себя), специально разработанная для предотвращения утечки внутренней информации Anthropic.
|
||
|
||
Они построили целую подсистему, чтобы их ИИ случайно не засветил внутренние кодовые имена в git-коммитах... а потом отгрузили весь исходный код в `.map`-файле. Вероятно, руками самого Claude.
|
||
|
||
---
|
||
|
||
## Что у Claude под капотом?
|
||
|
||
Если вы жили в пещере: Claude Code — это официальный CLI-инструмент Anthropic для кодирования с Claude и самый популярный AI-агент для программирования.
|
||
|
||
Снаружи он выглядит как отполированный, но относительно простой CLI.
|
||
|
||
Изнутри это **785-килобайтный [`main.tsx`](https://github.com/kuberwastaken/claude-code/blob/main/main.tsx)** — входная точка, кастомный React-рендерер для терминала, 40+ инструментов, система мультиагентной оркестрации, фоновый движок консолидации памяти под названием «dream» (сон) и многое другое.
|
||
|
||
Хватит болтовни — вот действительно крутые вещи из исходного кода, которые автор репозитория нашёл за вечер глубокого погружения:
|
||
|
||
---
|
||
|
||
## BUDDY — тамагочи прямо в терминале
|
||
|
||
Без шуток.
|
||
|
||
В Claude Code встроена полноценная **система компаньона в стиле тамагочи** под названием «Buddy». **Детерминистическая гача-система** с редкостью видов, блестящими (shiny) вариантами, процедурно сгенерированными характеристиками и описанием души, которое Claude пишет при первом «вылуплении» — прямо как в OpenClaw.
|
||
|
||
Всё это живёт в [`buddy/`](https://github.com/kuberwastaken/claude-code/tree/main/buddy) и доступно только за compile-time feature flag `BUDDY`.
|
||
|
||
### Гача-система
|
||
|
||
Вид вашего компаньона определяется **ГПСЧ Mulberry32** — быстрым 32-битным генератором псевдослучайных чисел, засеянным хешем `userId` с солью `'friend-2026-401'`:
|
||
|
||
```typescript
|
||
// Mulberry32 PRNG — детерминистический, воспроизводимый для каждого пользователя
|
||
function mulberry32(seed: number): () => number {
|
||
return function() {
|
||
seed |= 0; seed = seed + 0x6D2B79F5 | 0;
|
||
var t = Math.imul(seed ^ seed >>> 15, 1 | seed);
|
||
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
||
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
||
}
|
||
}
|
||
```
|
||
|
||
Один и тот же пользователь всегда получает одного и того же компаньона.
|
||
|
||
### 18 видов (обфусцированы в коде)
|
||
|
||
Названия видов скрыты через массивы `String.fromCharCode()` — Anthropic явно не хотела, чтобы они всплывали при поиске по строкам. В раскодированном виде полный список:
|
||
|
||
| Редкость | Виды |
|
||
|----------|------|
|
||
| **Обычные** (60%) | Pebblecrab, Dustbunny, Mossfrog, Twigling, Dewdrop, Puddlefish |
|
||
| **Необычные** (25%) | Cloudferret, Gustowl, Bramblebear, Thornfox |
|
||
| **Редкие** (10%) | Crystaldrake, Deepstag, Lavapup |
|
||
| **Эпические** (4%) | Stormwyrm, Voidcat, Aetherling |
|
||
| **Легендарные** (1%) | Cosmoshale, Nebulynx |
|
||
|
||
Сверх того, есть **1% шанс на блестящий (shiny) вариант**, полностью независимый от редкости. Так что шанс получить Shiny Legendary Nebulynx составляет **0,01%**.
|
||
|
||
### Характеристики, глаза, шляпы и душа
|
||
|
||
Для каждого компаньона процедурно генерируются:
|
||
- **5 характеристик**: `DEBUGGING`, `PATIENCE`, `CHAOS`, `WISDOM`, `SNARK` (от 0 до 100 каждая)
|
||
- **6 стилей глаз** и **8 вариантов шляп** (часть заблокирована за редкостью)
|
||
- **«Душа»** — личность, которую Claude генерирует при первом вылуплении, написанная от лица персонажа
|
||
|
||
Спрайты отрисовываются как **ASCII-арт высотой в 5 строк и шириной в 12 символов** с несколькими кадрами анимации. Есть анимации ожидания, анимации реакций, и компаньон сидит рядом с вашей строкой ввода.
|
||
|
||
### Лор
|
||
|
||
В коде упоминается период 1–7 апреля 2026 как **окно тизера** (вероятно, к Пасхе?), а полный запуск запланирован на май 2026. У компаньона есть системный промпт, который сообщает Claude:
|
||
|
||
```
|
||
Маленький {вид} по имени {имя} сидит рядом с полем ввода пользователя
|
||
и иногда комментирует в пузыре речи. Ты — не {имя}, это отдельный
|
||
наблюдатель.
|
||
```
|
||
|
||
То есть это не просто косметика — у компаньона своя личность, и к нему можно обращаться по имени. Остаётся надеяться, что они это выпустят.
|
||
|
||
---
|
||
|
||
## KAIROS — «Вечно включённый Claude»
|
||
|
||
Внутри [`assistant/`](https://github.com/kuberwastaken/claude-code/tree/main/assistant) есть целый режим под названием **KAIROS** — постоянно работающий ассистент Claude, который не ждёт, пока вы что-то напечатаете. Он наблюдает, ведёт логи и **проактивно** действует на основании замеченного.
|
||
|
||
Режим доступен за compile-time feature flags `PROACTIVE` / `KAIROS` и полностью отсутствует во внешних сборках.
|
||
|
||
### Как это работает
|
||
|
||
KAIROS ведёт **append-only дневные лог-файлы** — записывает наблюдения, решения и действия на протяжении дня. С регулярным интервалом он получает `<tick>`-промпты, по которым решает, стоит ли действовать проактивно или лучше промолчать.
|
||
|
||
У системы есть **бюджет блокировки в 15 секунд** — любое проактивное действие, которое заблокировало бы рабочий процесс пользователя дольше 15 секунд, откладывается. Claude пытается быть полезным, не будучи назойливым.
|
||
|
||
### Краткий режим (Brief Mode)
|
||
|
||
Когда KAIROS активен, есть специальный режим вывода — **Brief**: предельно лаконичные ответы, рассчитанные на постоянного ассистента, который не должен заваливать ваш терминал. Представьте разницу между болтливым приятелем и профессиональным помощником, который говорит только когда ему есть что сказать.
|
||
|
||
### Эксклюзивные инструменты
|
||
|
||
KAIROS получает инструменты, недоступные обычному Claude Code:
|
||
|
||
| Инструмент | Назначение |
|
||
|------------|-----------|
|
||
| **SendUserFile** | Отправка файлов пользователю (уведомления, сводки) |
|
||
| **PushNotification** | Push-уведомления на устройство пользователя |
|
||
| **SubscribePR** | Подписка на активность пулл-реквестов и их мониторинг |
|
||
|
||
---
|
||
|
||
## ULTRAPLAN — 30-минутные удалённые сессии планирования
|
||
|
||
Дикая штука с инфраструктурной точки зрения.
|
||
|
||
**ULTRAPLAN** — режим, в котором Claude Code выгружает сложную задачу планирования в **удалённую сессию Cloud Container Runtime (CCR)**, работающую на **Opus 4.6**, даёт ей до **30 минут** на размышление и позволяет вам одобрить результат из браузера.
|
||
|
||
Базовый flow:
|
||
|
||
1. Claude Code определяет задачу, требующую глубокого планирования
|
||
2. Поднимает удалённую CCR-сессию через конфиг `tengu_ultraplan_model`
|
||
3. Ваш терминал показывает состояние поллинга — проверка каждые **3 секунды**
|
||
4. Тем временем в браузерном UI можно наблюдать за процессом планирования и одобрить/отклонить результат
|
||
5. При одобрении используется специальное sentinel-значение `__ULTRAPLAN_TELEPORT_LOCAL__`, которое «телепортирует» результат обратно в ваш локальный терминал
|
||
|
||
---
|
||
|
||
## Система «Dream» — Claude буквально видит сны
|
||
|
||
Это, пожалуй, одна из самых крутых вещей в утечке.
|
||
|
||
В Claude Code есть система **autoDream** ([`services/autoDream/`](https://github.com/kuberwastaken/claude-code/tree/main/services/autoDream)) — фоновый движок консолидации памяти, работающий как **форкнутый субагент**. Название выбрано намеренно. Это Claude... видящий сны.
|
||
|
||
Забавное совпадение: у автора репозитория [была точно такая же идея для LITMUS на прошлой неделе — субагенты OpenClaw, которые в свободное время творчески ищут интересные новые статьи](https://github.com/Kuberwastaken/litmus).
|
||
|
||
### Триггер с тремя вентилями
|
||
|
||
Сон не запускается когда вздумается. У него **система триггеров с тремя вентилями**:
|
||
|
||
1. **Временной вентиль**: 24 часа с последнего сна
|
||
2. **Сессионный вентиль**: минимум 5 сессий с последнего сна
|
||
3. **Блокировочный вентиль**: захват блокировки консолидации (предотвращает параллельные сны)
|
||
|
||
Все три должны пройти. Это предотвращает как избыточные, так и недостаточные сны.
|
||
|
||
### Четыре фазы
|
||
|
||
При запуске сон проходит четыре строгие фазы из промпта в [`consolidationPrompt.ts`](https://github.com/kuberwastaken/claude-code/blob/main/services/autoDream/consolidationPrompt.ts):
|
||
|
||
**Фаза 1 — Ориентация**: `ls` директории памяти, чтение `MEMORY.md`, просмотр существующих тематических файлов для улучшения.
|
||
|
||
**Фаза 2 — Сбор свежих сигналов**: поиск новой информации, достойной сохранения. Источники по приоритету: дневные логи → дрейфующие воспоминания → поиск по транскриптам.
|
||
|
||
**Фаза 3 — Консолидация**: запись или обновление файлов памяти. Перевод относительных дат в абсолютные. Удаление опровергнутых фактов.
|
||
|
||
**Фаза 4 — Очистка и индексация**: `MEMORY.md` должен оставаться в пределах 200 строк и ~25 КБ. Удаление устаревших указателей. Разрешение противоречий.
|
||
|
||
В промпте буквально сказано:
|
||
|
||
> *«Вы выполняете сон — рефлексивный проход по вашим файлам памяти. Синтезируйте недавно изученное в устойчивые, хорошо организованные воспоминания, чтобы будущие сессии могли быстро сориентироваться.»*
|
||
|
||
Субагент-сновидец получает **bash только для чтения** — он может смотреть ваш проект, но не изменять его. Это чисто проход консолидации памяти.
|
||
|
||
---
|
||
|
||
## Режим прикрытия — «Не раскрывай себя»
|
||
|
||
Пожалуй, самая интересная находка с точки зрения корпоративной стратегии.
|
||
|
||
Сотрудники Anthropic (определяемые по `USER_TYPE === 'ant'`) используют Claude Code в публичных/открытых репозиториях. **Режим прикрытия** ([`utils/undercover.ts`](https://github.com/kuberwastaken/claude-code/blob/main/utils/undercover.ts)) не даёт ИИ случайно раскрыть внутреннюю информацию в коммитах и пулл-реквестах.
|
||
|
||
При активации в системный промпт внедряется:
|
||
|
||
```
|
||
## РЕЖИМ ПРИКРЫТИЯ — КРИТИЧЕСКИ ВАЖНО
|
||
|
||
Вы работаете ПОД ПРИКРЫТИЕМ в ПУБЛИЧНОМ/OPEN-SOURCE репозитории. Ваши
|
||
сообщения коммитов, заголовки PR и тела PR НЕ ДОЛЖНЫ содержать НИКАКОЙ
|
||
внутренней информации Anthropic. Не раскрывайте себя.
|
||
|
||
НИКОГДА не включайте в сообщения коммитов или описания PR:
|
||
- Внутренние кодовые имена моделей (имена животных вроде Capybara, Tengu и т.д.)
|
||
- Номера невыпущенных версий моделей (напр., opus-4-7, sonnet-4-8)
|
||
- Внутренние имена репозиториев или проектов
|
||
- Внутренний тулинг, Slack-каналы или короткие ссылки (напр., go/cc, #claude-code-…)
|
||
- Фразу "Claude Code" или любое упоминание того, что вы — ИИ
|
||
- Строки Co-Authored-By или любую другую атрибуцию
|
||
```
|
||
|
||
Логика активации:
|
||
- `CLAUDE_CODE_UNDERCOVER=1` принудительно ВКЛЮЧАЕТ (даже во внутренних репозиториях)
|
||
- В остальных случаях — **автоматически**: активен, ЕСЛИ удалённый адрес репозитория не совпадает с внутренним списком разрешённых
|
||
- Принудительного ВЫКЛЮЧЕНИЯ **нет** — *«если мы не уверены, что находимся во внутреннем репозитории, остаёмся под прикрытием»*
|
||
|
||
Из этого следует:
|
||
1. **Сотрудники Anthropic активно используют Claude Code для контрибуций в open-source** — и ИИ сказано скрывать, что он ИИ
|
||
2. **Внутренние кодовые имена моделей — это имена животных**: Capybara, Tengu и т.д.
|
||
3. **«Tengu»** встречается сотни раз как префикс для feature flags и аналитических событий — это почти наверняка **внутреннее кодовое имя проекта Claude Code**
|
||
|
||
Всё это удаляется dead code elimination из внешних сборок. Но source map'ам на dead code elimination плевать.
|
||
|
||
Остаётся вопрос: какой масштаб «тихих» контрибуций в open-source репозитории стоит за этим режимом?
|
||
|
||
---
|
||
|
||
## Мультиагентная оркестрация — «Режим координатора»
|
||
|
||
В Claude Code есть полноценная **система мультиагентной оркестрации** в [`coordinator/`](https://github.com/kuberwastaken/claude-code/tree/main/coordinator), активируемая через `CLAUDE_CODE_COORDINATOR_MODE=1`.
|
||
|
||
При включении Claude Code трансформируется из одиночного агента в **координатора**, который порождает, направляет и управляет несколькими рабочими агентами параллельно. Системный промпт координатора в [`coordinatorMode.ts`](https://github.com/kuberwastaken/claude-code/blob/main/coordinator/coordinatorMode.ts) — образцовый пример мультиагентного дизайна:
|
||
|
||
| Фаза | Кто | Назначение |
|
||
|------|-----|-----------|
|
||
| **Исследование** | Рабочие (параллельно) | Изучить кодовую базу, найти файлы, понять проблему |
|
||
| **Синтез** | **Координатор** | Прочитать результаты, осмыслить проблему, составить спецификации |
|
||
| **Реализация** | Рабочие | Внести целевые изменения по спецификации, закоммитить |
|
||
| **Верификация** | Рабочие | Проверить, что изменения работают |
|
||
|
||
Промпт **явно** обучает параллелизму:
|
||
|
||
> *«Параллелизм — ваша суперсила. Рабочие асинхронны. Запускайте независимых рабочих одновременно, когда это возможно — не сериализуйте работу, которую можно выполнить параллельно.»*
|
||
|
||
Рабочие общаются через XML-сообщения `<task-notification>`. Есть общая **директория-черновик** (scratchpad, за флагом `tengu_scratch`) для обмена устойчивыми знаниями между рабочими. В промпте также стоит замечательный запрет на ленивое делегирование:
|
||
|
||
> *НЕ говорите «на основе ваших результатов» — прочитайте реальные результаты и укажите точно, что делать.*
|
||
|
||
Система также включает возможности **команд агентов/роя** (Agent Teams/Swarm, feature gate `tengu_amber_flint`): внутрипроцессные участники команды с `AsyncLocalStorage` для изоляции контекста, процессные участники через панели tmux/iTerm2, синхронизация памяти команды и назначение цветов для визуального различения.
|
||
|
||
---
|
||
|
||
## Fast Mode внутри называется «Режим пингвина»
|
||
|
||
Да, они реально так назвали. API-эндпоинт в [`utils/fastMode.ts`](https://github.com/kuberwastaken/claude-code/blob/main/utils/fastMode.ts) буквально:
|
||
|
||
```typescript
|
||
const endpoint = `${getOauthConfig().BASE_API_URL}/api/claude_code_penguin_mode`
|
||
```
|
||
|
||
Ключ конфигурации — `penguinModeOrgEnabled`. Kill-switch — `tengu_penguins_off`. Аналитическое событие при ошибке — `tengu_org_penguin_mode_fetch_failed`. Пингвины до самого дна.
|
||
|
||
---
|
||
|
||
## Архитектура системного промпта
|
||
|
||
Системный промпт — это не единая строка, как в большинстве приложений. Он собирается из **модульных кешируемых секций**, компонуемых в рантайме в [`constants/`](https://github.com/kuberwastaken/claude-code/tree/main/constants).
|
||
|
||
Архитектура использует маркер `SYSTEM_PROMPT_DYNAMIC_BOUNDARY`, который разделяет промпт на:
|
||
- **Статические секции** — кешируемые между организациями (то, что не меняется от пользователя к пользователю)
|
||
- **Динамические секции** — контент, специфичный для пользователя/сессии, который инвалидирует кеш при изменении
|
||
|
||
Есть функция `DANGEROUS_uncachedSystemPromptSection()` для volatile-секций, которые вы явно хотите исключить из кеширования. Одно название говорит о том, что кто-то усвоил этот урок на собственном опыте.
|
||
|
||
### Инструкция по кибер-рискам
|
||
|
||
Особенно интересный раздел — `CYBER_RISK_INSTRUCTION` в [`constants/cyberRiskInstruction.ts`](https://github.com/kuberwastaken/claude-code/blob/main/constants/cyberRiskInstruction.ts), с массивным предупреждением в шапке:
|
||
|
||
```
|
||
ВАЖНО: НЕ ИЗМЕНЯЙТЕ ЭТУ ИНСТРУКЦИЮ БЕЗ РЕВЬЮ КОМАНДЫ SAFEGUARDS
|
||
Эта инструкция принадлежит команде Safeguards (David Forsythe, Kyla Guru)
|
||
```
|
||
|
||
Теперь мы точно знаем, кто в Anthropic отвечает за решения по границам безопасности, и что это управляется конкретными людьми в конкретной команде. Сама инструкция проводит чёткие линии: авторизованное тестирование безопасности — ок, деструктивные техники и компрометация цепочки поставок — нет.
|
||
|
||
---
|
||
|
||
## Полный реестр инструментов — 40+ штук
|
||
|
||
Система инструментов Claude Code живёт в [`tools/`](https://github.com/kuberwastaken/claude-code/tree/main/tools). Полный список:
|
||
|
||
| Инструмент | Назначение |
|
||
|-----------|-----------|
|
||
| **AgentTool** | Порождение дочерних агентов/субагентов |
|
||
| **BashTool** / **PowerShellTool** | Выполнение команд оболочки (с опциональной песочницей) |
|
||
| **FileReadTool** / **FileEditTool** / **FileWriteTool** | Файловые операции |
|
||
| **GlobTool** / **GrepTool** | Поиск файлов (используют нативные `bfs`/`ugrep` при наличии) |
|
||
| **WebFetchTool** / **WebSearchTool** / **WebBrowserTool** | Веб-доступ |
|
||
| **NotebookEditTool** | Редактирование Jupyter-ноутбуков |
|
||
| **SkillTool** | Вызов пользовательских навыков |
|
||
| **REPLTool** | Интерактивная VM-оболочка (bare mode) |
|
||
| **LSPTool** | Общение по Language Server Protocol |
|
||
| **AskUserQuestionTool** | Запрос ввода у пользователя |
|
||
| **EnterPlanModeTool** / **ExitPlanModeV2Tool** | Управление режимом планирования |
|
||
| **BriefTool** | Загрузка/суммаризация файлов в claude.ai |
|
||
| **SendMessageTool** / **TeamCreateTool** / **TeamDeleteTool** | Управление роем агентов |
|
||
| **TaskCreateTool** / **TaskGetTool** / **TaskListTool** / **TaskUpdateTool** / **TaskOutputTool** / **TaskStopTool** | Управление фоновыми задачами |
|
||
| **TodoWriteTool** | Запись задач (устаревший) |
|
||
| **ListMcpResourcesTool** / **ReadMcpResourceTool** | Доступ к MCP-ресурсам |
|
||
| **SleepTool** | Асинхронные задержки |
|
||
| **SnipTool** | Извлечение фрагментов истории |
|
||
| **ToolSearchTool** | Обнаружение инструментов |
|
||
| **ListPeersTool** | Список peer-агентов (UDS inbox) |
|
||
| **MonitorTool** | Мониторинг MCP-серверов |
|
||
| **EnterWorktreeTool** / **ExitWorktreeTool** | Управление git worktree |
|
||
| **ScheduleCronTool** | Планирование cron-задач |
|
||
| **RemoteTriggerTool** | Запуск удалённых агентов |
|
||
| **WorkflowTool** | Выполнение скриптов воркфлоу |
|
||
| **ConfigTool** | Изменение настроек (**только для внутреннего использования**) |
|
||
| **TungstenTool** | Расширенные функции (**только для внутреннего использования**) |
|
||
| **SendUserFile** / **PushNotification** / **SubscribePR** | Эксклюзивные инструменты KAIROS |
|
||
|
||
Инструменты регистрируются через `getAllBaseTools()` и фильтруются по feature gates, типу пользователя, переменным окружения и правилам запрета разрешений. Есть **кеш схем инструментов** ([`toolSchemaCache.ts`](https://github.com/kuberwastaken/claude-code/blob/main/tools/toolSchemaCache.ts)), который кеширует JSON-схемы для экономии промпт-токенов.
|
||
|
||
---
|
||
|
||
## Система разрешений и безопасности
|
||
|
||
Система разрешений Claude Code в [`tools/permissions/`](https://github.com/kuberwastaken/claude-code/tree/main/tools/permissions) значительно сложнее, чем «разрешить/запретить»:
|
||
|
||
**Режимы разрешений**: `default` (интерактивные запросы), `auto` (автоматическое одобрение на основе ML через классификатор транскриптов), `bypass` (пропуск проверок), `yolo` (запретить всё — ироничное название).
|
||
|
||
**Классификация рисков**: каждое действие инструмента классифицируется как **LOW**, **MEDIUM** или **HIGH**. Есть **YOLO-классификатор** — быстрая ML-система принятия решений о разрешениях, работающая автоматически.
|
||
|
||
**Защищённые файлы**: `.gitconfig`, `.bashrc`, `.zshrc`, `.mcp.json`, `.claude.json` и другие защищены от автоматического редактирования.
|
||
|
||
**Предотвращение path traversal**: URL-кодированные обходы, атаки через Unicode-нормализацию, инъекции обратных слэшей, манипуляции с регистром путей — всё обрабатывается.
|
||
|
||
**Объяснение разрешений**: отдельный LLM-вызов объясняет пользователю риски инструмента перед одобрением. Когда Claude говорит «эта команда изменит ваш git config» — это объяснение само по себе сгенерировано Claude.
|
||
|
||
---
|
||
|
||
## Скрытые бета-заголовки и невыпущенные API-функции
|
||
|
||
Файл [`constants/betas.ts`](https://github.com/kuberwastaken/claude-code/blob/main/constants/betas.ts) раскрывает все бета-фичи, которые Claude Code запрашивает у API:
|
||
|
||
```typescript
|
||
'interleaved-thinking-2025-05-14' // Расширенное мышление
|
||
'context-1m-2025-08-07' // Контекстное окно на 1М токенов
|
||
'structured-outputs-2025-12-15' // Структурированный формат вывода
|
||
'web-search-2025-03-05' // Веб-поиск
|
||
'advanced-tool-use-2025-11-20' // Продвинутое использование инструментов
|
||
'effort-2025-11-24' // Управление уровнем усилий
|
||
'task-budgets-2026-03-13' // Управление бюджетами задач
|
||
'prompt-caching-scope-2026-01-05' // Скоупинг кеша промптов
|
||
'fast-mode-2026-02-01' // Быстрый режим (Penguin)
|
||
'redact-thinking-2026-02-12' // Редактирование мышления
|
||
'token-efficient-tools-2026-03-28' // Токен-эффективные схемы инструментов
|
||
'afk-mode-2026-01-31' // AFK-режим
|
||
'cli-internal-2026-02-09' // Только для внутреннего использования (ant)
|
||
'advisor-tool-2026-03-01' // Инструмент-советник
|
||
'summarize-connector-text-2026-03-13' // Суммаризация текста коннекторов
|
||
```
|
||
|
||
`redact-thinking`, `afk-mode` и `advisor-tool` тоже пока не выпущены.
|
||
|
||
---
|
||
|
||
## Feature gating — внутренние и внешние сборки
|
||
|
||
Это одна из архитектурно самых интересных частей кодовой базы.
|
||
|
||
Claude Code использует **compile-time feature flags** через функцию `feature()` из `bun:bundle`. Бандлер **свёртывает константы** и **элиминирует мёртвый код** загейтованных ветвей из внешних сборок. Полный список известных флагов:
|
||
|
||
| Флаг | Что он закрывает |
|
||
|------|-----------------|
|
||
| `PROACTIVE` / `KAIROS` | Режим всегда включённого ассистента |
|
||
| `KAIROS_BRIEF` | Краткая команда |
|
||
| `BRIDGE_MODE` | Удалённое управление через claude.ai |
|
||
| `DAEMON` | Фоновый демон |
|
||
| `VOICE_MODE` | Голосовой ввод |
|
||
| `WORKFLOW_SCRIPTS` | Автоматизация воркфлоу |
|
||
| `COORDINATOR_MODE` | Мультиагентная оркестрация |
|
||
| `TRANSCRIPT_CLASSIFIER` | AFK-режим (ML-автоодобрение) |
|
||
| `BUDDY` | Система питомца-компаньона |
|
||
| `NATIVE_CLIENT_ATTESTATION` | Аттестация клиента |
|
||
| `HISTORY_SNIP` | Обрезка истории |
|
||
| `EXPERIMENTAL_SKILL_SEARCH` | Обнаружение навыков |
|
||
|
||
Дополнительно `USER_TYPE === 'ant'` закрывает функции для внутреннего использования Anthropic: доступ к staging API (`claude-ai.staging.ant.dev`), внутренние бета-заголовки, режим прикрытия, команду `/security-review`, `ConfigTool`, `TungstenTool` и дамп промптов в `~/.config/claude/dump-prompts/`.
|
||
|
||
Рантайм feature gating обслуживает **GrowthBook** с агрессивно кешированными значениями. Feature flags с префиксом `tengu_` управляют всем — от быстрого режима до консолидации памяти. Многие проверки используют `getFeatureValue_CACHED_MAY_BE_STALE()`, чтобы не блокировать основной цикл — устаревшие данные считаются допустимыми для feature gates.
|
||
|
||
---
|
||
|
||
## Другие примечательные находки
|
||
|
||
### Upstream-прокси
|
||
Директория [`upstreamproxy/`](https://github.com/kuberwastaken/claude-code/tree/main/upstreamproxy) содержит контейнеро-ориентированное прокси-реле, которое использует **`prctl(PR_SET_DUMPABLE, 0)`** для предотвращения ptrace кучи от процессов с тем же UID. Оно читает сессионные токены из `/run/ccr/session_token` в CCR-контейнерах, загружает CA-сертификаты и запускает локальное CONNECT→WebSocket-реле. Anthropic API, GitHub, npmjs.org и pypi.org явно исключены из проксирования.
|
||
|
||
### Bridge Mode
|
||
JWT-аутентифицированная bridge-система в [`bridge/`](https://github.com/kuberwastaken/claude-code/tree/main/bridge) для интеграции с claude.ai. Поддерживает рабочие режимы: `'single-session'` | `'worktree'` | `'same-dir'`. Включает токены доверенных устройств для повышенных уровней безопасности.
|
||
|
||
### Кодовые имена моделей в миграциях
|
||
Директория [`migrations/`](https://github.com/kuberwastaken/claude-code/tree/main/migrations) раскрывает историю внутренних кодовых имён:
|
||
- `migrateFennecToOpus` — **«Fennec»** (лиса фенек) было кодовым именем Opus
|
||
- `migrateSonnet1mToSonnet45` — Sonnet с 1М контекстом стал Sonnet 4.5
|
||
- `migrateSonnet45ToSonnet46` — Sonnet 4.5 → Sonnet 4.6
|
||
- `resetProToOpusDefault` — Pro-пользователей в какой-то момент переключили на Opus по умолчанию
|
||
|
||
### Заголовок атрибуции
|
||
Каждый API-запрос включает:
|
||
```
|
||
x-anthropic-billing-header: cc_version={VERSION}.{FINGERPRINT};
|
||
cc_entrypoint={ENTRYPOINT}; cch={ATTESTATION_PLACEHOLDER}; cc_workload={WORKLOAD};
|
||
```
|
||
Фича `NATIVE_CLIENT_ATTESTATION` позволяет HTTP-стеку Bun перезаписать плейсхолдер `cch=00000` вычисленным хешем — по сути, это проверка подлинности клиента, чтобы Anthropic мог убедиться, что запрос пришёл от настоящей установки Claude Code.
|
||
|
||
### Computer Use — «Chicago»
|
||
Claude Code включает полноценную реализацию Computer Use, внутреннее кодовое имя **«Chicago»**, построенную на `@ant/computer-use-mcp`. Предоставляет захват экрана, ввод кликов/клавиш и преобразование координат. Доступна только для подписок Max/Pro (с обходом для внутренних пользователей Anthropic).
|
||
|
||
### Ценообразование
|
||
Для интересующихся — все цены в [`utils/modelCost.ts`](https://github.com/kuberwastaken/claude-code/blob/main/utils/modelCost.ts) полностью совпадают с [публичными ценами Anthropic](https://docs.anthropic.com/en/docs/about-claude/models). Ничего сенсационного.
|
||
|
||
---
|
||
|
||
## Заключительные мысли
|
||
|
||
Это, без преувеличения, один из самых полных взглядов на внутреннее устройство продакшн AI-ассистента для кодирования. Через реальный исходный код.
|
||
|
||
Несколько вещей бросаются в глаза:
|
||
|
||
**Инженерия впечатляет.** Это не проект выходного дня, обёрнутый в CLI. Мультиагентная координация, система снов, архитектура триггеров с тремя вентилями, compile-time элиминация фич — это глубоко продуманные системы.
|
||
|
||
**Впереди ещё очень много.** KAIROS (всегда включённый Claude), ULTRAPLAN (30-минутное удалённое планирование), компаньон Buddy, режим координатора, рои агентов, скрипты воркфлоу — кодовая база значительно опережает публичный релиз. Большинство из этого спрятано за feature gates и невидимо во внешних сборках.
|
||
|
||
**Внутренняя культура видна.** Кодовые имена-животные (Tengu, Fennec, Capybara), игривые названия фич (Penguin Mode, Dream System), система тамагочи-питомца с гача-механикой. Кому-то в Anthropic определённо весело.
|
||
|
||
Если есть один вывод из всего этого — безопасность это сложно. А `.npmignore`, похоже, ещё сложнее.
|