y83 code / справочник

Задачи

Экран показывает фоновые задачи — какие сабагенты работают, какие упали и почему — и позволяет продолжить прерванный прогон прямо из списка. Задачей здесь считается не пункт плана, а отдельная сессия сабагента, которую оркестратор запустил с промптом, начинающимся со строки «Задача <ключ>: …».

раздел
Подсистемы приложения
пунктов возможностей
22
источник
docs/about/tasks.md

Реестр ведёт сам сервер приложения: он слушает сессии агентов и привязывает ключ из промпта к конкретной сессии сабагента. Приложение этот список только показывает и отправляет серверу команду «продолжи».

Возможности

  • Шапка 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», а остальные будут не видны.

Ключ задачи

Задача попадает в реестр только если строка «Задача <ключ>: …» стоит в самом начале — либо названия сессии сабагента, либо промпта, с которым родитель её запустил. Проверка строгая: между словом «Задача» и ключом должен быть пробел, а ключ идёт до двоеточия, поэтому самого двоеточия в нём быть не может.

Название сессии проверяется первым, промпт родителя — вторым. Если ключа нет ни там, ни там, сессия в реестр не попадает вообще, и никакой ошибки не будет — просто не будет задачи.

Откуда берётся статус

Статус задачи берётся из части задачи, с которой родитель её запускал:

Состояние части задачиСтатус в реестре
pendingrunning
runningrunning
completedcompleted
errorerror
части задачи нет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 секунд возвращает ошибку «слишком часто».
  • Английский на экране не переводится, и только две строки русские: подсказка в пустом состоянии и текст, подставленный в поле сообщения по умолчанию.

Источник: docs/about/tasks.md. Страница собрана из документации проекта при сборке сайта — без пересказа.