Перейти к содержимому

Права доступа

Waibee Code спрашивает подтверждение, прежде чем изменить файлы или выполнить команду. Как часто он спрашивает, зависит от режима прав. Инструменты только для чтения (Read, Grep, Glob, WebSearch, WebFetch) не требуют подтверждения ни в одном режиме. Читающие команды тоже: ls, cat, grep, git status и подобные выполняются сразу. Команда, которая пишет, спрашивает всегда, включая безобидную на вид с перенаправлением в файл; так же ведут себя команда, печатающая заданный вами токен, и find -exec, который запускает произвольную программу под видом поиска.

Режим Правки файлов Команды (Bash, REPL)
default спрашивает спрашивает, кроме читающих
accept-edits без вопроса спрашивает, кроме читающих
trust без вопроса без вопроса, кроме команд с высоким риском
bypass без вопроса без вопроса

Ни один режим не отключает две вещи:

  • Разрушительные команды отклоняются всегда. rm -rf /, find / -delete и любое другое удаление, цель которого не ограничена конкретным путём (rm -rf $D), скачивание с подачей в шелл (curl ... | sh), fork-бомба: такое агент не выполнит ни в одном режиме, и никакой список allow этого не изменит.
  • Команды с высоким риском спрашивают. sudo, curl, wget, ssh-keygen, подача файла в шелл без скачивания (base64 -d | sh), запись в файлы автозапуска оболочки, команда с именем программы из переменной: в default, accept-edits и trust на них будет вопрос, даже если режим обещает «не спрашивать». Обойти это можно только явным правилом в allow. В bypass они выполняются без вопроса.

Удаление по конкретному пути (rm -rf /tmp/build) к высокому риску не относится: в default и accept-edits на него будет вопрос, а в trust оно выполнится без вопроса.

Опасные MCP-инструменты (помеченные как dangerous) в trust спрашивают, а в default и accept-edits отклоняются.

В TUI режим переключается по кругу клавишей Shift+Tab: defaultaccept-editstrustbypass. Текущий режим виден в статус-баре и по глифу в строке ввода.

Переключение через Shift+Tab действует только на текущую сессию. Чтобы закрепить режим, задай его в settings.json (или через /settings):

{
"permissions": {
"mode": "default"
}
}

Допустимые значения: "default", "acceptEdits", "trust", "bypassPermissions". Режим trust в файле может сохраняться как "dontAsk" (это то же самое).

Точечные правила задаются регулярными выражениями:

{
"permissions": {
"mode": "default",
"allow": ["^git ", "^cargo "],
"deny": ["rm -rf", "sudo"]
}
}
  • deny блокирует совпавшие команды всегда, в любом режиме, включая bypass. Проверка идёт по каждой части составной команды отдельно, поэтому git status && sudo rm x не проскочит целиком.
  • allow автоматически одобряет совпавшие правки и команды там, где иначе был бы вопрос, включая команды с высоким риском. Одобрение не срабатывает, если в команде есть подстановки ($(...)) или другие подозрительные конструкции, а в составной команде должны совпасть все части.

Когда агент спрашивает, доступны варианты: разрешить один раз, разрешить на сессию, разрешить всегда (последнее сохраняется в settings.json, в permissions.allow). Для рискованных команд предлагается только разовое одобрение.

Права решают, выполнится ли команда. Песочница ограничивает то, что команда может сделать после запуска: ядро ОС не пропускает запись за пределы разрешённых мест. Это не контейнер, всё работает на твоей машине, и ограничивается только запись, а не чтение и не сеть.

Рабочий профиль один, workspace-write: команды пишут только в текущий проект, ~/.waibee, временные папки и кэши пакетных менеджеров. По умолчанию песочница выключена (off). Профили restricted и read-only пока не реализованы: агент с ними не запустится, а не подставит тихо более слабый.

/sandbox выбрать профиль
/sandbox workspace-write включить сразу

Выбор сохраняется в глобальный settings.json и действует для команд, запущенных с этого момента. То же настраивается вручную:

~/.waibee/settings.json
{
"sandbox": {
"profile": "workspace-write",
"allow_write": ["~/.gradle", "~/go/pkg/mod"],
"require": false
}
}

allow_write добавляет каталоги, куда писать разрешено: если сборка упирается в незнакомый кэш, отказ придёт с именем пути. require: true заставит агента не запускаться там, где песочницу обеспечить нельзя. Обеспечивают её Seatbelt на macOS и Landlock на Linux (ядро 5.13 и новее); на Windows механизма нет, агент предупредит при старте и продолжит без ограничения. На один запуск профиль закрепляется флагом --sandbox <профиль> или переменной WAIBEE_SANDBOX, и тогда /sandbox его не меняет. Текущее состояние видно в /status и /doctor.

Чего песочница не делает: она не мешает прочитать .env или домашний каталог и не ограничивает сеть. От случайной записи не туда она страхует, от враждебного кода нет. Там, где риск настоящий, работай в одноразовой копии или в контейнере CI.

waibee run работает в режиме trust, если в settings.json не задан другой: значение permissions.mode действует и в headless.

Вопрос задать некому, и агент его не пропускает, а ждёт ответа, которого не будет. Поэтому запуск на команде с высоким риском встанет до таймаута. Что с этим делать:

  • команды, которые нужны задаче, перечисли в allow;
  • либо поставь bypassPermissions, если запуск идёт в одноразовой копии или контейнере CI;
  • в любом случае задай таймаут шага, чтобы зависший запуск не держал раннер.

Списки deny и отказ на разрушительных командах действуют и здесь. Подробнее про запуск из скриптов: Headless-режим.