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)