@besales/mcp 0.45.0 → 0.47.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 (189) hide show
  1. package/README.md +96 -55
  2. package/dist/auth/connection-store.d.ts +21 -1
  3. package/dist/auth/connection-store.js +46 -2
  4. package/dist/auth/connection-store.js.map +1 -1
  5. package/dist/auth/oauth-client.d.ts +5 -1
  6. package/dist/auth/oauth-client.js +22 -12
  7. package/dist/auth/oauth-client.js.map +1 -1
  8. package/dist/cli.js +14 -5
  9. package/dist/cli.js.map +1 -1
  10. package/dist/http/api-client.d.ts +16 -1
  11. package/dist/http/api-client.js +50 -2
  12. package/dist/http/api-client.js.map +1 -1
  13. package/dist/instructions/server-instructions.d.ts +4 -13
  14. package/dist/instructions/server-instructions.js +68 -274
  15. package/dist/instructions/server-instructions.js.map +1 -1
  16. package/dist/prompts/registry.d.ts +15 -0
  17. package/dist/prompts/registry.js +83 -0
  18. package/dist/prompts/registry.js.map +1 -0
  19. package/dist/resources/concepts/feedback-sheets.md +7 -4
  20. package/dist/resources/concepts/handoff.md +4 -1
  21. package/dist/resources/concepts/sandbox.md +14 -5
  22. package/dist/resources/concepts/triggers.md +6 -2
  23. package/dist/resources/concepts/workbook-classification.md +26 -21
  24. package/dist/resources/docs/campaigns.md +20 -0
  25. package/dist/resources/docs/crm-integration.md +3 -1
  26. package/dist/resources/docs/follow-up.md +19 -0
  27. package/dist/resources/docs/platforms.md +2 -2
  28. package/dist/resources/docs/routing.md +18 -0
  29. package/dist/resources/docs/task-state.md +30 -0
  30. package/dist/resources/docs/trigger-actions.md +28 -0
  31. package/dist/resources/docs/variables.md +18 -0
  32. package/dist/resources/registry.js +51 -2
  33. package/dist/resources/registry.js.map +1 -1
  34. package/dist/resources/workflows/compare-models.md +4 -3
  35. package/dist/resources/workflows/connect-crm-from-scratch.md +8 -0
  36. package/dist/resources/workflows/extract-from-document.md +8 -1
  37. package/dist/resources/workflows/iterate-with-sandbox.md +5 -2
  38. package/dist/resources/workflows/platform-setup-from-scratch.md +90 -2
  39. package/dist/resources/workflows/production-readiness-check.md +22 -18
  40. package/dist/schemas/mcp-tools.json +1537 -177
  41. package/dist/server.d.ts +2 -0
  42. package/dist/server.js +8 -2
  43. package/dist/server.js.map +1 -1
  44. package/dist/tasks/task-state-store.d.ts +68 -0
  45. package/dist/tasks/task-state-store.js +278 -0
  46. package/dist/tasks/task-state-store.js.map +1 -0
  47. package/dist/tools/annotations.d.ts +7 -0
  48. package/dist/tools/annotations.js +16 -0
  49. package/dist/tools/annotations.js.map +1 -0
  50. package/dist/tools/contracts.js +7 -1
  51. package/dist/tools/contracts.js.map +1 -1
  52. package/dist/tools/definitions/agent-design.d.ts +49 -20
  53. package/dist/tools/definitions/agent-design.js +192 -19
  54. package/dist/tools/definitions/agent-design.js.map +1 -1
  55. package/dist/tools/definitions/analytics.d.ts +40 -0
  56. package/dist/tools/definitions/analytics.js +233 -0
  57. package/dist/tools/definitions/analytics.js.map +1 -0
  58. package/dist/tools/definitions/broadcast-analytics.d.ts +5 -4
  59. package/dist/tools/definitions/broadcast-analytics.js +26 -4
  60. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  61. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +2 -0
  62. package/dist/tools/definitions/broadcast-mailing-variants.js +10 -0
  63. package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
  64. package/dist/tools/definitions/broadcast-scheduler.d.ts +20 -1
  65. package/dist/tools/definitions/broadcast-scheduler.js +134 -8
  66. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  67. package/dist/tools/definitions/contacts.d.ts +15 -0
  68. package/dist/tools/definitions/contacts.js +84 -0
  69. package/dist/tools/definitions/contacts.js.map +1 -0
  70. package/dist/tools/definitions/crm-platform.d.ts +2 -0
  71. package/dist/tools/definitions/crm-platform.js +95 -5
  72. package/dist/tools/definitions/crm-platform.js.map +1 -1
  73. package/dist/tools/definitions/datasource.d.ts +1 -0
  74. package/dist/tools/definitions/datasource.js +16 -1
  75. package/dist/tools/definitions/datasource.js.map +1 -1
  76. package/dist/tools/definitions/dialogue-audit.d.ts +2 -2
  77. package/dist/tools/definitions/dialogue-audit.js +54 -16
  78. package/dist/tools/definitions/dialogue-audit.js.map +1 -1
  79. package/dist/tools/definitions/dialogue-export.d.ts +1 -1
  80. package/dist/tools/definitions/dialogue-export.js +12 -0
  81. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  82. package/dist/tools/definitions/external-api-channels.js +39 -12
  83. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  84. package/dist/tools/definitions/follow-up-funnel-test.js +4 -0
  85. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  86. package/dist/tools/definitions/follow-up-setup.js +3 -0
  87. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  88. package/dist/tools/definitions/follow-up.d.ts +1 -1
  89. package/dist/tools/definitions/follow-up.js +6 -0
  90. package/dist/tools/definitions/follow-up.js.map +1 -1
  91. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +3 -0
  92. package/dist/tools/definitions/getcourse-anchor-refresh.js +29 -2
  93. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  94. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +20 -2
  95. package/dist/tools/definitions/getcourse-cold-welcome.js +128 -7
  96. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  97. package/dist/tools/definitions/getcourse-wave.js +14 -0
  98. package/dist/tools/definitions/getcourse-wave.js.map +1 -1
  99. package/dist/tools/definitions/help.d.ts +8 -0
  100. package/dist/tools/definitions/help.js +219 -0
  101. package/dist/tools/definitions/help.js.map +1 -0
  102. package/dist/tools/definitions/knowledge.d.ts +27 -5
  103. package/dist/tools/definitions/knowledge.js +200 -33
  104. package/dist/tools/definitions/knowledge.js.map +1 -1
  105. package/dist/tools/definitions/link-tracking.js +31 -0
  106. package/dist/tools/definitions/link-tracking.js.map +1 -1
  107. package/dist/tools/definitions/model-comparison.js +12 -3
  108. package/dist/tools/definitions/model-comparison.js.map +1 -1
  109. package/dist/tools/definitions/operational-overview.d.ts +3 -0
  110. package/dist/tools/definitions/operational-overview.js +23 -0
  111. package/dist/tools/definitions/operational-overview.js.map +1 -0
  112. package/dist/tools/definitions/operator-workflow.d.ts +20 -0
  113. package/dist/tools/definitions/operator-workflow.js +114 -0
  114. package/dist/tools/definitions/operator-workflow.js.map +1 -0
  115. package/dist/tools/definitions/platform-setup.d.ts +54 -3
  116. package/dist/tools/definitions/platform-setup.js +211 -5
  117. package/dist/tools/definitions/platform-setup.js.map +1 -1
  118. package/dist/tools/definitions/scheduled-tasks.js +2 -0
  119. package/dist/tools/definitions/scheduled-tasks.js.map +1 -1
  120. package/dist/tools/definitions/session.js +103 -5
  121. package/dist/tools/definitions/session.js.map +1 -1
  122. package/dist/tools/definitions/shared.d.ts +272 -10
  123. package/dist/tools/definitions/shared.js +154 -8
  124. package/dist/tools/definitions/shared.js.map +1 -1
  125. package/dist/tools/definitions/task-state.d.ts +76 -0
  126. package/dist/tools/definitions/task-state.js +301 -0
  127. package/dist/tools/definitions/task-state.js.map +1 -0
  128. package/dist/tools/definitions/trigger-contact-claims.d.ts +7 -0
  129. package/dist/tools/definitions/trigger-contact-claims.js +60 -0
  130. package/dist/tools/definitions/trigger-contact-claims.js.map +1 -0
  131. package/dist/tools/definitions.d.ts +334 -35
  132. package/dist/tools/definitions.js +14 -0
  133. package/dist/tools/definitions.js.map +1 -1
  134. package/dist/tools/description-localization.d.ts +2 -0
  135. package/dist/tools/description-localization.js +46 -0
  136. package/dist/tools/description-localization.js.map +1 -0
  137. package/dist/tools/incomplete-list.d.ts +23 -0
  138. package/dist/tools/incomplete-list.js +39 -0
  139. package/dist/tools/incomplete-list.js.map +1 -0
  140. package/dist/tools/inventory.d.ts +10 -0
  141. package/dist/tools/inventory.js +49 -0
  142. package/dist/tools/inventory.js.map +1 -0
  143. package/dist/tools/registry-mapping-cases-core.js +122 -4
  144. package/dist/tools/registry-mapping-cases-core.js.map +1 -1
  145. package/dist/tools/registry-mapping-cases-platform.js +69 -0
  146. package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
  147. package/dist/tools/registry.d.ts +2 -0
  148. package/dist/tools/registry.js +60 -8
  149. package/dist/tools/registry.js.map +1 -1
  150. package/dist/tools/result-envelope.d.ts +46 -0
  151. package/dist/tools/result-envelope.js +184 -0
  152. package/dist/tools/result-envelope.js.map +1 -0
  153. package/dist/tools/result.d.ts +41 -3
  154. package/dist/tools/result.js +229 -27
  155. package/dist/tools/result.js.map +1 -1
  156. package/dist/tools/tool-title.d.ts +2 -0
  157. package/dist/tools/tool-title.js +12 -0
  158. package/dist/tools/tool-title.js.map +1 -0
  159. package/dist/tools/toolsets.d.ts +37 -0
  160. package/dist/tools/toolsets.js +64 -0
  161. package/dist/tools/toolsets.js.map +1 -0
  162. package/dist/tools/trigger-action-config.js +4 -0
  163. package/dist/tools/trigger-action-config.js.map +1 -1
  164. package/dist/tools/verify-with.d.ts +5 -0
  165. package/dist/tools/verify-with.js +36 -0
  166. package/dist/tools/verify-with.js.map +1 -0
  167. package/dist/types/api-contract.gen.d.ts +2612 -332
  168. package/dist/utils/logger.d.ts +11 -0
  169. package/dist/utils/logger.js +64 -8
  170. package/dist/utils/logger.js.map +1 -1
  171. package/docs/agent-usage-guide.full.ru.md +21 -15
  172. package/docs/agent-usage-guide.ru.md +24 -16
  173. package/docs/async-operation-lifecycle.md +46 -0
  174. package/docs/connect.ru.md +120 -0
  175. package/docs/evals/model-behavior-scorecard.md +80 -0
  176. package/docs/failure-semantics.md +56 -0
  177. package/docs/help-navigation.md +48 -0
  178. package/docs/host-compatibility-matrix.md +153 -0
  179. package/docs/host-setup.md +22 -6
  180. package/docs/operation-coverage.md +114 -0
  181. package/docs/pii-policy.md +46 -0
  182. package/docs/response-size-budget.md +150 -0
  183. package/docs/task-state.md +58 -0
  184. package/docs/tool-effects.md +46 -0
  185. package/docs/tool-surface.md +91 -0
  186. package/package.json +6 -2
  187. package/scripts/model-eval-server.js +213 -0
  188. package/scripts/probe-mcp-protocol.js +134 -0
  189. package/scripts/run-model-eval.js +447 -0
@@ -3,6 +3,23 @@
3
3
  * Do not make direct changes to the file.
4
4
  */
5
5
  export interface paths {
6
+ "/api/v2/agents/{agentId}/readiness": {
7
+ parameters: {
8
+ query?: never;
9
+ header?: never;
10
+ path?: never;
11
+ cookie?: never;
12
+ };
13
+ /** Доказательная готовность выбранного агента и текущей версии конфигурации */
14
+ get: operations["AgentReadinessController_get"];
15
+ put?: never;
16
+ post?: never;
17
+ delete?: never;
18
+ options?: never;
19
+ head?: never;
20
+ patch?: never;
21
+ trace?: never;
22
+ };
6
23
  "/api/v2/auth/login": {
7
24
  parameters: {
8
25
  query?: never;
@@ -235,8 +252,8 @@ export interface paths {
235
252
  /** @description PKCE S256 challenge — SHA256(code_verifier) base64url-encoded */
236
253
  code_challenge: string;
237
254
  code_challenge_method: "S256";
238
- /** @description Requested scopes: base `mcp:*` plus any subset of the optional scopes, in the canonical order `mcp:platform-setup`, `mcp:funnel-test`, `read:campaigns`, `launch:campaigns`. `mcp:*` enables PromptHub/ICP/Sandbox/Knowledge tools; `mcp:platform-setup` enables Platform Setup Bridge mutations; `mcp:funnel-test` permits frozen-plan funnel tests that can send real messages; `read:campaigns` covers cold-welcome preview and broadcast reads; `launch:campaigns` covers cold-welcome/broadcast launches. `besales-mcp connect` always requests the widest string. INVARIANT: a new scope is APPENDED to the optional list — never swapped in for an existing one, or every reconnect silently narrows live keys. */
239
- scope: "mcp:*" | "mcp:* mcp:platform-setup" | "mcp:* mcp:funnel-test" | "mcp:* mcp:platform-setup mcp:funnel-test" | "mcp:* read:campaigns" | "mcp:* mcp:platform-setup read:campaigns" | "mcp:* mcp:funnel-test read:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns" | "mcp:* launch:campaigns" | "mcp:* mcp:platform-setup launch:campaigns" | "mcp:* mcp:funnel-test launch:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test launch:campaigns" | "mcp:* read:campaigns launch:campaigns" | "mcp:* mcp:platform-setup read:campaigns launch:campaigns" | "mcp:* mcp:funnel-test read:campaigns launch:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns launch:campaigns";
255
+ /** @description Requested scopes: base `mcp:*` plus any subset of the optional scopes, in the canonical order `mcp:platform-setup`, `mcp:funnel-test`, `read:campaigns`, `launch:campaigns`, `read:contacts`, `write:operators`. `mcp:*` enables PromptHub/ICP/Sandbox/Knowledge tools; `mcp:platform-setup` enables Platform Setup Bridge mutations; `mcp:funnel-test` permits frozen-plan funnel tests that can send real messages; `read:campaigns` covers cold-welcome preview and broadcast reads; `launch:campaigns` covers cold-welcome/broadcast launches; `read:contacts` covers contact search, cards and safe diagnostics; `write:operators` permits a CAS-protected local workspace-operator assignment without sending messages. `besales-mcp connect` always requests the widest string. INVARIANT: a new scope is APPENDED to the optional list — never swapped in for an existing one, or every reconnect silently narrows live keys. */
256
+ scope: "mcp:*" | "mcp:* mcp:platform-setup" | "mcp:* mcp:funnel-test" | "mcp:* mcp:platform-setup mcp:funnel-test" | "mcp:* read:campaigns" | "mcp:* mcp:platform-setup read:campaigns" | "mcp:* mcp:funnel-test read:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns" | "mcp:* launch:campaigns" | "mcp:* mcp:platform-setup launch:campaigns" | "mcp:* mcp:funnel-test launch:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test launch:campaigns" | "mcp:* read:campaigns launch:campaigns" | "mcp:* mcp:platform-setup read:campaigns launch:campaigns" | "mcp:* mcp:funnel-test read:campaigns launch:campaigns" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns launch:campaigns" | "mcp:* read:contacts" | "mcp:* mcp:platform-setup read:contacts" | "mcp:* mcp:funnel-test read:contacts" | "mcp:* mcp:platform-setup mcp:funnel-test read:contacts" | "mcp:* read:campaigns read:contacts" | "mcp:* mcp:platform-setup read:campaigns read:contacts" | "mcp:* mcp:funnel-test read:campaigns read:contacts" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns read:contacts" | "mcp:* launch:campaigns read:contacts" | "mcp:* mcp:platform-setup launch:campaigns read:contacts" | "mcp:* mcp:funnel-test launch:campaigns read:contacts" | "mcp:* mcp:platform-setup mcp:funnel-test launch:campaigns read:contacts" | "mcp:* read:campaigns launch:campaigns read:contacts" | "mcp:* mcp:platform-setup read:campaigns launch:campaigns read:contacts" | "mcp:* mcp:funnel-test read:campaigns launch:campaigns read:contacts" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns launch:campaigns read:contacts" | "mcp:* write:operators" | "mcp:* mcp:platform-setup write:operators" | "mcp:* mcp:funnel-test write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test write:operators" | "mcp:* read:campaigns write:operators" | "mcp:* mcp:platform-setup read:campaigns write:operators" | "mcp:* mcp:funnel-test read:campaigns write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns write:operators" | "mcp:* launch:campaigns write:operators" | "mcp:* mcp:platform-setup launch:campaigns write:operators" | "mcp:* mcp:funnel-test launch:campaigns write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test launch:campaigns write:operators" | "mcp:* read:campaigns launch:campaigns write:operators" | "mcp:* mcp:platform-setup read:campaigns launch:campaigns write:operators" | "mcp:* mcp:funnel-test read:campaigns launch:campaigns write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns launch:campaigns write:operators" | "mcp:* read:contacts write:operators" | "mcp:* mcp:platform-setup read:contacts write:operators" | "mcp:* mcp:funnel-test read:contacts write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test read:contacts write:operators" | "mcp:* read:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup read:campaigns read:contacts write:operators" | "mcp:* mcp:funnel-test read:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns read:contacts write:operators" | "mcp:* launch:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup launch:campaigns read:contacts write:operators" | "mcp:* mcp:funnel-test launch:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test launch:campaigns read:contacts write:operators" | "mcp:* read:campaigns launch:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup read:campaigns launch:campaigns read:contacts write:operators" | "mcp:* mcp:funnel-test read:campaigns launch:campaigns read:contacts write:operators" | "mcp:* mcp:platform-setup mcp:funnel-test read:campaigns launch:campaigns read:contacts write:operators";
240
257
  };
241
258
  header?: never;
242
259
  path?: never;
@@ -450,6 +467,10 @@ export interface paths {
450
467
  api_key: string;
451
468
  /** Format: uuid */
452
469
  workspace_id: string;
470
+ /** @description Workspace name captured at token exchange for local human-readable selection */
471
+ workspace_name: string;
472
+ /** @description Masked account email (for example, o***@example.com); never contains the raw email */
473
+ account_label: string | null;
453
474
  /**
454
475
  * Format: date-time
455
476
  * @description API key expiration (90 days from now)
@@ -477,6 +498,59 @@ export interface paths {
477
498
  patch?: never;
478
499
  trace?: never;
479
500
  };
501
+ "/api/v2/auth/mcp-context": {
502
+ parameters: {
503
+ query?: never;
504
+ header?: never;
505
+ path?: never;
506
+ cookie?: never;
507
+ };
508
+ /**
509
+ * Read safe labels for the current MCP connection
510
+ * @description Lightweight alternative to workspace overview for local workspace selection.
511
+ */
512
+ get: {
513
+ parameters: {
514
+ query?: never;
515
+ header?: never;
516
+ path?: never;
517
+ cookie?: never;
518
+ };
519
+ requestBody?: never;
520
+ responses: {
521
+ /** @description Current workspace and masked account label */
522
+ 200: {
523
+ headers: {
524
+ [name: string]: unknown;
525
+ };
526
+ content: {
527
+ "application/json": {
528
+ /** Format: uuid */
529
+ workspace_id: string;
530
+ workspace_name: string;
531
+ account_label: string | null;
532
+ /** @description Effective scopes of this exact MCP key */
533
+ scopes: string[];
534
+ };
535
+ };
536
+ };
537
+ /** @description MCP key is missing, revoked, or belongs to another workspace */
538
+ 403: {
539
+ headers: {
540
+ [name: string]: unknown;
541
+ };
542
+ content?: never;
543
+ };
544
+ };
545
+ };
546
+ put?: never;
547
+ post?: never;
548
+ delete?: never;
549
+ options?: never;
550
+ head?: never;
551
+ patch?: never;
552
+ trace?: never;
553
+ };
480
554
  "/api/v2/auth/mcp-connections": {
481
555
  parameters: {
482
556
  query?: never;
@@ -890,6 +964,28 @@ export interface paths {
890
964
  patch?: never;
891
965
  trace?: never;
892
966
  };
967
+ "/api/v2/workspaces/{workspaceId}/navigation": {
968
+ parameters: {
969
+ query?: never;
970
+ header?: never;
971
+ path?: never;
972
+ cookie?: never;
973
+ };
974
+ get?: never;
975
+ put?: never;
976
+ /**
977
+ * Выбрать один следующий шаг по намерению и живому overview
978
+ * @description Read-only навигатор. Учитывает тип бота, уже выбранные объекты и текущее состояние
979
+ * workspace. Возвращает конкретный MCP tool, аргументы, необходимый ввод человека и способ
980
+ * проверки; сам мутацию не выполняет и readiness не подменяет.
981
+ */
982
+ post: operations["navigateWorkspaceTask"];
983
+ delete?: never;
984
+ options?: never;
985
+ head?: never;
986
+ patch?: never;
987
+ trace?: never;
988
+ };
893
989
  "/api/v2/setup-sessions": {
894
990
  parameters: {
895
991
  query?: never;
@@ -5018,8 +5114,13 @@ export interface paths {
5018
5114
  /**
5019
5115
  * S3.8: Apply batch patch operations + reset activity TTL (24h)
5020
5116
  * @description Применяет операции к draft.currentContent через `applyPromptPatchOperations`.
5021
- * Resets TTL на каждом вызове (activity-based 24h). Возвращает diff-stats:
5022
- * `appliedCount` + `skippedCount` (anchor не нашёлся → ops пропущены).
5117
+ * Resets TTL на каждом вызове (activity-based 24h). Возвращает `appliedCount` +
5118
+ * `skippedCount` (anchor не нашёлся → ops пропущены) и `diff` — построчную
5119
+ * разницу «до → после».
5120
+ *
5121
+ * Текст черновика в ответе НЕ отдаётся: клиент прочитал промпт целиком при создании
5122
+ * черновика, а здесь ждёт подтверждения правки. Перечитать полностью —
5123
+ * `GET /prompt/drafts/{draftId}`.
5023
5124
  *
5024
5125
  * Growth guard: операции, увеличивающие размер >30% от baseContent → пропускаются
5025
5126
  * с skippedCount > 0.
@@ -5084,6 +5185,10 @@ export interface paths {
5084
5185
  *
5085
5186
  * Idempotency: повторный commit того же draft возвращает existing newVersion
5086
5187
  * (детектируется через 410 Gone + GET draft → COMMITTED).
5188
+ *
5189
+ * Ответ несёт только адресацию новой версии (`id` + `version`) и метаданные
5190
+ * черновика: `draft.currentContent` и `newVersion.content` — две копии одного
5191
+ * текста, который клиент сам и собрал.
5087
5192
  */
5088
5193
  post: {
5089
5194
  parameters: {
@@ -5413,7 +5518,10 @@ export interface paths {
5413
5518
  /** Sanitized setup context with readiness flags */
5414
5519
  get: {
5415
5520
  parameters: {
5416
- query?: never;
5521
+ query?: {
5522
+ /** @description Секции снимка через запятую; agent_summaries исключает полный промпт. */
5523
+ sections?: string;
5524
+ };
5417
5525
  header?: never;
5418
5526
  path: {
5419
5527
  platformId: components["parameters"]["PlatformIdPath"];
@@ -5440,6 +5548,49 @@ export interface paths {
5440
5548
  patch?: never;
5441
5549
  trace?: never;
5442
5550
  };
5551
+ "/api/v2/platforms/{platformId}/setup/trigger-action-catalog": {
5552
+ parameters: {
5553
+ query?: never;
5554
+ header?: never;
5555
+ path?: never;
5556
+ cookie?: never;
5557
+ };
5558
+ /**
5559
+ * Current trigger action schemas, examples and dependencies
5560
+ * @description Каталог строится из боевого `CreateTriggerActionDto` и `TRIGGER_ACTION_CONFIG`.
5561
+ * `actionType` позволяет запросить один тип без загрузки всех схем.
5562
+ */
5563
+ get: {
5564
+ parameters: {
5565
+ query?: {
5566
+ actionType?: string;
5567
+ };
5568
+ header?: never;
5569
+ path: {
5570
+ platformId: components["parameters"]["PlatformIdPath"];
5571
+ };
5572
+ cookie?: never;
5573
+ };
5574
+ requestBody?: never;
5575
+ responses: {
5576
+ 200: {
5577
+ headers: {
5578
+ [name: string]: unknown;
5579
+ };
5580
+ content: {
5581
+ "application/json": components["schemas"]["TriggerActionCatalogResponse"];
5582
+ };
5583
+ };
5584
+ };
5585
+ };
5586
+ put?: never;
5587
+ post?: never;
5588
+ delete?: never;
5589
+ options?: never;
5590
+ head?: never;
5591
+ patch?: never;
5592
+ trace?: never;
5593
+ };
5443
5594
  "/api/v2/platforms/{platformId}/agents": {
5444
5595
  parameters: {
5445
5596
  query?: never;
@@ -5450,7 +5601,14 @@ export interface paths {
5450
5601
  /** List agents attached to existing platform */
5451
5602
  get: {
5452
5603
  parameters: {
5453
- query?: never;
5604
+ query?: {
5605
+ /** @description Размер страницы; без него список отдаётся целиком. */
5606
+ limit?: number;
5607
+ /** @description Курсор из предыдущего ответа. */
5608
+ cursor?: string;
5609
+ /** @description Поиск без учёта регистра по name или displayName. */
5610
+ q?: string;
5611
+ };
5454
5612
  header?: never;
5455
5613
  path: {
5456
5614
  platformId: components["parameters"]["PlatformIdPath"];
@@ -6331,6 +6489,26 @@ export interface paths {
6331
6489
  patch?: never;
6332
6490
  trace?: never;
6333
6491
  };
6492
+ "/api/v2/workspaces/{workspaceId}/getcourse-cold-welcome/touch-history/{gcUserId}": {
6493
+ parameters: {
6494
+ query?: never;
6495
+ header?: never;
6496
+ path?: never;
6497
+ cookie?: never;
6498
+ };
6499
+ /**
6500
+ * What we have already sent this person, and by what right
6501
+ * @description Three sources with DIFFERENT keys, joined into one answer. `touches` is the touch journal: a RIGHT taken BEFORE transport, so a row exists even for an attempt that never sent (UNKNOWN, stuck CLAIMED). `sends` is the recipient registry: written AFTER delivery and best-effort, so its absence does NOT prove non-delivery. `firstWelcomeAt` is the earliest mark across the person cards. Do not add `touches` and `sends` together — they answer different questions.
6502
+ */
6503
+ get: operations["getContactTouchHistory"];
6504
+ put?: never;
6505
+ post?: never;
6506
+ delete?: never;
6507
+ options?: never;
6508
+ head?: never;
6509
+ patch?: never;
6510
+ trace?: never;
6511
+ };
6334
6512
  "/api/v2/workspaces/{workspaceId}/getcourse-cold-welcome/preview": {
6335
6513
  parameters: {
6336
6514
  query?: never;
@@ -6528,6 +6706,49 @@ export interface paths {
6528
6706
  patch?: never;
6529
6707
  trace?: never;
6530
6708
  };
6709
+ "/api/v2/workspaces/{workspaceId}/getcourse-anchor-refresh/{correlationId}": {
6710
+ parameters: {
6711
+ query?: never;
6712
+ header?: never;
6713
+ path?: never;
6714
+ cookie?: never;
6715
+ };
6716
+ /**
6717
+ * Статус фонового перечитывания календарных якорей
6718
+ * @description Retained 24 часа. STALLED означает, что фоновый процесс больше не владеет lock; часть дат могла быть переписана, поэтому перед повтором нужен аудит по correlationId. Отмены нет: уже выполненные частичные перезаписи необратимы. Scope `read:campaigns`.
6719
+ */
6720
+ get: {
6721
+ parameters: {
6722
+ query?: never;
6723
+ header?: never;
6724
+ path: {
6725
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
6726
+ correlationId: string;
6727
+ };
6728
+ cookie?: never;
6729
+ };
6730
+ requestBody?: never;
6731
+ responses: {
6732
+ /** @description Состояние и terminal result/error */
6733
+ 200: {
6734
+ headers: {
6735
+ [name: string]: unknown;
6736
+ };
6737
+ content: {
6738
+ "application/json": components["schemas"]["GetCourseAnchorRefreshStatusResponse"];
6739
+ };
6740
+ };
6741
+ 404: components["responses"]["NotFound"];
6742
+ };
6743
+ };
6744
+ put?: never;
6745
+ post?: never;
6746
+ delete?: never;
6747
+ options?: never;
6748
+ head?: never;
6749
+ patch?: never;
6750
+ trace?: never;
6751
+ };
6531
6752
  "/api/v2/workspaces/{workspaceId}/getcourse-cold-welcome/batch": {
6532
6753
  parameters: {
6533
6754
  query?: never;
@@ -8765,8 +8986,8 @@ export interface paths {
8765
8986
  get?: never;
8766
8987
  put?: never;
8767
8988
  /**
8768
- * Создать External API канал (provisioning)
8769
- * @description Возвращает apiKey + webhookSecret ОДИН раз. Scope `mcp:platform-setup` (или UI JWT).
8989
+ * Создать External API канал и выдать browser-handoff ссылку
8990
+ * @description Секреты не проходят через API/MCP-ответ. Scope `mcp:platform-setup` (или UI JWT).
8770
8991
  */
8771
8992
  post: {
8772
8993
  parameters: {
@@ -8783,13 +9004,13 @@ export interface paths {
8783
9004
  };
8784
9005
  };
8785
9006
  responses: {
8786
- /** @description Канал создан (ключ и секрет показываются один раз) */
9007
+ /** @description Канал создан; credentials покажет вошедшему человеку одноразовая страница */
8787
9008
  201: {
8788
9009
  headers: {
8789
9010
  [name: string]: unknown;
8790
9011
  };
8791
9012
  content: {
8792
- "application/json": components["schemas"]["ProvisionedExternalApiChannel"];
9013
+ "application/json": components["schemas"]["ExternalApiChannelCreated"];
8793
9014
  };
8794
9015
  };
8795
9016
  };
@@ -8809,7 +9030,7 @@ export interface paths {
8809
9030
  };
8810
9031
  get?: never;
8811
9032
  put?: never;
8812
- /** Перевыпустить bsl-ключ канала (старый отзывается) */
9033
+ /** Выдать browser-handoff ссылку на перевыпуск bsl-ключа */
8813
9034
  post: {
8814
9035
  parameters: {
8815
9036
  query?: never;
@@ -8822,15 +9043,13 @@ export interface paths {
8822
9043
  };
8823
9044
  requestBody?: never;
8824
9045
  responses: {
8825
- /** @description Новый ключ (показывается один раз) */
9046
+ /** @description Ротация произойдёт только при открытии одноразовой страницы */
8826
9047
  201: {
8827
9048
  headers: {
8828
9049
  [name: string]: unknown;
8829
9050
  };
8830
9051
  content: {
8831
- "application/json": {
8832
- apiKey: string;
8833
- };
9052
+ "application/json": components["schemas"]["IssuedCredentialReveal"];
8834
9053
  };
8835
9054
  };
8836
9055
  };
@@ -8850,7 +9069,7 @@ export interface paths {
8850
9069
  };
8851
9070
  get?: never;
8852
9071
  put?: never;
8853
- /** Перевыпустить webhook-secret канала */
9072
+ /** Выдать browser-handoff ссылку на замену webhook-secret */
8854
9073
  post: {
8855
9074
  parameters: {
8856
9075
  query?: never;
@@ -8863,15 +9082,13 @@ export interface paths {
8863
9082
  };
8864
9083
  requestBody?: never;
8865
9084
  responses: {
8866
- /** @description Новый секрет (показывается один раз) */
9085
+ /** @description Замена произойдёт только при открытии одноразовой страницы */
8867
9086
  201: {
8868
9087
  headers: {
8869
9088
  [name: string]: unknown;
8870
9089
  };
8871
9090
  content: {
8872
- "application/json": {
8873
- webhookSecret: string;
8874
- };
9091
+ "application/json": components["schemas"]["IssuedCredentialReveal"];
8875
9092
  };
8876
9093
  };
8877
9094
  };
@@ -9149,6 +9366,81 @@ export interface paths {
9149
9366
  patch?: never;
9150
9367
  trace?: never;
9151
9368
  };
9369
+ "/api/v2/contacts/{contactId}/diagnostics": {
9370
+ parameters: {
9371
+ query?: never;
9372
+ header?: never;
9373
+ path?: never;
9374
+ cookie?: never;
9375
+ };
9376
+ /**
9377
+ * Диагностика причин молчания, operator workflow, действий и доставки
9378
+ * @description MCP-only read: возвращает метаданные и сохранённые evidence без тел сообщений, аргументов/результатов инструментов и raw error text. Отсутствующий production RAG trace помечается unknown, а не нулём.
9379
+ */
9380
+ get: {
9381
+ parameters: {
9382
+ query?: {
9383
+ messageId?: string;
9384
+ };
9385
+ header?: never;
9386
+ path: {
9387
+ contactId: string;
9388
+ };
9389
+ cookie?: never;
9390
+ };
9391
+ requestBody?: never;
9392
+ responses: {
9393
+ 200: {
9394
+ headers: {
9395
+ [name: string]: unknown;
9396
+ };
9397
+ content: {
9398
+ "application/json": {
9399
+ contact: {
9400
+ [key: string]: unknown;
9401
+ };
9402
+ platform: {
9403
+ [key: string]: unknown;
9404
+ } | null;
9405
+ message: {
9406
+ [key: string]: unknown;
9407
+ } | null;
9408
+ agent: {
9409
+ [key: string]: unknown;
9410
+ } | null;
9411
+ operatorEvents: {
9412
+ [key: string]: unknown;
9413
+ }[];
9414
+ triggerExecutions: {
9415
+ [key: string]: unknown;
9416
+ }[];
9417
+ toolExecutions: {
9418
+ [key: string]: unknown;
9419
+ }[];
9420
+ evidence: {
9421
+ [key: string]: unknown;
9422
+ };
9423
+ limitations: string[];
9424
+ };
9425
+ };
9426
+ };
9427
+ /** @description Контакт или выбранное сообщение не найдено в workspace */
9428
+ 404: {
9429
+ headers: {
9430
+ [name: string]: unknown;
9431
+ };
9432
+ content?: never;
9433
+ };
9434
+ };
9435
+ };
9436
+ put?: never;
9437
+ post?: never;
9438
+ delete?: never;
9439
+ options?: never;
9440
+ head?: never;
9441
+ patch?: never;
9442
+ trace?: never;
9443
+ };
9152
9444
  "/api/v2/contacts/import": {
9153
9445
  parameters: {
9154
9446
  query?: never;
@@ -9237,35 +9529,77 @@ export interface paths {
9237
9529
  patch?: never;
9238
9530
  trace?: never;
9239
9531
  };
9240
- "/api/v2/contacts/export": {
9532
+ "/api/v2/workspaces/{workspaceId}/getcourse-contact-imports/{jobId}": {
9241
9533
  parameters: {
9242
9534
  query?: never;
9243
9535
  header?: never;
9244
9536
  path?: never;
9245
9537
  cookie?: never;
9246
9538
  };
9247
- get?: never;
9248
- put?: never;
9249
- /** Export contacts by filter */
9250
- post: {
9539
+ /**
9540
+ * Статус импорта GetCourse-контактов или одиночной cold-welcome отправки
9541
+ * @description Возвращает только ImportJob типа GETCOURSE_CONTACTS в указанном workspace. PARTIAL и FAILED выводятся из terminal counters. Scope `launch:campaigns`, потому что этот же ключ запускает обе операции и `mcp:*` намеренно не включает массовое чтение контактов.
9542
+ */
9543
+ get: {
9251
9544
  parameters: {
9252
9545
  query?: never;
9253
9546
  header?: never;
9254
- path?: never;
9255
- cookie?: never;
9256
- };
9257
- requestBody?: {
9258
- content: {
9259
- "application/json": components["schemas"]["ContactExportRequest"];
9547
+ path: {
9548
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
9549
+ jobId: string;
9260
9550
  };
9551
+ cookie?: never;
9261
9552
  };
9553
+ requestBody?: never;
9262
9554
  responses: {
9263
- 202: {
9555
+ 200: {
9264
9556
  headers: {
9265
9557
  [name: string]: unknown;
9266
9558
  };
9267
9559
  content: {
9268
- "application/json": components["schemas"]["AsyncJobResponse"];
9560
+ "application/json": components["schemas"]["GetCourseContactImportStatusResponse"];
9561
+ };
9562
+ };
9563
+ 404: components["responses"]["NotFound"];
9564
+ };
9565
+ };
9566
+ put?: never;
9567
+ post?: never;
9568
+ delete?: never;
9569
+ options?: never;
9570
+ head?: never;
9571
+ patch?: never;
9572
+ trace?: never;
9573
+ };
9574
+ "/api/v2/contacts/export": {
9575
+ parameters: {
9576
+ query?: never;
9577
+ header?: never;
9578
+ path?: never;
9579
+ cookie?: never;
9580
+ };
9581
+ get?: never;
9582
+ put?: never;
9583
+ /** Export contacts by filter */
9584
+ post: {
9585
+ parameters: {
9586
+ query?: never;
9587
+ header?: never;
9588
+ path?: never;
9589
+ cookie?: never;
9590
+ };
9591
+ requestBody?: {
9592
+ content: {
9593
+ "application/json": components["schemas"]["ContactExportRequest"];
9594
+ };
9595
+ };
9596
+ responses: {
9597
+ 202: {
9598
+ headers: {
9599
+ [name: string]: unknown;
9600
+ };
9601
+ content: {
9602
+ "application/json": components["schemas"]["AsyncJobResponse"];
9269
9603
  };
9270
9604
  };
9271
9605
  };
@@ -9315,6 +9649,118 @@ export interface paths {
9315
9649
  patch?: never;
9316
9650
  trace?: never;
9317
9651
  };
9652
+ "/api/v2/contacts/{contactId}/trigger-claims": {
9653
+ parameters: {
9654
+ query?: never;
9655
+ header?: never;
9656
+ path?: never;
9657
+ cookie?: never;
9658
+ };
9659
+ /**
9660
+ * List burnt one-time trigger claims for contact
9661
+ * @description Права одноразовых триггеров (AgentTrigger.runOncePerContact), уже занятые этим контактом. canReset=false означает, что право держит идущий прогон.
9662
+ */
9663
+ get: {
9664
+ parameters: {
9665
+ query?: never;
9666
+ header?: never;
9667
+ path: {
9668
+ contactId: string;
9669
+ };
9670
+ cookie?: never;
9671
+ };
9672
+ requestBody?: never;
9673
+ responses: {
9674
+ 200: {
9675
+ headers: {
9676
+ [name: string]: unknown;
9677
+ };
9678
+ content: {
9679
+ "application/json": components["schemas"]["TriggerContactClaimsPage"];
9680
+ };
9681
+ };
9682
+ /** @description Контакт не найден в воркспейсе */
9683
+ 404: {
9684
+ headers: {
9685
+ [name: string]: unknown;
9686
+ };
9687
+ content?: never;
9688
+ };
9689
+ };
9690
+ };
9691
+ put?: never;
9692
+ post?: never;
9693
+ delete?: never;
9694
+ options?: never;
9695
+ head?: never;
9696
+ patch?: never;
9697
+ trace?: never;
9698
+ };
9699
+ "/api/v2/contacts/{contactId}/trigger-claims/{triggerId}": {
9700
+ parameters: {
9701
+ query?: never;
9702
+ header?: never;
9703
+ path?: never;
9704
+ cookie?: never;
9705
+ };
9706
+ get?: never;
9707
+ put?: never;
9708
+ post?: never;
9709
+ /**
9710
+ * Allow a one-time trigger to fire for the contact again
9711
+ * @description Возвращает контакту сожжённое право. Снимается ТОЛЬКО status=COMPLETED: право со status=IN_PROGRESS держит владелец, а его finalize адресует пару «триггер+контакт», и удаление такой строки дало бы двух владельцев и повторные необратимые действия.
9712
+ */
9713
+ delete: {
9714
+ parameters: {
9715
+ query?: never;
9716
+ header?: never;
9717
+ path: {
9718
+ contactId: string;
9719
+ triggerId: string;
9720
+ };
9721
+ cookie?: never;
9722
+ };
9723
+ requestBody: {
9724
+ content: {
9725
+ "application/json": components["schemas"]["ResetTriggerClaimRequest"];
9726
+ };
9727
+ };
9728
+ responses: {
9729
+ /** @description Право возвращено */
9730
+ 204: {
9731
+ headers: {
9732
+ [name: string]: unknown;
9733
+ };
9734
+ content?: never;
9735
+ };
9736
+ /** @description Нет explicitConfirmation */
9737
+ 400: {
9738
+ headers: {
9739
+ [name: string]: unknown;
9740
+ };
9741
+ content?: never;
9742
+ };
9743
+ /** @description Контакт не найден либо право не занято */
9744
+ 404: {
9745
+ headers: {
9746
+ [name: string]: unknown;
9747
+ };
9748
+ content?: never;
9749
+ };
9750
+ /** @description Право держит прогон триггера */
9751
+ 409: {
9752
+ headers: {
9753
+ [name: string]: unknown;
9754
+ };
9755
+ content?: never;
9756
+ };
9757
+ };
9758
+ };
9759
+ options?: never;
9760
+ head?: never;
9761
+ patch?: never;
9762
+ trace?: never;
9763
+ };
9318
9764
  "/api/v2/contacts/{contactId}/merge-history": {
9319
9765
  parameters: {
9320
9766
  query?: never;
@@ -9933,7 +10379,7 @@ export interface paths {
9933
10379
  parameters: {
9934
10380
  query?: {
9935
10381
  includeArchived?: boolean;
9936
- /** @description Глубина сводки в днях */
10382
+ /** @description Глубина сводки в днях. НЕ ЗАДАН — за всё время. Прежде подставлялось окно 60 дней, и оно расходилось само с собой: выданное раньше него показывалось как «выдано 0», тогда как выручка в той же строке считалась за всё время. */
9937
10383
  days?: number;
9938
10384
  limit?: number;
9939
10385
  offset?: number;
@@ -10099,6 +10545,7 @@ export interface paths {
10099
10545
  get: {
10100
10546
  parameters: {
10101
10547
  query?: {
10548
+ /** @description Глубина разреза в днях; не задан — за всё время */
10102
10549
  days?: number;
10103
10550
  };
10104
10551
  header?: never;
@@ -10129,6 +10576,51 @@ export interface paths {
10129
10576
  patch?: never;
10130
10577
  trace?: never;
10131
10578
  };
10579
+ "/api/v2/workspaces/{workspaceId}/tracked-links/{linkId}/reach": {
10580
+ parameters: {
10581
+ query?: never;
10582
+ header?: never;
10583
+ path?: never;
10584
+ cookie?: never;
10585
+ };
10586
+ /**
10587
+ * Разрез ссылки по месту применения
10588
+ * @description Где ссылка работала: площадка и агент, через которых она уходила людям. Отвечает на «где», тогда как /breakdown — на «после какого касания». Оси независимые: одна выдача принадлежит ровно одной площадке и одному агенту, а тип источника — отдельное измерение. ⚠️ null в оси — это «не определён», отдельная строка, а не ноль: у контакта могло не быть ни одного ответа агента. ⚠️ Пустое имя при заполненном id значит, что площадку или агента удалили: id хранится снимком без внешнего ключа, чтобы история кликов пережила удаление.
10589
+ */
10590
+ get: {
10591
+ parameters: {
10592
+ query?: {
10593
+ /** @description Глубина разреза в днях; не задан — за всё время */
10594
+ days?: number;
10595
+ };
10596
+ header?: never;
10597
+ path: {
10598
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
10599
+ linkId: components["parameters"]["TrackedLinkIdPath"];
10600
+ };
10601
+ cookie?: never;
10602
+ };
10603
+ requestBody?: never;
10604
+ responses: {
10605
+ /** @description OK */
10606
+ 200: {
10607
+ headers: {
10608
+ [name: string]: unknown;
10609
+ };
10610
+ content: {
10611
+ "application/json": components["schemas"]["TrackedLinkReachBreakdown"][];
10612
+ };
10613
+ };
10614
+ };
10615
+ };
10616
+ put?: never;
10617
+ post?: never;
10618
+ delete?: never;
10619
+ options?: never;
10620
+ head?: never;
10621
+ patch?: never;
10622
+ trace?: never;
10623
+ };
10132
10624
  "/api/v2/workspaces/{workspaceId}/tracked-links/{linkId}/clicks": {
10133
10625
  parameters: {
10134
10626
  query?: never;
@@ -10143,6 +10635,7 @@ export interface paths {
10143
10635
  get: {
10144
10636
  parameters: {
10145
10637
  query?: {
10638
+ /** @description Глубина разреза в днях; не задан — за всё время */
10146
10639
  days?: number;
10147
10640
  page?: number;
10148
10641
  pageSize?: number;
@@ -10290,6 +10783,8 @@ export interface paths {
10290
10783
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10291
10784
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10292
10785
  mechanism?: components["parameters"]["BroadcastMechanism"];
10786
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
10787
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10293
10788
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10294
10789
  product?: components["parameters"]["BroadcastProduct"];
10295
10790
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10298,8 +10793,10 @@ export interface paths {
10298
10793
  freshness?: components["parameters"]["BroadcastFreshness"];
10299
10794
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10300
10795
  channels?: components["parameters"]["BroadcastChannels"];
10301
- /** @description cohort — дата запуска; period — дата события. */
10302
- view?: "cohort" | "period";
10796
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at). В entry строки без даты входа выпадают всегда, включая mode=all. */
10797
+ view?: "cohort" | "period" | "entry";
10798
+ /** @description day — календарные бакеты; period — один компактный бакет __period__ за весь диапазон. */
10799
+ granularity?: "day" | "period";
10303
10800
  };
10304
10801
  header?: never;
10305
10802
  path: {
@@ -10590,6 +11087,8 @@ export interface paths {
10590
11087
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10591
11088
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10592
11089
  mechanism?: components["parameters"]["BroadcastMechanism"];
11090
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11091
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10593
11092
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10594
11093
  product?: components["parameters"]["BroadcastProduct"];
10595
11094
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10654,6 +11153,8 @@ export interface paths {
10654
11153
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10655
11154
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10656
11155
  mechanism?: components["parameters"]["BroadcastMechanism"];
11156
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11157
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10657
11158
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10658
11159
  product?: components["parameters"]["BroadcastProduct"];
10659
11160
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10662,7 +11163,7 @@ export interface paths {
10662
11163
  freshness?: components["parameters"]["BroadcastFreshness"];
10663
11164
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10664
11165
  channels?: components["parameters"]["BroadcastChannels"];
10665
- /** @description cohort — дата запуска; period — дата события. */
11166
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10666
11167
  view?: components["parameters"]["BroadcastView"];
10667
11168
  /** @description Конкретный день кликнутой ячейки (МСК). */
10668
11169
  date?: components["parameters"]["BroadcastDate"];
@@ -10696,17 +11197,23 @@ export interface paths {
10696
11197
  patch?: never;
10697
11198
  trace?: never;
10698
11199
  };
10699
- "/api/v2/workspaces/{workspaceId}/broadcast-analytics/recipients": {
11200
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/unique-contacts": {
10700
11201
  parameters: {
10701
11202
  query?: never;
10702
11203
  header?: never;
10703
11204
  path?: never;
10704
11205
  cookie?: never;
10705
11206
  };
10706
- /** Drill-down получателей по метрике */
11207
+ /**
11208
+ * Уникальных контактов за период (НЕ аддитивно)
11209
+ * @description Сколько РАЗНЫХ людей стоит за «Отправлено» той же выборки. Периметр совпадает с тоталом
11210
+ * sent; отличие только в единице счёта: строка реестра это «волна × контакт», а тут считается
11211
+ * контакт. Складывать по дням/сегментам/продуктам НЕЛЬЗЯ — один человек живёт в каждой группе,
11212
+ * куда ему уходила волна.
11213
+ */
10707
11214
  get: {
10708
11215
  parameters: {
10709
- query: {
11216
+ query?: {
10710
11217
  mode?: components["parameters"]["BroadcastPeriodMode"];
10711
11218
  days?: components["parameters"]["BroadcastDays"];
10712
11219
  /** @description Начальная календарная дата МСК для mode=range. */
@@ -10724,6 +11231,8 @@ export interface paths {
10724
11231
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10725
11232
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10726
11233
  mechanism?: components["parameters"]["BroadcastMechanism"];
11234
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11235
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10727
11236
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10728
11237
  product?: components["parameters"]["BroadcastProduct"];
10729
11238
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10732,24 +11241,8 @@ export interface paths {
10732
11241
  freshness?: components["parameters"]["BroadcastFreshness"];
10733
11242
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10734
11243
  channels?: components["parameters"]["BroadcastChannels"];
10735
- /** @description cohort — дата запуска; period — дата события. */
11244
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10736
11245
  view?: components["parameters"]["BroadcastView"];
10737
- /** @description Конкретный день кликнутой ячейки (МСК). */
10738
- date?: components["parameters"]["BroadcastDate"];
10739
- /** @description Канал кликнутой ячейки; пусто = общий итог. */
10740
- channel?: components["parameters"]["BroadcastChannel"];
10741
- /** @description ID конкретной волны. */
10742
- importJobId?: components["parameters"]["BroadcastImportJobId"];
10743
- page?: components["parameters"]["BroadcastPage"];
10744
- pageSize?: components["parameters"]["BroadcastPageSize"];
10745
- /** @description Колонка серверной сортировки списка получателей. */
10746
- sortBy?: components["parameters"]["BroadcastRecipientSortBy"];
10747
- /** @description Направление серверной сортировки списка получателей. */
10748
- sortOrder?: components["parameters"]["BroadcastRecipientSortOrder"];
10749
- /** @description Сузить выборку одной отслеживаемой ссылкой. Уточнение оператора внутри окна: применяется и к списку, и к счётчику — «показано N из M» обязано сходиться. */
10750
- linkId?: string;
10751
- 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";
10753
11246
  };
10754
11247
  header?: never;
10755
11248
  path: {
@@ -10765,7 +11258,7 @@ export interface paths {
10765
11258
  [name: string]: unknown;
10766
11259
  };
10767
11260
  content: {
10768
- "application/json": components["schemas"]["BroadcastRecipientsDrilldownResponse"];
11261
+ "application/json": components["schemas"]["BroadcastUniqueContacts"];
10769
11262
  };
10770
11263
  };
10771
11264
  };
@@ -10778,17 +11271,23 @@ export interface paths {
10778
11271
  patch?: never;
10779
11272
  trace?: never;
10780
11273
  };
10781
- "/api/v2/workspaces/{workspaceId}/broadcast-analytics/deals": {
11274
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/per-person": {
10782
11275
  parameters: {
10783
11276
  query?: never;
10784
11277
  header?: never;
10785
11278
  path?: never;
10786
11279
  cookie?: never;
10787
11280
  };
10788
- /** Drill-down сделок и оплат */
11281
+ /**
11282
+ * Итоги верхних карточек по уникальным контактам за период
11283
+ * @description Счётчики верхних карточек «Обзора», дедуплицированные по chat_user_id за весь выбранный
11284
+ * период. Ручная историческая статистика не входит: её агрегированные строки не несут
11285
+ * идентификатора контакта. Денежные суммы не пересчитываются и в этот ответ не включены.
11286
+ * Результат НЕ аддитивен — складывать его по дням или измерениям нельзя.
11287
+ */
10789
11288
  get: {
10790
11289
  parameters: {
10791
- query: {
11290
+ query?: {
10792
11291
  mode?: components["parameters"]["BroadcastPeriodMode"];
10793
11292
  days?: components["parameters"]["BroadcastDays"];
10794
11293
  /** @description Начальная календарная дата МСК для mode=range. */
@@ -10806,6 +11305,8 @@ export interface paths {
10806
11305
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10807
11306
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10808
11307
  mechanism?: components["parameters"]["BroadcastMechanism"];
11308
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11309
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10809
11310
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10810
11311
  product?: components["parameters"]["BroadcastProduct"];
10811
11312
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10814,21 +11315,8 @@ export interface paths {
10814
11315
  freshness?: components["parameters"]["BroadcastFreshness"];
10815
11316
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10816
11317
  channels?: components["parameters"]["BroadcastChannels"];
10817
- /** @description cohort — дата запуска; period — дата события. */
11318
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10818
11319
  view?: components["parameters"]["BroadcastView"];
10819
- /** @description Конкретный день кликнутой ячейки (МСК). */
10820
- date?: components["parameters"]["BroadcastDate"];
10821
- /** @description Канал кликнутой ячейки; пусто = общий итог. */
10822
- channel?: components["parameters"]["BroadcastChannel"];
10823
- /** @description ID конкретной волны. */
10824
- importJobId?: components["parameters"]["BroadcastImportJobId"];
10825
- page?: components["parameters"]["BroadcastPage"];
10826
- pageSize?: components["parameters"]["BroadcastPageSize"];
10827
- /** @description Колонка серверной сортировки списка сделок и оплат. */
10828
- sortBy?: components["parameters"]["BroadcastDealSortBy"];
10829
- /** @description Направление серверной сортировки списка сделок и оплат. */
10830
- sortOrder?: components["parameters"]["BroadcastDealSortOrder"];
10831
- metric: "issued" | "paid" | "withoutCohort";
10832
11320
  };
10833
11321
  header?: never;
10834
11322
  path: {
@@ -10844,7 +11332,7 @@ export interface paths {
10844
11332
  [name: string]: unknown;
10845
11333
  };
10846
11334
  content: {
10847
- "application/json": components["schemas"]["BroadcastDealsDrilldownResponse"];
11335
+ "application/json": components["schemas"]["BroadcastPerPersonMetrics"];
10848
11336
  };
10849
11337
  };
10850
11338
  };
@@ -10857,17 +11345,17 @@ export interface paths {
10857
11345
  patch?: never;
10858
11346
  trace?: never;
10859
11347
  };
10860
- "/api/v2/workspaces/{workspaceId}/broadcast-analytics/action-failures": {
11348
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/recipients": {
10861
11349
  parameters: {
10862
11350
  query?: never;
10863
11351
  header?: never;
10864
11352
  path?: never;
10865
11353
  cookie?: never;
10866
11354
  };
10867
- /** Production-ошибки действий выбранных рассылок */
11355
+ /** Drill-down получателей по метрике */
10868
11356
  get: {
10869
11357
  parameters: {
10870
- query?: {
11358
+ query: {
10871
11359
  mode?: components["parameters"]["BroadcastPeriodMode"];
10872
11360
  days?: components["parameters"]["BroadcastDays"];
10873
11361
  /** @description Начальная календарная дата МСК для mode=range. */
@@ -10885,6 +11373,8 @@ export interface paths {
10885
11373
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10886
11374
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10887
11375
  mechanism?: components["parameters"]["BroadcastMechanism"];
11376
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11377
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10888
11378
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10889
11379
  product?: components["parameters"]["BroadcastProduct"];
10890
11380
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10893,7 +11383,7 @@ export interface paths {
10893
11383
  freshness?: components["parameters"]["BroadcastFreshness"];
10894
11384
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10895
11385
  channels?: components["parameters"]["BroadcastChannels"];
10896
- /** @description cohort — дата запуска; period — дата события. */
11386
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10897
11387
  view?: components["parameters"]["BroadcastView"];
10898
11388
  /** @description Конкретный день кликнутой ячейки (МСК). */
10899
11389
  date?: components["parameters"]["BroadcastDate"];
@@ -10903,8 +11393,17 @@ export interface paths {
10903
11393
  importJobId?: components["parameters"]["BroadcastImportJobId"];
10904
11394
  page?: components["parameters"]["BroadcastPage"];
10905
11395
  pageSize?: components["parameters"]["BroadcastPageSize"];
10906
- /** @description Точный ActionType; пусто = все типы. */
10907
- actionType?: string;
11396
+ /** @description Колонка серверной сортировки списка получателей. */
11397
+ sortBy?: components["parameters"]["BroadcastRecipientSortBy"];
11398
+ /** @description Направление серверной сортировки списка получателей. */
11399
+ sortOrder?: components["parameters"]["BroadcastRecipientSortOrder"];
11400
+ /** @description Сузить выборку одной отслеживаемой ссылкой. Уточнение оператора внутри окна: применяется и к списку, и к счётчику — «показано N из M» обязано сходиться. */
11401
+ linkId?: string;
11402
+ metric: "sent" | "delivered" | "entered" | "deepDialog" | "linkIssued" | "clicked" | "handedOff" | "notDelivered" | "notSent";
11403
+ /** @description Откуда брать неотправленных при metric=notSent: preflight — проверка волны школы, schedule — журнал подач авторассылки, ownSend — след отсева ручной холодной отправки. Причины трёх источников живут в разных таблицах. У ownSend список бывает короче числа причины: число — агрегат задачи и полно за всю историю, а построчный след начинается с выкатки (см. tracedCount у причины). */
11404
+ reasonSource?: "preflight" | "schedule" | "ownSend";
11405
+ /** @description Код причины неотправки. Словарь выбирает reasonSource: у preflight это GetCourseWavePreflightReason (NO_MESSENGER, ALREADY_SENT, USER_NOT_FOUND и т.д. — другой код там отвергается, потому что значение кастуется в enum прямо в SQL); у schedule это исход подачи, у ownSend — исход прогона (SKIPPED_BOT_SILENCED и т.д.), и у этих двух проверяется только форма кода: заглавные латинские буквы, цифры и подчёркивания. */
11406
+ reason?: string;
10908
11407
  };
10909
11408
  header?: never;
10910
11409
  path: {
@@ -10920,7 +11419,7 @@ export interface paths {
10920
11419
  [name: string]: unknown;
10921
11420
  };
10922
11421
  content: {
10923
- "application/json": components["schemas"]["BroadcastActionFailuresResponse"];
11422
+ "application/json": components["schemas"]["BroadcastRecipientsDrilldownResponse"];
10924
11423
  };
10925
11424
  };
10926
11425
  };
@@ -10933,17 +11432,17 @@ export interface paths {
10933
11432
  patch?: never;
10934
11433
  trace?: never;
10935
11434
  };
10936
- "/api/v2/workspaces/{workspaceId}/broadcast-analytics/indirect-payments": {
11435
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/deals": {
10937
11436
  parameters: {
10938
11437
  query?: never;
10939
11438
  header?: never;
10940
11439
  path?: never;
10941
11440
  cookie?: never;
10942
11441
  };
10943
- /** Drill-down косвенных оплат */
11442
+ /** Drill-down сделок и оплат */
10944
11443
  get: {
10945
11444
  parameters: {
10946
- query?: {
11445
+ query: {
10947
11446
  mode?: components["parameters"]["BroadcastPeriodMode"];
10948
11447
  days?: components["parameters"]["BroadcastDays"];
10949
11448
  /** @description Начальная календарная дата МСК для mode=range. */
@@ -10961,6 +11460,8 @@ export interface paths {
10961
11460
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
10962
11461
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
10963
11462
  mechanism?: components["parameters"]["BroadcastMechanism"];
11463
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11464
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
10964
11465
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
10965
11466
  product?: components["parameters"]["BroadcastProduct"];
10966
11467
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -10969,7 +11470,7 @@ export interface paths {
10969
11470
  freshness?: components["parameters"]["BroadcastFreshness"];
10970
11471
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
10971
11472
  channels?: components["parameters"]["BroadcastChannels"];
10972
- /** @description cohort — дата запуска; period — дата события. */
11473
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
10973
11474
  view?: components["parameters"]["BroadcastView"];
10974
11475
  /** @description Конкретный день кликнутой ячейки (МСК). */
10975
11476
  date?: components["parameters"]["BroadcastDate"];
@@ -10977,12 +11478,13 @@ export interface paths {
10977
11478
  channel?: components["parameters"]["BroadcastChannel"];
10978
11479
  /** @description ID конкретной волны. */
10979
11480
  importJobId?: components["parameters"]["BroadcastImportJobId"];
10980
- /** @description Колонка сортировки косвенных оплат — те же, что у вкладки «Оплаты», минус `confidence`/`matchReason`: атрибуции по сделке у кандидата нет, её признал оператор. */
10981
- sortBy?: components["parameters"]["BroadcastIndirectSortBy"];
10982
- /** @description Направление серверной сортировки списка сделок и оплат. */
10983
- sortOrder?: components["parameters"]["BroadcastDealSortOrder"];
10984
11481
  page?: components["parameters"]["BroadcastPage"];
10985
11482
  pageSize?: components["parameters"]["BroadcastPageSize"];
11483
+ /** @description Колонка серверной сортировки списка сделок и оплат. */
11484
+ sortBy?: components["parameters"]["BroadcastDealSortBy"];
11485
+ /** @description Направление серверной сортировки списка сделок и оплат. */
11486
+ sortOrder?: components["parameters"]["BroadcastDealSortOrder"];
11487
+ metric: "issued" | "paid" | "withoutCohort";
10986
11488
  };
10987
11489
  header?: never;
10988
11490
  path: {
@@ -10998,7 +11500,7 @@ export interface paths {
10998
11500
  [name: string]: unknown;
10999
11501
  };
11000
11502
  content: {
11001
- "application/json": components["schemas"]["BroadcastIndirectPaymentsResponse"];
11503
+ "application/json": components["schemas"]["BroadcastDealsDrilldownResponse"];
11002
11504
  };
11003
11505
  };
11004
11506
  };
@@ -11011,7 +11513,165 @@ export interface paths {
11011
11513
  patch?: never;
11012
11514
  trace?: never;
11013
11515
  };
11014
- "/api/v2/workspaces/{workspaceId}/broadcast-analytics/potential-payments": {
11516
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/action-failures": {
11517
+ parameters: {
11518
+ query?: never;
11519
+ header?: never;
11520
+ path?: never;
11521
+ cookie?: never;
11522
+ };
11523
+ /** Production-ошибки действий выбранных рассылок */
11524
+ get: {
11525
+ parameters: {
11526
+ query?: {
11527
+ mode?: components["parameters"]["BroadcastPeriodMode"];
11528
+ days?: components["parameters"]["BroadcastDays"];
11529
+ /** @description Начальная календарная дата МСК для mode=range. */
11530
+ from?: components["parameters"]["BroadcastFrom"];
11531
+ /** @description Конечная календарная дата МСК для mode=range. */
11532
+ to?: components["parameters"]["BroadcastTo"];
11533
+ platformId?: components["parameters"]["BroadcastPlatformId"];
11534
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11535
+ funnel?: components["parameters"]["BroadcastFunnel"];
11536
+ /** @description Добавляет строки без воронки. Можно сочетать с funnel: значения и NULL объединяются через OR. */
11537
+ funnelMode?: components["parameters"]["BroadcastFunnelMode"];
11538
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11539
+ segment?: components["parameters"]["BroadcastSegment"];
11540
+ /** @description Один или несколько ID именованных вариантов рассылки. */
11541
+ mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11542
+ /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11543
+ mechanism?: components["parameters"]["BroadcastMechanism"];
11544
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11545
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11546
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11547
+ product?: components["parameters"]["BroadcastProduct"];
11548
+ /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
11549
+ productMode?: components["parameters"]["BroadcastProductMode"];
11550
+ /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
11551
+ freshness?: components["parameters"]["BroadcastFreshness"];
11552
+ /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11553
+ channels?: components["parameters"]["BroadcastChannels"];
11554
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11555
+ view?: components["parameters"]["BroadcastView"];
11556
+ /** @description Конкретный день кликнутой ячейки (МСК). */
11557
+ date?: components["parameters"]["BroadcastDate"];
11558
+ /** @description Канал кликнутой ячейки; пусто = общий итог. */
11559
+ channel?: components["parameters"]["BroadcastChannel"];
11560
+ /** @description ID конкретной волны. */
11561
+ importJobId?: components["parameters"]["BroadcastImportJobId"];
11562
+ page?: components["parameters"]["BroadcastPage"];
11563
+ pageSize?: components["parameters"]["BroadcastPageSize"];
11564
+ /** @description Точный ActionType; пусто = все типы. */
11565
+ actionType?: string;
11566
+ };
11567
+ header?: never;
11568
+ path: {
11569
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
11570
+ };
11571
+ cookie?: never;
11572
+ };
11573
+ requestBody?: never;
11574
+ responses: {
11575
+ /** @description OK */
11576
+ 200: {
11577
+ headers: {
11578
+ [name: string]: unknown;
11579
+ };
11580
+ content: {
11581
+ "application/json": components["schemas"]["BroadcastActionFailuresResponse"];
11582
+ };
11583
+ };
11584
+ };
11585
+ };
11586
+ put?: never;
11587
+ post?: never;
11588
+ delete?: never;
11589
+ options?: never;
11590
+ head?: never;
11591
+ patch?: never;
11592
+ trace?: never;
11593
+ };
11594
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/indirect-payments": {
11595
+ parameters: {
11596
+ query?: never;
11597
+ header?: never;
11598
+ path?: never;
11599
+ cookie?: never;
11600
+ };
11601
+ /** Drill-down косвенных оплат */
11602
+ get: {
11603
+ parameters: {
11604
+ query?: {
11605
+ mode?: components["parameters"]["BroadcastPeriodMode"];
11606
+ days?: components["parameters"]["BroadcastDays"];
11607
+ /** @description Начальная календарная дата МСК для mode=range. */
11608
+ from?: components["parameters"]["BroadcastFrom"];
11609
+ /** @description Конечная календарная дата МСК для mode=range. */
11610
+ to?: components["parameters"]["BroadcastTo"];
11611
+ platformId?: components["parameters"]["BroadcastPlatformId"];
11612
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11613
+ funnel?: components["parameters"]["BroadcastFunnel"];
11614
+ /** @description Добавляет строки без воронки. Можно сочетать с funnel: значения и NULL объединяются через OR. */
11615
+ funnelMode?: components["parameters"]["BroadcastFunnelMode"];
11616
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11617
+ segment?: components["parameters"]["BroadcastSegment"];
11618
+ /** @description Один или несколько ID именованных вариантов рассылки. */
11619
+ mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11620
+ /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11621
+ mechanism?: components["parameters"]["BroadcastMechanism"];
11622
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11623
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11624
+ /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11625
+ product?: components["parameters"]["BroadcastProduct"];
11626
+ /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
11627
+ productMode?: components["parameters"]["BroadcastProductMode"];
11628
+ /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
11629
+ freshness?: components["parameters"]["BroadcastFreshness"];
11630
+ /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11631
+ channels?: components["parameters"]["BroadcastChannels"];
11632
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11633
+ view?: components["parameters"]["BroadcastView"];
11634
+ /** @description Конкретный день кликнутой ячейки (МСК). */
11635
+ date?: components["parameters"]["BroadcastDate"];
11636
+ /** @description Канал кликнутой ячейки; пусто = общий итог. */
11637
+ channel?: components["parameters"]["BroadcastChannel"];
11638
+ /** @description ID конкретной волны. */
11639
+ importJobId?: components["parameters"]["BroadcastImportJobId"];
11640
+ /** @description Колонка сортировки косвенных оплат — те же, что у вкладки «Оплаты», минус `confidence`/`matchReason`: атрибуции по сделке у кандидата нет, её признал оператор. */
11641
+ sortBy?: components["parameters"]["BroadcastIndirectSortBy"];
11642
+ /** @description Направление серверной сортировки списка сделок и оплат. */
11643
+ sortOrder?: components["parameters"]["BroadcastDealSortOrder"];
11644
+ page?: components["parameters"]["BroadcastPage"];
11645
+ pageSize?: components["parameters"]["BroadcastPageSize"];
11646
+ };
11647
+ header?: never;
11648
+ path: {
11649
+ workspaceId: components["parameters"]["BroadcastWorkspaceId"];
11650
+ };
11651
+ cookie?: never;
11652
+ };
11653
+ requestBody?: never;
11654
+ responses: {
11655
+ /** @description OK */
11656
+ 200: {
11657
+ headers: {
11658
+ [name: string]: unknown;
11659
+ };
11660
+ content: {
11661
+ "application/json": components["schemas"]["BroadcastIndirectPaymentsResponse"];
11662
+ };
11663
+ };
11664
+ };
11665
+ };
11666
+ put?: never;
11667
+ post?: never;
11668
+ delete?: never;
11669
+ options?: never;
11670
+ head?: never;
11671
+ patch?: never;
11672
+ trace?: never;
11673
+ };
11674
+ "/api/v2/workspaces/{workspaceId}/broadcast-analytics/potential-payments": {
11015
11675
  parameters: {
11016
11676
  query?: never;
11017
11677
  header?: never;
@@ -11039,6 +11699,8 @@ export interface paths {
11039
11699
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11040
11700
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11041
11701
  mechanism?: components["parameters"]["BroadcastMechanism"];
11702
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11703
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11042
11704
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11043
11705
  product?: components["parameters"]["BroadcastProduct"];
11044
11706
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11047,7 +11709,7 @@ export interface paths {
11047
11709
  freshness?: components["parameters"]["BroadcastFreshness"];
11048
11710
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11049
11711
  channels?: components["parameters"]["BroadcastChannels"];
11050
- /** @description cohort — дата запуска; period — дата события. */
11712
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11051
11713
  view?: components["parameters"]["BroadcastView"];
11052
11714
  /** @description Конкретный день кликнутой ячейки (МСК). */
11053
11715
  date?: components["parameters"]["BroadcastDate"];
@@ -11113,6 +11775,8 @@ export interface paths {
11113
11775
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11114
11776
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11115
11777
  mechanism?: components["parameters"]["BroadcastMechanism"];
11778
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11779
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11116
11780
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11117
11781
  product?: components["parameters"]["BroadcastProduct"];
11118
11782
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11121,7 +11785,7 @@ export interface paths {
11121
11785
  freshness?: components["parameters"]["BroadcastFreshness"];
11122
11786
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11123
11787
  channels?: components["parameters"]["BroadcastChannels"];
11124
- /** @description cohort — дата запуска; period — дата события. */
11788
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11125
11789
  view?: components["parameters"]["BroadcastView"];
11126
11790
  };
11127
11791
  header?: never;
@@ -11179,6 +11843,8 @@ export interface paths {
11179
11843
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11180
11844
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11181
11845
  mechanism?: components["parameters"]["BroadcastMechanism"];
11846
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11847
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11182
11848
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11183
11849
  product?: components["parameters"]["BroadcastProduct"];
11184
11850
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11187,7 +11853,7 @@ export interface paths {
11187
11853
  freshness?: components["parameters"]["BroadcastFreshness"];
11188
11854
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11189
11855
  channels?: components["parameters"]["BroadcastChannels"];
11190
- /** @description cohort — дата запуска; period — дата события. */
11856
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11191
11857
  view?: components["parameters"]["BroadcastView"];
11192
11858
  };
11193
11859
  header?: never;
@@ -11245,6 +11911,8 @@ export interface paths {
11245
11911
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11246
11912
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11247
11913
  mechanism?: components["parameters"]["BroadcastMechanism"];
11914
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11915
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11248
11916
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11249
11917
  product?: components["parameters"]["BroadcastProduct"];
11250
11918
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11253,7 +11921,7 @@ export interface paths {
11253
11921
  freshness?: components["parameters"]["BroadcastFreshness"];
11254
11922
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11255
11923
  channels?: components["parameters"]["BroadcastChannels"];
11256
- /** @description cohort — дата запуска; period — дата события. */
11924
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11257
11925
  view?: components["parameters"]["BroadcastView"];
11258
11926
  };
11259
11927
  header?: never;
@@ -11311,6 +11979,8 @@ export interface paths {
11311
11979
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11312
11980
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11313
11981
  mechanism?: components["parameters"]["BroadcastMechanism"];
11982
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
11983
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11314
11984
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11315
11985
  product?: components["parameters"]["BroadcastProduct"];
11316
11986
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11319,7 +11989,7 @@ export interface paths {
11319
11989
  freshness?: components["parameters"]["BroadcastFreshness"];
11320
11990
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
11321
11991
  channels?: components["parameters"]["BroadcastChannels"];
11322
- /** @description cohort — дата запуска; period — дата события. */
11992
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
11323
11993
  view?: components["parameters"]["BroadcastView"];
11324
11994
  };
11325
11995
  header?: never;
@@ -11380,6 +12050,8 @@ export interface paths {
11380
12050
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11381
12051
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11382
12052
  mechanism?: components["parameters"]["BroadcastMechanism"];
12053
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
12054
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11383
12055
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11384
12056
  product?: components["parameters"]["BroadcastProduct"];
11385
12057
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -11457,6 +12129,8 @@ export interface paths {
11457
12129
  mailingVariantId?: components["parameters"]["BroadcastMailingVariantId"];
11458
12130
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
11459
12131
  mechanism?: components["parameters"]["BroadcastMechanism"];
12132
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
12133
+ launchSource?: components["parameters"]["BroadcastLaunchSource"];
11460
12134
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
11461
12135
  product?: components["parameters"]["BroadcastProduct"];
11462
12136
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
@@ -12053,6 +12727,71 @@ export interface paths {
12053
12727
  patch?: never;
12054
12728
  trace?: never;
12055
12729
  };
12730
+ "/api/v2/workspaces/{workspaceId}/workbooks/{workbookId}/sheets/read": {
12731
+ parameters: {
12732
+ query?: never;
12733
+ header?: never;
12734
+ path?: never;
12735
+ cookie?: never;
12736
+ };
12737
+ /**
12738
+ * Постранично прочитать диапазон листа без записи в знания
12739
+ * @description Inspect возвращает только sample. Этот endpoint читает поздние строки и колонки,
12740
+ * возвращает явные признаки продолжения и fingerprint страницы. Для Google Sheets
12741
+ * точные total могут быть неизвестны и тогда возвращаются null.
12742
+ */
12743
+ get: {
12744
+ parameters: {
12745
+ query?: {
12746
+ sheetTitle?: string;
12747
+ sheetGid?: number;
12748
+ sheetIndex?: number;
12749
+ rowOffset?: number;
12750
+ rowLimit?: number;
12751
+ columnOffset?: number;
12752
+ columnLimit?: number;
12753
+ };
12754
+ header?: never;
12755
+ path: {
12756
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
12757
+ workbookId: string;
12758
+ };
12759
+ cookie?: never;
12760
+ };
12761
+ requestBody?: never;
12762
+ responses: {
12763
+ 200: {
12764
+ headers: {
12765
+ [name: string]: unknown;
12766
+ };
12767
+ content: {
12768
+ "application/json": components["schemas"]["WorkbookSheetPage"];
12769
+ };
12770
+ };
12771
+ /** @description Селектор листа неоднозначен или не подходит типу книги */
12772
+ 400: {
12773
+ headers: {
12774
+ [name: string]: unknown;
12775
+ };
12776
+ content?: never;
12777
+ };
12778
+ /** @description SourceWorkbook */
12779
+ 404: {
12780
+ headers: {
12781
+ [name: string]: unknown;
12782
+ };
12783
+ content?: never;
12784
+ };
12785
+ };
12786
+ };
12787
+ put?: never;
12788
+ post?: never;
12789
+ delete?: never;
12790
+ options?: never;
12791
+ head?: never;
12792
+ patch?: never;
12793
+ trace?: never;
12794
+ };
12056
12795
  "/api/v2/workspaces/{workspaceId}/workbooks/{workbookId}/extract-amocrm-leads": {
12057
12796
  parameters: {
12058
12797
  query?: never;
@@ -12433,7 +13172,7 @@ export interface paths {
12433
13172
  put?: never;
12434
13173
  /**
12435
13174
  * Переиндексация knowledge space (re-embed Qa + KnowledgeChunk → Pinecone)
12436
- * @description Идемпотентная фоновая пересборка векторов из Postgres — восстанавливает поиск после рассинхрона Postgres↔Pinecone (v1.5 Increment 15). Возвращает job_id сразу; итог фоновой BullMQ-задачи `knowledge-namespace-reindex` — в логах воркера.
13175
+ * @description Идемпотентная фоновая пересборка векторов из Postgres — восстанавливает поиск после рассинхрона Postgres↔Pinecone (v1.5 Increment 15). Возвращает job_id сразу; итог фоновой BullMQ-задачи доступен через status endpoint в течение 24 часов.
12437
13176
  */
12438
13177
  post: {
12439
13178
  parameters: {
@@ -12467,6 +13206,44 @@ export interface paths {
12467
13206
  patch?: never;
12468
13207
  trace?: never;
12469
13208
  };
13209
+ "/api/v2/workspaces/{workspaceId}/knowledge-spaces/{knowledgeSpaceId}/reindex/status": {
13210
+ parameters: {
13211
+ query?: never;
13212
+ header?: never;
13213
+ path?: never;
13214
+ cookie?: never;
13215
+ };
13216
+ /** Статус фоновой переиндексации knowledge space */
13217
+ get: {
13218
+ parameters: {
13219
+ query?: never;
13220
+ header?: never;
13221
+ path: {
13222
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
13223
+ knowledgeSpaceId: string;
13224
+ };
13225
+ cookie?: never;
13226
+ };
13227
+ requestBody?: never;
13228
+ responses: {
13229
+ 200: {
13230
+ headers: {
13231
+ [name: string]: unknown;
13232
+ };
13233
+ content: {
13234
+ "application/json": components["schemas"]["AsyncJobStatusResponse"];
13235
+ };
13236
+ };
13237
+ };
13238
+ };
13239
+ put?: never;
13240
+ post?: never;
13241
+ delete?: never;
13242
+ options?: never;
13243
+ head?: never;
13244
+ patch?: never;
13245
+ trace?: never;
13246
+ };
12470
13247
  "/api/v2/workspaces/{workspaceId}/knowledge-spaces/{knowledgeSpaceId}/channel-links": {
12471
13248
  parameters: {
12472
13249
  query?: never;
@@ -13451,30 +14228,22 @@ export interface paths {
13451
14228
  patch?: never;
13452
14229
  trace?: never;
13453
14230
  };
13454
- "/api/v2/workspaces/{workspaceId}/variables": {
14231
+ "/api/v2/workspaces/{workspaceId}/knowledge-spaces/{knowledgeSpaceId}/tables/{tableId}/reindex/status": {
13455
14232
  parameters: {
13456
14233
  query?: never;
13457
14234
  header?: never;
13458
14235
  path?: never;
13459
14236
  cookie?: never;
13460
14237
  };
13461
- /**
13462
- * List variables (WORKSPACE or CHANNEL scope)
13463
- * @description scope=WORKSPACE возвращает все WorkspaceVariable workspace.
13464
- * scope=CHANNEL требует platformId и возвращает CustomVariable одной платформы (filter: all|variables|constants).
13465
- */
14238
+ /** Статус фоновой переиндексации knowledge table */
13466
14239
  get: {
13467
14240
  parameters: {
13468
- query: {
13469
- scope: "WORKSPACE" | "CHANNEL";
13470
- /** @description Required when scope=CHANNEL */
13471
- platformId?: string;
13472
- /** @description CHANNEL scope only; default=all */
13473
- filter?: "all" | "variables" | "constants";
13474
- };
14241
+ query?: never;
13475
14242
  header?: never;
13476
14243
  path: {
13477
14244
  workspaceId: components["parameters"]["WorkspaceIdPath"];
14245
+ knowledgeSpaceId: string;
14246
+ tableId: string;
13478
14247
  };
13479
14248
  cookie?: never;
13480
14249
  };
@@ -13485,10 +14254,57 @@ export interface paths {
13485
14254
  [name: string]: unknown;
13486
14255
  };
13487
14256
  content: {
13488
- "application/json": components["schemas"]["ListVariablesResponse"];
14257
+ "application/json": components["schemas"]["AsyncJobStatusResponse"];
13489
14258
  };
13490
14259
  };
13491
- /** @description scope=CHANNEL без platformId */
14260
+ };
14261
+ };
14262
+ put?: never;
14263
+ post?: never;
14264
+ delete?: never;
14265
+ options?: never;
14266
+ head?: never;
14267
+ patch?: never;
14268
+ trace?: never;
14269
+ };
14270
+ "/api/v2/workspaces/{workspaceId}/variables": {
14271
+ parameters: {
14272
+ query?: never;
14273
+ header?: never;
14274
+ path?: never;
14275
+ cookie?: never;
14276
+ };
14277
+ /**
14278
+ * List variables (WORKSPACE or CHANNEL scope)
14279
+ * @description scope=WORKSPACE возвращает все WorkspaceVariable workspace.
14280
+ * scope=CHANNEL требует platformId и возвращает CustomVariable одной платформы (filter: all|variables|constants).
14281
+ */
14282
+ get: {
14283
+ parameters: {
14284
+ query: {
14285
+ scope: "WORKSPACE" | "CHANNEL";
14286
+ /** @description Required when scope=CHANNEL */
14287
+ platformId?: string;
14288
+ /** @description CHANNEL scope only; default=all */
14289
+ filter?: "all" | "variables" | "constants";
14290
+ };
14291
+ header?: never;
14292
+ path: {
14293
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
14294
+ };
14295
+ cookie?: never;
14296
+ };
14297
+ requestBody?: never;
14298
+ responses: {
14299
+ 200: {
14300
+ headers: {
14301
+ [name: string]: unknown;
14302
+ };
14303
+ content: {
14304
+ "application/json": components["schemas"]["ListVariablesResponse"];
14305
+ };
14306
+ };
14307
+ /** @description scope=CHANNEL без platformId */
13492
14308
  400: {
13493
14309
  headers: {
13494
14310
  [name: string]: unknown;
@@ -15681,6 +16497,26 @@ export interface paths {
15681
16497
  patch?: never;
15682
16498
  trace?: never;
15683
16499
  };
16500
+ "/api/v2/workspaces/{workspaceId}/amocrm/channel-registration": {
16501
+ parameters: {
16502
+ query?: never;
16503
+ header?: never;
16504
+ path?: never;
16505
+ cookie?: never;
16506
+ };
16507
+ /**
16508
+ * AmoCRM chat-channel registration request (webhook URL + support email template)
16509
+ * @description Чтобы переписка бота появлялась в карточке сделки AmoCRM, их поддержка должна ЗАРЕГИСТРИРОВАТЬ канал по письму заданной формы; channelId/channelSecretKey выдают только так. Текст письма и адрес вебхука собирает бэкенд (канон ai-aniomaly/src/core/application/crms/amocrm/constants/amocrm-channel-registration.constants.ts) — тем же ответом пользуется страница AmoCRM в интерфейсе. Копий у клиентов нет намеренно: письмо регистрирует адрес, на который потом идут входящие, и разошедшийся текст дал бы канал, смотрящий не туда, — это обнаружилось бы только пропажей сообщений.
16510
+ */
16511
+ get: operations["getAmoCrmChannelRegistration"];
16512
+ put?: never;
16513
+ post?: never;
16514
+ delete?: never;
16515
+ options?: never;
16516
+ head?: never;
16517
+ patch?: never;
16518
+ trace?: never;
16519
+ };
15684
16520
  "/api/v2/workspaces/{workspaceId}/crms/{crmId}/field-mapping": {
15685
16521
  parameters: {
15686
16522
  query?: never;
@@ -18983,106 +19819,576 @@ export interface paths {
18983
19819
  patch?: never;
18984
19820
  trace?: never;
18985
19821
  };
18986
- }
18987
- export type webhooks = Record<string, never>;
18988
- export interface components {
18989
- schemas: {
18990
- UpdateDialogScriptRequest: {
18991
- /** @description Вводная проза §6 до первой ветки (опц.) */
18992
- preamble?: string;
18993
- graph: components["schemas"]["ScriptGraph"];
18994
- };
18995
- AgentScriptGraphResponse: {
18996
- /** @description false если у агента нет §6 «Скрипт диалога» (пустой/legacy промпт) */
18997
- present: boolean;
18998
- scriptGraph: components["schemas"]["ScriptGraph"] | null;
19822
+ "/api/v2/workspaces/{workspaceId}/analytics/inbound/{report}": {
19823
+ parameters: {
19824
+ query?: never;
19825
+ header?: never;
19826
+ path?: never;
19827
+ cookie?: never;
18999
19828
  };
19000
- ScriptGraph: {
19001
- stages: components["schemas"]["ScriptStage"][];
19002
- nodes: components["schemas"]["ScriptNode"][];
19003
- edges: components["schemas"]["ScriptEdge"][];
19829
+ /** Агрегаты органических входящих диалогов */
19830
+ get: operations["getInboundAnalytics"];
19831
+ put?: never;
19832
+ post?: never;
19833
+ delete?: never;
19834
+ options?: never;
19835
+ head?: never;
19836
+ patch?: never;
19837
+ trace?: never;
19838
+ };
19839
+ "/api/v2/workspaces/{workspaceId}/analytics/funnel/{report}": {
19840
+ parameters: {
19841
+ query?: never;
19842
+ header?: never;
19843
+ path?: never;
19844
+ cookie?: never;
19004
19845
  };
19005
- ScriptStage: {
19006
- id: string;
19007
- name: string;
19846
+ /** Мета, сводка или недельные когорты воронки площадки */
19847
+ get: operations["getFunnelAnalytics"];
19848
+ put?: never;
19849
+ post?: never;
19850
+ delete?: never;
19851
+ options?: never;
19852
+ head?: never;
19853
+ patch?: never;
19854
+ trace?: never;
19855
+ };
19856
+ "/api/v2/workspaces/{workspaceId}/analytics/costs/{report}": {
19857
+ parameters: {
19858
+ query?: never;
19859
+ header?: never;
19860
+ path?: never;
19861
+ cookie?: never;
19008
19862
  };
19009
- ScriptNode: {
19010
- /** @description id узла = id ветки §6 (A, D2, …) */
19011
- id: string;
19012
- stageId: string;
19013
- title: string;
19014
- instruction: string;
19015
- /** @description свободный лейбл состояния воронки */
19016
- leadStateTag?: string | null;
19017
- branchId: string;
19863
+ /** Фактический AI usage ledger и его разрезы */
19864
+ get: operations["getAiCosts"];
19865
+ put?: never;
19866
+ post?: never;
19867
+ delete?: never;
19868
+ options?: never;
19869
+ head?: never;
19870
+ patch?: never;
19871
+ trace?: never;
19872
+ };
19873
+ "/api/v2/workspaces/{workspaceId}/custom-reports": {
19874
+ parameters: {
19875
+ query?: never;
19876
+ header?: never;
19877
+ path?: never;
19878
+ cookie?: never;
19018
19879
  };
19019
- ScriptEdge: {
19020
- from: string;
19021
- to: string;
19022
- condition?: string | null;
19880
+ /** Список сохранённых кастомных отчётов */
19881
+ get: operations["listCustomReports"];
19882
+ put?: never;
19883
+ post?: never;
19884
+ delete?: never;
19885
+ options?: never;
19886
+ head?: never;
19887
+ patch?: never;
19888
+ trace?: never;
19889
+ };
19890
+ "/api/v2/workspaces/{workspaceId}/custom-reports/{reportId}": {
19891
+ parameters: {
19892
+ query?: never;
19893
+ header?: never;
19894
+ path?: never;
19895
+ cookie?: never;
19023
19896
  };
19024
- ErrorResponse: {
19025
- error: {
19026
- /** @example VALIDATION_FAILED */
19027
- code: string;
19028
- /** @example Field "name" is required */
19029
- message: string;
19030
- details?: {
19031
- [key: string]: unknown;
19032
- };
19033
- /** Format: uuid */
19034
- requestId?: string;
19035
- };
19897
+ /** Определение сохранённого кастомного отчёта */
19898
+ get: operations["getCustomReport"];
19899
+ put?: never;
19900
+ post?: never;
19901
+ delete?: never;
19902
+ options?: never;
19903
+ head?: never;
19904
+ patch?: never;
19905
+ trace?: never;
19906
+ };
19907
+ "/api/v2/workspaces/{workspaceId}/custom-reports/{reportId}/report": {
19908
+ parameters: {
19909
+ query?: never;
19910
+ header?: never;
19911
+ path?: never;
19912
+ cookie?: never;
19036
19913
  };
19037
- ValidationErrorResponse: components["schemas"]["ErrorResponse"] & {
19038
- error?: {
19039
- /**
19040
- * @example {
19041
- * "name": [
19042
- * "Field is required"
19043
- * ],
19044
- * "email": [
19045
- * "Invalid email format"
19046
- * ]
19047
- * }
19048
- */
19049
- fieldErrors?: {
19050
- [key: string]: string[];
19051
- };
19052
- };
19914
+ /**
19915
+ * Живой расчёт сохранённой таблицы за период
19916
+ * @description Для источника «Перс воронка» дополнительно возвращает единый snapshot: calculatedAt, executionDbSnapshot, currentStepsFingerprint и reportUpdatedAt. Все четыре значения нужно без изменений передать в drill-down; у legacy-источников snapshot-поля отсутствуют.
19917
+ */
19918
+ get: operations["getCustomReportData"];
19919
+ put?: never;
19920
+ post?: never;
19921
+ delete?: never;
19922
+ options?: never;
19923
+ head?: never;
19924
+ patch?: never;
19925
+ trace?: never;
19926
+ };
19927
+ "/api/v2/workspaces/{workspaceId}/operational-overview": {
19928
+ parameters: {
19929
+ query?: never;
19930
+ header?: never;
19931
+ path?: never;
19932
+ cookie?: never;
19053
19933
  };
19054
- /** @enum {string} */
19055
- GetCourseWaveRunState: "QUEUED" | "PENDING" | "STEP1" | "STEP2" | "COMPLETED" | "FAILED" | "CANCELLING" | "CANCELLED";
19056
- /** @enum {string} */
19057
- GetCourseWaveRunContactStatus: "PENDING" | "CLAIMED" | "SENT" | "SKIPPED" | "FAILED" | "UNKNOWN";
19058
- GetCourseWaveRunContactInput: {
19059
- /** @description GetCourse user id */
19060
- contactId: string;
19061
- /** @description Registration deal id для свежего пина Шага 1 */
19062
- dealId?: string;
19063
- transport?: components["schemas"]["GetCourseTransport"];
19064
- dialogId?: string;
19065
- /** Format: email */
19066
- email?: string;
19067
- phone?: string;
19068
- firstName?: string;
19069
- lastName?: string;
19070
- /** Format: date-time */
19071
- leadLastActiveAt?: string;
19072
- /** Format: date-time */
19073
- segmentEnteredAt?: string;
19934
+ /**
19935
+ * Эксплуатационная сводка воркспейса
19936
+ * @description Возвращает состояние follow-up цепочек, расписаний и последних задач, безопасные метаданные ошибок действий и предупреждения с drill-down. Очередь операторов включается только когда effective scopes текущего вызова содержат read:conversations; иначе ответ явно сообщает missingScope.
19937
+ */
19938
+ get: operations["getWorkspaceOperationalOverview"];
19939
+ put?: never;
19940
+ post?: never;
19941
+ delete?: never;
19942
+ options?: never;
19943
+ head?: never;
19944
+ patch?: never;
19945
+ trace?: never;
19946
+ };
19947
+ "/api/v2/workspaces/{workspaceId}/workspace-operators": {
19948
+ parameters: {
19949
+ query?: never;
19950
+ header?: never;
19951
+ path?: never;
19952
+ cookie?: never;
19074
19953
  };
19075
- GetCourseWaveRunPreflightOptions: {
19076
- /** @default true */
19077
- enabled: boolean;
19078
- productTitle?: string;
19079
- productMatchKey?: string;
19080
- offerId?: number;
19081
- /**
19082
- * @default warn
19083
- * @enum {string}
19084
- */
19085
- otherProductActiveDealMode: "warn" | "block" | "ignore";
19954
+ /** Системные операторы Besales для фильтра и назначения */
19955
+ get: operations["listWorkspaceOperatorsForWorkflow"];
19956
+ put?: never;
19957
+ post?: never;
19958
+ delete?: never;
19959
+ options?: never;
19960
+ head?: never;
19961
+ patch?: never;
19962
+ trace?: never;
19963
+ };
19964
+ "/api/v2/workspaces/{workspaceId}/operator-queue": {
19965
+ parameters: {
19966
+ query?: never;
19967
+ header?: never;
19968
+ path?: never;
19969
+ cookie?: never;
19970
+ };
19971
+ /** Пагинированная очередь живых операторов */
19972
+ get: operations["listWorkspaceOperatorQueue"];
19973
+ put?: never;
19974
+ post?: never;
19975
+ delete?: never;
19976
+ options?: never;
19977
+ head?: never;
19978
+ patch?: never;
19979
+ trace?: never;
19980
+ };
19981
+ "/api/v2/workspaces/{workspaceId}/chats/{contactId}/operator-assignment": {
19982
+ parameters: {
19983
+ query?: never;
19984
+ header?: never;
19985
+ path?: never;
19986
+ cookie?: never;
19987
+ };
19988
+ /** Текущее назначение оператора и CAS-версия */
19989
+ get: operations["getWorkspaceOperatorAssignment"];
19990
+ put?: never;
19991
+ post?: never;
19992
+ delete?: never;
19993
+ options?: never;
19994
+ head?: never;
19995
+ /**
19996
+ * Назначить, переназначить или снять системного оператора
19997
+ * @description CAS-операция меняет только локальное назначение Besales. Она не меняет CRM operator, operatorStatus и не отправляет сообщение.
19998
+ */
19999
+ patch: operations["updateWorkspaceOperatorAssignment"];
20000
+ trace?: never;
20001
+ };
20002
+ "/api/v2/workspaces/{workspaceId}/custom-reports/{reportId}/drilldown": {
20003
+ parameters: {
20004
+ query?: never;
20005
+ header?: never;
20006
+ path?: never;
20007
+ cookie?: never;
20008
+ };
20009
+ /**
20010
+ * Контакты и сделки за числом сохранённой таблицы
20011
+ * @description Возвращает конкретные исполнения, контакты или сделки за числовой ячейкой источников «Обзор», «Фоллоу-апы» и «Перс воронка». Сервер перечитывает определение отчёта и проверяет updatedAt; сводная передаёт полный путь строки. Snapshot и fingerprint обязательны только для personalized-источника. Для процентной колонки раскрывается фактический числитель.
20012
+ */
20013
+ get: operations["getCustomReportDrilldown"];
20014
+ put?: never;
20015
+ post?: never;
20016
+ delete?: never;
20017
+ options?: never;
20018
+ head?: never;
20019
+ patch?: never;
20020
+ trace?: never;
20021
+ };
20022
+ }
20023
+ export type webhooks = Record<string, never>;
20024
+ export interface components {
20025
+ schemas: {
20026
+ TriggerContactClaim: {
20027
+ /** Format: uuid */
20028
+ triggerId: string;
20029
+ triggerName: string;
20030
+ /** Format: uuid */
20031
+ agentId: string;
20032
+ agentName: string | null;
20033
+ /** @enum {string} */
20034
+ status: "IN_PROGRESS" | "COMPLETED";
20035
+ /** Format: date-time */
20036
+ claimedAt: string;
20037
+ /** @description false у status=IN_PROGRESS — право держит владелец */
20038
+ canReset: boolean;
20039
+ /** @enum {string|null} */
20040
+ blockedReason: "RUNNING" | null;
20041
+ triggerIsEnabled: boolean;
20042
+ /** @description Осталась ли включённой настройка «сработать один раз». Право переживает её выключение: тогда строка висит, но триггер срабатывает как обычный. */
20043
+ stillOneTime: boolean;
20044
+ };
20045
+ TriggerContactClaimsPage: {
20046
+ claims: components["schemas"]["TriggerContactClaim"][];
20047
+ truncated: boolean;
20048
+ };
20049
+ ResetTriggerClaimRequest: {
20050
+ /**
20051
+ * @description Обязательное подтверждение: триггер сможет повторить необратимые действия во внешних системах. Проверяется на сервере, а не только в MCP-клиенте.
20052
+ * @enum {boolean}
20053
+ */
20054
+ explicitConfirmation: true;
20055
+ };
20056
+ CustomReportMetricValues: {
20057
+ [key: string]: number | null;
20058
+ };
20059
+ CustomReportBucket: {
20060
+ /** Format: date */
20061
+ key: string;
20062
+ /** Format: date */
20063
+ from: string;
20064
+ /** Format: date */
20065
+ to: string;
20066
+ partial: boolean;
20067
+ rows: {
20068
+ [key: string]: components["schemas"]["CustomReportMetricValues"];
20069
+ };
20070
+ total: components["schemas"]["CustomReportMetricValues"];
20071
+ comparableReliable?: boolean;
20072
+ };
20073
+ CustomReportGrandTotal: {
20074
+ /** Format: date */
20075
+ from: string;
20076
+ /** Format: date */
20077
+ to: string;
20078
+ rows: {
20079
+ [key: string]: components["schemas"]["CustomReportMetricValues"];
20080
+ };
20081
+ total: components["schemas"]["CustomReportMetricValues"];
20082
+ comparableReliable?: boolean;
20083
+ };
20084
+ CustomReportDrilldownSnapshot: {
20085
+ /** Format: date-time */
20086
+ calculatedAt: string;
20087
+ executionDbSnapshot: string;
20088
+ currentStepsFingerprint: string;
20089
+ /** Format: date-time */
20090
+ reportUpdatedAt: string;
20091
+ };
20092
+ CustomReportStepSchedule: {
20093
+ /** @enum {string} */
20094
+ kind: "offset" | "clock" | "beforeMeeting" | "unknown";
20095
+ minutes?: number;
20096
+ dayOffset?: number;
20097
+ atTime?: string;
20098
+ };
20099
+ /** @description Pass-through ответа канонической UI-витрины. Конкретная форма зависит от report и сохраняется без пересчёта адаптером; nullable и unknown-поля имеют доменный смысл. */
20100
+ AnalyticsAggregateResponse: {
20101
+ [key: string]: unknown;
20102
+ };
20103
+ OperationalOverviewWarning: {
20104
+ /** @enum {string} */
20105
+ severity: "info" | "warning" | "critical";
20106
+ code: string;
20107
+ sourceType: string;
20108
+ sourceId: string;
20109
+ /** Format: date-time */
20110
+ occurredAt: string | null;
20111
+ reason: string;
20112
+ drilldown: {
20113
+ type: string;
20114
+ id: string;
20115
+ };
20116
+ };
20117
+ OperationalOverviewResponse: {
20118
+ /** Format: date-time */
20119
+ generatedAt: string;
20120
+ summary: {
20121
+ [key: string]: number;
20122
+ };
20123
+ followUp: {
20124
+ [key: string]: unknown;
20125
+ };
20126
+ schedules: {
20127
+ [key: string]: unknown;
20128
+ }[];
20129
+ jobs: {
20130
+ [key: string]: unknown;
20131
+ }[];
20132
+ actionErrors: {
20133
+ [key: string]: unknown;
20134
+ }[];
20135
+ operatorQueue: {
20136
+ [key: string]: unknown;
20137
+ };
20138
+ warnings: components["schemas"]["OperationalOverviewWarning"][];
20139
+ };
20140
+ WorkspaceOperatorOption: {
20141
+ /** Format: uuid */
20142
+ id: string;
20143
+ displayName: string | null;
20144
+ assignable: boolean;
20145
+ /** @enum {string} */
20146
+ operatorType: "WORKSPACE";
20147
+ };
20148
+ WorkspaceOperatorIdentity: {
20149
+ /** Format: uuid */
20150
+ id: string;
20151
+ displayName: string | null;
20152
+ };
20153
+ OperatorWorkflowEvidence: {
20154
+ /** Format: uuid */
20155
+ id: string;
20156
+ /** @enum {string} */
20157
+ eventType: "OPERATOR_TAKEOVER" | "FINISH_RESOLVED";
20158
+ /** Format: date-time */
20159
+ occurredAt: string;
20160
+ };
20161
+ WorkspaceOperatorAssignmentState: {
20162
+ /** Format: uuid */
20163
+ contactId: string;
20164
+ /** @enum {string|null} */
20165
+ status: "WAITING_OPERATOR" | "IN_PROGRESS" | "WAITING_CUSTOMER" | "RESOLVED" | null;
20166
+ /** Format: date-time */
20167
+ statusUpdatedAt: string | null;
20168
+ /** Format: uuid */
20169
+ workspaceOperatorId: string | null;
20170
+ /** Format: date-time */
20171
+ assignedAt: string | null;
20172
+ operatorDisplayName: string | null;
20173
+ workflowEvidence: components["schemas"]["OperatorWorkflowEvidence"] | null;
20174
+ };
20175
+ OperatorQueueResponse: {
20176
+ data: {
20177
+ [key: string]: unknown;
20178
+ }[];
20179
+ page: number;
20180
+ limit: number;
20181
+ total: number;
20182
+ hasMore: boolean;
20183
+ };
20184
+ UpdateWorkspaceOperatorAssignment: {
20185
+ /** Format: uuid */
20186
+ workspaceOperatorId: string | null;
20187
+ /** Format: uuid */
20188
+ expectedWorkspaceOperatorId: string | null;
20189
+ /** Format: date-time */
20190
+ expectedAssignedOperatorAt: string | null;
20191
+ };
20192
+ WorkspaceOperatorAssignmentResult: {
20193
+ changed: boolean;
20194
+ assignedOperator: components["schemas"]["WorkspaceOperatorIdentity"] | null;
20195
+ /** Format: date-time */
20196
+ assignedOperatorAt: string | null;
20197
+ };
20198
+ CustomReportDefinition: {
20199
+ /** Format: uuid */
20200
+ id: string;
20201
+ name: string;
20202
+ sourceKey: string;
20203
+ section: string;
20204
+ view: string;
20205
+ filters: {
20206
+ [key: string]: unknown;
20207
+ };
20208
+ dimensionValues: string[];
20209
+ rowDimensions: string[];
20210
+ metricKeys: string[];
20211
+ /** Format: date-time */
20212
+ archivedAt?: string | null;
20213
+ /** Format: date-time */
20214
+ createdAt?: string;
20215
+ /** Format: date-time */
20216
+ updatedAt: string;
20217
+ };
20218
+ CustomReportDataResponse: {
20219
+ metricKeys: string[];
20220
+ dimensionValues: string[];
20221
+ buckets: components["schemas"]["CustomReportBucket"][];
20222
+ grandTotal: components["schemas"]["CustomReportGrandTotal"] | null;
20223
+ availableDimensionValues: string[];
20224
+ availableMetricKeys: string[];
20225
+ dimensionLabels?: {
20226
+ [key: string]: string;
20227
+ };
20228
+ rowSequenceNames?: {
20229
+ [key: string]: string;
20230
+ };
20231
+ /** @description Только personalized-funnel: безопасное расписание шага по адресу строки. Текст сообщения, условия, variable hints и вложения не возвращаются. */
20232
+ rowStepSchedules?: {
20233
+ [key: string]: components["schemas"]["CustomReportStepSchedule"];
20234
+ };
20235
+ /** Format: date-time */
20236
+ historyStartsAt?: string | null;
20237
+ nestedRows?: {
20238
+ [key: string]: unknown;
20239
+ }[];
20240
+ nestedTruncated?: boolean;
20241
+ nestedTotalRowCount?: number;
20242
+ /** Format: date-time */
20243
+ calculatedAt?: string;
20244
+ executionDbSnapshot?: string;
20245
+ currentStepsFingerprint?: string;
20246
+ /** Format: date-time */
20247
+ reportUpdatedAt?: string;
20248
+ };
20249
+ CustomReportDrilldownLink: {
20250
+ /** @description Идентификатор выдачи ссылки; для агрегированных источников может быть составным. */
20251
+ issueId: string;
20252
+ name: string;
20253
+ /** Format: uri */
20254
+ targetUrl: string;
20255
+ /** Format: date-time */
20256
+ clickedAt: string | null;
20257
+ };
20258
+ CustomReportDrilldownRow: {
20259
+ id: string;
20260
+ /** Format: uuid */
20261
+ chatUserId: string | null;
20262
+ contactName: string | null;
20263
+ contactPhone: string | null;
20264
+ /** Format: date-time */
20265
+ happenedAt: string | null;
20266
+ status: string | null;
20267
+ failedCondition: string | null;
20268
+ failedValue: string | null;
20269
+ /** Format: uri */
20270
+ getcourseUserUrl: string | null;
20271
+ /** Format: uri */
20272
+ getcourseDealUrl: string | null;
20273
+ /**
20274
+ * Format: uri
20275
+ * @description Сделка/лид в активной AmoCRM или Bitrix24.
20276
+ */
20277
+ crmUrl: string | null;
20278
+ links: components["schemas"]["CustomReportDrilldownLink"][];
20279
+ };
20280
+ CustomReportDrilldownResponse: {
20281
+ items: components["schemas"]["CustomReportDrilldownRow"][];
20282
+ total: number;
20283
+ /** @description Фактический числитель для процентной колонки. */
20284
+ resolvedMetricKey: string;
20285
+ };
20286
+ /**
20287
+ * @description Минимальная длина включительного period-окна, на котором считаются доли исходов custom-reports и карточек «Обзора». Литеральный тип механически связывает backend и frontend через сгенерированный API-контракт.
20288
+ * @enum {integer}
20289
+ */
20290
+ CustomReportOutcomeRateMinWindowDays: 21;
20291
+ /**
20292
+ * @description Канонические доли исходов, которые в period-режиме доступны только на окне не короче CustomReportOutcomeRateMinWindowDays. Исчерпывающие backend/frontend-реестры типизированы этим enum, поэтому удаление или добавление ключа только на одной стороне ломает компиляцию.
20293
+ * @enum {string}
20294
+ */
20295
+ CustomReportOutcomeRateMetric: "clickedRate" | "enteredDialogRate" | "replyRate" | "deepDialogRate" | "handedRate" | "paidRate";
20296
+ UpdateDialogScriptRequest: {
20297
+ /** @description Вводная проза §6 до первой ветки (опц.) */
20298
+ preamble?: string;
20299
+ graph: components["schemas"]["ScriptGraph"];
20300
+ };
20301
+ AgentScriptGraphResponse: {
20302
+ /** @description false если у агента нет §6 «Скрипт диалога» (пустой/legacy промпт) */
20303
+ present: boolean;
20304
+ scriptGraph: components["schemas"]["ScriptGraph"] | null;
20305
+ };
20306
+ ScriptGraph: {
20307
+ stages: components["schemas"]["ScriptStage"][];
20308
+ nodes: components["schemas"]["ScriptNode"][];
20309
+ edges: components["schemas"]["ScriptEdge"][];
20310
+ };
20311
+ ScriptStage: {
20312
+ id: string;
20313
+ name: string;
20314
+ };
20315
+ ScriptNode: {
20316
+ /** @description id узла = id ветки §6 (A, D2, …) */
20317
+ id: string;
20318
+ stageId: string;
20319
+ title: string;
20320
+ instruction: string;
20321
+ /** @description свободный лейбл состояния воронки */
20322
+ leadStateTag?: string | null;
20323
+ branchId: string;
20324
+ };
20325
+ ScriptEdge: {
20326
+ from: string;
20327
+ to: string;
20328
+ condition?: string | null;
20329
+ };
20330
+ ErrorResponse: {
20331
+ error: {
20332
+ /** @example VALIDATION_FAILED */
20333
+ code: string;
20334
+ /** @example Field "name" is required */
20335
+ message: string;
20336
+ details?: {
20337
+ [key: string]: unknown;
20338
+ };
20339
+ /** Format: uuid */
20340
+ requestId?: string;
20341
+ };
20342
+ };
20343
+ ValidationErrorResponse: components["schemas"]["ErrorResponse"] & {
20344
+ error?: {
20345
+ /**
20346
+ * @example {
20347
+ * "name": [
20348
+ * "Field is required"
20349
+ * ],
20350
+ * "email": [
20351
+ * "Invalid email format"
20352
+ * ]
20353
+ * }
20354
+ */
20355
+ fieldErrors?: {
20356
+ [key: string]: string[];
20357
+ };
20358
+ };
20359
+ };
20360
+ /** @enum {string} */
20361
+ GetCourseWaveRunState: "QUEUED" | "PENDING" | "STEP1" | "STEP2" | "COMPLETED" | "FAILED" | "CANCELLING" | "CANCELLED";
20362
+ /** @enum {string} */
20363
+ GetCourseWaveRunContactStatus: "PENDING" | "CLAIMED" | "SENT" | "SKIPPED" | "FAILED" | "UNKNOWN";
20364
+ GetCourseWaveRunContactInput: {
20365
+ /** @description GetCourse user id */
20366
+ contactId: string;
20367
+ /** @description Registration deal id для свежего пина Шага 1 */
20368
+ dealId?: string;
20369
+ transport?: components["schemas"]["GetCourseTransport"];
20370
+ dialogId?: string;
20371
+ /** Format: email */
20372
+ email?: string;
20373
+ phone?: string;
20374
+ firstName?: string;
20375
+ lastName?: string;
20376
+ /** Format: date-time */
20377
+ leadLastActiveAt?: string;
20378
+ /** Format: date-time */
20379
+ segmentEnteredAt?: string;
20380
+ };
20381
+ GetCourseWaveRunPreflightOptions: {
20382
+ /** @default true */
20383
+ enabled: boolean;
20384
+ productTitle?: string;
20385
+ productMatchKey?: string;
20386
+ offerId?: number;
20387
+ /**
20388
+ * @default warn
20389
+ * @enum {string}
20390
+ */
20391
+ otherProductActiveDealMode: "warn" | "block" | "ignore";
19086
20392
  };
19087
20393
  GetCourseWaveRunLaunchRequest: {
19088
20394
  /** Format: uuid */
@@ -19103,6 +20409,10 @@ export interface components {
19103
20409
  */
19104
20410
  launchType: "status";
19105
20411
  channels: components["schemas"]["GetCourseTransport"][];
20412
+ /**
20413
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
20414
+ * @example f11 — ДБО / NR / ВК / In Stream
20415
+ */
19106
20416
  funnel?: string;
19107
20417
  segment?: string;
19108
20418
  /** @description Явное бизнес-правило отбора; требует segment. */
@@ -19168,6 +20478,8 @@ export interface components {
19168
20478
  * @description Точный момент входа контакта в когорту (ISO 8601, зона ОБЯЗАТЕЛЬНА — …Z либо ±ЧЧ:ММ). На нём считается свежесть в «Аналитике рассылок»: возраст = время отправки минус segmentEnteredAt. Заполняется, когда предсписок собран ПРАВИЛОМ и у каждой строки есть свой момент события (например eventAt регистрации). Не передан — возраст строки остаётся неизвестным. Дату запуска сюда подставлять нельзя: она схлопнула бы месяцы когорт в одну корзину.
19169
20479
  */
19170
20480
  segmentEnteredAt?: string;
20481
+ /** @description Воронка ЭТОГО контакта (например «f11 — ДБО / NR / ВК / In Stream»). Заполняется, когда файл собран из НЕСКОЛЬКИХ воронок: одна метка на запуск заставляла писать в поле воронки когорту («reg-no-show|дбо»), и фильтр по воронке переставал отвечать на свой вопрос — по f11 он показывал ноль отправок за 30 дней при 3267 регистрациях (замер 02.09.2026). Когорта и продукт лежат в своих полях segment и productCode. Не передана — берётся воронка запуска (funnel). */
20482
+ funnel?: string;
19171
20483
  };
19172
20484
  /** @description Ровно одна аудитория — createdAfter ЛИБО contacts. */
19173
20485
  GetCourseColdWelcomePreviewRequest: {
@@ -19185,6 +20497,10 @@ export interface components {
19185
20497
  createdAfter?: string;
19186
20498
  contacts?: components["schemas"]["GetCourseColdWelcomeContact"][];
19187
20499
  channels?: components["schemas"]["GetCourseTransport"][];
20500
+ /** @description Метка сегмента запуска. Ею считается правило «этим сегментом человеку уже уходило»: без неё прогноз правил (policyForecast) по этому правилу структурно пуст, и ноль читается как «проверили, никого». Аудиторию метка не отбирает. */
20501
+ segment?: string;
20502
+ /** @description Разовый текст запуска — им считается правило «тот же текст не дважды» (журнал касаний ключуется отпечатком шаблона). Для запуска с сохранённой рассылкой не нужен: текст берётся из неё тем же резолвером, что на старте, включая посегментные тексты. */
20503
+ message?: string;
19188
20504
  /** @deprecated */
19189
20505
  channelsMode?: components["schemas"]["ColdWelcomeChannelsMode"];
19190
20506
  };
@@ -19195,6 +20511,23 @@ export interface components {
19195
20511
  */
19196
20512
  ColdWelcomeChannelsMode: "RESTRICT" | "ADD";
19197
20513
  GetCourseColdWelcomePreviewResponse: {
20514
+ /** @description ПРОГНОЗ ПРАВИЛ ОТПРАВКИ на момент запроса, а не обещание. Блокирует одна точка — пересчёт правил постранично вплотную к транспорту, и между предпросмотром и отправкой человек успевает зарегистрироваться на эфир или получить это же касание другим запуском. Причины ВЗАИМНО ИСКЛЮЧАЮТ друг друга (сервер возвращает первую сработавшую), поэтому сумма — это ЛЮДИ, а не срабатывания. Считается по МЕТКЕ и ТЕКСТУ запроса: без segment (и без message у запуска разовым текстом) соответствующие правила дают нули. */
20515
+ policyForecast?: {
20516
+ blockedBy: {
20517
+ /** @description Этим сегментом человеку уже уходило НАШЕЙ отправкой. Периметр строго наш (волна школы тем же ярлыком отправкой здесь не считается — иначе запрет накрыл бы 37 % отправок; замер прода 10.09.2026). */
20518
+ alreadySentSegment: number;
20519
+ /** @description Уже получал «Первое сообщение» — оно одноразово НА ЧЕЛОВЕКА. */
20520
+ alreadyGreeted: number;
20521
+ /** @description Идёт эпизод регистрации: приветствие ДОЛЖНЫ и не отдали либо подготовлен повторный вход на новый эфир. Считается ПО ЧЕЛОВЕКУ, без скоупа площадки. */
20522
+ activeEpisode: number;
20523
+ /** @description Тихий период: человека трогали (нашей отправкой либо шагом календарной цепочки) внутри окна. Окно резолвится настройками — перекрытие рассылки, затем площадка, затем воркспейс, затем 0. По умолчанию 0, то есть правило выключено, пока оператор его не выставит; рекомендация — 7 суток. Волна школы касанием НЕ считается. Расписания судятся своим cooldownDays. */
20524
+ cooldown: number;
20525
+ };
20526
+ /** @description Тот же ТЕКСТ уже занят в журнале касаний под ДРУГИМ ярлыком. Отдельно от blockedBy: это не правило владельца, а атомарное право — «тот же текст не дважды» держится строкой журнала, а не читающей проверкой. */
20527
+ touchClaimed: number;
20528
+ /** @description ИНФОРМАЦИЯ, а не запрет: этим же ярлыком человека рассылал ВНЕШНИЙ механизм — волна школы своими процессами либо шаблон Wazzup. Наш догон в мессенджерах уйдёт как обычно: так работает штатный процесс. В отсев это число НЕ входит. */
20529
+ externalWaveTouched: number;
20530
+ };
19198
20531
  /** @description Выбранные каналы, которых НЕТ в allowlist площадки: они не уедут ни в каком режиме. Чинится галочкой в настройках площадки, поэтому возвращаются ИМЕНАМИ, а не числом. */
19199
20532
  channelsNotAllowedByPlatform?: components["schemas"]["GetCourseTransport"][];
19200
20533
  /** @description Сколько ещё МОЖЕТ получить первое сообщение. */
@@ -19203,6 +20536,8 @@ export interface components {
19203
20536
  alreadyWelcomed: number;
19204
20537
  /** @description Всего найдено под границей. */
19205
20538
  foundContacts: number;
20539
+ /** @description Строк файла БЕЗ момента входа в сегмент (segment_entered_at). Такой контакт не попадёт ни в один период оси «вход в сегмент» на «Аналитике коммуникации» — он невидим ровно там, где спрашивают «сколько людей пришло за месяц». Предупреждение, а не запрет: у аудитории, заданной границей даты или файлом без события, момента входа нет вовсе. Считается по СЫРЫМ строкам запроса, чтобы число сходилось с файлом. */
20540
+ rowsWithoutSegmentEntry?: number;
19206
20541
  };
19207
20542
  /** @description Не больше ОДНОЙ аудитории: contacts (поимённый список) ЛИБО currentAnchorValue (когорта). Без обеих — вся площадка (все контакты с непустым якорем). */
19208
20543
  GetCourseAnchorRefreshRequest: {
@@ -19241,6 +20576,28 @@ export interface components {
19241
20576
  alreadyRunning: boolean;
19242
20577
  refreshableVariables: string[];
19243
20578
  };
20579
+ GetCourseAnchorRefreshStatusResponse: {
20580
+ correlationId: string;
20581
+ /** Format: uuid */
20582
+ platformId: string;
20583
+ /** @enum {string} */
20584
+ status: "RUNNING" | "COMPLETED" | "FAILED" | "STALLED";
20585
+ result: {
20586
+ correlationId: string;
20587
+ contactsScanned: number;
20588
+ outcomes: {
20589
+ [key: string]: number;
20590
+ };
20591
+ changedByVariable: {
20592
+ [key: string]: number;
20593
+ };
20594
+ } | null;
20595
+ error: string | null;
20596
+ /** Format: date-time */
20597
+ startedAt: string;
20598
+ /** Format: date-time */
20599
+ finishedAt: string | null;
20600
+ };
19244
20601
  /** @description Ровно один источник текста (message ЛИБО mailingVariantId) и ровно одна аудитория (createdAfter ЛИБО contacts). */
19245
20602
  GetCourseColdWelcomeLaunchRequest: {
19246
20603
  /**
@@ -19265,6 +20622,10 @@ export interface components {
19265
20622
  /** @description Метка сегмента. Аудиторию НЕ отбирает. Если у рассылки есть текст именно для этого сегмента, он выбирает текст запуска — и тогда аудитория обязана быть файловой. */
19266
20623
  segment?: string;
19267
20624
  productCode?: string;
20625
+ /**
20626
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
20627
+ * @example f11 — ДБО / NR / ВК / In Stream
20628
+ */
19268
20629
  funnel?: string;
19269
20630
  /** @description Человекочитаемое имя ЭТОГО запуска — подпись когорты в «Аналитике рассылок». Не имя рассылки и не метка сегмента: те одинаковы у всех запусков, а разрез «по запускам» строится именно по подписи. Пусто — подпись собирается из даты запуска, имени рассылки и меток, так что запуски всё равно остаются различимыми. */
19270
20631
  cohortLabel?: string;
@@ -19281,6 +20642,10 @@ export interface components {
19281
20642
  /** @description Он же выбирает текст, если у рассылки есть посегментные тексты. */
19282
20643
  segment?: string;
19283
20644
  productCode?: string;
20645
+ /**
20646
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
20647
+ * @example f11 — ДБО / NR / ВК / In Stream
20648
+ */
19284
20649
  funnel?: string;
19285
20650
  /** @description Подпись запуска ЭТОГО блока. У пакета каждый сегмент — отдельный запуск со своей задачей и когортой, поэтому подпись задаётся посегментно; общая на пакет схлопнула бы их в отчёте в одну корзину. */
19286
20651
  cohortLabel?: string;
@@ -19301,12 +20666,27 @@ export interface components {
19301
20666
  channels?: components["schemas"]["GetCourseTransport"][];
19302
20667
  /** @deprecated */
19303
20668
  channelsMode?: components["schemas"]["ColdWelcomeChannelsMode"];
20669
+ /** @description Перекрытие предохранителей на ЭТОТ пакет (аварийный обход). Ключ не передан — берётся настройка площадки. Снимок кладётся в строку durable-плана, поэтому resume после рестарта едет с тем же решением. */
20670
+ guards?: components["schemas"]["OutboundGuardModes"];
19304
20671
  };
20672
+ /** @description Предохранители холодных отправок. Не писать, пока идёт вебинарная серия человека, пока с ним работает менеджер по действующей заявке и если он уже оплатил ЭТОТ продукт. Пропуск ключа = не трогать; null = «не настраивали» (действует дефолт: activeSeries BLOCK, остальные WARN). Подробности — docs/features/outbound-guards.md. */
20673
+ OutboundGuardModes: {
20674
+ activeSeries?: components["schemas"]["OutboundGuardMode"];
20675
+ activeApplication?: components["schemas"]["OutboundGuardMode"];
20676
+ paid?: components["schemas"]["OutboundGuardMode"];
20677
+ };
20678
+ /**
20679
+ * @description OFF — правило не работает; WARN — причина пишется в аудит, отправка идёт; BLOCK — отправка останавливается.
20680
+ * @enum {string|null}
20681
+ */
20682
+ OutboundGuardMode: "OFF" | "WARN" | "BLOCK" | null;
19305
20683
  GetCourseColdWelcomeBatchResponse: {
19306
20684
  /** Format: uuid */
19307
20685
  batchId: string;
19308
20686
  /** @description Сколько сегментов поставлено в очередь */
19309
20687
  segments: number;
20688
+ /** @description Строк файла БЕЗ момента входа в сегмент (segment_entered_at). Такой контакт не попадёт ни в один период оси «вход в сегмент» на «Аналитике коммуникации» — он невидим ровно там, где спрашивают «сколько людей пришло за месяц». Предупреждение, а не запрет: у аудитории, заданной границей даты или файлом без события, момента входа нет вовсе. Считается по СЫРЫМ строкам запроса, чтобы число сходилось с файлом. */
20689
+ rowsWithoutSegmentEntry?: number;
19310
20690
  };
19311
20691
  GetCourseColdWelcomeBatchSegmentStatus: {
19312
20692
  position: number;
@@ -19389,6 +20769,10 @@ export interface components {
19389
20769
  outcomes?: {
19390
20770
  [key: string]: number;
19391
20771
  } | null;
20772
+ /** @description Сколько контактов каждого исхода разбирается ПОИМЁННО — по построчному следу отсева. Ключи те же, что в outcomes, но только у неотправленных: у SENT след это строка реестра получателей. Числа исходов остаются в outcomes (агрегат полон за всю историю), а след начинается с 02.09.2026, поэтому у прежних запусков здесь пусто — витрина по этому полю решает, открывать ли список. Null у волны и у прогона расписания: у них свои носители. */
20773
+ tracedOutcomes?: {
20774
+ [key: string]: number;
20775
+ } | null;
19392
20776
  /** @description Сколько отправок ушло ВСЛЕПУЮ: канал взят резервным транспортом площадки, а не доказан привязками контакта или его ответом. Это ПОДМНОЖЕСТВО sentCount, а не отдельный исход — сообщение ушло. Без него «доставлено в мессенджер» и «упало в личный кабинет сайта» в истории неразличимы. null — у волн (отправляет процесс школы) и у запусков до появления счётчика; это НЕ то же, что 0. */
19393
20777
  sentWithoutChannelEvidence?: number | null;
19394
20778
  /** Format: date-time */
@@ -19471,6 +20855,10 @@ export interface components {
19471
20855
  */
19472
20856
  launchType: "status";
19473
20857
  channels: components["schemas"]["GetCourseTransport"][];
20858
+ /**
20859
+ * @description Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN обязателен. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо» сюда класть нельзя — тип отбора идёт в segment, продукт в productCode, подпись запуска в cohortLabel. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики.
20860
+ * @example f11 — ДБО / NR / ВК / In Stream
20861
+ */
19474
20862
  funnel?: string;
19475
20863
  segment?: string;
19476
20864
  /** @description Явное бизнес-правило отбора; требует segment. */
@@ -19582,6 +20970,32 @@ export interface components {
19582
20970
  } & {
19583
20971
  [key: string]: unknown;
19584
20972
  };
20973
+ TriggerActionCatalogItem: {
20974
+ actionType: string;
20975
+ title: string;
20976
+ configInputKey: string | null;
20977
+ responseRelation: string | null;
20978
+ configRequired: boolean;
20979
+ /** @enum {string} */
20980
+ requiredScope: "mcp:platform-setup";
20981
+ requiredRelations: string[];
20982
+ effect: string;
20983
+ verification: string;
20984
+ actionSchema: {
20985
+ [key: string]: unknown;
20986
+ };
20987
+ minimalExample: {
20988
+ [key: string]: unknown;
20989
+ };
20990
+ };
20991
+ TriggerActionCatalogResponse: {
20992
+ /** @enum {string} */
20993
+ source: "CreateTriggerActionDto+TRIGGER_ACTION_CONFIG";
20994
+ /** @enum {boolean} */
20995
+ complete: true;
20996
+ total: number;
20997
+ items: components["schemas"]["TriggerActionCatalogItem"][];
20998
+ };
19585
20999
  ConfirmableSetupMutation: {
19586
21000
  explicitConfirmation?: boolean;
19587
21001
  confirmationReason?: string;
@@ -19977,6 +21391,14 @@ export interface components {
19977
21391
  comparableSent: number;
19978
21392
  /** @description Ответили в пределах равного горизонта */
19979
21393
  horizonReplied: number;
21394
+ /**
21395
+ * @description Отреагировали ХОТЬ КАК-ТО в том же горизонте: ответили ИЛИ перешли по ссылке
21396
+ * этого касания. Всегда >= horizonReplied, разность — те, кто НЕ ответил, но кликнул.
21397
+ * ⚠️ Складывать horizonReplied и linkClicked вместо этого нельзя: ответивший часто
21398
+ * ещё и кликает, и сумма задваивала бы его. Знаменатель тот же (comparableSent),
21399
+ * включая касания без ссылки: это доля отреагировавших на касание, а не CTR ссылки.
21400
+ */
21401
+ horizonEngaged: number;
19980
21402
  /** @description Прервано чужим касанием до конца горизонта */
19981
21403
  censored: number;
19982
21404
  /** @description Доля вырезанных от СОЗРЕВШЕГО пула (comparableSent + censored) */
@@ -20172,6 +21594,34 @@ export interface components {
20172
21594
  } | null;
20173
21595
  replyToStoryMentions?: boolean;
20174
21596
  };
21597
+ funnelAnalytics?: {
21598
+ /** @description Тройка стадий «отправлено → одобрено | отклонено» (у Aslzar — скоринг рассрочки). null — сбросить ворота: блок перестаёт рисоваться. */
21599
+ decisionGate?: {
21600
+ submitted: {
21601
+ pipelineCrmId: string;
21602
+ pipelineId: number;
21603
+ statusId: number;
21604
+ };
21605
+ approved: {
21606
+ pipelineCrmId: string;
21607
+ pipelineId: number;
21608
+ statusId: number;
21609
+ };
21610
+ rejected: {
21611
+ pipelineCrmId: string;
21612
+ pipelineId: number;
21613
+ statusId: number;
21614
+ };
21615
+ } | null;
21616
+ /** @description Целевая стадия карточки «Путь до стадии». null — сбросить выбор. */
21617
+ pathTargetStage?: {
21618
+ pipelineCrmId: string;
21619
+ pipelineId: number;
21620
+ statusId: number;
21621
+ } | null;
21622
+ engagedInboundCount?: number | null;
21623
+ stuckThresholdHours?: number | null;
21624
+ };
20175
21625
  /** @description Closes Phase B gap для name/offMessage/timezone/isActive. Any channel type. */
20176
21626
  generalSettings?: {
20177
21627
  name?: string | null;
@@ -20226,6 +21676,11 @@ export interface components {
20226
21676
  channels?: components["schemas"]["GetCourseWaveFieldBinding"];
20227
21677
  } | null;
20228
21678
  deliveryCheckEnabled?: boolean;
21679
+ guardActiveSeries?: components["schemas"]["OutboundGuardMode"];
21680
+ guardActiveApplication?: components["schemas"]["OutboundGuardMode"];
21681
+ guardPaid?: components["schemas"]["OutboundGuardMode"];
21682
+ /** @description Quiet period in days after ANY touch OF OURS (a send or a calendar-chain follow-up step). Counted PER PERSON across the workspace; a school wave does NOT count as a touch (measured: the wide perimeter would have blocked 15.3% of our sends). null = not configured, effective value 0 (rule disabled); the owner recommends 7. Schedules are NOT judged by this number — they have their own cooldownDays. */
21683
+ quietDays?: number | null;
20229
21684
  /** @description Transport → exact deal custom field NAME (read API returns no field ids). Clear with {}. */
20230
21685
  deliveryFieldMap?: {
20231
21686
  [key: string]: string;
@@ -20411,6 +21866,50 @@ export interface components {
20411
21866
  suggestedNextPhase: "1" | "2" | "3" | "4" | "5" | "6" | null;
20412
21867
  };
20413
21868
  };
21869
+ WorkspaceNavigationRequest: {
21870
+ /** @enum {string} */
21871
+ intent: "CREATE_BOT" | "IMPROVE_AGENT" | "DIAGNOSE_CONTACT" | "AUDIT_DIALOGUES" | "CAMPAIGN_REPORT" | "CONNECT_CRM" | "CONNECT_DATASOURCE" | "CONFIGURE_FOLLOWUP" | "CONTINUE_TASK" | "FREEFORM";
21872
+ /** @enum {string} */
21873
+ botType?: "FAQ" | "SALES" | "BOOKING" | "OUTBOUND" | "SUPPORT" | "UNKNOWN";
21874
+ /** Format: uuid */
21875
+ platformId?: string;
21876
+ /** Format: uuid */
21877
+ agentId?: string;
21878
+ /** Format: uuid */
21879
+ contactId?: string;
21880
+ /** Format: uuid */
21881
+ taskId?: string;
21882
+ question?: string;
21883
+ };
21884
+ WorkspaceNavigationResponse: {
21885
+ objective: string;
21886
+ intent: components["schemas"]["WorkspaceNavigationRequest"]["intent"];
21887
+ /** @enum {string|null} */
21888
+ botType: "FAQ" | "SALES" | "BOOKING" | "OUTBOUND" | "SUPPORT" | "UNKNOWN" | null;
21889
+ selectedObjects: {
21890
+ type: string;
21891
+ id: string;
21892
+ label: string | null;
21893
+ }[];
21894
+ completed: string[];
21895
+ missing: string[];
21896
+ requiredUserInput: {
21897
+ field: string;
21898
+ reason: string;
21899
+ options?: string[];
21900
+ }[];
21901
+ next: {
21902
+ tool: string;
21903
+ arguments: {
21904
+ [key: string]: unknown;
21905
+ };
21906
+ reason: string;
21907
+ verifyWith: string;
21908
+ } | null;
21909
+ finishCondition: string;
21910
+ /** @enum {string} */
21911
+ evidenceSource: "live_workspace_overview";
21912
+ };
20414
21913
  CreateSetupSessionRequest: {
20415
21914
  /** Format: uuid */
20416
21915
  workspaceId: string;
@@ -20809,6 +22308,8 @@ export interface components {
20809
22308
  writtenAt?: string;
20810
22309
  };
20811
22310
  StartSandboxRunRequest: {
22311
+ /** @description Неактивированный системный промпт для изолированной проверки. Допустим только при options.mode=single_agent, действует лишь внутри sandbox run и не меняет production AgentChat или PromptVersion. */
22312
+ candidatePrompt?: string;
20812
22313
  /** @description Test scenarios to run (default — all linked to agent's ICP) */
20813
22314
  scenarioIds?: string[];
20814
22315
  options?: {
@@ -20925,6 +22426,20 @@ export interface components {
20925
22426
  pipelineTransitionsLog?: Record<string, never>[];
20926
22427
  toolCallLog?: Record<string, never>[];
20927
22428
  ragTestResults?: Record<string, never>[];
22429
+ /** @description Рубрика прогона: `TestScenario.situations` сценариев этого прогона, как их написал автор. Строки role=agent — ОЖИДАЕМОЕ поведение агента; рантайм их не исполняет (`extractTurns` берёт только role=client/user), и `passRate` их не измеряет — он считает лишь долю turn-ов с непустым ответом. Заполняется только на findings-instructions (`/sandbox/runs/{runId}/findings/instructions`); `GET /sandbox-runs/{runId}` поле не отдаёт. Отсутствие поля = «рубрика не читалась», пустой `situations` = «у сценария нет реплик». Сценария, удалённого после прогона, здесь нет вовсе — хотя в `perScenarioMetrics` он остаётся. */
22430
+ scenarioExpectations?: {
22431
+ /** Format: uuid */
22432
+ scenarioId: string;
22433
+ scenarioName?: string;
22434
+ /** @description Что именно проверяет сценарий — часть рубрики, а не подпись. */
22435
+ description?: string | null;
22436
+ /** @description Реплики в исходном порядке (role=client — вход, role=agent — ожидание). Порядок и есть привязка ожидания к turn-у: индекс транскрипта смещается при OUTBOUND-seeding, поэтому готового номера turn-а здесь нет намеренно. */
22437
+ situations: {
22438
+ /** @enum {string} */
22439
+ role?: "client" | "agent";
22440
+ text?: string;
22441
+ }[];
22442
+ }[];
20928
22443
  };
20929
22444
  /** @description A single router decision recorded for one turn of a sandbox run. */
20930
22445
  SandboxRoutingLogEntry: {
@@ -21459,8 +22974,65 @@ export interface components {
21459
22974
  PatchDraftOperationsRequest: {
21460
22975
  operations: components["schemas"]["PromptPatchOperation"][];
21461
22976
  };
22977
+ /**
22978
+ * @description Черновик БЕЗ `currentContent` и без истории `operations[]`.
22979
+ *
22980
+ * Полный текст отдают `POST /prompt/drafts` (первое чтение промпта) и
22981
+ * `GET /prompt/drafts/{draftId}` (перечитать по требованию). Эхо текста в ответе
22982
+ * КАЖДОГО `_apply`/`_commit` — накладные расходы: клиент уже прочитал промпт на
22983
+ * старте, а история операций повторяет то, что он сам же и отправил.
22984
+ */
22985
+ PromptDraftMeta: {
22986
+ /** Format: uuid */
22987
+ id: string;
22988
+ /** Format: uuid */
22989
+ agentId: string;
22990
+ status: components["schemas"]["PromptDraftStatus"];
22991
+ /** Format: uuid */
22992
+ baseVersionId: string;
22993
+ baseContentHash: string;
22994
+ /** Format: uuid */
22995
+ committedVersionId?: string | null;
22996
+ /**
22997
+ * @description Длина `currentContent`. Сверяется с остатком `GET /prompt/headroom`
22998
+ * без чтения самого текста.
22999
+ */
23000
+ characters: number;
23001
+ /** @description Сколько patch-операций накоплено черновиком за всю жизнь. */
23002
+ operationsCount: number;
23003
+ /** Format: date-time */
23004
+ expiresAt: string;
23005
+ /** Format: date-time */
23006
+ updatedAt: string;
23007
+ };
23008
+ /** @description Построчная разница состояния черновика ДО и ПОСЛЕ применённых операций. */
23009
+ PromptPatchDiff: {
23010
+ /**
23011
+ * @description Текст черновика реально изменился.
23012
+ *
23013
+ * Отдельный признак обязателен: `removedLines`/`addedLines` — multiset-разность
23014
+ * строк, и `move_text_after_text` (как и правка одних пробелов) даёт ПУСТОЙ дифф
23015
+ * при изменившемся тексте. Без этого поля пустые списки читались бы как
23016
+ * «ничего не применилось».
23017
+ */
23018
+ contentChanged: boolean;
23019
+ /**
23020
+ * @description Насколько вырос (отрицательное — сжался) черновик, в символах.
23021
+ * Абсолютная длина — `draft.characters`, чтобы одно число не жило в двух полях.
23022
+ */
23023
+ charactersDelta: number;
23024
+ /** @description Строки, исчезнувшие из черновика. */
23025
+ removedLines: components["schemas"]["PromptDiffLine"][];
23026
+ /** @description Строки, появившиеся в черновике. */
23027
+ addedLines: components["schemas"]["PromptDiffLine"][];
23028
+ /**
23029
+ * @description Списки обрезаны по потолку строк на сторону (`PROMPT_PATCH_DIFF_MAX_LINES`).
23030
+ * Полный текст читать через `GET /prompt/drafts/{draftId}`.
23031
+ */
23032
+ truncated: boolean;
23033
+ };
21462
23034
  PromptDraftPatchResponse: {
21463
- draft: components["schemas"]["PromptDraft"];
23035
+ draft: components["schemas"]["PromptDraftMeta"];
21464
23036
  /** @description Сколько ops успешно применились */
21465
23037
  appliedCount: number;
21466
23038
  /**
@@ -21468,15 +23040,23 @@ export interface components {
21468
23040
  * Клиент должен показать warning если > 0.
21469
23041
  */
21470
23042
  skippedCount: number;
23043
+ diff: components["schemas"]["PromptPatchDiff"];
21471
23044
  };
21472
23045
  PromptDraftCommitResponse: {
21473
- draft: components["schemas"]["PromptDraft"];
23046
+ draft: components["schemas"]["PromptDraftMeta"];
23047
+ /**
23048
+ * @description Только адресация новой версии. `content` намеренно НЕ отдаётся: это была бы
23049
+ * вторая копия текста, который клиент сам и собрал.
23050
+ */
21474
23051
  newVersion: {
21475
23052
  /** Format: uuid */
21476
23053
  id: string;
21477
- /** @description 0 если synthesized из 410-retry path */
21478
- version?: number;
21479
- content: string;
23054
+ /**
23055
+ * @description `null` — идемпотентный повтор commit'а (draft уже был COMMITTED): номер версии
23056
+ * на этом пути неизвестен, черновик его не несёт. Внутренний сентинел `-1` наружу
23057
+ * НЕ выпускается: в JSON он неотличим от настоящего номера версии.
23058
+ */
23059
+ version: number | null;
21480
23060
  };
21481
23061
  };
21482
23062
  /** @enum {string} */
@@ -21530,15 +23110,21 @@ export interface components {
21530
23110
  callbackUrl?: string;
21531
23111
  sourceChannel?: string;
21532
23112
  };
21533
- ProvisionedExternalApiChannel: {
23113
+ IssuedCredentialReveal: {
23114
+ /** @description Одноразовая ссылка для вошедшего человека */
23115
+ revealUrl: string;
23116
+ /** Format: date-time */
23117
+ revealExpiresAt: string;
23118
+ };
23119
+ ExternalApiChannelCreated: {
21534
23120
  /** Format: uuid */
21535
23121
  channelId: string;
21536
- /** @description Bearer-ключ партнёра для входящих (показывается ОДИН раз) */
21537
- apiKey: string;
21538
- /** @description Секрет HMAC-подписи колбэков (показывается ОДИН раз) */
21539
- webhookSecret: string;
21540
23122
  /** @description Путь приёма входящих: /api/v2/channels/{channelId}/messages */
21541
23123
  ingestPath: string;
23124
+ /** @description Одноразовая ссылка для вошедшего человека */
23125
+ revealUrl: string;
23126
+ /** Format: date-time */
23127
+ revealExpiresAt: string;
21542
23128
  };
21543
23129
  /** @enum {string} */
21544
23130
  CallDirection: "Inbound" | "Outbound";
@@ -21762,9 +23348,11 @@ export interface components {
21762
23348
  [key: string]: unknown;
21763
23349
  } | null;
21764
23350
  /** @enum {string|null} */
21765
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
23351
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
21766
23352
  llmModel?: string | null;
21767
23353
  /** @enum {string|null} */
23354
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
23355
+ /** @enum {string|null} */
21768
23356
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai" | null;
21769
23357
  realtimeModel?: string | null;
21770
23358
  realtimeVoice?: string | null;
@@ -21785,10 +23373,8 @@ export interface components {
21785
23373
  fillerStatus?: string | null;
21786
23374
  vadProvider?: string | null;
21787
23375
  turnDetector?: string | null;
21788
- /** @description Ручки turn-taking/barge-in (A2): interruption/endpointing (мс) + vad (мс) */
21789
- turnTakingConfig?: {
21790
- [key: string]: unknown;
21791
- } | null;
23376
+ /** @description Typed ручки turn-taking/barge-in (A2) */
23377
+ turnTakingConfig?: components["schemas"]["VoiceProfileTurnTakingConfig"] | null;
21792
23378
  sentimentAnalysisEnabled: boolean;
21793
23379
  ttsFailoverEnabled: boolean;
21794
23380
  recordingCopyEnabled: boolean;
@@ -22363,6 +23949,11 @@ export interface components {
22363
23949
  /** @description Ручки turn-taking/barge-in (A2): typed-схема входа (незнакомые ключи отвергаются, диапазоны зеркалят клампы воркера). Время — мс. */
22364
23950
  VoiceProfileTurnTakingConfig: {
22365
23951
  allowInterruptions?: boolean;
23952
+ /**
23953
+ * @description CASCADE: adaptive требует STT с aligned transcript и LiveKit Cloud/dev runtime; внешний production worker использует VAD. REALTIME использует нативный turn detection
23954
+ * @enum {string}
23955
+ */
23956
+ interruptionMode?: "vad" | "adaptive";
22366
23957
  minInterruptionDuration?: number;
22367
23958
  minInterruptionWords?: number;
22368
23959
  minEndpointingDelay?: number;
@@ -22411,8 +24002,10 @@ export interface components {
22411
24002
  ttsPronunciationCaseSensitive?: boolean;
22412
24003
  ttsProviderSettings?: components["schemas"]["VoiceProfileTtsProviderSettings"];
22413
24004
  /** @enum {string} */
22414
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras";
24005
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras";
22415
24006
  llmModel?: string;
24007
+ /** @enum {string|null} */
24008
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
22416
24009
  /** @enum {string} */
22417
24010
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai";
22418
24011
  realtimeModel?: string;
@@ -22500,9 +24093,11 @@ export interface components {
22500
24093
  [key: string]: unknown;
22501
24094
  } | null;
22502
24095
  /** @enum {string|null} */
22503
- llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
24096
+ llmProvider?: "openai" | "yandex-gpt" | "deepseek" | "groq" | "openrouter" | "xai" | "zai" | "moonshot" | "alibaba" | "anthropic" | "cerebras" | null;
22504
24097
  llmModel?: string | null;
22505
24098
  /** @enum {string|null} */
24099
+ llmReasoningEffort?: "none" | "low" | "medium" | "high" | null;
24100
+ /** @enum {string|null} */
22506
24101
  realtimeProvider?: "openai" | "yandex" | "google" | "phonic" | "xai" | null;
22507
24102
  realtimeModel?: string | null;
22508
24103
  realtimeVoice?: string | null;
@@ -22524,10 +24119,8 @@ export interface components {
22524
24119
  telephonyFilterEnabled: boolean;
22525
24120
  vadProvider?: string | null;
22526
24121
  turnDetector?: string | null;
22527
- /** @description Ручки turn-taking/barge-in (A2): interruption/endpointing (мс) + vad (мс) */
22528
- turnTakingConfig?: {
22529
- [key: string]: unknown;
22530
- } | null;
24122
+ /** @description Typed ручки turn-taking/barge-in (A2) */
24123
+ turnTakingConfig?: components["schemas"]["VoiceProfileTurnTakingConfig"] | null;
22531
24124
  /** @description Сентимент-анализ user-реплик (A1) */
22532
24125
  sentimentAnalysisEnabled: boolean;
22533
24126
  /** @description false (дефолт) — отказ TTS завершает звонок, голос не подменяется */
@@ -22681,6 +24274,8 @@ export interface components {
22681
24274
  /** Format: uuid */
22682
24275
  platformId?: string;
22683
24276
  inputTokens?: number;
24277
+ /** @description Часть inputTokens, прочитанная из provider prompt cache */
24278
+ cacheReadTokens?: number;
22684
24279
  outputTokens?: number;
22685
24280
  totalTokens?: number;
22686
24281
  inputAudioSeconds?: number;
@@ -22964,6 +24559,23 @@ export interface components {
22964
24559
  checkerEnabled?: boolean;
22965
24560
  errorReasons?: string[];
22966
24561
  };
24562
+ GetCourseContactImportStatusResponse: {
24563
+ /** Format: uuid */
24564
+ id: string;
24565
+ /** Format: uuid */
24566
+ workspaceId: string;
24567
+ /** @enum {string} */
24568
+ status: "RUNNING" | "COMPLETED" | "PARTIAL" | "FAILED";
24569
+ totalRows: number;
24570
+ processedRows: number;
24571
+ successCount: number;
24572
+ failedCount: number;
24573
+ errorReasons: string[];
24574
+ /** Format: date-time */
24575
+ createdAt: string;
24576
+ /** Format: date-time */
24577
+ completedAt: string | null;
24578
+ };
22967
24579
  ContactExportRequest: {
22968
24580
  /** Format: uuid */
22969
24581
  workspaceId?: string;
@@ -23062,7 +24674,7 @@ export interface components {
23062
24674
  isBotActive?: boolean;
23063
24675
  isFollowUpActive?: boolean;
23064
24676
  /** @enum {string|null} */
23065
- lastWorkLogEvent?: "START" | "IN_PROCESS" | "FINISH_WIN" | "FINISH_LOST" | "FAILED" | "OPERATOR_TAKEOVER" | "FINISH_AUTO" | null;
24677
+ lastWorkLogEvent?: "START" | "IN_PROCESS" | "FINISH_WIN" | "FINISH_LOST" | "FAILED" | "OPERATOR_TAKEOVER" | "FINISH_AUTO" | "FINISH_RESOLVED" | null;
23066
24678
  /**
23067
24679
  * Format: date-time
23068
24680
  * @description Время последней отправки волны/рассылки этому контакту (BroadcastRecipient.receivedAt). Опорная точка атрибуции: от неё считается «сколько прошло до ответа клиента и до оплаты». null — контакт в волны не попадал.
@@ -23209,6 +24821,8 @@ export interface components {
23209
24821
  defaultPlatformId: string | null;
23210
24822
  defaultChannels: string[];
23211
24823
  defaultDealFields: Record<string, never> | null;
24824
+ /** @description Quiet-period override for this mailing, in days. 0 means "this text may be sent inside the quiet period" — that IS the permission. null means the mailing does not override; the platform setting applies, then the workspace one, then 0. */
24825
+ quietDaysOverride: number | null;
23212
24826
  };
23213
24827
  CreateBroadcastMailingVariantRequest: {
23214
24828
  name: string;
@@ -23225,6 +24839,8 @@ export interface components {
23225
24839
  defaultPlatformId?: string | null;
23226
24840
  defaultChannels?: string[];
23227
24841
  defaultDealFields?: Record<string, never> | null;
24842
+ /** @description Quiet-period override for this mailing, in days. 0 means "this text may be sent inside the quiet period" — that IS the permission. null means the mailing does not override; the platform setting applies, then the workspace one, then 0. */
24843
+ quietDaysOverride?: number | null;
23228
24844
  };
23229
24845
  UpdateBroadcastMailingVariantRequest: {
23230
24846
  name?: string;
@@ -23242,6 +24858,8 @@ export interface components {
23242
24858
  defaultPlatformId?: string | null;
23243
24859
  defaultChannels?: string[];
23244
24860
  defaultDealFields?: Record<string, never> | null;
24861
+ /** @description Quiet-period override for this mailing, in days. 0 means "this text may be sent inside the quiet period" — that IS the permission. null means the mailing does not override; the platform setting applies, then the workspace one, then 0. */
24862
+ quietDaysOverride?: number | null;
23245
24863
  };
23246
24864
  WorkspaceLinkDomain: {
23247
24865
  /**
@@ -23352,6 +24970,18 @@ export interface components {
23352
24970
  paid: number;
23353
24971
  paidAmount: number;
23354
24972
  };
24973
+ TrackedLinkReachBreakdown: {
24974
+ platformId: string | null;
24975
+ platformName: string | null;
24976
+ /** @description Площадка удалена. Отдельный признак, а не пустое имя: Platform.name nullable, и живая безымянная площадка существует. */
24977
+ platformDeleted: boolean;
24978
+ agentId: string | null;
24979
+ agentName: string | null;
24980
+ /** @description Агент удалён; выдачи и клики сохранены */
24981
+ agentDeleted: boolean;
24982
+ issued: number;
24983
+ clicked: number;
24984
+ };
23355
24985
  TrackedLinkClickEvents: {
23356
24986
  items: components["schemas"]["TrackedLinkClickEvent"][];
23357
24987
  total: number;
@@ -23404,11 +25034,82 @@ export interface components {
23404
25034
  data: components["schemas"]["BroadcastMetricRow"][];
23405
25035
  /** @description Итоги без channel-unnest; использовать для общей цифры вместо суммы data по каналам. */
23406
25036
  totals: components["schemas"]["BroadcastMetricRow"][];
25037
+ /** @description Разрез по площадкам за ВЕСЬ период (без дней). Считается третьим набором тех же GROUPING SETS, что и totals, поэтому сходится с ними по построению. Дней тут нет намеренно: sent/received client-distinct и по дням не аддитивны. Ручная историческая статистика не входит — площадки у неё нет. */
25038
+ platformTotals?: components["schemas"]["BroadcastPlatformTotal"][];
23407
25039
  channels: string[];
23408
25040
  funnels: string[];
23409
25041
  segments: string[];
23410
25042
  products: string[];
23411
25043
  };
25044
+ BroadcastPlatformTotal: {
25045
+ /**
25046
+ * Format: uuid
25047
+ * @description ID площадки рассылки; null — у строки площадка не проставлена.
25048
+ */
25049
+ platformId: string | null;
25050
+ /** @description Воронка волны. Разрез несёт её, потому что страница фильтрует воронки клиентски. */
25051
+ funnel: string | null;
25052
+ sent: number;
25053
+ received: number;
25054
+ enteredDialog: number;
25055
+ handedOff: number;
25056
+ paid: number;
25057
+ paidAmount: number;
25058
+ };
25059
+ BroadcastUniqueContacts: {
25060
+ /**
25061
+ * @description Уникальных контактов (DISTINCT chat_user_id) в периметре «Отправлено». НЕ аддитивно —
25062
+ * сумма по группам больше правды (замер 26.08.2026: по дням +43 %, по сегментам +27 %).
25063
+ */
25064
+ uniqueContacts: number;
25065
+ /**
25066
+ * @description Только при view=entry. Сколько строк за тот же период было ОТПРАВЛЕНО и сколько из них
25067
+ * не имеет даты входа в сегмент — эти строки не попадают ни в один период режима.
25068
+ * Отсутствие поля означает «вопрос не задавался», а не «все даты известны».
25069
+ */
25070
+ entryCoverage?: {
25071
+ sentRows: number;
25072
+ rowsWithoutEntry: number;
25073
+ };
25074
+ };
25075
+ BroadcastPerPersonMetrics: {
25076
+ /**
25077
+ * @description Уникальные контакты, которым отправляли.
25078
+ * @example 32737
25079
+ */
25080
+ sent: number;
25081
+ /**
25082
+ * @description Уникальные контакты с засчитанной доставкой.
25083
+ * @example 29825
25084
+ */
25085
+ received: number;
25086
+ /**
25087
+ * @description Уникальные контакты, вступившие в диалог.
25088
+ * @example 4430
25089
+ */
25090
+ enteredDialog: number;
25091
+ /** @description Уникальные контакты с глубоким диалогом. */
25092
+ deepDialog: number;
25093
+ /** @description Уникальные контакты с выданной отслеживаемой ссылкой. */
25094
+ linkIssued: number;
25095
+ /** @description Уникальные контакты, кликнувшие по отслеживаемой ссылке. */
25096
+ clicked: number;
25097
+ /** @description Уникальные контакты, переданные менеджеру. */
25098
+ handedOff: number;
25099
+ /** @description Уникальные контакты с выставленным счётом. */
25100
+ issued: number;
25101
+ /**
25102
+ * @description Уникальные контакты с прямой оплатой.
25103
+ * @example 71
25104
+ */
25105
+ paid: number;
25106
+ /** @description Уникальные контакты с оплатой, подтверждённой оператором. */
25107
+ confirmedByOperator: number;
25108
+ /** @description Уникальные контакты с косвенной оплатой. */
25109
+ indirect: number;
25110
+ /** @description Уникальные контакты с возможной оплатой, ожидающей решения. */
25111
+ potential: number;
25112
+ };
23412
25113
  BroadcastSegmentCatalogItem: {
23413
25114
  /** Format: uuid */
23414
25115
  id: string;
@@ -23459,7 +25160,9 @@ export interface components {
23459
25160
  indirect: number;
23460
25161
  indirectAmount: number;
23461
25162
  notSent: {
23462
- total: number;
25163
+ /** @description Всего не отправлено по этой волне. null — «не выяснено», а НЕ ноль: активен фильтр по измерению (воронка/сегмент/продукт), а снимок волны его не несёт — волна охватила несколько воронок. Отсев принадлежит ВОЛНЕ, у отсеянного своей воронки нет (он отсеян до отправки), поэтому какой воронке достался этот отсев — неизвестно. Ноль означал бы «никого не отсеяли», а полное число волны — цифру, за которой откроется пустой список. */
25164
+ total: number | null;
25165
+ /** @description Пусто, когда total = null. */
23463
25166
  byReason: {
23464
25167
  [key: string]: number;
23465
25168
  };
@@ -23469,8 +25172,16 @@ export interface components {
23469
25172
  items: components["schemas"]["BroadcastCohortRow"][];
23470
25173
  };
23471
25174
  BroadcastSkipReason: {
25175
+ /** @description Код причины из словаря СВОЕГО источника: у preflight это GetCourseWavePreflightReason, у наших отправок — ColdWelcomeOutcome и собственные исходы прогона. Словари не пересекаются, подпись ищется по source. */
23472
25176
  reason: string;
25177
+ /**
25178
+ * @description Чем отсеян: preflight — проверка волны школы, ownSend — ручная холодная отправка, schedule — авторассылка.
25179
+ * @enum {string}
25180
+ */
25181
+ source: "preflight" | "ownSend" | "schedule";
23473
25182
  count: number;
25183
+ /** @description Сколько из count разбирается ПОИМЁННО. Есть только у ownSend: его число — агрегат задачи (полон за всю историю), а построчный след начинается с выкатки, поэтому у старых запусков он законно 0. Витрина открывает список только там, где значение больше нуля, и подписывает «поимённо N из M», когда след неполон. У preflight и schedule поля нет: у них само число и есть сумма построчных строк. */
25184
+ tracedCount?: number;
23474
25185
  };
23475
25186
  BroadcastSkipDayProduct: {
23476
25187
  /** Format: date */
@@ -23483,6 +25194,8 @@ export interface components {
23483
25194
  total: number;
23484
25195
  failedDelivery: number;
23485
25196
  byDayProduct: components["schemas"]["BroadcastSkipDayProduct"][];
25197
+ /** @description Отсев волн, который выбранный фильтр по измерению не относит ни к одному своему значению: волна охватила несколько воронок/сегментов/продуктов, и снимок оставил ось пустой. Отсев принадлежит ВОЛНЕ — у отсеянного контакта своей воронки нет, он отсеян до отправки и строки реестра не имеет. Показывать обязательно: у Ксаматы за август 2026 таких 7157 из 9674, то есть разрез по воронкам покрывает лишь четверть отсева. 0 — фильтра по измерению нет либо распределено всё. */
25198
+ unattributed: number;
23486
25199
  };
23487
25200
  BroadcastRecipientItem: {
23488
25201
  /** Format: uuid */
@@ -23737,7 +25450,7 @@ export interface components {
23737
25450
  /** @enum {string} */
23738
25451
  PaymentCandidateStatus: "PENDING" | "CONFIRMED" | "CONFIRMED_INDIRECT" | "REJECTED";
23739
25452
  /**
23740
- * @description Корзина доказательности возможной оплаты — чем подтверждается участие агента в окне «отправка волны → оплата». DEEP_DIALOG: 3+ реплики клиента и ответы агента. SHORT_DIALOG: 1–2 реплики и ответы агента. NO_AGENT_REPLY: клиент писал, доставленного ответа AI-агента не зафиксировано. SILENT: клиент не отвечал. UNKNOWN: сигналы ещё не посчитаны.
25453
+ * @description Корзина доказательности возможной оплаты — чем подтверждается участие агента в окне «отправка волны → оплата». DEEP_DIALOG: 3+ реплики клиента и минимум два доставленных ответа AI-агента именно на реплику клиента. SHORT_DIALOG: клиент писал и агент отвечал на реплику, но порог глубокого диалога не достигнут. NO_AGENT_REPLY: клиент писал, доставленного ответа AI-агента на его реплику не зафиксировано. SILENT: клиент не отвечал. UNKNOWN: сигналы ещё не посчитаны.
23741
25454
  * @enum {string}
23742
25455
  */
23743
25456
  PaymentEvidenceBucket: "DEEP_DIALOG" | "SHORT_DIALOG" | "NO_AGENT_REPLY" | "SILENT" | "UNKNOWN";
@@ -23949,6 +25662,7 @@ export interface components {
23949
25662
  clientRepliedBeforePayment: boolean | null;
23950
25663
  dialogueInboundCount: number | null;
23951
25664
  dialogueAgentReplyCount: number | null;
25665
+ dialogueAgentResponsiveCount: number | null;
23952
25666
  dialogueOperatorMessageCount: number | null;
23953
25667
  dialogueOtherOutgoingCount: number | null;
23954
25668
  evidenceBucket: components["schemas"]["PaymentEvidenceBucket"];
@@ -24182,6 +25896,24 @@ export interface components {
24182
25896
  /** Format: date-time */
24183
25897
  created_at: string;
24184
25898
  };
25899
+ AmoCrmChannelRegistrationResponse: {
25900
+ /**
25901
+ * @description Адрес вебхука канала для этого воркспейса (пункт 2 письма)
25902
+ * @example https://core.besales.ai/api/webhook/amocrm/055a9626-548b-42bd-8132-afb17925f168
25903
+ */
25904
+ webhookUrl: string;
25905
+ /** @description Текст письма в поддержку AmoCRM целиком, с местами под данные аккаунта */
25906
+ emailTemplate: string;
25907
+ /**
25908
+ * @description Места в письме, которые заполняет человек: их знает только владелец аккаунта. Отдаются списком, чтобы клиент предупредил о них явно, а не надеялся, что человек заметит угловые скобки.
25909
+ * @example [
25910
+ * "<номер учётной записи>",
25911
+ * "<картинку прикладываю>",
25912
+ * "<Id интеграции>"
25913
+ * ]
25914
+ */
25915
+ placeholders: string[];
25916
+ };
24185
25917
  CrmListResponse: {
24186
25918
  crms: components["schemas"]["CrmListItem"][];
24187
25919
  };
@@ -24440,13 +26172,14 @@ export interface components {
24440
26172
  SandboxFinding: {
24441
26173
  /** Format: uuid */
24442
26174
  scenarioId?: string | null;
26175
+ turnIndex?: number;
24443
26176
  /** @enum {string} */
24444
- category: "hallucination" | "wrong_action" | "wrong_routing" | "missed_trigger" | "wrong_pipeline_transition" | "rag_miss" | "bad_tone" | "other";
26177
+ category: "hallucination" | "wrong_action" | "wrong_routing" | "missed_context" | "rag_miss" | "bad_tone" | "off_topic" | "contradiction" | "other";
24445
26178
  /** @enum {string} */
24446
26179
  severity: "low" | "medium" | "critical";
24447
- message: string;
24448
- suggestion?: string;
24449
- turnIndex?: number;
26180
+ description: string;
26181
+ evidence?: string;
26182
+ recommendation?: string;
24450
26183
  };
24451
26184
  /** @enum {string} */
24452
26185
  SourceWorkbookKind: "XLSX_UPLOAD" | "GOOGLE_SHEETS";
@@ -24501,11 +26234,22 @@ export interface components {
24501
26234
  /** @description Для Google Sheets — числовой gid */
24502
26235
  sheetGid?: number;
24503
26236
  sheetIndex: number;
24504
- rowCount: number;
24505
- columnCount: number;
26237
+ rowCount: number | null;
26238
+ columnCount: number | null;
26239
+ dimensionsKnown: boolean;
26240
+ /** @description Источник содержит строки за доступной parser-границей. */
26241
+ rowsTruncated?: boolean;
26242
+ /** @description Граница полного обхода Google grid; может включать пустые строки. */
26243
+ scanUpperBoundRowCount?: number;
26244
+ /** @description Граница полного обхода Google grid; может включать пустые колонки. */
26245
+ scanUpperBoundColumnCount?: number;
24506
26246
  sampleRows: components["schemas"]["SheetCellMetadata"][][];
24507
26247
  hyperlinkStats: components["schemas"]["ColumnLinkStats"][];
24508
26248
  truncated: boolean;
26249
+ readError?: {
26250
+ code: string;
26251
+ message: string;
26252
+ };
24509
26253
  };
24510
26254
  InspectWorkbookResponse: {
24511
26255
  workbook: components["schemas"]["SourceWorkbook"];
@@ -24513,6 +26257,35 @@ export interface components {
24513
26257
  totalSampleCells: number;
24514
26258
  globallyTruncated: boolean;
24515
26259
  };
26260
+ WorkbookSheetPage: {
26261
+ /** Format: uuid */
26262
+ workbookId: string;
26263
+ sourceIdentity: string;
26264
+ sheetTitle: string;
26265
+ sheetGid?: number;
26266
+ sheetIndex: number;
26267
+ rowOffset: number;
26268
+ rowLimit: number;
26269
+ returnedRowCount: number;
26270
+ columnOffset: number;
26271
+ columnLimit: number;
26272
+ returnedColumnCount: number;
26273
+ totalRowCount: number | null;
26274
+ totalColumnCount: number | null;
26275
+ dimensionsKnown: boolean;
26276
+ /** @description Часть источника лежит за доступной scan-границей; полный вывод делать нельзя. */
26277
+ sourceTruncated?: boolean;
26278
+ /** @description Граница, до которой надо пройти rowOffset для полного обхода. */
26279
+ scanUpperBoundRowCount: number;
26280
+ /** @description Граница, до которой надо пройти columnOffset для полного обхода. */
26281
+ scanUpperBoundColumnCount: number;
26282
+ rows: components["schemas"]["SheetCellMetadata"][][];
26283
+ hasMoreRows: boolean;
26284
+ hasMoreColumns: boolean;
26285
+ nextRowOffset: number | null;
26286
+ nextColumnOffset: number | null;
26287
+ pageFingerprint: string;
26288
+ };
24516
26289
  WorkbookInspectError: {
24517
26290
  /** @enum {string} */
24518
26291
  error: "google_sheets_not_shared";
@@ -24958,8 +26731,9 @@ export interface components {
24958
26731
  limit?: number;
24959
26732
  };
24960
26733
  KnowledgeTableReindexResponse: {
26734
+ job_id: string;
24961
26735
  /**
24962
- * @description QUEUED — reindex поставлен в фоновую очередь (для крупных источников вроде каталога 1С); опрашивай GET .../tables/:id → last_success_at для подтверждения завершения. INDEXED/SKIPPED — legacy синхронный результат.
26736
+ * @description QUEUED — reindex поставлен в фоновую очередь (для крупных источников вроде каталога 1С); опрашивай GET .../tables/:id/reindex/status для подтверждения завершения. INDEXED/SKIPPED — legacy синхронный результат.
24963
26737
  * @enum {string}
24964
26738
  */
24965
26739
  status: "QUEUED" | "INDEXED" | "SKIPPED";
@@ -24967,6 +26741,20 @@ export interface components {
24967
26741
  /** Format: date-time */
24968
26742
  indexed_at: string;
24969
26743
  };
26744
+ AsyncJobStatusResponse: {
26745
+ job_id: string;
26746
+ /** @enum {string} */
26747
+ status: "QUEUED" | "RUNNING" | "COMPLETED" | "FAILED" | "EXPIRED";
26748
+ progress: unknown;
26749
+ result: unknown;
26750
+ error: string | null;
26751
+ /** Format: date-time */
26752
+ queued_at: string | null;
26753
+ /** Format: date-time */
26754
+ started_at: string | null;
26755
+ /** Format: date-time */
26756
+ finished_at: string | null;
26757
+ };
24970
26758
  /** @enum {string} */
24971
26759
  VariableType: "TEXT" | "NUMBER" | "FLOAT" | "BOOLEAN";
24972
26760
  VariableResponse: {
@@ -25531,16 +27319,18 @@ export interface components {
25531
27319
  BroadcastMailingVariantId: string[];
25532
27320
  /** @description Механизм запуска: `wave` — доставляет процесс школы (мы штампуем поля сделки), `cold_welcome` — пишем первыми сами. Мультивыбор; ОБА значения = фильтра нет. У строки получателя механизм берётся из её собственного режима, у сделки и кандидата — из когорты по import job (нет метки и нет холодных получателей = wave). */
25533
27321
  BroadcastMechanism: ("wave" | "cold_welcome")[];
27322
+ /** @description ЧТО ЗАПУСТИЛО отправку: `manual` — оператор нажал «Запустить», `registration` — автоприём регистрации по order-вебхуку школы, `schedule` — ночной прогон планировщика. Мультивыбор; выбраны все = фильтра нет. Это ДРУГАЯ ось, а не уточнение механизма: механизм отвечает «чем доставляли». Любой выбор ИСКЛЮЧАЕТ волны школы целиком — у них запускающего в этом смысле нет. */
27323
+ BroadcastLaunchSource: ("manual" | "registration" | "schedule")[];
25534
27324
  /** @description Мультивыбор: повторяйте параметр (`?x=A&x=B`). Одиночное значение остаётся валидным. */
25535
27325
  BroadcastProduct: string[];
25536
27326
  /** @description Добавляет строки без продукта. Можно сочетать с product: значения и NULL объединяются через OR. */
25537
27327
  BroadcastProductMode: "none";
25538
27328
  /** @description Корзины свежести лида (мультивыбор). Под фильтром из ВСЕХ метрик выпадают контакты с неизвестным возрастом. Выбраны все корзины = фильтра нет. */
25539
- BroadcastFreshness: ("0-7" | "8-14" | "15-30" | "31+")[];
27329
+ BroadcastFreshness: ("0-7" | "8-14" | "15-30" | "31-45" | "46-60" | "61+")[];
25540
27330
  /** @description Мессенджеры волны (транспорты GetCourse + UNKNOWN — канал не определён), мультивыбор. Деньги фильтруются по скалярному каналу сделки. */
25541
27331
  BroadcastChannels: string[];
25542
- /** @description cohort — дата запуска; period — дата события. */
25543
- BroadcastView: "cohort" | "period";
27332
+ /** @description cohort — дата запуска; period — дата события; entry — дата входа в сегмент (segment_entered_at: регистрация, конец серии, предсписок). В entry строки без даты входа выпадают всегда, включая mode=all, а события атрибутируются когортно. */
27333
+ BroadcastView: "cohort" | "period" | "entry";
25544
27334
  /** @description Конкретный день кликнутой ячейки (МСК). */
25545
27335
  BroadcastDate: string;
25546
27336
  /** @description Канал кликнутой ячейки; пусто = общий итог. */
@@ -25593,217 +27383,707 @@ export interface components {
25593
27383
  */
25594
27384
  ExecutionModeHeader: "external" | "internal";
25595
27385
  };
25596
- requestBodies: never;
25597
- headers: never;
25598
- pathItems: never;
25599
- }
25600
- export type $defs = Record<string, never>;
25601
- export interface operations {
25602
- startIcpAudioImportRun: {
27386
+ requestBodies: never;
27387
+ headers: never;
27388
+ pathItems: never;
27389
+ }
27390
+ export type $defs = Record<string, never>;
27391
+ export interface operations {
27392
+ AgentReadinessController_get: {
27393
+ parameters: {
27394
+ query?: never;
27395
+ header?: never;
27396
+ path: {
27397
+ agentId: string;
27398
+ };
27399
+ cookie?: never;
27400
+ };
27401
+ requestBody?: never;
27402
+ responses: {
27403
+ /** @description NOT_PROVEN с отдельными gates; configurationCurrent null до фиксации полной версии зависимых настроек, promptAndAgentCurrent проверяет только промпт и запись агента */
27404
+ 200: {
27405
+ headers: {
27406
+ [name: string]: unknown;
27407
+ };
27408
+ content?: never;
27409
+ };
27410
+ };
27411
+ };
27412
+ navigateWorkspaceTask: {
27413
+ parameters: {
27414
+ query?: never;
27415
+ header?: never;
27416
+ path: {
27417
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27418
+ };
27419
+ cookie?: never;
27420
+ };
27421
+ requestBody: {
27422
+ content: {
27423
+ "application/json": components["schemas"]["WorkspaceNavigationRequest"];
27424
+ };
27425
+ };
27426
+ responses: {
27427
+ 200: {
27428
+ headers: {
27429
+ [name: string]: unknown;
27430
+ };
27431
+ content: {
27432
+ "application/json": components["schemas"]["WorkspaceNavigationResponse"];
27433
+ };
27434
+ };
27435
+ };
27436
+ };
27437
+ startIcpAudioImportRun: {
27438
+ parameters: {
27439
+ query?: never;
27440
+ header?: never;
27441
+ path?: never;
27442
+ cookie?: never;
27443
+ };
27444
+ requestBody: {
27445
+ content: {
27446
+ "application/json": components["schemas"]["StartIcpAudioImportRequest"];
27447
+ };
27448
+ };
27449
+ responses: {
27450
+ /** @description Run accepted, items scheduled */
27451
+ 202: {
27452
+ headers: {
27453
+ [name: string]: unknown;
27454
+ };
27455
+ content: {
27456
+ "application/json": components["schemas"]["IcpAudioImportRunResponse"];
27457
+ };
27458
+ };
27459
+ /** @description Validation error — invalid source config или 0 enumerable items */
27460
+ 400: {
27461
+ headers: {
27462
+ [name: string]: unknown;
27463
+ };
27464
+ content?: never;
27465
+ };
27466
+ /** @description ICP profile not found in workspace */
27467
+ 404: {
27468
+ headers: {
27469
+ [name: string]: unknown;
27470
+ };
27471
+ content?: never;
27472
+ };
27473
+ };
27474
+ };
27475
+ getIcpAudioImportRun: {
27476
+ parameters: {
27477
+ query?: never;
27478
+ header?: never;
27479
+ path: {
27480
+ runId: string;
27481
+ };
27482
+ cookie?: never;
27483
+ };
27484
+ requestBody?: never;
27485
+ responses: {
27486
+ 200: {
27487
+ headers: {
27488
+ [name: string]: unknown;
27489
+ };
27490
+ content: {
27491
+ "application/json": components["schemas"]["IcpAudioImportRunResponse"];
27492
+ };
27493
+ };
27494
+ /** @description Run not found in workspace */
27495
+ 404: {
27496
+ headers: {
27497
+ [name: string]: unknown;
27498
+ };
27499
+ content?: never;
27500
+ };
27501
+ };
27502
+ };
27503
+ deleteIcpAudioRetention: {
27504
+ parameters: {
27505
+ query?: never;
27506
+ header: {
27507
+ /** @description Workspace ID */
27508
+ "X-Tenant-Id": string;
27509
+ };
27510
+ path?: never;
27511
+ cookie?: never;
27512
+ };
27513
+ requestBody: {
27514
+ content: {
27515
+ "application/json": components["schemas"]["DeleteIcpAudioRequest"];
27516
+ };
27517
+ };
27518
+ responses: {
27519
+ /** @description Object deleted (или уже отсутствовал — idempotent) */
27520
+ 204: {
27521
+ headers: {
27522
+ [name: string]: unknown;
27523
+ };
27524
+ content?: never;
27525
+ };
27526
+ /** @description Invalid transcription-service JWT */
27527
+ 401: {
27528
+ headers: {
27529
+ [name: string]: unknown;
27530
+ };
27531
+ content?: never;
27532
+ };
27533
+ /** @description Workspace mismatch */
27534
+ 403: {
27535
+ headers: {
27536
+ [name: string]: unknown;
27537
+ };
27538
+ content?: never;
27539
+ };
27540
+ };
27541
+ };
27542
+ recordTranscriptionUsageEvent: {
27543
+ parameters: {
27544
+ query?: never;
27545
+ header: {
27546
+ "X-Tenant-Id": string;
27547
+ "Idempotency-Key"?: string;
27548
+ };
27549
+ path?: never;
27550
+ cookie?: never;
27551
+ };
27552
+ requestBody: {
27553
+ content: {
27554
+ "application/json": components["schemas"]["TranscriptionUsageEventRequest"];
27555
+ };
27556
+ };
27557
+ responses: {
27558
+ /** @description Batch accepted, per-job events written */
27559
+ 202: {
27560
+ headers: {
27561
+ [name: string]: unknown;
27562
+ };
27563
+ content?: never;
27564
+ };
27565
+ /** @description Validation error */
27566
+ 400: {
27567
+ headers: {
27568
+ [name: string]: unknown;
27569
+ };
27570
+ content?: never;
27571
+ };
27572
+ /** @description Invalid transcription-service JWT */
27573
+ 401: {
27574
+ headers: {
27575
+ [name: string]: unknown;
27576
+ };
27577
+ content?: never;
27578
+ };
27579
+ /** @description Workspace mismatch */
27580
+ 403: {
27581
+ headers: {
27582
+ [name: string]: unknown;
27583
+ };
27584
+ content?: never;
27585
+ };
27586
+ };
27587
+ };
27588
+ getContactTouchHistory: {
27589
+ parameters: {
27590
+ query?: never;
27591
+ header?: never;
27592
+ path: {
27593
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27594
+ /** @description GetCourse school-side person id (getcourse_user_id). */
27595
+ gcUserId: number;
27596
+ };
27597
+ cookie?: never;
27598
+ };
27599
+ requestBody?: never;
27600
+ responses: {
27601
+ /** @description OK */
27602
+ 200: {
27603
+ headers: {
27604
+ [name: string]: unknown;
27605
+ };
27606
+ content: {
27607
+ "application/json": {
27608
+ getcourseUserId: number;
27609
+ /** Format: date-time */
27610
+ firstWelcomeAt: string | null;
27611
+ /** @description More journal rows exist than fit in this response. */
27612
+ truncated: boolean;
27613
+ touches: {
27614
+ /** @description Touch name = the right key. Four kinds: a segment label, `text:<template fingerprint>`, `registration:<deal>`, and `legacy:welcome` (a right restored by backfill for the period before the journal existed). */
27615
+ touchKey: string;
27616
+ /** @enum {string} */
27617
+ kind: "FIRST" | "REPEAT" | "REGISTRATION";
27618
+ /** @enum {string} */
27619
+ status: "CLAIMED" | "SENT" | "UNKNOWN" | "RELEASED";
27620
+ /** Format: date-time */
27621
+ claimedAt: string;
27622
+ /** Format: date-time */
27623
+ sentAt: string | null;
27624
+ /** @description Empty for rows written before 2026-09-09 — the column did not exist yet. */
27625
+ mailingName: string | null;
27626
+ /** Format: uuid */
27627
+ platformId: string | null;
27628
+ lastError: string | null;
27629
+ }[];
27630
+ sends: {
27631
+ segment: string | null;
27632
+ /** @enum {string} */
27633
+ mode: "cold_welcome" | "registration_welcome" | "scheduled";
27634
+ /** Format: date-time */
27635
+ receivedAt: string;
27636
+ /** Format: uuid */
27637
+ platformId: string | null;
27638
+ }[];
27639
+ };
27640
+ };
27641
+ };
27642
+ };
27643
+ };
27644
+ listWorkspaceDataSources: {
27645
+ parameters: {
27646
+ query?: never;
27647
+ header?: never;
27648
+ path: {
27649
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27650
+ };
27651
+ cookie?: never;
27652
+ };
27653
+ requestBody?: never;
27654
+ responses: {
27655
+ 200: {
27656
+ headers: {
27657
+ [name: string]: unknown;
27658
+ };
27659
+ content: {
27660
+ "application/json": {
27661
+ data_sources?: {
27662
+ /** Format: uuid */
27663
+ id?: string;
27664
+ type?: string;
27665
+ name?: string;
27666
+ /** @description Health-статус (ACTIVE/ERROR/INACTIVE) */
27667
+ status?: string;
27668
+ /** @description Намерение админа вкл/выкл */
27669
+ enabled?: boolean;
27670
+ base_url?: string | null;
27671
+ /** Format: date-time */
27672
+ created_at?: string;
27673
+ }[];
27674
+ };
27675
+ };
27676
+ };
27677
+ };
27678
+ };
27679
+ listWorkspaceCrms: {
25603
27680
  parameters: {
25604
27681
  query?: never;
25605
27682
  header?: never;
25606
- path?: never;
25607
- cookie?: never;
25608
- };
25609
- requestBody: {
25610
- content: {
25611
- "application/json": components["schemas"]["StartIcpAudioImportRequest"];
27683
+ path: {
27684
+ workspaceId: string;
25612
27685
  };
27686
+ cookie?: never;
25613
27687
  };
27688
+ requestBody?: never;
25614
27689
  responses: {
25615
- /** @description Run accepted, items scheduled */
25616
- 202: {
27690
+ 200: {
25617
27691
  headers: {
25618
27692
  [name: string]: unknown;
25619
27693
  };
25620
27694
  content: {
25621
- "application/json": components["schemas"]["IcpAudioImportRunResponse"];
27695
+ "application/json": components["schemas"]["CrmListResponse"];
25622
27696
  };
25623
27697
  };
25624
- /** @description Validation error — invalid source config или 0 enumerable items */
25625
- 400: {
27698
+ };
27699
+ };
27700
+ getAmoCrmChannelRegistration: {
27701
+ parameters: {
27702
+ query?: never;
27703
+ header?: never;
27704
+ path: {
27705
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27706
+ };
27707
+ cookie?: never;
27708
+ };
27709
+ requestBody?: never;
27710
+ responses: {
27711
+ 200: {
25626
27712
  headers: {
25627
27713
  [name: string]: unknown;
25628
27714
  };
25629
- content?: never;
27715
+ content: {
27716
+ "application/json": components["schemas"]["AmoCrmChannelRegistrationResponse"];
27717
+ };
25630
27718
  };
25631
- /** @description ICP profile not found in workspace */
25632
- 404: {
27719
+ };
27720
+ };
27721
+ getInboundAnalytics: {
27722
+ parameters: {
27723
+ query?: {
27724
+ platformId?: string;
27725
+ channels?: string[];
27726
+ mode?: "all" | "days" | "range";
27727
+ days?: number;
27728
+ from?: string;
27729
+ to?: string;
27730
+ };
27731
+ header?: never;
27732
+ path: {
27733
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27734
+ report: "summary" | "topics" | "speed" | "money" | "cycle" | "quality";
27735
+ };
27736
+ cookie?: never;
27737
+ };
27738
+ requestBody?: never;
27739
+ responses: {
27740
+ /** @description Канонический ответ выбранной входящей витрины; null не заменяется нулём. */
27741
+ 200: {
25633
27742
  headers: {
25634
27743
  [name: string]: unknown;
25635
27744
  };
25636
- content?: never;
27745
+ content: {
27746
+ "application/json": components["schemas"]["AnalyticsAggregateResponse"];
27747
+ };
25637
27748
  };
27749
+ 400: components["responses"]["ValidationError"];
27750
+ 401: components["responses"]["Unauthorized"];
27751
+ 403: components["responses"]["Forbidden"];
25638
27752
  };
25639
27753
  };
25640
- getIcpAudioImportRun: {
27754
+ getFunnelAnalytics: {
25641
27755
  parameters: {
25642
- query?: never;
27756
+ query: {
27757
+ platformId: string;
27758
+ from?: string;
27759
+ to?: string;
27760
+ view?: "cohort" | "period";
27761
+ managerId?: number;
27762
+ };
25643
27763
  header?: never;
25644
27764
  path: {
25645
- runId: string;
27765
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27766
+ report: "meta" | "summary" | "cohorts";
25646
27767
  };
25647
27768
  cookie?: never;
25648
27769
  };
25649
27770
  requestBody?: never;
25650
27771
  responses: {
27772
+ /** @description Канонический ответ воронки с неизменным view и зерном. */
25651
27773
  200: {
25652
27774
  headers: {
25653
27775
  [name: string]: unknown;
25654
27776
  };
25655
27777
  content: {
25656
- "application/json": components["schemas"]["IcpAudioImportRunResponse"];
27778
+ "application/json": components["schemas"]["AnalyticsAggregateResponse"];
25657
27779
  };
25658
27780
  };
25659
- /** @description Run not found in workspace */
25660
- 404: {
27781
+ 400: components["responses"]["ValidationError"];
27782
+ 401: components["responses"]["Unauthorized"];
27783
+ 403: components["responses"]["Forbidden"];
27784
+ 404: components["responses"]["NotFound"];
27785
+ };
27786
+ };
27787
+ getAiCosts: {
27788
+ parameters: {
27789
+ query?: {
27790
+ mode?: "all" | "days" | "range";
27791
+ days?: number;
27792
+ from?: string;
27793
+ to?: string;
27794
+ scope?: "production" | "with_tests";
27795
+ groupBy?: "customer" | "platform" | "tag" | "operation" | "provider";
27796
+ page?: number;
27797
+ limit?: number;
27798
+ };
27799
+ header?: never;
27800
+ path: {
27801
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27802
+ report: "summary" | "tasks" | "breakdown";
27803
+ };
27804
+ cookie?: never;
27805
+ };
27806
+ requestBody?: never;
27807
+ responses: {
27808
+ /** @description Ledger с отдельным числом priced и unpriced usage events. */
27809
+ 200: {
25661
27810
  headers: {
25662
27811
  [name: string]: unknown;
25663
27812
  };
25664
- content?: never;
27813
+ content: {
27814
+ "application/json": components["schemas"]["AnalyticsAggregateResponse"];
27815
+ };
25665
27816
  };
27817
+ 400: components["responses"]["ValidationError"];
27818
+ 401: components["responses"]["Unauthorized"];
27819
+ 403: components["responses"]["Forbidden"];
25666
27820
  };
25667
27821
  };
25668
- deleteIcpAudioRetention: {
27822
+ listCustomReports: {
25669
27823
  parameters: {
25670
27824
  query?: never;
25671
- header: {
25672
- /** @description Workspace ID */
25673
- "X-Tenant-Id": string;
27825
+ header?: never;
27826
+ path: {
27827
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
25674
27828
  };
25675
- path?: never;
25676
27829
  cookie?: never;
25677
27830
  };
25678
- requestBody: {
25679
- content: {
25680
- "application/json": components["schemas"]["DeleteIcpAudioRequest"];
25681
- };
25682
- };
27831
+ requestBody?: never;
25683
27832
  responses: {
25684
- /** @description Object deleted (или уже отсутствовал — idempotent) */
25685
- 204: {
27833
+ /** @description Неархивированные определения отчётов. */
27834
+ 200: {
25686
27835
  headers: {
25687
27836
  [name: string]: unknown;
25688
27837
  };
25689
- content?: never;
27838
+ content: {
27839
+ "application/json": {
27840
+ items: components["schemas"]["CustomReportDefinition"][];
27841
+ };
27842
+ };
25690
27843
  };
25691
- /** @description Invalid transcription-service JWT */
25692
- 401: {
27844
+ 401: components["responses"]["Unauthorized"];
27845
+ 403: components["responses"]["Forbidden"];
27846
+ };
27847
+ };
27848
+ getCustomReport: {
27849
+ parameters: {
27850
+ query?: never;
27851
+ header?: never;
27852
+ path: {
27853
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27854
+ reportId: string;
27855
+ };
27856
+ cookie?: never;
27857
+ };
27858
+ requestBody?: never;
27859
+ responses: {
27860
+ /** @description Определение и версия отчёта. */
27861
+ 200: {
25693
27862
  headers: {
25694
27863
  [name: string]: unknown;
25695
27864
  };
25696
- content?: never;
27865
+ content: {
27866
+ "application/json": components["schemas"]["CustomReportDefinition"];
27867
+ };
25697
27868
  };
25698
- /** @description Workspace mismatch */
25699
- 403: {
27869
+ 401: components["responses"]["Unauthorized"];
27870
+ 403: components["responses"]["Forbidden"];
27871
+ 404: components["responses"]["NotFound"];
27872
+ };
27873
+ };
27874
+ getCustomReportData: {
27875
+ parameters: {
27876
+ query: {
27877
+ from: string;
27878
+ to: string;
27879
+ granularity?: "day" | "week" | "month" | "total";
27880
+ };
27881
+ header?: never;
27882
+ path: {
27883
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27884
+ reportId: string;
27885
+ };
27886
+ cookie?: never;
27887
+ };
27888
+ requestBody?: never;
27889
+ responses: {
27890
+ /** @description Данные таблицы и snapshot точного drill-down, если источник его поддерживает. */
27891
+ 200: {
25700
27892
  headers: {
25701
27893
  [name: string]: unknown;
25702
27894
  };
25703
- content?: never;
27895
+ content: {
27896
+ "application/json": components["schemas"]["CustomReportDataResponse"];
27897
+ };
25704
27898
  };
27899
+ 400: components["responses"]["ValidationError"];
27900
+ 401: components["responses"]["Unauthorized"];
27901
+ 403: components["responses"]["Forbidden"];
27902
+ 404: components["responses"]["NotFound"];
25705
27903
  };
25706
27904
  };
25707
- recordTranscriptionUsageEvent: {
27905
+ getWorkspaceOperationalOverview: {
25708
27906
  parameters: {
25709
27907
  query?: never;
25710
- header: {
25711
- "X-Tenant-Id": string;
25712
- "Idempotency-Key"?: string;
27908
+ header?: never;
27909
+ path: {
27910
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
25713
27911
  };
25714
- path?: never;
25715
27912
  cookie?: never;
25716
27913
  };
25717
- requestBody: {
25718
- content: {
25719
- "application/json": components["schemas"]["TranscriptionUsageEventRequest"];
25720
- };
25721
- };
27914
+ requestBody?: never;
25722
27915
  responses: {
25723
- /** @description Batch accepted, per-job events written */
25724
- 202: {
27916
+ /** @description Текущее состояние и приоритетные предупреждения. */
27917
+ 200: {
25725
27918
  headers: {
25726
27919
  [name: string]: unknown;
25727
27920
  };
25728
- content?: never;
25729
- };
25730
- /** @description Validation error */
25731
- 400: {
25732
- headers: {
25733
- [name: string]: unknown;
27921
+ content: {
27922
+ "application/json": components["schemas"]["OperationalOverviewResponse"];
25734
27923
  };
25735
- content?: never;
25736
27924
  };
25737
- /** @description Invalid transcription-service JWT */
25738
- 401: {
27925
+ 401: components["responses"]["Unauthorized"];
27926
+ 403: components["responses"]["Forbidden"];
27927
+ };
27928
+ };
27929
+ listWorkspaceOperatorsForWorkflow: {
27930
+ parameters: {
27931
+ query?: never;
27932
+ header?: never;
27933
+ path: {
27934
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27935
+ };
27936
+ cookie?: never;
27937
+ };
27938
+ requestBody?: never;
27939
+ responses: {
27940
+ /** @description Только workspace operators; CRM operators в ответ не входят. */
27941
+ 200: {
25739
27942
  headers: {
25740
27943
  [name: string]: unknown;
25741
27944
  };
25742
- content?: never;
27945
+ content: {
27946
+ "application/json": components["schemas"]["WorkspaceOperatorOption"][];
27947
+ };
25743
27948
  };
25744
- /** @description Workspace mismatch */
25745
- 403: {
27949
+ 401: components["responses"]["Unauthorized"];
27950
+ 403: components["responses"]["Forbidden"];
27951
+ };
27952
+ };
27953
+ listWorkspaceOperatorQueue: {
27954
+ parameters: {
27955
+ query?: {
27956
+ status?: "WAITING_OPERATOR" | "IN_PROGRESS" | "WAITING_CUSTOMER" | "RESOLVED";
27957
+ workspaceOperatorId?: string;
27958
+ contactId?: string;
27959
+ page?: number;
27960
+ limit?: number;
27961
+ };
27962
+ header?: never;
27963
+ path: {
27964
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
27965
+ };
27966
+ cookie?: never;
27967
+ };
27968
+ requestBody?: never;
27969
+ responses: {
27970
+ /** @description Текущее состояние и последнее связанное доказательство workflow. */
27971
+ 200: {
25746
27972
  headers: {
25747
27973
  [name: string]: unknown;
25748
27974
  };
25749
- content?: never;
27975
+ content: {
27976
+ "application/json": components["schemas"]["OperatorQueueResponse"];
27977
+ };
25750
27978
  };
27979
+ 401: components["responses"]["Unauthorized"];
27980
+ 403: components["responses"]["Forbidden"];
25751
27981
  };
25752
27982
  };
25753
- listWorkspaceDataSources: {
27983
+ getWorkspaceOperatorAssignment: {
25754
27984
  parameters: {
25755
27985
  query?: never;
25756
27986
  header?: never;
25757
27987
  path: {
25758
27988
  workspaceId: components["parameters"]["WorkspaceIdPath"];
27989
+ contactId: string;
25759
27990
  };
25760
27991
  cookie?: never;
25761
27992
  };
25762
27993
  requestBody?: never;
25763
27994
  responses: {
27995
+ /** @description Назначение, статус и доказательство workflow. */
25764
27996
  200: {
25765
27997
  headers: {
25766
27998
  [name: string]: unknown;
25767
27999
  };
25768
28000
  content: {
25769
- "application/json": {
25770
- data_sources?: {
25771
- /** Format: uuid */
25772
- id?: string;
25773
- type?: string;
25774
- name?: string;
25775
- /** @description Health-статус (ACTIVE/ERROR/INACTIVE) */
25776
- status?: string;
25777
- /** @description Намерение админа вкл/выкл */
25778
- enabled?: boolean;
25779
- base_url?: string | null;
25780
- /** Format: date-time */
25781
- created_at?: string;
25782
- }[];
25783
- };
28001
+ "application/json": components["schemas"]["WorkspaceOperatorAssignmentState"];
25784
28002
  };
25785
28003
  };
28004
+ 401: components["responses"]["Unauthorized"];
28005
+ 403: components["responses"]["Forbidden"];
28006
+ 404: components["responses"]["NotFound"];
25786
28007
  };
25787
28008
  };
25788
- listWorkspaceCrms: {
28009
+ updateWorkspaceOperatorAssignment: {
25789
28010
  parameters: {
25790
28011
  query?: never;
25791
28012
  header?: never;
25792
28013
  path: {
25793
- workspaceId: string;
28014
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
28015
+ contactId: string;
28016
+ };
28017
+ cookie?: never;
28018
+ };
28019
+ requestBody: {
28020
+ content: {
28021
+ "application/json": components["schemas"]["UpdateWorkspaceOperatorAssignment"];
28022
+ };
28023
+ };
28024
+ responses: {
28025
+ /** @description Фактически сохранённое назначение. */
28026
+ 200: {
28027
+ headers: {
28028
+ [name: string]: unknown;
28029
+ };
28030
+ content: {
28031
+ "application/json": components["schemas"]["WorkspaceOperatorAssignmentResult"];
28032
+ };
28033
+ };
28034
+ 401: components["responses"]["Unauthorized"];
28035
+ 403: components["responses"]["Forbidden"];
28036
+ 404: components["responses"]["NotFound"];
28037
+ 409: components["responses"]["Conflict"];
28038
+ };
28039
+ };
28040
+ getCustomReportDrilldown: {
28041
+ parameters: {
28042
+ query: {
28043
+ /** @description Начало бакета, YYYY-MM-DD, включительно. */
28044
+ bucketFrom: string;
28045
+ /** @description Конец бакета, YYYY-MM-DD, включительно. */
28046
+ bucketTo: string;
28047
+ /** @description Сохранённая колонка таблицы. */
28048
+ metricKey: string;
28049
+ /** @description Сохранённая строка; отсутствие означает итог бакета. */
28050
+ dimensionValue?: string;
28051
+ /** @description Снимок из ответа живого отчёта; обязателен для источников дожимов. */
28052
+ calculatedAt?: string;
28053
+ /** @description JSON-путь строки сводной; отсутствие означает общий итог. */
28054
+ rowPath?: string;
28055
+ /** @description Непрозрачный MVCC-снимок PostgreSQL из ответа живого отчёта. */
28056
+ executionDbSnapshot?: string;
28057
+ /** @description Fingerprint актуальных шагов и атрибуции из ответа живого отчёта. */
28058
+ expectedCurrentStepsFingerprint?: string;
28059
+ /** @description updatedAt определения из ответа живого отчёта. */
28060
+ expectedReportUpdatedAt: string;
28061
+ limit?: number;
28062
+ offset?: number;
28063
+ };
28064
+ header?: never;
28065
+ path: {
28066
+ workspaceId: components["parameters"]["WorkspaceIdPath"];
28067
+ reportId: string;
25794
28068
  };
25795
28069
  cookie?: never;
25796
28070
  };
25797
28071
  requestBody?: never;
25798
28072
  responses: {
28073
+ /** @description Страница исполнений за выбранной ячейкой. */
25799
28074
  200: {
25800
28075
  headers: {
25801
28076
  [name: string]: unknown;
25802
28077
  };
25803
28078
  content: {
25804
- "application/json": components["schemas"]["CrmListResponse"];
28079
+ "application/json": components["schemas"]["CustomReportDrilldownResponse"];
25805
28080
  };
25806
28081
  };
28082
+ 400: components["responses"]["ValidationError"];
28083
+ 401: components["responses"]["Unauthorized"];
28084
+ 403: components["responses"]["Forbidden"];
28085
+ 404: components["responses"]["NotFound"];
28086
+ 409: components["responses"]["Conflict"];
25807
28087
  };
25808
28088
  };
25809
28089
  }