Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ jobs:
- name: Run checks
run: bun turbo check

- name: Docs & integrations markdown (Prettier + markdownlint)
# turbo's format:check only covers apps/docs; these repo-root docs and
# the n8n integration are otherwise unchecked and drift silently.
run: |
bun run check:docs-format
bun run check:markdown

- name: Generated files in sync with their sources
# Runs `turbo build` (cached when possible) and asserts that no
# tracked or untracked generator output diverges from what's
Expand Down
4 changes: 4 additions & 0 deletions .markdownlint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"default": true,
"MD013": false
}
10 changes: 10 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Root-level Prettier ignore — used by the repo-wide `check:format` / `format:docs`
# scripts (run from the repo root). apps/docs has its own .prettierignore.
# Only files matched by those scripts' globs are affected; everything else is
# formatted by each package's own tooling.
node_modules/
**/node_modules/

# Generated e2e artifacts (gitignored — absent in fresh clones, listed here so
# local runs skip them too).
integrations/n8n/e2e/
4 changes: 2 additions & 2 deletions apps/docs/components/mdx/mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -493,8 +493,8 @@ export async function ScopeRoles() {

// Update manually when a new product release goes out
const LATEST_PRODUCT_UPDATE = {
date: '18 июня 2026',
title: 'Кастомные темы пространства',
date: '20 июля 2026',
title: 'Треды стали самостоятельными',
};

export function ProductUpdatesLink() {
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/api/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ hideTableOfContents: true
## Тред

- [Новый тред](POST /messages/{id}/thread)
- [Новый самостоятельный тред](POST /threads)
- [Информация о треде](GET /threads/{id})
- [Список тредов](GET /threads)

Expand Down
5 changes: 3 additions & 2 deletions apps/docs/content/guides/ai-agents/interaction.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ related:
Агент получает события через [исходящий вебхук](/guides/webhook/overview) — упоминание по имени, ответ в тред или личное сообщение боту.
</Step>
<Step title="Сбор контекста">
Агент читает историю сообщений и информацию о чате, чтобы понять контекст запроса. Если бота вызвали в треде и других сообщений нет — основной контекст в родительском сообщении.
Агент читает историю сообщений и информацию о чате, чтобы понять контекст запроса. Если бота вызвали в треде и других сообщений нет — основной контекст в родительском сообщении. У самостоятельного треда родительского сообщения нет (`message_id` возвращается как `null`) — контекст только в сообщениях самого треда.

- [Список сообщений чата](GET /messages) — история сообщений треда или чата
- [Информация о сообщении](GET /messages/{id}) — родительское сообщение треда
Expand All @@ -28,7 +28,8 @@ related:
Агент выполняет нужные действия — отправляет сообщения, создаёт задачи, вызывает внешние сервисы. Реакция-индикатор показывает пользователю, что агент работает.

- [Новое сообщение](POST /messages) — отправить сообщение в канал или беседу
- [Новый тред](POST /messages/{id}/thread) — создать тред и ответить
- [Новый тред](POST /messages/{id}/thread) — создать тред у сообщения и ответить
- [Новый самостоятельный тред](POST /threads) — создать тред для диалога без привязки к сообщению
- [Новое напоминание](POST /tasks) — создать задачу из контекста разговора
- [Новая реакция](POST /messages/{id}/reactions) — поставить реакцию-индикатор
</Step>
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/guides/ai-agents/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ related:
- **Агент — участник команды** — действует как сотрудник: читает обсуждения, создаёт задачи, отправляет результаты. Ответственность остаётся за человеком, агент выполняет работу
- **[Треды](/guides/threads) как единица работы** — каждый тред изолирован, агент видит только его содержимое и отвечает туда же, не загрязняя общий чат
- **Сквозные треды** — упомяните любого сотрудника в треде, и он увидит весь контекст, даже если не состоит в исходном чате. Один тред — единая точка координации между людьми и агентом
- **Самостоятельные треды** — тред можно создать без привязки к чату: выделенное пространство для диалога с агентом, куда добавляют только нужных участников

<Info>Как мы сделали AI-агента, который живёт в корпоративном мессенджере — [читайте в блоге Пачки](https://pachca.com/blog/ai-agent-v-korporativnom-messendzhere)</Info>

Expand Down
2 changes: 1 addition & 1 deletion apps/docs/content/guides/cli/installation.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ pachca doctor
# ✔ Конфиг ~/.config/pachca/config.toml (права: 600)
# ✔ Профиль personal (user: Иван Иванов)
# ✔ Токен действителен (11 скоупов)
# ✔ CLI v2026.7.0 (актуальная версия)
# ✔ CLI v2026.7.1 (актуальная версия)
```

## Обновление
Expand Down
3 changes: 2 additions & 1 deletion apps/docs/content/guides/n8n/resources.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ related:
| 3 | [Chat Member](#chat-member) | 7 | Участники чата: добавление, удаление, роли, теги | да |
| 4 | [User](#user) | 10 | Сотрудники: CRUD, аватар, статус | |
| 5 | [Group Tag](#group-tag) | 6 | Теги сотрудников: CRUD, список пользователей | |
| 6 | [Thread](#thread) | 3 | Треды: создание, получение, список | |
| 6 | [Thread](#thread) | 4 | Треды: создание, получение, список | |
| 7 | [Reaction](#reaction) | 3 | Реакции: создание, удаление, список | |
| 8 | [Profile](#profile) | 6 | Мой профиль: информация, аватар, статус | |
| 9 | [OAuth](#oauth) | 1 | Информация о токене | да |
Expand Down Expand Up @@ -146,6 +146,7 @@ related:
| Операция | API |
|----------|-----|
| Create | [Новый тред](POST /messages/{id}/thread) |
| Create Standalone | [Новый самостоятельный тред](POST /threads) |
| Get | [Информация о треде](GET /threads/{id}) |
| Get Many | [Список тредов](GET /threads) |

Expand Down
77 changes: 43 additions & 34 deletions apps/docs/content/guides/threads.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Треды
description: "Треды в Пачке для разработчиков: сквозные треды как уникальная особенность, создание через POST /messages/{id}/thread, отправка комментариев, добавление участников, видимость родительского чата, нюансы API и поля Message.thread/root_chat_id"
description: "Треды в Пачке для разработчиков: сквозные и самостоятельные треды как уникальная особенность, создание у сообщения (POST /messages/{id}/thread) и без привязки к сообщению (POST /threads), отправка комментариев, добавление участников, видимость родительского чата, нюансы API и поля Message.thread/root_chat_id"
related:
- { path: /guides/bots/access#tredy, title: Доступы бота к чатам и сообщениям }
- { path: /guides/ai-agents/overview, title: AI-агенты }
Expand All @@ -10,7 +10,7 @@ related:

# Треды

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

## Сквозные треды

Expand All @@ -26,43 +26,52 @@ related:

## Работа с тредом

Тред создаётся и наполняется двумя последовательными вызовами: сначала сам тред у сообщения, затем сообщения-комментарии в его чат.
Тред создаётся одним из двух методов — у сообщения или самостоятельно, — а затем наполняется комментариями. Оба метода создания возвращают полную модель `Thread`, и дальнейшая работа с тредом одинакова.

<Steps>
<Step title="Создайте тред у сообщения">
Тред создаётся не в чате, а у конкретного сообщения — по его идентификатору. Метод идемпотентен: если у сообщения уже есть тред, в ответе вернётся существующий. Ответ содержит полную модель `Thread`.
### Тред у сообщения

<ApiCodeExample operationId="ThreadOperations_createThread" title="Создание треда" show="request" />
Тред создаётся у конкретного сообщения — по его идентификатору. Метод идемпотентен: если у сообщения уже есть тред, в ответе вернётся существующий.

<Info>
Тред нельзя создать у удалённого сообщения — метод вернёт `404 Not Found`. У сообщения, которое само находится в треде, тред тоже создать нельзя — будет `400 Bad Request`.
</Info>
</Step>
<Step title="Напишите комментарий в тред">
Комментарий в тред — это обычное сообщение через [Новое сообщение](POST /messages). Есть два равнозначных способа адресации.
<ApiCodeExample operationId="ThreadOperations_createThread" title="Создание треда" show="request" />

**Способ 1: через идентификатор треда** — `entity_type: "thread"` и `entity_id` равным `thread.id`.
<Info>
Тред нельзя создать у удалённого сообщения — метод вернёт `404 Not Found`. У сообщения, которое само находится в треде, тред тоже создать нельзя — будет `400 Bad Request`.
</Info>

### Самостоятельный тред

Самостоятельный тред не привязан к сообщению — его создают методом [Новый самостоятельный тред](POST /threads). Тело запроса не требуется, создатель треда становится его единственным участником, а поля `message_id` и `message_chat_id` в ответе возвращаются как `null`. Метод требует скоуп `threads:create`.

<ApiCodeExample operationId="ThreadOperations_createStandaloneThread" title="Создание самостоятельного треда" show="request" />

<Info>
В интерфейсе Пачки самостоятельный тред создаётся кнопкой «+» (или `Ctrl + O`) — как место для обсуждения, диалога с ИИ-агентом или звонка без отдельного чата. Через API это тот же объект `Thread`: добавляйте в него участников и пишите комментарии так же, как в тред у сообщения.
</Info>

### Комментарии в тред

Комментарий в тред — это обычное сообщение через [Новое сообщение](POST /messages). Есть два равнозначных способа адресации.

**Способ 1: через идентификатор треда** — `entity_type: "thread"` и `entity_id` равным `thread.id`.

```bash title="По thread.id"
pachca messages create \
--entity-type=thread \
--entity-id=265142 \
--content="Это первый комментарий в треде" \
--token YOUR_ACCESS_TOKEN
```
```bash title="По thread.id"
pachca messages create \
--entity-type=thread \
--entity-id=265142 \
--content="Это первый комментарий в треде" \
--token YOUR_ACCESS_TOKEN
```

**Способ 2: через идентификатор чата треда** — `entity_id` равным `thread.chat_id`, без `entity_type`. Чат треда — самостоятельный чат, и сообщение, отправленное в него, окажется в треде. Этот способ удобен, если в вашем коде уже есть общая логика отправки сообщений по `chat_id`.
**Способ 2: через идентификатор чата треда** — `entity_id` равным `thread.chat_id`, без `entity_type`. Чат треда — самостоятельный чат, и сообщение, отправленное в него, окажется в треде. Этот способ удобен, если в вашем коде уже есть общая логика отправки сообщений по `chat_id`.

```bash title="По thread.chat_id"
pachca messages create \
--entity-id=2637266155 \
--content="Это первый комментарий в треде" \
--token YOUR_ACCESS_TOKEN
```
```bash title="По thread.chat_id"
pachca messages create \
--entity-id=2637266155 \
--content="Это первый комментарий в треде" \
--token YOUR_ACCESS_TOKEN
```

Чтобы получить все комментарии треда — вызовите [Список сообщений чата](GET /messages) с `chat_id` равным `thread.chat_id`.
</Step>
</Steps>
Чтобы получить все комментарии треда — вызовите [Список сообщений чата](GET /messages) с `chat_id` равным `thread.chat_id`.

## Структура треда

Expand All @@ -72,8 +81,8 @@ related:
|------|----------------|-------------|
| `id` | Идентификатор треда как сущности | В методе [Информация о треде](GET /threads/{id}) |
| `chat_id` | Идентификатор **чата треда** — отдельного чата, в котором хранятся комментарии треда | Для отправки комментария [Новое сообщение](POST /messages) и для чтения [Список сообщений чата](GET /messages) |
| `message_id` | Идентификатор родительского сообщения, к которому привязан тред | При создании треда — в методе [Создание треда](POST /messages/{id}/thread) |
| `message_chat_id` | Идентификатор чата, в котором находится родительское сообщение | Для проверки контекста |
| `message_id` | Идентификатор родительского сообщения, к которому привязан тред. `null` у самостоятельного треда | При создании треда у сообщения — в методе [Создание треда](POST /messages/{id}/thread) |
| `message_chat_id` | Идентификатор чата, в котором находится родительское сообщение. `null` у самостоятельного треда | Для проверки контекста |

Когда вы получаете обычное сообщение через API, в поле `thread` будет короткий объект `{ id, chat_id }`, если у этого сообщения **есть тред** (то есть сообщение — родительское для треда). Если сообщение само живёт **внутри треда** (это комментарий), у него будет:

Expand All @@ -85,7 +94,7 @@ related:

Метод [Список тредов](GET /threads) возвращает все доступные вам треды:

- **Треды, в которых вы состоите напрямую** — вас явно добавили в сам тред (в том числе через сквозной тред, без участия в родительском чате).
- **Треды, в которых вы состоите напрямую** — вас явно добавили в сам тред (в том числе через сквозной тред, без участия в родительском чате), а также самостоятельные треды, которые вы создали.
- **Все треды чатов, в которых вы состоите** — даже если в самом треде вы не участвуете. Например, если вы участник канала «Маркетинг», в выдачу попадут все треды этого канала, в том числе те, в которые вы лично не писали.

<Info>
Expand Down
Loading
Loading