@besales/mcp 0.48.0 → 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 -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 +9902 -4734
  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 -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 +28 -41
  158. package/dist/tools/definitions/crm-platform.js +235 -368
  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 -357
  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 +14 -29
  241. package/dist/tools/definitions/getcourse-cold-welcome.js +180 -254
  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 +686 -224
  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 +396 -307
  343. package/dist/tools/definitions/shared.js +430 -652
  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 +1089 -636
  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 +105875 -22205
  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 -963
  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,291 +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';
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
- defineTool({
14
- name: 'besales_variable_list',
15
- 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
- }),
50
- createRequest: (input) => ({
51
- method: 'GET',
52
- path: `/workspaces/${input.workspace_id}/variables${buildVariableListQuery(input.scope, input.platform_id, input.filter, input.limit, input.cursor)}`,
53
- }),
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 в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
63
- ]),
64
- }),
65
- defineTool({
66
- name: 'besales_variable_create',
67
- sideEffect: 'write',
68
- closedWorld: true,
69
- requiredFields: ['scope', 'name', 'type'],
70
- defaultWorkspaceId: true,
71
- 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
- }),
140
- createRequest: (input) => ({
141
- 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
- }),
154
- }),
155
- 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,
159
- ]),
160
- }),
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
8
  // ============================================================
290
9
  // v1.5 Increment 4b — CRM Pipelines (11 tools)
291
10
  // ============================================================
@@ -310,14 +29,21 @@ export const crmPlatformTools = [
310
29
  workspace_id: uuidSchema.optional(),
311
30
  crm_id: uuidSchema,
312
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(),
313
35
  })
314
36
  .strict(),
315
37
  createRequest: (input) => ({
316
38
  method: 'GET',
317
- 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)}` : ''}`,
318
40
  }),
319
- enhanceResponse: (response) => withInstructions(response, [
320
- 'Триггерит 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; ошибка провайдера не блокирует локальную выдачу.',
321
47
  ]),
322
48
  }),
323
49
  defineTool({
@@ -334,7 +60,7 @@ export const crmPlatformTools = [
334
60
  .strict(),
335
61
  createRequest: (input) => ({
336
62
  method: 'GET',
337
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
63
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
338
64
  }),
339
65
  }),
340
66
  defineTool({
@@ -357,7 +83,7 @@ export const crmPlatformTools = [
357
83
  .strict(),
358
84
  createRequest: (input) => ({
359
85
  method: 'POST',
360
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines`,
86
+ path: `/crm-connections/${input.crm_id}/pipelines`,
361
87
  body: compactObject({
362
88
  name: input.name,
363
89
  sort: input.sort,
@@ -377,11 +103,7 @@ export const crmPlatformTools = [
377
103
  name: 'besales_crm_pipeline_update',
378
104
  sideEffect: 'write',
379
105
  defaultWorkspaceId: true,
380
- requiredFields: [
381
- 'crm_id',
382
- 'pipeline_id',
383
- 'acknowledge_external_side_effect',
384
- ],
106
+ requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
385
107
  schema: z
386
108
  .object({
387
109
  workspace_id: uuidSchema.optional(),
@@ -397,7 +119,7 @@ export const crmPlatformTools = [
397
119
  .strict(),
398
120
  createRequest: (input) => ({
399
121
  method: 'PATCH',
400
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
122
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
401
123
  body: compactObject({
402
124
  name: input.name,
403
125
  sort: input.sort,
@@ -408,7 +130,7 @@ export const crmPlatformTools = [
408
130
  }),
409
131
  }),
410
132
  enhanceResponse: (response) => withInstructions(response, [
411
- 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в PipelineSettings — обновляй через besales_pipeline_settings_update.',
133
+ 'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
412
134
  ]),
413
135
  }),
414
136
  defineTool({
@@ -432,7 +154,7 @@ export const crmPlatformTools = [
432
154
  .strict(),
433
155
  createRequest: (input) => ({
434
156
  method: 'DELETE',
435
- path: `/workspaces/${input.workspace_id}/crm/${input.crm_id}/pipelines/${input.pipeline_id}`,
157
+ path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
436
158
  body: {
437
159
  explicitConfirmation: input.explicit_confirmation,
438
160
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -456,24 +178,34 @@ export const crmPlatformTools = [
456
178
  workspace_id: uuidSchema.optional(),
457
179
  crm_id: uuidSchema,
458
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(),
459
184
  })
460
185
  .strict(),
461
- createRequest: (input) => ({
462
- method: 'GET',
463
- 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, пока он не станет пустым.`,
464
202
  }),
465
203
  }),
466
204
  defineTool({
467
205
  name: 'besales_crm_pipeline_status_create',
468
206
  sideEffect: 'write',
469
207
  defaultWorkspaceId: true,
470
- requiredFields: [
471
- 'crm_id',
472
- 'pipeline_id',
473
- 'name',
474
- 'sort',
475
- 'acknowledge_external_side_effect',
476
- ],
208
+ requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
477
209
  schema: z
478
210
  .object({
479
211
  workspace_id: uuidSchema.optional(),
@@ -484,8 +216,16 @@ export const crmPlatformTools = [
484
216
  color: z.string().optional(),
485
217
  status_types: z.array(z.string()).optional(),
486
218
  is_editable: z.boolean().optional(),
219
+ is_system_managed: z
220
+ .boolean()
221
+ .optional()
222
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
487
223
  is_bot_active: z.boolean().optional(),
488
224
  is_operator_available: z.boolean().optional(),
225
+ is_terminal: z
226
+ .boolean()
227
+ .optional()
228
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
489
229
  on_message_received_move_to_status: z.number().int().nullable().optional(),
490
230
  status_id: z.number().int().optional(),
491
231
  acknowledge_external_side_effect: z.literal(true),
@@ -493,15 +233,17 @@ export const crmPlatformTools = [
493
233
  .strict(),
494
234
  createRequest: (input) => ({
495
235
  method: 'POST',
496
- 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`,
497
237
  body: compactObject({
498
238
  name: input.name,
499
239
  sort: input.sort,
500
240
  color: input.color,
501
241
  statusTypes: input.status_types,
502
242
  isEditable: input.is_editable,
243
+ isSystemManaged: input.is_system_managed,
503
244
  isBotActive: input.is_bot_active,
504
245
  isOperatorAvailable: input.is_operator_available,
246
+ isTerminal: input.is_terminal,
505
247
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
506
248
  statusId: input.status_id,
507
249
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -515,12 +257,7 @@ export const crmPlatformTools = [
515
257
  name: 'besales_crm_pipeline_status_update',
516
258
  sideEffect: 'write',
517
259
  defaultWorkspaceId: true,
518
- requiredFields: [
519
- 'crm_id',
520
- 'pipeline_id',
521
- 'status_id',
522
- 'acknowledge_external_side_effect',
523
- ],
260
+ requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
524
261
  schema: z
525
262
  .object({
526
263
  workspace_id: uuidSchema.optional(),
@@ -534,17 +271,21 @@ export const crmPlatformTools = [
534
271
  is_system_managed: z
535
272
  .boolean()
536
273
  .optional()
537
- .describe('Главный переключатель управления статусом системой'),
274
+ .describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
538
275
  is_editable: z.boolean().optional(),
539
276
  is_bot_active: z.boolean().optional(),
540
277
  is_operator_available: z.boolean().optional(),
278
+ is_terminal: z
279
+ .boolean()
280
+ .optional()
281
+ .describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
541
282
  on_message_received_move_to_status: z.number().int().nullable().optional(),
542
283
  acknowledge_external_side_effect: z.literal(true),
543
284
  })
544
285
  .strict(),
545
286
  createRequest: (input) => ({
546
287
  method: 'PATCH',
547
- 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}`,
548
289
  body: compactObject({
549
290
  name: input.name,
550
291
  sort: input.sort,
@@ -554,6 +295,7 @@ export const crmPlatformTools = [
554
295
  isEditable: input.is_editable,
555
296
  isBotActive: input.is_bot_active,
556
297
  isOperatorAvailable: input.is_operator_available,
298
+ isTerminal: input.is_terminal,
557
299
  onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
558
300
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
559
301
  }),
@@ -585,7 +327,7 @@ export const crmPlatformTools = [
585
327
  .strict(),
586
328
  createRequest: (input) => ({
587
329
  method: 'DELETE',
588
- 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}`,
589
331
  body: {
590
332
  explicitConfirmation: input.explicit_confirmation,
591
333
  acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
@@ -599,6 +341,11 @@ export const crmPlatformTools = [
599
341
  requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
600
342
  schema: z
601
343
  .object({
344
+ expected_version: z
345
+ .string()
346
+ .min(1)
347
+ .regex(/^[A-Za-z0-9_.-]+$/u)
348
+ .optional(),
602
349
  workspace_id: uuidSchema.optional(),
603
350
  platform_id: uuidSchema,
604
351
  pipeline_id: z.number().int(),
@@ -608,14 +355,16 @@ export const crmPlatformTools = [
608
355
  .strict(),
609
356
  createRequest: (input) => ({
610
357
  method: 'POST',
611
- path: `/workspaces/${input.workspace_id}/platforms/${input.platform_id}/active-pipelines`,
358
+ path: `/channels/${input.platform_id}/active-pipelines`,
612
359
  body: compactObject({
360
+ expectedVersion: input.expected_version,
613
361
  pipelineId: input.pipeline_id,
614
362
  pipelineCrmId: input.pipeline_crm_id,
615
363
  sort: input.sort,
616
364
  }),
617
365
  }),
618
366
  enhanceResponse: (response) => withInstructions(response, [
367
+ editVersionInstruction(),
619
368
  'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
620
369
  ]),
621
370
  }),
@@ -626,6 +375,11 @@ export const crmPlatformTools = [
626
375
  requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
627
376
  schema: z
628
377
  .object({
378
+ expected_version: z
379
+ .string()
380
+ .min(1)
381
+ .regex(/^[A-Za-z0-9_.-]+$/u)
382
+ .optional(),
629
383
  workspace_id: uuidSchema.optional(),
630
384
  platform_id: uuidSchema,
631
385
  platform_pipeline_id: uuidSchema,
@@ -634,9 +388,11 @@ export const crmPlatformTools = [
634
388
  .strict(),
635
389
  createRequest: (input) => ({
636
390
  method: 'DELETE',
637
- 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}`,
638
393
  body: { explicitConfirmation: input.explicit_confirmation },
639
394
  }),
395
+ enhanceResponse: withEditVersionInstructions,
640
396
  }),
641
397
  // ============================================================
642
398
  // v1.5 Increment 4d — cross-platform clone (3 tools)
@@ -686,10 +442,10 @@ export const crmPlatformTools = [
686
442
  }),
687
443
  createRequest: (input) => ({
688
444
  method: 'POST',
689
- path: `/workspaces/${input.workspace_id}/platforms/clone/preview`,
445
+ path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
690
446
  body: compactObject({
691
- sourcePlatformId: input.source_platform_id,
692
- targetPlatformId: input.target_platform_id,
447
+ sourceChannelId: input.source_platform_id,
448
+ targetChannelId: input.target_platform_id,
693
449
  include: compactObject({
694
450
  agents: input.include.agents,
695
451
  agentTools: input.include.agent_tools,
@@ -756,11 +512,11 @@ export const crmPlatformTools = [
756
512
  .strict(),
757
513
  createRequest: (input) => ({
758
514
  method: 'POST',
759
- path: `/workspaces/${input.workspace_id}/platforms/clone/execute`,
515
+ path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
760
516
  body: compactObject({
761
517
  previewToken: input.preview_token,
762
- sourcePlatformId: input.source_platform_id,
763
- targetPlatformId: input.target_platform_id,
518
+ sourceChannelId: input.source_platform_id,
519
+ targetChannelId: input.target_platform_id,
764
520
  explicitConfirmation: input.explicit_confirmation,
765
521
  acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
766
522
  idempotencyKey: input.idempotency_key,
@@ -768,7 +524,7 @@ export const crmPlatformTools = [
768
524
  }),
769
525
  }),
770
526
  enhanceResponse: (response) => withInstructions(response, [
771
- 'Result reversible через besales_audit_revert (kind=revertClone) — пометит CloneRun.status=REVERTED.',
527
+ 'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
772
528
  'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
773
529
  'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
774
530
  'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
@@ -787,7 +543,7 @@ export const crmPlatformTools = [
787
543
  .strict(),
788
544
  createRequest: (input) => ({
789
545
  method: 'GET',
790
- path: `/workspaces/${input.workspace_id}/platforms/clone/${input.clone_id}`,
546
+ path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
791
547
  }),
792
548
  }),
793
549
  // ============================================================
@@ -810,6 +566,10 @@ export const crmPlatformTools = [
810
566
  source: mcpFileSourceSchema.optional(),
811
567
  mime_type: z.string().max(255).optional(),
812
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(),
813
573
  })
814
574
  .strict(),
815
575
  createRequest: (input) => ({
@@ -822,11 +582,14 @@ export const crmPlatformTools = [
822
582
  source: input.source,
823
583
  mime_type: input.mime_type,
824
584
  size_bytes: input.size_bytes,
585
+ owner_kind: input.owner_kind,
586
+ owner_id: input.owner_id,
825
587
  }),
826
588
  }),
827
589
  enhanceResponse: (response) => withInstructions(response, [
828
590
  'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
829
- 'Затем поллите `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 карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
830
593
  'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
831
594
  ]),
832
595
  }),
@@ -843,7 +606,7 @@ export const crmPlatformTools = [
843
606
  .strict(),
844
607
  createRequest: (input) => ({
845
608
  method: 'GET',
846
- path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
609
+ path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
847
610
  }),
848
611
  enhanceResponse: (response) => withInstructions(response, [
849
612
  'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -886,6 +649,7 @@ export const crmPlatformTools = [
886
649
  schema: z
887
650
  .object({
888
651
  workspace_id: uuidSchema.optional(),
652
+ operation_id: setupInitOperationIdSchema,
889
653
  platform_type: apiKeyPlatformTypeSchema,
890
654
  name: z.string().min(1).max(255),
891
655
  // Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
@@ -900,6 +664,7 @@ export const crmPlatformTools = [
900
664
  method: 'POST',
901
665
  path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
902
666
  body: compactObject({
667
+ operationId: input.operation_id,
903
668
  platform_type: input.platform_type,
904
669
  name: input.name,
905
670
  fields: input.fields,
@@ -925,7 +690,7 @@ export const crmPlatformTools = [
925
690
  .strict(),
926
691
  createRequest: (input) => ({
927
692
  method: 'GET',
928
- path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
693
+ path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
929
694
  }),
930
695
  enhanceResponse: (response) => withInstructions(response, [
931
696
  'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
@@ -951,7 +716,10 @@ export const crmPlatformTools = [
951
716
  createRequest: (input) => ({
952
717
  method: 'POST',
953
718
  path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
954
- body: compactObject({ platform_type: input.platform_type, name: input.name }),
719
+ body: compactObject({
720
+ platform_type: input.platform_type,
721
+ name: input.name,
722
+ }),
955
723
  }),
956
724
  enhanceResponse: (response) => withInstructions(response, [
957
725
  'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
@@ -960,12 +728,10 @@ export const crmPlatformTools = [
960
728
  ]),
961
729
  }),
962
730
  // ============================================================
963
- // v1.5 Increment 5c — CRM Connection + Field Mapping + Operators (5 tools)
731
+ // CRM Connection + Field Mapping + Operators
964
732
  // ============================================================
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).
733
+ // CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
734
+ // Bitrix24. Field mapping + operators — для уже подключённых CRM.
969
735
  defineTool({
970
736
  name: 'besales_crm_create_init',
971
737
  sideEffect: 'write',
@@ -974,17 +740,22 @@ export const crmPlatformTools = [
974
740
  schema: z
975
741
  .object({
976
742
  workspace_id: uuidSchema.optional(),
743
+ operation_id: setupInitOperationIdSchema,
977
744
  crm_type: provisionableCrmTypeSchema,
978
745
  // Публичные 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.
746
+ // AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
747
+ // Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
981
748
  fields: optionalAnyObjectSchema,
982
749
  })
983
750
  .strict(),
984
751
  createRequest: (input) => ({
985
752
  method: 'POST',
986
753
  path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
987
- 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
+ }),
988
759
  }),
989
760
  enhanceResponse: (response) => withInstructions(response, [
990
761
  'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
@@ -1006,11 +777,11 @@ export const crmPlatformTools = [
1006
777
  .strict(),
1007
778
  createRequest: (input) => ({
1008
779
  method: 'GET',
1009
- path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
780
+ path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
1010
781
  }),
1011
782
  enhanceResponse: (response) => withInstructions(response, [
1012
783
  '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.',
784
+ 'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
1014
785
  'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
1015
786
  ]),
1016
787
  }),
@@ -1027,12 +798,11 @@ export const crmPlatformTools = [
1027
798
  .strict(),
1028
799
  createRequest: (input) => ({
1029
800
  method: 'POST',
1030
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/activate`,
801
+ path: `/crm-connections/${input.crm_id}/activate`,
1031
802
  }),
1032
803
  enhanceResponse: (response) => withInstructions(response, [
1033
- 'CRM активирована: токен live-проверен, остальные CRM workspace деактивированы, связанные триггеры включены.',
1034
- 'Активна одна CRM на workspace за раз — этот вызов ДЕАКТИВИРУЕТ предыдущую активную. Предупреди пользователя перед переключением.',
1035
- 'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
804
+ 'CRM connection активирована после live-проверки credentials.',
805
+ 'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
1036
806
  ]),
1037
807
  }),
1038
808
  defineTool({
@@ -1047,12 +817,12 @@ export const crmPlatformTools = [
1047
817
  .strict(),
1048
818
  createRequest: (input) => ({
1049
819
  method: 'GET',
1050
- path: `/workspaces/${input.workspace_id}/crms`,
820
+ path: `/workspaces/${input.workspace_id}/crm-connections`,
1051
821
  }),
1052
822
  enhanceResponse: (response) => withInstructions(response, [
1053
- 'Список CRM workspace: id, type, status, is_active, account (поддомен/домен), created_at.',
823
+ 'Список v2 CRM connections workspace без credentials.',
1054
824
  'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
1055
- 'is_active=false → CRM есть, но не активна (besales_crm_activate); это объясняет, почему pipelines/field-mapping/operators могут не отвечать.',
825
+ 'Неактивное подключение можно включить через besales_crm_activate.',
1056
826
  ]),
1057
827
  }),
1058
828
  defineTool({
@@ -1072,8 +842,36 @@ export const crmPlatformTools = [
1072
842
  enhanceResponse: (response) => withInstructions(response, [
1073
843
  'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
1074
844
  'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
1075
- 'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот): их знает только владелец аккаунта, назови их отдельно.',
1076
- 'Полученные от поддержки 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. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
1077
875
  ]),
1078
876
  }),
1079
877
  defineTool({
@@ -1096,11 +894,11 @@ export const crmPlatformTools = [
1096
894
  .strict(),
1097
895
  createRequest: (input) => ({
1098
896
  method: 'GET',
1099
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
897
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1100
898
  }),
1101
899
  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`.',
900
+ 'Возвращает текущий список v2 field mappings.',
901
+ 'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
1104
902
  ]),
1105
903
  }),
1106
904
  defineTool({
@@ -1120,16 +918,22 @@ export const crmPlatformTools = [
1120
918
  .strict(),
1121
919
  createRequest: (input) => ({
1122
920
  method: 'PUT',
1123
- path: `/workspaces/${input.workspace_id}/crms/${input.crm_id}/field-mapping`,
921
+ path: `/crm-connections/${input.crm_id}/field-mappings`,
1124
922
  body: {
1125
- replace_all_existing: input.replace_all_existing,
1126
923
  enabled: input.enabled,
1127
- 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
+ })),
1128
932
  },
1129
933
  }),
1130
934
  enhanceResponse: (response) => withInstructions(response, [
1131
- 'Replace-all: передавайте ВЕСЬ набор маппингов (не патч). Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1132
- 'Чтобы изменить — повторно вызовите с новым полным набором (это «undo»). Audit non-reversible (снимок before в diff).',
935
+ 'Replace-all: передавай весь желаемый набор mappings, а не патч.',
936
+ 'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
1133
937
  ]),
1134
938
  }),
1135
939
  defineTool({
@@ -1146,11 +950,11 @@ export const crmPlatformTools = [
1146
950
  .strict(),
1147
951
  createRequest: (input) => ({
1148
952
  method: 'GET',
1149
- 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' : ''}`,
1150
954
  }),
1151
955
  enhanceResponse: (response) => withInstructions(response, [
1152
- 'Операторы для assignee-стратегий PipelineSettings. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1153
- 'sync=true пересинхронизирует операторов из CRM перед возвратом.',
956
+ 'Возвращаются активные локальные CRM operators.',
957
+ 'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
1154
958
  ]),
1155
959
  }),
1156
960
  defineTool({
@@ -1165,24 +969,87 @@ export const crmPlatformTools = [
1165
969
  operator_id: uuidSchema,
1166
970
  is_operator: z.boolean().optional(),
1167
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(),
1168
982
  })
1169
983
  .strict()
1170
984
  .superRefine((input, ctx) => {
1171
- 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)) {
1172
993
  ctx.addIssue({
1173
994
  code: z.ZodIssueCode.custom,
1174
- message: 'Provide at least one of is_operator / is_sdr',
995
+ message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
1175
996
  });
1176
997
  }
1177
998
  }),
1178
999
  createRequest: (input) => ({
1179
1000
  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 }),
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)}`,
1182
1050
  }),
1183
1051
  enhanceResponse: (response) => withInstructions(response, [
1184
- 'Вкл/выкл роли конкретного оператора: is_operator (assignee диалогов) и/или is_sdr. Только AmoCRM/Bitrix24 — иначе `unsupported_reason`.',
1185
- 'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
1052
+ 'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
1186
1053
  ]),
1187
1054
  }),
1188
1055
  ];