@besales/mcp 0.45.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/resources/docs/crm-integration.md +3 -1
  2. package/dist/resources/workflows/compare-models.md +4 -3
  3. package/dist/resources/workflows/connect-crm-from-scratch.md +8 -0
  4. package/dist/schemas/mcp-tools.json +431 -30
  5. package/dist/tools/definitions/agent-design.d.ts +8 -0
  6. package/dist/tools/definitions/agent-design.js +3 -0
  7. package/dist/tools/definitions/agent-design.js.map +1 -1
  8. package/dist/tools/definitions/broadcast-analytics.d.ts +5 -4
  9. package/dist/tools/definitions/broadcast-analytics.js +14 -4
  10. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  11. package/dist/tools/definitions/broadcast-scheduler.d.ts +14 -1
  12. package/dist/tools/definitions/broadcast-scheduler.js +64 -5
  13. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  14. package/dist/tools/definitions/crm-platform.js +20 -0
  15. package/dist/tools/definitions/crm-platform.js.map +1 -1
  16. package/dist/tools/definitions/follow-up.js +2 -0
  17. package/dist/tools/definitions/follow-up.js.map +1 -1
  18. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +8 -0
  19. package/dist/tools/definitions/getcourse-cold-welcome.js +49 -3
  20. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  21. package/dist/tools/definitions/link-tracking.js +22 -0
  22. package/dist/tools/definitions/link-tracking.js.map +1 -1
  23. package/dist/tools/definitions/model-comparison.js +6 -3
  24. package/dist/tools/definitions/model-comparison.js.map +1 -1
  25. package/dist/tools/definitions/platform-setup.d.ts +29 -0
  26. package/dist/tools/definitions/platform-setup.js +14 -1
  27. package/dist/tools/definitions/platform-setup.js.map +1 -1
  28. package/dist/tools/definitions/shared.d.ts +120 -0
  29. package/dist/tools/definitions/shared.js +96 -0
  30. package/dist/tools/definitions/shared.js.map +1 -1
  31. package/dist/tools/definitions/trigger-contact-claims.d.ts +7 -0
  32. package/dist/tools/definitions/trigger-contact-claims.js +58 -0
  33. package/dist/tools/definitions/trigger-contact-claims.js.map +1 -0
  34. package/dist/tools/definitions.d.ts +70 -5
  35. package/dist/tools/definitions.js +2 -0
  36. package/dist/tools/definitions.js.map +1 -1
  37. package/dist/tools/registry-mapping-cases-core.js +11 -2
  38. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  39. package/dist/tools/trigger-action-config.js +4 -0
  40. package/dist/tools/trigger-action-config.js.map +1 -1
  41. package/dist/types/api-contract.gen.d.ts +976 -37
  42. package/docs/agent-usage-guide.full.ru.md +1 -0
  43. package/package.json +1 -1
@@ -5018,8 +5018,13 @@ export interface paths {
5018
5018
  /**
5019
5019
  * S3.8: Apply batch patch operations + reset activity TTL (24h)
5020
5020
  * @description Применяет операции к draft.currentContent через `applyPromptPatchOperations`.
5021
- * Resets TTL на каждом вызове (activity-based 24h). Возвращает diff-stats:
5022
- * `appliedCount` + `skippedCount` (anchor не нашёлся → ops пропущены).
5021
+ * Resets TTL на каждом вызове (activity-based 24h). Возвращает `appliedCount` +
5022
+ * `skippedCount` (anchor не нашёлся → ops пропущены) и `diff` — построчную
5023
+ * разницу «до → после».
5024
+ *
5025
+ * Текст черновика в ответе НЕ отдаётся: клиент прочитал промпт целиком при создании
5026
+ * черновика, а здесь ждёт подтверждения правки. Перечитать полностью —
5027
+ * `GET /prompt/drafts/{draftId}`.
5023
5028
  *
5024
5029
  * Growth guard: операции, увеличивающие размер >30% от baseContent → пропускаются
5025
5030
  * с skippedCount > 0.
@@ -5084,6 +5089,10 @@ export interface paths {
5084
5089
  *
5085
5090
  * Idempotency: повторный commit того же draft возвращает existing newVersion
5086
5091
  * (детектируется через 410 Gone + GET draft → COMMITTED).
5092
+ *
5093
+ * Ответ несёт только адресацию новой версии (`id` + `version`) и метаданные
5094
+ * черновика: `draft.currentContent` и `newVersion.content` — две копии одного
5095
+ * текста, который клиент сам и собрал.
5087
5096
  */
5088
5097
  post: {
5089
5098
  parameters: {
@@ -9315,6 +9324,118 @@ export interface paths {
9315
9324
  patch?: never;
9316
9325
  trace?: never;
9317
9326
  };
9327
+ "/api/v2/contacts/{contactId}/trigger-claims": {
9328
+ parameters: {
9329
+ query?: never;
9330
+ header?: never;
9331
+ path?: never;
9332
+ cookie?: never;
9333
+ };
9334
+ /**
9335
+ * List burnt one-time trigger claims for contact
9336
+ * @description Права одноразовых триггеров (AgentTrigger.runOncePerContact), уже занятые этим контактом. canReset=false означает, что право держит идущий прогон.
9337
+ */
9338
+ get: {
9339
+ parameters: {
9340
+ query?: never;
9341
+ header?: never;
9342
+ path: {
9343
+ contactId: string;
9344
+ };
9345
+ cookie?: never;
9346
+ };
9347
+ requestBody?: never;
9348
+ responses: {
9349
+ 200: {
9350
+ headers: {
9351
+ [name: string]: unknown;
9352
+ };
9353
+ content: {
9354
+ "application/json": components["schemas"]["TriggerContactClaimsPage"];
9355
+ };
9356
+ };
9357
+ /** @description Контакт не найден в воркспейсе */
9358
+ 404: {
9359
+ headers: {
9360
+ [name: string]: unknown;
9361
+ };
9362
+ content?: never;
9363
+ };
9364
+ };
9365
+ };
9366
+ put?: never;
9367
+ post?: never;
9368
+ delete?: never;
9369
+ options?: never;
9370
+ head?: never;
9371
+ patch?: never;
9372
+ trace?: never;
9373
+ };
9374
+ "/api/v2/contacts/{contactId}/trigger-claims/{triggerId}": {
9375
+ parameters: {
9376
+ query?: never;
9377
+ header?: never;
9378
+ path?: never;
9379
+ cookie?: never;
9380
+ };
9381
+ get?: never;
9382
+ put?: never;
9383
+ post?: never;
9384
+ /**
9385
+ * Allow a one-time trigger to fire for the contact again
9386
+ * @description Возвращает контакту сожжённое право. Снимается ТОЛЬКО status=COMPLETED: право со status=IN_PROGRESS держит владелец, а его finalize адресует пару «триггер+контакт», и удаление такой строки дало бы двух владельцев и повторные необратимые действия.
9387
+ */
9388
+ delete: {
9389
+ parameters: {
9390
+ query?: never;
9391
+ header?: never;
9392
+ path: {
9393
+ contactId: string;
9394
+ triggerId: string;
9395
+ };
9396
+ cookie?: never;
9397
+ };
9398
+ requestBody: {
9399
+ content: {
9400
+ "application/json": components["schemas"]["ResetTriggerClaimRequest"];
9401
+ };
9402
+ };
9403
+ responses: {
9404
+ /** @description Право возвращено */
9405
+ 204: {
9406
+ headers: {
9407
+ [name: string]: unknown;
9408
+ };
9409
+ content?: never;
9410
+ };
9411
+ /** @description Нет explicitConfirmation */
9412
+ 400: {
9413
+ headers: {
9414
+ [name: string]: unknown;
9415
+ };
9416
+ content?: never;
9417
+ };
9418
+ /** @description Контакт не найден либо право не занято */
9419
+ 404: {
9420
+ headers: {
9421
+ [name: string]: unknown;
9422
+ };
9423
+ content?: never;
9424
+ };
9425
+ /** @description Право держит прогон триггера */
9426
+ 409: {
9427
+ headers: {
9428
+ [name: string]: unknown;
9429
+ };
9430
+ content?: never;
9431
+ };
9432
+ };
9433
+ };
9434
+ options?: never;
9435
+ head?: never;
9436
+ patch?: never;
9437
+ trace?: never;
9438
+ };
9318
9439
  "/api/v2/contacts/{contactId}/merge-history": {
9319
9440
  parameters: {
9320
9441
  query?: never;
@@ -9933,7 +10054,7 @@ export interface paths {
9933
10054
  parameters: {
9934
10055
  query?: {
9935
10056
  includeArchived?: boolean;
9936
- /** @description Глубина сводки в днях */
10057
+ /** @description Глубина сводки в днях. НЕ ЗАДАН — за всё время. Прежде подставлялось окно 60 дней, и оно расходилось само с собой: выданное раньше него показывалось как «выдано 0», тогда как выручка в той же строке считалась за всё время. */
9937
10058
  days?: number;
9938
10059
  limit?: number;
9939
10060
  offset?: number;
@@ -10099,6 +10220,7 @@ export interface paths {
10099
10220
  get: {
10100
10221
  parameters: {
10101
10222
  query?: {
10223
+ /** @description Глубина разреза в днях; не задан — за всё время */
10102
10224
  days?: number;
10103
10225
  };
10104
10226
  header?: never;
@@ -10129,6 +10251,51 @@ export interface paths {
10129
10251
  patch?: never;
10130
10252
  trace?: never;
10131
10253
  };
10254
+ "/api/v2/workspaces/{workspaceId}/tracked-links/{linkId}/reach": {
10255
+ parameters: {
10256
+ query?: never;
10257
+ header?: never;
10258
+ path?: never;
10259
+ cookie?: never;
10260
+ };
10261
+ /**
10262
+ * Разрез ссылки по месту применения
10263
+ * @description Где ссылка работала: площадка и агент, через которых она уходила людям. Отвечает на «где», тогда как /breakdown — на «после какого касания». Оси независимые: одна выдача принадлежит ровно одной площадке и одному агенту, а тип источника — отдельное измерение. ⚠️ null в оси — это «не определён», отдельная строка, а не ноль: у контакта могло не быть ни одного ответа агента. ⚠️ Пустое имя при заполненном id значит, что площадку или агента удалили: id хранится снимком без внешнего ключа, чтобы история кликов пережила удаление.
10264
+ */
10265
+ get: {
10266
+ parameters: {
10267
+ query?: {
10268
+ /** @description Глубина разреза в днях; не задан — за всё время */
10269
+ days?: number;
10270
+ };
10271
+ header?: never;
10272
+ path: {
10273
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
10274
+ linkId: components["parameters"]["TrackedLinkIdPath"];
10275
+ };
10276
+ cookie?: never;
10277
+ };
10278
+ requestBody?: never;
10279
+ responses: {
10280
+ /** @description OK */
10281
+ 200: {
10282
+ headers: {
10283
+ [name: string]: unknown;
10284
+ };
10285
+ content: {
10286
+ "application/json": components["schemas"]["TrackedLinkReachBreakdown"][];
10287
+ };
10288
+ };
10289
+ };
10290
+ };
10291
+ put?: never;
10292
+ post?: never;
10293
+ delete?: never;
10294
+ options?: never;
10295
+ head?: never;
10296
+ patch?: never;
10297
+ trace?: never;
10298
+ };
10132
10299
  "/api/v2/workspaces/{workspaceId}/tracked-links/{linkId}/clicks": {
10133
10300
  parameters: {
10134
10301
  query?: never;
@@ -10143,6 +10310,7 @@ export interface paths {
10143
10310
  get: {
10144
10311
  parameters: {
10145
10312
  query?: {
10313
+ /** @description Глубина разреза в днях; не задан — за всё время */
10146
10314
  days?: number;
10147
10315
  page?: number;
10148
10316
  pageSize?: number;
@@ -10290,6 +10458,8 @@ export interface paths {
10290
10458
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10291
10459
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10292
10460
  mechanism?: components["parameters"]["BroadcastMechanism"];
10461
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10462
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10293
10463
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10294
10464
  product?: components["parameters"]["BroadcastProduct"];
10295
10465
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10298,8 +10468,10 @@ export interface paths {
10298
10468
  freshness?: components["parameters"]["BroadcastFreshness"];
10299
10469
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10300
10470
  channels?: components["parameters"]["BroadcastChannels"];
10301
- /** @description cohort — дата запуска; period — дата события. */
10302
- view?: "cohort" | "period";
10471
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at). В entry строки без даты входа выпадают всегда, включая mode=all. */
10472
+ view?: "cohort" | "period" | "entry";
10473
+ /** @description day — календарные бакеты; period — один компактный бакет __period__ за весь диапазон. */
10474
+ granularity?: "day" | "period";
10303
10475
  };
10304
10476
  header?: never;
10305
10477
  path: {
@@ -10590,6 +10762,8 @@ export interface paths {
10590
10762
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10591
10763
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10592
10764
  mechanism?: components["parameters"]["BroadcastMechanism"];
10765
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10766
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10593
10767
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10594
10768
  product?: components["parameters"]["BroadcastProduct"];
10595
10769
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10654,6 +10828,8 @@ export interface paths {
10654
10828
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10655
10829
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10656
10830
  mechanism?: components["parameters"]["BroadcastMechanism"];
10831
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10832
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10657
10833
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10658
10834
  product?: components["parameters"]["BroadcastProduct"];
10659
10835
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10662,7 +10838,7 @@ export interface paths {
10662
10838
  freshness?: components["parameters"]["BroadcastFreshness"];
10663
10839
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10664
10840
  channels?: components["parameters"]["BroadcastChannels"];
10665
- /** @description cohort — дата запуска; period — дата события. */
10841
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10666
10842
  view?: components["parameters"]["BroadcastView"];
10667
10843
  /** @description Конкретный день кликнутой ячейки (МСК). */
10668
10844
  date?: components["parameters"]["BroadcastDate"];
@@ -10696,6 +10872,154 @@ export interface paths {
10696
10872
  patch?: never;
10697
10873
  trace?: never;
10698
10874
  };
10875
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/unique-contacts": {
10876
+ parameters: {
10877
+ query?: never;
10878
+ header?: never;
10879
+ path?: never;
10880
+ cookie?: never;
10881
+ };
10882
+ /**
10883
+ * Уникальных контактов за период (НЕ аддитивно)
10884
+ * @description Сколько РАЗНЫХ людей стоит за «Отправлено» той же выборки. Периметр совпадает с тоталом
10885
+ * sent; отличие только в единице счёта: строка реестра это «волна × контакт», а тут считается
10886
+ * контакт. Складывать по дням/сегментам/продуктам НЕЛЬЗЯ — один человек живёт в каждой группе,
10887
+ * куда ему уходила волна.
10888
+ */
10889
+ get: {
10890
+ parameters: {
10891
+ query?: {
10892
+ mode?: components["parameters"]["BroadcastPeriodMode"];
10893
+ days?: components["parameters"]["BroadcastDays"];
10894
+ /** @description Начальная календарная дата МСК для mode=range. */
10895
+ from?: components["parameters"]["BroadcastFrom"];
10896
+ /** @description Конечная календарная дата МСК для mode=range. */
10897
+ to?: components["parameters"]["BroadcastTo"];
10898
+ platformId?: components["parameters"]["BroadcastPlatformId"];
10899
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10900
+ funnel?: components["parameters"]["BroadcastFunnel"];
10901
+ /** @description Добавляет строки без воронки. Можно сочетать с funnel: значения и NULL объединяются через OR. */
10902
+ funnelMode?: components["parameters"]["BroadcastFunnelMode"];
10903
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10904
+ segment?: components["parameters"]["BroadcastSegment"];
10905
+ /** @description Один или несколько ID именованных вариантов рассылки. */
10906
+ mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10907
+ /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10908
+ mechanism?: components["parameters"]["BroadcastMechanism"];
10909
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10910
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10911
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10912
+ product?: components["parameters"]["BroadcastProduct"];
10913
+ /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
10914
+ productMode?: components["parameters"]["BroadcastProductMode"];
10915
+ /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
10916
+ freshness?: components["parameters"]["BroadcastFreshness"];
10917
+ /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10918
+ channels?: components["parameters"]["BroadcastChannels"];
10919
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10920
+ view?: components["parameters"]["BroadcastView"];
10921
+ };
10922
+ header?: never;
10923
+ path: {
10924
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
10925
+ };
10926
+ cookie?: never;
10927
+ };
10928
+ requestBody?: never;
10929
+ responses: {
10930
+ /** @description OK */
10931
+ 200: {
10932
+ headers: {
10933
+ [name: string]: unknown;
10934
+ };
10935
+ content: {
10936
+ "application/json": components["schemas"]["BroadcastUniqueContacts"];
10937
+ };
10938
+ };
10939
+ };
10940
+ };
10941
+ put?: never;
10942
+ post?: never;
10943
+ delete?: never;
10944
+ options?: never;
10945
+ head?: never;
10946
+ patch?: never;
10947
+ trace?: never;
10948
+ };
10949
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/per-person": {
10950
+ parameters: {
10951
+ query?: never;
10952
+ header?: never;
10953
+ path?: never;
10954
+ cookie?: never;
10955
+ };
10956
+ /**
10957
+ * Итоги верхних карточек по уникальным контактам за период
10958
+ * @description Счётчики верхних карточек «Обзора», дедуплицированные по chat_user_id за весь выбранный
10959
+ * период. Ручная историческая статистика не входит: её агрегированные строки не несут
10960
+ * идентификатора контакта. Денежные суммы не пересчитываются и в этот ответ не включены.
10961
+ * Результат НЕ аддитивен — складывать его по дням или измерениям нельзя.
10962
+ */
10963
+ get: {
10964
+ parameters: {
10965
+ query?: {
10966
+ mode?: components["parameters"]["BroadcastPeriodMode"];
10967
+ days?: components["parameters"]["BroadcastDays"];
10968
+ /** @description Начальная календарная дата МСК для mode=range. */
10969
+ from?: components["parameters"]["BroadcastFrom"];
10970
+ /** @description Конечная календарная дата МСК для mode=range. */
10971
+ to?: components["parameters"]["BroadcastTo"];
10972
+ platformId?: components["parameters"]["BroadcastPlatformId"];
10973
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10974
+ funnel?: components["parameters"]["BroadcastFunnel"];
10975
+ /** @description Добавляет строки без воронки. Можно сочетать с funnel: значения и NULL объединяются через OR. */
10976
+ funnelMode?: components["parameters"]["BroadcastFunnelMode"];
10977
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10978
+ segment?: components["parameters"]["BroadcastSegment"];
10979
+ /** @description Один или несколько ID именованных вариантов рассылки. */
10980
+ mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10981
+ /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10982
+ mechanism?: components["parameters"]["BroadcastMechanism"];
10983
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10984
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10985
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10986
+ product?: components["parameters"]["BroadcastProduct"];
10987
+ /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
10988
+ productMode?: components["parameters"]["BroadcastProductMode"];
10989
+ /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
10990
+ freshness?: components["parameters"]["BroadcastFreshness"];
10991
+ /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10992
+ channels?: components["parameters"]["BroadcastChannels"];
10993
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10994
+ view?: components["parameters"]["BroadcastView"];
10995
+ };
10996
+ header?: never;
10997
+ path: {
10998
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
10999
+ };
11000
+ cookie?: never;
11001
+ };
11002
+ requestBody?: never;
11003
+ responses: {
11004
+ /** @description OK */
11005
+ 200: {
11006
+ headers: {
11007
+ [name: string]: unknown;
11008
+ };
11009
+ content: {
11010
+ "application/json": components["schemas"]["BroadcastPerPersonMetrics"];
11011
+ };
11012
+ };
11013
+ };
11014
+ };
11015
+ put?: never;
11016
+ post?: never;
11017
+ delete?: never;
11018
+ options?: never;
11019
+ head?: never;
11020
+ patch?: never;
11021
+ trace?: never;
11022
+ };
10699
11023
  "/api/v2/workspaces/{workspaceId}/broadcast-analytics/recipients": {
10700
11024
  parameters: {
10701
11025
  query?: never;
@@ -10724,6 +11048,8 @@ export interface paths {
10724
11048
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10725
11049
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10726
11050
  mechanism?: components["parameters"]["BroadcastMechanism"];
11051
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11052
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10727
11053
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10728
11054
  product?: components["parameters"]["BroadcastProduct"];
10729
11055
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10732,7 +11058,7 @@ export interface paths {
10732
11058
  freshness?: components["parameters"]["BroadcastFreshness"];
10733
11059
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10734
11060
  channels?: components["parameters"]["BroadcastChannels"];
10735
- /** @description cohort — дата запуска; period — дата события. */
11061
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10736
11062
  view?: components["parameters"]["BroadcastView"];
10737
11063
  /** @description Конкретный день кликнутой ячейки (МСК). */
10738
11064
  date?: components["parameters"]["BroadcastDate"];
@@ -10749,7 +11075,10 @@ export interface paths {
10749
11075
  /** @description Сузить выборку одной отслеживаемой ссылкой. Уточнение оператора внутри окна: применяется и к списку, и к счётчику — «показано N из M» обязано сходиться. */
10750
11076
  linkId?: string;
10751
11077
  metric: "sent" | "delivered" | "entered" | "deepDialog" | "linkIssued" | "clicked" | "handedOff" | "notDelivered" | "notSent";
10752
- reason?: "NO_MESSENGER" | "ACTIVE_INVOICE_SAME_PRODUCT" | "ACTIVE_DEAL_SAME_PRODUCT" | "PAID_SAME_PRODUCT" | "ACTIVE_DEAL_OTHER_PRODUCT" | "MANAGER_ASSIGNED_ACTIVE_DEAL" | "PRODUCT_CONTEXT_MISSING" | "GETCOURSE_CHECK_ERROR" | "ALREADY_SENT" | "USER_NOT_FOUND";
11078
+ /** @description Откуда брать неотправленных при metric=notSent: preflight — проверка волны школы, schedule — журнал подач авторассылки, ownSend — след отсева ручной холодной отправки. Причины трёх источников живут в разных таблицах. У ownSend список бывает короче числа причины: число — агрегат задачи и полно за всю историю, а построчный след начинается с выкатки (см. tracedCount у причины). */
11079
+ reasonSource?: "preflight" | "schedule" | "ownSend";
11080
+ /** @description Код причины неотправки. Словарь выбирает reasonSource: у preflight это GetCourseWavePreflightReason (NO_MESSENGER, ALREADY_SENT, USER_NOT_FOUND и т.д. — другой код там отвергается, потому что значение кастуется в enum прямо в SQL); у schedule это исход подачи, у ownSend — исход прогона (SKIPPED_BOT_SILENCED и т.д.), и у этих двух проверяется только форма кода: заглавные латинские буквы, цифры и подчёркивания. */
11081
+ reason?: string;
10753
11082
  };
10754
11083
  header?: never;
10755
11084
  path: {
@@ -10806,6 +11135,8 @@ export interface paths {
10806
11135
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10807
11136
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10808
11137
  mechanism?: components["parameters"]["BroadcastMechanism"];
11138
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11139
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10809
11140
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10810
11141
  product?: components["parameters"]["BroadcastProduct"];
10811
11142
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10814,7 +11145,7 @@ export interface paths {
10814
11145
  freshness?: components["parameters"]["BroadcastFreshness"];
10815
11146
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10816
11147
  channels?: components["parameters"]["BroadcastChannels"];
10817
- /** @description cohort — дата запуска; period — дата события. */
11148
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10818
11149
  view?: components["parameters"]["BroadcastView"];
10819
11150
  /** @description Конкретный день кликнутой ячейки (МСК). */
10820
11151
  date?: components["parameters"]["BroadcastDate"];
@@ -10885,6 +11216,8 @@ export interface paths {
10885
11216
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10886
11217
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10887
11218
  mechanism?: components["parameters"]["BroadcastMechanism"];
11219
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11220
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10888
11221
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10889
11222
  product?: components["parameters"]["BroadcastProduct"];
10890
11223
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10893,7 +11226,7 @@ export interface paths {
10893
11226
  freshness?: components["parameters"]["BroadcastFreshness"];
10894
11227
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10895
11228
  channels?: components["parameters"]["BroadcastChannels"];
10896
- /** @description cohort — дата запуска; period — дата события. */
11229
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10897
11230
  view?: components["parameters"]["BroadcastView"];
10898
11231
  /** @description Конкретный день кликнутой ячейки (МСК). */
10899
11232
  date?: components["parameters"]["BroadcastDate"];
@@ -10961,6 +11294,8 @@ export interface paths {
10961
11294
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10962
11295
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10963
11296
  mechanism?: components["parameters"]["BroadcastMechanism"];
11297
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11298
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10964
11299
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10965
11300
  product?: components["parameters"]["BroadcastProduct"];
10966
11301
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10969,7 +11304,7 @@ export interface paths {
10969
11304
  freshness?: components["parameters"]["BroadcastFreshness"];
10970
11305
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10971
11306
  channels?: components["parameters"]["BroadcastChannels"];
10972
- /** @description cohort — дата запуска; period — дата события. */
11307
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10973
11308
  view?: components["parameters"]["BroadcastView"];
10974
11309
  /** @description Конкретный день кликнутой ячейки (МСК). */
10975
11310
  date?: components["parameters"]["BroadcastDate"];
@@ -11039,6 +11374,8 @@ export interface paths {
11039
11374
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11040
11375
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11041
11376
  mechanism?: components["parameters"]["BroadcastMechanism"];
11377
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11378
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11042
11379
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11043
11380
  product?: components["parameters"]["BroadcastProduct"];
11044
11381
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11047,7 +11384,7 @@ export interface paths {
11047
11384
  freshness?: components["parameters"]["BroadcastFreshness"];
11048
11385
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11049
11386
  channels?: components["parameters"]["BroadcastChannels"];
11050
- /** @description cohort — дата запуска; period — дата события. */
11387
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11051
11388
  view?: components["parameters"]["BroadcastView"];
11052
11389
  /** @description Конкретный день кликнутой ячейки (МСК). */
11053
11390
  date?: components["parameters"]["BroadcastDate"];
@@ -11113,6 +11450,8 @@ export interface paths {
11113
11450
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11114
11451
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11115
11452
  mechanism?: components["parameters"]["BroadcastMechanism"];
11453
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11454
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11116
11455
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11117
11456
  product?: components["parameters"]["BroadcastProduct"];
11118
11457
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11121,7 +11460,7 @@ export interface paths {
11121
11460
  freshness?: components["parameters"]["BroadcastFreshness"];
11122
11461
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11123
11462
  channels?: components["parameters"]["BroadcastChannels"];
11124
- /** @description cohort — дата запуска; period — дата события. */
11463
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11125
11464
  view?: components["parameters"]["BroadcastView"];
11126
11465
  };
11127
11466
  header?: never;
@@ -11179,6 +11518,8 @@ export interface paths {
11179
11518
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11180
11519
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11181
11520
  mechanism?: components["parameters"]["BroadcastMechanism"];
11521
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11522
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11182
11523
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11183
11524
  product?: components["parameters"]["BroadcastProduct"];
11184
11525
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11187,7 +11528,7 @@ export interface paths {
11187
11528
  freshness?: components["parameters"]["BroadcastFreshness"];
11188
11529
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11189
11530
  channels?: components["parameters"]["BroadcastChannels"];
11190
- /** @description cohort — дата запуска; period — дата события. */
11531
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11191
11532
  view?: components["parameters"]["BroadcastView"];
11192
11533
  };
11193
11534
  header?: never;
@@ -11245,6 +11586,8 @@ export interface paths {
11245
11586
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11246
11587
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11247
11588
  mechanism?: components["parameters"]["BroadcastMechanism"];
11589
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11590
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11248
11591
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11249
11592
  product?: components["parameters"]["BroadcastProduct"];
11250
11593
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11253,7 +11596,7 @@ export interface paths {
11253
11596
  freshness?: components["parameters"]["BroadcastFreshness"];
11254
11597
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11255
11598
  channels?: components["parameters"]["BroadcastChannels"];
11256
- /** @description cohort — дата запуска; period — дата события. */
11599
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11257
11600
  view?: components["parameters"]["BroadcastView"];
11258
11601
  };
11259
11602
  header?: never;
@@ -11311,6 +11654,8 @@ export interface paths {
11311
11654
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11312
11655
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11313
11656
  mechanism?: components["parameters"]["BroadcastMechanism"];
11657
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11658
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11314
11659
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11315
11660
  product?: components["parameters"]["BroadcastProduct"];
11316
11661
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11319,7 +11664,7 @@ export interface paths {
11319
11664
  freshness?: components["parameters"]["BroadcastFreshness"];
11320
11665
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11321
11666
  channels?: components["parameters"]["BroadcastChannels"];
11322
- /** @description cohort — дата запуска; period — дата события. */
11667
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11323
11668
  view?: components["parameters"]["BroadcastView"];
11324
11669
  };
11325
11670
  header?: never;
@@ -11380,6 +11725,8 @@ export interface paths {
11380
11725
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11381
11726
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11382
11727
  mechanism?: components["parameters"]["BroadcastMechanism"];
11728
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11729
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11383
11730
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11384
11731
  product?: components["parameters"]["BroadcastProduct"];
11385
11732
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11457,6 +11804,8 @@ export interface paths {
11457
11804
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11458
11805
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11459
11806
  mechanism?: components["parameters"]["BroadcastMechanism"];
11807
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11808
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11460
11809
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11461
11810
  product?: components["parameters"]["BroadcastProduct"];
11462
11811
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -15681,6 +16030,26 @@ export interface paths {
15681
16030
  patch?: never;
15682
16031
  trace?: never;
15683
16032
  };
16033
+ "/api/v2/workspaces/{workspaceId}/amocrm/channel-registration": {
16034
+ parameters: {
16035
+ query?: never;
16036
+ header?: never;
16037
+ path?: never;
16038
+ cookie?: never;
16039
+ };
16040
+ /**
16041
+ * AmoCRM chat-channel registration request (webhook URL + support email template)
16042
+ * @description Чтобы переписка бота появлялась в карточке сделки AmoCRM, их поддержка должна ЗАРЕГИСТРИРОВАТЬ канал по письму заданной формы; channelId/channelSecretKey выдают только так. Текст письма и адрес вебхука собирает бэкенд (канон ai-aniomaly/src/core/application/crms/amocrm/constants/amocrm-channel-registration.constants.ts) — тем же ответом пользуется страница AmoCRM в интерфейсе. Копий у клиентов нет намеренно: письмо регистрирует адрес, на который потом идут входящие, и разошедшийся текст дал бы канал, смотрящий не туда, — это обнаружилось бы только пропажей сообщений.
16043
+ */
16044
+ get: operations["getAmoCrmChannelRegistration"];
16045
+ put?: never;
16046
+ post?: never;
16047
+ delete?: never;
16048
+ options?: never;
16049
+ head?: never;
16050
+ patch?: never;
16051
+ trace?: never;
16052
+ };
15684
16053
  "/api/v2/workspaces/{workspaceId}/crms/{crmId}/field-mapping": {
15685
16054
  parameters: {
15686
16055
  query?: never;
@@ -18983,10 +19352,201 @@ export interface paths {
18983
19352
  patch?: never;
18984
19353
  trace?: never;
18985
19354
  };
19355
+ "/api/v2/workspaces/{workspaceId}/custom-reports/{reportId}/report": {
19356
+ parameters: {
19357
+ query?: never;
19358
+ header?: never;
19359
+ path?: never;
19360
+ cookie?: never;
19361
+ };
19362
+ /**
19363
+ * Живой расчёт сохранённой таблицы за период
19364
+ * @description Для источника «Перс воронка» дополнительно возвращает единый snapshot: calculatedAt, executionDbSnapshot, currentStepsFingerprint и reportUpdatedAt. Все четыре значения нужно без изменений передать в drill-down; у legacy-источников snapshot-поля отсутствуют.
19365
+ */
19366
+ get: operations["getCustomReportData"];
19367
+ put?: never;
19368
+ post?: never;
19369
+ delete?: never;
19370
+ options?: never;
19371
+ head?: never;
19372
+ patch?: never;
19373
+ trace?: never;
19374
+ };
19375
+ "/api/v2/workspaces/{workspaceId}/custom-reports/{reportId}/drilldown": {
19376
+ parameters: {
19377
+ query?: never;
19378
+ header?: never;
19379
+ path?: never;
19380
+ cookie?: never;
19381
+ };
19382
+ /**
19383
+ * Контакты и сделки за числом сохранённой таблицы
19384
+ * @description Возвращает конкретные исполнения, контакты или сделки за числовой ячейкой источников «Обзор», «Фоллоу-апы» и «Перс воронка». Сервер перечитывает определение отчёта и проверяет updatedAt; сводная передаёт полный путь строки. Snapshot и fingerprint обязательны только для personalized-источника. Для процентной колонки раскрывается фактический числитель.
19385
+ */
19386
+ get: operations["getCustomReportDrilldown"];
19387
+ put?: never;
19388
+ post?: never;
19389
+ delete?: never;
19390
+ options?: never;
19391
+ head?: never;
19392
+ patch?: never;
19393
+ trace?: never;
19394
+ };
18986
19395
  }
18987
19396
  export type webhooks = Record<string, never>;
18988
19397
  export interface components {
18989
19398
  schemas: {
19399
+ TriggerContactClaim: {
19400
+ /** Format: uuid */
19401
+ triggerId: string;
19402
+ triggerName: string;
19403
+ /** Format: uuid */
19404
+ agentId: string;
19405
+ agentName: string | null;
19406
+ /** @enum {string} */
19407
+ status: "IN_PROGRESS" | "COMPLETED";
19408
+ /** Format: date-time */
19409
+ claimedAt: string;
19410
+ /** @description false у status=IN_PROGRESS — право держит владелец */
19411
+ canReset: boolean;
19412
+ /** @enum {string|null} */
19413
+ blockedReason: "RUNNING" | null;
19414
+ triggerIsEnabled: boolean;
19415
+ /** @description Осталась ли включённой настройка «сработать один раз». Право переживает её выключение: тогда строка висит, но триггер срабатывает как обычный. */
19416
+ stillOneTime: boolean;
19417
+ };
19418
+ TriggerContactClaimsPage: {
19419
+ claims: components["schemas"]["TriggerContactClaim"][];
19420
+ truncated: boolean;
19421
+ };
19422
+ ResetTriggerClaimRequest: {
19423
+ /**
19424
+ * @description Обязательное подтверждение: триггер сможет повторить необратимые действия во внешних системах. Проверяется на сервере, а не только в MCP-клиенте.
19425
+ * @enum {boolean}
19426
+ */
19427
+ explicitConfirmation: true;
19428
+ };
19429
+ CustomReportMetricValues: {
19430
+ [key: string]: number | null;
19431
+ };
19432
+ CustomReportBucket: {
19433
+ /** Format: date */
19434
+ key: string;
19435
+ /** Format: date */
19436
+ from: string;
19437
+ /** Format: date */
19438
+ to: string;
19439
+ partial: boolean;
19440
+ rows: {
19441
+ [key: string]: components["schemas"]["CustomReportMetricValues"];
19442
+ };
19443
+ total: components["schemas"]["CustomReportMetricValues"];
19444
+ comparableReliable?: boolean;
19445
+ };
19446
+ CustomReportGrandTotal: {
19447
+ /** Format: date */
19448
+ from: string;
19449
+ /** Format: date */
19450
+ to: string;
19451
+ rows: {
19452
+ [key: string]: components["schemas"]["CustomReportMetricValues"];
19453
+ };
19454
+ total: components["schemas"]["CustomReportMetricValues"];
19455
+ comparableReliable?: boolean;
19456
+ };
19457
+ CustomReportDrilldownSnapshot: {
19458
+ /** Format: date-time */
19459
+ calculatedAt: string;
19460
+ executionDbSnapshot: string;
19461
+ currentStepsFingerprint: string;
19462
+ /** Format: date-time */
19463
+ reportUpdatedAt: string;
19464
+ };
19465
+ CustomReportStepSchedule: {
19466
+ /** @enum {string} */
19467
+ kind: "offset" | "clock" | "beforeMeeting" | "unknown";
19468
+ minutes?: number;
19469
+ dayOffset?: number;
19470
+ atTime?: string;
19471
+ };
19472
+ CustomReportDataResponse: {
19473
+ metricKeys: string[];
19474
+ dimensionValues: string[];
19475
+ buckets: components["schemas"]["CustomReportBucket"][];
19476
+ grandTotal: components["schemas"]["CustomReportGrandTotal"] | null;
19477
+ availableDimensionValues: string[];
19478
+ availableMetricKeys: string[];
19479
+ dimensionLabels?: {
19480
+ [key: string]: string;
19481
+ };
19482
+ rowSequenceNames?: {
19483
+ [key: string]: string;
19484
+ };
19485
+ /** @description Только personalized-funnel: безопасное расписание шага по адресу строки. Текст сообщения, условия, variable hints и вложения не возвращаются. */
19486
+ rowStepSchedules?: {
19487
+ [key: string]: components["schemas"]["CustomReportStepSchedule"];
19488
+ };
19489
+ /** Format: date-time */
19490
+ historyStartsAt?: string | null;
19491
+ nestedRows?: {
19492
+ [key: string]: unknown;
19493
+ }[];
19494
+ nestedTruncated?: boolean;
19495
+ nestedTotalRowCount?: number;
19496
+ /** Format: date-time */
19497
+ calculatedAt?: string;
19498
+ executionDbSnapshot?: string;
19499
+ currentStepsFingerprint?: string;
19500
+ /** Format: date-time */
19501
+ reportUpdatedAt?: string;
19502
+ };
19503
+ CustomReportDrilldownLink: {
19504
+ /** @description Идентификатор выдачи ссылки; для агрегированных источников может быть составным. */
19505
+ issueId: string;
19506
+ name: string;
19507
+ /** Format: uri */
19508
+ targetUrl: string;
19509
+ /** Format: date-time */
19510
+ clickedAt: string | null;
19511
+ };
19512
+ CustomReportDrilldownRow: {
19513
+ id: string;
19514
+ /** Format: uuid */
19515
+ chatUserId: string | null;
19516
+ contactName: string | null;
19517
+ contactPhone: string | null;
19518
+ /** Format: date-time */
19519
+ happenedAt: string | null;
19520
+ status: string | null;
19521
+ failedCondition: string | null;
19522
+ failedValue: string | null;
19523
+ /** Format: uri */
19524
+ getcourseUserUrl: string | null;
19525
+ /** Format: uri */
19526
+ getcourseDealUrl: string | null;
19527
+ /**
19528
+ * Format: uri
19529
+ * @description Сделка/лид в активной AmoCRM или Bitrix24.
19530
+ */
19531
+ crmUrl: string | null;
19532
+ links: components["schemas"]["CustomReportDrilldownLink"][];
19533
+ };
19534
+ CustomReportDrilldownResponse: {
19535
+ items: components["schemas"]["CustomReportDrilldownRow"][];
19536
+ total: number;
19537
+ /** @description Фактический числитель для процентной колонки. */
19538
+ resolvedMetricKey: string;
19539
+ };
19540
+ /**
19541
+ * @description Минимальная длина включительного period-окна, на котором считаются доли исходов custom-reports и карточек «Обзора». Литеральный тип механически связывает backend и frontend через сгенерированный API-контракт.
19542
+ * @enum {integer}
19543
+ */
19544
+ CustomReportOutcomeRateMinWindowDays: 21;
19545
+ /**
19546
+ * @description Канонические доли исходов, которые в period-режиме доступны только на окне не короче CustomReportOutcomeRateMinWindowDays. Исчерпывающие backend/frontend-реестры типизированы этим enum, поэтому удаление или добавление ключа только на одной стороне ломает компиляцию.
19547
+ * @enum {string}
19548
+ */
19549
+ CustomReportOutcomeRateMetric: "clickedRate" | "enteredDialogRate" | "replyRate" | "deepDialogRate" | "handedRate" | "paidRate";
18990
19550
  UpdateDialogScriptRequest: {
18991
19551
  /** @description Вводная проза §6 до первой ветки (опц.) */
18992
19552
  preamble?: string;
@@ -19103,6 +19663,10 @@ export interface components {
19103
19663
  */
19104
19664
  launchType: "status";
19105
19665
  channels: components["schemas"]["GetCourseTransport"][];
19666
+ /**
19667
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
19668
+ * @example f11 — ДБО / NR / ВК / In Stream
19669
+ */
19106
19670
  funnel?: string;
19107
19671
  segment?: string;
19108
19672
  /** @description Явное бизнес-правило отбора; требует segment. */
@@ -19168,6 +19732,8 @@ export interface components {
19168
19732
  * @description Точный момент входа контакта в когорту (ISO 8601, зона ОБЯЗАТЕЛЬНА — …Z либо ±ЧЧ:ММ). На нём считается свежесть в «Аналитике рассылок»: возраст = время отправки минус segmentEnteredAt. Заполняется, когда предсписок собран ПРАВИЛОМ и у каждой строки есть свой момент события (например eventAt регистрации). Не передан — возраст строки остаётся неизвестным. Дату запуска сюда подставлять нельзя: она схлопнула бы месяцы когорт в одну корзину.
19169
19733
  */
19170
19734
  segmentEnteredAt?: string;
19735
+ /** @description Воронка ЭТОГО контакта (например «f11 — ДБО / NR / ВК / In Stream»). Заполняется, когда файл собран из НЕСКОЛЬКИХ воронок: одна метка на запуск заставляла писать в поле воронки когорту («reg-no-show|дбо»), и фильтр по воронке переставал отвечать на свой вопрос — по f11 он показывал ноль отправок за 30 дней при 3267 регистрациях (замер 02.09.2026). Когорта и продукт лежат в своих полях segment и productCode. Не передана — берётся воронка запуска (funnel). */
19736
+ funnel?: string;
19171
19737
  };
19172
19738
  /** @description Ровно одна аудитория — createdAfter ЛИБО contacts. */
19173
19739
  GetCourseColdWelcomePreviewRequest: {
@@ -19203,6 +19769,8 @@ export interface components {
19203
19769
  alreadyWelcomed: number;
19204
19770
  /** @description Всего найдено под границей. */
19205
19771
  foundContacts: number;
19772
+ /** @description Строк файла БЕЗ момента входа в сегмент (segment_entered_at). Такой контакт не попадёт ни в один период оси «вход в сегмент» на «Аналитике коммуникации» — он невидим ровно там, где спрашивают «сколько людей пришло за месяц». Предупреждение, а не запрет: у аудитории, заданной границей даты или файлом без события, момента входа нет вовсе. Считается по СЫРЫМ строкам запроса, чтобы число сходилось с файлом. */
19773
+ rowsWithoutSegmentEntry?: number;
19206
19774
  };
19207
19775
  /** @description Не больше ОДНОЙ аудитории: contacts (поимённый список) ЛИБО currentAnchorValue (когорта). Без обеих — вся площадка (все контакты с непустым якорем). */
19208
19776
  GetCourseAnchorRefreshRequest: {
@@ -19265,6 +19833,10 @@ export interface components {
19265
19833
  /** @description Метка сегмента. Аудиторию НЕ отбирает. Если у рассылки есть текст именно для этого сегмента, он выбирает текст запуска — и тогда аудитория обязана быть файловой. */
19266
19834
  segment?: string;
19267
19835
  productCode?: string;
19836
+ /**
19837
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
19838
+ * @example f11 — ДБО / NR / ВК / In Stream
19839
+ */
19268
19840
  funnel?: string;
19269
19841
  /** @description Человекочитаемое имя ЭТОГО запуска — подпись когорты в «Аналитике рассылок». Не имя рассылки и не метка сегмента: те одинаковы у всех запусков, а разрез «по запускам» строится именно по подписи. Пусто — подпись собирается из даты запуска, имени рассылки и меток, так что запуски всё равно остаются различимыми. */
19270
19842
  cohortLabel?: string;
@@ -19281,6 +19853,10 @@ export interface components {
19281
19853
  /** @description Он же выбирает текст, если у рассылки есть посегментные тексты. */
19282
19854
  segment?: string;
19283
19855
  productCode?: string;
19856
+ /**
19857
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
19858
+ * @example f11 — ДБО / NR / ВК / In Stream
19859
+ */
19284
19860
  funnel?: string;
19285
19861
  /** @description Подпись запуска ЭТОГО блока. У пакета каждый сегмент — отдельный запуск со своей задачей и когортой, поэтому подпись задаётся посегментно; общая на пакет схлопнула бы их в отчёте в одну корзину. */
19286
19862
  cohortLabel?: string;
@@ -19301,12 +19877,27 @@ export interface components {
19301
19877
  channels?: components["schemas"]["GetCourseTransport"][];
19302
19878
  /** @deprecated */
19303
19879
  channelsMode?: components["schemas"]["ColdWelcomeChannelsMode"];
19880
+ /** @description Перекрытие предохранителей на ЭТОТ пакет (аварийный обход). Ключ не передан — берётся настройка площадки. Снимок кладётся в строку durable-плана, поэтому resume после рестарта едет с тем же решением. */
19881
+ guards?: components["schemas"]["OutboundGuardModes"];
19882
+ };
19883
+ /** @description Предохранители холодных отправок. Не писать, пока идёт вебинарная серия человека, пока с ним работает менеджер по действующей заявке и если он уже оплатил ЭТОТ продукт. Пропуск ключа = не трогать; null = «не настраивали» (действует дефолт: activeSeries BLOCK, остальные WARN). Подробности — docs/features/outbound-guards.md. */
19884
+ OutboundGuardModes: {
19885
+ activeSeries?: components["schemas"]["OutboundGuardMode"];
19886
+ activeApplication?: components["schemas"]["OutboundGuardMode"];
19887
+ paid?: components["schemas"]["OutboundGuardMode"];
19304
19888
  };
19889
+ /**
19890
+ * @description OFF — правило не работает; WARN — причина пишется в аудит, отправка идёт; BLOCK — отправка останавливается.
19891
+ * @enum {string|null}
19892
+ */
19893
+ OutboundGuardMode: "OFF" | "WARN" | "BLOCK" | null;
19305
19894
  GetCourseColdWelcomeBatchResponse: {
19306
19895
  /** Format: uuid */
19307
19896
  batchId: string;
19308
19897
  /** @description Сколько сегментов поставлено в очередь */
19309
19898
  segments: number;
19899
+ /** @description Строк файла БЕЗ момента входа в сегмент (segment_entered_at). Такой контакт не попадёт ни в один период оси «вход в сегмент» на «Аналитике коммуникации» — он невидим ровно там, где спрашивают «сколько людей пришло за месяц». Предупреждение, а не запрет: у аудитории, заданной границей даты или файлом без события, момента входа нет вовсе. Считается по СЫРЫМ строкам запроса, чтобы число сходилось с файлом. */
19900
+ rowsWithoutSegmentEntry?: number;
19310
19901
  };
19311
19902
  GetCourseColdWelcomeBatchSegmentStatus: {
19312
19903
  position: number;
@@ -19389,6 +19980,10 @@ export interface components {
19389
19980
  outcomes?: {
19390
19981
  [key: string]: number;
19391
19982
  } | null;
19983
+ /** @description Сколько контактов каждого исхода разбирается ПОИМЁННО — по построчному следу отсева. Ключи те же, что в outcomes, но только у неотправленных: у SENT след это строка реестра получателей. Числа исходов остаются в outcomes (агрегат полон за всю историю), а след начинается с 02.09.2026, поэтому у прежних запусков здесь пусто — витрина по этому полю решает, открывать ли список. Null у волны и у прогона расписания: у них свои носители. */
19984
+ tracedOutcomes?: {
19985
+ [key: string]: number;
19986
+ } | null;
19392
19987
  /** @description Сколько отправок ушло ВСЛЕПУЮ: канал взят резервным транспортом площадки, а не доказан привязками контакта или его ответом. Это ПОДМНОЖЕСТВО sentCount, а не отдельный исход — сообщение ушло. Без него «доставлено в мессенджер» и «упало в личный кабинет сайта» в истории неразличимы. null — у волн (отправляет процесс школы) и у запусков до появления счётчика; это НЕ то же, что 0. */
19393
19988
  sentWithoutChannelEvidence?: number | null;
19394
19989
  /** Format: date-time */
@@ -19471,6 +20066,10 @@ export interface components {
19471
20066
  */
19472
20067
  launchType: "status";
19473
20068
  channels: components["schemas"]["GetCourseTransport"][];
20069
+ /**
20070
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
20071
+ * @example f11 — ДБО / NR / ВК / In Stream
20072
+ */
19474
20073
  funnel?: string;
19475
20074
  segment?: string;
19476
20075
  /** @description Явное бизнес-правило отбора; требует segment. */
@@ -19977,6 +20576,14 @@ export interface components {
19977
20576
  comparableSent: number;
19978
20577
  /** @description Ответили в пределах равного горизонта */
19979
20578
  horizonReplied: number;
20579
+ /**
20580
+ * @description Отреагировали ХОТЬ КАК-ТО в том же горизонте: ответили ИЛИ перешли по ссылке
20581
+ * этого касания. Всегда >= horizonReplied, разность — те, кто НЕ ответил, но кликнул.
20582
+ * ⚠️ Складывать horizonReplied и linkClicked вместо этого нельзя: ответивший часто
20583
+ * ещё и кликает, и сумма задваивала бы его. Знаменатель тот же (comparableSent),
20584
+ * включая касания без ссылки: это доля отреагировавших на касание, а не CTR ссылки.
20585
+ */
20586
+ horizonEngaged: number;
19980
20587
  /** @description Прервано чужим касанием до конца горизонта */
19981
20588
  censored: number;
19982
20589
  /** @description Доля вырезанных от СОЗРЕВШЕГО пула (comparableSent + censored) */
@@ -20172,6 +20779,34 @@ export interface components {
20172
20779
  } | null;
20173
20780
  replyToStoryMentions?: boolean;
20174
20781
  };
20782
+ funnelAnalytics?: {
20783
+ /** @description Тройка стадий «отправлено → одобрено | отклонено» (у Aslzar — скоринг рассрочки). null — сбросить ворота: блок перестаёт рисоваться. */
20784
+ decisionGate?: {
20785
+ submitted: {
20786
+ pipelineCrmId: string;
20787
+ pipelineId: number;
20788
+ statusId: number;
20789
+ };
20790
+ approved: {
20791
+ pipelineCrmId: string;
20792
+ pipelineId: number;
20793
+ statusId: number;
20794
+ };
20795
+ rejected: {
20796
+ pipelineCrmId: string;
20797
+ pipelineId: number;
20798
+ statusId: number;
20799
+ };
20800
+ } | null;
20801
+ /** @description Целевая стадия карточки «Путь до стадии». null — сбросить выбор. */
20802
+ pathTargetStage?: {
20803
+ pipelineCrmId: string;
20804
+ pipelineId: number;
20805
+ statusId: number;
20806
+ } | null;
20807
+ engagedInboundCount?: number | null;
20808
+ stuckThresholdHours?: number | null;
20809
+ };
20175
20810
  /** @description Closes Phase B gap для name/offMessage/timezone/isActive. Any channel type. */
20176
20811
  generalSettings?: {
20177
20812
  name?: string | null;
@@ -20226,6 +20861,9 @@ export interface components {
20226
20861
  channels?: components["schemas"]["GetCourseWaveFieldBinding"];
20227
20862
  } | null;
20228
20863
  deliveryCheckEnabled?: boolean;
20864
+ guardActiveSeries?: components["schemas"]["OutboundGuardMode"];
20865
+ guardActiveApplication?: components["schemas"]["OutboundGuardMode"];
20866
+ guardPaid?: components["schemas"]["OutboundGuardMode"];
20229
20867
  /** @description Transport → exact deal custom field NAME (read API returns no field ids). Clear with {}. */
20230
20868
  deliveryFieldMap?: {
20231
20869
  [key: string]: string;
@@ -20925,6 +21563,20 @@ export interface components {
20925
21563
  pipelineTransitionsLog?: Record<string, never>[];
20926
21564
  toolCallLog?: Record<string, never>[];
20927
21565
  ragTestResults?: Record<string, never>[];
21566
+ /** @description Рубрика прогона: `TestScenario.situations` сценариев этого прогона, как их написал автор. Строки role=agent — ОЖИДАЕМОЕ поведение агента; рантайм их не исполняет (`extractTurns` берёт только role=client/user), и `passRate` их не измеряет — он считает лишь долю turn-ов с непустым ответом. Заполняется только на findings-instructions (`/sandbox/runs/{runId}/findings/instructions`); `GET /sandbox-runs/{runId}` поле не отдаёт. Отсутствие поля = «рубрика не читалась», пустой `situations` = «у сценария нет реплик». Сценария, удалённого после прогона, здесь нет вовсе — хотя в `perScenarioMetrics` он остаётся. */
21567
+ scenarioExpectations?: {
21568
+ /** Format: uuid */
21569
+ scenarioId: string;
21570
+ scenarioName?: string;
21571
+ /** @description Что именно проверяет сценарий — часть рубрики, а не подпись. */
21572
+ description?: string | null;
21573
+ /** @description Реплики в исходном порядке (role=client — вход, role=agent — ожидание). Порядок и есть привязка ожидания к turn-у: индекс транскрипта смещается при OUTBOUND-seeding, поэтому готового номера turn-а здесь нет намеренно. */
21574
+ situations: {
21575
+ /** @enum {string} */
21576
+ role?: "client" | "agent";
21577
+ text?: string;
21578
+ }[];
21579
+ }[];
20928
21580
  };
20929
21581
  /** @description A single router decision recorded for one turn of a sandbox run. */
20930
21582
  SandboxRoutingLogEntry: {
@@ -21459,8 +22111,65 @@ export interface components {
21459
22111
  PatchDraftOperationsRequest: {
21460
22112
  operations: components["schemas"]["PromptPatchOperation"][];
21461
22113
  };
22114
+ /**
22115
+ * @description Черновик БЕЗ `currentContent` и без истории `operations[]`.
22116
+ *
22117
+ * Полный текст отдают `POST /prompt/drafts` (первое чтение промпта) и
22118
+ * `GET /prompt/drafts/{draftId}` (перечитать по требованию). Эхо текста в ответе
22119
+ * КАЖДОГО `_apply`/`_commit` — накладные расходы: клиент уже прочитал промпт на
22120
+ * старте, а история операций повторяет то, что он сам же и отправил.
22121
+ */
22122
+ PromptDraftMeta: {
22123
+ /** Format: uuid */
22124
+ id: string;
22125
+ /** Format: uuid */
22126
+ agentId: string;
22127
+ status: components["schemas"]["PromptDraftStatus"];
22128
+ /** Format: uuid */
22129
+ baseVersionId: string;
22130
+ baseContentHash: string;
22131
+ /** Format: uuid */
22132
+ committedVersionId?: string | null;
22133
+ /**
22134
+ * @description Длина `currentContent`. Сверяется с остатком `GET /prompt/headroom`
22135
+ * без чтения самого текста.
22136
+ */
22137
+ characters: number;
22138
+ /** @description Сколько patch-операций накоплено черновиком за всю жизнь. */
22139
+ operationsCount: number;
22140
+ /** Format: date-time */
22141
+ expiresAt: string;
22142
+ /** Format: date-time */
22143
+ updatedAt: string;
22144
+ };
22145
+ /** @description Построчная разница состояния черновика ДО и ПОСЛЕ применённых операций. */
22146
+ PromptPatchDiff: {
22147
+ /**
22148
+ * @description Текст черновика реально изменился.
22149
+ *
22150
+ * Отдельный признак обязателен: `removedLines`/`addedLines` — multiset-разность
22151
+ * строк, и `move_text_after_text` (как и правка одних пробелов) даёт ПУСТОЙ дифф
22152
+ * при изменившемся тексте. Без этого поля пустые списки читались бы как
22153
+ * «ничего не применилось».
22154
+ */
22155
+ contentChanged: boolean;
22156
+ /**
22157
+ * @description Насколько вырос (отрицательное — сжался) черновик, в символах.
22158
+ * Абсолютная длина — `draft.characters`, чтобы одно число не жило в двух полях.
22159
+ */
22160
+ charactersDelta: number;
22161
+ /** @description Строки, исчезнувшие из черновика. */
22162
+ removedLines: components["schemas"]["PromptDiffLine"][];
22163
+ /** @description Строки, появившиеся в черновике. */
22164
+ addedLines: components["schemas"]["PromptDiffLine"][];
22165
+ /**
22166
+ * @description Списки обрезаны по потолку строк на сторону (`PROMPT_PATCH_DIFF_MAX_LINES`).
22167
+ * Полный текст читать через `GET /prompt/drafts/{draftId}`.
22168
+ */
22169
+ truncated: boolean;
22170
+ };
21462
22171
  PromptDraftPatchResponse: {
21463
- draft: components["schemas"]["PromptDraft"];
22172
+ draft: components["schemas"]["PromptDraftMeta"];
21464
22173
  /** @description Сколько ops успешно применились */
21465
22174
  appliedCount: number;
21466
22175
  /**
@@ -21468,15 +22177,23 @@ export interface components {
21468
22177
  * Клиент должен показать warning если > 0.
21469
22178
  */
21470
22179
  skippedCount: number;
22180
+ diff: components["schemas"]["PromptPatchDiff"];
21471
22181
  };
21472
22182
  PromptDraftCommitResponse: {
21473
- draft: components["schemas"]["PromptDraft"];
22183
+ draft: components["schemas"]["PromptDraftMeta"];
22184
+ /**
22185
+ * @description Только адресация новой версии. `content` намеренно НЕ отдаётся: это была бы
22186
+ * вторая копия текста, который клиент сам и собрал.
22187
+ */
21474
22188
  newVersion: {
21475
22189
  /** Format: uuid */
21476
22190
  id: string;
21477
- /** @description 0 если synthesized из 410-retry path */
21478
- version?: number;
21479
- content: string;
22191
+ /**
22192
+ * @description `null` — идемпотентный повтор commit'а (draft уже был COMMITTED): номер версии
22193
+ * на этом пути неизвестен, черновик его не несёт. Внутренний сентинел `-1` наружу
22194
+ * НЕ выпускается: в JSON он неотличим от настоящего номера версии.
22195
+ */
22196
+ version: number | null;
21480
22197
  };
21481
22198
  };
21482
22199
  /** @enum {string} */
@@ -21762,9 +22479,11 @@ export interface components {
21762
22479
  [key: string]: unknown;
21763
22480
  } | null;
21764
22481
  /** @enum {string|null} */
21765
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
22482
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
21766
22483
  llmModel?: string | null;
21767
22484
  /** @enum {string|null} */
22485
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
22486
+ /** @enum {string|null} */
21768
22487
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai" | null;
21769
22488
  realtimeModel?: string | null;
21770
22489
  realtimeVoice?: string | null;
@@ -21785,10 +22504,8 @@ export interface components {
21785
22504
  fillerStatus?: string | null;
21786
22505
  vadProvider?: string | null;
21787
22506
  turnDetector?: string | null;
21788
- /** @description Ручки turn-taking/barge-in (A2): interruption/endpointing (мс) + vad (мс) */
21789
- turnTakingConfig?: {
21790
- [key: string]: unknown;
21791
- } | null;
22507
+ /** @description Typed ручки turn-taking/barge-in (A2) */
22508
+ turnTakingConfig?: components["schemas"]["VoiceProfileTurnTakingConfig"] | null;
21792
22509
  sentimentAnalysisEnabled: boolean;
21793
22510
  ttsFailoverEnabled: boolean;
21794
22511
  recordingCopyEnabled: boolean;
@@ -22363,6 +23080,11 @@ export interface components {
22363
23080
  /** @description Ручки turn-taking/barge-in (A2): typed-схема входа (незнакомые ключи отвергаются, диапазоны зеркалят клампы воркера). Время — мс. */
22364
23081
  VoiceProfileTurnTakingConfig: {
22365
23082
  allowInterruptions?: boolean;
23083
+ /**
23084
+ * @description CASCADE: adaptive требует STT с aligned transcript и LiveKit Cloud/dev runtime; внешний production worker использует VAD. REALTIME использует нативный turn detection
23085
+ * @enum {string}
23086
+ */
23087
+ interruptionMode?: "vad" | "adaptive";
22366
23088
  minInterruptionDuration?: number;
22367
23089
  minInterruptionWords?: number;
22368
23090
  minEndpointingDelay?: number;
@@ -22411,8 +23133,10 @@ export interface components {
22411
23133
  ttsPronunciationCaseSensitive?: boolean;
22412
23134
  ttsProviderSettings?: components["schemas"]["VoiceProfileTtsProviderSettings"];
22413
23135
  /** @enum {string} */
22414
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras";
23136
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras";
22415
23137
  llmModel?: string;
23138
+ /** @enum {string|null} */
23139
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
22416
23140
  /** @enum {string} */
22417
23141
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai";
22418
23142
  realtimeModel?: string;
@@ -22500,9 +23224,11 @@ export interface components {
22500
23224
  [key: string]: unknown;
22501
23225
  } | null;
22502
23226
  /** @enum {string|null} */
22503
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
23227
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
22504
23228
  llmModel?: string | null;
22505
23229
  /** @enum {string|null} */
23230
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
23231
+ /** @enum {string|null} */
22506
23232
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai" | null;
22507
23233
  realtimeModel?: string | null;
22508
23234
  realtimeVoice?: string | null;
@@ -22524,10 +23250,8 @@ export interface components {
22524
23250
  telephonyFilterEnabled: boolean;
22525
23251
  vadProvider?: string | null;
22526
23252
  turnDetector?: string | null;
22527
- /** @description Ручки turn-taking/barge-in (A2): interruption/endpointing (мс) + vad (мс) */
22528
- turnTakingConfig?: {
22529
- [key: string]: unknown;
22530
- } | null;
23253
+ /** @description Typed ручки turn-taking/barge-in (A2) */
23254
+ turnTakingConfig?: components["schemas"]["VoiceProfileTurnTakingConfig"] | null;
22531
23255
  /** @description Сентимент-анализ user-реплик (A1) */
22532
23256
  sentimentAnalysisEnabled: boolean;
22533
23257
  /** @description false (дефолт) — отказ TTS завершает звонок, голос не подменяется */
@@ -22681,6 +23405,8 @@ export interface components {
22681
23405
  /** Format: uuid */
22682
23406
  platformId?: string;
22683
23407
  inputTokens?: number;
23408
+ /** @description Часть inputTokens, прочитанная из provider prompt cache */
23409
+ cacheReadTokens?: number;
22684
23410
  outputTokens?: number;
22685
23411
  totalTokens?: number;
22686
23412
  inputAudioSeconds?: number;
@@ -23062,7 +23788,7 @@ export interface components {
23062
23788
  isBotActive?: boolean;
23063
23789
  isFollowUpActive?: boolean;
23064
23790
  /** @enum {string|null} */
23065
- lastWorkLogEvent?: "START" | "IN_PROCESS" | "FINISH_WIN" | "FINISH_LOST" | "FAILED" | "OPERATOR_TAKEOVER" | "FINISH_AUTO" | null;
23791
+ lastWorkLogEvent?: "START" | "IN_PROCESS" | "FINISH_WIN" | "FINISH_LOST" | "FAILED" | "OPERATOR_TAKEOVER" | "FINISH_AUTO" | "FINISH_RESOLVED" | null;
23066
23792
  /**
23067
23793
  * Format: date-time
23068
23794
  * @description Время последней отправки волны/рассылки этому контакту (BroadcastRecipient.receivedAt). Опорная точка атрибуции: от неё считается «сколько прошло до ответа клиента и до оплаты». null — контакт в волны не попадал.
@@ -23352,6 +24078,18 @@ export interface components {
23352
24078
  paid: number;
23353
24079
  paidAmount: number;
23354
24080
  };
24081
+ TrackedLinkReachBreakdown: {
24082
+ platformId: string | null;
24083
+ platformName: string | null;
24084
+ /** @description Площадка удалена. Отдельный признак, а не пустое имя: Platform.name nullable, и живая безымянная площадка существует. */
24085
+ platformDeleted: boolean;
24086
+ agentId: string | null;
24087
+ agentName: string | null;
24088
+ /** @description Агент удалён; выдачи и клики сохранены */
24089
+ agentDeleted: boolean;
24090
+ issued: number;
24091
+ clicked: number;
24092
+ };
23355
24093
  TrackedLinkClickEvents: {
23356
24094
  items: components["schemas"]["TrackedLinkClickEvent"][];
23357
24095
  total: number;
@@ -23404,11 +24142,82 @@ export interface components {
23404
24142
  data: components["schemas"]["BroadcastMetricRow"][];
23405
24143
  /** @description Итоги без channel-unnest; использовать для общей цифры вместо суммы data по каналам. */
23406
24144
  totals: components["schemas"]["BroadcastMetricRow"][];
24145
+ /** @description Разрез по площадкам за ВЕСЬ период (без дней). Считается третьим набором тех же GROUPING SETS, что и totals, поэтому сходится с ними по построению. Дней тут нет намеренно: sent/received client-distinct и по дням не аддитивны. Ручная историческая статистика не входит — площадки у неё нет. */
24146
+ platformTotals?: components["schemas"]["BroadcastPlatformTotal"][];
23407
24147
  channels: string[];
23408
24148
  funnels: string[];
23409
24149
  segments: string[];
23410
24150
  products: string[];
23411
24151
  };
24152
+ BroadcastPlatformTotal: {
24153
+ /**
24154
+ * Format: uuid
24155
+ * @description ID площадки рассылки; null — у строки площадка не проставлена.
24156
+ */
24157
+ platformId: string | null;
24158
+ /** @description Воронка волны. Разрез несёт её, потому что страница фильтрует воронки клиентски. */
24159
+ funnel: string | null;
24160
+ sent: number;
24161
+ received: number;
24162
+ enteredDialog: number;
24163
+ handedOff: number;
24164
+ paid: number;
24165
+ paidAmount: number;
24166
+ };
24167
+ BroadcastUniqueContacts: {
24168
+ /**
24169
+ * @description Уникальных контактов (DISTINCT chat_user_id) в периметре «Отправлено». НЕ аддитивно —
24170
+ * сумма по группам больше правды (замер 26.08.2026: по дням +43 %, по сегментам +27 %).
24171
+ */
24172
+ uniqueContacts: number;
24173
+ /**
24174
+ * @description Только при view=entry. Сколько строк за тот же период было ОТПРАВЛЕНО и сколько из них
24175
+ * не имеет даты входа в сегмент — эти строки не попадают ни в один период режима.
24176
+ * Отсутствие поля означает «вопрос не задавался», а не «все даты известны».
24177
+ */
24178
+ entryCoverage?: {
24179
+ sentRows: number;
24180
+ rowsWithoutEntry: number;
24181
+ };
24182
+ };
24183
+ BroadcastPerPersonMetrics: {
24184
+ /**
24185
+ * @description Уникальные контакты, которым отправляли.
24186
+ * @example 32737
24187
+ */
24188
+ sent: number;
24189
+ /**
24190
+ * @description Уникальные контакты с засчитанной доставкой.
24191
+ * @example 29825
24192
+ */
24193
+ received: number;
24194
+ /**
24195
+ * @description Уникальные контакты, вступившие в диалог.
24196
+ * @example 4430
24197
+ */
24198
+ enteredDialog: number;
24199
+ /** @description Уникальные контакты с глубоким диалогом. */
24200
+ deepDialog: number;
24201
+ /** @description Уникальные контакты с выданной отслеживаемой ссылкой. */
24202
+ linkIssued: number;
24203
+ /** @description Уникальные контакты, кликнувшие по отслеживаемой ссылке. */
24204
+ clicked: number;
24205
+ /** @description Уникальные контакты, переданные менеджеру. */
24206
+ handedOff: number;
24207
+ /** @description Уникальные контакты с выставленным счётом. */
24208
+ issued: number;
24209
+ /**
24210
+ * @description Уникальные контакты с прямой оплатой.
24211
+ * @example 71
24212
+ */
24213
+ paid: number;
24214
+ /** @description Уникальные контакты с оплатой, подтверждённой оператором. */
24215
+ confirmedByOperator: number;
24216
+ /** @description Уникальные контакты с косвенной оплатой. */
24217
+ indirect: number;
24218
+ /** @description Уникальные контакты с возможной оплатой, ожидающей решения. */
24219
+ potential: number;
24220
+ };
23412
24221
  BroadcastSegmentCatalogItem: {
23413
24222
  /** Format: uuid */
23414
24223
  id: string;
@@ -23469,8 +24278,16 @@ export interface components {
23469
24278
  items: components["schemas"]["BroadcastCohortRow"][];
23470
24279
  };
23471
24280
  BroadcastSkipReason: {
24281
+ /** @description Код причины из словаря СВОЕГО источника: у preflight это GetCourseWavePreflightReason, у наших отправок — ColdWelcomeOutcome и собственные исходы прогона. Словари не пересекаются, подпись ищется по source. */
23472
24282
  reason: string;
24283
+ /**
24284
+ * @description Чем отсеян: preflight — проверка волны школы, ownSend — ручная холодная отправка, schedule — авторассылка.
24285
+ * @enum {string}
24286
+ */
24287
+ source: "preflight" | "ownSend" | "schedule";
23473
24288
  count: number;
24289
+ /** @description Сколько из count разбирается ПОИМЁННО. Есть только у ownSend: его число — агрегат задачи (полон за всю историю), а построчный след начинается с выкатки, поэтому у старых запусков он законно 0. Витрина открывает список только там, где значение больше нуля, и подписывает «поимённо N из M», когда след неполон. У preflight и schedule поля нет: у них само число и есть сумма построчных строк. */
24290
+ tracedCount?: number;
23474
24291
  };
23475
24292
  BroadcastSkipDayProduct: {
23476
24293
  /** Format: date */
@@ -23737,7 +24554,7 @@ export interface components {
23737
24554
  /** @enum {string} */
23738
24555
  PaymentCandidateStatus: "PENDING" | "CONFIRMED" | "CONFIRMED_INDIRECT" | "REJECTED";
23739
24556
  /**
23740
- * @description Корзина доказательности возможной оплаты — чем подтверждается участие агента в окне «отправка волны → оплата». DEEP_DIALOG: 3+ реплики клиента и ответы агента. SHORT_DIALOG: 1–2 реплики и ответы агента. NO_AGENT_REPLY: клиент писал, доставленного ответа AI-агента не зафиксировано. SILENT: клиент не отвечал. UNKNOWN: сигналы ещё не посчитаны.
24557
+ * @description Корзина доказательности возможной оплаты — чем подтверждается участие агента в окне «отправка волны → оплата». DEEP_DIALOG: 3+ реплики клиента и минимум два доставленных ответа AI-агента именно на реплику клиента. SHORT_DIALOG: клиент писал и агент отвечал на реплику, но порог глубокого диалога не достигнут. NO_AGENT_REPLY: клиент писал, доставленного ответа AI-агента на его реплику не зафиксировано. SILENT: клиент не отвечал. UNKNOWN: сигналы ещё не посчитаны.
23741
24558
  * @enum {string}
23742
24559
  */
23743
24560
  PaymentEvidenceBucket: "DEEP_DIALOG" | "SHORT_DIALOG" | "NO_AGENT_REPLY" | "SILENT" | "UNKNOWN";
@@ -23949,6 +24766,7 @@ export interface components {
23949
24766
  clientRepliedBeforePayment: boolean | null;
23950
24767
  dialogueInboundCount: number | null;
23951
24768
  dialogueAgentReplyCount: number | null;
24769
+ dialogueAgentResponsiveCount: number | null;
23952
24770
  dialogueOperatorMessageCount: number | null;
23953
24771
  dialogueOtherOutgoingCount: number | null;
23954
24772
  evidenceBucket: components["schemas"]["PaymentEvidenceBucket"];
@@ -24182,6 +25000,24 @@ export interface components {
24182
25000
  /** Format: date-time */
24183
25001
  created_at: string;
24184
25002
  };
25003
+ AmoCrmChannelRegistrationResponse: {
25004
+ /**
25005
+ * @description Адрес вебхука канала для этого воркспейса (пункт 2 письма)
25006
+ * @example https://core.besales.ai/api/webhook/amocrm/055a9626-548b-42bd-8132-afb17925f168
25007
+ */
25008
+ webhookUrl: string;
25009
+ /** @description Текст письма в поддержку AmoCRM целиком, с местами под данные аккаунта */
25010
+ emailTemplate: string;
25011
+ /**
25012
+ * @description Места в письме, которые заполняет человек: их знает только владелец аккаунта. Отдаются списком, чтобы клиент предупредил о них явно, а не надеялся, что человек заметит угловые скобки.
25013
+ * @example [
25014
+ * "<номер учётной записи>",
25015
+ * "<картинку прикладываю>",
25016
+ * "<Id интеграции>"
25017
+ * ]
25018
+ */
25019
+ placeholders: string[];
25020
+ };
24185
25021
  CrmListResponse: {
24186
25022
  crms: components["schemas"]["CrmListItem"][];
24187
25023
  };
@@ -25531,16 +26367,18 @@ export interface components {
25531
26367
  BroadcastMailingVariantId: string[];
25532
26368
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
25533
26369
  BroadcastMechanism: ("wave" | "cold_welcome")[];
26370
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
26371
+ BroadcastLaunchSource: ("manual" | "registration" | "schedule")[];
25534
26372
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
25535
26373
  BroadcastProduct: string[];
25536
26374
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
25537
26375
  BroadcastProductMode: "none";
25538
26376
  /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
25539
- BroadcastFreshness: ("0-7" | "8-14" | "15-30" | "31+")[];
26377
+ BroadcastFreshness: ("0-7" | "8-14" | "15-30" | "31-45" | "46-60" | "61+")[];
25540
26378
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
25541
26379
  BroadcastChannels: string[];
25542
- /** @description cohort — дата запуска; period — дата события. */
25543
- BroadcastView: "cohort" | "period";
26380
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
26381
+ BroadcastView: "cohort" | "period" | "entry";
25544
26382
  /** @description Конкретный день кликнутой ячейки (МСК). */
25545
26383
  BroadcastDate: string;
25546
26384
  /** @description Канал кликнутой ячейки; пусто = общий итог. */
@@ -25806,4 +26644,105 @@ export interface operations {
25806
26644
  };
25807
26645
  };
25808
26646
  };
26647
+ getAmoCrmChannelRegistration: {
26648
+ parameters: {
26649
+ query?: never;
26650
+ header?: never;
26651
+ path: {
26652
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
26653
+ };
26654
+ cookie?: never;
26655
+ };
26656
+ requestBody?: never;
26657
+ responses: {
26658
+ 200: {
26659
+ headers: {
26660
+ [name: string]: unknown;
26661
+ };
26662
+ content: {
26663
+ "application/json": components["schemas"]["AmoCrmChannelRegistrationResponse"];
26664
+ };
26665
+ };
26666
+ };
26667
+ };
26668
+ getCustomReportData: {
26669
+ parameters: {
26670
+ query: {
26671
+ from: string;
26672
+ to: string;
26673
+ granularity?: "day" | "week" | "month" | "total";
26674
+ };
26675
+ header?: never;
26676
+ path: {
26677
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
26678
+ reportId: string;
26679
+ };
26680
+ cookie?: never;
26681
+ };
26682
+ requestBody?: never;
26683
+ responses: {
26684
+ /** @description Данные таблицы и snapshot точного drill-down, если источник его поддерживает. */
26685
+ 200: {
26686
+ headers: {
26687
+ [name: string]: unknown;
26688
+ };
26689
+ content: {
26690
+ "application/json": components["schemas"]["CustomReportDataResponse"];
26691
+ };
26692
+ };
26693
+ 400: components["responses"]["ValidationError"];
26694
+ 401: components["responses"]["Unauthorized"];
26695
+ 403: components["responses"]["Forbidden"];
26696
+ 404: components["responses"]["NotFound"];
26697
+ };
26698
+ };
26699
+ getCustomReportDrilldown: {
26700
+ parameters: {
26701
+ query: {
26702
+ /** @description Начало бакета, YYYY-MM-DD, включительно. */
26703
+ bucketFrom: string;
26704
+ /** @description Конец бакета, YYYY-MM-DD, включительно. */
26705
+ bucketTo: string;
26706
+ /** @description Сохранённая колонка таблицы. */
26707
+ metricKey: string;
26708
+ /** @description Сохранённая строка; отсутствие означает итог бакета. */
26709
+ dimensionValue?: string;
26710
+ /** @description Снимок из ответа живого отчёта; обязателен для источников дожимов. */
26711
+ calculatedAt?: string;
26712
+ /** @description JSON-путь строки сводной; отсутствие означает общий итог. */
26713
+ rowPath?: string;
26714
+ /** @description Непрозрачный MVCC-снимок PostgreSQL из ответа живого отчёта. */
26715
+ executionDbSnapshot?: string;
26716
+ /** @description Fingerprint актуальных шагов и атрибуции из ответа живого отчёта. */
26717
+ expectedCurrentStepsFingerprint?: string;
26718
+ /** @description updatedAt определения из ответа живого отчёта. */
26719
+ expectedReportUpdatedAt: string;
26720
+ limit?: number;
26721
+ offset?: number;
26722
+ };
26723
+ header?: never;
26724
+ path: {
26725
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
26726
+ reportId: string;
26727
+ };
26728
+ cookie?: never;
26729
+ };
26730
+ requestBody?: never;
26731
+ responses: {
26732
+ /** @description Страница исполнений за выбранной ячейкой. */
26733
+ 200: {
26734
+ headers: {
26735
+ [name: string]: unknown;
26736
+ };
26737
+ content: {
26738
+ "application/json": components["schemas"]["CustomReportDrilldownResponse"];
26739
+ };
26740
+ };
26741
+ 400: components["responses"]["ValidationError"];
26742
+ 401: components["responses"]["Unauthorized"];
26743
+ 403: components["responses"]["Forbidden"];
26744
+ 404: components["responses"]["NotFound"];
26745
+ 409: components["responses"]["Conflict"];
26746
+ };
26747
+ };
25809
26748
  }