Модуль code — работа с кодовой базой

🟢 Модуль даёт агенту доступ к коду проекта: чтение, создание и точечная правка файлов, обзор/поиск, запуск команд (сборка, тесты, git). В комплекте — готовый агент coder. Модуль dual-transport: один и тот же код работает как linked-крейт и как нативная DLL.

Что поставляет

Что Идентификатор Описание
Инструменты kind: read_file … run_command 6 операций над кодом проекта
Агент coder готовый кодовый агент с подключёнными инструментами
Настройка code/code_root корень проекта (проецируется в AGENT_OS_CODE_ROOT)

Модуль входит в набор по умолчанию (server.yaml → modules.enabled).

Инструменты

kind Назначение
read_file прочитать файл/диапазон строк
write_file создать новый файл (только создание)
edit_file точечная замена фрагмента (old_string → new_string)
list_files список файлов по glob
grep поиск по содержимому (regex)
run_command запуск команды в корне проекта

Инструменты не трогают ФС и процессы напрямую — они ходят через host-порты agent_os.Fs и agent_os.Process, поэтому песочница ядра применяется одинаково в обоих транспортах, а модуль объявляет соответствующие capabilities.

Корень проекта

Приоритет:

  1. root: в YAML инструмента (абсолютный или со ${VAR});
  2. template_vars[code_root] из контекста вызова — так каталог передаётся субагенту через params у subagent_tool (ключ настраивается полем root_var);
  3. AGENT_OS_CODE_ROOT (настройка code/code_root на странице Настройки);
  4. рабочий каталог сервера.

Все пути — относительные корня; абсолютные пути и .. отклоняются; выход за корень (в т.ч. через симлинки) запрещён. Дополнительно применяется песочница агента (read_roots/write_roots).

Правки — только точечные

edit_file заменяет уникальный фрагмент; файл целиком не перезаписывается. write_file — только создание (существующий файл не затирается).

run_command и безопасность

Команду выбирает LLM. Политика — в YAML инструмента:

deny:  [rm, sudo, shutdown]   # запрещённые программы/строки
# allow: [cargo, git, npm]    # если задан — разрешены только перечисленные
approval:                     # gate одобрения человека (ядро)
  required: true
  severity: high
  timeout_secs: 600
  on_timeout: deny
  action: "Выполнить команду: {{ input.command }}{% if input.args %} {{ input.args | join(' ') }}{% endif %}?"

Плюс жёсткий таймаут; в linked-сборке — лимиты kernel-песочницы (CPU/mem/procs/ fsize, kill дерева процессов). В DLL-сборке kernel-лимиты не применяются — защита сводится к approval + политике + таймауту.

Агент coder

Поставляется config-бандлом (agents/coder/) и загружается рядом с config/agents/ при включённом модуле. Объявляет tool_files для всех шести инструментов. Агент config/agents/coder (если есть) побеждает бандловый.

coder объявлен admin_only: true: взаимодействовать с ним может только админ (admin-токен или admin login-cookie), обычные и анонимные пользователи получают 403. Это защищает мощные инструменты (правка файлов, запуск команд). При выключенной аутентификации гейт открыт — задавайте server.yaml → auth.

Как модуль контрибутит

Модуль отдаёт по одному stable-объекту ToolEngine на каждый kind в реестр tool.engines и объявляет capabilities:

agent_os_sdk::declare_module!(
    CodeModule, "code", contribute, DOCS,
    capabilities = ["agent_os.Fs", "agent_os.Process"]
);