@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,7 +1,83 @@
1
1
  # Поверхность инструментов: группы, а не укрупнение
2
2
 
3
+ Каждый опубликованный инструмент содержит короткий русский `Tool.title`, построенный из
4
+ локализованного описания и ограниченный 80 символами. Интерфейс хоста может показывать его
5
+ человеку, а стабильным идентификатором вызова остаётся `name`.
6
+
7
+ ## Безопасная публикация контрактов
8
+
9
+ Эталон отгруженной линии задаётся единой настройкой `BESALES_MCP_SHIPPED_REF` через
10
+ `scripts/shipped-ref.mjs`. Умолчание, в том числе при пустом или пробельном значении, —
11
+ `origin/v1-line`: после замены `main` сверка продолжает читать прежнюю линию пакета.
12
+
13
+ Публикация идёт только из закоммиченного дерева моста: выгрузка подписывается коммитом `HEAD`, а
14
+ инструменты берутся из рабочей сборки, и при незакоммиченных правках подпись называла бы коммит, из
15
+ которого выгрузка не собрана. Незакоммиченное дерево — отказ с перечнем правок.
16
+
17
+ `yarn publish:mcp-registry` требует два явных каталога: `BESALES_SPECS_CONTRACTS_DIR`
18
+ для зеркала `mcp-tools.json` и `BESALES_API_CONTRACTS_DIR` для tracked-карты маршрутов API.
19
+ До сборки команда проверяет оба каталога, наличие OpenAPI и принадлежность API contracts
20
+ выбранному Git checkout. Артефакты сначала строятся во временном каталоге и попадают в цели
21
+ только после успешной генерации обоих файлов. Поздняя ошибка не оставляет обновлённый
22
+ specs-снимок рядом со старой картой API.
23
+
24
+ Карта маршрутов для API несёт и схемы входа ВСЕХ инструментов обоих реестров — отдельными ключами
25
+ `shippedInputSchemas` (отгруженный реестр) и `v2InputSchemas` (ветка v2), картой «имя → схема». По ним
26
+ сервер сверяет аргументы шагов, которые его навигация называет ассистенту: аргумент мимо схемы мост
27
+ отвергнет или молча срежет. Записи `tools` при этом не меняются. Инструмент выгрузки без схемы ветки v2 —
28
+ отказ публикации, а не пропуск.
29
+
30
+ ## Сохранение входных полей
31
+
32
+ Сторож в `scripts/registry-diff.spec.mjs` сверяет объявленные пути с выходной JSON-схемой
33
+ Zod: входная схема разрешает лишние поля даже тогда, когда разбор их удаляет. Объект с
34
+ `passthrough` сохраняет произвольные поля вместе с их вложенным содержимым. Для известного
35
+ дочернего объекта действует его собственная схема, поэтому разрешение лишних полей у
36
+ родителя не скрывает удаление внутри дочернего объекта или элемента массива.
37
+
38
+ У `besales_followup_sequence_upsert` конфигурация проходит как произвольный объект и
39
+ передаётся в тело POST/PATCH целиком, с ключами camelCase. Проверка реактивационной формы
40
+ добавляет ошибки, но не заменяет исходник своим результатом разбора. Мост сохраняет
41
+ в том числе инертные поля и null; API проверяет допустимость перевода в исполняемую цепочку
42
+ и отвечает адресным отказом на неподдерживаемые настройки. Передача поля сама по себе
43
+ не обещает его исполнения. `followup-b2.spec.ts` проверяет полное тело обеих ветвей записи.
44
+
45
+ ## Смена ключей CRM
46
+
47
+ Генератор `scripts/generate-crm-rotation-contract.mjs` строит локальные схемы и случаи запросов
48
+ `besales_crm_rotate_init` и `besales_crm_rotate_status` из определений инструментов. При переносе
49
+ этих случаев в `besales-api/contracts/mcp-v2-route-map.json` он фиксирует `requiredScopes: ["write:crm"]`
50
+ для обоих входов. Опрос состояния смены ключей требует управления CRM, несмотря на GET.
51
+ В списке контракта эта пара стоит в группе CRM сразу после `besales_crm_operator_update`,
52
+ как и в регистрации. Генератор сохраняет порядок остальных инструментов при повторном выпуске.
53
+ После обновления списка он пересчитывает `summary.total_tools`, `summary.tools_by_category`
54
+ и блок `GENERATED TOOL INVENTORY` в README функциями из `src/tools/inventory.ts`.
55
+ Числа выводятся из активных имён, без ручного счётчика. Обычный запуск после `yarn build`:
56
+ `node scripts/generate-crm-rotation-contract.mjs`. Для выпуска непосредственно из исходников:
57
+ `node --loader ./src/utils/setup-sessions-loader.mjs scripts/generate-crm-rotation-contract.mjs --source`.
58
+ Порядок перечисления не задаёт приоритет выполнения: вызов выбирает инструмент по имени.
59
+ Эта фикстура не заменяет `contracts/mcp-tool-routes.json`: полное перечисление, схемы обоих
60
+ реестров и происхождение отгруженного эталона выпускает `yarn publish:mcp-registry` после коммита
61
+ моста. Добавление инструмента в локальную схему само по себе не обновляет выгрузку для API.
62
+
63
+ Локальную `src/schemas/mcp-v2-route-map.json` отдельно пересобирает
64
+ `BESALES_API_CONTRACTS_DIR=<API>/contracts node scripts/sync-route-map.mjs` после `yarn build`;
65
+ `--check` сверяет её без записи. Генератор исполняет определения и сохраняет точные query/body,
66
+ проверяет маршруты по снимку API и регистрацию скрытого маршрута по контроллеру.
67
+ `sync-api-contracts.mjs` использует тот же генератор. `sync-contract-ledger-schemas.mjs`
68
+ обновляет схемы и метаданные перенесённых полей описи; новые DELIBERATE-ключи требуют
69
+ отдельных ACTIVE-решений в `besales-api/docs/contract-ledger/cledg-decisions.md`.
70
+
3
71
  ## Решение
4
72
 
73
+ Число активных инструментов определяется длиной `tools` в `mcp-tools.json`.
74
+ Число случаев запроса определяется длиной карты `mcp-v2-route-map.json`, а число покрытых
75
+ инструментов — количеством уникальных имён до суффикса варианта `@...` в поле `tool`;
76
+ ветви учитываются отдельными случаями.
77
+ Категории в `summary.tools_by_category` и таблица README сверяются с именами реестра тестом
78
+ `inventory.spec.ts`, а случаи карты — с реальными конструкторами запросов тестом
79
+ `v2-route-map.spec.ts`. Число случаев карты не заменяет число инструментов.
80
+
5
81
  **Инструменты не укрупняются. Их число не сокращается. Появляются профили — набор имён,
6
82
  которым сессия ограничивает себя сама.**
7
83
 
@@ -16,12 +92,19 @@
16
92
  разрушительный ВСЕГДА, и хост больше никогда не сможет считать безопасной ни одну его ветку.
17
93
  Работа по аннотациям была бы обесценена ровно в тот момент, когда она начала приносить пользу.
18
94
  2. **Имена — это контракт отгруженной линии.** Пакет стоит у пользователей и вызывается по
19
- именам; переименование требует совместимого выпуска и синхронной правки инструкций,
20
- ресурсов, скиллов и README.
95
+ именам; переименование бьёт мажор и требует синхронной правки инструкций, ресурсов, скиллов
96
+ и README — 428 упоминаний. Переименования и алиасы для v2 отменены отдельным решением.
21
97
  3. **Слитый инструмент хуже выбирается моделью.** Вместо ста имён с собственными схемами
22
98
  появляется десяток имён с перечислением действий, где ошибка в поле `action` неотличима от
23
99
  ошибки в аргументах, а схема каждого «действия» вырождается в необязательные поля.
24
100
 
101
+ Узкое исключение — **именной преемник при смене самого контракта**, а не алиас. Плановый разбор
102
+ переписки переехал с площадок на каналы, внешние номера охвата заменил локальными справочниками,
103
+ а сырые промпты — именами шаблонов. Поэтому v2 публикует `besales_dialogue_analysis_*`, старые
104
+ `besales_scheduled_task_*` наружу не регистрирует, а fail-closed сверка связывает обе пары через
105
+ `toolSuccessors`. Сопоставление нужно только для контроля расхождений отгруженного контракта: оно
106
+ не создаёт второе имя, не маршрутизирует вызов и не скрывает отсутствие реализации.
107
+
25
108
  Профили решают ту задачу, ради которой укрупнение и предлагалось — **вес и досягаемость**, — и
26
109
  не платят ничем из перечисленного.
27
110
 
@@ -40,6 +123,60 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
40
123
  - **Доменная группа выводится из имени** (`besales_<группа>_…`), рукописного реестра нет. Реестр
41
124
  пришлось бы пополнять при каждом добавлении, и забытая строка тихо выкидывала бы новый
42
125
  инструмент из всех профилей — он просто перестал бы существовать для тех, кто выбрал группу.
126
+ ⚠️ Однокоренные имена сводятся коротким списком псевдонимов: `dialog_review_*`,
127
+ `dialogues_query` и `dialogue_transcript` — один домен, но второй токен написан по-разному, и
128
+ попросивший `dialog` не получил бы ни чтения переписки, ни выборки диалогов. Переименовать их
129
+ вместо этого нельзя: имена — контракт отгруженной линии. Список самопроверяемый — тест требует,
130
+ чтобы каждый источник псевдонима исчез из групп, а цель существовала; полный перечень
131
+ 30 категорий тоже объявлен в тесте, поэтому новая категория становится осознанным решением, а
132
+ не побочным следствием названия.
133
+
134
+ ## Профиль принадлежит ПОДКЛЮЧЕНИЮ, а не подагенту
135
+
136
+ Объявление читается один раз, при запуске процесса. Один процесс — одно подключение MCP, значит
137
+ профиль ограничивает **подключение целиком**.
138
+
139
+ ⛔ Подагент хоста своего процесса моста не поднимает: он пользуется тем, что уже подключено в
140
+ сессии, и подставить туда своё окружение ему некуда. Ограничить подагента списком инструментов
141
+ хост умеет **сам, по именам** — профиль для этого не нужен и не поможет.
142
+
143
+ Профиль закрывает другое: **инструмента, не зарегистрированного в подключении, не существует**.
144
+ Его не позовёт ни автоодобряющий хост, ни ошибшийся агент. Отсюда настоящие места применения —
145
+ отдельное подключение «только чтение» для разбора и аудита, фоновый запуск, которому нельзя
146
+ ничего менять, узкое подключение под конкретную работу.
147
+
148
+ Если профиль на подагента всё-таки нужен, мост регистрируется **дважды** под разными именами с
149
+ разным окружением, а подагенту разрешаются инструменты только нужного сервера:
150
+
151
+ ```bash
152
+ claude mcp add besales-ro -e BESALES_MCP_TOOLSETS=readonly -- npx -y @besales/mcp
153
+ ```
154
+
155
+ ⚠️ Приём обоюдоострый: подключив в ОДНОЙ сессии и полный мост, и профильные, вы заплатите
156
+ БОЛЬШЕ — каждое подключение грузит свой список. Смысл появляется, когда разные сессии или разные
157
+ хосты используют разные записи, а не когда все записи живут рядом.
158
+
159
+ ## Категорий агент НЕ видит
160
+
161
+ ⛔ Частое недопонимание: категория — это фильтр **на входе**, а не уровень, по которому агент
162
+ ходит. Протокол отдаёт **плоский список**: вложенности, папок и поля «категория» в нём нет.
163
+ Модель получает имена, описания и схемы ровно тех инструментов, которые профиль пропустил, — и
164
+ не знает, что остальные существуют.
165
+
166
+ Двухуровневая выдача («сначала категории, потом инструменты в ней») протоколом **достижима**, но
167
+ другим механизмом: сервер объявляет способность «список инструментов может меняться», отдаёт
168
+ сперва горстку инструментов-категорий, а на вызов категории подменяет набор и уведомляет хост.
169
+ Сегодня эта способность у моста НЕ объявлена (`capabilities.tools = {}`), то есть режим не
170
+ построен.
171
+
172
+ **Замер, ради которого об этом вообще думают:** полная выдача списка — **201 КБ** (имена 5,
173
+ описания 71, схемы 125). Одни только названия 30 категорий — **0,3 КБ**.
174
+
175
+ Цена двухуровневого режима, которая этим замером не видна: каждая смена категории — лишний
176
+ круг обмена, а типовая работа здесь сквозная (завести канал = платформа + агент + промпт +
177
+ знания + CRM + триггеры), то есть переключений будет много и модель обязана заранее угадывать,
178
+ в какой категории что лежит. Профиль тот же выигрыш даёт без динамики — но только когда сессия
179
+ узкая заранее.
43
180
  - **`readonly` — не группа, а срез**: состав выводится из уже объявленного `sideEffect === 'none'`.
44
181
  - **Отбор действует и на перечисление, и на вызов.** Профиль, который только прячет, — декорация:
45
182
  хост, знающий имя, всё равно позовёт скрытое, а ровно от такого вызова профиль и заводится.
@@ -62,6 +199,10 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
62
199
  инструмента вне профиля для сессии не существует. Слои дополняют друг друга и не заменяют:
63
200
  аннотации помогают хосту решать, профиль — не даёт ошибиться.
64
201
 
202
+ План теста воронки дожимов ничего не отправляет человеку, но сохраняет черновик и удаляет
203
+ прежние черновики того же автора. Поэтому у него нет признака «только чтение». Предпросмотр
204
+ «Первого сообщения» считает охват без записи и отправки и остаётся читающим POST.
205
+
65
206
  ---
66
207
 
67
208
  # Составной инструмент правки промпта: строить не нужно
@@ -87,5 +228,65 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
87
228
  Что остаётся неизменным: **сначала прочитать промпт целиком** (`besales_prompt_patch_get`), иначе
88
229
  неоткуда взять точные якоря. Это не обходится ни одним из вариантов.
89
230
 
90
- Итог: правильное количество кода здесь — ноль. Работа сводится к тому, чтобы описание
91
- `besales_prompt_batch_start` называло одиночный случай явно.
231
+ Итог: правильное количество кода здесь — ноль. Описание `besales_prompt_batch_start` называет
232
+ одиночный случай явно: список из одного идентификатора с режимом «всё или ничего» даёт ту же
233
+ цепочку целиком.
234
+
235
+ ## Каталог аналитики и проверка исполнителя
236
+
237
+ Группа `inbound` входит в категорию `outbound_and_analytics`; входящая аналитика остаётся
238
+ отдельным инструментом. Все активные имена обязаны иметь ровно одну категорию; README и
239
+ счётчики реестра сверяются с этим же каталогом.
240
+
241
+ Сравнение принимает до 36 моделей (предел `MAX_MODELS` в `prompt-services`, f649530).
242
+ Проверка предела сравнения моделей читает настоящий `prompt-services` рядом с деревом.
243
+ В изолированном дереве путь задаётся через `BESALES_PROMPT_SERVICES_DIR`; отсутствие
244
+ исходника или несовпадение предела остаётся ошибкой.
245
+
246
+ В «Пул сегодня» outsideSegmentsBy содержит одну причину на регистрацию: paid, application,
247
+ attendanceNoMinutes, paidElsewhere («покупал в другой воронке»), seriesRunning («серия ещё идёт»),
248
+ other. Сумма равна outsideSegments; старые снимки могли относить две новые причины к other.
249
+
250
+ ## Поиск контактов .77
251
+
252
+ В v2 besales_contact_search сохраняет имя и JSON-schema аргументов, но отправляет POST
253
+ `/workspaces/:workspaceId/contacts/search`, селекторы и пагинацию — в JSON-body. GET fallback отсутствует.
254
+ Подсказка хосту `readOnlyHint=false`: POST-поиск не объявляется безопасным GET-чтением.
255
+ Побочных эффектов у поиска нет (`sideEffect=none`), поэтому `destructiveHint=false`;
256
+ снятие подсказки не превращает поиск в запись и не меняет обработку ошибок чтения.
257
+ Сервер продолжает обслуживать опубликованный GET старого моста. Выгрузка сохраняет оригинальный
258
+ GET с shippedMethod/shippedSamplePath/shippedSampleQuery отдельно от нового POST, поэтому проверка
259
+ v2 не подменяет проверку отгруженного клиента. Выпуск маршрутов из закоммиченного моста и генерация
260
+ типов по новому OpenAPI — шаг кресла до запуска; клиенты переключаются совместно с экранами.
261
+
262
+ Описание поиска контактов учитывает ники с `@` и без, регистронезависимость, все слова имени одной
263
+ карточки в любом порядке и литеральные `%/_/\`. Одиночный `@` не задаёт ник. Аргумент search можно
264
+ опустить; явно пустой/пробельный search, а также пустые phone/email/external_id отвергаются схемой.
265
+ Селекторы остаются в POST-body, scope read:contacts/CONTACT_VIEW не меняется. Параметр telegramId
266
+ профилей к этому инструменту не добавляется. Расширяемое metadata партнёрских входящих и selector
267
+ существующего счёта задаются в API-контрактах соответствующих операций; отдельный инструмент
268
+ для входящего партнёрского пуша не создаётся.
269
+
270
+ ## Уточнения моста v1.5 в словаре v2
271
+
272
+ Тексты и проверки ввода находятся в `src/tools/definitions/*.ts`;
273
+ `scripts/sync-contract-ledger-schemas.mjs` синхронизирует описания и изменённые узлы
274
+ `src/schemas/mcp-tools.json`, сохраняя остальные ограничения схемы.
275
+ После сборки запускай его и `scripts/sync-tool-inventory.mjs` повторно: файлы должны
276
+ оставаться теми же. `README.md` генерируется только между маркерами TOOL INVENTORY;
277
+ остальная часть README и этот документ редактируются вручную.
278
+
279
+ Волны GetCourse проверяют множество десяти допустимых транспортов после trim,
280
+ приведения регистра и удаления дублей. Повторы и пробелы принимаются; пустой список
281
+ отвергается. В API передаётся исходное написание. `funnel` — код
282
+ школьной воронки fNN или метка с кодом; подпись запуска хранится в `cohort_label`.
283
+ У планового разбора прежнее `daily/hourly.model` переводится в `model_id`,
284
+ `max_tokens` принимает 1–4000 или null. Запись зависит от флага выпуска API
285
+ `SCHEDULED_TASK_MODEL_WRITES_ENABLED`; мост возвращает отказ API без подмены.
286
+
287
+ Фасад аналитики принимает открытые периоды mode=range (только from или только to).
288
+ Список и сводка оплат получают общую область фильтрации через periodMode, channelId,
289
+ funnel и остальные поддержанные измерения; include_archived действует на оба отчёта.
290
+ У besales_dialogue_audit_findings необязательный agent_id проверяет принадлежность
291
+ разбора перед чтением находок. Несовпадение агента или ошибка чтения разбора
292
+ останавливает вызов до запроса находок. Без agent_id остаётся один запрос.
@@ -0,0 +1,95 @@
1
+ # Голосовые шаги и покупка во Входящих
2
+
3
+ ## ЗВ-111: read → edit → write
4
+
5
+ Читай полный текущий состав через `besales_platform_context_get`, изменяй нужные поля и передавай
6
+ полный массив `actions` с `replace_actions=true` в `besales_trigger_upsert`. Прочитай результат
7
+ ещё раз. Запись конфигурации не делает dial/REFER.
8
+
9
+ Текущий API принимает `stepType` (также `actionType` / `type`) и `config`:
10
+
11
+ ```json
12
+ {
13
+ "stepType": "VOICE_INITIATE_OUTBOUND_CALL",
14
+ "config": {
15
+ "timing": "CALLBACK",
16
+ "fromNumberId": null,
17
+ "reason": "Продолжить разговор",
18
+ "delayDays": 0,
19
+ "delayHours": 1,
20
+ "delayMinutes": 30,
21
+ "callingWindow": { "days": [1, 2, 3, 4, 5], "startHour": 8, "endHour": 21 },
22
+ "callingTimezone": "Europe/Moscow",
23
+ "maxCallbacksPerContact": 2
24
+ }
25
+ }
26
+ ```
27
+
28
+ Перевод: `VOICE_TRANSFER_CALL`, `config: {"targetLabel":"Reception"}`; `targetLabel:null`
29
+ сохраняется как явный выбор. Прежние имена типов `INITIATE_OUTBOUND_CALL`, `TRANSFER_CALL` и
30
+ `initiateOutboundCall`, `transferCall` принимаются. Пары входных имён:
31
+
32
+ | Действие | Relation из старого чтения | Старое имя входа |
33
+ | ------------------- | -------------------------- | ---------------------------- |
34
+ | Позвонить | `initiateOutboundCall` | `initiateOutboundCallConfig` |
35
+ | Перевести оператору | `transferCall` | `transferCallConfig` |
36
+
37
+ Нормализация сводит голосовой шаг к `stepType` + одному `config`. Непустой relation вместе с
38
+ input-key (даже с `null` / явно переданным `undefined`), два input-key, конфликт типов или
39
+ непустой чужой relation/config отвергаются **до HTTP**. Пустые чужие relations `null`/`undefined`
40
+ снимаются. Неизвестный голосовой тип и неизвестный тип с голосовыми relations получают безопасный
41
+ отказ. Другие новые типы остаются свободной строкой с полным config: их пригодность судит строгий
42
+ v2 mapper API при сохранении, не исполнитель звонка; мост не обрезает их к прежнему enum.
43
+
44
+ С action снимаются только `id/triggerId/createdAt/updatedAt`; с верхнего уровня выбранного
45
+ config — `id/actionId/createdAt/updatedAt`. Вложенные пользовательские поля не обходятся рекурсивно.
46
+ Отсутствие config не материализует defaults; `config:null` не является объектом по опубликованному
47
+ DTO и отклоняется; null разрешённых полей конфига сохраняется. Тексты typed issues есть на пяти языках.
48
+
49
+ `src/schemas/voice-actions-api.contract.json` — узкий машинный срез принятого API и списка relations;
50
+ обновление: `node scripts/sync-voice-actions-contract.mjs`, затем
51
+ `node scripts/sync-voice-actions-tools.mjs`. Источники и SHA-256 закреплены в срезе.
52
+
53
+ ## УП-3.03: отдельный признак покупки
54
+
55
+ ```json
56
+ {
57
+ "source": "inbox",
58
+ "purchased": true,
59
+ "has_payment": false,
60
+ "channel_id": "00000000-0000-4000-8000-000000000001",
61
+ "with_totals": true,
62
+ "limit": 50
63
+ }
64
+ ```
65
+
66
+ Это аргументы **существующего** `besales_dialogues_query`. Режим `source=inbox` читает
67
+ `POST /workspaces/:workspaceId/conversations/search`, scope `read:conversations`.
68
+ Без `source` либо с `source=export` сохраняется прежняя выгрузка диалогов.
69
+
70
+ `purchased:true` — успешный заказ агента **или** текущая продажная стадия своей CRM; false —
71
+ отрицание того же объединения. Это не оплата: `has_payment` независим. Omission не добавляет фильтр.
72
+ Без `channel_id` область — видимые каналы человека; с ним — выбранный канал. Принимается также
73
+ `contact_id`. Строковый/числовой/null boolean отклоняется до HTTP.
74
+
75
+ `hasPurchase` в строке, предикат и итоги считает сервер до пагинации. Мост сохраняет его ответ,
76
+ не вычисляет покупку из оплаты. Повтори с `source=inbox`, теми же фильтрами и `cursor`, пока
77
+ курсор не пуст; `with_totals` возвращает ограниченные итоги только первой страницы (`capped`
78
+ значит 999+, не точное число). Фильтры выгрузки (даты, action_type, platform_ids и прочие)
79
+ с inbox не смешиваются: адресный отказ до запроса. Разрешения и чужую область проверяет API.
80
+
81
+ Проверки: `voice-actions-bridge.spec.ts` проходит через настоящий MCP registry и ApiClient с
82
+ подставным HTTP transport и хранилищем конфигурации; серверная БД и живые звонки здесь не имитируются
83
+ результатом PASS. Полноту ветки inbox держит `v2-route-map.spec.ts`.
84
+
85
+ Отгруженная линия не знает `source` и всегда вызывает `GET dialogue-export`. Поэтому образца
86
+ отгруженного вызова для `inbox` нет: генератор сохраняет новый переключатель и указывает
87
+ `V2_ONLY_VARIANT` с путём `source`. Точное решение находится в `shipped-lag.json`, раздел
88
+ `contractExtensions`, ключ `besales_dialogues_query@inbox::source`. Строка станет ошибкой,
89
+ когда отгруженная линия получит этот вариант. Проверка одинакового метода и адреса сохранена.
90
+
91
+ Для диагностики `emit-tool-routes.mjs --dry-run` принимает `BESALES_MCP_SHIPPED_REGISTRY`
92
+ и `BESALES_MCP_SHIPPED_COMMIT`. Каталог `BESALES_API_CONTRACTS_DIR` должен находиться внутри
93
+ `.codex-artifacts-*/`; файл эталона сверяется с указанным git-коммитом. Результат помечен
94
+ `shippedRegistry.diagnosticOnly: true`, `source: file`, без `fetched: true` и непригоден для коммита.
95
+ Штатная выгрузка без флага требует чистое дерево и обновлённый git-эталон.
@@ -0,0 +1,26 @@
1
+ # Настройки комментариев Instagram через Wazzup
2
+
3
+ `besales_platform_settings_update` использует существующий `PATCH /api/v2/channels/:id/settings`.
4
+ Поле `instagram_comment_behavior` переводится в `instagramCommentBehavior` того же документа,
5
+ который читает и пишет web-форма. Мост и web-форма — независимые клиенты API.
6
+
7
+ Раздел применяется к прямому Instagram и к сохранённому подключению `WHATSAPP / WAZZUP_API`
8
+ с подтипом `instagram`; остальные подтипы отвергаются API. При правке Wazzup не передают
9
+ `reply_to_story_mentions`: транспорт не поддерживает истории. Не передают старый provider/config
10
+ выключатель; режим двух ответов называется `PUBLIC_AND_DM`. Сохранение настроек не отправляет сообщение.
11
+
12
+ Пропущенные поля сохраняют прочитанные значения, включая keywords/templates. Переданная группа
13
+ шаблонов заменяет документ целиком, явные `null` и `{}` неравнозначны. Слоты утверждённых текстов —
14
+ `ru`, `uz`, `uz_cyrl` (на API `uzCyrl`); пять языков интерфейса не добавляют слотов шаблона.
15
+ Соседняя правка имени или таймзоны не добавляет раздел комментариев и не сбрасывает его.
16
+ Общий fixture `src/tools/definitions/__fixtures__/wazzup-comment-settings.json` побайтово совпадает
17
+ с `besales-api/test/fixtures/wazzup-comment-settings.json` и задаёт форму, перевод моста и канон БД.
18
+
19
+ Публичный ответ цитирует комментарий. Личный ответ разрешён один раз на комментарий не позже
20
+ семи суток; писать первым и отвечать на истории нельзя. Подключение/живые отправки и ночная
21
+ активация требуют отдельной приёмки; наличие настройки не подтверждает работающий аккаунт.
22
+
23
+ Для перехода сначала выключают прежний канал Besales и отключают его в кабинете Wazzup,
24
+ потом Connect/Reconnect и включение прямого Instagram. Общая подтверждённая карточка сохраняет
25
+ доступ к истории, когда связь уже есть. Username сам по себе людей не объединяет, семь суток
26
+ Wazzup не дают права писать в новом 24-часовом окне Meta. Демо не включается этой настройкой.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@besales/mcp",
3
- "version": "0.47.1",
4
- "description": "Model Context Protocol server for Animaly / Besales",
3
+ "version": "1.0.0-beta.2",
4
+ "description": "Model Context Protocol server for Besales",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/be-sales/mcp#readme",
7
7
  "repository": {
@@ -15,7 +15,6 @@
15
15
  "mcp",
16
16
  "model-context-protocol",
17
17
  "besales",
18
- "animaly",
19
18
  "claude",
20
19
  "codex"
21
20
  ],
@@ -36,12 +35,14 @@
36
35
  "dist",
37
36
  "bin",
38
37
  "scripts",
38
+ "!scripts/generate-operator-contract.ts",
39
39
  "docs",
40
40
  "!docs/evidence",
41
- "README.md"
41
+ "README.md",
42
+ "README.onprem.ru.md"
42
43
  ],
43
44
  "bin": {
44
- "besales-mcp": "bin/besales-mcp.js"
45
+ "besales-mcp": "./bin/besales-mcp.js"
45
46
  },
46
47
  "scripts": {
47
48
  "build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc && mkdir -p dist/schemas dist/resources/concepts dist/resources/workflows dist/resources/docs dist/skills/besales-dialogue-audit && cp src/schemas/mcp-tools.json dist/schemas/mcp-tools.json && cp src/resources/concepts/*.md dist/resources/concepts/ && cp src/resources/workflows/*.md dist/resources/workflows/ && cp src/resources/docs/*.md dist/resources/docs/ && cp src/skills/besales-dialogue-audit/SKILL.md dist/skills/besales-dialogue-audit/SKILL.md",
@@ -50,16 +51,21 @@
50
51
  "dev:mock:seed": "node scripts/mock-credentials.js seed",
51
52
  "dev:mock:clear": "node scripts/mock-credentials.js clear",
52
53
  "host:probe": "node scripts/probe-mcp-protocol.js",
53
- "model:eval:server": "node scripts/model-eval-server.js",
54
- "model:eval": "node scripts/run-model-eval.js",
55
54
  "install:claude-desktop": "node scripts/install-claude-desktop.js",
56
55
  "prepack": "yarn build",
57
56
  "prepublishOnly": "yarn lint:errors && yarn test && yarn build",
58
- "test": "vitest run --maxWorkers=4",
57
+ "test": "vitest run",
59
58
  "lint:fix": "eslint src bin scripts eslint.config.js --fix",
60
59
  "lint:errors": "eslint src bin scripts eslint.config.js",
61
- "types:gen:api": "mkdir -p src/types && openapi-typescript ../docs/specs/v2/contracts/openapi-besales-api.yaml -o src/types/api-contract.gen.ts",
62
- "types:check:mcp": "node -e \"const s=require('./src/schemas/mcp-tools.json');if(s.summary.total_tools!==s.tools.length)process.exit(1)\""
60
+ "types:gen:api": "node scripts/sync-api-contracts.mjs --types-only",
61
+ "publish:mcp-registry": "node scripts/publish-mcp-registry.mjs",
62
+ "schemas:sync:agent-models": "node scripts/sync-agent-model-schemas.mjs",
63
+ "schemas:sync:trigger-arguments": "node scripts/sync-trigger-argument-schema.mjs",
64
+ "schemas:sync:wave-ids": "node scripts/sync-wave-id-schemas.mjs",
65
+ "schemas:sync:crm-stage-pool": "node scripts/sync-crm-stage-pool-schema.mjs",
66
+ "typecheck": "tsc --noEmit",
67
+ "lint": "eslint src bin scripts eslint.config.js",
68
+ "contracts:sync:api": "node scripts/sync-api-contracts.mjs"
63
69
  },
64
70
  "engines": {
65
71
  "node": ">=20.0.0"
@@ -74,6 +80,7 @@
74
80
  "zod": "^4.4.3"
75
81
  },
76
82
  "devDependencies": {
83
+ "@besales/contract-ledger": "file:vendor/contract-ledger-1.0.0.tgz",
77
84
  "@types/node": "^25.7.0",
78
85
  "@typescript-eslint/eslint-plugin": "^8.59.3",
79
86
  "@typescript-eslint/parser": "^8.59.3",
@@ -0,0 +1,40 @@
1
+ import { mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { afterAll, describe, expect, it } from 'vitest';
7
+
8
+ const require = createRequire(import.meta.url);
9
+ const apiRoot = process.env.BESALES_API_ROOT ?? fileURLToPath(new URL('../../besales-api', import.meta.url));
10
+ const fixtureRoot = mkdtempSync(join(tmpdir(), 'brx1-api-source-'));
11
+ mkdirSync(join(fixtureRoot, 'src/shared'), { recursive: true });
12
+ symlinkSync(join(apiRoot, 'node_modules'), join(fixtureRoot, 'node_modules'), 'dir');
13
+ writeFileSync(join(fixtureRoot, 'package.json'), '{}');
14
+ writeFileSync(join(fixtureRoot, 'src/shared/entities.json'), '{"amp":[38]}');
15
+ writeFileSync(join(fixtureRoot, 'src/shared/broken.json'), '{');
16
+ writeFileSync(join(fixtureRoot, 'src/shared/relative.ts'), `
17
+ import entities from './entities.json';
18
+ export { entities };
19
+ `);
20
+ writeFileSync(join(fixtureRoot, 'src/entry.ts'), `
21
+ import entities from '@shared/entities.json';
22
+ import { entities as relative } from './shared/relative.js';
23
+ export { entities, relative };
24
+ `);
25
+ const load = require('../test/bridge-contract/api-source-loader.cjs')(fixtureRoot);
26
+ afterAll(() => rmSync(fixtureRoot, { recursive: true, force: true }));
27
+
28
+ describe('чтение исходников API без сборки', () => {
29
+ it('JSON через @shared и относительный импорт даёт один разобранный документ', () => {
30
+ const { entities, relative } = load('entry.ts');
31
+ expect(entities).toEqual({ amp: [38] });
32
+ expect(relative).toBe(entities);
33
+ expect(load('shared/entities.json')).toBe(entities);
34
+ });
35
+
36
+ it('битый JSON и выход за корень API не принимаются', () => {
37
+ expect(() => load('shared/broken.json')).toThrow(SyntaxError);
38
+ expect(() => load('../outside.json')).toThrow('API source root escaped');
39
+ });
40
+ });
@@ -0,0 +1,129 @@
1
+ // Только чтение: проверяет входы кресла, не выпускает подписанный contracts/mcp-tool-routes.json.
2
+ import assert from 'node:assert/strict';
3
+ import { readFileSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ import { load } from 'js-yaml';
6
+
7
+ const contracts = process.env.BESALES_API_CONTRACTS_DIR?.trim();
8
+ if (!contracts) throw new Error('BESALES_API_CONTRACTS_DIR обязателен');
9
+ const read = (name) => JSON.parse(readFileSync(resolve(contracts, name), 'utf8'));
10
+ const api = load(readFileSync(resolve(contracts, 'openapi-besales-api.yaml'), 'utf8'));
11
+ const published = read('mcp-tool-routes.json');
12
+ const apiMap = read('mcp-v2-route-map.json');
13
+ const registry = JSON.parse(
14
+ readFileSync(new URL('../src/schemas/mcp-tools.json', import.meta.url), 'utf8'),
15
+ );
16
+ const localMap = JSON.parse(
17
+ readFileSync(new URL('../src/schemas/mcp-v2-route-map.json', import.meta.url), 'utf8'),
18
+ );
19
+ const lag = JSON.parse(
20
+ readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'),
21
+ );
22
+ const stable = [
23
+ 'besales_agent_create',
24
+ 'besales_agent_update',
25
+ 'besales_agent_clone',
26
+ 'besales_agent_get',
27
+ 'besales_icp_get',
28
+ ];
29
+ const selected = new Set([
30
+ ...stable,
31
+ 'besales_platform_settings_update',
32
+ 'besales_prompt_batch_start',
33
+ 'besales_prompt_batch_status',
34
+ 'besales_prompt_batch_resume',
35
+ 'besales_prompt_batch_stop',
36
+ 'besales_prompt_batch_by_key',
37
+ 'besales_dialogue_followup_state_get',
38
+ ]);
39
+ const rows = localMap.filter((row) => selected.has(row.tool.split('@')[0]));
40
+ const pendingExport = [];
41
+ for (const row of rows) {
42
+ const path = '/api/v2' + row.expected.pathTemplate.replace(/:([A-Za-z0-9_]+)/gu, '{$1}');
43
+ assert.ok(api.paths[path]?.[row.expected.method.toLowerCase()], `${row.tool}: API route missing`);
44
+ if (!apiMap.some((entry) => entry.tool === row.tool)) pendingExport.push(row.tool);
45
+ }
46
+ for (const name of stable) {
47
+ const schema = registry.tools.find((tool) => tool.name === name).inputSchema;
48
+ assert.deepEqual(
49
+ schema.required,
50
+ published.shippedInputSchemas[name].required,
51
+ `${name}: shipped required changed`,
52
+ );
53
+ assert.deepEqual(
54
+ schema.required,
55
+ published.v2InputSchemas[name].required,
56
+ `${name}: v2 required changed`,
57
+ );
58
+ const local = localMap.find((row) => row.tool === name);
59
+ const mapped = apiMap.find((row) => row.tool === name);
60
+ const exported = published.tools.find((row) => row.name === name);
61
+ for (const [field, value] of Object.entries(local.expected)) {
62
+ assert.deepEqual(value, mapped.expected[field], `${name}: API map ${field} changed`);
63
+ }
64
+ assert.equal(local.expected.method, exported.method, `${name}: exported method changed`);
65
+ assert.equal(local.expected.path, exported.samplePath, `${name}: exported path changed`);
66
+ }
67
+ for (const name of ['besales_agent_create', 'besales_agent_update']) {
68
+ const schema = registry.tools.find((tool) => tool.name === name).inputSchema;
69
+ assert.deepEqual(
70
+ schema.properties.default_icp_profile_id,
71
+ published.shippedInputSchemas[name].properties.default_icp_profile_id,
72
+ );
73
+ assert.deepEqual(
74
+ schema.properties.default_icp_profile_id,
75
+ published.v2InputSchemas[name].properties.default_icp_profile_id,
76
+ );
77
+ }
78
+ for (const map of [localMap, apiMap]) {
79
+ assert.equal(
80
+ map.some(
81
+ (row) => row.expected.method === 'POST' && row.expected.pathTemplate.endsWith('/icp-links'),
82
+ ),
83
+ false,
84
+ );
85
+ }
86
+ assert.equal(
87
+ published.tools.some(
88
+ (row) => row.method === 'POST' && /\/icp-links(?:\?|$)/u.test(row.samplePath ?? ''),
89
+ ),
90
+ false,
91
+ );
92
+ assert.equal(
93
+ Object.values(lag.contractLag).some((entry) => entry.owner === 'TASK-6.28.204'),
94
+ false,
95
+ );
96
+
97
+ const deref = (schema) =>
98
+ schema.$ref ? api.components.schemas[schema.$ref.split('/').at(-1)] : schema;
99
+ const settings =
100
+ api.paths['/api/v2/channels/{channelId}/settings'].patch.requestBody.content['application/json']
101
+ .schema;
102
+ for (const [section, fields] of [
103
+ ['smsgorodSettings', ['channel', 'sender']],
104
+ ['bitrix24BotSettings', ['botId', 'botCode', 'botName', 'openLineId', 'ignoreCrmStageGate']],
105
+ ['crmBehavior', ['useCrossPlatformHistory']],
106
+ ]) {
107
+ const schema = deref(settings.properties[section]);
108
+ for (const field of fields)
109
+ assert.ok(schema.properties[field], `${section}.${field}: API field missing`);
110
+ }
111
+ const byKey = api.paths['/api/v2/prompt-batch/runs/by-key'].get.parameters.find(
112
+ (entry) => entry.name === 'idempotencyKey',
113
+ );
114
+ assert.equal(byKey.required, true);
115
+ assert.equal(byKey.schema.maxLength, 200);
116
+ assert.equal(byKey.schema.pattern, '\\S');
117
+ console.log(
118
+ JSON.stringify(
119
+ {
120
+ checkedRouteVariants: rows.length,
121
+ stableToolsComparedAgainstBothApiMaps: stable,
122
+ removedLagOwner: 'TASK-6.28.204',
123
+ pendingChairExport: pendingExport,
124
+ signedExportChanged: false,
125
+ },
126
+ null,
127
+ 2,
128
+ ),
129
+ );