@besales/mcp 0.48.0 → 1.0.0-beta.4

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 (604) hide show
  1. package/README.md +117 -163
  2. package/README.onprem.ru.md +35 -0
  3. package/bin/besales-mcp-http.js +9 -0
  4. package/bin/besales-onprem.mjs +19 -0
  5. package/dist/auth/connection-store.d.ts +3 -1
  6. package/dist/auth/connection-store.js +9 -3
  7. package/dist/auth/connection-store.js.map +1 -1
  8. package/dist/auth/oauth-client.d.ts +20 -27
  9. package/dist/auth/oauth-client.js +31 -23
  10. package/dist/auth/oauth-client.js.map +1 -1
  11. package/dist/auth/session-workspace.d.ts +1 -0
  12. package/dist/auth/session-workspace.js +10 -1
  13. package/dist/auth/session-workspace.js.map +1 -1
  14. package/dist/auth/token-storage.js +4 -1
  15. package/dist/auth/token-storage.js.map +1 -1
  16. package/dist/cli.d.ts +1 -0
  17. package/dist/cli.js +80 -19
  18. package/dist/cli.js.map +1 -1
  19. package/dist/constants/crm-catalog.d.ts +2 -0
  20. package/dist/constants/crm-catalog.js +3 -0
  21. package/dist/constants/crm-catalog.js.map +1 -0
  22. package/dist/http/api-client.d.ts +54 -7
  23. package/dist/http/api-client.js +132 -66
  24. package/dist/http/api-client.js.map +1 -1
  25. package/dist/http/feedback-document-error.d.ts +26 -0
  26. package/dist/http/feedback-document-error.js +22 -0
  27. package/dist/http/feedback-document-error.js.map +1 -0
  28. package/dist/http-server.d.ts +15 -0
  29. package/dist/http-server.js +378 -0
  30. package/dist/http-server.js.map +1 -0
  31. package/dist/instructions/server-instructions.d.ts +1 -1
  32. package/dist/instructions/server-instructions.js +6 -3
  33. package/dist/instructions/server-instructions.js.map +1 -1
  34. package/dist/network/constants.d.ts +25 -0
  35. package/dist/network/constants.js +26 -0
  36. package/dist/network/constants.js.map +1 -0
  37. package/dist/network/failed-verifications.d.ts +10 -0
  38. package/dist/network/failed-verifications.js +37 -0
  39. package/dist/network/failed-verifications.js.map +1 -0
  40. package/dist/network/http-test-fixture.d.ts +3 -0
  41. package/dist/network/http-test-fixture.js +86 -0
  42. package/dist/network/http-test-fixture.js.map +1 -0
  43. package/dist/network/known-keys.d.ts +10 -0
  44. package/dist/network/known-keys.js +38 -0
  45. package/dist/network/known-keys.js.map +1 -0
  46. package/dist/network/memory-credentials.d.ts +11 -0
  47. package/dist/network/memory-credentials.js +24 -0
  48. package/dist/network/memory-credentials.js.map +1 -0
  49. package/dist/network/rate-limit.d.ts +23 -0
  50. package/dist/network/rate-limit.js +62 -0
  51. package/dist/network/rate-limit.js.map +1 -0
  52. package/dist/network/rejected-keys.d.ts +9 -0
  53. package/dist/network/rejected-keys.js +39 -0
  54. package/dist/network/rejected-keys.js.map +1 -0
  55. package/dist/network/request-work.d.ts +8 -0
  56. package/dist/network/request-work.js +20 -0
  57. package/dist/network/request-work.js.map +1 -0
  58. package/dist/network/successful-keys.d.ts +17 -0
  59. package/dist/network/successful-keys.js +47 -0
  60. package/dist/network/successful-keys.js.map +1 -0
  61. package/dist/resources/concepts/external-execution.md +3 -1
  62. package/dist/resources/concepts/feedback-sheets.md +21 -12
  63. package/dist/resources/concepts/icp.md +8 -1
  64. package/dist/resources/concepts/sandbox.md +15 -6
  65. package/dist/resources/concepts/triggers.md +43 -0
  66. package/dist/resources/concepts/workbook-classification.md +104 -50
  67. package/dist/resources/docs/agent-behavior.md +51 -382
  68. package/dist/resources/docs/campaigns.md +9 -16
  69. package/dist/resources/docs/crm-integration.md +39 -523
  70. package/dist/resources/docs/files-and-uploads.md +23 -286
  71. package/dist/resources/docs/follow-up.md +47 -12
  72. package/dist/resources/docs/knowledge-base.md +52 -521
  73. package/dist/resources/docs/pipeline-builder.md +26 -216
  74. package/dist/resources/docs/pipeline-settings-deep.md +27 -220
  75. package/dist/resources/docs/platforms.md +149 -519
  76. package/dist/resources/docs/prompt-anatomy.md +39 -285
  77. package/dist/resources/docs/routing.md +8 -16
  78. package/dist/resources/docs/trigger-actions.md +40 -24
  79. package/dist/resources/docs/variables.md +8 -12
  80. package/dist/resources/operator-edit.contract.d.ts +7 -0
  81. package/dist/resources/operator-edit.contract.js +8 -0
  82. package/dist/resources/operator-edit.contract.js.map +1 -0
  83. package/dist/resources/registry.js +20 -4
  84. package/dist/resources/registry.js.map +1 -1
  85. package/dist/resources/workflows/audit-dialogues.md +23 -12
  86. package/dist/resources/workflows/compare-models.md +6 -6
  87. package/dist/resources/workflows/connect-crm-from-scratch.md +15 -12
  88. package/dist/resources/workflows/connect-datasource-from-scratch.md +5 -4
  89. package/dist/resources/workflows/extract-from-document.md +8 -6
  90. package/dist/resources/workflows/operator-edit.md +15 -0
  91. package/dist/resources/workflows/platform-setup-from-scratch.md +59 -70
  92. package/dist/resources/workflows/production-readiness-check.md +25 -15
  93. package/dist/schemas/mcp-tools.json +12389 -6657
  94. package/dist/schemas/voice-actions-api.contract.json +248 -0
  95. package/dist/shared/constants/broadcast-reason.constants.d.ts +2 -0
  96. package/dist/shared/constants/broadcast-reason.constants.js +47 -0
  97. package/dist/shared/constants/broadcast-reason.constants.js.map +1 -0
  98. package/dist/shared/constants/crm-stage-pool.constants.d.ts +2 -0
  99. package/dist/shared/constants/crm-stage-pool.constants.js +3 -0
  100. package/dist/shared/constants/crm-stage-pool.constants.js.map +1 -0
  101. package/dist/shared/constants/followup-note.constants.d.ts +3 -0
  102. package/dist/shared/constants/followup-note.constants.js +4 -0
  103. package/dist/shared/constants/followup-note.constants.js.map +1 -0
  104. package/dist/shared/constants/followup-session.constants.d.ts +2 -0
  105. package/dist/shared/constants/followup-session.constants.js +3 -0
  106. package/dist/shared/constants/followup-session.constants.js.map +1 -0
  107. package/dist/shared/constants/funnel-analytics.constants.d.ts +2 -0
  108. package/dist/shared/constants/funnel-analytics.constants.js +3 -0
  109. package/dist/shared/constants/funnel-analytics.constants.js.map +1 -0
  110. package/dist/shared/constants/message-filter.constants.d.ts +7 -0
  111. package/dist/shared/constants/message-filter.constants.js +8 -0
  112. package/dist/shared/constants/message-filter.constants.js.map +1 -0
  113. package/dist/shared/utils/trigger-repeat-mapping.d.ts +72 -0
  114. package/dist/shared/utils/trigger-repeat-mapping.js +53 -0
  115. package/dist/shared/utils/trigger-repeat-mapping.js.map +1 -0
  116. package/dist/skills/besales-dialogue-audit/SKILL.md +31 -20
  117. package/dist/tasks/task-state-store.js +5 -0
  118. package/dist/tasks/task-state-store.js.map +1 -1
  119. package/dist/tools/annotations.js +4 -3
  120. package/dist/tools/annotations.js.map +1 -1
  121. package/dist/tools/definitions/agent-design.d.ts +81 -24
  122. package/dist/tools/definitions/agent-design.js +246 -90
  123. package/dist/tools/definitions/agent-design.js.map +1 -1
  124. package/dist/tools/definitions/agent-model-notice.d.ts +5 -0
  125. package/dist/tools/definitions/agent-model-notice.js +31 -0
  126. package/dist/tools/definitions/agent-model-notice.js.map +1 -0
  127. package/dist/tools/definitions/agent-models.d.ts +5 -0
  128. package/dist/tools/definitions/agent-models.js +26 -0
  129. package/dist/tools/definitions/agent-models.js.map +1 -0
  130. package/dist/tools/definitions/agent-settings.d.ts +85 -0
  131. package/dist/tools/definitions/agent-settings.js +187 -0
  132. package/dist/tools/definitions/agent-settings.js.map +1 -0
  133. package/dist/tools/definitions/ai-costs.d.ts +12 -0
  134. package/dist/tools/definitions/ai-costs.js +142 -0
  135. package/dist/tools/definitions/ai-costs.js.map +1 -0
  136. package/dist/tools/definitions/api-tool-request.d.ts +15 -0
  137. package/dist/tools/definitions/api-tool-request.js +2 -0
  138. package/dist/tools/definitions/api-tool-request.js.map +1 -0
  139. package/dist/tools/definitions/behavior-shipped-form.d.ts +182 -0
  140. package/dist/tools/definitions/behavior-shipped-form.js +185 -0
  141. package/dist/tools/definitions/behavior-shipped-form.js.map +1 -0
  142. package/dist/tools/definitions/broadcast-alerts.d.ts +6 -0
  143. package/dist/tools/definitions/broadcast-alerts.js +72 -0
  144. package/dist/tools/definitions/broadcast-alerts.js.map +1 -0
  145. package/dist/tools/definitions/broadcast-analytics.d.ts +102 -18
  146. package/dist/tools/definitions/broadcast-analytics.js +732 -431
  147. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  148. package/dist/tools/definitions/broadcast-scheduler.d.ts +10 -13
  149. package/dist/tools/definitions/broadcast-scheduler.js +196 -154
  150. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  151. package/dist/tools/definitions/call-operator-task.schema.d.ts +11 -0
  152. package/dist/tools/definitions/call-operator-task.schema.js +30 -0
  153. package/dist/tools/definitions/call-operator-task.schema.js.map +1 -0
  154. package/dist/tools/definitions/contacts.d.ts +3 -0
  155. package/dist/tools/definitions/contacts.js +57 -31
  156. package/dist/tools/definitions/contacts.js.map +1 -1
  157. package/dist/tools/definitions/crm-platform.d.ts +29 -39
  158. package/dist/tools/definitions/crm-platform.js +249 -352
  159. package/dist/tools/definitions/crm-platform.js.map +1 -1
  160. package/dist/tools/definitions/crm-stage-pool.messages.d.ts +39 -0
  161. package/dist/tools/definitions/crm-stage-pool.messages.js +43 -0
  162. package/dist/tools/definitions/crm-stage-pool.messages.js.map +1 -0
  163. package/dist/tools/definitions/crm-stage-pool.schema.d.ts +64 -0
  164. package/dist/tools/definitions/crm-stage-pool.schema.js +109 -0
  165. package/dist/tools/definitions/crm-stage-pool.schema.js.map +1 -0
  166. package/dist/tools/definitions/custom-reports.d.ts +12 -0
  167. package/dist/tools/definitions/custom-reports.js +68 -0
  168. package/dist/tools/definitions/custom-reports.js.map +1 -0
  169. package/dist/tools/definitions/datasource.d.ts +2 -1
  170. package/dist/tools/definitions/datasource.js +28 -13
  171. package/dist/tools/definitions/datasource.js.map +1 -1
  172. package/dist/tools/definitions/dialog-review-findings-response.d.ts +14 -0
  173. package/dist/tools/definitions/dialog-review-findings-response.js +23 -0
  174. package/dist/tools/definitions/dialog-review-findings-response.js.map +1 -0
  175. package/dist/tools/definitions/dialog-review-safe-response.d.ts +5 -0
  176. package/dist/tools/definitions/dialog-review-safe-response.js +152 -0
  177. package/dist/tools/definitions/dialog-review-safe-response.js.map +1 -0
  178. package/dist/tools/definitions/dialog-review.d.ts +49 -0
  179. package/dist/tools/definitions/dialog-review.js +383 -0
  180. package/dist/tools/definitions/dialog-review.js.map +1 -0
  181. package/dist/tools/definitions/dialogue-analysis.d.ts +46 -0
  182. package/dist/tools/definitions/dialogue-analysis.js +170 -0
  183. package/dist/tools/definitions/dialogue-analysis.js.map +1 -0
  184. package/dist/tools/definitions/dialogue-audit-agent-scope.d.ts +7 -0
  185. package/dist/tools/definitions/dialogue-audit-agent-scope.js +41 -0
  186. package/dist/tools/definitions/dialogue-audit-agent-scope.js.map +1 -0
  187. package/dist/tools/definitions/dialogue-audit-alias.d.ts +67 -0
  188. package/dist/tools/definitions/dialogue-audit-alias.js +559 -0
  189. package/dist/tools/definitions/dialogue-audit-alias.js.map +1 -0
  190. package/dist/tools/definitions/dialogue-export.d.ts +7 -1
  191. package/dist/tools/definitions/dialogue-export.js +89 -32
  192. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  193. package/dist/tools/definitions/dialogue-followup-state.d.ts +9 -0
  194. package/dist/tools/definitions/dialogue-followup-state.js +69 -0
  195. package/dist/tools/definitions/dialogue-followup-state.js.map +1 -0
  196. package/dist/tools/definitions/dialogue-reprocess.d.ts +5 -0
  197. package/dist/tools/definitions/dialogue-reprocess.js +107 -0
  198. package/dist/tools/definitions/dialogue-reprocess.js.map +1 -0
  199. package/dist/tools/definitions/edit-version-transport.test-fixtures.d.ts +13 -0
  200. package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
  201. package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
  202. package/dist/tools/definitions/edit-version.d.ts +5 -0
  203. package/dist/tools/definitions/edit-version.js +20 -0
  204. package/dist/tools/definitions/edit-version.js.map +1 -0
  205. package/dist/tools/definitions/external-api-channels.js +17 -15
  206. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  207. package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
  208. package/dist/tools/definitions/feedback-document-access.js +63 -0
  209. package/dist/tools/definitions/feedback-document-access.js.map +1 -0
  210. package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
  211. package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
  212. package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
  213. package/dist/tools/definitions/follow-up-config.d.ts +79 -0
  214. package/dist/tools/definitions/follow-up-config.js +258 -0
  215. package/dist/tools/definitions/follow-up-config.js.map +1 -0
  216. package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
  217. package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
  218. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  219. package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
  220. package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
  221. package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
  222. package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
  223. package/dist/tools/definitions/follow-up-setup.js +20 -87
  224. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  225. package/dist/tools/definitions/follow-up.d.ts +20 -122
  226. package/dist/tools/definitions/follow-up.js +200 -357
  227. package/dist/tools/definitions/follow-up.js.map +1 -1
  228. package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
  229. package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
  230. package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
  231. package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
  232. package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
  233. package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
  234. package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
  235. package/dist/tools/definitions/funnel-analytics.js +150 -0
  236. package/dist/tools/definitions/funnel-analytics.js.map +1 -0
  237. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
  238. package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
  239. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  240. package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
  241. package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
  242. package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
  243. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +14 -29
  244. package/dist/tools/definitions/getcourse-cold-welcome.js +190 -253
  245. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  246. package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
  247. package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
  248. package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
  249. package/dist/tools/definitions/help.js.map +1 -1
  250. package/dist/tools/definitions/icp-import-source.d.ts +75 -0
  251. package/dist/tools/definitions/icp-import-source.js +88 -0
  252. package/dist/tools/definitions/icp-import-source.js.map +1 -0
  253. package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
  254. package/dist/tools/definitions/inbound-analytics.js +55 -0
  255. package/dist/tools/definitions/inbound-analytics.js.map +1 -0
  256. package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
  257. package/dist/tools/definitions/instagram-comment.templates.js +34 -0
  258. package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
  259. package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
  260. package/dist/tools/definitions/instagram-settings-compat.js +7 -0
  261. package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
  262. package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
  263. package/dist/tools/definitions/knowledge-chunking.js +83 -0
  264. package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
  265. package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
  266. package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
  267. package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
  268. package/dist/tools/definitions/knowledge.d.ts +24 -14
  269. package/dist/tools/definitions/knowledge.js +342 -233
  270. package/dist/tools/definitions/knowledge.js.map +1 -1
  271. package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
  272. package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
  273. package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
  274. package/dist/tools/definitions/link-tracking.d.ts +8 -0
  275. package/dist/tools/definitions/link-tracking.js +141 -38
  276. package/dist/tools/definitions/link-tracking.js.map +1 -1
  277. package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
  278. package/dist/tools/definitions/mailing-variant-content.js +73 -0
  279. package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
  280. package/dist/tools/definitions/model-comparison.d.ts +2 -1
  281. package/dist/tools/definitions/model-comparison.js +4 -5
  282. package/dist/tools/definitions/model-comparison.js.map +1 -1
  283. package/dist/tools/definitions/money-currency.d.ts +5 -0
  284. package/dist/tools/definitions/money-currency.js +10 -0
  285. package/dist/tools/definitions/money-currency.js.map +1 -0
  286. package/dist/tools/definitions/operator-workflow.d.ts +5 -5
  287. package/dist/tools/definitions/operator-workflow.js +80 -27
  288. package/dist/tools/definitions/operator-workflow.js.map +1 -1
  289. package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
  290. package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
  291. package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
  292. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
  293. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
  294. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
  295. package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
  296. package/dist/tools/definitions/platform-settings-limits.js +6 -0
  297. package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
  298. package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
  299. package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
  300. package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
  301. package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
  302. package/dist/tools/definitions/platform-settings-update.js +134 -0
  303. package/dist/tools/definitions/platform-settings-update.js.map +1 -0
  304. package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
  305. package/dist/tools/definitions/platform-setup-wave.js +1079 -0
  306. package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
  307. package/dist/tools/definitions/platform-setup.d.ts +697 -224
  308. package/dist/tools/definitions/platform-setup.js +313 -752
  309. package/dist/tools/definitions/platform-setup.js.map +1 -1
  310. package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
  311. package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
  312. package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
  313. package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
  314. package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
  315. package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
  316. package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
  317. package/dist/tools/definitions/prompt-batch-controls.js +40 -0
  318. package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
  319. package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
  320. package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
  321. package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
  322. package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
  323. package/dist/tools/definitions/prompt-text-projection.js +62 -0
  324. package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
  325. package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
  326. package/dist/tools/definitions/reviewer-paid.js +115 -0
  327. package/dist/tools/definitions/reviewer-paid.js.map +1 -0
  328. package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
  329. package/dist/tools/definitions/routing-condition-projection.js +97 -0
  330. package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
  331. package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
  332. package/dist/tools/definitions/schedule-selection-hints.js +42 -0
  333. package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
  334. package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
  335. package/dist/tools/definitions/scheduled-task-alias.js +207 -0
  336. package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
  337. package/dist/tools/definitions/session.js +3 -3
  338. package/dist/tools/definitions/session.js.map +1 -1
  339. package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
  340. package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
  341. package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
  342. package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
  343. package/dist/tools/definitions/shared-input.helpers.js +323 -0
  344. package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
  345. package/dist/tools/definitions/shared.d.ts +401 -307
  346. package/dist/tools/definitions/shared.js +430 -652
  347. package/dist/tools/definitions/shared.js.map +1 -1
  348. package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
  349. package/dist/tools/definitions/shipped-output-names.js +123 -0
  350. package/dist/tools/definitions/shipped-output-names.js.map +1 -0
  351. package/dist/tools/definitions/task-state.d.ts +4 -4
  352. package/dist/tools/definitions/task-state.js +2 -1
  353. package/dist/tools/definitions/task-state.js.map +1 -1
  354. package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
  355. package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
  356. package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
  357. package/dist/tools/definitions/telegram-personal-management.d.ts +34 -0
  358. package/dist/tools/definitions/telegram-personal-management.js +139 -0
  359. package/dist/tools/definitions/telegram-personal-management.js.map +1 -0
  360. package/dist/tools/definitions/telegram-personal-restrictions.d.ts +19 -0
  361. package/dist/tools/definitions/telegram-personal-restrictions.js +109 -0
  362. package/dist/tools/definitions/telegram-personal-restrictions.js.map +1 -0
  363. package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
  364. package/dist/tools/definitions/telegram-pool-policy.js +56 -0
  365. package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
  366. package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
  367. package/dist/tools/definitions/touch-history-alias.js +99 -0
  368. package/dist/tools/definitions/touch-history-alias.js.map +1 -0
  369. package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
  370. package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
  371. package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
  372. package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
  373. package/dist/tools/definitions/trigger-argument.schema.js +23 -0
  374. package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
  375. package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
  376. package/dist/tools/definitions/trigger-claim-alias.js +90 -0
  377. package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
  378. package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
  379. package/dist/tools/definitions/trigger-echo-projection.js +41 -0
  380. package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
  381. package/dist/tools/definitions/trigger-upsert.tool.d.ts +41 -0
  382. package/dist/tools/definitions/trigger-upsert.tool.js +159 -0
  383. package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
  384. package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
  385. package/dist/tools/definitions/v15-port-descriptions.js +30 -0
  386. package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
  387. package/dist/tools/definitions/variables.d.ts +44 -0
  388. package/dist/tools/definitions/variables.js +310 -0
  389. package/dist/tools/definitions/variables.js.map +1 -0
  390. package/dist/tools/definitions/voice-action-input.d.ts +9 -0
  391. package/dist/tools/definitions/voice-action-input.js +141 -0
  392. package/dist/tools/definitions/voice-action-input.js.map +1 -0
  393. package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
  394. package/dist/tools/definitions/widget-customization-compat.js +23 -0
  395. package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
  396. package/dist/tools/definitions.d.ts +1134 -617
  397. package/dist/tools/definitions.js +63 -27
  398. package/dist/tools/definitions.js.map +1 -1
  399. package/dist/tools/description-localization.js +3 -2
  400. package/dist/tools/description-localization.js.map +1 -1
  401. package/dist/tools/follow-up-request.d.ts +19 -0
  402. package/dist/tools/follow-up-request.js +81 -0
  403. package/dist/tools/follow-up-request.js.map +1 -0
  404. package/dist/tools/followup-revision.d.ts +4 -0
  405. package/dist/tools/followup-revision.js +29 -0
  406. package/dist/tools/followup-revision.js.map +1 -0
  407. package/dist/tools/incomplete-list.js +4 -0
  408. package/dist/tools/incomplete-list.js.map +1 -1
  409. package/dist/tools/inventory.js +47 -11
  410. package/dist/tools/inventory.js.map +1 -1
  411. package/dist/tools/operation-recovery.d.ts +4 -0
  412. package/dist/tools/operation-recovery.js +33 -0
  413. package/dist/tools/operation-recovery.js.map +1 -0
  414. package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
  415. package/dist/tools/registry-mapping-primary.cases.js +765 -0
  416. package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
  417. package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
  418. package/dist/tools/registry-mapping-secondary.cases.js +626 -0
  419. package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
  420. package/dist/tools/registry-mapping.cases.d.ts +8 -0
  421. package/dist/tools/registry-mapping.cases.js +170 -0
  422. package/dist/tools/registry-mapping.cases.js.map +1 -0
  423. package/dist/tools/registry-test-fixtures.d.ts +50 -0
  424. package/dist/tools/registry-test-fixtures.js +120 -0
  425. package/dist/tools/registry-test-fixtures.js.map +1 -0
  426. package/dist/tools/registry.d.ts +2 -0
  427. package/dist/tools/registry.js +84 -52
  428. package/dist/tools/registry.js.map +1 -1
  429. package/dist/tools/result.d.ts +1 -0
  430. package/dist/tools/result.js +90 -22
  431. package/dist/tools/result.js.map +1 -1
  432. package/dist/tools/toolsets.d.ts +16 -0
  433. package/dist/tools/toolsets.js +25 -1
  434. package/dist/tools/toolsets.js.map +1 -1
  435. package/dist/types/api-contract.gen.d.ts +131892 -22453
  436. package/dist/utils/credential-signatures.d.ts +3 -0
  437. package/dist/utils/credential-signatures.js +10 -0
  438. package/dist/utils/credential-signatures.js.map +1 -0
  439. package/dist/utils/data-source-column-name.d.ts +10 -0
  440. package/dist/utils/data-source-column-name.js +36 -0
  441. package/dist/utils/data-source-column-name.js.map +1 -0
  442. package/dist/utils/logger.d.ts +1 -0
  443. package/dist/utils/logger.js +32 -8
  444. package/dist/utils/logger.js.map +1 -1
  445. package/dist/utils/secret-read-boundary.d.ts +2 -0
  446. package/dist/utils/secret-read-boundary.js +88 -0
  447. package/dist/utils/secret-read-boundary.js.map +1 -0
  448. package/dist/utils/setup-secrets.d.ts +4 -0
  449. package/dist/utils/setup-secrets.js +40 -0
  450. package/dist/utils/setup-secrets.js.map +1 -0
  451. package/docs/agent-models.md +9 -0
  452. package/docs/agent-usage-guide.full.ru.md +1 -4
  453. package/docs/analytics-contract.md +67 -0
  454. package/docs/async-operation-lifecycle.md +10 -3
  455. package/docs/connect.ru.md +144 -4
  456. package/docs/contact-company-profile.md +17 -0
  457. package/docs/contact-recommendations.md +7 -0
  458. package/docs/crm-stage-pool.md +73 -0
  459. package/docs/customer-data.md +61 -0
  460. package/docs/dialogue-reprocess.md +37 -0
  461. package/docs/edit-versions.md +36 -0
  462. package/docs/failure-semantics.md +17 -9
  463. package/docs/help-navigation.md +15 -42
  464. package/docs/host-compatibility-matrix.md +72 -93
  465. package/docs/host-setup.md +33 -35
  466. package/docs/invariants/public-api-and-contracts.md +16 -0
  467. package/docs/legacy-action-settings.md +21 -0
  468. package/docs/main-transfer-dependencies.md +38 -0
  469. package/docs/mcp2-parity.md +50 -0
  470. package/docs/modules/analytics.md +79 -0
  471. package/docs/modules/besales-mcp.md +144 -0
  472. package/docs/modules/dialog-review-report.md +38 -0
  473. package/docs/modules/dialogue-followup-adapters.md +39 -0
  474. package/docs/modules/message-reactions.md +17 -0
  475. package/docs/modules/network-mode.md +284 -0
  476. package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
  477. package/docs/pii-policy.md +21 -16
  478. package/docs/response-size-budget.md +197 -7
  479. package/docs/secret-read-boundary.md +102 -0
  480. package/docs/task-state.md +7 -2
  481. package/docs/telegram-personal-management.md +50 -0
  482. package/docs/telegram-personal-restrictions.md +87 -0
  483. package/docs/telegram-pool-policy.md +19 -0
  484. package/docs/tool-effects.md +15 -9
  485. package/docs/tool-surface.md +205 -4
  486. package/docs/voice-actions-and-inbox.md +95 -0
  487. package/docs/wazzup-instagram-comments.md +26 -0
  488. package/package.json +17 -10
  489. package/scripts/api-source-loader.spec.mjs +40 -0
  490. package/scripts/audit-bridge-controls.mjs +129 -0
  491. package/scripts/audit-revert-mutants.mjs +107 -0
  492. package/scripts/bridge-api-input.spec.mjs +98 -0
  493. package/scripts/bridge-controls-mutants.mjs +130 -0
  494. package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
  495. package/scripts/brx4-ledger-payload.spec.mjs +127 -0
  496. package/scripts/build-onprem.mjs +108 -0
  497. package/scripts/connect-clients.sh +141 -0
  498. package/scripts/connect-scopes.mjs +166 -0
  499. package/scripts/connect-scopes.spec.mjs +83 -0
  500. package/scripts/emit-personal-link-carrier.mjs +31 -0
  501. package/scripts/emit-setup-init-schemas.mjs +24 -0
  502. package/scripts/emit-tool-routes.mjs +878 -0
  503. package/scripts/emit-tool-routes.spec.mjs +300 -0
  504. package/scripts/followup-registry.spec.mjs +107 -0
  505. package/scripts/generate-crm-rotation-contract.mjs +98 -0
  506. package/scripts/generate-followup-session-contract.mjs +16 -0
  507. package/scripts/getcourse-text-source.spec.mjs +110 -0
  508. package/scripts/icp-import-verification/mutate.cjs +70 -0
  509. package/scripts/import-secret-read-contract.mjs +53 -0
  510. package/scripts/install-claude-desktop.js +1 -1
  511. package/scripts/lag-decisions.mjs +37 -0
  512. package/scripts/lag-decisions.spec.mjs +87 -0
  513. package/scripts/lag-open-task-owners.mjs +46 -0
  514. package/scripts/lag-open-task-owners.spec.mjs +78 -0
  515. package/scripts/lag-payload.mjs +10 -0
  516. package/scripts/legacy-action-lag.spec.mjs +22 -0
  517. package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
  518. package/scripts/mcpcompat-handler.mjs +34 -0
  519. package/scripts/mcpcompat-loader.mjs +36 -0
  520. package/scripts/mcpcompat-typescript.mjs +3 -0
  521. package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
  522. package/scripts/prbr-round1-recheck.spec.mjs +605 -0
  523. package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
  524. package/scripts/publish-mcp-registry.mjs +98 -0
  525. package/scripts/publish-mcp-registry.spec.mjs +68 -0
  526. package/scripts/record-scheduled-task-call.mjs +26 -0
  527. package/scripts/refusal-probe.mjs +17 -0
  528. package/scripts/refusal-probe.spec.mjs +29 -0
  529. package/scripts/registry-diff.mjs +502 -0
  530. package/scripts/registry-diff.spec.mjs +787 -0
  531. package/scripts/request-query.mjs +43 -0
  532. package/scripts/request-query.spec.mjs +82 -0
  533. package/scripts/route-lag.mjs +23 -0
  534. package/scripts/route-lag.spec.mjs +30 -0
  535. package/scripts/sample-args.mjs +174 -0
  536. package/scripts/sample-args.spec.mjs +160 -0
  537. package/scripts/shipped-definitions.mjs +197 -0
  538. package/scripts/shipped-definitions.spec.mjs +57 -0
  539. package/scripts/shipped-inputs.spec.mjs +136 -0
  540. package/scripts/shipped-recordings.spec.mjs +19 -0
  541. package/scripts/shipped-ref.d.mts +5 -0
  542. package/scripts/shipped-ref.mjs +20 -0
  543. package/scripts/shipped-ref.spec.mjs +59 -0
  544. package/scripts/shipped-registry.mjs +107 -0
  545. package/scripts/shipped-sample-candidates.mjs +69 -0
  546. package/scripts/shipped-sample-candidates.spec.mjs +117 -0
  547. package/scripts/shipped-sample.mjs +871 -0
  548. package/scripts/shipped-sample.spec.mjs +451 -0
  549. package/scripts/sync-agent-model-schemas.mjs +72 -0
  550. package/scripts/sync-api-contracts.mjs +85 -0
  551. package/scripts/sync-api-contracts.spec.mjs +144 -0
  552. package/scripts/sync-contract-ledger-schemas.mjs +161 -0
  553. package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
  554. package/scripts/sync-prompt-draft-schema.mjs +92 -0
  555. package/scripts/sync-route-map.mjs +94 -0
  556. package/scripts/sync-schema-descriptions.mjs +25 -0
  557. package/scripts/sync-tool-inventory.mjs +27 -0
  558. package/scripts/sync-trigger-argument-schema.mjs +97 -0
  559. package/scripts/sync-trigger-argument-schema.spec.mjs +91 -0
  560. package/scripts/sync-trigger-event-schema.mjs +20 -0
  561. package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
  562. package/scripts/sync-trigger-task-schema.mjs +45 -0
  563. package/scripts/sync-voice-actions-contract.mjs +67 -0
  564. package/scripts/sync-voice-actions-tools.mjs +97 -0
  565. package/scripts/sync-wave-id-schemas.mjs +55 -0
  566. package/scripts/telegram-personal-confirmation-mutants.mjs +74 -0
  567. package/scripts/tool-input-schemas.mjs +46 -0
  568. package/scripts/tool-input-schemas.spec.mjs +50 -0
  569. package/scripts/verify-followup-adapters.mjs +235 -0
  570. package/scripts/verify-secret-read-import.mjs +84 -0
  571. package/scripts/verify-secret-read-mutants.mjs +143 -0
  572. package/dist/tools/definitions/analytics.d.ts +0 -40
  573. package/dist/tools/definitions/analytics.js +0 -233
  574. package/dist/tools/definitions/analytics.js.map +0 -1
  575. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
  576. package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
  577. package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
  578. package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
  579. package/dist/tools/definitions/dialogue-audit.js +0 -292
  580. package/dist/tools/definitions/dialogue-audit.js.map +0 -1
  581. package/dist/tools/definitions/getcourse-wave.js +0 -519
  582. package/dist/tools/definitions/getcourse-wave.js.map +0 -1
  583. package/dist/tools/definitions/operational-overview.d.ts +0 -3
  584. package/dist/tools/definitions/operational-overview.js +0 -23
  585. package/dist/tools/definitions/operational-overview.js.map +0 -1
  586. package/dist/tools/definitions/scheduled-tasks.js +0 -173
  587. package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
  588. package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
  589. package/dist/tools/definitions/trigger-contact-claims.js +0 -60
  590. package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
  591. package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
  592. package/dist/tools/registry-mapping-cases-core.js +0 -963
  593. package/dist/tools/registry-mapping-cases-core.js.map +0 -1
  594. package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
  595. package/dist/tools/registry-mapping-cases-platform.js +0 -1052
  596. package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
  597. package/dist/tools/trigger-action-config.d.ts +0 -49
  598. package/dist/tools/trigger-action-config.js +0 -171
  599. package/dist/tools/trigger-action-config.js.map +0 -1
  600. package/docs/evals/model-behavior-scorecard.md +0 -80
  601. package/docs/operation-coverage.md +0 -114
  602. package/scripts/mock-credentials.js +0 -77
  603. package/scripts/model-eval-server.js +0 -213
  604. package/scripts/run-model-eval.js +0 -447
@@ -1,398 +1,67 @@
1
- # 10. Поведение агента (`AgentBehavior`)
1
+ # Поведение агента
2
2
 
3
- > **Источник правды:** `ai-aniomaly/docs/ai-prompt-builder/10-agent-behavior.md` — копия для MCP doc-bridge (v1.5 Increment 6b). Синкать при изменении оригинала.
4
- >
5
- > ⚠️ **MCP-контекст:** это доменная справка, написанная для людей/админ-UI. В MCP-сессии ты выполняешь те же операции **через besales_* tools**, а не через UI (drag-n-drop, клики в админке). Где текст ниже говорит «клиент/админ делает X через UI» — это «что должно получиться»; механику бери из tool (напр. загрузка файла → `besales_file_upload_request`; документ в knowledge → `besales_knowledge_document_upload`; сайт → `besales_knowledge_website_add`) + из workflow-ресурсов. Внутренние ссылки `[NN-name.md]` — относительные пути исходной доки, через MCP НЕ резолвятся: ищи `besales://docs/<slug>` или concept-resource.
3
+ `besales_behavior_update` принимает прежние имена полей поведения и переводит их в секции API v2:
4
+ `bot_greeting` → `greeting.text`, `ai_error_custom_message` → `errorHandling.custom_message`,
5
+ `message_filters` списком → `messageFilters.rules`. Прежние `fake_delay` и `message_open_delay`
6
+ задаются **в секундах**; мост умножает их на 1000 и отправляет поля `*_ms`. Если используешь
7
+ новые имена `*_ms`, передавай миллисекунды. Одновременная передача прежнего и нового имени одного
8
+ поля отклоняется с адресом поля. `go_offline` принимается, но не исполнялось и в прежней системе:
9
+ мост отбрасывает его и сообщает об этом в ответе.
6
10
 
7
- ## 1. Назначение
11
+ Поведение в Besales не хранится одним глобальным объектом. Оно складывается из конфигурации
12
+ агента, его привязки к конкретному каналу и `channel_behavior_configs`. Это важно для
13
+ multi-instance: два канала одного типа могут иметь разные режимы работы.
8
14
 
9
- `AgentBehavior` — это контейнер настроек, которые применяются **на уровне платформы** и влияют на всех её агентов. Он управляет:
10
- - Задержками перед ответом (имитация естественной коммуникации).
11
- - Скоростью «набора» сообщения.
12
- - Стратегией обработки медиа (картинки, видео, документы, аудио, ссылки).
13
- - Расписанием доступности оператора.
14
- - Фильтрами текста и приветственными кнопками.
15
- - Поведением при ошибках LLM.
15
+ ## Уровень агента
16
16
 
17
- Один `AgentBehavior` на `(workspaceId, platformId)`. AI-сервис создаёт его при настройке платформы.
17
+ На агенте живут базовый промпт, режим завершения хода, опубликованная версия, навыки, действия и
18
+ привязки к CRM-воронкам. Изменение агента не должно незаметно менять все каналы workspace.
18
19
 
19
- ## 2. JSON-схема (полная)
20
+ ## Уровень привязки агент × канал
20
21
 
21
- ```json
22
- {
23
- "id": "uuid",
24
- "platformId": "<platformId>",
25
- "workspaceId": "<workspaceId>",
22
+ Привязка определяет, может ли агент обслуживать канал, является ли он default-агентом и какие
23
+ проекции версии доступны этому каналу. Постобработчики также привязываются к паре агент × канал,
24
+ а не включаются одним флагом на агенте.
26
25
 
27
- "waitingAnswerTime": 10,
28
- "messageOpenDelay": 0,
29
- "fakeDelay": 0,
30
- "typingSpeed": "fast",
26
+ ## Уровень канала
31
27
 
32
- "canInterrupt": false,
33
- "messageDevide": false,
34
- "messageChunkSeparator": "",
28
+ Канал задаёт транспортные возможности и поведенческие правила: рабочее расписание, политику
29
+ операторской паузы, ограничения проактивных касаний, поддержку кнопок, подписи медиа и способ
30
+ передачи собственного файла. Отсутствующая настройка не должна угадываться по типу канала, если
31
+ контракт требует явного значения.
35
32
 
36
- "botGreeting": "Привет! Чем могу помочь?",
37
- "greetingFileId": null,
38
- "greetingButtons": [],
39
- "greetingButtonsKeyboardType": "INLINE",
33
+ Исходящая реплика всегда проходит единый шов доставки. Намерение отправки обязательно; гейты
34
+ могут доставить, подавить или вернуть доказанный/неоднозначный отказ. Побочные эффекты отправки
35
+ возникают только после доказанной доставки.
40
36
 
41
- "popupDelaySeconds": 0,
37
+ ## Оператор и эскалация
42
38
 
43
- "messageFilters": [],
39
+ Передача оператору и реплика оператора — разные события. Доставленная реплика оператора ставит
40
+ агента на паузу по настройке канала; массовая рассылка такой паузы не создаёт. Правила handoff
41
+ задаются условиями общего condition-core, отдельный язык условий заводить нельзя.
44
42
 
45
- "operatorSchedule": null,
46
- "operatorUnavailableMessage": null,
47
- "botWaitingReturn": 3,
48
- "followUpWaitingReturn": -1,
43
+ В `besales_behavior_update.operator_schedule.bot_waiting_return_hours` значение `-1` отключает
44
+ паузу после оператора, `0` оставляет её до ручного снятия, положительное значение задаёт часы.
45
+ Отсутствие этой паузы само по себе не доказывает, что остальные гейты разрешают ответ.
49
46
 
50
- "imageHandlingBehavior": "SILENT",
51
- "imageFixedResponseText": null,
52
- "shouldCallOperatorWithImage": true,
53
- "imageOperatorComment": null,
47
+ В `media_handling` режим `PROCESS_WITH_LLM` различается по типу: изображение передаётся модели
48
+ зрения, у видео читается только подпись или текст сообщения, у документа — извлечённый текст,
49
+ а не сам файл. Для `audio` доступны только `SILENT` и `FIXED_RESPONSE`.
50
+ Длинный документ усекается с предупреждением. Если текст извлечь нельзя, модель получает
51
+ причину; оператор вызывается по настройке `call_operator`. Включение разбора изображения или
52
+ документа требует `explicit_confirmation`.
54
53
 
55
- "videoHandlingBehavior": "SILENT",
56
- "videoFixedResponseText": null,
57
- "shouldCallOperatorWithVideo": true,
58
- "videoOperatorComment": null,
54
+ Неподдержанное содержимое Telegram настраивается через `besales_behavior_update`, секция
55
+ `unsupported_input_handling`: `SILENT`, `AS_TEXT` или `FIXED_RESPONSE`. Вызов оператора — отдельный
56
+ флаг. Комбинация `SILENT + call_operator` сохраняет безопасную заглушку для однократности, зовёт
57
+ оператора и завершает ход до агента, ничего не отправляя клиенту. Секция сливается с текущей;
58
+ первую запись присылай полной, а `schema_version` инструмент добавляет сам.
59
59
 
60
- "documentHandlingBehavior": "SILENT",
61
- "documentFixedResponseText": null,
62
- "shouldCallOperatorWithDocument": true,
63
- "documentOperatorComment": null,
60
+ ## Проверка перед запуском
64
61
 
65
- "audioHandlingBehavior": "SILENT",
66
- "audioFixedResponseText": null,
67
- "shouldCallOperatorWithAudio": true,
68
- "audioOperatorComment": null,
69
-
70
- "urlHandlingBehavior": "PASS_THROUGH",
71
- "urlFixedResponseText": null,
72
- "shouldCallOperatorWithUrl": false,
73
- "urlOperatorComment": null,
74
-
75
- "aiErrorHandlingBehavior": "SILENT",
76
- "aiErrorCustomMessage": null,
77
- "shouldCallOperatorWithError": false,
78
- "aiErrorTargetStageId": null,
79
-
80
- "skipTaskCreationOnCallOperator": false,
81
- "anonymizationEnabled": false,
82
- "contactNamePersonalizationMode": "OFF",
83
- "anonymizationDisabledTypes": [],
84
-
85
- "goOffline": "0"
86
- }
87
- ```
88
-
89
- ## 3. Задержки и скорость
90
-
91
- | Поле | Единицы | Дефолт | Описание |
92
- |---|---|---|---|
93
- | `waitingAnswerTime` | секунды | 10 | Сколько ждать перед запуском LLM. Помогает дождаться нескольких сообщений подряд (если пользователь пишет очередью). 0–300. |
94
- | `messageOpenDelay` | секунды | 0 | Только для **Telegram Personal**: пауза после отметки «прочитано» до начала имитации набора. 0–60. |
95
- | `fakeDelay` | секунды | 0 | Дополнительная задержка-обманка перед отправкой ответа. 0–60. |
96
- | `typingSpeed` | enum | `fast` | Скорость имитации набора: `fast` / `middle` / `slow`. |
97
- | `canInterrupt` | bool | false | Можно ли прерывать генерацию при новом сообщении пользователя. |
98
-
99
- ### Эффективная задержка ответа
100
-
101
- Для Telegram Personal: `waitingAnswerTime` + `messageOpenDelay` + (время LLM-генерации) + `fakeDelay` + (имитация набора по `typingSpeed`).
102
-
103
- Для остальных платформ: `waitingAnswerTime` + (время LLM-генерации) + `fakeDelay`.
104
-
105
- ## 4. Разделение и форматирование сообщения
106
-
107
- | Поле | Дефолт | Описание |
108
- |---|---|---|
109
- | `messageDevide` | false | Если `true` — длинный ответ агента разделяется на чанки по `messageChunkSeparator`. |
110
- | `messageChunkSeparator` | `""` | Разделитель чанков (например, `%%%`). LLM кладёт его в ответ, бэк разбивает по нему. |
111
-
112
- ### Пример
113
-
114
- `messageDevide=true`, `messageChunkSeparator="%%%"`. LLM сгенерировал:
115
-
116
- ```
117
- Здравствуйте, Иван!%%%Конечно, помогу с заказом.%%%Какой товар вас интересует?
118
- ```
119
-
120
- Будет отправлено 3 отдельных сообщения.
121
-
122
- ## 5. Фильтры текста (`messageFilters`)
123
-
124
- Замены, применяемые к **исходящим сообщениям** перед отправкой:
125
-
126
- ```json
127
- "messageFilters": [
128
- {
129
- "id": "uuid",
130
- "source": "магазин",
131
- "target": "наш магазин",
132
- "enabled": true,
133
- "order": 1
134
- },
135
- {
136
- "id": "uuid",
137
- "source": "https://(.+)\\.example\\.com",
138
- "target": "https://$1.example.ru",
139
- "enabled": true,
140
- "order": 2
141
- }
142
- ]
143
- ```
144
-
145
- | Поле | Описание |
146
- |---|---|
147
- | `source` | Текст или регэксп для поиска. |
148
- | `target` | На что заменить (можно использовать `$1`, `$2` для regex-групп). |
149
- | `enabled` | Можно отключить без удаления. |
150
- | `order` | Порядок применения. |
151
-
152
- **Лимит:** до **20** правил.
153
-
154
- **Зачем:** убрать упоминания внутренней терминологии, заменить домены, нормализовать тон.
155
-
156
- ## 6. Приветственные кнопки (`greetingButtons`)
157
-
158
- > **MCP-операторам:** по умолчанию приветствие — **без кнопок** (живой текст `botGreeting`). `greetingButtons` — opt-in: добавляй ТОЛЬКО по явному запросу пользователя (кнопки дают menu-feel, противоречат принципу «звучит как человек»). На создании агента ставится только `bot_greeting`; остальной behavior — позже.
159
-
160
- Кнопки, которые отправляются **с приветственным сообщением** (`botGreeting` или `greetingFileId`):
161
-
162
- ```json
163
- "greetingButtons": [
164
- { "id": "uuid", "label": "Каталог", "text": "Покажи каталог", "order": 1 },
165
- { "id": "uuid", "label": "Доставка", "text": "Расскажи о доставке", "order": 2 },
166
- { "id": "uuid", "label": "Оператор", "text": "Хочу оператора", "order": 3 }
167
- ]
168
- ```
169
-
170
- | Поле | Описание |
171
- |---|---|
172
- | `label` | Текст на кнопке (≤20 символов). |
173
- | `text` | Что отправляется при нажатии (для `REPLY` keyboard) или `callback_data` (для `INLINE`). |
174
- | `order` | Порядок. |
175
-
176
- **Лимит:** до **10** кнопок.
177
-
178
- `greetingButtonsKeyboardType` — `INLINE` (под сообщением) или `REPLY` (вместо клавиатуры). Поддерживается на: Telegram Bot, VK, Salebot, Wazzup, Instagram, WebWidget.
179
-
180
- `greetingFileId` — `StoredFile.id` для приветственного аудио/картинки/видео.
181
-
182
- `popupDelaySeconds` — для **Web Widget**: задержка показа popup-сообщения в свёрнутом виджете (0 = отключено).
183
-
184
- ## 7. Расписание оператора
185
-
186
- ```json
187
- "operatorSchedule": {
188
- "enabled": true,
189
- "availability": {
190
- "monday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
191
- "tuesday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
192
- "wednesday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
193
- "thursday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
194
- "friday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
195
- "saturday": { "active": false, "startTime": null, "endTime": null },
196
- "sunday": { "active": false, "startTime": null, "endTime": null }
197
- }
198
- },
199
- "operatorUnavailableMessage": "Сейчас оператор недоступен. Мы работаем по будням с {startTime} до {endTime}."
200
- ```
201
-
202
- Если `enabled=true` и текущее время вне расписания — `call_operator` будет отвечать `operatorUnavailableMessage` (с подстановкой `{startTime}`/`{endTime}` из текущего дня).
203
-
204
- ## 8. Возврат бота после оператора
205
-
206
- | Поле | Дефолт | Описание |
207
- |---|---|---|
208
- | `botWaitingReturn` | 3 | Сколько часов бот молчит после сообщения оператора. Допустимые: `-1`, `0`, `1`, `3`, `6`, `12`, `24`. `-1` = ответ оператора вообще не отключает бота, `0` = до команды `/start`. |
209
- | `followUpWaitingReturn` | -1 | На сколько часов отключить follow-up после оператора. `-1` = не отключать, `0` = навсегда, `1`–`24` — часы. |
210
- | `skipTaskCreationOnCallOperator` | false | Если `true` — при `call_operator` система **только** меняет ответственного на оператора, без постановки задачи в CRM. Полезно, когда workflow в CRM ведётся через статусы воронки, а не через task'ы, и лишние «висящие» задачи на оператора засоряют его список дел. |
211
- | `anonymizationEnabled` | false | Обратимая PII-анонимизация LLM-пайплайна (per-platform). Если `true` — реальные имя/телефон/email клиента вырезаются из сообщений перед отправкой в LLM (заменяются токенами) и подставляются обратно в ответе и в аргументах tool-call (например, поля CRM). Ставится через секцию `privacy: { anonymization_enabled }` в `besales_behavior_update`. |
212
- | `contactNamePersonalizationMode` | `OFF` | Режим безопасного обращения по подтверждённому имени: `OFF`, `SHADOW` или `ENABLED`. Реальное имя остаётся скрытым; модель получает только стабильный semantic token. Ставится через `privacy: { contact_name_personalization_mode }`. |
213
- | `anonymizationDisabledTypes` | `[]` | OFF-список прочих PII, которые при включённой анонимизации осознанно отдаются модели реальными. Имена/фамилии/отчества выключить нельзя. Значения: `PHONE`/`EMAIL`/`INN`/`PASSPORT`/`CARD`/`DATE_OF_BIRTH`/`ACCOUNT`/`SNILS`/`OGRN`/`OGRNIP`/`SOCIAL_ID`. Ставится через `privacy: { anonymization_disabled_types }`. |
214
-
215
- ## 9. Обработка медиа от пользователя
216
-
217
- Для каждого типа медиа задаётся:
218
- - **`*HandlingBehavior`** — что делать с медиа.
219
- - **`*FixedResponseText`** — текст для `FIXED_RESPONSE` режима.
220
- - **`shouldCallOperatorWith*`** — вызывать ли оператора при получении.
221
- - **`*OperatorComment`** — комментарий для оператора.
222
-
223
- ### Изображения (`ImageHandlingBehavior`)
224
-
225
- ```json
226
- {
227
- "imageHandlingBehavior": "PROCESS_WITH_LLM",
228
- "imageFixedResponseText": null,
229
- "shouldCallOperatorWithImage": false,
230
- "imageOperatorComment": null
231
- }
232
- ```
233
-
234
- | Значение | Что делает |
235
- |---|---|
236
- | `SILENT` | Промолчать (default). |
237
- | `PROCESS_WITH_LLM` | Запустить vision-модель (gpt-4.1-mini) и интерпретировать изображение в текст для LLM. |
238
- | `FIXED_RESPONSE` | Отправить фиксированный текст из `imageFixedResponseText`. |
239
-
240
- `PROCESS_WITH_LLM` есть у трёх типов из четырёх, и механика у каждого СВОЯ: изображение уходит в vision-модель; у **видео** обрабатывается **подпись (caption)** как обычный текст (само видео не отправляется, нет подписи → оператор; Telegram Bot/Personal, Wazzup, VK, Bitrix24Bot, Salebot, GetCourse — на Avito/Instagram видео → оператор); у **документа** обрабатывается **извлечённый текст файла** (сам файл не отправляется). У **аудио** этого значения нет вовсе — только `SILENT` или `FIXED_RESPONSE`.
241
-
242
- ### Видео / Документы / Аудио (`VideoHandlingBehavior`, `DocumentHandlingBehavior`, `AudioHandlingBehavior`)
243
-
244
- `AudioHandlingBehavior` имеет только `SILENT` / `FIXED_RESPONSE`. `VideoHandlingBehavior` и `DocumentHandlingBehavior` дополнительно поддерживают `PROCESS_WITH_LLM`:
245
-
246
- | Значение | Что делает |
247
- |---|---|
248
- | `SILENT` | Промолчать (default). |
249
- | `FIXED_RESPONSE` | Отправить фиксированный текст из соответствующего `*FixedResponseText`. |
250
- | `PROCESS_WITH_LLM` *(video)* | Обработать **подпись** видео как текст через LLM (само видео не отправляется; нет подписи → оператор; Telegram/Wazzup/VK/Bitrix24/Salebot/GetCourse, кроме Avito/Instagram). |
251
- | `PROCESS_WITH_LLM` *(document)* | Извлечь текст файла (PDF, DOCX, DOC, XLSX, XLS, CSV, TSV, TXT, MD) и обработать как обычное сообщение. Сам файл в модель не отправляется. Длинный документ передаётся не целиком — модель предупреждается об усечении. Скан без текстового слоя, неподдерживаемый формат и файл >20 МБ → оператор. На Avito документ приходит голой ссылкой: без расширения в ней разбор невозможен → оператор. |
252
-
253
- ```json
254
- {
255
- "videoHandlingBehavior": "FIXED_RESPONSE",
256
- "videoFixedResponseText": "Извините, я пока не умею смотреть видео. Опишите, пожалуйста, словами.",
257
- "shouldCallOperatorWithVideo": true,
258
- "videoOperatorComment": "Клиент прислал видео — нужно посмотреть."
259
- }
260
- ```
261
-
262
- ### Голосовые сообщения (Whisper-транскрипция)
263
-
264
- ⚠️ **Голос ≠ аудиофайл.** `AudioHandlingBehavior` (выше) применяется только к **аудиофайлам** (`.mp3 / .m4a / .wav / .aac / ...`). **Голосовые сообщения** (Telegram `voice` / `video_note`; на остальных платформах — медиа с расширением `.opus / .oga / .ogg / .webm`) обрабатываются отдельно: они **автоматически транскрибируются** через OpenAI Whisper, и распознанный текст уходит в LLM как обычное сообщение.
265
-
266
- - **Включено по умолчанию, без отдельного тумблера** в `AgentBehavior` — транскрипция голоса работает на всех **9 платформах** (Telegram, TelegramPersonal, Instagram, Avito, VKon, Wazzup, Salebot, Bitrix24Bot, GetCourse). Разделение voice/audio — по расширению файла (утилита `inferAudioKindFromUrl`).
267
- - **Лимит размера — 20 MB** (`MAX_TRANSCRIBE_FILE_SIZE_BYTES`, с запасом ниже 25 MB-лимита Whisper). Файл больше → транскрипция не делается, в LLM уходит плейсхолдер `[Файл слишком большой для транскрибации (XMB > 20MB)]`.
268
- - Если речь не распознана → `[Речь не распознана]`. Стоимость расшифровки пишется в AI-леджер как операция `WHISPER_TRANSCRIPTION` (модель `whisper-1`).
269
- - Язык можно подсказать Whisper (ISO 639-1) — обычно совпадает с языком агента.
270
-
271
- > То есть `audioHandlingBehavior: SILENT` заглушит только присланные **аудиофайлы**; голосовые всё равно будут расшифрованы и обработаны LLM. Полное описание пайплайна — в [`docs/modules/transcription.md`](../modules/transcription.md).
272
-
273
- ### Ссылки
274
-
275
- ```json
276
- {
277
- "urlHandlingBehavior": "PROCESS_WITH_CRAWLER",
278
- "urlFixedResponseText": null,
279
- "shouldCallOperatorWithUrl": false,
280
- "urlOperatorComment": null
281
- }
282
- ```
283
-
284
- | `urlHandlingBehavior` | Что делает |
285
- |---|---|
286
- | `PASS_THROUGH` | Передать ссылку как есть в LLM (default). |
287
- | `SILENT` | Игнорировать. |
288
- | `FIXED_RESPONSE` | Отправить фиксированный текст. |
289
- | `PROCESS_WITH_CRAWLER` | Скачать страницу через web-crawler и положить контент в контекст LLM. |
290
-
291
- ## 10. Обработка ошибок LLM
292
-
293
- ```json
294
- {
295
- "aiErrorHandlingBehavior": "SEND_ERROR_MESSAGE",
296
- "aiErrorCustomMessage": "Прошу прощения, у меня сейчас технические сложности. Передаю вас оператору.",
297
- "shouldCallOperatorWithError": true,
298
- "aiErrorTargetStageId": 999
299
- }
300
- ```
301
-
302
- | Поле | Описание |
303
- |---|---|
304
- | `aiErrorHandlingBehavior` | `SILENT` (default) или `SEND_ERROR_MESSAGE`. |
305
- | `aiErrorCustomMessage` | Текст для `SEND_ERROR_MESSAGE`. |
306
- | `shouldCallOperatorWithError` | Если `true` — автоматически вызывать оператора. |
307
- | `aiErrorTargetStageId` | Куда перевести лид при ошибке (`null` = на первый этап текущей воронки). |
308
-
309
- ## 11. Inline-пример: типичная конфигурация для Telegram-бота
310
-
311
- ```json
312
- {
313
- "platformId": "<platformId>",
314
- "workspaceId": "<workspaceId>",
315
-
316
- "waitingAnswerTime": 15,
317
- "fakeDelay": 3,
318
- "typingSpeed": "middle",
319
-
320
- "messageDevide": true,
321
- "messageChunkSeparator": "%%%",
322
-
323
- "botGreeting": "Здравствуйте! Я Анна, помогу с выбором цветов и оформлением заказа.",
324
- "greetingButtons": [
325
- { "label": "Каталог", "text": "Покажи каталог букетов", "order": 1 },
326
- { "label": "Доставка", "text": "Расскажи про доставку", "order": 2 },
327
- { "label": "Связаться с менеджером", "text": "Хочу с менеджером", "order": 3 }
328
- ],
329
- "greetingButtonsKeyboardType": "INLINE",
330
-
331
- "messageFilters": [
332
- { "source": "ChatGPT", "target": "наш ассистент", "enabled": true, "order": 1 }
333
- ],
334
-
335
- "operatorSchedule": {
336
- "enabled": true,
337
- "availability": {
338
- "monday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
339
- "tuesday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
340
- "wednesday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
341
- "thursday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
342
- "friday": { "active": true, "startTime": "09:00", "endTime": "19:00" },
343
- "saturday": { "active": true, "startTime": "10:00", "endTime": "18:00" },
344
- "sunday": { "active": false, "startTime": null, "endTime": null }
345
- }
346
- },
347
- "operatorUnavailableMessage": "Сейчас оператор отдыхает 🌙. Я отвечу или передам ему сообщение, как только он подключится.",
348
-
349
- "botWaitingReturn": 3,
350
- "followUpWaitingReturn": 12,
351
-
352
- "imageHandlingBehavior": "PROCESS_WITH_LLM",
353
- "shouldCallOperatorWithImage": false,
354
-
355
- "videoHandlingBehavior": "FIXED_RESPONSE",
356
- "videoFixedResponseText": "К сожалению, я пока не работаю с видео. Опишите словами или пришлите фото.",
357
- "shouldCallOperatorWithVideo": true,
358
-
359
- "documentHandlingBehavior": "FIXED_RESPONSE",
360
- "documentFixedResponseText": "Спасибо за документ! Передаю менеджеру для проверки.",
361
- "shouldCallOperatorWithDocument": true,
362
-
363
- "urlHandlingBehavior": "PROCESS_WITH_CRAWLER",
364
-
365
- "aiErrorHandlingBehavior": "SEND_ERROR_MESSAGE",
366
- "aiErrorCustomMessage": "Прошу прощения, минутка технических сложностей. Сейчас приглашу менеджера.",
367
- "shouldCallOperatorWithError": true
368
- }
369
- ```
370
-
371
- ## 12. Граничные случаи и валидация
372
-
373
- | Правило | Что AI-сервису помнить |
374
- |---|---|
375
- | Один `AgentBehavior` на платформу | Не пытаться создать два — конфликт по `(workspaceId, platformId)`. |
376
- | `waitingAnswerTime` 0–300 сек | Большее значение = пользователь дольше ждёт ответа. |
377
- | `messageOpenDelay` только для Telegram Personal | На обычных Telegram Bot ничего не даёт. |
378
- | `messageDevide=true` без `messageChunkSeparator` | Не работает — нужен явный разделитель. |
379
- | LLM должен знать про `messageChunkSeparator` | Если включаете `messageDevide`, добавьте в `baseSystemPrompt` инструкцию: «Когда нужно разделить ответ на части, ставь между частями `%%%`». |
380
- | `audioHandlingBehavior=PROCESS_WITH_LLM` | Такого значения нет — только `SILENT` или `FIXED_RESPONSE`, иначе 400. У image/video/document разбор есть, но механика у каждого своя (vision / подпись / текст файла). |
381
- | `urlHandlingBehavior=PROCESS_WITH_CRAWLER` | Может тормозить (внешний запрос). Не включать массово. |
382
- | `messageFilters` — до 20 правил | Применяются по `order`. |
383
- | `greetingButtons` — до 10 кнопок | Платформенный лимит. |
384
- | `botWaitingReturn=0` | Бот не вернётся автоматически — нужно явное `/start` от оператора. |
385
- | `botWaitingReturn=-1` | Бот отвечает поверх оператора — берут в суфлёрских/квалификационных каналах. Стадию CRM «оператор перехватил» настройка НЕ отменяет: если у этой стадии выключен `isBotActive`, бот всё равно замолчит по стадийному гейту. |
386
- | `operatorSchedule.enabled=false` | Оператор «всегда доступен» — не блокировать `call_operator`. |
387
- | `aiErrorTargetStageId=null` | Не критично — система переведёт на первый этап. |
388
- | `skipTaskCreationOnCallOperator=true` | Только смена ответственного, без постановки задачи в CRM (для AmoCRM/Bitrix24). |
389
-
390
- ## 13. Связь с другими подсистемами
391
-
392
- | Подсистема | Связь |
393
- |---|---|
394
- | **Агенты** ([`01-agents.md`](01-agents.md)) | `AgentBehavior` влияет на всех агентов платформы. |
395
- | **Платформа** ([`11-platforms.md`](11-platforms.md)) | Один `AgentBehavior` на платформу. |
396
- | **Триггеры** ([`04-triggers-and-actions.md`](04-triggers-and-actions.md)) | `CALL_OPERATOR` использует `operatorSchedule`. |
397
- | **Follow-up** ([`08-follow-up.md`](08-follow-up.md)) | `followUpWaitingReturn` отключает follow-up после оператора. |
398
- | **Файлы** | `greetingFileId` — `StoredFile`. |
62
+ - опубликована версия агента;
63
+ - агент привязан к нужному каналу;
64
+ - выбран корректный default там, где он нужен;
65
+ - настроены знания, CRM и действия, на которые ссылается промпт;
66
+ - песочница проходит через те же runtime-гейты, что production;
67
+ - нет секретов, внутренних UUID и противоречащих друг другу инструкций.
@@ -1,20 +1,13 @@
1
1
  # Рассылки и кампании
2
2
 
3
- ## Подготовка
3
+ Mailing variant хранит текст, schedule — правило отбора и время, launch/run — запуск, cohort —
4
+ снимок аудитории. Фактически доступные операции сверяй с `besales://docs/tools-catalog`.
4
5
 
5
- Разделяй сущности: mailing variant хранит текст, schedule — правило отбора и время, launch/run —
6
- конкретный запуск, cohort — снимок аудитории запуска. Доступный набор операций всегда сверяй с
7
- `besales://docs/tools-catalog`.
6
+ `besales_broadcast_analytics_get` — канонический исходящий отчёт;
7
+ `besales_broadcast_cohorts_list` — запуски. Сохраняй оси cohort/period/entry и зерно
8
+ recipient/channel. Не считай сообщения людьми и не подменяй входящую аналитику исходящей.
8
9
 
9
- ## Аналитика
10
-
11
- `besales_broadcast_analytics_get` — канонический исходящий отчёт; `besales_broadcast_cohorts_list`
12
- — перечень запусков. Сохраняй оси cohort/period/entry и зерно recipient/channel. Не считай число
13
- сообщений числом людей и не выдавай исходящую аналитику за входящую.
14
-
15
- ## Запись и запуск
16
-
17
- Если линия предоставляет mailing/schedule tools, сначала создай выключенную конфигурацию, затем
18
- получи preview, проверь ограничения, окно, каналы и дедуп, и только после явного подтверждения
19
- включай или запускай. При pause/timeout/UNKNOWN сначала читай run/status; повтор может написать
20
- человеку второй раз.
10
+ Через `besales_broadcast_schedule_preview` проверь ограничения, окно, каналы и дедуп, затем
11
+ сохрани расписание выключенным (`besales_broadcast_schedule_upsert`, `is_enabled=false`). Перед
12
+ включением или живым запуском получи явное подтверждение. При pause/timeout/UNKNOWN сначала читай
13
+ run/status: повторная отправка может написать человеку второй раз.