Реестр ведёт сам сервер приложения: он слушает сессии агентов и привязывает ключ из промпта к конкретной сессии сабагента. Приложение этот список только показывает и отправляет серверу команду «продолжи».
Возможности
- Шапка
y83@tasks :~$и строка вида3 tasks · serve up: сколько задач загружено и отвечает ли сервер сессий. - Кнопка Refresh и потянуть список вниз делают одно и то же.
- Меню «⋮» с единственным пунктом Rescan registry — перечитать сессии у сервера заново, когда задача точно есть, но в списке её не видно.
- Пять чипов-фильтров: All, Running, Completed, Error, Aborted. Фильтр уходит на сервер, а не режется на телефоне.
- Сортировка: новые сверху, по времени появления задачи.
- Карточка задачи: точка статуса, ключ моноширинным шрифтом, «сколько назад», название, строка
агент · статус · attempt Nи текст ошибки красным. - Нажатие на карточку открывает диалог Resume: ключ, сессия, статус, число попыток, текст ошибки и поле для сообщения.
- Плашки внизу экрана:
Registry refreshedпосле перечитывания иResumed <ключ> · attempt Nпосле продолжения. - Пустое состояние объясняет, как задача попадает в реестр, и предлагает перечитать реестр.
- Цвет точки статуса: running — зелёный, error и aborted — красный, остальное — серый.
Технические данные
| Параметр | Значение |
|---|---|
| Где живёт реестр | в памяти сервера приложения, в базу не пишется |
| Кто наполняет | события сервера сессий и обход списка сессий |
| Показывает сервер сессий | opencode serve |
| Состояния сервера сессий | up, down, unknown |
| Статусы задачи | running, completed, error, aborted, unknown |
| Фильтров статуса | 5 |
| Задач на экране | 50 |
| Максимум в одном ответе | 200 |
| Обход сессий по расписанию | каждые 45 секунд |
| Порог «завис в работе» | 15 минут тишины |
| Порог «сессия пропала» | 3 проверки подряд |
| Родителей за один обход | 30, остальные пропускаются |
| Таймаут запросов к серверу сессий | 10 секунд |
| Ожидание ответа Resume в приложении | 30 секунд |
| Ожидание ответа Resume на сервере | без ограничения |
| Повторный Rescan | не чаще одного раза в 5 секунд |
| Формат времени | just now, 5m ago, 2h ago, 3d ago |
| Шрифт ключа и статусной строки | моноширинный |
| Язык надписей | английский, кроме двух русских строк |
Общее число задач сервер отдаёт, но экран его не показывает: в шапке видно только то, что загрузилось. Если в реестре больше 50 задач, шапка напишет «50 tasks», а остальные будут не видны.
Ключ задачи
Задача попадает в реестр только если строка «Задача <ключ>: …» стоит в самом начале — либо названия сессии сабагента, либо промпта, с которым родитель её запустил. Проверка строгая: между словом «Задача» и ключом должен быть пробел, а ключ идёт до двоеточия, поэтому самого двоеточия в нём быть не может.
Название сессии проверяется первым, промпт родителя — вторым. Если ключа нет ни там, ни там, сессия в реестр не попадает вообще, и никакой ошибки не будет — просто не будет задачи.
Откуда берётся статус
Статус задачи берётся из части задачи, с которой родитель её запускал:
| Состояние части задачи | Статус в реестре |
|---|---|
| pending | running |
| running | running |
| completed | completed |
| error | error |
| части задачи нет | unknown |
Из-за этого «ещё не началось» и «идёт» неразличимы: и то и другое показывается как running.
Два состояния сервер ставит сам, когда что-то идёт не так:
| Текст ошибки | Что случилось |
|---|---|
session lost (serve) | сессии больше нет у сервера, три проверки подряд |
stuck busy (opencode #6573) | сабагент висит занятым дольше 15 минут |
Статусы не откатываются: завершённая задача не вернётся в работу, даже если её снова попросить продолжить. Счётчик попыток при этом продолжает расти.
Что делает Resume
Запрос идёт по ключу, а не по номеру сессии: сессию подставляет сервер из реестра. Поэтому «продолжить» всегда пишет в ту сессию, которая сейчас за этой задачей, даже если номер сессии на экране устарел.
На сервере собирается сообщение «Продолжай задачу <ключ>. <текст из поля>» и уходит в сессию сабагента обычным сообщением. Текст из поля можно стереть, тогда уйдёт только первая часть фразы.
Два продолжения одного ключа не выполнятся одновременно: на ключ вешается отдельная блокировка, второе дождётся первого.
Сервер ждёт ответа сессии без ограничения, а телефон — не больше 30 секунд. Если сабагент думает дольше, экран покажет ошибку, хотя сообщение до сессии дойдёт и работа продолжится.
Что агент умеет
В исходном коде сервера есть два инструмента под этот реестр:
task_status— задачи из реестра с ключом, сессией, агентом, статусом и временем. Умеет искать по ключу и читать постранично курсором, по умолчанию отдаёт 50 записей, максимум 200.task_resume— продолжить задачу по ключу.
Но в чате с Codex агент этих инструментов не получает: у профиля Codex свой зашитый список разрешённых инструментов, и задачи в него не входят. Проверено на живом сервере: в полном профиле MCP оба инструмента есть, в профиле Codex — нет.
У task_resume текст не свой: сервер отправляет сабагенту фиксированное «Отчитайся по критериям.». Свой текст умеет отправлять только экран. Если реестр на сервере не инициализирован, оба инструмента отвечают ошибкой и ничего не делают.
Вместо инструментов агент может взять тот же реестр обычными запросами: список задач, продолжение по ключу и перечитывание реестра. Открыть сам экран тоже можно командой моста открытия экрана с именем tasks.
Ограничения
- Реестр живёт в памяти: перезапуск сервера приложения его стирает. Задачи появятся снова после следующего обхода сессий, но счётчики попыток начнутся с нуля.
- На экране 50 задач, пролистать дальше нельзя — пагинации на экране нет.
- Если под фильтром ничего не нашлось, показывается пустое состояние с текстом «в реестре нет задач» и кнопкой перечитывания. Задачи в реестре при этом есть — просто других статусов.
- Пустое состояние показывается всегда, когда список пуст, — даже если сервер сессий не отвечает и данные в шапке устаревшие. Смотреть надо на строку serve.
- Подписи «сколько назад» не тикают сами: они пересчитываются только когда список обновился.
- Выбранный фильтр не переживает уход с экрана: вернулись — снова All.
- Если сервер сессий не отвечает, данные в списке старые, а Resume вернёт ошибку «сервер сессий недоступен».
- Обход ограничен 30 родительскими сессиями: при широком ветвлении часть задач в реестр не попадёт.
- Повторное нажатие Rescan чаще раза в 5 секунд возвращает ошибку «слишком часто».
- Английский на экране не переводится, и только две строки русские: подсказка в пустом состоянии и текст, подставленный в поле сообщения по умолчанию.