@besales/mcp 0.47.1 → 1.0.0-beta.2

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 (587) hide show
  1. package/README.md +109 -164
  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 +52 -7
  23. package/dist/http/api-client.js +131 -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 +8 -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 +106 -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 -4
  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 +12061 -6753
  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 +78 -21
  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 -427
  147. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  148. package/dist/tools/definitions/broadcast-scheduler.d.ts +19 -13
  149. package/dist/tools/definitions/broadcast-scheduler.js +217 -128
  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 +28 -39
  158. package/dist/tools/definitions/crm-platform.js +235 -344
  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/edit-version-transport.test-fixtures.d.ts +13 -0
  197. package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
  198. package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
  199. package/dist/tools/definitions/edit-version.d.ts +5 -0
  200. package/dist/tools/definitions/edit-version.js +20 -0
  201. package/dist/tools/definitions/edit-version.js.map +1 -0
  202. package/dist/tools/definitions/external-api-channels.js +17 -15
  203. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  204. package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
  205. package/dist/tools/definitions/feedback-document-access.js +63 -0
  206. package/dist/tools/definitions/feedback-document-access.js.map +1 -0
  207. package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
  208. package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
  209. package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
  210. package/dist/tools/definitions/follow-up-config.d.ts +79 -0
  211. package/dist/tools/definitions/follow-up-config.js +258 -0
  212. package/dist/tools/definitions/follow-up-config.js.map +1 -0
  213. package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
  214. package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
  215. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  216. package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
  217. package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
  218. package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
  219. package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
  220. package/dist/tools/definitions/follow-up-setup.js +20 -87
  221. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  222. package/dist/tools/definitions/follow-up.d.ts +20 -122
  223. package/dist/tools/definitions/follow-up.js +200 -354
  224. package/dist/tools/definitions/follow-up.js.map +1 -1
  225. package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
  226. package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
  227. package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
  228. package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
  229. package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
  230. package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
  231. package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
  232. package/dist/tools/definitions/funnel-analytics.js +150 -0
  233. package/dist/tools/definitions/funnel-analytics.js.map +1 -0
  234. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
  235. package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
  236. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  237. package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
  238. package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
  239. package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
  240. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +17 -29
  241. package/dist/tools/definitions/getcourse-cold-welcome.js +182 -242
  242. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  243. package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
  244. package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
  245. package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
  246. package/dist/tools/definitions/help.js.map +1 -1
  247. package/dist/tools/definitions/icp-import-source.d.ts +75 -0
  248. package/dist/tools/definitions/icp-import-source.js +88 -0
  249. package/dist/tools/definitions/icp-import-source.js.map +1 -0
  250. package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
  251. package/dist/tools/definitions/inbound-analytics.js +55 -0
  252. package/dist/tools/definitions/inbound-analytics.js.map +1 -0
  253. package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
  254. package/dist/tools/definitions/instagram-comment.templates.js +34 -0
  255. package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
  256. package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
  257. package/dist/tools/definitions/instagram-settings-compat.js +7 -0
  258. package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
  259. package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
  260. package/dist/tools/definitions/knowledge-chunking.js +83 -0
  261. package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
  262. package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
  263. package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
  264. package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
  265. package/dist/tools/definitions/knowledge.d.ts +24 -14
  266. package/dist/tools/definitions/knowledge.js +342 -233
  267. package/dist/tools/definitions/knowledge.js.map +1 -1
  268. package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
  269. package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
  270. package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
  271. package/dist/tools/definitions/link-tracking.d.ts +8 -0
  272. package/dist/tools/definitions/link-tracking.js +141 -38
  273. package/dist/tools/definitions/link-tracking.js.map +1 -1
  274. package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
  275. package/dist/tools/definitions/mailing-variant-content.js +73 -0
  276. package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
  277. package/dist/tools/definitions/model-comparison.d.ts +1 -0
  278. package/dist/tools/definitions/model-comparison.js +4 -5
  279. package/dist/tools/definitions/model-comparison.js.map +1 -1
  280. package/dist/tools/definitions/money-currency.d.ts +5 -0
  281. package/dist/tools/definitions/money-currency.js +10 -0
  282. package/dist/tools/definitions/money-currency.js.map +1 -0
  283. package/dist/tools/definitions/operator-workflow.d.ts +5 -5
  284. package/dist/tools/definitions/operator-workflow.js +80 -27
  285. package/dist/tools/definitions/operator-workflow.js.map +1 -1
  286. package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
  287. package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
  288. package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
  289. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
  290. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
  291. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
  292. package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
  293. package/dist/tools/definitions/platform-settings-limits.js +6 -0
  294. package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
  295. package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
  296. package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
  297. package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
  298. package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
  299. package/dist/tools/definitions/platform-settings-update.js +134 -0
  300. package/dist/tools/definitions/platform-settings-update.js.map +1 -0
  301. package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
  302. package/dist/tools/definitions/platform-setup-wave.js +1079 -0
  303. package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
  304. package/dist/tools/definitions/platform-setup.d.ts +701 -222
  305. package/dist/tools/definitions/platform-setup.js +313 -752
  306. package/dist/tools/definitions/platform-setup.js.map +1 -1
  307. package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
  308. package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
  309. package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
  310. package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
  311. package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
  312. package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
  313. package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
  314. package/dist/tools/definitions/prompt-batch-controls.js +40 -0
  315. package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
  316. package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
  317. package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
  318. package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
  319. package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
  320. package/dist/tools/definitions/prompt-text-projection.js +62 -0
  321. package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
  322. package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
  323. package/dist/tools/definitions/reviewer-paid.js +115 -0
  324. package/dist/tools/definitions/reviewer-paid.js.map +1 -0
  325. package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
  326. package/dist/tools/definitions/routing-condition-projection.js +97 -0
  327. package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
  328. package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
  329. package/dist/tools/definitions/schedule-selection-hints.js +42 -0
  330. package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
  331. package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
  332. package/dist/tools/definitions/scheduled-task-alias.js +207 -0
  333. package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
  334. package/dist/tools/definitions/session.js +3 -3
  335. package/dist/tools/definitions/session.js.map +1 -1
  336. package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
  337. package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
  338. package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
  339. package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
  340. package/dist/tools/definitions/shared-input.helpers.js +323 -0
  341. package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
  342. package/dist/tools/definitions/shared.d.ts +414 -284
  343. package/dist/tools/definitions/shared.js +436 -619
  344. package/dist/tools/definitions/shared.js.map +1 -1
  345. package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
  346. package/dist/tools/definitions/shipped-output-names.js +123 -0
  347. package/dist/tools/definitions/shipped-output-names.js.map +1 -0
  348. package/dist/tools/definitions/task-state.d.ts +5 -5
  349. package/dist/tools/definitions/task-state.js +2 -1
  350. package/dist/tools/definitions/task-state.js.map +1 -1
  351. package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
  352. package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
  353. package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
  354. package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
  355. package/dist/tools/definitions/telegram-pool-policy.js +56 -0
  356. package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
  357. package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
  358. package/dist/tools/definitions/touch-history-alias.js +99 -0
  359. package/dist/tools/definitions/touch-history-alias.js.map +1 -0
  360. package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
  361. package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
  362. package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
  363. package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
  364. package/dist/tools/definitions/trigger-argument.schema.js +23 -0
  365. package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
  366. package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
  367. package/dist/tools/definitions/trigger-claim-alias.js +90 -0
  368. package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
  369. package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
  370. package/dist/tools/definitions/trigger-echo-projection.js +41 -0
  371. package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
  372. package/dist/tools/definitions/trigger-upsert.tool.d.ts +29 -0
  373. package/dist/tools/definitions/trigger-upsert.tool.js +122 -0
  374. package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
  375. package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
  376. package/dist/tools/definitions/v15-port-descriptions.js +30 -0
  377. package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
  378. package/dist/tools/definitions/variables.d.ts +44 -0
  379. package/dist/tools/definitions/variables.js +310 -0
  380. package/dist/tools/definitions/variables.js.map +1 -0
  381. package/dist/tools/definitions/voice-action-input.d.ts +9 -0
  382. package/dist/tools/definitions/voice-action-input.js +141 -0
  383. package/dist/tools/definitions/voice-action-input.js.map +1 -0
  384. package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
  385. package/dist/tools/definitions/widget-customization-compat.js +23 -0
  386. package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
  387. package/dist/tools/definitions.d.ts +1105 -621
  388. package/dist/tools/definitions.js +57 -27
  389. package/dist/tools/definitions.js.map +1 -1
  390. package/dist/tools/description-localization.js +3 -2
  391. package/dist/tools/description-localization.js.map +1 -1
  392. package/dist/tools/follow-up-request.d.ts +19 -0
  393. package/dist/tools/follow-up-request.js +81 -0
  394. package/dist/tools/follow-up-request.js.map +1 -0
  395. package/dist/tools/followup-revision.d.ts +4 -0
  396. package/dist/tools/followup-revision.js +29 -0
  397. package/dist/tools/followup-revision.js.map +1 -0
  398. package/dist/tools/incomplete-list.js +4 -0
  399. package/dist/tools/incomplete-list.js.map +1 -1
  400. package/dist/tools/inventory.js +47 -11
  401. package/dist/tools/inventory.js.map +1 -1
  402. package/dist/tools/operation-recovery.d.ts +4 -0
  403. package/dist/tools/operation-recovery.js +33 -0
  404. package/dist/tools/operation-recovery.js.map +1 -0
  405. package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
  406. package/dist/tools/registry-mapping-primary.cases.js +753 -0
  407. package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
  408. package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
  409. package/dist/tools/registry-mapping-secondary.cases.js +626 -0
  410. package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
  411. package/dist/tools/registry-mapping.cases.d.ts +8 -0
  412. package/dist/tools/registry-mapping.cases.js +13 -0
  413. package/dist/tools/registry-mapping.cases.js.map +1 -0
  414. package/dist/tools/registry-test-fixtures.d.ts +50 -0
  415. package/dist/tools/registry-test-fixtures.js +120 -0
  416. package/dist/tools/registry-test-fixtures.js.map +1 -0
  417. package/dist/tools/registry.d.ts +2 -0
  418. package/dist/tools/registry.js +82 -52
  419. package/dist/tools/registry.js.map +1 -1
  420. package/dist/tools/result.d.ts +1 -0
  421. package/dist/tools/result.js +90 -22
  422. package/dist/tools/result.js.map +1 -1
  423. package/dist/tools/toolsets.d.ts +16 -0
  424. package/dist/tools/toolsets.js +25 -1
  425. package/dist/tools/toolsets.js.map +1 -1
  426. package/dist/types/api-contract.gen.d.ts +105862 -22115
  427. package/dist/utils/credential-signatures.d.ts +3 -0
  428. package/dist/utils/credential-signatures.js +10 -0
  429. package/dist/utils/credential-signatures.js.map +1 -0
  430. package/dist/utils/data-source-column-name.d.ts +10 -0
  431. package/dist/utils/data-source-column-name.js +36 -0
  432. package/dist/utils/data-source-column-name.js.map +1 -0
  433. package/dist/utils/logger.d.ts +1 -0
  434. package/dist/utils/logger.js +32 -8
  435. package/dist/utils/logger.js.map +1 -1
  436. package/dist/utils/secret-read-boundary.d.ts +2 -0
  437. package/dist/utils/secret-read-boundary.js +88 -0
  438. package/dist/utils/secret-read-boundary.js.map +1 -0
  439. package/dist/utils/setup-secrets.d.ts +4 -0
  440. package/dist/utils/setup-secrets.js +40 -0
  441. package/dist/utils/setup-secrets.js.map +1 -0
  442. package/docs/agent-models.md +9 -0
  443. package/docs/agent-usage-guide.full.ru.md +1 -4
  444. package/docs/analytics-contract.md +67 -0
  445. package/docs/async-operation-lifecycle.md +10 -3
  446. package/docs/connect.ru.md +144 -4
  447. package/docs/contact-company-profile.md +17 -0
  448. package/docs/contact-recommendations.md +7 -0
  449. package/docs/crm-stage-pool.md +73 -0
  450. package/docs/customer-data.md +61 -0
  451. package/docs/edit-versions.md +36 -0
  452. package/docs/failure-semantics.md +17 -9
  453. package/docs/help-navigation.md +15 -42
  454. package/docs/host-compatibility-matrix.md +72 -93
  455. package/docs/host-setup.md +33 -35
  456. package/docs/invariants/public-api-and-contracts.md +16 -0
  457. package/docs/legacy-action-settings.md +21 -0
  458. package/docs/main-transfer-dependencies.md +38 -0
  459. package/docs/mcp2-parity.md +50 -0
  460. package/docs/modules/analytics.md +79 -0
  461. package/docs/modules/besales-mcp.md +137 -0
  462. package/docs/modules/dialog-review-report.md +38 -0
  463. package/docs/modules/dialogue-followup-adapters.md +39 -0
  464. package/docs/modules/message-reactions.md +17 -0
  465. package/docs/modules/network-mode.md +284 -0
  466. package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
  467. package/docs/pii-policy.md +21 -16
  468. package/docs/response-size-budget.md +197 -7
  469. package/docs/secret-read-boundary.md +102 -0
  470. package/docs/task-state.md +7 -2
  471. package/docs/telegram-pool-policy.md +19 -0
  472. package/docs/tool-effects.md +15 -9
  473. package/docs/tool-surface.md +205 -4
  474. package/docs/voice-actions-and-inbox.md +95 -0
  475. package/docs/wazzup-instagram-comments.md +26 -0
  476. package/package.json +17 -10
  477. package/scripts/api-source-loader.spec.mjs +40 -0
  478. package/scripts/audit-bridge-controls.mjs +129 -0
  479. package/scripts/audit-revert-mutants.mjs +107 -0
  480. package/scripts/bridge-api-input.spec.mjs +98 -0
  481. package/scripts/bridge-controls-mutants.mjs +130 -0
  482. package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
  483. package/scripts/brx4-ledger-payload.spec.mjs +127 -0
  484. package/scripts/build-onprem.mjs +108 -0
  485. package/scripts/connect-clients.sh +141 -0
  486. package/scripts/connect-scopes.mjs +166 -0
  487. package/scripts/connect-scopes.spec.mjs +83 -0
  488. package/scripts/emit-personal-link-carrier.mjs +31 -0
  489. package/scripts/emit-setup-init-schemas.mjs +24 -0
  490. package/scripts/emit-tool-routes.mjs +878 -0
  491. package/scripts/emit-tool-routes.spec.mjs +300 -0
  492. package/scripts/followup-registry.spec.mjs +107 -0
  493. package/scripts/generate-crm-rotation-contract.mjs +98 -0
  494. package/scripts/generate-followup-session-contract.mjs +16 -0
  495. package/scripts/icp-import-verification/mutate.cjs +70 -0
  496. package/scripts/import-secret-read-contract.mjs +53 -0
  497. package/scripts/install-claude-desktop.js +1 -1
  498. package/scripts/lag-decisions.mjs +37 -0
  499. package/scripts/lag-decisions.spec.mjs +87 -0
  500. package/scripts/lag-open-task-owners.mjs +46 -0
  501. package/scripts/lag-open-task-owners.spec.mjs +78 -0
  502. package/scripts/lag-payload.mjs +10 -0
  503. package/scripts/legacy-action-lag.spec.mjs +22 -0
  504. package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
  505. package/scripts/mcpcompat-handler.mjs +34 -0
  506. package/scripts/mcpcompat-loader.mjs +36 -0
  507. package/scripts/mcpcompat-typescript.mjs +3 -0
  508. package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
  509. package/scripts/prbr-round1-recheck.spec.mjs +605 -0
  510. package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
  511. package/scripts/publish-mcp-registry.mjs +98 -0
  512. package/scripts/publish-mcp-registry.spec.mjs +68 -0
  513. package/scripts/record-scheduled-task-call.mjs +26 -0
  514. package/scripts/refusal-probe.mjs +17 -0
  515. package/scripts/refusal-probe.spec.mjs +29 -0
  516. package/scripts/registry-diff.mjs +502 -0
  517. package/scripts/registry-diff.spec.mjs +787 -0
  518. package/scripts/request-query.mjs +43 -0
  519. package/scripts/request-query.spec.mjs +82 -0
  520. package/scripts/route-lag.mjs +23 -0
  521. package/scripts/route-lag.spec.mjs +30 -0
  522. package/scripts/sample-args.mjs +174 -0
  523. package/scripts/sample-args.spec.mjs +160 -0
  524. package/scripts/shipped-definitions.mjs +197 -0
  525. package/scripts/shipped-definitions.spec.mjs +57 -0
  526. package/scripts/shipped-inputs.spec.mjs +136 -0
  527. package/scripts/shipped-recordings.spec.mjs +19 -0
  528. package/scripts/shipped-ref.d.mts +5 -0
  529. package/scripts/shipped-ref.mjs +20 -0
  530. package/scripts/shipped-ref.spec.mjs +59 -0
  531. package/scripts/shipped-registry.mjs +107 -0
  532. package/scripts/shipped-sample-candidates.mjs +69 -0
  533. package/scripts/shipped-sample-candidates.spec.mjs +117 -0
  534. package/scripts/shipped-sample.mjs +868 -0
  535. package/scripts/shipped-sample.spec.mjs +451 -0
  536. package/scripts/sync-agent-model-schemas.mjs +72 -0
  537. package/scripts/sync-api-contracts.mjs +85 -0
  538. package/scripts/sync-api-contracts.spec.mjs +144 -0
  539. package/scripts/sync-contract-ledger-schemas.mjs +161 -0
  540. package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
  541. package/scripts/sync-prompt-draft-schema.mjs +92 -0
  542. package/scripts/sync-route-map.mjs +94 -0
  543. package/scripts/sync-schema-descriptions.mjs +25 -0
  544. package/scripts/sync-tool-inventory.mjs +27 -0
  545. package/scripts/sync-trigger-argument-schema.mjs +121 -0
  546. package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
  547. package/scripts/sync-voice-actions-contract.mjs +67 -0
  548. package/scripts/sync-voice-actions-tools.mjs +97 -0
  549. package/scripts/sync-wave-id-schemas.mjs +55 -0
  550. package/scripts/tool-input-schemas.mjs +46 -0
  551. package/scripts/tool-input-schemas.spec.mjs +50 -0
  552. package/scripts/verify-followup-adapters.mjs +235 -0
  553. package/scripts/verify-secret-read-import.mjs +84 -0
  554. package/scripts/verify-secret-read-mutants.mjs +143 -0
  555. package/dist/tools/definitions/analytics.d.ts +0 -40
  556. package/dist/tools/definitions/analytics.js +0 -233
  557. package/dist/tools/definitions/analytics.js.map +0 -1
  558. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
  559. package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
  560. package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
  561. package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
  562. package/dist/tools/definitions/dialogue-audit.js +0 -292
  563. package/dist/tools/definitions/dialogue-audit.js.map +0 -1
  564. package/dist/tools/definitions/getcourse-wave.js +0 -519
  565. package/dist/tools/definitions/getcourse-wave.js.map +0 -1
  566. package/dist/tools/definitions/operational-overview.d.ts +0 -3
  567. package/dist/tools/definitions/operational-overview.js +0 -23
  568. package/dist/tools/definitions/operational-overview.js.map +0 -1
  569. package/dist/tools/definitions/scheduled-tasks.js +0 -173
  570. package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
  571. package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
  572. package/dist/tools/definitions/trigger-contact-claims.js +0 -60
  573. package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
  574. package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
  575. package/dist/tools/registry-mapping-cases-core.js +0 -927
  576. package/dist/tools/registry-mapping-cases-core.js.map +0 -1
  577. package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
  578. package/dist/tools/registry-mapping-cases-platform.js +0 -1052
  579. package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
  580. package/dist/tools/trigger-action-config.d.ts +0 -49
  581. package/dist/tools/trigger-action-config.js +0 -171
  582. package/dist/tools/trigger-action-config.js.map +0 -1
  583. package/docs/evals/model-behavior-scorecard.md +0 -80
  584. package/docs/operation-coverage.md +0 -114
  585. package/scripts/mock-credentials.js +0 -77
  586. package/scripts/model-eval-server.js +0 -213
  587. package/scripts/run-model-eval.js +0 -447
@@ -1,267 +1,10 @@
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';
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'];
4
7
  export const crmPlatformTools = [
5
- // ============================================================
6
- // v1.5 Increment 4a — Unified Variables API (5 tools, v2-shaped scope discriminator)
7
- // ============================================================
8
- // Backend wraps two v1 tables (WorkspaceVariable + CustomVariable) под единый MCP shape.
9
- // При v2 cutover (spec 23) обе таблицы → один `variables` с тем же `scope` discriminator —
10
- // MCP shape работает без изменений.
11
- defineTool({
12
- name: 'besales_variable_list',
13
- sideEffect: 'none',
14
- closedWorld: true,
15
- requiredFields: ['scope'],
16
- defaultWorkspaceId: true,
17
- // По этому перечню строят условия правил. Отсутствующая в усечённом списке переменная
18
- // неотличима от «значение не проставлено», и правило получается недостижимым.
19
- resultPolicy: { neverTruncate: true },
20
- schema: z
21
- .object({
22
- workspace_id: uuidSchema.optional(),
23
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
24
- platform_id: uuidSchema.optional(),
25
- filter: z.enum(['all', 'variables', 'constants']).optional(),
26
- // ⚠️ Без дефолта. Сервер СВОЙ дефолт имеет (50), и до появления этих двух ручек
27
- // перечень молча обрывался на пятидесятой строке, а способа дочитать не было вовсе.
28
- limit: z.number().int().min(1).max(VARIABLES_MAX_PAGE_SIZE).optional(),
29
- cursor: z.string().min(1).optional(),
30
- })
31
- .strict()
32
- .superRefine((input, ctx) => {
33
- if (input.scope === 'CHANNEL' && !input.platform_id) {
34
- ctx.addIssue({
35
- code: z.ZodIssueCode.custom,
36
- message: 'platform_id is required when scope=CHANNEL',
37
- path: ['platform_id'],
38
- });
39
- }
40
- if (input.scope === 'WORKSPACE' && input.platform_id) {
41
- ctx.addIssue({
42
- code: z.ZodIssueCode.custom,
43
- message: 'platform_id is forbidden when scope=WORKSPACE',
44
- path: ['platform_id'],
45
- });
46
- }
47
- }),
48
- createRequest: (input) => ({
49
- method: 'GET',
50
- path: `/workspaces/${input.workspace_id}/variables${buildVariableListQuery(input.scope, input.platform_id, input.filter, input.limit, input.cursor)}`,
51
- }),
52
- enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
53
- // Страницу попросили явно — отказ неуместен: постраничный обход это и есть.
54
- pageRequested: input.limit !== undefined || input.cursor !== undefined,
55
- toolName: 'besales_variable_list',
56
- howToPage: `Позовите снова с limit (до ${VARIABLES_MAX_PAGE_SIZE}) и продолжайте по nextCursor, пока он не станет пустым.`,
57
- }), [
58
- 'WORKSPACE scope возвращает глобальные переменные workspace; CHANNEL — переменные указанной платформы.',
59
- 'CHANNEL требует platform_id; filter=variables исключает константы, filter=constants оставляет только их.',
60
- 'nextCursor в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
61
- ]),
62
- }),
63
- defineTool({
64
- name: 'besales_variable_create',
65
- sideEffect: 'write',
66
- closedWorld: true,
67
- requiredFields: ['scope', 'name', 'type'],
68
- defaultWorkspaceId: true,
69
- schema: z
70
- .object({
71
- workspace_id: uuidSchema.optional(),
72
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
73
- name: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
74
- message: 'name must be ASCII letters/digits/underscores; start with letter or _',
75
- }),
76
- description: z.string().optional(),
77
- type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']),
78
- // WORKSPACE-only
79
- value: z.string().optional(),
80
- // CHANNEL-only
81
- platform_id: uuidSchema.optional(),
82
- is_constant: z.boolean().optional(),
83
- constant_value: z.string().optional(),
84
- })
85
- .strict()
86
- .superRefine((input, ctx) => {
87
- if (input.scope === 'WORKSPACE') {
88
- if (input.platform_id) {
89
- ctx.addIssue({
90
- code: z.ZodIssueCode.custom,
91
- message: 'platform_id is forbidden when scope=WORKSPACE',
92
- path: ['platform_id'],
93
- });
94
- }
95
- if (input.is_constant !== undefined || input.constant_value !== undefined) {
96
- ctx.addIssue({
97
- code: z.ZodIssueCode.custom,
98
- message: 'is_constant and constant_value are forbidden when scope=WORKSPACE',
99
- path: ['is_constant'],
100
- });
101
- }
102
- }
103
- else {
104
- // CHANNEL
105
- if (!input.platform_id) {
106
- ctx.addIssue({
107
- code: z.ZodIssueCode.custom,
108
- message: 'platform_id is required when scope=CHANNEL',
109
- path: ['platform_id'],
110
- });
111
- }
112
- if (input.value !== undefined) {
113
- ctx.addIssue({
114
- code: z.ZodIssueCode.custom,
115
- message: 'value is forbidden when scope=CHANNEL — use constant_value if isConstant=true',
116
- path: ['value'],
117
- });
118
- }
119
- if (input.is_constant === true && !input.constant_value) {
120
- ctx.addIssue({
121
- code: z.ZodIssueCode.custom,
122
- message: 'constant_value is required when scope=CHANNEL and is_constant=true',
123
- path: ['constant_value'],
124
- });
125
- }
126
- }
127
- }),
128
- createRequest: (input) => ({
129
- method: 'POST',
130
- path: `/workspaces/${input.workspace_id}/variables`,
131
- body: compactObject({
132
- scope: input.scope,
133
- name: input.name,
134
- description: input.description,
135
- type: input.type,
136
- value: input.value,
137
- platformId: input.platform_id,
138
- isConstant: input.is_constant,
139
- constantValue: input.constant_value,
140
- }),
141
- }),
142
- enhanceResponse: (response) => withInstructions(response, [
143
- 'name, scope, is_constant — immutable post-create (используй delete + create для смены).',
144
- 'WORKSPACE variables референсятся в шаблонах как {{{name}}} (triple braces), CHANNEL constants — {{name}} (double).',
145
- ]),
146
- }),
147
- defineTool({
148
- name: 'besales_variable_get',
149
- sideEffect: 'none',
150
- closedWorld: true,
151
- requiredFields: ['variable_id', 'scope'],
152
- defaultWorkspaceId: true,
153
- schema: z
154
- .object({
155
- workspace_id: uuidSchema.optional(),
156
- variable_id: uuidSchema,
157
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
158
- platform_id: uuidSchema.optional(),
159
- })
160
- .strict()
161
- .superRefine((input, ctx) => {
162
- if (input.scope === 'CHANNEL' && !input.platform_id) {
163
- ctx.addIssue({
164
- code: z.ZodIssueCode.custom,
165
- message: 'platform_id is required when scope=CHANNEL',
166
- path: ['platform_id'],
167
- });
168
- }
169
- }),
170
- createRequest: (input) => ({
171
- method: 'GET',
172
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}${buildVariableScopeQuery(input.scope, input.platform_id)}`,
173
- }),
174
- }),
175
- defineTool({
176
- name: 'besales_variable_update',
177
- sideEffect: 'write',
178
- closedWorld: true,
179
- requiredFields: ['variable_id', 'scope'],
180
- defaultWorkspaceId: true,
181
- schema: z
182
- .object({
183
- workspace_id: uuidSchema.optional(),
184
- variable_id: uuidSchema,
185
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
186
- platform_id: uuidSchema.optional(),
187
- description: z.string().optional(),
188
- type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']).optional(),
189
- // WORKSPACE-only (nullable для clear)
190
- value: z.string().nullable().optional(),
191
- // CHANNEL-only (nullable для clear)
192
- constant_value: z.string().nullable().optional(),
193
- })
194
- .strict()
195
- .superRefine((input, ctx) => {
196
- if (input.scope === 'CHANNEL' && !input.platform_id) {
197
- ctx.addIssue({
198
- code: z.ZodIssueCode.custom,
199
- message: 'platform_id is required when scope=CHANNEL',
200
- path: ['platform_id'],
201
- });
202
- }
203
- if (input.scope === 'WORKSPACE' && input.constant_value !== undefined) {
204
- ctx.addIssue({
205
- code: z.ZodIssueCode.custom,
206
- message: 'constant_value is forbidden when scope=WORKSPACE',
207
- path: ['constant_value'],
208
- });
209
- }
210
- if (input.scope === 'CHANNEL' && input.value !== undefined) {
211
- ctx.addIssue({
212
- code: z.ZodIssueCode.custom,
213
- message: 'value is forbidden when scope=CHANNEL',
214
- path: ['value'],
215
- });
216
- }
217
- }),
218
- createRequest: (input) => ({
219
- method: 'PATCH',
220
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
221
- body: compactObject({
222
- scope: input.scope,
223
- platformId: input.platform_id,
224
- description: input.description,
225
- type: input.type,
226
- value: input.value,
227
- constantValue: input.constant_value,
228
- }),
229
- }),
230
- }),
231
- defineTool({
232
- name: 'besales_variable_delete',
233
- sideEffect: 'write',
234
- closedWorld: true,
235
- requiredFields: ['variable_id', 'scope', 'explicit_confirmation'],
236
- defaultWorkspaceId: true,
237
- schema: z
238
- .object({
239
- workspace_id: uuidSchema.optional(),
240
- variable_id: uuidSchema,
241
- scope: z.enum(['WORKSPACE', 'CHANNEL']),
242
- platform_id: uuidSchema.optional(),
243
- explicit_confirmation: z.literal(true),
244
- })
245
- .strict()
246
- .superRefine((input, ctx) => {
247
- if (input.scope === 'CHANNEL' && !input.platform_id) {
248
- ctx.addIssue({
249
- code: z.ZodIssueCode.custom,
250
- message: 'platform_id is required when scope=CHANNEL',
251
- path: ['platform_id'],
252
- });
253
- }
254
- }),
255
- createRequest: (input) => ({
256
- method: 'DELETE',
257
- path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
258
- body: compactObject({
259
- scope: input.scope,
260
- platformId: input.platform_id,
261
- explicitConfirmation: input.explicit_confirmation,
262
- }),
263
- }),
264
- }),
265
8
  // ============================================================
266
9
  // v1.5 Increment 4b — CRM Pipelines (11 tools)
267
10
  // ============================================================
@@ -286,14 +29,21 @@ export const crmPlatformTools = [
286
29
  workspace_id: uuidSchema.optional(),
287
30
  crm_id: uuidSchema,
288
31
  include_deleted: z.boolean().optional(),
32
+ // ⚠️ Без умолчания: отказ по размеру был отказом БЕЗ ВЫХОДА — сузить перечень было нечем.
33
+ limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
34
+ cursor: z.string().min(1).optional(),
289
35
  })
290
36
  .strict(),
291
37
  createRequest: (input) => ({
292
38
  method: 'GET',
293
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines${input.include_deleted !== undefined ? `?includeDeleted=${input.include_deleted}` : ''}`,
39
+ 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)}` : ''}`,
294
40
  }),
295
- enhanceResponse: (response) => withInstructions(response, [
296
- 'Триггерит sync с external CRM (AmoCRM/Bitrix24) при каждом вызове — best-effort, не блокирует list при failure.',
41
+ enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
42
+ pageRequested: input.limit !== undefined || input.cursor !== undefined,
43
+ toolName: 'besales_crm_pipeline_list',
44
+ howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
45
+ }), [
46
+ 'Перед list выполняется best-effort sync; ошибка провайдера не блокирует локальную выдачу.',
297
47
  ]),
298
48
  }),
299
49
  defineTool({
@@ -310,7 +60,7 @@ export const crmPlatformTools = [
310
60
  .strict(),
311
61
  createRequest: (input) => ({
312
62
  method: 'GET',
313
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
63
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
314
64
  }),
315
65
  }),
316
66
  defineTool({
@@ -333,7 +83,7 @@ export const crmPlatformTools = [
333
83
  .strict(),
334
84
  createRequest: (input) => ({
335
85
  method: 'POST',
336
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines`,
86
+ path: `/crm-connections/${input.crm_id}/pipelines`,
337
87
  body: compactObject({
338
88
  name: input.name,
339
89
  sort: input.sort,
@@ -353,11 +103,7 @@ export const crmPlatformTools = [
353
103
  name: 'besales_crm_pipeline_update',
354
104
  sideEffect: 'write',
355
105
  defaultWorkspaceId: true,
356
- requiredFields: [
357
- 'crm_id',
358
- 'pipeline_id',
359
- 'acknowledge_external_side_effect',
360
- ],
106
+ requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
361
107
  schema: z
362
108
  .object({
363
109
  workspace_id: uuidSchema.optional(),
@@ -373,7 +119,7 @@ export const crmPlatformTools = [
373
119
  .strict(),
374
120
  createRequest: (input) => ({
375
121
  method: 'PATCH',
376
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
122
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
377
123
  body: compactObject({
378
124
  name: input.name,
379
125
  sort: input.sort,
@@ -384,7 +130,7 @@ export const crmPlatformTools = [
384
130
  }),
385
131
  }),
386
132
  enhanceResponse: (response) => withInstructions(response, [
387
- 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в PipelineSettings — обновляй через besales_pipeline_settings_update.',
133
+ 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
388
134
  ]),
389
135
  }),
390
136
  defineTool({
@@ -408,7 +154,7 @@ export const crmPlatformTools = [
408
154
  .strict(),
409
155
  createRequest: (input) => ({
410
156
  method: 'DELETE',
411
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
157
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
412
158
  body: {
413
159
  explicitConfirmation: input.explicit_confirmation,
414
160
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -432,24 +178,34 @@ export const crmPlatformTools = [
432
178
  workspace_id: uuidSchema.optional(),
433
179
  crm_id: uuidSchema,
434
180
  pipeline_id: z.number().int(),
181
+ // ⚠️ Без умолчания: недостающая стадия даёт недостижимое правило маршрутизации.
182
+ limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
183
+ cursor: z.string().min(1).optional(),
435
184
  })
436
185
  .strict(),
437
- createRequest: (input) => ({
438
- method: 'GET',
439
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
186
+ createRequest: (input) => {
187
+ const query = new URLSearchParams();
188
+ if (input.limit !== undefined)
189
+ query.set('limit', String(input.limit));
190
+ if (input.cursor)
191
+ query.set('cursor', input.cursor);
192
+ const suffix = query.size > 0 ? `?${query.toString()}` : '';
193
+ return {
194
+ method: 'GET',
195
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses${suffix}`,
196
+ };
197
+ },
198
+ enhanceResponse: (response, input) => assertCompleteList(response, {
199
+ pageRequested: input.limit !== undefined || input.cursor !== undefined,
200
+ toolName: 'besales_crm_pipeline_status_list',
201
+ howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
440
202
  }),
441
203
  }),
442
204
  defineTool({
443
205
  name: 'besales_crm_pipeline_status_create',
444
206
  sideEffect: 'write',
445
207
  defaultWorkspaceId: true,
446
- requiredFields: [
447
- 'crm_id',
448
- 'pipeline_id',
449
- 'name',
450
- 'sort',
451
- 'acknowledge_external_side_effect',
452
- ],
208
+ requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
453
209
  schema: z
454
210
  .object({
455
211
  workspace_id: uuidSchema.optional(),
@@ -460,8 +216,16 @@ export const crmPlatformTools = [
460
216
  color: z.string().optional(),
461
217
  status_types: z.array(z.string()).optional(),
462
218
  is_editable: z.boolean().optional(),
219
+ is_system_managed: z
220
+ .boolean()
221
+ .optional()
222
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
463
223
  is_bot_active: z.boolean().optional(),
464
224
  is_operator_available: z.boolean().optional(),
225
+ is_terminal: z
226
+ .boolean()
227
+ .optional()
228
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
465
229
  on_message_received_move_to_status: z.number().int().nullable().optional(),
466
230
  status_id: z.number().int().optional(),
467
231
  acknowledge_external_side_effect: z.literal(true),
@@ -469,15 +233,17 @@ export const crmPlatformTools = [
469
233
  .strict(),
470
234
  createRequest: (input) => ({
471
235
  method: 'POST',
472
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
236
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
473
237
  body: compactObject({
474
238
  name: input.name,
475
239
  sort: input.sort,
476
240
  color: input.color,
477
241
  statusTypes: input.status_types,
478
242
  isEditable: input.is_editable,
243
+ isSystemManaged: input.is_system_managed,
479
244
  isBotActive: input.is_bot_active,
480
245
  isOperatorAvailable: input.is_operator_available,
246
+ isTerminal: input.is_terminal,
481
247
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
482
248
  statusId: input.status_id,
483
249
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -491,12 +257,7 @@ export const crmPlatformTools = [
491
257
  name: 'besales_crm_pipeline_status_update',
492
258
  sideEffect: 'write',
493
259
  defaultWorkspaceId: true,
494
- requiredFields: [
495
- 'crm_id',
496
- 'pipeline_id',
497
- 'status_id',
498
- 'acknowledge_external_side_effect',
499
- ],
260
+ requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
500
261
  schema: z
501
262
  .object({
502
263
  workspace_id: uuidSchema.optional(),
@@ -510,17 +271,21 @@ export const crmPlatformTools = [
510
271
  is_system_managed: z
511
272
  .boolean()
512
273
  .optional()
513
- .describe('Главный переключатель управления статусом системой'),
274
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
514
275
  is_editable: z.boolean().optional(),
515
276
  is_bot_active: z.boolean().optional(),
516
277
  is_operator_available: z.boolean().optional(),
278
+ is_terminal: z
279
+ .boolean()
280
+ .optional()
281
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
517
282
  on_message_received_move_to_status: z.number().int().nullable().optional(),
518
283
  acknowledge_external_side_effect: z.literal(true),
519
284
  })
520
285
  .strict(),
521
286
  createRequest: (input) => ({
522
287
  method: 'PATCH',
523
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
288
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
524
289
  body: compactObject({
525
290
  name: input.name,
526
291
  sort: input.sort,
@@ -530,6 +295,7 @@ export const crmPlatformTools = [
530
295
  isEditable: input.is_editable,
531
296
  isBotActive: input.is_bot_active,
532
297
  isOperatorAvailable: input.is_operator_available,
298
+ isTerminal: input.is_terminal,
533
299
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
534
300
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
535
301
  }),
@@ -561,7 +327,7 @@ export const crmPlatformTools = [
561
327
  .strict(),
562
328
  createRequest: (input) => ({
563
329
  method: 'DELETE',
564
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
330
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
565
331
  body: {
566
332
  explicitConfirmation: input.explicit_confirmation,
567
333
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -575,6 +341,11 @@ export const crmPlatformTools = [
575
341
  requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
576
342
  schema: z
577
343
  .object({
344
+ expected_version: z
345
+ .string()
346
+ .min(1)
347
+ .regex(/^[A-Za-z0-9_.-]+$/u)
348
+ .optional(),
578
349
  workspace_id: uuidSchema.optional(),
579
350
  platform_id: uuidSchema,
580
351
  pipeline_id: z.number().int(),
@@ -584,14 +355,16 @@ export const crmPlatformTools = [
584
355
  .strict(),
585
356
  createRequest: (input) => ({
586
357
  method: 'POST',
587
- path: `/workspaces/${input.workspace_id}/platforms/${input.platform_id}/active-pipelines`,
358
+ path: `/channels/${input.platform_id}/active-pipelines`,
588
359
  body: compactObject({
360
+ expectedVersion: input.expected_version,
589
361
  pipelineId: input.pipeline_id,
590
362
  pipelineCrmId: input.pipeline_crm_id,
591
363
  sort: input.sort,
592
364
  }),
593
365
  }),
594
366
  enhanceResponse: (response) => withInstructions(response, [
367
+ editVersionInstruction(),
595
368
  'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
596
369
  ]),
597
370
  }),
@@ -602,6 +375,11 @@ export const crmPlatformTools = [
602
375
  requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
603
376
  schema: z
604
377
  .object({
378
+ expected_version: z
379
+ .string()
380
+ .min(1)
381
+ .regex(/^[A-Za-z0-9_.-]+$/u)
382
+ .optional(),
605
383
  workspace_id: uuidSchema.optional(),
606
384
  platform_id: uuidSchema,
607
385
  platform_pipeline_id: uuidSchema,
@@ -610,9 +388,11 @@ export const crmPlatformTools = [
610
388
  .strict(),
611
389
  createRequest: (input) => ({
612
390
  method: 'DELETE',
613
- path: `/workspaces/${input.workspace_id}/platforms/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
391
+ ...compactObject({ ifMatch: input.expected_version }),
392
+ path: `/channels/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
614
393
  body: { explicitConfirmation: input.explicit_confirmation },
615
394
  }),
395
+ enhanceResponse: withEditVersionInstructions,
616
396
  }),
617
397
  // ============================================================
618
398
  // v1.5 Increment 4d — cross-platform clone (3 tools)
@@ -662,10 +442,10 @@ export const crmPlatformTools = [
662
442
  }),
663
443
  createRequest: (input) => ({
664
444
  method: 'POST',
665
- path: `/workspaces/${input.workspace_id}/platforms/clone/preview`,
445
+ path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
666
446
  body: compactObject({
667
- sourcePlatformId: input.source_platform_id,
668
- targetPlatformId: input.target_platform_id,
447
+ sourceChannelId: input.source_platform_id,
448
+ targetChannelId: input.target_platform_id,
669
449
  include: compactObject({
670
450
  agents: input.include.agents,
671
451
  agentTools: input.include.agent_tools,
@@ -732,11 +512,11 @@ export const crmPlatformTools = [
732
512
  .strict(),
733
513
  createRequest: (input) => ({
734
514
  method: 'POST',
735
- path: `/workspaces/${input.workspace_id}/platforms/clone/execute`,
515
+ path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
736
516
  body: compactObject({
737
517
  previewToken: input.preview_token,
738
- sourcePlatformId: input.source_platform_id,
739
- targetPlatformId: input.target_platform_id,
518
+ sourceChannelId: input.source_platform_id,
519
+ targetChannelId: input.target_platform_id,
740
520
  explicitConfirmation: input.explicit_confirmation,
741
521
  acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
742
522
  idempotencyKey: input.idempotency_key,
@@ -744,7 +524,7 @@ export const crmPlatformTools = [
744
524
  }),
745
525
  }),
746
526
  enhanceResponse: (response) => withInstructions(response, [
747
- 'Result reversible через besales_audit_revert (kind=revertClone) — пометит CloneRun.status=REVERTED.',
527
+ 'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
748
528
  'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
749
529
  'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
750
530
  'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
@@ -763,7 +543,7 @@ export const crmPlatformTools = [
763
543
  .strict(),
764
544
  createRequest: (input) => ({
765
545
  method: 'GET',
766
- path: `/workspaces/${input.workspace_id}/platforms/clone/${input.clone_id}`,
546
+ path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
767
547
  }),
768
548
  }),
769
549
  // ============================================================
@@ -786,6 +566,10 @@ export const crmPlatformTools = [
786
566
  source: mcpFileSourceSchema.optional(),
787
567
  mime_type: z.string().max(255).optional(),
788
568
  size_bytes: z.number().int().positive().max(MAX_FILE_UPLOAD_BYTES).optional(),
569
+ // Носитель, РАДИ которого грузится файл: он станет владельцем и только он вправе его
570
+ // убрать. Порядок: создать карточку → запросить загрузку ДЛЯ НЕЁ → человек кладёт файл.
571
+ owner_kind: z.literal('KNOWLEDGE_SOURCE').optional(),
572
+ owner_id: uuidSchema.optional(),
789
573
  })
790
574
  .strict(),
791
575
  createRequest: (input) => ({
@@ -798,11 +582,14 @@ export const crmPlatformTools = [
798
582
  source: input.source,
799
583
  mime_type: input.mime_type,
800
584
  size_bytes: input.size_bytes,
585
+ owner_kind: input.owner_kind,
586
+ owner_id: input.owner_id,
801
587
  }),
802
588
  }),
803
589
  enhanceResponse: (response) => withInstructions(response, [
804
590
  'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
805
- 'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в knowledge_document_upload / behavior greeting).',
591
+ 'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в besales_knowledge_document_upload с source_kind=STORED_FILE / behavior greeting).',
592
+ 'Файл ДЛЯ карточки знаний: сначала создайте карточку, затем запросите загрузку с owner_kind=KNOWLEDGE_SOURCE и owner_id=<id карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
806
593
  'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
807
594
  ]),
808
595
  }),
@@ -819,7 +606,7 @@ export const crmPlatformTools = [
819
606
  .strict(),
820
607
  createRequest: (input) => ({
821
608
  method: 'GET',
822
- path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
609
+ path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
823
610
  }),
824
611
  enhanceResponse: (response) => withInstructions(response, [
825
612
  'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -862,6 +649,7 @@ export const crmPlatformTools = [
862
649
  schema: z
863
650
  .object({
864
651
  workspace_id: uuidSchema.optional(),
652
+ operation_id: setupInitOperationIdSchema,
865
653
  platform_type: apiKeyPlatformTypeSchema,
866
654
  name: z.string().min(1).max(255),
867
655
  // Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
@@ -876,6 +664,7 @@ export const crmPlatformTools = [
876
664
  method: 'POST',
877
665
  path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
878
666
  body: compactObject({
667
+ operationId: input.operation_id,
879
668
  platform_type: input.platform_type,
880
669
  name: input.name,
881
670
  fields: input.fields,
@@ -901,7 +690,7 @@ export const crmPlatformTools = [
901
690
  .strict(),
902
691
  createRequest: (input) => ({
903
692
  method: 'GET',
904
- path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
693
+ path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
905
694
  }),
906
695
  enhanceResponse: (response) => withInstructions(response, [
907
696
  'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -927,7 +716,10 @@ export const crmPlatformTools = [
927
716
  createRequest: (input) => ({
928
717
  method: 'POST',
929
718
  path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
930
- body: compactObject({ platform_type: input.platform_type, name: input.name }),
719
+ body: compactObject({
720
+ platform_type: input.platform_type,
721
+ name: input.name,
722
+ }),
931
723
  }),
932
724
  enhanceResponse: (response) => withInstructions(response, [
933
725
  'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
@@ -936,12 +728,10 @@ export const crmPlatformTools = [
936
728
  ]),
937
729
  }),
938
730
  // ============================================================
939
- // v1.5 Increment 5c — CRM Connection + Field Mapping + Operators (5 tools)
731
+ // CRM Connection + Field Mapping + Operators
940
732
  // ============================================================
941
- // CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GETCOURSE/TELEGRAM
942
- // (API-key) + AMOCRM/BITRIX24 (вставка credentials; Bitrix24 далее завершает local-app install
943
- // вебхуком). Field mapping + operators — для уже подключённых CRM (AmoCRM/Bitrix24 для mapping;
944
- // AmoCRM для operators).
733
+ // CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
734
+ // Bitrix24. Field mapping + operators — для уже подключённых CRM.
945
735
  defineTool({
946
736
  name: 'besales_crm_create_init',
947
737
  sideEffect: 'write',
@@ -950,17 +740,22 @@ export const crmPlatformTools = [
950
740
  schema: z
951
741
  .object({
952
742
  workspace_id: uuidSchema.optional(),
743
+ operation_id: setupInitOperationIdSchema,
953
744
  crm_type: provisionableCrmTypeSchema,
954
745
  // Публичные non-secret поля: GETCOURSE={account_domain, managed_tag_prefix?};
955
- // TELEGRAM={forum_group_id}; AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
956
- // Секреты (school_api_key / crm_bot_token / client_secret / long_access_token) — на /setup/:ref.
746
+ // AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
747
+ // Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
957
748
  fields: optionalAnyObjectSchema,
958
749
  })
959
750
  .strict(),
960
751
  createRequest: (input) => ({
961
752
  method: 'POST',
962
753
  path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
963
- body: compactObject({ crm_type: input.crm_type, fields: input.fields }),
754
+ body: compactObject({
755
+ operationId: input.operation_id,
756
+ crm_type: input.crm_type,
757
+ fields: input.fields,
758
+ }),
964
759
  }),
965
760
  enhanceResponse: (response) => withInstructions(response, [
966
761
  'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
@@ -982,11 +777,11 @@ export const crmPlatformTools = [
982
777
  .strict(),
983
778
  createRequest: (input) => ({
984
779
  method: 'GET',
985
- path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
780
+ path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
986
781
  }),
987
782
  enhanceResponse: (response) => withInstructions(response, [
988
783
  'status: AWAITING_USER → VALIDATING → READY (`crm_id`) | VALIDATION_FAILED (`error_message`) | EXPIRED.',
989
- 'READY = CRM создана + токен онлайн-проверен для Telegram-CRM (getMe) и GetCourse (read-only API-probe) → битый токен/ключ = VALIDATION_FAILED.',
784
+ 'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
990
785
  'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
991
786
  ]),
992
787
  }),
@@ -1003,12 +798,11 @@ export const crmPlatformTools = [
1003
798
  .strict(),
1004
799
  createRequest: (input) => ({
1005
800
  method: 'POST',
1006
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/activate`,
801
+ path: `/crm-connections/${input.crm_id}/activate`,
1007
802
  }),
1008
803
  enhanceResponse: (response) => withInstructions(response, [
1009
- 'CRM активирована: токен live-проверен, остальные CRM workspace деактивированы, связанные триггеры включены.',
1010
- 'Активна одна CRM на workspace за раз — этот вызов ДЕАКТИВИРУЕТ предыдущую активную. Предупреди пользователя перед переключением.',
1011
- 'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
804
+ 'CRM connection активирована после live-проверки credentials.',
805
+ 'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
1012
806
  ]),
1013
807
  }),
1014
808
  defineTool({
@@ -1023,12 +817,12 @@ export const crmPlatformTools = [
1023
817
  .strict(),
1024
818
  createRequest: (input) => ({
1025
819
  method: 'GET',
1026
- path: `/workspaces/${input.workspace_id}/crms`,
820
+ path: `/workspaces/${input.workspace_id}/crm-connections`,
1027
821
  }),
1028
822
  enhanceResponse: (response) => withInstructions(response, [
1029
- 'Список CRM workspace: id, type, status, is_active, account (поддомен/домен), created_at.',
823
+ 'Список v2 CRM connections workspace без credentials.',
1030
824
  'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
1031
- 'is_active=false → CRM есть, но не активна (besales_crm_activate); это объясняет, почему pipelines/field-mapping/operators могут не отвечать.',
825
+ 'Неактивное подключение можно включить через besales_crm_activate.',
1032
826
  ]),
1033
827
  }),
1034
828
  defineTool({
@@ -1048,8 +842,36 @@ export const crmPlatformTools = [
1048
842
  enhanceResponse: (response) => withInstructions(response, [
1049
843
  'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
1050
844
  'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
1051
- 'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот): их знает только владелец аккаунта, назови их отдельно.',
1052
- 'Полученные от поддержки channelId и channelSecretKey привязываются в интерфейсе (POST /api/amo-crm/channel-connect) — через MCP этого шага нет.',
845
+ '⚠️ Метку :scope_id в адресе вебхука НЕ трогай и не заменяй: её подставляет сама amoCRM при каждом хуке. Секрета в адресе нет — это нормально.',
846
+ 'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот, контактный e-mail для связи при ошибках): их знает только владелец аккаунта, назови их отдельно.',
847
+ 'crmConnectionId и crmConnectionName называют подключение, для которого собрана заявка: адрес принадлежит ПОДКЛЮЧЕНИЮ, а не рабочей области.',
848
+ 'Если у рабочей области несколько подключений amoCRM и активное среди них не одно, сервер откажет и назовёт подключения по именам: заявку для нужного подключения открой в интерфейсе — этот инструмент подключение выбрать не умеет.',
849
+ 'Полученные от поддержки channelId и секрет канала привязываются к каналу в интерфейсе (раздел подключения канала, чат amoCRM) — через ассистента секрет не проходит и этого шага в MCP нет.',
850
+ ]),
851
+ }),
852
+ // ⛔ Адрес приёма событий CRM через этот инструмент НЕ проходит: он несёт пропуск параметром
853
+ // строки запроса, а ответ инструмента ложится в транскрипт хоста и его телеметрию. Вместо
854
+ // адреса выдаётся одноразовая ссылка; страница за ней требует входа и права управлять CRM.
855
+ defineTool({
856
+ name: 'besales_crm_webhook_url_reveal',
857
+ sideEffect: 'write',
858
+ requiredFields: ['crm_id'],
859
+ defaultWorkspaceId: false,
860
+ schema: z
861
+ .object({
862
+ crm_id: uuidSchema,
863
+ })
864
+ .strict(),
865
+ createRequest: (input) => ({
866
+ method: 'POST',
867
+ path: '/crm-webhook-url-reveals',
868
+ body: { crmConnectionId: input.crm_id },
869
+ }),
870
+ enhanceResponse: (response) => withInstructions(response, [
871
+ 'Ответ: { revealUrl, revealExpiresAt }. Самого адреса в нём НЕТ и не будет: адрес несёт пропуск, а секреты через ассистента не проходят.',
872
+ 'Передай человеку revealUrl и попроси открыть в браузере. Страница потребует входа и права управлять CRM и покажет адрес ОДИН раз.',
873
+ 'Ссылка одноразовая и с ограниченным сроком (revealExpiresAt); просроченную или уже открытую заказывай заново этим же инструментом.',
874
+ 'Адрес нужен, чтобы человек вписал его в настройки вебхуков amoCRM. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
1053
875
  ]),
1054
876
  }),
1055
877
  defineTool({
@@ -1072,11 +894,11 @@ export const crmPlatformTools = [
1072
894
  .strict(),
1073
895
  createRequest: (input) => ({
1074
896
  method: 'GET',
1075
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
897
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1076
898
  }),
1077
899
  enhanceResponse: (response) => withInstructions(response, [
1078
- 'Возвращает `available_fields` (поля из CRM) + `current_mappings`. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1079
- 'Используйте `available_fields[].id` как `crm_field_id` в `besales_crm_field_mapping_upsert`.',
900
+ 'Возвращает текущий список v2 field mappings.',
901
+ 'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
1080
902
  ]),
1081
903
  }),
1082
904
  defineTool({
@@ -1096,16 +918,22 @@ export const crmPlatformTools = [
1096
918
  .strict(),
1097
919
  createRequest: (input) => ({
1098
920
  method: 'PUT',
1099
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
921
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1100
922
  body: {
1101
- replace_all_existing: input.replace_all_existing,
1102
923
  enabled: input.enabled,
1103
- field_mappings: input.field_mappings,
924
+ mappings: input.field_mappings.map((mapping) => compactObject({
925
+ crmFieldId: mapping.crm_field_id,
926
+ crmFieldName: mapping.crm_field_name,
927
+ saveAs: mapping.save_as,
928
+ isEnabled: mapping.enabled,
929
+ specialPurpose: mapping.special_purpose,
930
+ category: mapping.category,
931
+ })),
1104
932
  },
1105
933
  }),
1106
934
  enhanceResponse: (response) => withInstructions(response, [
1107
- 'Replace-all: передавайте ВЕСЬ набор маппингов (не патч). Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1108
- 'Чтобы изменить — повторно вызовите с новым полным набором (это «undo»). Audit non-reversible (снимок before в diff).',
935
+ 'Replace-all: передавай весь желаемый набор mappings, а не патч.',
936
+ 'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
1109
937
  ]),
1110
938
  }),
1111
939
  defineTool({
@@ -1122,11 +950,11 @@ export const crmPlatformTools = [
1122
950
  .strict(),
1123
951
  createRequest: (input) => ({
1124
952
  method: 'GET',
1125
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
953
+ path: `/crm-connections/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
1126
954
  }),
1127
955
  enhanceResponse: (response) => withInstructions(response, [
1128
- 'Операторы для assignee-стратегий PipelineSettings. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1129
- 'sync=true пересинхронизирует операторов из CRM перед возвратом.',
956
+ 'Возвращаются активные локальные CRM operators.',
957
+ 'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
1130
958
  ]),
1131
959
  }),
1132
960
  defineTool({
@@ -1141,24 +969,87 @@ export const crmPlatformTools = [
1141
969
  operator_id: uuidSchema,
1142
970
  is_operator: z.boolean().optional(),
1143
971
  is_sdr: z.boolean().optional(),
972
+ expected_version: z
973
+ .uuid()
974
+ .describe('Версия снимка из чтения; без автоматического перечитывания и повтора при конфликте')
975
+ .optional(),
976
+ workspace_member_id: z
977
+ .string()
978
+ .min(1)
979
+ .nullable()
980
+ .describe('users.id сотрудника Besales; null снимает связь вручную, пропуск сохраняет её')
981
+ .optional(),
1144
982
  })
1145
983
  .strict()
1146
984
  .superRefine((input, ctx) => {
1147
- if (input.is_operator === undefined && input.is_sdr === undefined) {
985
+ if (input.workspace_member_id !== undefined && input.expected_version === undefined) {
986
+ ctx.addIssue({
987
+ code: z.ZodIssueCode.custom,
988
+ path: ['expected_version'],
989
+ message: 'Provide expected_version when changing workspace_member_id',
990
+ });
991
+ }
992
+ if (!CRM_OPERATOR_CHANGE_FIELDS.some((field) => input[field] !== undefined)) {
1148
993
  ctx.addIssue({
1149
994
  code: z.ZodIssueCode.custom,
1150
- message: 'Provide at least one of is_operator / is_sdr',
995
+ message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
1151
996
  });
1152
997
  }
1153
998
  }),
1154
999
  createRequest: (input) => ({
1155
1000
  method: 'PATCH',
1156
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/operators/${input.operator_id}`,
1157
- body: compactObject({ is_operator: input.is_operator, is_sdr: input.is_sdr }),
1001
+ path: `/crm-connections/${input.crm_id}/operators/${input.operator_id}`,
1002
+ body: compactObject({
1003
+ isOperator: input.is_operator,
1004
+ isSdr: input.is_sdr,
1005
+ expectedVersion: input.expected_version,
1006
+ workspaceMemberId: input.workspace_member_id,
1007
+ }),
1008
+ }),
1009
+ enhanceResponse: (response) => withInstructions(response, [
1010
+ 'Обновляет флаги и ручную связь с сотрудником. workspace_member_id — users.id; null снимает связь вручную.',
1011
+ 'Передайте expected_version прочитанной строки при изменении связи. При 409 сохраните ввод и перечитайте для сравнения; автоматического повтора нет.',
1012
+ 'Непереданный флаг сохраняет текущее значение; operator_id бери из besales_crm_operator_list.',
1013
+ ]),
1014
+ }),
1015
+ defineTool({
1016
+ name: 'besales_crm_rotate_init',
1017
+ sideEffect: 'write',
1018
+ defaultWorkspaceId: true,
1019
+ requiredFields: ['connection_id'],
1020
+ schema: z
1021
+ .object({
1022
+ workspace_id: uuidSchema.optional(),
1023
+ connection_id: uuidSchema,
1024
+ mode: z.enum(['GETCOURSE_KEYS', 'LONG_LIVED', 'OAUTH_PENDING', 'OAUTH']).optional(),
1025
+ })
1026
+ .strict(),
1027
+ createRequest: (input) => ({
1028
+ method: 'POST',
1029
+ path: `/workspaces/${input.workspace_id}/crm-connections/${input.connection_id}/credential-setup-sessions`,
1030
+ body: compactObject({ mode: input.mode }),
1031
+ }),
1032
+ enhanceResponse: (response) => withInstructions(response, [
1033
+ 'Передай setup_page_url человеку: ключи вводятся только в браузере. Не проси секреты в чат. Затем опрашивай besales_crm_rotate_status. Существующая CRM и её связи сохраняются.',
1034
+ ]),
1035
+ }),
1036
+ defineTool({
1037
+ name: 'besales_crm_rotate_status',
1038
+ sideEffect: 'none',
1039
+ defaultWorkspaceId: true,
1040
+ requiredFields: ['setup_ref'],
1041
+ schema: z
1042
+ .object({
1043
+ workspace_id: uuidSchema.optional(),
1044
+ setup_ref: z.string().min(1),
1045
+ })
1046
+ .strict(),
1047
+ createRequest: (input) => ({
1048
+ method: 'GET',
1049
+ path: `/workspaces/${input.workspace_id}/crm-credential-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
1158
1050
  }),
1159
1051
  enhanceResponse: (response) => withInstructions(response, [
1160
- 'Вкл/выкл роли конкретного оператора: is_operator (assignee диалогов) и/или is_sdr. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1161
- 'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
1052
+ 'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
1162
1053
  ]),
1163
1054
  }),
1164
1055
  ];