snens

Конфиг

Один TOML: ~/.config/snens/config.toml (или --config, или SNENS_CONFIG). Нет файла — работают дефолты. Секретов в нём нет, они в .env рядом.

Правится тремя способами одинаково: рукой в редакторе, snens config ключ=значение, меню настроек поверхности. Ни один не переписывает файл целиком — остаются комментарии и чужие ключи.

Как читается

когда действуетчто это значит
следующий ходядро перечитывает файл перед каждым ходом; рестарт не нужен
новый запускзначение берётся при старте цикла (run, tui, запрос поверхности)
новый процесскаталоги и адреса фиксируются при загрузке: нужен рестарт сервиса

Файл сломан — ход не падает: остаётся снимок, прочитанный при старте процесса.

Провайдер

ключтипдефолтчто меняет
base_urlстрока—адрес OpenAI-совместимого API без /chat/completions
modelстрока—slug модели для запроса
key_envстрокаSNENS_API_KEYимя переменной с ключом
active_providerстрока—имя активного профиля из [providers.*]
subagent_modelстрока—модель подагентов; пусто — как основная
stream_usagebooltrueпросить провайдера присылать usage в стриме
body_patchтаблица{}произвольные поля в тело запроса
headersтаблица{}произвольные заголовки; сильнее дефолтов

base_url и model берутся заново перед каждым ходом. key_env — только при создании клиента (старт run/tui/новый запрос к сервису): смена имени переменной требует нового запуска. subagent_model — на новый запуск подагента. Подробности и профили — провайдеры.

Контекст

ключтипдефолтчто меняет
ctx_windowцелое1000000окно модели в токенах
context_budgetцелое0порог уборки; 0 — авто по окну
context_targetцелое0цель после уборки; 0 — 70% бюджета
context_reserveцелое8192запас до предела окна (не больше ¼ окна)
keep_resultsцелое5сколько последних результатов уборка не трогает
max_result_charsцелое24000сколько символов результата инструмента доезжает до модели

[models.<префикс>] перебивает пороги для моделей по префиксу slug; побеждает самый длинный префикс:

[models.префикс-slug]
context_budget = 120000
context_target = 80000

Что именно обрезается — лимиты.

Процессы

ключтипдефолтчто меняет
max_turnsцелое200потолок ходов на запуск; 0 — без лимита
timeout_secondsцелое120таймаут одного run по умолчанию
max_process_charsцелое40000потолок вывода процесса до отправки модели
stream_idle_secondsцелое120сколько стрим может молчать между кадрами
reduce_outputbooltrueсокращать вывод shell-команд (ANSI, длинные строки, повторы)
shellмассив["sh","-c"], на Windows ["cmd","/C"]чем выполняется run
attachmentsbooltrueдавать инструментам канал вложений
max_attachment_bytesцелое33554432потолок одного вложения, байты
approval_timeout_secondsцелое300ожидание одобрения привилегированного действия; 0 — очередь выключена

Перечитываются на каждом ходу: max_turns, timeout_seconds, max_process_chars, stream_idle_seconds, reduce_output, attachments, approval_timeout_seconds. shell попадает в описания инструментов при старте цикла: его смена требует нового запуска run/tui или рестарта сервиса.

Каталоги

ключтипдефолтчто меняет
sessions_dirстрока<данные>/sessionsжурналы сессий; родитель этого каталога = каталог данных
tools_dirстрокаtools/ рядом с бинарником, иначе <данные>/toolsреестр инструментов
skills_dirстрока<данные>/skillsскиллы: подкаталог = скилл
tickets_dirстрока<данные>/ticketsтикеты инстанса
mail_dirстрока<данные>/mailящик подагентов
docs_urlстрокаhttps://snens.svuvi.ch/llm/index.txtссылка на документацию в системном промпте; пусто — без неё

Все пути понимают ~. Пять каталогов читаются при загрузке — их смена требует нового процесса; docs_url попадает в промпт новой сессии.

Ревью

ключтипдефолтчто меняет
review_min_turnsцелое20длина сессии, после которой запускается ревью
review_idle_secondsцелое600простой на поверхности перед авторевью; 0 — выключено
review_promptстрока—свой файл промпта ревью вместо встроенного

Память

Секция [memory]: канал долгой памяти как программа с argv-контрактом.

ключтипдефолтчто меняет
cmdстрокаmemoryимя программы в каталоге инструментов (или путь со слэшем)
enabledbooltrueмастер-выключатель: false — ни recall, ни retain не зовутся
recallстрокаalwaysкогда впрыскивать справку: always, session, off
retainbooltrueписать ход в банк памяти
timeout_secondsцелое60таймаут одного вызова памяти
tagмассив[]теги записи
snens memory                      # состояние
snens memory off recall session   # правка тех же ключей

Тумблеры действуют со следующего хода. Нет бинаря памяти — канала просто нет, это не ошибка.

Прочее

ключтипдефолтчто меняет
system_promptстрока—свой системный промпт вместо встроенного

system_prompt фиксируется в журнале при первом ходе сессии: его правка действует на новые сессии, старые продолжают со своим. Флаг instance_git разбирается конфигом, но в коде его никто не читает — полагаться на него не стоит.

Проверка

snens config                 # текущие значения правимых ключей и путь файла
snens config max_turns=100   # правка на ходу; печатает путь файла

snens config показывает только ключи, которые правятся на ходу. Остальные — в файле; список целиком — таблицы выше. На успехе печатается путь файла, на ошибке — ненулевой код и текст в stderr.