diff --git a/apps/docs/app/globals.css b/apps/docs/app/globals.css
index 07caa442..b71cfd46 100644
--- a/apps/docs/app/globals.css
+++ b/apps/docs/app/globals.css
@@ -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 {
@@ -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;
diff --git a/apps/docs/components/api/markdown-content.tsx b/apps/docs/components/api/markdown-content.tsx
index 6f4669e2..74584452 100644
--- a/apps/docs/components/api/markdown-content.tsx
+++ b/apps/docs/components/api/markdown-content.tsx
@@ -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';
@@ -215,6 +216,7 @@ const components = {
CardGroup,
CardRow,
Card,
+ ParamsTable,
GuideCards,
ApiCards,
EndpointLink,
diff --git a/apps/docs/components/api/schema-table.tsx b/apps/docs/components/api/schema-table.tsx
index 39b336c3..09d562f4 100644
--- a/apps/docs/components/api/schema-table.tsx
+++ b/apps/docs/components/api/schema-table.tsx
@@ -263,13 +263,13 @@ export function SchemaTable({ schema }: SchemaTableProps) {
{prop.example ? (
prop.example.startsWith('{') || prop.example.startsWith('[') ? (
-
+
{JSON.stringify(JSON.parse(prop.example), null, 2)}
) : (
-
+
{prop.example}
diff --git a/apps/docs/components/mdx/mdx-components.tsx b/apps/docs/components/mdx/mdx-components.tsx
index dac3f62d..090ed496 100644
--- a/apps/docs/components/mdx/mdx-components.tsx
+++ b/apps/docs/components/mdx/mdx-components.tsx
@@ -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';
@@ -458,6 +459,7 @@ export const customMdxComponents = {
CardGroup,
CardRow,
Card,
+ ParamsTable,
GuideCards,
ApiCards,
Mermaid,
diff --git a/apps/docs/components/mdx/params-table.tsx b/apps/docs/components/mdx/params-table.tsx
new file mode 100644
index 00000000..32d83bb0
--- /dev/null
+++ b/apps/docs/components/mdx/params-table.tsx
@@ -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
{children}
;
+}
diff --git a/apps/docs/content/api/models.mdx b/apps/docs/content/api/models.mdx
index e93621ee..6ee63250 100644
--- a/apps/docs/content/api/models.mdx
+++ b/apps/docs/content/api/models.mdx
@@ -8,12 +8,13 @@ hideTableOfContents: true
Все модели данных, возвращаемые в ответах 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) не возвращают модели данных.
+
@@ -50,6 +51,15 @@ hideTableOfContents: true
+## Аватар
+
+- [Загрузка аватара](PUT /profile/avatar)
+- [Удаление аватара](DELETE /profile/avatar)
+- [Загрузка аватара сотрудника](PUT /users/{user_id}/avatar)
+- [Удаление аватара сотрудника](DELETE /users/{user_id}/avatar)
+
+
+
## Сотрудник
- [Информация о профиле](GET /profile)
diff --git a/apps/docs/content/api/pagination.mdx b/apps/docs/content/api/pagination.mdx
index 6676b8a7..ad95f9f8 100644
--- a/apps/docs/content/api/pagination.mdx
+++ b/apps/docs/content/api/pagination.mdx
@@ -16,11 +16,15 @@ API Пачки использует **cursor-based** пагинацию для
## Параметры запроса
+
+
| Параметр | Тип | Описание |
|----------|-----|----------|
| `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` из предыдущего ответа) |
+
+
## Списочные методы
Списочные методы возвращают объект `meta.paginate` с четырьмя полями:
@@ -41,6 +45,8 @@ API Пачки использует **cursor-based** пагинацию для
}
```
+
+
| Поле | Тип | Описание |
|------|-----|----------|
| `next_page` | string | Курсор на следующую страницу (вперёд по сортировке). Используйте для обхода всех записей. |
@@ -48,6 +54,8 @@ API Пачки использует **cursor-based** пагинацию для
| `has_next` | boolean | Есть ли ещё данные на следующей странице. На последней странице — `false`. |
| `has_prev` | boolean | Есть ли ещё данные на предыдущей странице. На первом запросе без курсора — `false`. |
+
+
К этой группе относятся: [Список сотрудников](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).
В списочных методах поля `next_page`, `prev_page`, `has_next`, `has_prev` **всегда присутствуют** в ответе — даже когда `data` пустой; курсоры никогда не бывают `null`. Признак конца данных — `has_next: false` (вперёд) или `has_prev: false` (назад), а не пустой `data`. Количество записей в `data` может быть меньше `limit` и на промежуточных страницах — не полагайтесь на длину массива. Курсор — непрозрачный токен: не парсите, не конструируйте вручную и не сохраняйте между сессиями. Всегда явно указывайте `limit` — не полагайтесь на значение по умолчанию.
@@ -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=` | 50 записей | новый forward-курсор | от `records.first` | `true` | `true` |
-| Дошли до последней страницы | `cursor=` | менее 50 записей | от `records.last` | от `records.first` | `false` | `true` |
-| Polling старого хвоста (новых нет) | `cursor=` | 0 записей | тот же `next_page` (для следующего polling) | валидный backward-курсор | `false` | `true` |
-| Polling новых через `prev_page` (новых нет) | `cursor=` | 0 записей | валидный forward-курсор | тот же `prev_page` (для следующего polling) | `true` | `false` |
-| Polling новых через `prev_page` (пришло меньше `limit`) | `cursor=` | 3 записи | новый forward-курсор | от `records.first` | `false` | `false` |
-| Polling новых через `prev_page` (пришло ≥ `limit`) | `cursor=` | 50 записей | новый forward-курсор | от `records.first` | `false` | `true` (продолжайте polling) |
+| Первый запрос, есть данные | `cursor=null, limit=50` | 50 записей | курсор от `records.last` | курсор от `records.first` | `true` | `false` |
+| Первый запрос, БД пуста | `cursor=null, limit=50` | 0 записей | пустой курсор (для polling) | пустой курсор (для polling) | `false` | `false` |
+| Идём вперёд по страницам | `cursor=` | 50 записей | новый forward-курсор | от `records.first` | `true` | `true` |
+| Дошли до последней страницы | `cursor=` | менее 50 записей | от `records.last` | от `records.first` | `false` | `true` |
+| Polling старого хвоста (новых нет) | `cursor=` | 0 записей | тот же `next_page` (для следующего polling) | валидный backward-курсор | `false` | `true` |
+| Polling новых через `prev_page` (новых нет) | `cursor=` | 0 записей | валидный forward-курсор | тот же `prev_page` (для следующего polling) | `true` | `false` |
+| Polling новых через `prev_page` (пришло меньше `limit`) | `cursor=` | 3 записи | новый forward-курсор | от `records.first` | `false` | `false` |
+| Polling новых через `prev_page` (пришло ≥ `limit`) | `cursor=` | 50 записей | новый forward-курсор | от `records.first` | `false` | `true` (продолжайте polling) |
Курсоры `next_page` и `prev_page` остаются валидными даже на пустом ответе — можно безопасно повторять запрос с тем же курсором, не теряя точку отсчёта.
@@ -87,11 +95,15 @@ API Пачки использует **cursor-based** пагинацию для
}
```
+
+
| Поле | Тип | Описание |
|------|-----|----------|
| `total` | integer | Общее количество найденных результатов по запросу. |
| `paginate.next_page` | string | Курсор на следующую страницу. Доступен только курсор «вперёд», без `prev_page`. |
+
+
К этой группе относятся:
- [Поиск сотрудников](GET /search/users)
diff --git a/apps/docs/lib/mdx-expander.ts b/apps/docs/lib/mdx-expander.ts
index c3fbc37e..657386dd 100644
--- a/apps/docs/lib/mdx-expander.ts
+++ b/apps/docs/lib/mdx-expander.ts
@@ -312,6 +312,9 @@ export async function expandMdxComponents(content: string): Promise {
// ... -> expand inner content (wrapper for prose context)
result = result.replace(/([\s\S]*?)<\/CardRow>/g, (_, inner) => inner.trim() + '\n');
+ // ... -> unwrap (markdown table inside)
+ result = result.replace(/([\s\S]*?)<\/ParamsTable>/g, (_, inner) => inner.trim());
+
// Standalone children -> markdown link
result = result.replace(
/([\s\S]*?)<\/Card>/g,
@@ -693,6 +696,10 @@ export async function expandMdxComponents(content: string): Promise {
// Interactive playground components — remove (no markdown representation)
result = result.replace(/<(?:WebhookPlayground|MessagePlayground|FormPlayground)\s*\/>\n?/g, '');
+ // HTML entities used for typography ( , , etc.) -> plain space / drop
+ result = result.replace(/ /g, ' ');
+ result = result.replace(//g, '');
+
// Clean up multiple newlines
result = result.replace(/\n{4,}/g, '\n\n\n');
diff --git a/apps/docs/public/api/models.md b/apps/docs/public/api/models.md
index a40c013e..be939a29 100644
--- a/apps/docs/public/api/models.md
+++ b/apps/docs/public/api/models.md
@@ -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) не возвращают модели данных.
## Дополнительное поле
@@ -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)
diff --git a/apps/docs/public/llms-full.txt b/apps/docs/public/llms-full.txt
index 4e40602e..a6c3251d 100644
--- a/apps/docs/public/llms-full.txt
+++ b/apps/docs/public/llms-full.txt
@@ -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 |
---
@@ -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) не возвращают модели данных.
## Дополнительное поле
@@ -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)