@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,291 +1,40 @@
1
+ import { withEditVersionInstructions, editVersionInstruction } from './edit-version.js';
2
+ import { setupInitOperationIdSchema } from './setup-init-operation.schema.js';
1
3
  import { z } from 'zod';
2
4
  import { assertCompleteList } from '../incomplete-list.js';
3
- import { MAX_FILE_UPLOAD_BYTES, VARIABLES_MAX_PAGE_SIZE, apiKeyPlatformTypeSchema, buildFileListQuery, buildVariableListQuery, buildVariableScopeQuery, compactObject, crmFieldMappingItemSchema, defineTool, mcpFileSourceSchema, oauthPlatformTypeSchema, optionalAnyObjectSchema, provisionableCrmTypeSchema, storedFileTypeSchema, uuidSchema, withInstructions, } from './shared.js';
4
- /** Подсказка про повторное значение константы — одна для создания и правки. */
5
- const REPEAT_CONSTANT_VALUE_INSTRUCTION = 'repeat_constant_value подставляется вместо constant_value человеку, которому мы уже писали, — только в холодных рассылках (например, {intro}: «это снова Светлана.» вместо полного представления). Только константы CHANNEL; фигурные скобки запрещены; пустая строка или null очищает — тогда повтору уходит constant_value.';
5
+ import { CRM_PIPELINES_MAX_PAGE_SIZE, MAX_FILE_UPLOAD_BYTES, apiKeyPlatformTypeSchema, buildFileListQuery, compactObject, crmFieldMappingItemSchema, defineTool, mcpFileSourceSchema, oauthPlatformTypeSchema, optionalAnyObjectSchema, provisionableCrmTypeSchema, storedFileTypeSchema, uuidSchema, withInstructions, } from './shared.js';
6
+ export const CRM_OPERATOR_CHANGE_FIELDS = ['is_operator', 'is_sdr', 'workspace_member_id'];
6
7
  export const crmPlatformTools = [
7
- // ============================================================
8
- // v1.5 Increment 4a — Unified Variables API (5 tools, v2-shaped scope discriminator)
9
- // ============================================================
10
- // Backend wraps two v1 tables (WorkspaceVariable + CustomVariable) под единый MCP shape.
11
- // При v2 cutover (spec 23) обе таблицы → один `variables` с тем же `scope` discriminator —
12
- // MCP shape работает без изменений.
13
8
  defineTool({
14
- name: 'besales_variable_list',
9
+ name: 'besales_crm_bitrix24_deal_tab_get',
15
10
  sideEffect: 'none',
16
- closedWorld: true,
17
- requiredFields: ['scope'],
18
- defaultWorkspaceId: true,
19
- // По этому перечню строят условия правил. Отсутствующая в усечённом списке переменная
20
- // неотличима от «значение не проставлено», и правило получается недостижимым.
21
- resultPolicy: { neverTruncate: true },
22
- schema: z
23
- .object({
24
- workspace_id: uuidSchema.optional(),
25
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
26
- platform_id: uuidSchema.optional(),
27
- filter: z.enum(['all', 'variables', 'constants']).optional(),
28
- // ⚠️ Без дефолта. Сервер СВОЙ дефолт имеет (50), и до появления этих двух ручек
29
- // перечень молча обрывался на пятидесятой строке, а способа дочитать не было вовсе.
30
- limit: z.number().int().min(1).max(VARIABLES_MAX_PAGE_SIZE).optional(),
31
- cursor: z.string().min(1).optional(),
32
- })
33
- .strict()
34
- .superRefine((input, ctx) => {
35
- if (input.scope === 'CHANNEL' && !input.platform_id) {
36
- ctx.addIssue({
37
- code: z.ZodIssueCode.custom,
38
- message: 'platform_id is required when scope=CHANNEL',
39
- path: ['platform_id'],
40
- });
41
- }
42
- if (input.scope === 'WORKSPACE' && input.platform_id) {
43
- ctx.addIssue({
44
- code: z.ZodIssueCode.custom,
45
- message: 'platform_id is forbidden when scope=WORKSPACE',
46
- path: ['platform_id'],
47
- });
48
- }
49
- }),
11
+ requiredFields: ['crm_id'],
12
+ schema: z.object({ crm_id: uuidSchema }).strict(),
50
13
  createRequest: (input) => ({
51
14
  method: 'GET',
52
- path: `/workspaces/${input.workspace_id}/variables${buildVariableListQuery(input.scope, input.platform_id, input.filter, input.limit, input.cursor)}`,
15
+ path: `/crm-connections/${input.crm_id}/bitrix24/deal-tab`,
53
16
  }),
54
- enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
55
- // Страницу попросили явно — отказ неуместен: постраничный обход это и есть.
56
- pageRequested: input.limit !== undefined || input.cursor !== undefined,
57
- toolName: 'besales_variable_list',
58
- howToPage: `Позовите снова с limit (до ${VARIABLES_MAX_PAGE_SIZE}) и продолжайте по nextCursor, пока он не станет пустым.`,
59
- }), [
60
- 'WORKSPACE scope возвращает глобальные переменные workspace; CHANNEL — переменные указанной платформы.',
61
- 'CHANNEL требует platform_id; filter=variables исключает константы, filter=constants оставляет только их.',
62
- 'nextCursor в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
17
+ enhanceResponse: (response) => withInstructions(response, [
18
+ 'Состояние последней регистрации вкладки AI Агенты. BOUND подтверждено placement.get на checkedAt; отсутствие поля не означает работающую вкладку.',
19
+ 'FAILED: объясни причину человеческим языком; reason оставь только для диагностики. При нехватке области placement попроси добавить её, при нехватке прав — выдать права на регистрацию приложений. UNKNOWN означает неопределённый исход: сервер сначала проверяет прежнюю попытку, повтор не обещает новую отправку.',
63
20
  ]),
64
21
  }),
65
22
  defineTool({
66
- name: 'besales_variable_create',
23
+ name: 'besales_crm_bitrix24_deal_tab_register',
67
24
  sideEffect: 'write',
68
- closedWorld: true,
69
- requiredFields: ['scope', 'name', 'type'],
70
- defaultWorkspaceId: true,
25
+ requiredFields: ['crm_id', 'acknowledge_external_side_effect'],
71
26
  schema: z
72
- .object({
73
- workspace_id: uuidSchema.optional(),
74
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
75
- name: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
76
- message: 'name must be ASCII letters/digits/underscores; start with letter or _',
77
- }),
78
- description: z.string().optional(),
79
- type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']),
80
- // WORKSPACE-only
81
- value: z.string().optional(),
82
- // CHANNEL-only
83
- platform_id: uuidSchema.optional(),
84
- is_constant: z.boolean().optional(),
85
- constant_value: z.string().optional(),
86
- repeat_constant_value: z.string().optional(),
87
- })
88
- .strict()
89
- .superRefine((input, ctx) => {
90
- if (input.scope === 'WORKSPACE') {
91
- if (input.platform_id) {
92
- ctx.addIssue({
93
- code: z.ZodIssueCode.custom,
94
- message: 'platform_id is forbidden when scope=WORKSPACE',
95
- path: ['platform_id'],
96
- });
97
- }
98
- if (input.is_constant !== undefined ||
99
- input.constant_value !== undefined ||
100
- input.repeat_constant_value !== undefined) {
101
- ctx.addIssue({
102
- code: z.ZodIssueCode.custom,
103
- message: 'is_constant, constant_value and repeat_constant_value are forbidden when scope=WORKSPACE',
104
- path: ['is_constant'],
105
- });
106
- }
107
- }
108
- else {
109
- // CHANNEL
110
- if (!input.platform_id) {
111
- ctx.addIssue({
112
- code: z.ZodIssueCode.custom,
113
- message: 'platform_id is required when scope=CHANNEL',
114
- path: ['platform_id'],
115
- });
116
- }
117
- if (input.value !== undefined) {
118
- ctx.addIssue({
119
- code: z.ZodIssueCode.custom,
120
- message: 'value is forbidden when scope=CHANNEL — use constant_value if isConstant=true',
121
- path: ['value'],
122
- });
123
- }
124
- if (input.is_constant === true && !input.constant_value) {
125
- ctx.addIssue({
126
- code: z.ZodIssueCode.custom,
127
- message: 'constant_value is required when scope=CHANNEL and is_constant=true',
128
- path: ['constant_value'],
129
- });
130
- }
131
- if (input.is_constant !== true && input.repeat_constant_value !== undefined) {
132
- ctx.addIssue({
133
- code: z.ZodIssueCode.custom,
134
- message: 'repeat_constant_value is allowed only when scope=CHANNEL and is_constant=true',
135
- path: ['repeat_constant_value'],
136
- });
137
- }
138
- }
139
- }),
27
+ .object({ crm_id: uuidSchema, acknowledge_external_side_effect: z.literal(true) })
28
+ .strict(),
140
29
  createRequest: (input) => ({
141
30
  method: 'POST',
142
- path: `/workspaces/${input.workspace_id}/variables`,
143
- body: compactObject({
144
- scope: input.scope,
145
- name: input.name,
146
- description: input.description,
147
- type: input.type,
148
- value: input.value,
149
- platformId: input.platform_id,
150
- isConstant: input.is_constant,
151
- constantValue: input.constant_value,
152
- repeatConstantValue: input.repeat_constant_value,
153
- }),
31
+ path: `/crm-connections/${input.crm_id}/bitrix24/deal-tab/retry`,
154
32
  }),
155
33
  enhanceResponse: (response) => withInstructions(response, [
156
- 'name, scope, is_constant — immutable post-create (используй delete + create для смены).',
157
- 'WORKSPACE variables референсятся в шаблонах как {{{name}}} (triple braces), CHANNEL constants — {{name}} (double).',
158
- REPEAT_CONSTANT_VALUE_INSTRUCTION,
34
+ 'Идемпотентный повтор регистрации вкладки AI Агенты. Адрес и токен выбирает сервер из окружения и сохранённого подключения; переустановка не требуется.',
35
+ 'HTTP 200 с status=FAILED или UNKNOWN не является успехом регистрации. Объясни причину человеческим языком; reason оставь только для диагностики. При неопределённом исходе повтори проверку позже; новый bind разрешает только сервер после подтверждения отсутствия.',
159
36
  ]),
160
37
  }),
161
- defineTool({
162
- name: 'besales_variable_get',
163
- sideEffect: 'none',
164
- closedWorld: true,
165
- requiredFields: ['variable_id', 'scope'],
166
- defaultWorkspaceId: true,
167
- schema: z
168
- .object({
169
- workspace_id: uuidSchema.optional(),
170
- variable_id: uuidSchema,
171
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
172
- platform_id: uuidSchema.optional(),
173
- })
174
- .strict()
175
- .superRefine((input, ctx) => {
176
- if (input.scope === 'CHANNEL' && !input.platform_id) {
177
- ctx.addIssue({
178
- code: z.ZodIssueCode.custom,
179
- message: 'platform_id is required when scope=CHANNEL',
180
- path: ['platform_id'],
181
- });
182
- }
183
- }),
184
- createRequest: (input) => ({
185
- method: 'GET',
186
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}${buildVariableScopeQuery(input.scope, input.platform_id)}`,
187
- }),
188
- }),
189
- defineTool({
190
- name: 'besales_variable_update',
191
- sideEffect: 'write',
192
- closedWorld: true,
193
- requiredFields: ['variable_id', 'scope'],
194
- defaultWorkspaceId: true,
195
- schema: z
196
- .object({
197
- workspace_id: uuidSchema.optional(),
198
- variable_id: uuidSchema,
199
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
200
- platform_id: uuidSchema.optional(),
201
- description: z.string().optional(),
202
- type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']).optional(),
203
- // WORKSPACE-only (nullable для clear)
204
- value: z.string().nullable().optional(),
205
- // CHANNEL-only (nullable для clear)
206
- constant_value: z.string().nullable().optional(),
207
- repeat_constant_value: z.string().nullable().optional(),
208
- })
209
- .strict()
210
- .superRefine((input, ctx) => {
211
- if (input.scope === 'CHANNEL' && !input.platform_id) {
212
- ctx.addIssue({
213
- code: z.ZodIssueCode.custom,
214
- message: 'platform_id is required when scope=CHANNEL',
215
- path: ['platform_id'],
216
- });
217
- }
218
- if (input.scope === 'WORKSPACE' && input.constant_value !== undefined) {
219
- ctx.addIssue({
220
- code: z.ZodIssueCode.custom,
221
- message: 'constant_value is forbidden when scope=WORKSPACE',
222
- path: ['constant_value'],
223
- });
224
- }
225
- if (input.scope === 'WORKSPACE' && input.repeat_constant_value !== undefined) {
226
- ctx.addIssue({
227
- code: z.ZodIssueCode.custom,
228
- message: 'repeat_constant_value is forbidden when scope=WORKSPACE',
229
- path: ['repeat_constant_value'],
230
- });
231
- }
232
- if (input.scope === 'CHANNEL' && input.value !== undefined) {
233
- ctx.addIssue({
234
- code: z.ZodIssueCode.custom,
235
- message: 'value is forbidden when scope=CHANNEL',
236
- path: ['value'],
237
- });
238
- }
239
- }),
240
- createRequest: (input) => ({
241
- method: 'PATCH',
242
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
243
- body: compactObject({
244
- scope: input.scope,
245
- platformId: input.platform_id,
246
- description: input.description,
247
- type: input.type,
248
- value: input.value,
249
- constantValue: input.constant_value,
250
- repeatConstantValue: input.repeat_constant_value,
251
- }),
252
- }),
253
- enhanceResponse: (response) => withInstructions(response, [REPEAT_CONSTANT_VALUE_INSTRUCTION]),
254
- }),
255
- defineTool({
256
- name: 'besales_variable_delete',
257
- sideEffect: 'write',
258
- closedWorld: true,
259
- requiredFields: ['variable_id', 'scope', 'explicit_confirmation'],
260
- defaultWorkspaceId: true,
261
- schema: z
262
- .object({
263
- workspace_id: uuidSchema.optional(),
264
- variable_id: uuidSchema,
265
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
266
- platform_id: uuidSchema.optional(),
267
- explicit_confirmation: z.literal(true),
268
- })
269
- .strict()
270
- .superRefine((input, ctx) => {
271
- if (input.scope === 'CHANNEL' && !input.platform_id) {
272
- ctx.addIssue({
273
- code: z.ZodIssueCode.custom,
274
- message: 'platform_id is required when scope=CHANNEL',
275
- path: ['platform_id'],
276
- });
277
- }
278
- }),
279
- createRequest: (input) => ({
280
- method: 'DELETE',
281
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
282
- body: compactObject({
283
- scope: input.scope,
284
- platformId: input.platform_id,
285
- explicitConfirmation: input.explicit_confirmation,
286
- }),
287
- }),
288
- }),
289
38
  // ============================================================
290
39
  // v1.5 Increment 4b — CRM Pipelines (11 tools)
291
40
  // ============================================================
@@ -310,14 +59,21 @@ export const crmPlatformTools = [
310
59
  workspace_id: uuidSchema.optional(),
311
60
  crm_id: uuidSchema,
312
61
  include_deleted: z.boolean().optional(),
62
+ // ⚠️ Без умолчания: отказ по размеру был отказом БЕЗ ВЫХОДА — сузить перечень было нечем.
63
+ limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
64
+ cursor: z.string().min(1).optional(),
313
65
  })
314
66
  .strict(),
315
67
  createRequest: (input) => ({
316
68
  method: 'GET',
317
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines${input.include_deleted !== undefined ? `?includeDeleted=${input.include_deleted}` : ''}`,
69
+ path: `/crm-connections/${input.crm_id}/pipelines?sync=true${input.include_deleted !== undefined ? `&includeDeleted=${input.include_deleted}` : ''}${input.limit !== undefined ? `&limit=${input.limit}` : ''}${input.cursor ? `&cursor=${encodeURIComponent(input.cursor)}` : ''}`,
318
70
  }),
319
- enhanceResponse: (response) => withInstructions(response, [
320
- 'Триггерит sync с external CRM (AmoCRM/Bitrix24) при каждом вызове — best-effort, не блокирует list при failure.',
71
+ enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
72
+ pageRequested: input.limit !== undefined || input.cursor !== undefined,
73
+ toolName: 'besales_crm_pipeline_list',
74
+ howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
75
+ }), [
76
+ 'Перед list выполняется best-effort sync; ошибка провайдера не блокирует локальную выдачу.',
321
77
  ]),
322
78
  }),
323
79
  defineTool({
@@ -334,7 +90,7 @@ export const crmPlatformTools = [
334
90
  .strict(),
335
91
  createRequest: (input) => ({
336
92
  method: 'GET',
337
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
93
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
338
94
  }),
339
95
  }),
340
96
  defineTool({
@@ -357,7 +113,7 @@ export const crmPlatformTools = [
357
113
  .strict(),
358
114
  createRequest: (input) => ({
359
115
  method: 'POST',
360
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines`,
116
+ path: `/crm-connections/${input.crm_id}/pipelines`,
361
117
  body: compactObject({
362
118
  name: input.name,
363
119
  sort: input.sort,
@@ -377,11 +133,7 @@ export const crmPlatformTools = [
377
133
  name: 'besales_crm_pipeline_update',
378
134
  sideEffect: 'write',
379
135
  defaultWorkspaceId: true,
380
- requiredFields: [
381
- 'crm_id',
382
- 'pipeline_id',
383
- 'acknowledge_external_side_effect',
384
- ],
136
+ requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
385
137
  schema: z
386
138
  .object({
387
139
  workspace_id: uuidSchema.optional(),
@@ -397,7 +149,7 @@ export const crmPlatformTools = [
397
149
  .strict(),
398
150
  createRequest: (input) => ({
399
151
  method: 'PATCH',
400
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
152
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
401
153
  body: compactObject({
402
154
  name: input.name,
403
155
  sort: input.sort,
@@ -408,7 +160,7 @@ export const crmPlatformTools = [
408
160
  }),
409
161
  }),
410
162
  enhanceResponse: (response) => withInstructions(response, [
411
- 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в PipelineSettings — обновляй через besales_pipeline_settings_update.',
163
+ 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
412
164
  ]),
413
165
  }),
414
166
  defineTool({
@@ -432,7 +184,7 @@ export const crmPlatformTools = [
432
184
  .strict(),
433
185
  createRequest: (input) => ({
434
186
  method: 'DELETE',
435
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
187
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
436
188
  body: {
437
189
  explicitConfirmation: input.explicit_confirmation,
438
190
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -456,24 +208,34 @@ export const crmPlatformTools = [
456
208
  workspace_id: uuidSchema.optional(),
457
209
  crm_id: uuidSchema,
458
210
  pipeline_id: z.number().int(),
211
+ // ⚠️ Без умолчания: недостающая стадия даёт недостижимое правило маршрутизации.
212
+ limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
213
+ cursor: z.string().min(1).optional(),
459
214
  })
460
215
  .strict(),
461
- createRequest: (input) => ({
462
- method: 'GET',
463
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
216
+ createRequest: (input) => {
217
+ const query = new URLSearchParams();
218
+ if (input.limit !== undefined)
219
+ query.set('limit', String(input.limit));
220
+ if (input.cursor)
221
+ query.set('cursor', input.cursor);
222
+ const suffix = query.size > 0 ? `?${query.toString()}` : '';
223
+ return {
224
+ method: 'GET',
225
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses${suffix}`,
226
+ };
227
+ },
228
+ enhanceResponse: (response, input) => assertCompleteList(response, {
229
+ pageRequested: input.limit !== undefined || input.cursor !== undefined,
230
+ toolName: 'besales_crm_pipeline_status_list',
231
+ howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
464
232
  }),
465
233
  }),
466
234
  defineTool({
467
235
  name: 'besales_crm_pipeline_status_create',
468
236
  sideEffect: 'write',
469
237
  defaultWorkspaceId: true,
470
- requiredFields: [
471
- 'crm_id',
472
- 'pipeline_id',
473
- 'name',
474
- 'sort',
475
- 'acknowledge_external_side_effect',
476
- ],
238
+ requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
477
239
  schema: z
478
240
  .object({
479
241
  workspace_id: uuidSchema.optional(),
@@ -484,8 +246,16 @@ export const crmPlatformTools = [
484
246
  color: z.string().optional(),
485
247
  status_types: z.array(z.string()).optional(),
486
248
  is_editable: z.boolean().optional(),
249
+ is_system_managed: z
250
+ .boolean()
251
+ .optional()
252
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
487
253
  is_bot_active: z.boolean().optional(),
488
254
  is_operator_available: z.boolean().optional(),
255
+ is_terminal: z
256
+ .boolean()
257
+ .optional()
258
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
489
259
  on_message_received_move_to_status: z.number().int().nullable().optional(),
490
260
  status_id: z.number().int().optional(),
491
261
  acknowledge_external_side_effect: z.literal(true),
@@ -493,15 +263,17 @@ export const crmPlatformTools = [
493
263
  .strict(),
494
264
  createRequest: (input) => ({
495
265
  method: 'POST',
496
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
266
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
497
267
  body: compactObject({
498
268
  name: input.name,
499
269
  sort: input.sort,
500
270
  color: input.color,
501
271
  statusTypes: input.status_types,
502
272
  isEditable: input.is_editable,
273
+ isSystemManaged: input.is_system_managed,
503
274
  isBotActive: input.is_bot_active,
504
275
  isOperatorAvailable: input.is_operator_available,
276
+ isTerminal: input.is_terminal,
505
277
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
506
278
  statusId: input.status_id,
507
279
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -515,12 +287,7 @@ export const crmPlatformTools = [
515
287
  name: 'besales_crm_pipeline_status_update',
516
288
  sideEffect: 'write',
517
289
  defaultWorkspaceId: true,
518
- requiredFields: [
519
- 'crm_id',
520
- 'pipeline_id',
521
- 'status_id',
522
- 'acknowledge_external_side_effect',
523
- ],
290
+ requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
524
291
  schema: z
525
292
  .object({
526
293
  workspace_id: uuidSchema.optional(),
@@ -534,17 +301,21 @@ export const crmPlatformTools = [
534
301
  is_system_managed: z
535
302
  .boolean()
536
303
  .optional()
537
- .describe('Главный переключатель управления статусом системой'),
304
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
538
305
  is_editable: z.boolean().optional(),
539
306
  is_bot_active: z.boolean().optional(),
540
307
  is_operator_available: z.boolean().optional(),
308
+ is_terminal: z
309
+ .boolean()
310
+ .optional()
311
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
541
312
  on_message_received_move_to_status: z.number().int().nullable().optional(),
542
313
  acknowledge_external_side_effect: z.literal(true),
543
314
  })
544
315
  .strict(),
545
316
  createRequest: (input) => ({
546
317
  method: 'PATCH',
547
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
318
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
548
319
  body: compactObject({
549
320
  name: input.name,
550
321
  sort: input.sort,
@@ -554,6 +325,7 @@ export const crmPlatformTools = [
554
325
  isEditable: input.is_editable,
555
326
  isBotActive: input.is_bot_active,
556
327
  isOperatorAvailable: input.is_operator_available,
328
+ isTerminal: input.is_terminal,
557
329
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
558
330
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
559
331
  }),
@@ -585,7 +357,7 @@ export const crmPlatformTools = [
585
357
  .strict(),
586
358
  createRequest: (input) => ({
587
359
  method: 'DELETE',
588
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
360
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
589
361
  body: {
590
362
  explicitConfirmation: input.explicit_confirmation,
591
363
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -599,6 +371,11 @@ export const crmPlatformTools = [
599
371
  requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
600
372
  schema: z
601
373
  .object({
374
+ expected_version: z
375
+ .string()
376
+ .min(1)
377
+ .regex(/^[A-Za-z0-9_.-]+$/u)
378
+ .optional(),
602
379
  workspace_id: uuidSchema.optional(),
603
380
  platform_id: uuidSchema,
604
381
  pipeline_id: z.number().int(),
@@ -608,14 +385,16 @@ export const crmPlatformTools = [
608
385
  .strict(),
609
386
  createRequest: (input) => ({
610
387
  method: 'POST',
611
- path: `/workspaces/${input.workspace_id}/platforms/${input.platform_id}/active-pipelines`,
388
+ path: `/channels/${input.platform_id}/active-pipelines`,
612
389
  body: compactObject({
390
+ expectedVersion: input.expected_version,
613
391
  pipelineId: input.pipeline_id,
614
392
  pipelineCrmId: input.pipeline_crm_id,
615
393
  sort: input.sort,
616
394
  }),
617
395
  }),
618
396
  enhanceResponse: (response) => withInstructions(response, [
397
+ editVersionInstruction(),
619
398
  'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
620
399
  ]),
621
400
  }),
@@ -626,6 +405,11 @@ export const crmPlatformTools = [
626
405
  requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
627
406
  schema: z
628
407
  .object({
408
+ expected_version: z
409
+ .string()
410
+ .min(1)
411
+ .regex(/^[A-Za-z0-9_.-]+$/u)
412
+ .optional(),
629
413
  workspace_id: uuidSchema.optional(),
630
414
  platform_id: uuidSchema,
631
415
  platform_pipeline_id: uuidSchema,
@@ -634,9 +418,11 @@ export const crmPlatformTools = [
634
418
  .strict(),
635
419
  createRequest: (input) => ({
636
420
  method: 'DELETE',
637
- path: `/workspaces/${input.workspace_id}/platforms/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
421
+ ...compactObject({ ifMatch: input.expected_version }),
422
+ path: `/channels/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
638
423
  body: { explicitConfirmation: input.explicit_confirmation },
639
424
  }),
425
+ enhanceResponse: withEditVersionInstructions,
640
426
  }),
641
427
  // ============================================================
642
428
  // v1.5 Increment 4d — cross-platform clone (3 tools)
@@ -686,10 +472,10 @@ export const crmPlatformTools = [
686
472
  }),
687
473
  createRequest: (input) => ({
688
474
  method: 'POST',
689
- path: `/workspaces/${input.workspace_id}/platforms/clone/preview`,
475
+ path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
690
476
  body: compactObject({
691
- sourcePlatformId: input.source_platform_id,
692
- targetPlatformId: input.target_platform_id,
477
+ sourceChannelId: input.source_platform_id,
478
+ targetChannelId: input.target_platform_id,
693
479
  include: compactObject({
694
480
  agents: input.include.agents,
695
481
  agentTools: input.include.agent_tools,
@@ -756,11 +542,11 @@ export const crmPlatformTools = [
756
542
  .strict(),
757
543
  createRequest: (input) => ({
758
544
  method: 'POST',
759
- path: `/workspaces/${input.workspace_id}/platforms/clone/execute`,
545
+ path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
760
546
  body: compactObject({
761
547
  previewToken: input.preview_token,
762
- sourcePlatformId: input.source_platform_id,
763
- targetPlatformId: input.target_platform_id,
548
+ sourceChannelId: input.source_platform_id,
549
+ targetChannelId: input.target_platform_id,
764
550
  explicitConfirmation: input.explicit_confirmation,
765
551
  acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
766
552
  idempotencyKey: input.idempotency_key,
@@ -768,7 +554,7 @@ export const crmPlatformTools = [
768
554
  }),
769
555
  }),
770
556
  enhanceResponse: (response) => withInstructions(response, [
771
- 'Result reversible через besales_audit_revert (kind=revertClone) — пометит CloneRun.status=REVERTED.',
557
+ 'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
772
558
  'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
773
559
  'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
774
560
  'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
@@ -787,7 +573,7 @@ export const crmPlatformTools = [
787
573
  .strict(),
788
574
  createRequest: (input) => ({
789
575
  method: 'GET',
790
- path: `/workspaces/${input.workspace_id}/platforms/clone/${input.clone_id}`,
576
+ path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
791
577
  }),
792
578
  }),
793
579
  // ============================================================
@@ -810,6 +596,10 @@ export const crmPlatformTools = [
810
596
  source: mcpFileSourceSchema.optional(),
811
597
  mime_type: z.string().max(255).optional(),
812
598
  size_bytes: z.number().int().positive().max(MAX_FILE_UPLOAD_BYTES).optional(),
599
+ // Носитель, РАДИ которого грузится файл: он станет владельцем и только он вправе его
600
+ // убрать. Порядок: создать карточку → запросить загрузку ДЛЯ НЕЁ → человек кладёт файл.
601
+ owner_kind: z.literal('KNOWLEDGE_SOURCE').optional(),
602
+ owner_id: uuidSchema.optional(),
813
603
  })
814
604
  .strict(),
815
605
  createRequest: (input) => ({
@@ -822,11 +612,14 @@ export const crmPlatformTools = [
822
612
  source: input.source,
823
613
  mime_type: input.mime_type,
824
614
  size_bytes: input.size_bytes,
615
+ owner_kind: input.owner_kind,
616
+ owner_id: input.owner_id,
825
617
  }),
826
618
  }),
827
619
  enhanceResponse: (response) => withInstructions(response, [
828
620
  'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
829
- 'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в knowledge_document_upload / behavior greeting).',
621
+ 'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в besales_knowledge_document_upload с source_kind=STORED_FILE / behavior greeting).',
622
+ 'Файл ДЛЯ карточки знаний: сначала создайте карточку, затем запросите загрузку с owner_kind=KNOWLEDGE_SOURCE и owner_id=<id карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
830
623
  'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
831
624
  ]),
832
625
  }),
@@ -843,7 +636,7 @@ export const crmPlatformTools = [
843
636
  .strict(),
844
637
  createRequest: (input) => ({
845
638
  method: 'GET',
846
- path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
639
+ path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
847
640
  }),
848
641
  enhanceResponse: (response) => withInstructions(response, [
849
642
  'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -886,6 +679,7 @@ export const crmPlatformTools = [
886
679
  schema: z
887
680
  .object({
888
681
  workspace_id: uuidSchema.optional(),
682
+ operation_id: setupInitOperationIdSchema,
889
683
  platform_type: apiKeyPlatformTypeSchema,
890
684
  name: z.string().min(1).max(255),
891
685
  // Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
@@ -900,6 +694,7 @@ export const crmPlatformTools = [
900
694
  method: 'POST',
901
695
  path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
902
696
  body: compactObject({
697
+ operationId: input.operation_id,
903
698
  platform_type: input.platform_type,
904
699
  name: input.name,
905
700
  fields: input.fields,
@@ -925,7 +720,7 @@ export const crmPlatformTools = [
925
720
  .strict(),
926
721
  createRequest: (input) => ({
927
722
  method: 'GET',
928
- path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
723
+ path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
929
724
  }),
930
725
  enhanceResponse: (response) => withInstructions(response, [
931
726
  'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -951,7 +746,10 @@ export const crmPlatformTools = [
951
746
  createRequest: (input) => ({
952
747
  method: 'POST',
953
748
  path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
954
- body: compactObject({ platform_type: input.platform_type, name: input.name }),
749
+ body: compactObject({
750
+ platform_type: input.platform_type,
751
+ name: input.name,
752
+ }),
955
753
  }),
956
754
  enhanceResponse: (response) => withInstructions(response, [
957
755
  'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
@@ -960,12 +758,10 @@ export const crmPlatformTools = [
960
758
  ]),
961
759
  }),
962
760
  // ============================================================
963
- // v1.5 Increment 5c — CRM Connection + Field Mapping + Operators (5 tools)
761
+ // CRM Connection + Field Mapping + Operators
964
762
  // ============================================================
965
- // CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GETCOURSE/TELEGRAM
966
- // (API-key) + AMOCRM/BITRIX24 (вставка credentials; Bitrix24 далее завершает local-app install
967
- // вебхуком). Field mapping + operators — для уже подключённых CRM (AmoCRM/Bitrix24 для mapping;
968
- // AmoCRM для operators).
763
+ // CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
764
+ // Bitrix24. Field mapping + operators — для уже подключённых CRM.
969
765
  defineTool({
970
766
  name: 'besales_crm_create_init',
971
767
  sideEffect: 'write',
@@ -974,17 +770,22 @@ export const crmPlatformTools = [
974
770
  schema: z
975
771
  .object({
976
772
  workspace_id: uuidSchema.optional(),
773
+ operation_id: setupInitOperationIdSchema,
977
774
  crm_type: provisionableCrmTypeSchema,
978
775
  // Публичные non-secret поля: GETCOURSE={account_domain, managed_tag_prefix?};
979
- // TELEGRAM={forum_group_id}; AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
980
- // Секреты (school_api_key / crm_bot_token / client_secret / long_access_token) — на /setup/:ref.
776
+ // AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
777
+ // Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
981
778
  fields: optionalAnyObjectSchema,
982
779
  })
983
780
  .strict(),
984
781
  createRequest: (input) => ({
985
782
  method: 'POST',
986
783
  path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
987
- body: compactObject({ crm_type: input.crm_type, fields: input.fields }),
784
+ body: compactObject({
785
+ operationId: input.operation_id,
786
+ crm_type: input.crm_type,
787
+ fields: input.fields,
788
+ }),
988
789
  }),
989
790
  enhanceResponse: (response) => withInstructions(response, [
990
791
  'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
@@ -1006,11 +807,11 @@ export const crmPlatformTools = [
1006
807
  .strict(),
1007
808
  createRequest: (input) => ({
1008
809
  method: 'GET',
1009
- path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
810
+ path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
1010
811
  }),
1011
812
  enhanceResponse: (response) => withInstructions(response, [
1012
813
  'status: AWAITING_USER → VALIDATING → READY (`crm_id`) | VALIDATION_FAILED (`error_message`) | EXPIRED.',
1013
- 'READY = CRM создана + токен онлайн-проверен для Telegram-CRM (getMe) и GetCourse (read-only API-probe) → битый токен/ключ = VALIDATION_FAILED.',
814
+ 'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
1014
815
  'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
1015
816
  ]),
1016
817
  }),
@@ -1027,12 +828,11 @@ export const crmPlatformTools = [
1027
828
  .strict(),
1028
829
  createRequest: (input) => ({
1029
830
  method: 'POST',
1030
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/activate`,
831
+ path: `/crm-connections/${input.crm_id}/activate`,
1031
832
  }),
1032
833
  enhanceResponse: (response) => withInstructions(response, [
1033
- 'CRM активирована: токен live-проверен, остальные CRM workspace деактивированы, связанные триггеры включены.',
1034
- 'Активна одна CRM на workspace за раз — этот вызов ДЕАКТИВИРУЕТ предыдущую активную. Предупреди пользователя перед переключением.',
1035
- 'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
834
+ 'CRM connection активирована после live-проверки credentials.',
835
+ 'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
1036
836
  ]),
1037
837
  }),
1038
838
  defineTool({
@@ -1047,12 +847,12 @@ export const crmPlatformTools = [
1047
847
  .strict(),
1048
848
  createRequest: (input) => ({
1049
849
  method: 'GET',
1050
- path: `/workspaces/${input.workspace_id}/crms`,
850
+ path: `/workspaces/${input.workspace_id}/crm-connections`,
1051
851
  }),
1052
852
  enhanceResponse: (response) => withInstructions(response, [
1053
- 'Список CRM workspace: id, type, status, is_active, account (поддомен/домен), created_at.',
853
+ 'Список v2 CRM connections workspace без credentials.',
1054
854
  'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
1055
- 'is_active=false → CRM есть, но не активна (besales_crm_activate); это объясняет, почему pipelines/field-mapping/operators могут не отвечать.',
855
+ 'Неактивное подключение можно включить через besales_crm_activate.',
1056
856
  ]),
1057
857
  }),
1058
858
  defineTool({
@@ -1072,8 +872,36 @@ export const crmPlatformTools = [
1072
872
  enhanceResponse: (response) => withInstructions(response, [
1073
873
  'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
1074
874
  'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
1075
- 'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот): их знает только владелец аккаунта, назови их отдельно.',
1076
- 'Полученные от поддержки channelId и channelSecretKey привязываются в интерфейсе (POST /api/amo-crm/channel-connect) — через MCP этого шага нет.',
875
+ '⚠️ Метку :scope_id в адресе вебхука НЕ трогай и не заменяй: её подставляет сама amoCRM при каждом хуке. Секрета в адресе нет — это нормально.',
876
+ 'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот, контактный e-mail для связи при ошибках): их знает только владелец аккаунта, назови их отдельно.',
877
+ 'crmConnectionId и crmConnectionName называют подключение, для которого собрана заявка: адрес принадлежит ПОДКЛЮЧЕНИЮ, а не рабочей области.',
878
+ 'Если у рабочей области несколько подключений amoCRM и активное среди них не одно, сервер откажет и назовёт подключения по именам: заявку для нужного подключения открой в интерфейсе — этот инструмент подключение выбрать не умеет.',
879
+ 'Полученные от поддержки channelId и секрет канала привязываются к каналу в интерфейсе (раздел подключения канала, чат amoCRM) — через ассистента секрет не проходит и этого шага в MCP нет.',
880
+ ]),
881
+ }),
882
+ // ⛔ Адрес приёма событий CRM через этот инструмент НЕ проходит: он несёт пропуск параметром
883
+ // строки запроса, а ответ инструмента ложится в транскрипт хоста и его телеметрию. Вместо
884
+ // адреса выдаётся одноразовая ссылка; страница за ней требует входа и права управлять CRM.
885
+ defineTool({
886
+ name: 'besales_crm_webhook_url_reveal',
887
+ sideEffect: 'write',
888
+ requiredFields: ['crm_id'],
889
+ defaultWorkspaceId: false,
890
+ schema: z
891
+ .object({
892
+ crm_id: uuidSchema,
893
+ })
894
+ .strict(),
895
+ createRequest: (input) => ({
896
+ method: 'POST',
897
+ path: '/crm-webhook-url-reveals',
898
+ body: { crmConnectionId: input.crm_id },
899
+ }),
900
+ enhanceResponse: (response) => withInstructions(response, [
901
+ 'Ответ: { revealUrl, revealExpiresAt }. Самого адреса в нём НЕТ и не будет: адрес несёт пропуск, а секреты через ассистента не проходят.',
902
+ 'Передай человеку revealUrl и попроси открыть в браузере. Страница потребует входа и права управлять CRM и покажет адрес ОДИН раз.',
903
+ 'Ссылка одноразовая и с ограниченным сроком (revealExpiresAt); просроченную или уже открытую заказывай заново этим же инструментом.',
904
+ 'Адрес нужен, чтобы человек вписал его в настройки вебхуков amoCRM. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
1077
905
  ]),
1078
906
  }),
1079
907
  defineTool({
@@ -1096,11 +924,11 @@ export const crmPlatformTools = [
1096
924
  .strict(),
1097
925
  createRequest: (input) => ({
1098
926
  method: 'GET',
1099
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
927
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1100
928
  }),
1101
929
  enhanceResponse: (response) => withInstructions(response, [
1102
- 'Возвращает `available_fields` (поля из CRM) + `current_mappings`. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1103
- 'Используйте `available_fields[].id` как `crm_field_id` в `besales_crm_field_mapping_upsert`.',
930
+ 'Возвращает текущий список v2 field mappings.',
931
+ 'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
1104
932
  ]),
1105
933
  }),
1106
934
  defineTool({
@@ -1120,16 +948,22 @@ export const crmPlatformTools = [
1120
948
  .strict(),
1121
949
  createRequest: (input) => ({
1122
950
  method: 'PUT',
1123
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
951
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1124
952
  body: {
1125
- replace_all_existing: input.replace_all_existing,
1126
953
  enabled: input.enabled,
1127
- field_mappings: input.field_mappings,
954
+ mappings: input.field_mappings.map((mapping) => compactObject({
955
+ crmFieldId: mapping.crm_field_id,
956
+ crmFieldName: mapping.crm_field_name,
957
+ saveAs: mapping.save_as,
958
+ isEnabled: mapping.enabled,
959
+ specialPurpose: mapping.special_purpose,
960
+ category: mapping.category,
961
+ })),
1128
962
  },
1129
963
  }),
1130
964
  enhanceResponse: (response) => withInstructions(response, [
1131
- 'Replace-all: передавайте ВЕСЬ набор маппингов (не патч). Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1132
- 'Чтобы изменить — повторно вызовите с новым полным набором (это «undo»). Audit non-reversible (снимок before в diff).',
965
+ 'Replace-all: передавай весь желаемый набор mappings, а не патч.',
966
+ 'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
1133
967
  ]),
1134
968
  }),
1135
969
  defineTool({
@@ -1146,11 +980,11 @@ export const crmPlatformTools = [
1146
980
  .strict(),
1147
981
  createRequest: (input) => ({
1148
982
  method: 'GET',
1149
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
983
+ path: `/crm-connections/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
1150
984
  }),
1151
985
  enhanceResponse: (response) => withInstructions(response, [
1152
- 'Операторы для assignee-стратегий PipelineSettings. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1153
- 'sync=true пересинхронизирует операторов из CRM перед возвратом.',
986
+ 'Возвращаются активные локальные CRM operators.',
987
+ 'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
1154
988
  ]),
1155
989
  }),
1156
990
  defineTool({
@@ -1165,24 +999,87 @@ export const crmPlatformTools = [
1165
999
  operator_id: uuidSchema,
1166
1000
  is_operator: z.boolean().optional(),
1167
1001
  is_sdr: z.boolean().optional(),
1002
+ expected_version: z
1003
+ .uuid()
1004
+ .describe('Версия снимка из чтения; без автоматического перечитывания и повтора при конфликте')
1005
+ .optional(),
1006
+ workspace_member_id: z
1007
+ .string()
1008
+ .min(1)
1009
+ .nullable()
1010
+ .describe('users.id сотрудника Besales; null снимает связь вручную, пропуск сохраняет её')
1011
+ .optional(),
1168
1012
  })
1169
1013
  .strict()
1170
1014
  .superRefine((input, ctx) => {
1171
- if (input.is_operator === undefined && input.is_sdr === undefined) {
1015
+ if (input.workspace_member_id !== undefined && input.expected_version === undefined) {
1016
+ ctx.addIssue({
1017
+ code: z.ZodIssueCode.custom,
1018
+ path: ['expected_version'],
1019
+ message: 'Provide expected_version when changing workspace_member_id',
1020
+ });
1021
+ }
1022
+ if (!CRM_OPERATOR_CHANGE_FIELDS.some((field) => input[field] !== undefined)) {
1172
1023
  ctx.addIssue({
1173
1024
  code: z.ZodIssueCode.custom,
1174
- message: 'Provide at least one of is_operator / is_sdr',
1025
+ message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
1175
1026
  });
1176
1027
  }
1177
1028
  }),
1178
1029
  createRequest: (input) => ({
1179
1030
  method: 'PATCH',
1180
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/operators/${input.operator_id}`,
1181
- body: compactObject({ is_operator: input.is_operator, is_sdr: input.is_sdr }),
1031
+ path: `/crm-connections/${input.crm_id}/operators/${input.operator_id}`,
1032
+ body: compactObject({
1033
+ isOperator: input.is_operator,
1034
+ isSdr: input.is_sdr,
1035
+ expectedVersion: input.expected_version,
1036
+ workspaceMemberId: input.workspace_member_id,
1037
+ }),
1038
+ }),
1039
+ enhanceResponse: (response) => withInstructions(response, [
1040
+ 'Обновляет флаги и ручную связь с сотрудником. workspace_member_id — users.id; null снимает связь вручную.',
1041
+ 'Передайте expected_version прочитанной строки при изменении связи. При 409 сохраните ввод и перечитайте для сравнения; автоматического повтора нет.',
1042
+ 'Непереданный флаг сохраняет текущее значение; operator_id бери из besales_crm_operator_list.',
1043
+ ]),
1044
+ }),
1045
+ defineTool({
1046
+ name: 'besales_crm_rotate_init',
1047
+ sideEffect: 'write',
1048
+ defaultWorkspaceId: true,
1049
+ requiredFields: ['connection_id'],
1050
+ schema: z
1051
+ .object({
1052
+ workspace_id: uuidSchema.optional(),
1053
+ connection_id: uuidSchema,
1054
+ mode: z.enum(['GETCOURSE_KEYS', 'LONG_LIVED', 'OAUTH_PENDING', 'OAUTH']).optional(),
1055
+ })
1056
+ .strict(),
1057
+ createRequest: (input) => ({
1058
+ method: 'POST',
1059
+ path: `/workspaces/${input.workspace_id}/crm-connections/${input.connection_id}/credential-setup-sessions`,
1060
+ body: compactObject({ mode: input.mode }),
1061
+ }),
1062
+ enhanceResponse: (response) => withInstructions(response, [
1063
+ 'Передай setup_page_url человеку: ключи вводятся только в браузере. Не проси секреты в чат. Затем опрашивай besales_crm_rotate_status. Существующая CRM и её связи сохраняются.',
1064
+ ]),
1065
+ }),
1066
+ defineTool({
1067
+ name: 'besales_crm_rotate_status',
1068
+ sideEffect: 'none',
1069
+ defaultWorkspaceId: true,
1070
+ requiredFields: ['setup_ref'],
1071
+ schema: z
1072
+ .object({
1073
+ workspace_id: uuidSchema.optional(),
1074
+ setup_ref: z.string().min(1),
1075
+ })
1076
+ .strict(),
1077
+ createRequest: (input) => ({
1078
+ method: 'GET',
1079
+ path: `/workspaces/${input.workspace_id}/crm-credential-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
1182
1080
  }),
1183
1081
  enhanceResponse: (response) => withInstructions(response, [
1184
- 'Вкл/выкл роли конкретного оператора: is_operator (assignee диалогов) и/или is_sdr. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1185
- 'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
1082
+ 'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
1186
1083
  ]),
1187
1084
  }),
1188
1085
  ];