Тема Одно приложение · две темы
Обзор Настройка сервера Шпаргалка по навигации

Документация · Шпаргалка по навигации

Каждая кнопка — и зачем она здесь.

У телефона нет ни клавиши Ctrl, ни Esc, ни Tab, ни колеса прокрутки, а экранная клавиатура закрывает половину того, что вы пришли прочитать. Панель клавиш — ответ на это. Эта страница — всё о ней: что делает каждый элемент, что вместо этого делает долгое нажатие и что означает оранжевый цвет.

Элементы ниже нарисованы ровно так, как их рисует приложение, в его тёмном облике. В светлой теме формы круглее, а оранжевый на оттенок теплее; ничего не смещается.

Панель клавиш

Два ряда под терминалом, всегда на месте. Верхний ряд — инструменты, нижний — клавиши.

Ctrl
Tab Esc
КлавишаНажатиеУдержание или долгое нажатие
Клавиши-стрелки. ↑ стоит в ряду инструментов прямо над ↓, в пределах одного движения большого пальца.Повтор, примерно восемнадцать раз в секунду после короткого удержания — чтобы пройти назад по истории оболочки или по длинной строке.
Выбрать изображение из галереи, загрузить его на сервер в ~/.cookbox/uploads и вставить путь в запрос.—
Вставить буфер обмена Android в сессию. Прямо сообщает, если буфер пуст или система отказала.Фиксирует на очистку — см. ниже.
Показать или убрать экранную клавиатуру.Переключает кнопку на диктовку — см. ниже.
CtrlВзвести Ctrl для следующей клавиши.—
TabTab.Фиксирует на ⇧Tab, пока вы снова не нажмёте долго.
Enter — что для агента означает отправить.Фиксирует на ⌥⏎: перевод строки, который не отправляет.
EscEscape. Прерывает ход Claude Code, выходит из режима вставки в редакторе.—

Что означает оранжевый

Клавиша становится оранжевой, когда она взведена — когда сделает не то, что на ней написано, или когда работает какой-то режим. Больше ничего на панели не окрашивается, так что оранжевая клавиша — это всегда действующий режим, в котором вы находитесь и о котором могли забыть.

Ctrl Ctrl

Ctrl, взведён. Нажмите его, затем букву — получится ^C и подобные. На экранной клавиатуре нечего удерживать, поэтому модификатор фиксируется: его тратит первый же введённый символ, а на клавишах-стрелках он намеренно остаётся взведённым — именно это делает возможным второе нажатие ← или →, описанное ниже.

pu

Стрелки при взведённом Ctrl. ↑ и ↓ переименовываются в pu и pd — страница вверх и страница вниз — чтобы вы видели, во что Ctrl их превратил, прежде чем нажать. ← и → сохраняют свои стрелки и становятся «слово влево» и «слово вправо»; нажмите одну и ту же дважды примерно за полсекунды — и курсор уйдёт в начало или конец строки. Для ↑/↓ такого усиления намеренно нет: пролистать две страницы вверх — совершенно обычное дело, и это не должно уносить в начало буфера.

Tab ⇧Tab

Обратный Tab, зафиксирован. Нажмите Tab долго — надпись сменится на ⇧Tab и останется такой: в любом TUI, где перебирается выбор, это настоящая клавиша, а на телефоне её больше негде разместить. Долгое нажатие ещё раз возвращает обратно.

⌥

Enter, который не отправляет. Агенты читают Enter как «отправить сейчас», поэтому для второй строки запроса нужна другая клавиша. Долгое нажатие на Enter фиксирует ⌥⏎; маленький ⌥ в углу нужен, чтобы фиксация, оставленная на ночь, была заметна до того, как съест ваше следующее сообщение.

Вставка, зафиксированная на очистку. Нажмите «вставить» долго — и она станет клавишей очистки: одно нажатие выбрасывает строку, которую вы набираете. Она шлёт ^E, затем ^U — в конец строки, затем удалить назад до начала — так что строка уходит целиком, где бы ни стоял курсор, и в оболочке, и в любом агенте. Ни одна из двух половин ничего не прерывает, так что уже идущий ход не трогается; этим она и отличается от ^C. На запрос из нескольких строк нужно по одному нажатию на строку.

Экранная клавиатура. Оранжевая, пока клавиатура поднята. Это единственный элемент, который её вызывает — всё остальное, включая нажатие на терминал, намеренно её не трогает, чтобы клавиатура не закрыла текст, который вы читаете.

Диктовка. Нажмите клавишу клавиатуры долго — она станет микрофоном. Нажатие начинает слушать — оранжевый означает, что телефон вас записывает — повторное нажатие останавливает. Слова попадают в запрос по мере распознавания. Долгое нажатие ещё раз возвращает клавиатуру.

Жесты на терминале

ЖестЧто делаетПочему именно он
Смахивание вверх / внизПрокрутка — см. следующий раздел, потому что это единственное, что устроено не везде одинаково.Очевидный жест для очевидной задачи.
Одиночное нажатиеПереставить курсор туда, куда вы нажали — но только вдоль той строки, на которой он уже стоит, включая перенесённые части. В любом другом месте не делает ничего.Быстрее, чем удерживать стрелку. Только по горизонтали — потому что Вверх в оболочке это предыдущая команда, а не перемещение курсора: нажатие двумя строками выше молча выбросило бы набранное. Терминал — это сетка ячеек, и ничто в ней не говорит, какие из них составляют редактируемую строку, так что строка самого курсора — единственный честный ответ.
Двойное нажатиеПоказать или убрать клавиатуру.Одиночным нажатием снимается выделение. Клавиатура, появляющаяся по одиночному нажатию, закрыла бы текст, который вы только что нажали, чтобы прочитать.
Долгое нажатиеВыделить слово под пальцем; продолжая вести, можно расширить выделение в любую сторону. Отпускание копирует его.Выделение должно быть намеренным. Движение, начавшееся раньше, чем нажатие распознано, считается смахиванием.
ЩипокИзменить размер текста терминала, 8–22 пикселя.Это то же значение, что и Размер терминала в настройках — задавайте любым способом, они остаются согласованными.

Прокрутка, которая устроена не везде одинаково

На телефоне нет буфера прокрутки, который можно было бы двигать: терминал, на который вы смотрите, — это живой экран машины где-то ещё, и что означает «вверх», зависит от того, кто его рисует. Cookbox смотрит, что в панели, и выбирает:

Что в панелиСмахивание посылаетЧто вы видите
Что угодно в zellij — агент, vim, htop, обычная оболочкаЭкран щелчков колеса мыши, в ячейке под вашим пальцем.Zellij прокручивает буфер этой панели — или передаёт щелчок полноэкранной программе, которая запросила мышь, и та прокручивает себя сама. Решает zellij, потому что именно он это знает. Агенты не исключение: ни один из трёх не листает себя сам, и обращаться с ними так, будто листает, — значит получить смахивание, которое ничего не делает.
Полноэкранный TUI в tmuxPageUp / PageDown, прямо программе.Собственная история программы. Мышь в tmux выключена, если вы её не включали, так что выбирать приходится этой стороне.
Обычная оболочка в tmuxCtrl-B [ для входа в режим копирования, затем листание.Буфер прокрутки мультиплексора. Режим заканчивается сам, как только вы начнёте печатать.

Панель остаётся там, где вы её оставили прокрученной, и единственное, что возвращает её к живому экрану, — нажатие клавиши; поэтому открытие сессии само возвращает её вниз. Без этого сессия, оставленная прокрученной к началу истории, там и откроется, а смахивание назад не сделает ничего, пока вы не нажмёте клавишу, — и выглядит это в точности как сломанное смахивание.

Одно смахиванием не достать: программа, работающая на альтернативном экране, вообще не оставляет истории в мультиплексоре, так что прокручивать там нечего. Это свойство программы, а не Cookbox — обычный случай это TUI Codex, и в его собственном трекере есть запрос рисовать вывод в общий поток.

Взведённый Ctrl вместе с ↑/↓ посылает PageUp/PageDown независимо от того, что в панели, — на случай, если нажать клавишу удобнее, чем смахнуть, и это способ добраться до листания программы, у которой оно своё. Выходить из режима копирования tmux вручную никогда не нужно: первая же нажатая клавиша его завершает, потому что оболочка, молча проглатывающая вашу команду, — ошибка хуже, чем оставленный открытым буфер прокрутки. У zellij режима, из которого надо выходить, нет вовсе.

Голос: диктовка и записи

Две разные вещи, в двух разных местах.

Диктовка, внутри терминала

Нажмите долго, чтобы превратить её в , нажмите, чтобы слушать, нажмите ещё раз, чтобы остановить. Это собственное распознавание речи Android, так что расшифровка — та, которую выдаёт служба на вашем телефоне; в Cookbox ничего не отправляется. Годится для фразы-указания; не для абзаца размышлений вслух.

Записи, с экрана сессий

Кнопка в нижней панели списка сессий открывает диктофон — он как раз для абзаца размышлений вслух.

  • Записать, затем назвать файл. Записи — это .m4a, они хранятся на телефоне в Музыке, в папке, заданной в настройках, и остаются там, пока вы их не удалите.
  • Выберите, что агент должен с ней сделать — расшифровать, кратко изложить, копнуть глубже, начать готовить — и добавьте уточняющий запрос, если галочки этого не говорят.
  • Выберите целевую сессию и отправьте. Аудио загружается на сервер и передаётся агенту; сессия Claude Code или Codex примет его, другие агенты — нет, поэтому в списке появляются только те, кто может.
  • Предел — 24 МБ на запись, примерно час речи.

Просмотр: порты и проброс

Просмотр — это ответ на вопрос «дев-сервер запущен, и что теперь». Он перечисляет TCP-порты, которые действительно слушают на сервере, вместе с процессом, который держит каждый.

  • Нажмите порт, чтобы пробросить его через уже открытое SSH-соединение. Никаких изменений в брандмауэре и ничего не опубликовано — туннель существует, только пока его держит приложение.
  • Нажмите ещё раз, чтобы открыть его — в приложении или в браузере телефона. Просмотр внутри приложения — это iframe без собственной истории, поэтому всему, что по-настоящему переходит по ссылкам, нужен браузер.
  • Сохраните порт вместе с путём как избранное; в следующий раз он окажется наверху списка ещё до того, как порт будет обнаружен.
  • Кнопка остановки в строке закрывает этот проброс и не трогает саму сессию.

pm2

Если на сервере работает pm2, Просмотр сообщает об этом над портами одной строкой, которую можно прочитать не раскрывая: сколько приложений запущено, сколько нет, средняя загрузка против числа ядер, во что обходятся приложения pm2 вместе и сколько свободно на диске. Загрузка и диск — не от pm2, системных чисел у него нет: они приходят из /proc и df за тот же обмен с сервером.

  • Нажмите строку, чтобы раскрыть по строке на процесс: точка состояния, во что он обходится по процессору и памяти, сколько работает и сколько раз перезапускался. Убежавшее число перезапусков подсвечивается — именно оно говорит, что что-то тихо падает по кругу.
  • В каждой строке свои кнопки — перезапустить и остановить для работающего приложения, запустить для остановленного. Процесс адресуется по собственному id в pm2, а не по имени, потому что имена повторяются в разных пространствах имён и экземплярах кластера.
  • Панель обновляется, пока она на экране — раз в шесть секунд в раскрытом виде, реже в свёрнутом — и останавливается, когда вы уходите с экрана. Ничего не присылается само; одно измерение — это один обмен с сервером, а обмен занимает около пятой доли секунды и четверти килобайта.
  • Ничто здесь не запускает демон pm2. Любая команда pm2 запускает его, если он не работает, поэтому Cookbox вместо этого читает pid-файл демона и обращается к pm2 только тогда, когда там указан живой процесс. Сервер с установленным pm2 и ничем запущенным так и скажет и не предложит кнопок.
  • По каналу проходит восемь чисел на процесс. pm2 jlist возвращает полное окружение каждого приложения — десятки килобайт, и там же живут секреты сервера — поэтому вывод сокращается на сервере, а остальное его не покидает.
  • pm2 работает отдельно для каждого пользователя. Вы видите демон той учётной записи, под которой входите, а не все pm2 на машине.

Файлы

  • Кнопка папки открывает файлы сервера — из терминала она начинает с рабочего каталога этой сессии, из Просмотра — с домашнего каталога пользователя SSH.
  • Значок в каждой строке говорит, что это за файл — страница, картинка, видео, заметка, архив — потому что длинное имя теряет расширение в многоточии задолго до того, как вы успеете его прочитать.
  • Текстовые файлы показываются на месте, только для чтения, первые 256 КБ. Всё остальное — PDF, изображение, архив — предлагает Открыть в другом приложении: Cookbox скачивает файл (до 25 МБ) и передаёт его тому, что на телефоне открывает такой тип. Просмотрщика PDF нет ни в Cookbox, ни в webview, в котором он рисует, так что собственный просмотрщик телефона — честный ответ.
  • Кнопка с галочкой превращает список в выбор: нажимайте строки, включая папки, затем Скачать. Один файл приходит как есть, без сжатия — сжимать единственный файл значит лишь добавить ожидание и шаг распаковки. Папка или несколько объектов сразу приходят одним .zip, собранным на сервере и отданным потоком, так что там ничего не записывается и убирать нечего. Сервер, где нет ни zip, ни python3, откатывается к .tar.gz, для которого Android нужно отдельное приложение.
  • Загрузка отсчитывается на полосе над списком, пока идёт. Полоса не заполняется до процента, потому что заполняться не к чему: архив собирается по мере отправки. Всё попадает в Загрузки самого телефона, где переживёт приложение, а имя, под которым файл лёг, показано рядом с надписью Сохранено в Загрузки, с кнопкой папки, открывающей этот экран. Имя стоит прочитать: повторная загрузка той же папки переименовывается, а не перезаписывается, как это делает браузер. Потолок — 25 МБ на загрузку, с отказом, а не с обрезкой.

Панель над терминалом

ЭлементЧто делает
Назад к списку сессий. Сессия остаётся живой, и агент продолжает работать — это не способ из чего-либо выйти.
Чем занят агент: зелёный — работает, жёлтый — ждёт ответа от вас, серый — простаивает или неизвестно. Список сессий говорит то же самое словами.
Файлы, которые писала эта сессия, начиная с её собственного рабочего каталога.
Выход, открывающий три варианта: отсоединить других (сбросить с этой сессии остальных клиентов), отсоединить себя или закрыть сессию насовсем. Через шесть секунд всё складывается обратно в кнопку, потому что меню, заменившее собой кнопку, из которой появилось, не оставляет ничего для отмены.
mp / sshНа каком транспорте работает терминал. mp — это moshpit: локальное эхо, переживает смену сети; ssh означает откат и является фактом, а не неисправностью.