@besales/mcp 0.48.0 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/README.md +117 -163
  2. package/README.onprem.ru.md +35 -0
  3. package/bin/besales-mcp-http.js +9 -0
  4. package/bin/besales-onprem.mjs +19 -0
  5. package/dist/auth/connection-store.d.ts +3 -1
  6. package/dist/auth/connection-store.js +9 -3
  7. package/dist/auth/connection-store.js.map +1 -1
  8. package/dist/auth/oauth-client.d.ts +20 -27
  9. package/dist/auth/oauth-client.js +31 -23
  10. package/dist/auth/oauth-client.js.map +1 -1
  11. package/dist/auth/session-workspace.d.ts +1 -0
  12. package/dist/auth/session-workspace.js +10 -1
  13. package/dist/auth/session-workspace.js.map +1 -1
  14. package/dist/auth/token-storage.js +4 -1
  15. package/dist/auth/token-storage.js.map +1 -1
  16. package/dist/cli.d.ts +1 -0
  17. package/dist/cli.js +80 -19
  18. package/dist/cli.js.map +1 -1
  19. package/dist/constants/crm-catalog.d.ts +2 -0
  20. package/dist/constants/crm-catalog.js +3 -0
  21. package/dist/constants/crm-catalog.js.map +1 -0
  22. package/dist/http/api-client.d.ts +54 -7
  23. package/dist/http/api-client.js +132 -66
  24. package/dist/http/api-client.js.map +1 -1
  25. package/dist/http/feedback-document-error.d.ts +26 -0
  26. package/dist/http/feedback-document-error.js +22 -0
  27. package/dist/http/feedback-document-error.js.map +1 -0
  28. package/dist/http-server.d.ts +15 -0
  29. package/dist/http-server.js +378 -0
  30. package/dist/http-server.js.map +1 -0
  31. package/dist/instructions/server-instructions.d.ts +1 -1
  32. package/dist/instructions/server-instructions.js +6 -3
  33. package/dist/instructions/server-instructions.js.map +1 -1
  34. package/dist/network/constants.d.ts +25 -0
  35. package/dist/network/constants.js +26 -0
  36. package/dist/network/constants.js.map +1 -0
  37. package/dist/network/failed-verifications.d.ts +10 -0
  38. package/dist/network/failed-verifications.js +37 -0
  39. package/dist/network/failed-verifications.js.map +1 -0
  40. package/dist/network/http-test-fixture.d.ts +3 -0
  41. package/dist/network/http-test-fixture.js +86 -0
  42. package/dist/network/http-test-fixture.js.map +1 -0
  43. package/dist/network/known-keys.d.ts +10 -0
  44. package/dist/network/known-keys.js +38 -0
  45. package/dist/network/known-keys.js.map +1 -0
  46. package/dist/network/memory-credentials.d.ts +11 -0
  47. package/dist/network/memory-credentials.js +24 -0
  48. package/dist/network/memory-credentials.js.map +1 -0
  49. package/dist/network/rate-limit.d.ts +23 -0
  50. package/dist/network/rate-limit.js +62 -0
  51. package/dist/network/rate-limit.js.map +1 -0
  52. package/dist/network/rejected-keys.d.ts +9 -0
  53. package/dist/network/rejected-keys.js +39 -0
  54. package/dist/network/rejected-keys.js.map +1 -0
  55. package/dist/network/request-work.d.ts +8 -0
  56. package/dist/network/request-work.js +20 -0
  57. package/dist/network/request-work.js.map +1 -0
  58. package/dist/network/successful-keys.d.ts +17 -0
  59. package/dist/network/successful-keys.js +47 -0
  60. package/dist/network/successful-keys.js.map +1 -0
  61. package/dist/resources/concepts/external-execution.md +3 -1
  62. package/dist/resources/concepts/feedback-sheets.md +21 -12
  63. package/dist/resources/concepts/icp.md +8 -1
  64. package/dist/resources/concepts/sandbox.md +15 -6
  65. package/dist/resources/concepts/triggers.md +43 -0
  66. package/dist/resources/concepts/workbook-classification.md +104 -50
  67. package/dist/resources/docs/agent-behavior.md +51 -382
  68. package/dist/resources/docs/campaigns.md +9 -16
  69. package/dist/resources/docs/crm-integration.md +39 -523
  70. package/dist/resources/docs/files-and-uploads.md +23 -286
  71. package/dist/resources/docs/follow-up.md +47 -12
  72. package/dist/resources/docs/knowledge-base.md +52 -521
  73. package/dist/resources/docs/pipeline-builder.md +26 -216
  74. package/dist/resources/docs/pipeline-settings-deep.md +27 -220
  75. package/dist/resources/docs/platforms.md +149 -519
  76. package/dist/resources/docs/prompt-anatomy.md +39 -285
  77. package/dist/resources/docs/routing.md +8 -16
  78. package/dist/resources/docs/trigger-actions.md +40 -24
  79. package/dist/resources/docs/variables.md +8 -12
  80. package/dist/resources/operator-edit.contract.d.ts +7 -0
  81. package/dist/resources/operator-edit.contract.js +8 -0
  82. package/dist/resources/operator-edit.contract.js.map +1 -0
  83. package/dist/resources/registry.js +20 -4
  84. package/dist/resources/registry.js.map +1 -1
  85. package/dist/resources/workflows/audit-dialogues.md +23 -12
  86. package/dist/resources/workflows/compare-models.md +6 -6
  87. package/dist/resources/workflows/connect-crm-from-scratch.md +15 -12
  88. package/dist/resources/workflows/connect-datasource-from-scratch.md +5 -4
  89. package/dist/resources/workflows/extract-from-document.md +8 -6
  90. package/dist/resources/workflows/operator-edit.md +15 -0
  91. package/dist/resources/workflows/platform-setup-from-scratch.md +59 -70
  92. package/dist/resources/workflows/production-readiness-check.md +25 -15
  93. package/dist/schemas/mcp-tools.json +12389 -6657
  94. package/dist/schemas/voice-actions-api.contract.json +248 -0
  95. package/dist/shared/constants/broadcast-reason.constants.d.ts +2 -0
  96. package/dist/shared/constants/broadcast-reason.constants.js +47 -0
  97. package/dist/shared/constants/broadcast-reason.constants.js.map +1 -0
  98. package/dist/shared/constants/crm-stage-pool.constants.d.ts +2 -0
  99. package/dist/shared/constants/crm-stage-pool.constants.js +3 -0
  100. package/dist/shared/constants/crm-stage-pool.constants.js.map +1 -0
  101. package/dist/shared/constants/followup-note.constants.d.ts +3 -0
  102. package/dist/shared/constants/followup-note.constants.js +4 -0
  103. package/dist/shared/constants/followup-note.constants.js.map +1 -0
  104. package/dist/shared/constants/followup-session.constants.d.ts +2 -0
  105. package/dist/shared/constants/followup-session.constants.js +3 -0
  106. package/dist/shared/constants/followup-session.constants.js.map +1 -0
  107. package/dist/shared/constants/funnel-analytics.constants.d.ts +2 -0
  108. package/dist/shared/constants/funnel-analytics.constants.js +3 -0
  109. package/dist/shared/constants/funnel-analytics.constants.js.map +1 -0
  110. package/dist/shared/constants/message-filter.constants.d.ts +7 -0
  111. package/dist/shared/constants/message-filter.constants.js +8 -0
  112. package/dist/shared/constants/message-filter.constants.js.map +1 -0
  113. package/dist/shared/utils/trigger-repeat-mapping.d.ts +72 -0
  114. package/dist/shared/utils/trigger-repeat-mapping.js +53 -0
  115. package/dist/shared/utils/trigger-repeat-mapping.js.map +1 -0
  116. package/dist/skills/besales-dialogue-audit/SKILL.md +31 -20
  117. package/dist/tasks/task-state-store.js +5 -0
  118. package/dist/tasks/task-state-store.js.map +1 -1
  119. package/dist/tools/annotations.js +4 -3
  120. package/dist/tools/annotations.js.map +1 -1
  121. package/dist/tools/definitions/agent-design.d.ts +81 -24
  122. package/dist/tools/definitions/agent-design.js +246 -90
  123. package/dist/tools/definitions/agent-design.js.map +1 -1
  124. package/dist/tools/definitions/agent-model-notice.d.ts +5 -0
  125. package/dist/tools/definitions/agent-model-notice.js +31 -0
  126. package/dist/tools/definitions/agent-model-notice.js.map +1 -0
  127. package/dist/tools/definitions/agent-models.d.ts +5 -0
  128. package/dist/tools/definitions/agent-models.js +26 -0
  129. package/dist/tools/definitions/agent-models.js.map +1 -0
  130. package/dist/tools/definitions/agent-settings.d.ts +85 -0
  131. package/dist/tools/definitions/agent-settings.js +187 -0
  132. package/dist/tools/definitions/agent-settings.js.map +1 -0
  133. package/dist/tools/definitions/ai-costs.d.ts +12 -0
  134. package/dist/tools/definitions/ai-costs.js +142 -0
  135. package/dist/tools/definitions/ai-costs.js.map +1 -0
  136. package/dist/tools/definitions/api-tool-request.d.ts +15 -0
  137. package/dist/tools/definitions/api-tool-request.js +2 -0
  138. package/dist/tools/definitions/api-tool-request.js.map +1 -0
  139. package/dist/tools/definitions/behavior-shipped-form.d.ts +182 -0
  140. package/dist/tools/definitions/behavior-shipped-form.js +185 -0
  141. package/dist/tools/definitions/behavior-shipped-form.js.map +1 -0
  142. package/dist/tools/definitions/broadcast-alerts.d.ts +6 -0
  143. package/dist/tools/definitions/broadcast-alerts.js +72 -0
  144. package/dist/tools/definitions/broadcast-alerts.js.map +1 -0
  145. package/dist/tools/definitions/broadcast-analytics.d.ts +102 -18
  146. package/dist/tools/definitions/broadcast-analytics.js +732 -431
  147. package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
  148. package/dist/tools/definitions/broadcast-scheduler.d.ts +10 -13
  149. package/dist/tools/definitions/broadcast-scheduler.js +196 -154
  150. package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
  151. package/dist/tools/definitions/call-operator-task.schema.d.ts +11 -0
  152. package/dist/tools/definitions/call-operator-task.schema.js +30 -0
  153. package/dist/tools/definitions/call-operator-task.schema.js.map +1 -0
  154. package/dist/tools/definitions/contacts.d.ts +3 -0
  155. package/dist/tools/definitions/contacts.js +57 -31
  156. package/dist/tools/definitions/contacts.js.map +1 -1
  157. package/dist/tools/definitions/crm-platform.d.ts +29 -39
  158. package/dist/tools/definitions/crm-platform.js +249 -352
  159. package/dist/tools/definitions/crm-platform.js.map +1 -1
  160. package/dist/tools/definitions/crm-stage-pool.messages.d.ts +39 -0
  161. package/dist/tools/definitions/crm-stage-pool.messages.js +43 -0
  162. package/dist/tools/definitions/crm-stage-pool.messages.js.map +1 -0
  163. package/dist/tools/definitions/crm-stage-pool.schema.d.ts +64 -0
  164. package/dist/tools/definitions/crm-stage-pool.schema.js +109 -0
  165. package/dist/tools/definitions/crm-stage-pool.schema.js.map +1 -0
  166. package/dist/tools/definitions/custom-reports.d.ts +12 -0
  167. package/dist/tools/definitions/custom-reports.js +68 -0
  168. package/dist/tools/definitions/custom-reports.js.map +1 -0
  169. package/dist/tools/definitions/datasource.d.ts +2 -1
  170. package/dist/tools/definitions/datasource.js +28 -13
  171. package/dist/tools/definitions/datasource.js.map +1 -1
  172. package/dist/tools/definitions/dialog-review-findings-response.d.ts +14 -0
  173. package/dist/tools/definitions/dialog-review-findings-response.js +23 -0
  174. package/dist/tools/definitions/dialog-review-findings-response.js.map +1 -0
  175. package/dist/tools/definitions/dialog-review-safe-response.d.ts +5 -0
  176. package/dist/tools/definitions/dialog-review-safe-response.js +152 -0
  177. package/dist/tools/definitions/dialog-review-safe-response.js.map +1 -0
  178. package/dist/tools/definitions/dialog-review.d.ts +49 -0
  179. package/dist/tools/definitions/dialog-review.js +383 -0
  180. package/dist/tools/definitions/dialog-review.js.map +1 -0
  181. package/dist/tools/definitions/dialogue-analysis.d.ts +46 -0
  182. package/dist/tools/definitions/dialogue-analysis.js +170 -0
  183. package/dist/tools/definitions/dialogue-analysis.js.map +1 -0
  184. package/dist/tools/definitions/dialogue-audit-agent-scope.d.ts +7 -0
  185. package/dist/tools/definitions/dialogue-audit-agent-scope.js +41 -0
  186. package/dist/tools/definitions/dialogue-audit-agent-scope.js.map +1 -0
  187. package/dist/tools/definitions/dialogue-audit-alias.d.ts +67 -0
  188. package/dist/tools/definitions/dialogue-audit-alias.js +559 -0
  189. package/dist/tools/definitions/dialogue-audit-alias.js.map +1 -0
  190. package/dist/tools/definitions/dialogue-export.d.ts +7 -1
  191. package/dist/tools/definitions/dialogue-export.js +89 -32
  192. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  193. package/dist/tools/definitions/dialogue-followup-state.d.ts +9 -0
  194. package/dist/tools/definitions/dialogue-followup-state.js +69 -0
  195. package/dist/tools/definitions/dialogue-followup-state.js.map +1 -0
  196. package/dist/tools/definitions/dialogue-reprocess.d.ts +5 -0
  197. package/dist/tools/definitions/dialogue-reprocess.js +107 -0
  198. package/dist/tools/definitions/dialogue-reprocess.js.map +1 -0
  199. package/dist/tools/definitions/edit-version-transport.test-fixtures.d.ts +13 -0
  200. package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
  201. package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
  202. package/dist/tools/definitions/edit-version.d.ts +5 -0
  203. package/dist/tools/definitions/edit-version.js +20 -0
  204. package/dist/tools/definitions/edit-version.js.map +1 -0
  205. package/dist/tools/definitions/external-api-channels.js +17 -15
  206. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  207. package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
  208. package/dist/tools/definitions/feedback-document-access.js +63 -0
  209. package/dist/tools/definitions/feedback-document-access.js.map +1 -0
  210. package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
  211. package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
  212. package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
  213. package/dist/tools/definitions/follow-up-config.d.ts +79 -0
  214. package/dist/tools/definitions/follow-up-config.js +258 -0
  215. package/dist/tools/definitions/follow-up-config.js.map +1 -0
  216. package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
  217. package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
  218. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  219. package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
  220. package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
  221. package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
  222. package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
  223. package/dist/tools/definitions/follow-up-setup.js +20 -87
  224. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  225. package/dist/tools/definitions/follow-up.d.ts +20 -122
  226. package/dist/tools/definitions/follow-up.js +200 -357
  227. package/dist/tools/definitions/follow-up.js.map +1 -1
  228. package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
  229. package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
  230. package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
  231. package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
  232. package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
  233. package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
  234. package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
  235. package/dist/tools/definitions/funnel-analytics.js +150 -0
  236. package/dist/tools/definitions/funnel-analytics.js.map +1 -0
  237. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
  238. package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
  239. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  240. package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
  241. package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
  242. package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
  243. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +14 -29
  244. package/dist/tools/definitions/getcourse-cold-welcome.js +190 -253
  245. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  246. package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
  247. package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
  248. package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
  249. package/dist/tools/definitions/help.js.map +1 -1
  250. package/dist/tools/definitions/icp-import-source.d.ts +75 -0
  251. package/dist/tools/definitions/icp-import-source.js +88 -0
  252. package/dist/tools/definitions/icp-import-source.js.map +1 -0
  253. package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
  254. package/dist/tools/definitions/inbound-analytics.js +55 -0
  255. package/dist/tools/definitions/inbound-analytics.js.map +1 -0
  256. package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
  257. package/dist/tools/definitions/instagram-comment.templates.js +34 -0
  258. package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
  259. package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
  260. package/dist/tools/definitions/instagram-settings-compat.js +7 -0
  261. package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
  262. package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
  263. package/dist/tools/definitions/knowledge-chunking.js +83 -0
  264. package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
  265. package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
  266. package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
  267. package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
  268. package/dist/tools/definitions/knowledge.d.ts +24 -14
  269. package/dist/tools/definitions/knowledge.js +342 -233
  270. package/dist/tools/definitions/knowledge.js.map +1 -1
  271. package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
  272. package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
  273. package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
  274. package/dist/tools/definitions/link-tracking.d.ts +8 -0
  275. package/dist/tools/definitions/link-tracking.js +141 -38
  276. package/dist/tools/definitions/link-tracking.js.map +1 -1
  277. package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
  278. package/dist/tools/definitions/mailing-variant-content.js +73 -0
  279. package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
  280. package/dist/tools/definitions/model-comparison.d.ts +2 -1
  281. package/dist/tools/definitions/model-comparison.js +4 -5
  282. package/dist/tools/definitions/model-comparison.js.map +1 -1
  283. package/dist/tools/definitions/money-currency.d.ts +5 -0
  284. package/dist/tools/definitions/money-currency.js +10 -0
  285. package/dist/tools/definitions/money-currency.js.map +1 -0
  286. package/dist/tools/definitions/operator-workflow.d.ts +5 -5
  287. package/dist/tools/definitions/operator-workflow.js +80 -27
  288. package/dist/tools/definitions/operator-workflow.js.map +1 -1
  289. package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
  290. package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
  291. package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
  292. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
  293. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
  294. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
  295. package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
  296. package/dist/tools/definitions/platform-settings-limits.js +6 -0
  297. package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
  298. package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
  299. package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
  300. package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
  301. package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
  302. package/dist/tools/definitions/platform-settings-update.js +134 -0
  303. package/dist/tools/definitions/platform-settings-update.js.map +1 -0
  304. package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
  305. package/dist/tools/definitions/platform-setup-wave.js +1079 -0
  306. package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
  307. package/dist/tools/definitions/platform-setup.d.ts +697 -224
  308. package/dist/tools/definitions/platform-setup.js +313 -752
  309. package/dist/tools/definitions/platform-setup.js.map +1 -1
  310. package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
  311. package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
  312. package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
  313. package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
  314. package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
  315. package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
  316. package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
  317. package/dist/tools/definitions/prompt-batch-controls.js +40 -0
  318. package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
  319. package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
  320. package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
  321. package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
  322. package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
  323. package/dist/tools/definitions/prompt-text-projection.js +62 -0
  324. package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
  325. package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
  326. package/dist/tools/definitions/reviewer-paid.js +115 -0
  327. package/dist/tools/definitions/reviewer-paid.js.map +1 -0
  328. package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
  329. package/dist/tools/definitions/routing-condition-projection.js +97 -0
  330. package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
  331. package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
  332. package/dist/tools/definitions/schedule-selection-hints.js +42 -0
  333. package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
  334. package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
  335. package/dist/tools/definitions/scheduled-task-alias.js +207 -0
  336. package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
  337. package/dist/tools/definitions/session.js +3 -3
  338. package/dist/tools/definitions/session.js.map +1 -1
  339. package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
  340. package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
  341. package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
  342. package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
  343. package/dist/tools/definitions/shared-input.helpers.js +323 -0
  344. package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
  345. package/dist/tools/definitions/shared.d.ts +401 -307
  346. package/dist/tools/definitions/shared.js +430 -652
  347. package/dist/tools/definitions/shared.js.map +1 -1
  348. package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
  349. package/dist/tools/definitions/shipped-output-names.js +123 -0
  350. package/dist/tools/definitions/shipped-output-names.js.map +1 -0
  351. package/dist/tools/definitions/task-state.d.ts +4 -4
  352. package/dist/tools/definitions/task-state.js +2 -1
  353. package/dist/tools/definitions/task-state.js.map +1 -1
  354. package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
  355. package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
  356. package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
  357. package/dist/tools/definitions/telegram-personal-management.d.ts +34 -0
  358. package/dist/tools/definitions/telegram-personal-management.js +139 -0
  359. package/dist/tools/definitions/telegram-personal-management.js.map +1 -0
  360. package/dist/tools/definitions/telegram-personal-restrictions.d.ts +19 -0
  361. package/dist/tools/definitions/telegram-personal-restrictions.js +109 -0
  362. package/dist/tools/definitions/telegram-personal-restrictions.js.map +1 -0
  363. package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
  364. package/dist/tools/definitions/telegram-pool-policy.js +56 -0
  365. package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
  366. package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
  367. package/dist/tools/definitions/touch-history-alias.js +99 -0
  368. package/dist/tools/definitions/touch-history-alias.js.map +1 -0
  369. package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
  370. package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
  371. package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
  372. package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
  373. package/dist/tools/definitions/trigger-argument.schema.js +23 -0
  374. package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
  375. package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
  376. package/dist/tools/definitions/trigger-claim-alias.js +90 -0
  377. package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
  378. package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
  379. package/dist/tools/definitions/trigger-echo-projection.js +41 -0
  380. package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
  381. package/dist/tools/definitions/trigger-upsert.tool.d.ts +41 -0
  382. package/dist/tools/definitions/trigger-upsert.tool.js +159 -0
  383. package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
  384. package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
  385. package/dist/tools/definitions/v15-port-descriptions.js +30 -0
  386. package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
  387. package/dist/tools/definitions/variables.d.ts +44 -0
  388. package/dist/tools/definitions/variables.js +310 -0
  389. package/dist/tools/definitions/variables.js.map +1 -0
  390. package/dist/tools/definitions/voice-action-input.d.ts +9 -0
  391. package/dist/tools/definitions/voice-action-input.js +141 -0
  392. package/dist/tools/definitions/voice-action-input.js.map +1 -0
  393. package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
  394. package/dist/tools/definitions/widget-customization-compat.js +23 -0
  395. package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
  396. package/dist/tools/definitions.d.ts +1134 -617
  397. package/dist/tools/definitions.js +63 -27
  398. package/dist/tools/definitions.js.map +1 -1
  399. package/dist/tools/description-localization.js +3 -2
  400. package/dist/tools/description-localization.js.map +1 -1
  401. package/dist/tools/follow-up-request.d.ts +19 -0
  402. package/dist/tools/follow-up-request.js +81 -0
  403. package/dist/tools/follow-up-request.js.map +1 -0
  404. package/dist/tools/followup-revision.d.ts +4 -0
  405. package/dist/tools/followup-revision.js +29 -0
  406. package/dist/tools/followup-revision.js.map +1 -0
  407. package/dist/tools/incomplete-list.js +4 -0
  408. package/dist/tools/incomplete-list.js.map +1 -1
  409. package/dist/tools/inventory.js +47 -11
  410. package/dist/tools/inventory.js.map +1 -1
  411. package/dist/tools/operation-recovery.d.ts +4 -0
  412. package/dist/tools/operation-recovery.js +33 -0
  413. package/dist/tools/operation-recovery.js.map +1 -0
  414. package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
  415. package/dist/tools/registry-mapping-primary.cases.js +765 -0
  416. package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
  417. package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
  418. package/dist/tools/registry-mapping-secondary.cases.js +626 -0
  419. package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
  420. package/dist/tools/registry-mapping.cases.d.ts +8 -0
  421. package/dist/tools/registry-mapping.cases.js +170 -0
  422. package/dist/tools/registry-mapping.cases.js.map +1 -0
  423. package/dist/tools/registry-test-fixtures.d.ts +50 -0
  424. package/dist/tools/registry-test-fixtures.js +120 -0
  425. package/dist/tools/registry-test-fixtures.js.map +1 -0
  426. package/dist/tools/registry.d.ts +2 -0
  427. package/dist/tools/registry.js +84 -52
  428. package/dist/tools/registry.js.map +1 -1
  429. package/dist/tools/result.d.ts +1 -0
  430. package/dist/tools/result.js +90 -22
  431. package/dist/tools/result.js.map +1 -1
  432. package/dist/tools/toolsets.d.ts +16 -0
  433. package/dist/tools/toolsets.js +25 -1
  434. package/dist/tools/toolsets.js.map +1 -1
  435. package/dist/types/api-contract.gen.d.ts +131892 -22453
  436. package/dist/utils/credential-signatures.d.ts +3 -0
  437. package/dist/utils/credential-signatures.js +10 -0
  438. package/dist/utils/credential-signatures.js.map +1 -0
  439. package/dist/utils/data-source-column-name.d.ts +10 -0
  440. package/dist/utils/data-source-column-name.js +36 -0
  441. package/dist/utils/data-source-column-name.js.map +1 -0
  442. package/dist/utils/logger.d.ts +1 -0
  443. package/dist/utils/logger.js +32 -8
  444. package/dist/utils/logger.js.map +1 -1
  445. package/dist/utils/secret-read-boundary.d.ts +2 -0
  446. package/dist/utils/secret-read-boundary.js +88 -0
  447. package/dist/utils/secret-read-boundary.js.map +1 -0
  448. package/dist/utils/setup-secrets.d.ts +4 -0
  449. package/dist/utils/setup-secrets.js +40 -0
  450. package/dist/utils/setup-secrets.js.map +1 -0
  451. package/docs/agent-models.md +9 -0
  452. package/docs/agent-usage-guide.full.ru.md +1 -4
  453. package/docs/analytics-contract.md +67 -0
  454. package/docs/async-operation-lifecycle.md +10 -3
  455. package/docs/connect.ru.md +144 -4
  456. package/docs/contact-company-profile.md +17 -0
  457. package/docs/contact-recommendations.md +7 -0
  458. package/docs/crm-stage-pool.md +73 -0
  459. package/docs/customer-data.md +61 -0
  460. package/docs/dialogue-reprocess.md +37 -0
  461. package/docs/edit-versions.md +36 -0
  462. package/docs/failure-semantics.md +17 -9
  463. package/docs/help-navigation.md +15 -42
  464. package/docs/host-compatibility-matrix.md +72 -93
  465. package/docs/host-setup.md +33 -35
  466. package/docs/invariants/public-api-and-contracts.md +16 -0
  467. package/docs/legacy-action-settings.md +21 -0
  468. package/docs/main-transfer-dependencies.md +38 -0
  469. package/docs/mcp2-parity.md +50 -0
  470. package/docs/modules/analytics.md +79 -0
  471. package/docs/modules/besales-mcp.md +144 -0
  472. package/docs/modules/dialog-review-report.md +38 -0
  473. package/docs/modules/dialogue-followup-adapters.md +39 -0
  474. package/docs/modules/message-reactions.md +17 -0
  475. package/docs/modules/network-mode.md +284 -0
  476. package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
  477. package/docs/pii-policy.md +21 -16
  478. package/docs/response-size-budget.md +197 -7
  479. package/docs/secret-read-boundary.md +102 -0
  480. package/docs/task-state.md +7 -2
  481. package/docs/telegram-personal-management.md +50 -0
  482. package/docs/telegram-personal-restrictions.md +87 -0
  483. package/docs/telegram-pool-policy.md +19 -0
  484. package/docs/tool-effects.md +15 -9
  485. package/docs/tool-surface.md +205 -4
  486. package/docs/voice-actions-and-inbox.md +95 -0
  487. package/docs/wazzup-instagram-comments.md +26 -0
  488. package/package.json +17 -10
  489. package/scripts/api-source-loader.spec.mjs +40 -0
  490. package/scripts/audit-bridge-controls.mjs +129 -0
  491. package/scripts/audit-revert-mutants.mjs +107 -0
  492. package/scripts/bridge-api-input.spec.mjs +98 -0
  493. package/scripts/bridge-controls-mutants.mjs +130 -0
  494. package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
  495. package/scripts/brx4-ledger-payload.spec.mjs +127 -0
  496. package/scripts/build-onprem.mjs +108 -0
  497. package/scripts/connect-clients.sh +141 -0
  498. package/scripts/connect-scopes.mjs +166 -0
  499. package/scripts/connect-scopes.spec.mjs +83 -0
  500. package/scripts/emit-personal-link-carrier.mjs +31 -0
  501. package/scripts/emit-setup-init-schemas.mjs +24 -0
  502. package/scripts/emit-tool-routes.mjs +878 -0
  503. package/scripts/emit-tool-routes.spec.mjs +300 -0
  504. package/scripts/followup-registry.spec.mjs +107 -0
  505. package/scripts/generate-crm-rotation-contract.mjs +98 -0
  506. package/scripts/generate-followup-session-contract.mjs +16 -0
  507. package/scripts/getcourse-text-source.spec.mjs +110 -0
  508. package/scripts/icp-import-verification/mutate.cjs +70 -0
  509. package/scripts/import-secret-read-contract.mjs +53 -0
  510. package/scripts/install-claude-desktop.js +1 -1
  511. package/scripts/lag-decisions.mjs +37 -0
  512. package/scripts/lag-decisions.spec.mjs +87 -0
  513. package/scripts/lag-open-task-owners.mjs +46 -0
  514. package/scripts/lag-open-task-owners.spec.mjs +78 -0
  515. package/scripts/lag-payload.mjs +10 -0
  516. package/scripts/legacy-action-lag.spec.mjs +22 -0
  517. package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
  518. package/scripts/mcpcompat-handler.mjs +34 -0
  519. package/scripts/mcpcompat-loader.mjs +36 -0
  520. package/scripts/mcpcompat-typescript.mjs +3 -0
  521. package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
  522. package/scripts/prbr-round1-recheck.spec.mjs +605 -0
  523. package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
  524. package/scripts/publish-mcp-registry.mjs +98 -0
  525. package/scripts/publish-mcp-registry.spec.mjs +68 -0
  526. package/scripts/record-scheduled-task-call.mjs +26 -0
  527. package/scripts/refusal-probe.mjs +17 -0
  528. package/scripts/refusal-probe.spec.mjs +29 -0
  529. package/scripts/registry-diff.mjs +502 -0
  530. package/scripts/registry-diff.spec.mjs +787 -0
  531. package/scripts/request-query.mjs +43 -0
  532. package/scripts/request-query.spec.mjs +82 -0
  533. package/scripts/route-lag.mjs +23 -0
  534. package/scripts/route-lag.spec.mjs +30 -0
  535. package/scripts/sample-args.mjs +174 -0
  536. package/scripts/sample-args.spec.mjs +160 -0
  537. package/scripts/shipped-definitions.mjs +197 -0
  538. package/scripts/shipped-definitions.spec.mjs +57 -0
  539. package/scripts/shipped-inputs.spec.mjs +136 -0
  540. package/scripts/shipped-recordings.spec.mjs +19 -0
  541. package/scripts/shipped-ref.d.mts +5 -0
  542. package/scripts/shipped-ref.mjs +20 -0
  543. package/scripts/shipped-ref.spec.mjs +59 -0
  544. package/scripts/shipped-registry.mjs +107 -0
  545. package/scripts/shipped-sample-candidates.mjs +69 -0
  546. package/scripts/shipped-sample-candidates.spec.mjs +117 -0
  547. package/scripts/shipped-sample.mjs +871 -0
  548. package/scripts/shipped-sample.spec.mjs +451 -0
  549. package/scripts/sync-agent-model-schemas.mjs +72 -0
  550. package/scripts/sync-api-contracts.mjs +85 -0
  551. package/scripts/sync-api-contracts.spec.mjs +144 -0
  552. package/scripts/sync-contract-ledger-schemas.mjs +161 -0
  553. package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
  554. package/scripts/sync-prompt-draft-schema.mjs +92 -0
  555. package/scripts/sync-route-map.mjs +94 -0
  556. package/scripts/sync-schema-descriptions.mjs +25 -0
  557. package/scripts/sync-tool-inventory.mjs +27 -0
  558. package/scripts/sync-trigger-argument-schema.mjs +97 -0
  559. package/scripts/sync-trigger-argument-schema.spec.mjs +91 -0
  560. package/scripts/sync-trigger-event-schema.mjs +20 -0
  561. package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
  562. package/scripts/sync-trigger-task-schema.mjs +45 -0
  563. package/scripts/sync-voice-actions-contract.mjs +67 -0
  564. package/scripts/sync-voice-actions-tools.mjs +97 -0
  565. package/scripts/sync-wave-id-schemas.mjs +55 -0
  566. package/scripts/telegram-personal-confirmation-mutants.mjs +74 -0
  567. package/scripts/tool-input-schemas.mjs +46 -0
  568. package/scripts/tool-input-schemas.spec.mjs +50 -0
  569. package/scripts/verify-followup-adapters.mjs +235 -0
  570. package/scripts/verify-secret-read-import.mjs +84 -0
  571. package/scripts/verify-secret-read-mutants.mjs +143 -0
  572. package/dist/tools/definitions/analytics.d.ts +0 -40
  573. package/dist/tools/definitions/analytics.js +0 -233
  574. package/dist/tools/definitions/analytics.js.map +0 -1
  575. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
  576. package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
  577. package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
  578. package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
  579. package/dist/tools/definitions/dialogue-audit.js +0 -292
  580. package/dist/tools/definitions/dialogue-audit.js.map +0 -1
  581. package/dist/tools/definitions/getcourse-wave.js +0 -519
  582. package/dist/tools/definitions/getcourse-wave.js.map +0 -1
  583. package/dist/tools/definitions/operational-overview.d.ts +0 -3
  584. package/dist/tools/definitions/operational-overview.js +0 -23
  585. package/dist/tools/definitions/operational-overview.js.map +0 -1
  586. package/dist/tools/definitions/scheduled-tasks.js +0 -173
  587. package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
  588. package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
  589. package/dist/tools/definitions/trigger-contact-claims.js +0 -60
  590. package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
  591. package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
  592. package/dist/tools/registry-mapping-cases-core.js +0 -963
  593. package/dist/tools/registry-mapping-cases-core.js.map +0 -1
  594. package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
  595. package/dist/tools/registry-mapping-cases-platform.js +0 -1052
  596. package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
  597. package/dist/tools/trigger-action-config.d.ts +0 -49
  598. package/dist/tools/trigger-action-config.js +0 -171
  599. package/dist/tools/trigger-action-config.js.map +0 -1
  600. package/docs/evals/model-behavior-scorecard.md +0 -80
  601. package/docs/operation-coverage.md +0 -114
  602. package/scripts/mock-credentials.js +0 -77
  603. package/scripts/model-eval-server.js +0 -213
  604. package/scripts/run-model-eval.js +0 -447
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Строка запроса в форме входа HTTP-сервера: одиночное значение или массив повторений.
3
+ * Она выгружается отдельно от пути: имена параметров иначе не видны сторожу маршрута.
4
+ */
5
+ export function parseQuery(pathWithQuery) {
6
+ const queryString = pathWithQuery.split('?')[1];
7
+ if (!queryString) return undefined;
8
+ const params = new URLSearchParams(queryString);
9
+ const query = {};
10
+ for (const key of new Set(params.keys())) {
11
+ const values = params.getAll(key);
12
+ query[key] = values.length === 1 ? values[0] : values;
13
+ }
14
+ return query;
15
+ }
16
+
17
+ /** Пустой query тоже сверяется, если v2 добавила параметры; их значения не подставляются. */
18
+ export function shippedQuerySample(shippedRequest, currentQuery) {
19
+ if (shippedRequest === undefined) return undefined;
20
+ return (
21
+ parseQuery(shippedRequest.path) ??
22
+ (shippedRequest.method === 'GET' || currentQuery !== undefined ? {} : undefined)
23
+ );
24
+ }
25
+
26
+ /** Маршрут и query отгруженной версии берутся из одного фактического запроса. */
27
+ export function shippedQueryCarrierSample(shippedSample) {
28
+ const request = shippedSample?.originalRequest;
29
+ if (request === undefined) {
30
+ if (shippedSample?.request !== undefined) {
31
+ throw new Error('Original shipped request is required for its query carrier');
32
+ }
33
+ return {};
34
+ }
35
+ const currentQuery =
36
+ shippedSample.request === undefined ? undefined : parseQuery(shippedSample.request.path);
37
+ const query = shippedQuerySample(request, currentQuery);
38
+ return {
39
+ shippedMethod: request.method ?? 'POST',
40
+ shippedSamplePath: request.path.split('?')[0],
41
+ ...(query === undefined ? {} : { shippedSampleQuery: query }),
42
+ };
43
+ }
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { parseQuery, shippedQueryCarrierSample, shippedQuerySample } from './request-query.mjs';
3
+
4
+ describe('образец строки запроса отгруженного клиента', () => {
5
+ it('старый пустой GET сохраняется при новом POST без query', () => {
6
+ expect(shippedQuerySample({ method: 'GET', path: '/contacts' }, undefined)).toEqual({});
7
+ });
8
+ it('сохраняет успешный GET без query, когда v2 добавила страницу', () => {
9
+ expect(
10
+ shippedQuerySample(
11
+ { method: 'GET', path: '/icp/id/scenarios' },
12
+ { limit: '25', cursor: 'next' },
13
+ ),
14
+ ).toEqual({});
15
+ });
16
+
17
+ it('не выдаёт образец, когда отгруженный запрос не построен', () => {
18
+ expect(shippedQuerySample(undefined, { limit: '25' })).toBeUndefined();
19
+ });
20
+
21
+ it.each(['POST', 'PATCH', 'PUT', 'DELETE'])(
22
+ '%s без query сохраняется пустым образцом, когда v2 добавила параметры',
23
+ (method) => {
24
+ expect(shippedQuerySample({ method, path: '/items/id' }, { confirm: 'true' })).toEqual({});
25
+ expect(shippedQuerySample({ method, path: '/items/id' }, undefined)).toBeUndefined();
26
+ },
27
+ );
28
+
29
+ it('сохраняет фактические параметры отгруженного GET', () => {
30
+ expect(
31
+ shippedQuerySample({ method: 'GET', path: '/items?tag=a&tag=b&limit=10' }, { limit: '25' }),
32
+ ).toEqual({ tag: ['a', 'b'], limit: '10' });
33
+ });
34
+ });
35
+
36
+ describe('отгруженный маршрут и query — один носитель', () => {
37
+ it('удаление переменной сохраняет старый адрес и пустой query без подтверждения из v2', () => {
38
+ const inputShipped = {
39
+ originalRequest: {
40
+ method: 'DELETE',
41
+ path: '/workspaces/w/variables/v',
42
+ body: { scope: 'WORKSPACE', explicitConfirmation: true },
43
+ },
44
+ request: { method: 'DELETE', path: '/variables/v?confirm=true' },
45
+ };
46
+
47
+ expect(shippedQueryCarrierSample(inputShipped)).toEqual({
48
+ shippedMethod: 'DELETE',
49
+ shippedSamplePath: '/workspaces/w/variables/v',
50
+ shippedSampleQuery: {},
51
+ });
52
+ expect(parseQuery(inputShipped.request.path)).toEqual({ confirm: 'true' });
53
+ });
54
+
55
+ it('platforms и channels проверяются со своими параметрами', () => {
56
+ const inputCurrent = {
57
+ method: 'GET',
58
+ path: '/channels/c/setup/context?limit=25',
59
+ };
60
+ const inputShipped = {
61
+ originalRequest: {
62
+ method: 'GET',
63
+ path: '/platforms/p/setup/context?cursor=old',
64
+ },
65
+ request: inputCurrent,
66
+ };
67
+ expect(shippedQueryCarrierSample(inputShipped)).toEqual({
68
+ shippedMethod: 'GET',
69
+ shippedSamplePath: '/platforms/p/setup/context',
70
+ shippedSampleQuery: { cursor: 'old' },
71
+ });
72
+ expect(parseQuery(inputCurrent.path)).toEqual({ limit: '25' });
73
+ });
74
+ it('без originalRequest отвергает подмену текущим request', () => {
75
+ expect(() =>
76
+ shippedQueryCarrierSample({
77
+ request: { method: 'GET', path: '/contacts?search=synthetic' },
78
+ }),
79
+ ).toThrow('Original shipped request is required');
80
+ expect(shippedQueryCarrierSample(undefined)).toEqual({});
81
+ });
82
+ });
@@ -0,0 +1,23 @@
1
+ /** Непостроенная ветка — долг маршрута; наличие инструмента и сохранение его схемы этот долг не снимают. */
2
+ export function routeLagFindings(routeMap, routeLag, source) {
3
+ const routes = new Map();
4
+ for (const block of source.matchAll(/^ {4}"(\/[^\"]*)":\s*\{\n([\s\S]*?)^ {4}\};$/gm)) {
5
+ routes.set(block[1], new Set([...block[2].matchAll(/^ {8}([a-z]+):[ \t]*(\S[^\n]*)/gm)]
6
+ .filter(match => !/^never\b/u.test(match[2])).map(match => match[1])));
7
+ }
8
+ if (routes.size < 100) return ['Снимок маршрутов API не разобран'];
9
+ const missing = routeMap.filter(entry => entry.backendTarget === 'besales-api').filter(entry => {
10
+ const path = `/api/v2${entry.expected.pathTemplate.replace(/:([A-Za-z0-9_]+)/gu, '{$1}')}`;
11
+ return !routes.get(path)?.has(entry.expected.method.toLowerCase());
12
+ });
13
+ const findings = [];
14
+ for (const entry of missing) {
15
+ const debt = routeLag[entry.tool];
16
+ if (debt?.method !== entry.expected.method || debt?.pathTemplate !== entry.expected.pathTemplate ||
17
+ debt?.severity !== 'ROUTE_ABSENT' || !/^TASK-\d+(?:\.\d+)+$/u.test(debt?.owner ?? '') ||
18
+ !debt?.reason?.trim()) findings.push(`${entry.tool}: непостроенный маршрут без точной строки ROUTE_ABSENT`);
19
+ }
20
+ const missingKeys = new Set(missing.map(entry => entry.tool));
21
+ for (const key of Object.keys(routeLag)) if (!missingKeys.has(key)) findings.push(`${key}: протухшая строка ROUTE_ABSENT`);
22
+ return findings.sort();
23
+ }
@@ -0,0 +1,30 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { routeLagFindings } from './route-lag.mjs';
4
+
5
+ const inputMap = JSON.parse(readFileSync(new URL('../src/schemas/mcp-v2-route-map.json', import.meta.url), 'utf8'));
6
+ const inputRegistry = JSON.parse(readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'));
7
+ const inputSource = readFileSync(new URL('../src/types/api-contract.gen.ts', import.meta.url), 'utf8');
8
+ const staleDebt = { owner: 'TASK-6.28.55', severity: 'ROUTE_ABSENT', reason: 'Отрицательная проба отсутствующего маршрута' };
9
+
10
+ describe('серверные ветки Входящих на текущем образе', () => {
11
+ it('все шесть адресов построены, отсутствующий долг снят', () => {
12
+ const inbound = inputMap.filter(entry => entry.tool.startsWith('besales_inbound_analytics_get@'));
13
+ expect(inbound).toHaveLength(6);
14
+ expect(inbound.every(entry => entry.backendTarget === 'besales-api')).toBe(true);
15
+ expect(Object.keys(inputRegistry.routeLag)).toEqual([]);
16
+ expect(routeLagFindings(inputMap, inputRegistry.routeLag, inputSource)).toEqual([]);
17
+ });
18
+ it.each(['summary', 'money', 'topics'])('мутация: долг у построенного %s протух', (report) => {
19
+ expect(routeLagFindings(inputMap, { ...inputRegistry.routeLag,
20
+ [`besales_inbound_analytics_get@${report}`]: staleDebt }, inputSource)).toContain(
21
+ `besales_inbound_analytics_get@${report}: протухшая строка ROUTE_ABSENT`);
22
+ });
23
+ it('мутация: метод money исчез, другой метод на том же пути долг не закрывает', () => {
24
+ const mutated = inputSource.replace(/( {4}"\/api\/v2\/workspaces\/\{workspaceId\}\/inbound-analytics\/money":\s*\{\n)([\s\S]*?)(^ {4}\};)/m,
25
+ (_match, head, body, tail) => head + body.replace(/^ {8}get:[^\n]*/m, ' get: never;') + tail);
26
+ expect(mutated).not.toBe(inputSource);
27
+ expect(routeLagFindings(inputMap, inputRegistry.routeLag, mutated)).toContain(
28
+ 'besales_inbound_analytics_get@money: непостроенный маршрут без точной строки ROUTE_ABSENT');
29
+ });
30
+ });
@@ -0,0 +1,174 @@
1
+ import { resolveSchemaRef, schemaConstraints } from './registry-diff.mjs';
2
+
3
+ // Счётчик образцов сбрасывается НА КАЖДЫЙ ВАРИАНТ (прежде — на инструмент).
4
+ //
5
+ // Сквозной счётчик сдвигал бы идентификаторы всех последующих записей от вставки одной соседней, и
6
+ // побайтовое сравнение выгрузки краснело бы от чужой правки вместо своей. Сброс на инструменте эту
7
+ // защиту давал только между инструментами: вставка варианта сдвигала идентификаторы последующих
8
+ // вариантов ТОГО ЖЕ инструмента. Для фасада из пятнадцати отчётов это решающее — вставка одного
9
+ // отчёта в середину сдвинула бы четырнадцать.
10
+ let uid = 0;
11
+ const distinctNumericIds = new Map();
12
+ const nextUuid = () => `00000000-0000-4000-8000-${String(++uid).padStart(12, '0')}`;
13
+ const INBOUND_SAMPLE_TRANSPORT = 'Telegram';
14
+
15
+ /** Образец инструмента учитывает домен сервера, который свободная строка JSON-схемы не описывает. */
16
+ export function sampleFor(toolName, schema, onlyRequired) {
17
+ try {
18
+ const args = sample(schema, '', 0, onlyRequired);
19
+ // Отгруженный channels принимает строки, но сервер проверяет транспорт по перечислению.
20
+ // Меняем только синтетическую заглушку: явное значение схемы и обязательный минимум сохраняются.
21
+ if (toolName === 'besales_inbound_analytics_get' && args !== null && typeof args === 'object' &&
22
+ Array.isArray(args.channels) && schemaConstraints(schema).get('channels[]')?.enum === undefined) {
23
+ args.channels = args.channels.map((value) => value === 'x' ? INBOUND_SAMPLE_TRANSPORT : value);
24
+ }
25
+ return args;
26
+ } catch (error) {
27
+ throw new Error(`${toolName}: ${error instanceof Error ? error.message : String(error)}`);
28
+ }
29
+ }
30
+
31
+ /**
32
+ * ⛔ Корень схемы обязателен: без него ссылку `#/$defs/x` разрешить не в чем, а нерешённая ссылка
33
+ * выглядит здесь узлом без `type` — то есть даёт СТРОКУ вместо объекта. Так и выходило: у
34
+ * инструмента правки поведения образец тела получался `{image: 'x', video: 'x', …}`, запрос
35
+ * отгруженного клиента не собирался (`shippedRequestFailed`), и api-сторонний страж, отбирающий
36
+ * записи по наличию образца, молча пропускал этот инструмент целиком.
37
+ */
38
+ function sample(node, key = '', depth = 0, onlyRequired = false, root = node) {
39
+ if (!node || depth > 7) return {};
40
+ node = resolveSchemaRef(node, root, `образец тела (${key || 'корень'})`);
41
+ if (!node) return {};
42
+ // Включённый входящий фильтр по сделке требует настоящего типа; NONE со значением
43
+ // отгруженная схема принимает, но сервис закономерно отвергает как неполную настройку.
44
+ if (key === 'inbound_deal_filter_type' && node.enum?.includes('TAG')) return 'TAG';
45
+ if (node.enum) return node.enum[0];
46
+ if (node.const !== undefined) return node.const;
47
+ // ⛔ Корень прокидывается и СЮДА. Ветка `oneOf`/`anyOf` — такая же часть той же схемы, и
48
+ // потеря корня превращала бы законную ссылку внутри ветки в «указатель никуда не ведёт», то
49
+ // есть роняла бы выгрузку на исправном инструменте.
50
+ // ⛔ Ветка без типа и свойств у объекта со свойствами — не альтернативная ФОРМА, а условие «одно из полей
51
+ // обязательно» (`anyOf: [{required: ['final_content']}, {required: ['finalContent']}]`). Образцом такой ветки
52
+ // выходила строка, запрос не собирался ни из одного набора, и выгрузка реестра падала на исправных инструментах
53
+ // отправки результатов. Образец — сам объект, где поля первой ветки стали обязательными.
54
+ const branches = Array.isArray(node.oneOf) ? node.oneOf : Array.isArray(node.anyOf) ? node.anyOf : null;
55
+ const firstBranch = branches?.[0];
56
+ if (
57
+ node.properties &&
58
+ firstBranch &&
59
+ firstBranch.type === undefined &&
60
+ firstBranch.properties === undefined &&
61
+ firstBranch.$ref === undefined &&
62
+ Array.isArray(firstBranch.required)
63
+ ) {
64
+ const { oneOf: _oneOf, anyOf: _anyOf, ...object } = node;
65
+ return sample(
66
+ { ...object, required: [...(node.required ?? []), ...firstBranch.required] },
67
+ key,
68
+ depth,
69
+ onlyRequired,
70
+ root,
71
+ );
72
+ }
73
+ if (Array.isArray(node.oneOf)) return sample(node.oneOf[0], key, depth + 1, onlyRequired, root);
74
+ if (Array.isArray(node.anyOf)) return sample(node.anyOf[0], key, depth + 1, onlyRequired, root);
75
+ // ⛔ Тип бывает ОБЪЕДИНЁННЫМ (`["integer","null"]` у необязательного числового поля). Массив не
76
+ // совпадает ни с одной веткой `switch`, и образец молча уходил в ветку строки: у правки поведения
77
+ // `ai_error_target_stage_id` выходил строкой `'x'`, zod ждал число, сборка запроса отгруженного
78
+ // клиента падала — и выгрузка объявляла расхождением контракта то, что было мусором генератора.
79
+ // `null` отбрасывается: образец обязан быть НАСТОЯЩИМ значением, а не пустотой.
80
+ const declaredType = Array.isArray(node.type)
81
+ ? (node.type.find((candidate) => candidate !== 'null') ?? node.type[0])
82
+ : node.type;
83
+ const type = declaredType ?? (node.properties ? 'object' : node.items ? 'array' : 'string');
84
+ switch (type) {
85
+ case 'array':
86
+ return Array.from({ length: Math.max(node.minItems ?? 1, 1) }, () =>
87
+ sample(node.items ?? { type: 'string' }, key, depth + 1, onlyRequired, root),
88
+ );
89
+ case 'object': {
90
+ // У отгруженного Zod 4 запись по enum исчерпывающая. JSON-схема описывает её
91
+ // через propertyNames, и пустой объект фильтр отвергает по каждому транспорту.
92
+ if (!node.properties && Array.isArray(node.propertyNames?.enum)) {
93
+ return Object.fromEntries(node.propertyNames.enum.map((name) => [
94
+ name,
95
+ sample(node.additionalProperties ?? { type: 'string' }, name, depth + 1, onlyRequired, root),
96
+ ]));
97
+ }
98
+ if (!node.properties) return {};
99
+ const required = new Set(node.required ?? []);
100
+ const out = {};
101
+ for (const [name, child] of Object.entries(node.properties)) {
102
+ if (onlyRequired && !required.has(name)) continue;
103
+ out[name] = sample(child, name, depth + 1, onlyRequired, root);
104
+ }
105
+ return out;
106
+ }
107
+ case 'integer':
108
+ case 'number':
109
+ // Роли волны не делят поле сделки; роли ворот воронки не делят стадию.
110
+ // JSON-схема описывает отдельные числа, а принимающий сервис требует их различия.
111
+ if (key === 'field_id' || key === 'status_id') {
112
+ const offset = distinctNumericIds.get(key) ?? 0;
113
+ distinctNumericIds.set(key, offset + 1);
114
+ return Math.min(node.maximum ?? Number.MAX_SAFE_INTEGER, (node.minimum ?? 4) + offset);
115
+ }
116
+ return node.minimum ?? 4;
117
+ case 'boolean':
118
+ return true;
119
+ default: {
120
+ if (node.format === 'uuid') return nextUuid();
121
+ if (node.format === 'email') return 'sample@example.invalid';
122
+ if (
123
+ key.toLowerCase() === 'timezone' ||
124
+ /iana[\s_-]*time[\s_-]*zone/iu.test(`${node.format ?? ''} ${node.description ?? ''}`)
125
+ ) return 'Europe/Moscow';
126
+ if (node.format === 'uri' || /url/i.test(key)) return 'https://example.invalid/x';
127
+ // Форматы дат обязаны давать НАСТОЯЩЕЕ значение. Заглушка `x` проходила, пока образец
128
+ // никуда не отправлялся; с проверкой приёма настоящим DTO она даёт ложный отказ — красным
129
+ // становится инструмент, у которого контракт в порядке, а мусорным был образец.
130
+ if (node.format === 'date') return '2026-07-01';
131
+ if (node.format === 'date-time') return '2026-07-01T00:00:00.000Z';
132
+ if (node.pattern?.includes('\\d{4}-\\d{2}-\\d{2}')) return '2026-07-01';
133
+ // Шаблон строки узнаётся пробами: заглушка `x` нарушала шаблон САМОЙ схемы (`^\d+$` номера контакта, `HH:mm`
134
+ // окна), и отказ отгруженного фильтра на мусоре генератора выглядел расхождением контракта.
135
+ const probe = typeof node.pattern === 'string' ? patternProbe(node.pattern) : undefined;
136
+ if (probe !== undefined) return probe;
137
+ if (/_at$|At$/.test(key)) return '2026-07-01T00:00:00.000Z';
138
+ if (node.minLength && node.minLength > 1) return 'x'.repeat(node.minLength);
139
+ return 'x';
140
+ }
141
+ }
142
+ }
143
+
144
+ /** Пробы значения строки с шаблоном — в порядке предпочтения. */
145
+ export const PATTERN_PROBES = Object.freeze([
146
+ '1',
147
+ '12:00',
148
+ '2026-07-01',
149
+ '2026-07-01T00:00:00.000Z',
150
+ 'x',
151
+ 'X',
152
+ 'x1',
153
+ 'x-1',
154
+ 'x_1',
155
+ ]);
156
+
157
+ /** Первая проба, проходящая шаблон; шаблон, который JavaScript не разбирает, проб не получает. */
158
+ function patternProbe(pattern) {
159
+ let regex;
160
+ try {
161
+ regex = new RegExp(pattern, 'u');
162
+ } catch {
163
+ return undefined;
164
+ }
165
+ return PATTERN_PROBES.find((candidate) => regex.test(candidate));
166
+ }
167
+
168
+ /** Счётчик образцов сбрасывается вызывателем на каждый вариант инструмента. */
169
+ export function resetSampleUid() {
170
+ uid = 0;
171
+ distinctNumericIds.clear();
172
+ }
173
+
174
+ export { sample };
@@ -0,0 +1,160 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { resetSampleUid, sample } from './sample-args.mjs';
4
+
5
+ /**
6
+ * Второй читатель ссылок схемы — генератор образца тела. Его слепота стоила дороже, чем у первого:
7
+ * нерешённая ссылка выглядит здесь узлом без типа, то есть даёт СТРОКУ вместо объекта, запрос
8
+ * отгруженного клиента не собирается, и проверка на стороне besales-api, отбирающая записи по
9
+ * НАЛИЧИЮ образца, молча пропускает такой инструмент целиком.
10
+ */
11
+ describe('образец тела', () => {
12
+ it('IANA timezone определяется по имени, формату и описанию; enum имеет приоритет', () => {
13
+ expect(sample({ type: 'object', properties: {
14
+ timezone: { type: 'string' },
15
+ another: { type: 'string', description: 'IANA timezone для сообщений' },
16
+ formatted: { type: 'string', format: 'iana-timezone' },
17
+ enumerated: { type: 'string', format: 'iana-timezone', enum: ['Asia/Tashkent'] },
18
+ } })).toEqual({
19
+ timezone: 'Europe/Moscow',
20
+ another: 'Europe/Moscow',
21
+ formatted: 'Europe/Moscow',
22
+ enumerated: 'Asia/Tashkent',
23
+ });
24
+ });
25
+ const schemaWithRef = {
26
+ type: 'object',
27
+ properties: {
28
+ media: {
29
+ type: 'object',
30
+ properties: { image: { $ref: '#/$defs/handler' } },
31
+ },
32
+ },
33
+ $defs: {
34
+ handler: {
35
+ type: 'object',
36
+ properties: { behavior: { type: 'string', enum: ['SILENT'] } },
37
+ },
38
+ },
39
+ };
40
+
41
+ it('ветка-условие «одно из полей обязательно» у объекта даёт ОБЪЕКТ с полем первой ветки', () => {
42
+ resetSampleUid();
43
+ const schema = {
44
+ type: 'object',
45
+ required: ['operation_id'],
46
+ anyOf: [{ required: ['final_content'] }, { required: ['finalContent'] }],
47
+ properties: {
48
+ operation_id: { type: 'string' },
49
+ final_content: { type: 'string' },
50
+ finalContent: { type: 'string' },
51
+ },
52
+ };
53
+
54
+ // ⛔ Без различения образцом выходила строка: запрос не собирался, выгрузка реестра падала.
55
+ expect(sample(schema, '', 0, true)).toEqual({ operation_id: 'x', final_content: 'x' });
56
+ expect(sample(schema, '', 0, false)).toEqual({
57
+ operation_id: 'x',
58
+ final_content: 'x',
59
+ finalContent: 'x',
60
+ });
61
+ });
62
+
63
+ it('ссылка разворачивается в ОБЪЕКТ, а не в строку', () => {
64
+ resetSampleUid();
65
+
66
+ // ⛔ Различающая проверка именно для этого читателя: тесты `schemaConstraints` остались бы
67
+ // зелёными при снятом разыменовании здесь.
68
+ expect(sample(schemaWithRef)).toEqual({ media: { image: { behavior: 'SILENT' } } });
69
+ });
70
+
71
+ it('ссылка внутри ветки oneOf разрешается: корень доезжает и туда', () => {
72
+ resetSampleUid();
73
+ const schema = {
74
+ type: 'object',
75
+ properties: { x: { oneOf: [{ $ref: '#/$defs/inner' }] } },
76
+ $defs: { inner: { type: 'object', properties: { deep: { type: 'string' } } } },
77
+ };
78
+
79
+ // Потеря корня в этой ветке превращала бы законную ссылку в «указатель никуда не ведёт»,
80
+ // то есть роняла бы выгрузку на исправном инструменте.
81
+ expect(sample(schema)).toEqual({ x: { deep: 'x' } });
82
+ });
83
+
84
+ it('объединённый тип даёт значение НЕПУСТОЙ ветки, а не строку', () => {
85
+ resetSampleUid();
86
+
87
+ // Массив в `type` не совпадал ни с одной веткой и уходил в ветку строки: схема ждала число,
88
+ // сборка запроса падала, и выгрузка объявляла расхождением контракта мусор генератора.
89
+ expect(sample({ type: 'object', properties: { n: { type: ['integer', 'null'] } } })).toEqual({
90
+ n: 4,
91
+ });
92
+ });
93
+
94
+ it('строка с шаблоном получает значение, которое шаблон проходит, а не заглушку', () => {
95
+ resetSampleUid();
96
+
97
+ // Заглушка `x` нарушала шаблон САМОЙ схемы (номер контакта только цифрами, окно HH:mm), и отказ
98
+ // отгруженного фильтра на мусоре генератора выглядел расхождением контракта.
99
+ expect(
100
+ sample({
101
+ type: 'object',
102
+ properties: {
103
+ contact_id: { type: 'string', pattern: '^\\d+$' },
104
+ window_start: { type: 'string', pattern: '^([01]\\d|2[0-3]):[0-5]\\d$' },
105
+ code: { type: 'string', pattern: '^[A-Z]$' },
106
+ free: { type: 'string' },
107
+ },
108
+ }),
109
+ ).toEqual({ contact_id: '1', window_start: '12:00', code: 'X', free: 'x' });
110
+ });
111
+
112
+ it('соседние роли школы получают разные допустимые field_id', () => {
113
+ resetSampleUid();
114
+ const role = { type: 'object', properties: { field_id: { type: 'integer', minimum: 1, maximum: 10 } } };
115
+ const schema = { type: 'object', properties: { launch_type: role, product: role, segment: role } };
116
+ expect(sample(schema)).toEqual({
117
+ launch_type: { field_id: 1 },
118
+ product: { field_id: 2 },
119
+ segment: { field_id: 3 },
120
+ });
121
+ resetSampleUid();
122
+ expect(sample(schema)).toEqual({
123
+ launch_type: { field_id: 1 },
124
+ product: { field_id: 2 },
125
+ segment: { field_id: 3 },
126
+ });
127
+ });
128
+
129
+ it('роли ворот воронки получают разные status_id', () => {
130
+ resetSampleUid();
131
+ const stage = { type: 'object', properties: { status_id: { type: 'integer', minimum: 1, maximum: 10 } } };
132
+ const schema = { type: 'object', properties: { submitted: stage, approved: stage, rejected: stage } };
133
+ expect(sample(schema)).toEqual({
134
+ submitted: { status_id: 1 },
135
+ approved: { status_id: 2 },
136
+ rejected: { status_id: 3 },
137
+ });
138
+ });
139
+
140
+ it('включённый фильтр сделки получает действующий тип, а не NONE', () => {
141
+ resetSampleUid();
142
+ expect(sample({ type: 'object', properties: {
143
+ inbound_deal_filter_enabled: { type: 'boolean' },
144
+ inbound_deal_filter_type: { type: 'string', enum: ['NONE', 'TAG', 'CUSTOM_FIELD'] },
145
+ inbound_deal_filter_value: { type: 'string' },
146
+ } })).toEqual({
147
+ inbound_deal_filter_enabled: true,
148
+ inbound_deal_filter_type: 'TAG',
149
+ inbound_deal_filter_value: 'x',
150
+ });
151
+ });
152
+
153
+ it('битая ссылка роняет генератор, а не подсовывает пустой объект', () => {
154
+ resetSampleUid();
155
+
156
+ expect(() =>
157
+ sample({ type: 'object', properties: { x: { $ref: '#/$defs/typo' } }, $defs: {} }),
158
+ ).toThrow('никуда не ведёт');
159
+ });
160
+ });