Skip to content

chats:* — чаты проекта, задачи и произвольные чаты: URL, история периода и отправка #180

Open

Description

@mesilov

Результат и 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.

Область работ

  1. URL → типизированный адресат. Поддержать проверенные формы ссылок на чат, задачу и общий чат проекта. Отличать taskId, groupId, chatId, dialogId и messageId; не считать groupId/taskId ID чата. Ссылка на сообщение выбирает чат, а не ограничивает период одним сообщением. Сверять портал с выбранным подключением; разбирать ссылку локально, без HTTP-перехода по пользовательскому URL.
  2. Три контекста. Общий чат проекта не равен совокупности чатов его задач. Для задачи проверять связь task → chat; для проекта сохранять контекст sg<GROUP_ID>; произвольный групповой чат адресовать chat<CHAT_ID>. Личный диалог можно поддержать только как явно типизированный dialogId, без неоднозначного bare numeric ID.
  3. Поиск по названию. Искать среди доступных чатов, показывать ID/название/контекст. Ноль результатов, несколько совпадений и неполная выборка — отдельные исходы; запрещено молча отправлять в первый результат. Для записи разрешён только подтверждённый однозначный адресат.
  4. Чтение периода. Точные from/to и yesterday с IANA timezone; интервал [from,to), один now на операцию, DST и границы дат. Пагинация по ID, дедупликация, конечный бюджет, стабильная хронология. Полнота доказывается достижением границы периода/конца доступной истории; лимит, сбой и нарушение пагинации дают partial, а не «в чате ничего не было».
  5. Отправка. Текст/файл/stdin, dry-run с адресатом и текстом, подтверждённый результат и ID сообщения. Неизвестный исход запроса сохраняется как outcomeUnknown; автоматический повтор записи запрещён. Реальный чат в рамках постановки не менять.
  6. Контракт агента. 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_ID string (chatXXX, sgXXX) для получения metadata адресата.
  • im.dialog.messages.get: scope im; DIALOG_ID string (chatXXX, sgXXX, ID пользователя личного диалога); LAST_ID/FIRST_ID integer; LIMIT integer, максимум 50. Параметров даты нет: период выделяет CLI при ограниченном обходе.
  • im.message.add: scope im; DIALOG_ID string, MESSAGE string; результат — integer ID сообщения.
  • im.search.chat.list: scope im; FIND string минимум 2 символа; OFFSET/LIMIT integer, максимум 50; учитывать next/total. Поиск также индексирует участников, поэтому выдача не равна точному совпадению названия.
  • im.chat.get: ENTITY_TYPE/ENTITY_ID string; поддерживает 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

Критерии приёмки

  • Есть 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

  1. added this to the 0.3.0 milestone on Oct 30, 2026
  2. changed the title [-]Чаты проекта, задачи и произвольные чаты: вход по URL, история за период и отправка по названию[/-] [+]chats:* — чаты проекта, задачи и произвольные чаты: URL, история периода и отправка[/+] on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions