Repository navigation
chats:* — чаты проекта, задачи и произвольные чаты: URL, история периода и отправка #180
Description
Результат и JTBD
Дать агенту единый публичный CLI для чтения и отправки сообщений в общий чат проекта, чат задачи и произвольный доступный чат. Основная точка входа — URL из интерфейса Битрикс24; дополнительно явный идентификатор и поиск по названию.
CHAT-01 — Получить контекст за период. Когда возвращаюсь к работе, хочу попросить: «Посмотри в чате проекта, что было за прошлый день, дай саммари». Успех: агент получает сообщения нужного чата за вчерашний календарный день в выбранной timezone, с авторами, временем, ID и признаком полноты; саммари содержит решения, договорённости, вопросы и ссылки/ID исходных сообщений.
CHAT-02 — Сообщить команде. Когда меняется моя доступность, хочу попросить: «Напиши в чат „Название чата“, что я сегодня отсутствую». Успех: выбран однозначный доступный адресат, отправлено одно сообщение, возвращены подтверждение и ID; при нескольких совпадениях агент уточняет выбор до записи.
CLI разрешает адресата, читает историю и отправляет текст. Смысловое саммари составляет вызывающий агент/skill; встроенный LLM и автоматическая рассылка в эту задачу не входят.
Что есть сейчас
Проверено 30.10.2026 по dev 787770ee3c1b596df8ccde4bf6e984cee46c34ef, исходникам и каталогу 25 JTBD.
| Потребность | Текущее покрытие |
|---|---|
| История и отправка в чат задачи по TASK_ID | Есть task:chat:list, task:chat:send; также update/delete |
| Переписка для координации / клиентских договорённостей / исполнения | PM-06, AM-06, EMP-07 покрывают чтение/отправку именно в чат задачи; полная бизнес-переписка не доказана одним командным тестом |
| Сообщить о препятствии | PM-03, EMP-03 используют task:chat:send; управление препятствием остаётся планом |
| Сводка | AM-03 частично: status durations и недельный task:report; PM-09 / #168 — четыре показателя задач, не саммари переписки |
| Чат проекта, произвольный чат, URL → адресат, поиск по названию | Публичных команд нет |
| История за календарный день | Нет date/timezone-фильтра чата; before/after — ID сообщений, не даты |
| Непрочитанные / упоминания | Отдельное открытое #148; не подменять этим чтение за период |
Наличие исходников и integration cases не является новой live-приёмкой. Существующий task:chat:list читает task → chat через REST3 и im.dialog.messages.get REST1; task:chat:send использует tasks.task.chat.message.send REST3.
Область работ
- URL → типизированный адресат. Поддержать проверенные формы ссылок на чат, задачу и общий чат проекта. Отличать taskId, groupId, chatId, dialogId и messageId; не считать groupId/taskId ID чата. Ссылка на сообщение выбирает чат, а не ограничивает период одним сообщением. Сверять портал с выбранным подключением; разбирать ссылку локально, без HTTP-перехода по пользовательскому URL.
- Три контекста. Общий чат проекта не равен совокупности чатов его задач. Для задачи проверять связь task → chat; для проекта сохранять контекст
sg<GROUP_ID>; произвольный групповой чат адресоватьchat<CHAT_ID>. Личный диалог можно поддержать только как явно типизированный dialogId, без неоднозначного bare numeric ID. - Поиск по названию. Искать среди доступных чатов, показывать ID/название/контекст. Ноль результатов, несколько совпадений и неполная выборка — отдельные исходы; запрещено молча отправлять в первый результат. Для записи разрешён только подтверждённый однозначный адресат.
- Чтение периода. Точные from/to и
yesterdayс IANA timezone; интервал [from,to), один now на операцию, DST и границы дат. Пагинация по ID, дедупликация, конечный бюджет, стабильная хронология. Полнота доказывается достижением границы периода/конца доступной истории; лимит, сбой и нарушение пагинации дают partial, а не «в чате ничего не было». - Отправка. Текст/файл/stdin, dry-run с адресатом и текстом, подтверждённый результат и ID сообщения. Неизвестный исход запроса сохраняется как outcomeUnknown; автоматический повтор записи запрещён. Реальный чат в рамках постановки не менять.
- Контракт агента. Human/plain/JSON, данные авторов/времени/ID, период/timezone и полнота; проверяемая привязка ответа к адресату. Обновить CLI map, scope docs, каталог JTBD и командные проверки при реализации. Сохранить нынешние task:chat:* и их проверку связи с задачей.
Публичный namespace
Зафиксирован самостоятельный chats:* для работы с чатами без обязательной привязки к задаче или проекту:
chats:resolve— URL/типизированный ID → проверенный адресат.chats:find— поиск доступных чатов по названию.chats:messages:list— сообщения выбранного чата за период.chats:send— отправка текста по однозначному адресату.
Обычный групповой чат не требует TASK_ID/GROUP_ID. Ссылки на проект или задачу дополнительно разрешают адресат в том же namespace. Существующие task:chat:* сохраняют работу через TASK_ID. Общий namespace chat:* не вводится. ID чата chat123, REST-методы и имена API-полей не переименовываются.
API и ограничения
Официальный MCP Bitrix24 проверен 30.10.2026 (search → details):
- im.dialog.get: scope
im;DIALOG_IDstring (chatXXX,sgXXX) для получения metadata адресата. - im.dialog.messages.get: scope
im;DIALOG_IDstring (chatXXX,sgXXX, ID пользователя личного диалога);LAST_ID/FIRST_IDinteger;LIMITinteger, максимум 50. Параметров даты нет: период выделяет CLI при ограниченном обходе. - im.message.add: scope
im;DIALOG_IDstring,MESSAGEstring; результат — integer ID сообщения. - im.search.chat.list: scope
im;FINDstring минимум 2 символа;OFFSET/LIMITinteger, максимум 50; учитывать next/total. Поиск также индексирует участников, поэтому выдача не равна точному совпадению названия. - im.chat.get:
ENTITY_TYPE/ENTITY_IDstring; поддерживаетSONET_GROUP,TASKS_TASK,TASKS, возвращает объект сIDлибо null. Не угадывать формат ENTITY_ID для нового fallback: основной проектный адресат — документированный sgXXX.
Это проверка документации; конкретные URL-формы и поведение портала требуют обезличенных fixtures и отдельной live-приёмки. Не добавлять REST3-алиасы к REST1 payload. Новые IM-маршруты объявить в route policy и scope guard; strict-rest3 отклоняет их до подключения. Ошибку доступа не выдавать за пустую историю. Чтение не должно помечать сообщения прочитанными или подписывать пользователя на чат.
Связанные issues
- Нет доступа к признаку непрочитанных сообщений чата задачи (бейдж «@» в списке задач) #148 — непрочитанные/упоминания чата задачи, отдельная семантика; можно разделить низкоуровневый adapter, не расширять это issue до счётчиков.
- Документировать требуемые разрешения (scope) вебхука для всех сценариев CLI #178 — документация scope; согласовать новую матрицу.
- Расширить относительные даты: назначение сроков, дополнительные периоды и фильтры создания/завершения #141 — относительные даты задач; переиспользовать общий resolver при наличии, но не блокировать базовый период сообщений его завершением.
- Недельный отчёт по проекту с четырьмя показателями (PM-09) #168 — недельные показатели задач / PM-09; не покрывает саммари чата.
- Исследовать готовые CLI/MCP Bitrix24 и спроектировать поверхность команд задач #10 (закрыто) — исходная поверхность task-команд и JTBD; новая возможность выходит за её task-only границы.
Критерии приёмки
- Есть OpenSpec proposal/design/spec/tasks и двусторонняя трассировка; контракт URL-форм и предлагаемых chats:* команд зафиксирован до runtime-кода.
- Для каждого из трёх контекстов проверены URL → правильный адресат, чтение и отправка; ID задачи/проекта/чата/сообщения не смешиваются.
- Неподдерживаемая ссылка, другой портал, отсутствие доступа, отсутствующий чат и неоднозначное название имеют явные исходы без записи не тому адресату.
- История за вчера проверена для timezone/DST, сообщений на обеих границах, >50 сообщений, пустого дня, бюджета и ошибок страниц; partial виден агенту.
- Поиск обходит страницы; совпадение по участнику не считается совпадением названия; неоднозначный/неполный поиск не запускает отправку.
- Dry-run не пишет; успешная отправка возвращает подтверждение/ID; неопределённый исход не вызывает повтор.
- Scope/route policy/strict-rest3, human/plain/JSON и сохранение существующих task:chat:* покрыты offline checks.
- JTBD/CLI map/scope docs обновлены с разделением runtime/offline/live; сквозная live-проверка на тестовых чатах подтверждает CHAT-01 и CHAT-02, включая чтение без смены read state.
- Change проверен и архивирован только после реализации/проверок; путь в issue обновлён.
OpenSpec
- Change:
add-unified-chat-access. - Путь:
openspec/changes/add-unified-chat-access/. - Область: разрешение URL/имени, чтение периода и отправка для проекта/задачи/доступного чата; новые JTBD CHAT-01/CHAT-02.
- Подготовлены proposal/design/spec/tasks; строгая проверка OpenSpec проходит, 4/4 planning artifacts готовы. Все 15 implementation/verification tasks остаются открытыми.
- Артефакты в ветке feature/180-unified-chat-access.
- Draft PR #181 в dev — план, JTBD и правило GitHub только через gh; runtime не изменён. Merge планирующего PR не закрывает это issue.
- Неподдержанный первый этап: личные диалоги; numeric user DIALOG_ID указан только как возможность API. Фокус — проект, задача и произвольный групповой чат.
Activity
docs: fix public chats namespace across plan (#180)
[-]Чаты проекта, задачи и произвольные чаты: вход по URL, история за период и отправка по названию[/-][+]chats:* — чаты проекта, задачи и произвольные чаты: URL, история периода и отправка[/+]