Модели
translate отправляет ячейку на естественном языке модели и не даёт ей никаких собственных инструментов.
В VS Code ROFL: Choose model задаёт rofl.model. По умолчанию Translate берёт языковую модель, которая у VS Code уже есть (например, от GitHub Copilot), иначе — консольную оболочку.
В командной строке rofl-nb models перечисляет оболочки и то, как каждая запускается. Выберите одну через --model NAME, а NAME:MODEL выбирает ещё и её модель:
rofl-nb translate file.rofl.md --model codex:gpt-5.5
claude, opencode и pi запускаются вовсе без инструментов. codex, copilot и hermes не умеют отключить все инструменты, поэтому они отвергаются, пока вы не зададите ROFL_NB_ALLOW_TOOLS=1. ROFL_NB_MODEL_CMD запускает любую команду, которая читает запрос со stdin.
Что читает модель
Прежде чем написать ячейку, модель может прочесть рабочую область блокнота. Она спрашивает строками, а translate на них отвечает: list <glob>, grep <regex> [<glob>], show <path>:<from>-<to> и ? <sentence>, на который отвечает блокнот.
Рабочая область — в VS Code это папка рабочей области, в которой лежит блокнот (если папка не открыта — собственная папка блокнота). В командной строке это папка, из которой вы запускаете, если блокнот в ней, иначе — собственная папка блокнота; --root DIR называет другую, в которой блокнот должен лежать. Ничего не читается, когда рабочая область — ваша домашняя папка, содержит её или является корнем файловой системы. VS Code запускает расширение только в доверенной рабочей области.
Читается каждый обычный файл рабочей области, кроме тех, что названы в её .gitignore, и кроме node_modules, .git, CVS, .svn, .hg, dist, build, out, target, .venv, venv, __pycache__, .cache, coverage, .next и .vscode-test на любой глубине. Git не нужен, и его не спрашивают: без untracked_by(git) то, что игнорирует только git (.git/info/exclude, .gitignore ниже верхней папки, ваши глобальные исключения), читается. Никогда не читается файл вне рабочей области, ссылка, ведущая из неё, и файлы после первых 50 000. Файлы, чьи имена похожи на секреты, исключаются: .env*, ключи и сертификаты (*.pem, *.key, *.p12, *.pfx, *.jks, *.asc, id_*), *credential*, *secret*, .npmrc, .netrc, .pgpass, .pypirc, .vault-token, kubeconfig, .kube/config, .docker/config.json, auth.json, service-account*.json, *.tfstate*, *.kdbx, .gnupg/ и истории командных оболочек. grep выполняется как git grep --no-index, если git установлен, иначе в отдельном процессе, который останавливается через 5 с. Не больше 6 раундов и 200 КБ (ROFL_NB_READ_ROUNDS, ROFL_NB_READ_BUDGET).
Сузить чтение: .rofl/read.rofl
Рабочая область может сузить то, что читается, файлом ROFL по пути .rofl/read.rofl, который выполняет тот же движок, что и блокнот. Он лежит в папке .rofl, чтобы у будущих настроек рабочей области было место, и это файл .rofl, чтобы редактор и линтер читали его как любой другой. Его факты:
read_prefix("src/"). -- читать только под этими (сколько угодно)
skip_prefix("src/gen/"). -- и никогда под этими
untracked_by(cvs). -- только то, что отслеживает CVS: cvs, git, none или command
Файл читается, когда для него выполняется readable(F). Поставляемые правила выводят это из file(F) (каждый файл из списка выше), префиксов и tracked(F) (того, что перечисляет система контроля версий), а файл может добавить свои:
owned("src/billing.ts", payments).
skipped(F) :- file(F), not owned(F, payments).
Это обычный Datalog: факты и правила над именами, строками и числами, со сравнениями (=, !=, <, ...). Терм, построенный из термов (g(X)), is и арифметика, перспектива или время отвергаются, так что правило не создаёт новых значений и всегда заканчивается.
Он может только сужать. Что бы его правила ни вывели, читается только файл из списка выше, так что он не вернёт секрет, пропущенную папку или файл снаружи. Префикс, который абсолютен или содержит .., отвергает весь файл; так же отвергается файл, который не загружается или чьи правила не заканчиваются (10 с, 512 МБ). Файлы, которые управляют чтением (.rofl/read.rofl, .gitignore, CVS/Entries, CVS/Entries.Log), должны быть обычными файлами внутри рабочей области, не ссылками, и не больше 1 МБ; любой другой отвергает рабочую область. Отвергнутый файл не читает ничего и говорит, почему: он никогда не откатывается к чтению всего подряд.
CVS. untracked_by(cvs). читает CVS/Entries каждой папки (у каждой подпапки свой) и читает только файлы, перечисленные там: не файл, которого в нём нет, не тот, чья ревизия начинается с - (удалён), и, как говорит CVS/Entries.Log, тот, что добавлен после (A), но не тот, что после удалён (R). Никакая команда не запускается.
-- .rofl/read.rofl, in a CVS checkout
untracked_by(cvs).
read_prefix("src/").
skip_prefix("src/generated/").
git. untracked_by(git). спрашивает у git ls-files, что git отслеживает. Это тот git, что найден в абсолютных папках PATH, никогда не тот, что в рабочей области, и он запускается с выключенными core.fsmonitor и хуками репозитория.
Всё остальное (svn, hg, ...): задайте команду, которая печатает отслеживаемые файлы по одному на строку, в собственных настройках: ROFL_NB_UNTRACKED_COMMAND в командной строке, rofl.untrackedCommand в пользовательских настройках VS Code. Потом напишите untracked_by(command). в рабочей области. Сама рабочая область команду назвать не может (untracked_command(...) отвергает файл): она приходит от того, кто клонировал репозиторий, а команда оттуда запустила бы их код на вашей машине. svn и hg не встроены.
О каждом чтении сообщается: Claude read: src/server.ts:240-280 · ….