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
17 changes: 16 additions & 1 deletion apps/docs/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ a:focus:not(:focus-visible) {
}

.prose code:not(pre code) {
@apply bg-glass text-text-primary px-1.5 py-0.5 rounded-md text-[13px] font-mono font-medium border border-glass-border whitespace-nowrap;
@apply bg-glass text-text-primary px-1.5 py-0.5 rounded-md text-[13px] font-mono font-normal border border-glass-border whitespace-nowrap;
}

.prose table {
Expand All @@ -384,6 +384,21 @@ a:focus:not(:focus-visible) {
@apply py-3 px-4 border-b border-background-border text-sm text-text-primary;
}

/* Таблица параметров: фиксированные ширины первых двух колонок */
.params-table table {
table-layout: fixed;
}

.params-table table th:nth-child(1),
.params-table table td:nth-child(1) {
width: 200px;
}

.params-table table th:nth-child(2),
.params-table table td:nth-child(2) {
width: 120px;
}

/* Code Block Styling */
.code-block-container {
--shiki-background: transparent;
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/components/api/markdown-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
import { Steps, Step } from '@/components/mdx/steps';

import { CardGroup, CardRow, Card } from '@/components/mdx/cards';
import { ParamsTable } from '@/components/mdx/params-table';
import { Mermaid } from '@/components/mdx/mermaid';
import { Tree, TreeFolder, TreeFile } from '@/components/mdx/tree';
import { ImageCard } from '@/components/mdx/image-card';
Expand Down Expand Up @@ -215,6 +216,7 @@ const components = {
CardGroup,
CardRow,
Card,
ParamsTable,
GuideCards,
ApiCards,
EndpointLink,
Expand Down
4 changes: 2 additions & 2 deletions apps/docs/components/api/schema-table.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -263,13 +263,13 @@ export function SchemaTable({ schema }: SchemaTableProps) {
{prop.example ? (
prop.example.startsWith('{') || prop.example.startsWith('[') ? (
<CopyableCell text={JSON.stringify(JSON.parse(prop.example), null, 2)}>
<pre className="text-[12px] font-mono text-text-primary whitespace-pre m-0 px-2 py-1.5 rounded-md bg-glass border border-glass-border overflow-x-auto hover:border-accent/50 transition-colors">
<pre className="text-[13px] font-mono font-normal text-text-primary whitespace-pre m-0 px-2 py-1.5 rounded-md bg-glass border border-glass-border overflow-x-auto hover:border-accent/50 transition-colors">
{JSON.stringify(JSON.parse(prop.example), null, 2)}
</pre>
</CopyableCell>
) : (
<CopyableCell text={prop.example}>
<code className="text-[12px] font-mono text-text-primary bg-glass px-1.5 py-0.5 rounded-md border border-glass-border inline-block break-all! whitespace-normal! overflow-wrap-anywhere hover:border-accent/50 transition-colors">
<code className="text-[13px] font-mono text-text-primary bg-glass px-1.5 py-0.5 rounded-md border border-glass-border inline-block break-all! whitespace-normal! overflow-wrap-anywhere hover:border-accent/50 transition-colors">
{prop.example}
</code>
</CopyableCell>
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/components/mdx/mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { UpdatesList } from '@/components/api/updates-list';
import { Callout } from '@/components/api/callout';
import { Steps, Step } from '@/components/mdx/steps';
import { CardGroup, CardRow, Card, GUIDE_ICONS, API_SECTION_META } from '@/components/mdx/cards';
import { ParamsTable } from '@/components/mdx/params-table';
import { Mermaid } from '@/components/mdx/mermaid';
import { Tree, TreeFolder, TreeFile } from '@/components/mdx/tree';
import { ImageCard } from '@/components/mdx/image-card';
Expand Down Expand Up @@ -458,6 +459,7 @@ export const customMdxComponents = {
CardGroup,
CardRow,
Card,
ParamsTable,
GuideCards,
ApiCards,
Mermaid,
Expand Down
9 changes: 9 additions & 0 deletions apps/docs/components/mdx/params-table.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { ReactNode } from 'react';

/**
* Wraps a markdown table with fixed-width first columns (parameter / type),
* letting the description column take the remaining space.
*/
export function ParamsTable({ children }: { children: ReactNode }) {
return <div className="params-table my-6 overflow-x-auto">{children}</div>;
}
12 changes: 11 additions & 1 deletion apps/docs/content/api/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ hideTableOfContents: true

Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств.

<Info>Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных.</Info>
<Info>Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных.</Info>

<CardGroup>
<Card title="Дополнительное поле" href="#dopolnitelnoe-pole" methods="GET" />
<Card title="Токен доступа" href="#token-dostupa" methods="GET" />
<Card title="Статус пользователя" href="#status-polzovatelya" methods="GET PUT DELETE" />
<Card title="Аватар" href="#avatar" methods="PUT DELETE" />
<Card title="Сотрудник" href="#sotrudnik" methods="GET POST PUT DELETE" />
<Card title="Тег" href="#teg" methods="GET POST PUT DELETE" />
<Card title="Чат" href="#chat" methods="GET POST PUT DELETE" />
Expand Down Expand Up @@ -50,6 +51,15 @@ hideTableOfContents: true

<ModelSchema name="UserStatus" />

## Аватар

- [Загрузка аватара](PUT /profile/avatar)
- [Удаление аватара](DELETE /profile/avatar)
- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar)
- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar)

<ModelSchema name="AvatarData" />

## Сотрудник

- [Информация о профиле](GET /profile)
Expand Down
28 changes: 20 additions & 8 deletions apps/docs/content/api/pagination.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ API Пачки использует **cursor-based** пагинацию для

## Параметры запроса

<ParamsTable>

| Параметр | Тип | Описание |
|----------|-----|----------|
| `limit` | integer | Количество записей на странице. Допустимые значения зависят от метода: большинство списочных методов — 1–50, [Список прочитавших сообщение](GET /messages/{id}/read_member_ids) — до 300, [Поиск чатов](GET /search/chats) — до 100, [Поиск сотрудников](GET /search/users) и [Поиск сообщений](GET /search/messages) — до 200 |
| `cursor` | string | Курсор для получения страницы (значение `meta.paginate.next_page` или `meta.paginate.prev_page` из предыдущего ответа) |

</ParamsTable>

## Списочные методы

Списочные методы возвращают объект `meta.paginate` с четырьмя полями:
Expand All @@ -41,13 +45,17 @@ API Пачки использует **cursor-based** пагинацию для
}
```

<ParamsTable>

| Поле | Тип | Описание |
|------|-----|----------|
| `next_page` | string | Курсор на следующую страницу (вперёд по сортировке). Используйте для обхода всех записей. |
| `prev_page` | string | Курсор на предыдущую страницу (назад по сортировке). Используйте для polling новых записей «сверху» списка. |
| `has_next` | boolean | Есть ли ещё данные на следующей странице. На последней странице — `false`. |
| `has_prev` | boolean | Есть ли ещё данные на предыдущей странице. На первом запросе без курсора — `false`. |

</ParamsTable>

К этой группе относятся: [Список сотрудников](GET /users) (без `query`), [Список чатов](GET /chats), [Список участников чата](GET /chats/{id}/members), [Список сообщений чата](GET /messages), [Список реакций](GET /messages/{id}/reactions), [Список прочитавших сообщение](GET /messages/{id}/read_member_ids), [Список тегов сотрудников](GET /group_tags), [Список сотрудников тега](GET /group_tags/{id}/users), [Список напоминаний](GET /tasks), [Журнал аудита событий](GET /audit_events), [История событий](GET /webhooks/events).

<Info>В списочных методах поля `next_page`, `prev_page`, `has_next`, `has_prev` **всегда присутствуют** в ответе — даже когда `data` пустой; курсоры никогда не бывают `null`. Признак конца данных — `has_next: false` (вперёд) или `has_prev: false` (назад), а не пустой `data`. Количество записей в `data` может быть меньше `limit` и на промежуточных страницах — не полагайтесь на длину массива. Курсор — непрозрачный токен: не парсите, не конструируйте вручную и не сохраняйте между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию.</Info>
Expand All @@ -58,14 +66,14 @@ API Пачки использует **cursor-based** пагинацию для

| Сценарий | Запрос | `data` | `next_page` | `prev_page` | `has_next` | `has_prev` |
|----------|--------|--------|-------------|-------------|-----------|-----------|
| Первый запрос, есть данные | `cursor=null, limit=50` | 50 записей | курсор от `records.last` | курсор от `records.first` | `true` | `false` |
| Первый запрос, БД пуста | `cursor=null, limit=50` | 0 записей | пустой курсор (для polling) | пустой курсор (для polling) | `false` | `false` |
| Идём вперёд по страницам | `cursor=<next_page>` | 50 записей | новый forward-курсор | от `records.first` | `true` | `true` |
| Дошли до последней страницы | `cursor=<next_page>` | менее 50 записей | от `records.last` | от `records.first` | `false` | `true` |
| Polling старого хвоста (новых нет) | `cursor=<next_page последней страницы>` | 0 записей | тот же `next_page` (для следующего polling) | валидный backward-курсор | `false` | `true` |
| Polling новых через `prev_page` (новых нет) | `cursor=<prev_page>` | 0 записей | валидный forward-курсор | тот же `prev_page` (для следующего polling) | `true` | `false` |
| Polling новых через `prev_page` (пришло меньше `limit`) | `cursor=<prev_page>` | 3 записи | новый forward-курсор | от `records.first` | `false` | `false` |
| Polling новых через `prev_page` (пришло ≥ `limit`) | `cursor=<prev_page>` | 50 записей | новый forward-курсор | от `records.first` | `false` | `true` (продолжайте polling) |
| Первый запрос, есть данные | `cursor=null, limit=50` | 50&nbsp;записей | курсор&nbsp;от&nbsp;`records.last` | курсор&nbsp;от&nbsp;`records.first` | `true` | `false` |
| Первый запрос, БД пуста | `cursor=null, limit=50` | 0&nbsp;записей | пустой&nbsp;курсор (для&nbsp;polling) | пустой&nbsp;курсор (для&nbsp;polling) | `false` | `false` |
| Идём вперёд по страницам | `cursor=<next_page>` | 50&nbsp;записей | новый&nbsp;forward-курсор | от&nbsp;`records.first` | `true` | `true` |
| Дошли до последней страницы | `cursor=<next_page>` | менее&nbsp;50&nbsp;записей | от&nbsp;`records.last` | от&nbsp;`records.first` | `false` | `true` |
| Polling старого хвоста (новых нет) | `cursor=<next_page последней страницы>` | 0&nbsp;записей | тот&nbsp;же&nbsp;`next_page` (для следующего polling) | валидный&nbsp;backward-курсор | `false` | `true` |
| Polling новых через `prev_page` (новых нет) | `cursor=<prev_page>` | 0&nbsp;записей | валидный&nbsp;forward-курсор | тот&nbsp;же&nbsp;`prev_page` (для следующего polling) | `true` | `false` |
| Polling новых через `prev_page` (пришло меньше `limit`) | `cursor=<prev_page>` | 3&nbsp;записи | новый&nbsp;forward-курсор | от&nbsp;`records.first` | `false` | `false` |
| Polling новых через `prev_page` (пришло ≥ `limit`) | `cursor=<prev_page>` | 50&nbsp;записей | новый&nbsp;forward-курсор | от&nbsp;`records.first` | `false` | `true` (продолжайте&nbsp;polling) |

Курсоры `next_page` и `prev_page` остаются валидными даже на пустом ответе — можно безопасно повторять запрос с тем же курсором, не теряя точку отсчёта.

Expand All @@ -87,11 +95,15 @@ API Пачки использует **cursor-based** пагинацию для
}
```

<ParamsTable>

| Поле | Тип | Описание |
|------|-----|----------|
| `total` | integer | Общее количество найденных результатов по запросу. |
| `paginate.next_page` | string | Курсор на следующую страницу. Доступен только курсор «вперёд», без `prev_page`. |

</ParamsTable>

К этой группе относятся:

- [Поиск сотрудников](GET /search/users)
Expand Down
7 changes: 7 additions & 0 deletions apps/docs/lib/mdx-expander.ts
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,9 @@ export async function expandMdxComponents(content: string): Promise<string> {
// <CardRow>...</CardRow> -> expand inner content (wrapper for prose context)
result = result.replace(/<CardRow>([\s\S]*?)<\/CardRow>/g, (_, inner) => inner.trim() + '\n');

// <ParamsTable>...</ParamsTable> -> unwrap (markdown table inside)
result = result.replace(/<ParamsTable>([\s\S]*?)<\/ParamsTable>/g, (_, inner) => inner.trim());

// Standalone <Card compact ... >children</Card> -> markdown link
result = result.replace(
/<Card\s+compact\s+([\s\S]*?)>([\s\S]*?)<\/Card>/g,
Expand Down Expand Up @@ -693,6 +696,10 @@ export async function expandMdxComponents(content: string): Promise<string> {
// Interactive playground components — remove (no markdown representation)
result = result.replace(/<(?:WebhookPlayground|MessagePlayground|FormPlayground)\s*\/>\n?/g, '');

// HTML entities used for typography (&nbsp;, &shy;, etc.) -> plain space / drop
result = result.replace(/&nbsp;/g, ' ');
result = result.replace(/&shy;/g, '');

// Clean up multiple newlines
result = result.replace(/\n{4,}/g, '\n\n\n');

Expand Down
14 changes: 13 additions & 1 deletion apps/docs/public/api/models.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств.

> Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных.
> Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных.


## Дополнительное поле
Expand Down Expand Up @@ -54,6 +54,18 @@
- `text: string` (required) — Текст сообщения. Пример: `"Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov."`


## Аватар

- [Загрузка аватара](PUT /profile/avatar)
- [Удаление аватара](DELETE /profile/avatar)
- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar)
- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar)

Данные аватара

- `image_url: string` (required) — URL аватара. Пример: `"https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg"`


## Сотрудник

- [Информация о профиле](GET /profile)
Expand Down
18 changes: 15 additions & 3 deletions apps/docs/public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@
|---------|-------------|-------|
| LIBRARY RULES | Core rules, auth, pagination, rate limits, SDK overview | 81–167 |
| How-to Guides | Step-by-step solutions with TypeScript + Python code | 168–849 |
| Guides | Full SDK docs (6 languages), webhooks, bots, forms, n8n | 850–10649 |
| API Reference | Complete REST API — every endpoint with schemas and examples | 10650–25685 |
| Guides | Full SDK docs (6 languages), webhooks, bots, forms, n8n | 850–10661 |
| API Reference | Complete REST API — every endpoint with schemas and examples | 10662–25697 |

---

Expand Down Expand Up @@ -10097,7 +10097,7 @@ users = await with_retry(lambda: client.users.list_users())

Все модели данных, возвращаемые в ответах API. Каждая модель содержит связанные методы и таблицу свойств.

> Методы [Получение подписи](POST /uploads), [Загрузка файла](POST /direct_url), [Загрузка аватара](PUT /profile/avatar), [Удаление аватара](DELETE /profile/avatar), [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar) и [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar) не возвращают модели данных.
> Методы [Получение подписи](POST /uploads) и [Загрузка файла](POST /direct_url) не возвращают модели данных.


## Дополнительное поле
Expand Down Expand Up @@ -10148,6 +10148,18 @@ users = await with_retry(lambda: client.users.list_users())
- `text: string` (required) — Текст сообщения. Пример: `"Я в отпуске до 15 апреля. По срочным вопросам обращайтесь к @ivanov."`


## Аватар

- [Загрузка аватара](PUT /profile/avatar)
- [Удаление аватара](DELETE /profile/avatar)
- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar)
- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar)

Данные аватара

- `image_url: string` (required) — URL аватара. Пример: `"https://pachca-prod.s3.amazonaws.com/uploads/0001/0001/image.jpg"`


## Сотрудник

- [Информация о профиле](GET /profile)
Expand Down
Loading