@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
@@ -58,7 +58,7 @@
58
58
 
59
59
  Ресурсы (справочники, отдаются целиком одним чтением): 37 файлов, медиана 4 КБ,
60
60
  максимум **104 836** байт — принципы промптинга. Инструкции сервера, уходящие при каждом
61
- подключении, после выноса подробностей в resources/help — 5 112 байт (3 278 символов).
61
+ подключении, после выноса подробностей в resources/help — 5 118 байт (3 277 символов).
62
62
 
63
63
  ## Три класса и потолки
64
64
 
@@ -95,18 +95,18 @@
95
95
  **Порог отказа — 256 КБ.** Он выше наблюдаемого максимума работающих снимков (77,6 КБ),
96
96
  чтобы предохранитель не гасил живые сценарии.
97
97
 
98
- ## Что теперь лечится на стороне API
98
+ ## Что потолком не лечится
99
99
 
100
100
  **Снимок канала на 8 МБ.** Это не выброс, а штатный ответ для воркспейса с сорока
101
101
  агентами на одном канале. 72 % веса — системные промпты агентов, которые в этом сценарии
102
102
  не нужны вовсе: их читают отдельными инструментами промптов. Но даже без промптов
103
103
  остаётся 2,2 МБ триггеров.
104
104
 
105
- Поэтому `besales_platform_context_get` теперь принимает `sections`: для выбора достаточно
106
- `platform,agent_summaries,readiness`, а router/behavior/follow_up/pipeline_settings читаются
107
- отдельно. `besales_agent_list` отдаёт компактные summaries с поиском и пагинацией. Полный
108
- `compiledPrompt` появляется только в явном `besales_agent_get` или секции `agents_full`.
109
- Замещающая правка по-прежнему требует полного снимка относящейся к ней секции.
105
+ Ни один потолок здесь не помогает: обрезать нельзя (снимок для замещающей записи),
106
+ отказать — значит закрыть единственный документированный путь безопасной правки триггера.
107
+ Лечится только сужением на стороне бэкенда: снимок должен уметь отдавать **одного агента**,
108
+ а системный промпт — только по явному запросу. До этой правки правка триггеров на крупном
109
+ канале остаётся тем, чем была, — работой в обход моста.
110
110
 
111
111
  ## Как это включается
112
112
 
@@ -128,6 +128,9 @@
128
128
  мутацию нельзя. У чтения ошибка постобработки остаётся обычной ошибкой и допускает новый
129
129
  вызов.
130
130
 
131
+ Под тем же флагом — обрезка **текста ошибки** и обрезка **тела ресурса**. Обе меняют форму
132
+ того, что видит вызывающий, и потому ждут включения наравне с остальным конвертом.
133
+
131
134
  Политика объявляется у самого инструмента:
132
135
 
133
136
  - `neverTruncate` — обрезать нельзя, при превышении отказ;
@@ -143,6 +146,193 @@
143
146
  Маркеры в ответе начинаются с `_mcp`: у бэкенда есть собственные признаки усечения с другим
144
147
  смыслом, и совпадение имён их бы перемешало.
145
148
 
149
+ ## Списочные инструменты без постраничной выдачи — поимённо
150
+
151
+ Пересчитано по контракту: из 29 списочных инструментов ручки сужения есть у десяти,
152
+ у **девятнадцати** нет ни одной.
153
+
154
+ | Инструмент | Адрес |
155
+ |---|---|
156
+ | `agent_list` | `/channels/:id/agents` |
157
+ | `broadcast_cohorts_list` | `/workspaces/:id/broadcast-analytics/cohorts` |
158
+ | `broadcast_mailing_variant_list` | `/workspaces/:id/broadcast-mailing-variants` |
159
+ | `crm_list` | `/workspaces/:id/crm-connections` |
160
+ | `crm_operator_list` | `/crm-connections/:id/operators` |
161
+ | `crm_pipeline_list` | `/crm-connections/:id/pipelines` |
162
+ | `crm_pipeline_status_list` | `/crm-connections/:id/pipelines/:id/statuses` |
163
+ | `datasource_catalog_roles` | `/workspaces/:id/data-sources/:id/catalog-roles` |
164
+ | `datasource_catalogs` | `/workspaces/:id/data-sources/:id/catalogs` |
165
+ | `datasource_list` | `/workspaces/:id/data-sources` |
166
+ | `feedback_sheet_list` | `/agents/:id/feedback-sheets` |
167
+ | `followup_reactions` | `/channels/:id/followup-sequences/reactions` |
168
+ | `followup_sequence_list` | `/channels/:id/followup-sequences` |
169
+ | `getcourse_departments_list` | `/channels/:id/getcourse/departments` |
170
+ | `icp_scenarios_list` | `/icp/:id/scenarios` |
171
+ | `knowledge_space_list` | `/workspaces/:workspaceId/knowledge-spaces` |
172
+ | `model_catalog_list` | `/model-catalog` |
173
+ | `variable_list` | `/workspaces/:id/variables` |
174
+ | `wazzup_templates_list` | `/workspaces/:id/wazzup-waves/templates/:id` |
175
+
176
+ Поиск по вопросам-ответам сюда не входит: у него уже есть `top_k`, и вторая ручка на ту же
177
+ ось только запутала бы.
178
+
179
+ ### Четыре списка знаний: постраничность была фальшивой
180
+
181
+ ⛔ **Исправлено.** Ручки `page`/`limit` у документов, вопросов-ответов, таблиц и сайтов резали
182
+ ответ **в самом мосту**, а по сети всё равно приезжало всё. Хуже того, у нарезки было
183
+ **умолчание в двадцать строк**: вызов без аргументов молча возвращал первые двадцать источников
184
+ — ни признака усечения, ни общего числа. Увидеть подмену было нечем.
185
+
186
+ Теперь `limit` и `cursor` уходят на сервер, нарезка в мосту удалена. Номер страницы заменён
187
+ курсором: между страницами источники создают и удаляют, и смещение пропускало бы строку или
188
+ показывало бы её дважды. Расхождение с отгруженной копией объявлено в реестре отставания.
189
+
190
+ ⚠️ **Умолчание у размера страницы здесь ОСТАВЛЕНО — и это не противоречие правилу.** Источники
191
+ знаний это содержимое, а не конфигурация: их у пространства бывают тысячи, и отдавать всё по
192
+ умолчанию значило бы менять поведение в худшую сторону. Предел стоял и раньше (500 строк на
193
+ стороне сервера), но стоял МОЛЧА — ровно по границе, из-за чего продолжение было неотличимо от
194
+ конца списка. Новое здесь одно: сервер берёт строку сверх предела и возвращает курсор, поэтому
195
+ «показано не всё» стало видно.
196
+
197
+ ### Разбор по стороне работы (сверено с контрактом besales-api)
198
+
199
+ **Сделано — три списка.**
200
+
201
+ `variable_list` — сервер УЖЕ умел страницы (`cursor`, `limit`, предел 200), а мост их не
202
+ пробрасывал: перечень молча обрывался на пятидесятой строке по серверному умолчанию, и дочитать
203
+ было нечем. Ручки добавлены, вызов без них при неполной выдаче отказывает.
204
+
205
+ `agent_list` — страницы построены на бэкенде (тот же ключевой курсор). ⚠️ Здесь исправлялась
206
+ ДРУГАЯ болезнь: сервер не резал ничего, но перечень парка не помещался в потолок ответа, и
207
+ политика `neverTruncate` отказывала **без выхода** — сузить запрос было нечем. Теперь у отказа
208
+ есть выход. Умолчания у `limit` нет ни на одной стороне: без него перечень приходит целиком,
209
+ как и раньше, — иначе раскатка правки уехала бы на ЧАСТЬ парка при успешном отчёте.
210
+
211
+ ⚠️ Урок этого случая шире одного инструмента: **политика `neverTruncate` стережёт обрезку
212
+ МОСТОМ и слепа к обрезке СЕРВЕРОМ.** Пятьдесят строк не дотягивают до потолка размера никогда,
213
+ поэтому предохранитель не срабатывал ни разу. Для остальных списков проверять надо не размер
214
+ ответа, а наличие серверного предела.
215
+
216
+ `icp_scenarios_list` — единственный, у кого отказ был **замерен**: 119 КБ голым массивом против
217
+ потолка в 64 КБ, то есть инструмент отказывал уже сегодня и добрать отрезанное было нечем.
218
+
219
+ `crm_pipeline_list`, `crm_pipeline_status_list`, `followup_sequence_list` — по цене ошибки:
220
+ недостающая воронка сужает охват задачи, недостающая стадия даёт недостижимое правило
221
+ маршрутизации, а замещающая запись цепочки меняет её конфигурацию целиком.
222
+
223
+ ⭐ **Стадии и воронки упорядочены НОМЕРОМ, а не датой**, и переупорядочить их нельзя: порядок
224
+ стадий — сам по себе бизнес-смысл, его задаёт CRM. У них свой курсор («номер + идентификатор»)
225
+ рядом с общим — обобщать общий было нельзя, это поменяло бы поведение уже работающих читателей.
226
+ Полезная нагрузка у двух курсоров разной формы намеренно: курсор одного списка, поданный в
227
+ другой, разбирается в ничто, а не в правдоподобный мусор.
228
+
229
+ ### У отказа обязан быть выход — и это теперь проверяется
230
+
231
+ Политика «не обрезать» превращает переполнение в отказ. Это верно ровно до тех пор, пока
232
+ вызывающему есть чем сузить запрос; иначе инструмент отвечает «слишком много» на каждый вызов и
233
+ не говорит, что делать, — тупик, из которого не выбраться ни повтором, ни другими аргументами.
234
+
235
+ Выходом считается любое из: ручка сужения в схеме, объявленная подсказка «чем сузить», перечень
236
+ выбрасываемых путей, собственный потолок инструмента. Инвариант держит тест, читающий **разбор**
237
+ схемы, а не текст исходника: ручной обход регуляркой ошибается на границе окна и дважды подряд
238
+ дал неверный ответ — сначала объявил тупиком `crm_list`, у которого политики нет вовсе, потом
239
+ `broadcast_cohorts_list`, у которого подсказка есть с самого начала.
240
+
241
+ Настоящий тупик был **один** на весь мост: снимок перезаписей переменных агента. Сузить его
242
+ нечем по построению — набор неделим, он вход замещающей записи, — поэтому у него свой потолок и
243
+ сказанное вслух следствие: не помещается, значит безопасно обновить агента невозможно.
244
+
245
+ ### Чем § 3.3 закрыт и что осталось
246
+
247
+ **Тихого усечения не осталось ни одного — это проверено, а не предположено.** Оба найденных
248
+ случая исправлены: перечень переменных резал СЕРВЕР (50 строк), четыре списка знаний резал МОСТ
249
+ (20 строк). У остальных двенадцати списков запросы просмотрены поимённо — **предела в запросе нет
250
+ ни у одного**, то есть скрывать им нечего.
251
+
252
+ Осталось двенадцать списков без ручек сужения: `crm_list`, `crm_operator_list`,
253
+ `datasource_catalog_roles`, `datasource_catalogs`, `datasource_list`, `feedback_sheet_list`,
254
+ `getcourse_departments_list`, `model_catalog_list`, `wazzup_templates_list`,
255
+ `knowledge_space_list`, `broadcast_mailing_variant_list`, `broadcast_cohorts_list`.
256
+
257
+ ⚠️ **Это другой класс работы.** Они отдают всё; если ответ не помещается, конверт обрезает его
258
+ **с пометкой** `_mcpTruncated` — усечение видно и вызывающему, и человеку. То есть здесь речь про
259
+ экономию контекста, а не про тихую ложь. Половина из них к тому же мала по природе (отделы,
260
+ шаблоны, подключения CRM, каталог моделей), а у когорт рассылок есть девять фильтров и
261
+ подсказка, чем сузить.
262
+
263
+ Образец, если браться: общий keyset-курсор (`shared/utils/keyset-cursor`), `take: limit + 1`,
264
+ курсор из последней отданной строки — отработан шестикратно и повторяется механически.
265
+
266
+ **Сузить можно уже сегодня, страниц нет (5):** `broadcast_cohorts_list`, `followup_reactions`,
267
+ `followup_sequence_list`, `broadcast_mailing_variant_list`, `knowledge_space_list` — у них богатые
268
+ фильтры; постраничная выдача им нужна, но обходной путь у вызывающего есть.
269
+
270
+ Правила для будущей работы: `limit` только необязательный и БЕЗ значения по умолчанию
271
+ (усечённый список конфигурации — не «неполный ответ», а тихая порча настройки); ответ обязан
272
+ нести общее число и признак «есть ещё»; курсор по устойчивому ключу, а не по смещению —
273
+ между страницами сущности создают и архивируют; параметр кладётся в строку запроса, потому
274
+ что у всех двадцати метод GET, а тело GET сервер игнорирует.
275
+
276
+ ## Чего потолок не лечит: эхо правки
277
+
278
+ Правка триггера возвращала триггер ЦЕЛИКОМ — со всеми шагами и условиями, то есть копию только
279
+ что отправленного. Потолок здесь бесполезен: один такой ответ до него не достаёт. Расход
280
+ возникает от повторения — на канале триггеры правят десятками подряд.
281
+
282
+ Лечится не потолком, а **проекцией ответа**: наружу уходят все скалярные поля (они дёшевы, и
283
+ среди них есть решённые СЕРВЕРОМ) и числа вместо двух тяжёлых массивов. Проекция обязана быть
284
+ тотальной: она выполняется ПОСЛЕ состоявшейся записи, и исключение в ней стало бы приглашением
285
+ повторить мутацию — незнакомая форма проходит насквозь.
286
+
287
+ Тестов два и они про разное: сама проекция и её **проводка** в инструмент. Без второго функция
288
+ могла бы быть написана и не подключена — ровно то состояние, в котором этот пункт и пролежал.
289
+
290
+ ## Текст промпта в шагах правки
291
+
292
+ Промпт доходит до 80 000 символов — до ~160 КБ кириллицей. Шаги правки возвращали его снова и
293
+ снова: создание черновика, каждое применение операций, коммит. За один сеанс правки один и тот
294
+ же текст прилетал вызывающему по нескольку раз.
295
+
296
+ ⛔ **Выбросить его везде нельзя, и это не осторожность, а механика.** Операции адресуются
297
+ точными якорями, а якоря берут из текста; без текста доля непопавших операций становится 100 %.
298
+ Поэтому:
299
+
300
+ - **чтение черновика отдаёт текст ВСЕГДА** — это единственный путь получить его целиком, и
301
+ флага у него нет намеренно;
302
+ - **создание черновика и применение операций** по умолчанию отдают отпечаток и длину, а текст —
303
+ по флагу `include_prompt_text`. Изменился ли текст, видно по отпечатку;
304
+ - **коммит** возвращал текст ДВАЖДЫ — в черновике и в новой версии. Копия из черновика заменена
305
+ отпечатком; авторитетна версия, именно она уехала агенту. ⚠️ Если копии почему-то разошлись,
306
+ не убирается ни одна: расхождение — факт, который вызывающий обязан увидеть.
307
+
308
+ Длина считается в символах: в них же задан боевой предел промпта, с ним вызывающий и сравнивает.
309
+
310
+ ## Соседний слой: аннотации и гейты
311
+
312
+ Потолок отвечает на вопрос «сколько», аннотации — на вопрос «что инструмент делает».
313
+ Признак объявляется полем `sideEffect` (`none` / `write` / `spend`) у каждого определения
314
+ и превращается в четыре подсказки хосту: только чтение, разрушительность, идемпотентность,
315
+ выход во внешние системы. Ослабление любой из них — отдельное явное объявление
316
+ (`reversible`, `idempotent`, `closedWorld`), умолчание всегда худшее.
317
+
318
+ ⚠️ Аннотация — подсказка, и автоодобряющий хост вправе ей не поверить. Там, где цена ошибки
319
+ велика, стоит `explicit_confirmation` — условие входа, которое обойти нельзя.
320
+
321
+ ### Подтверждение: гейт моста, а не поле запроса
322
+
323
+ ⛔ **`explicit_confirmation` НЕ уходит на сервер и уходить не должен.** У сервера включены
324
+ `whitelist + forbidNonWhitelisted`: поле, которого нет в его DTO, даёт отказ 400 на **каждом**
325
+ вызове. Ни один из адресов, за которыми стоят гейты, такого поля не принимает. Смысл гейта
326
+ другой — заставить вызывающего принять решение осознанно, а не выполнить операцию по умолчанию;
327
+ авторизацию проверяет сервер своими средствами, и это отдельный слой.
328
+
329
+ ⛔ **Опубликованная схема обязана пришпиливать значение к `true`** (`const: true`, равнозначная
330
+ форма — `enum: [true]`). Объявив просто `boolean`, мост СООБЩАЕТ вызывающему, что `false`
331
+ допустим; разбор его отвергнет, и отказ будет выглядеть капризом инструмента, а не невыполненным
332
+ условием. Схема, которая **проверяет** вызов (Zod в определении), и схема, которая
333
+ **публикуется** (`mcp-tools.json`), — разные файлы: разойтись они могут молча, поэтому согласие
334
+ между ними проверяется тестом, выводящим ожидание разбором, а не чтением формы.
335
+
146
336
  ## Когда пересматривать
147
337
 
148
338
  Если предохранитель начнёт срабатывать на штатных ответах — **поднимать потолок, а не
@@ -0,0 +1,102 @@
1
+ # Чтение подключений и секретных настроек
2
+
3
+ Мост читает опубликованные маршруты API с ключом выбранного пространства. Значения SECRET,
4
+ учётные данные подключений и исполняемые настройки шагов проецирует сервер до HTTP-ответа.
5
+ Перед формированием текста и `structuredContent` мост дополнительно применяет
6
+ `src/utils/secret-read-boundary.ts#projectBridgeSecretRead`. Проекция обходит объекты,
7
+ массивы и свободные карты, скрывает значения секретных ключей, SECRET-переменные,
8
+ конфиги шагов с серверным признаком `configReadable: false` и снимки аудита.
9
+ Формы уже спроецированных сервером шагов без метаданных редактирования сохраняются;
10
+ повторное закрытие всей настройки потеряло бы безопасные `method`, `timeout_ms` и ссылки
11
+ на переменные. Ответы этих читателей проверяет совместный серверный договор.
12
+ Маски и ссылки на переменные сохраняются. Проекция действует при обоих режимах
13
+ конверта; цикл или превышение бюджета дают существующую безопасную квитанцию.
14
+ Каждый строковый лист дополнительно проверяется по NFKC-представлению на сигнатуры
15
+ provider key, JWT, bot token, Bearer и private key, включая позиции имён колонок.
16
+ При совпадении исходное значение маскируется до формирования обоих конвертов;
17
+ безопасные значения сохраняются без нормализации выдаваемого текста.
18
+ В позициях имён колонок действует копия серверной `dataSourceColumnNameDecision`:
19
+ 1–512 символов, ASCII-буквы/цифры/`_ . -` и русские `А-Я а-я Ё ё`, непустые части
20
+ через точку. Смешение письменностей запрещено, кроме служебных `Catalog_` и `_Key`
21
+ из полного штатного словаря. Проверка исходной строки предшествует сигнатурам;
22
+ Unicode-нормализация не превращает невалидное имя в допустимое. Невалидное имя
23
+ маскируется до обоих конвертов. Служебные серверные маски сохраняются.
24
+ Общая таблица `columnNames` передаётся в подтверждённом серверном снимке; unit-тест
25
+ моста требует идентичных решений, включая длину, все найденные обходы, Cf и гомоглифы.
26
+
27
+ Вместо секретов доступны имена переменных, маски, состояние подключения и признаки безопасного
28
+ редактирования. Секретные адреса CRM выдаются человеку через браузерную страницу; карточки
29
+ подключений их не содержат. Ошибка области или права остаётся ошибкой инструмента.
30
+
31
+ ## Совместная проверка API и моста
32
+
33
+ `test/bridge-secret-read-contract.ts` в API получает настоящие HTTP-ответы приложения с PostgreSQL
34
+ и ключами MCP: владельца, чужого пространства и без прав. Исходные данные содержат исторические
35
+ секреты шагов, шифрованную SECRET-переменную, историческую перезапись и зашифрованные ключи CRM.
36
+ Проверка требует отсутствия каждого исходного значения и сохранения безопасных полей.
37
+ Свободные метаданные источника проверяются после настоящей записи через HTTP и после
38
+ штатного переноса в PostgreSQL; отдельно подкладывается историческая строка с паролем
39
+ в объекте внутри массива. Новая запись секретов запрещена; перенос маскирует сигнатуры
40
+ и запрещает остаточные структурные секреты. Историческое чтение сохраняет безопасные
41
+ соседи и скрывает значение. Правка триггера проверяется двумя отдельными сценариями: допустимое определение возвращает
42
+ успех, а исторические открытые HTTP-ключи получают безопасный отказ без передачи значений.
43
+
44
+ Для 1С договор сверяет полные метаданные обычного маппинга `Ref_Key`/`Code` и
45
+ штатного словаря обогащения после записи и переноса. Реальные HTTP-ответы записи
46
+ через ключ моста также входят в снимок: два допустимых назначения и все отказы таблицы решений
47
+ для секретных метаданных. Проверка реестра моста требует неизменного тела POST и
48
+ сохранения безопасных метаданных в тексте и `structuredContent` при обоих режимах
49
+ конверта; вложенный `password` продолжает маскироваться общей проекцией.
50
+ Невалидные имена и сигнатуры в позициях имён запрещаются на записи и пропускаются
51
+ штатным переносом с `DATA_SOURCE_METADATA_UNSAFE`. Исторические строки возвращают
52
+ маску, безопасные соседи сохраняются. Вне позиций имён сигнатуры маскируются при переносе.
53
+
54
+ После успешных assertions тест печатает `PRSM_BRIDGE_CONTRACT=<base64 JSON>`. Этот снимок
55
+ переносится без изменения тел командой
56
+ `node scripts/import-secret-read-contract.mjs <API_ROOT> <VREQ_LOG>`
57
+ в `src/tools/__fixtures__/secret-read-contract.json` и прогоняется
58
+ `yarn test src/tools/secret-read-contract.spec.ts`. Тест использует настоящий реестр и HTTP-клиент,
59
+ сверяет метод, адрес, тело запроса и итоговый ответ в обоих режимах конверта. Снимок содержит
60
+ коммит API и SHA-256 серверных читателей, писателя, переноса и проверочных фикстур.
61
+ Импорт сверяет родство Git-метки канала с локальным коммитом и хэши всех этих файлов;
62
+ каждый runtime-файл, изменённый как между коммитами, так и в рабочем дереве, допускается
63
+ только при наличии его проверенного хэша в снимке. Локальный коммит сохраняется отдельно
64
+ как `verifiedApiRevision`; исходная метка канала `apiRevision` не подменяется. Это позволяет проверить незакоммиченный
65
+ дифф при режиме Git только для чтения. При расхождении импорт отказывает:
66
+ результат относится к этой паре исходников, а не к будущей версии API.
67
+
68
+ Обновлять снимок вручную нельзя. При изменении серверного читателя требуется новый серверный
69
+ прогон и перенос его вывода. Самостоятельный тест моста проверяет обработку зафиксированного
70
+ договора; он не доказывает, что произвольный другой сервер скрывает секреты. Добавление нового
71
+ читателя требует серверного теста с секретом в его исходных данных и проверки итогового MCP-ответа.
72
+
73
+ ## Полная опись
74
+
75
+ Канон — `besales-api/test/bridge-secret-read-inventory.json`, перенесённый в снимок
76
+ верификатором. В нём поимённо перечислены все инструменты `mcp-tools.json`, включая
77
+ setup/init/status/rotation, 1С, CRM, внешние API и их ключи, каналы, переменные,
78
+ исполняемые настройки и остальные опубликованные объекты. Безопасных исключений из
79
+ общей проекции нет: домен описывает читателя, а не разрешение выдать секрет.
80
+ Каждая группа называет файл определения; общие `projection` и `check` задают
81
+ исполняемую проекцию и проверку для каждого инструмента этой группы.
82
+
83
+ `src/tools/secret-read-inventory.spec.ts` сравнивает полные множества описи,
84
+ `mcp-tools.json` и рабочего реестра, проверяет ссылки и для каждой строки пропускает
85
+ секретоносный ответ через общую сериализацию с выключенным и включённым конвертом.
86
+ Добавление любого нового инструмента без строки в описи красит сторожа, независимо
87
+ от имени, HTTP-метода и класса побочного эффекта. Отдельные инструменты управления
88
+ исходящими вебхуками и ключами рабочего пространства в текущем `mcp-tools.json`
89
+ отсутствуют; выдачу ключей внешнего API покрывает группа `external-api-keys`.
90
+ Это полная опись и проверка общей проекции, а не утверждение о живом HTTP-прогоне
91
+ каждого из инструментов: реальные HTTP-тела покрывает совместный договор.
92
+
93
+ Дополнительно для каждого из 55 читателей подключений, CRM, 1С, внешнего API,
94
+ переменных и локальных подключений к пространству тест вызывает настоящий
95
+ registry/ApiClient с корректным входом и управляемым HTTP-транспортом, возвращающим
96
+ секретоносную вложенную карту. В обоих режимах конверта проверяются состоявшийся
97
+ запрос, успешный ответ и отсутствие секрета без квитанции сбоя форматирования.
98
+
99
+ `node scripts/verify-secret-read-mutants.mjs` снимает общую проекцию, обход массивов
100
+ и добавляет инструмент вне описи; каждый случай должен упасть по assertion, а файлы
101
+ восстанавливаются с проверкой SHA-256. `node scripts/verify-secret-read-import.mjs
102
+ <API_ROOT> <VREQ_LOG>` проверяет пять отказов импортера и неизменность снимка.
@@ -1,5 +1,8 @@
1
1
  # Состояние длительной задачи
2
2
 
3
+ В [сетевом режиме](modules/network-mode.md) локальные `besales_task_*` недоступны:
4
+ они возвращают отказ до обращения к файловому хранилищу. Контекст задачи хранит MCP-клиент.
5
+
3
6
  ## Решение
4
7
 
5
8
  Состоянием владеет локальный `besales-mcp`. Оно хранится в
@@ -54,5 +57,7 @@ browser setup state и исходные диалоги сюда не сохра
54
57
  Автоматический повтор мутации запрещён. Если status-tool или нужный scope недоступен, исход остаётся
55
58
  неразрешённым и это фиксируется в задаче.
56
59
 
57
- Setup URL, OAuth ticket и состояние отдельного async job остаются своими сущностями. Они не
58
- заменяют общую задачу и не копируются в неё вместе с секретами.
60
+ Setup ref допускается в `object_refs`/`pending_operations` для продолжения polling.
61
+ Адрес страницы настройки, OAuth-входа, загрузки или раскрытия секрета отвергается
62
+ при создании и обновлении задачи и не записывается в `tasks-v1.json`.
63
+ Сам мастер и отдельный async job остаются своими сущностями и не заменяют общую задачу.
@@ -0,0 +1,50 @@
1
+ # Личные номера Telegram: прогрев и лесенка
2
+
3
+ Инструменты входят в профиль `platform`, читающие — также в `readonly`. Мост обращается
4
+ только к ядру Besales; пароли, сессии и ключи Telegram не принимаются и не возвращаются.
5
+ Идентификаторы канала и номера берутся из навигации и таблицы номеров.
6
+
7
+ | Инструмент `besales_platform_telegram_personal_…` | Назначение | Право |
8
+ | --- | --- | --- |
9
+ | `accounts` | Таблица номеров, сводка и листание | `read:channels` |
10
+ | `warmup` | Настройки и аналитика прогрева | `read:channels` |
11
+ | `warmup_update` | Частичная правка настроек прогрева | `manage:channels` |
12
+ | `account_warmup` | Включение и ручной отказ отдельного номера | `manage:channels` |
13
+ | `ramp` | Чтение `newAccountRampEnabled` | `read:channels` |
14
+
15
+ У инструментов канала обязателен `channel_id`; у `account_warmup` также `account_id`
16
+ и булев `is_warming_up`. `workspace_id` можно не передавать при выбранной рабочей области.
17
+ Лишнее поле отклоняется до HTTP. Прогревом можно управлять без подтверждения, потому что
18
+ сообщения идут только между своими номерами.
19
+
20
+ Таблица принимает `search` (до 200 знаков), `status` (состояние связи), `page` (от 1)
21
+ и `limit` (1–100). Сводка `summary` относится ко всем живым номерам до фильтра;
22
+ `pagination` описывает страницу, `truncated` — неполное чтение. Мост сохраняет их целиком.
23
+ Прогрев читается отдельно в `warmup`: `active`, `reason`, `label`, `until`, `optedOut`.
24
+ Он не блокирует участие в рассылке; `campaign` и состояние строки показывают участие и разгон.
25
+ `restriction` содержит ограничения, наблюдения проверок и жалоб. `autoAppealNotBefore`
26
+ не означает запланированную подачу: автоматическая подача жалоб сейчас выключена.
27
+
28
+ Лесенка: 3, 4, 5, 6, 7 с первого дня рассылки; прогрев идёт параллельно 5 дней.
29
+ Прогрев включается сам при подключении номера, если его не выключить вручную.
30
+ `is_warming_up:false` выводит номер из автоматического прогрева до ручного включения;
31
+ true снимает ручной отказ. Чтение лесенки возвращает только её булев флаг, без других
32
+ настроек рассылки.
33
+
34
+ `warmup_update` принимает поля `TelegramWarmupPatchDto` в snake_case: `enabled`,
35
+ `images_enabled`, `messages_per_day`, `time_variation_minutes`, `response_delay_min_minutes`,
36
+ `response_delay_max_minutes`, `image_chance_percent`, `posts_to_react`,
37
+ `max_accounts_per_channel_reaction`, `pairing_hour_utc`, `hourly_interval_hours`,
38
+ `reaction_types` (до 100 строк), `reaction_hours_utc` (до 24 целых чисел).
39
+ В HTTP уходят camelCase-поля DTO. Пропуск сохраняет прежнее значение, false, 0 и []
40
+ передаются буквально. Допустимые рабочие диапазоны настроек проверяет ядро.
41
+
42
+ Ограничения, ручная жалоба и чтение её исхода описаны в
43
+ [документе апелляции](telegram-personal-restrictions.md). Перед жалобой покажи человеку
44
+ номер и текст, получи явное согласие и только затем передай `explicit_confirmation:true`.
45
+ Жалоба необратима, не чаще раза в сутки на номер; автоматическая подача выключена.
46
+
47
+ Проверки схем, запросов, профилей, строгого ввода, описаний и сохранения ответа находятся
48
+ в `telegram-personal-management.spec.ts` и `telegram-personal-restrictions.spec.ts`.
49
+ `scripts/telegram-personal-confirmation-mutants.mjs` проверяет, что снятие обязательного
50
+ согласия в Zod или опубликованной схеме ломает именованное утверждение теста.
@@ -0,0 +1,87 @@
1
+ # Ограничения личных номеров Telegram
2
+
3
+ Все три инструмента входят в профиль `platform`. Они обращаются к API выбранного канала;
4
+ UUID номера берётся из таблицы номеров. Прямых обращений к сервису номеров в мосту нет.
5
+
6
+ | Инструмент | Назначение | Право |
7
+ | --------------------------------------------------------- | -------------------------------------------- | ----------------- |
8
+ | `besales_platform_telegram_personal_restriction_check` | Проверка через системного бота @SpamBot | `manage:channels` |
9
+ | `besales_platform_telegram_personal_restriction_appeal` | Отправка апелляции от выбранных номеров | `manage:channels` |
10
+ | `besales_platform_telegram_personal_operational_task_get` | Чтение состояния задачи и ограничений номера | `read:channels` |
11
+
12
+ В проверке и апелляции выбери ровно одну форму: `all:true` либо `account_ids` из 1–100 уникальных
13
+ UUID v4. Предел 100 относится и ко всем номерам канала: если их больше, API отклонит пакет до
14
+ постановки. `workspace_id` необязателен при однозначно выбранном пространстве.
15
+ `idempotency_key` обязателен: 1–200 видимых ASCII-символов без пробелов. Мост передаёт его в
16
+ `idempotencyKey` тела API. Заголовок `x-idempotency-key` также поддерживается ядром; разные
17
+ ключи в теле и заголовке дают 400. Для одного намерения сохраняй ключ и аргументы.
18
+
19
+ Проверка обращается только к системному боту, людям ничего не отправляет и
20
+ `explicit_confirmation` не принимает. Апелляция требует явного согласия человека и
21
+ `explicit_confirmation:true`. Перед вызовом покажи человеку номер и свой текст, если он задан (без текста система подберёт английский шаблон сама), и получи явное согласие.
22
+ Автоматическая подача сейчас выключена. Номер отправит текст @SpamBot от своего имени, отменить отправку
23
+ нельзя. `text` необязателен: без него система выбирает английский текст из пула разных
24
+ апелляций со спинтаксом: 18 шаблонов, 144 раскрытия, отдельно для каждого номера,
25
+ без одинаковых текстов внутри пакета. Формулировок об общении только по входящим обращениям нет.
26
+ Выбор сохраняется до отправки и повторяется с тем же ключом. Сохранённый удалённый или
27
+ неизвестный ID даёт 409 `IDEMPOTENCY_REQUEST_MISMATCH` до отправки всей пачки;
28
+ новый ключ автоматически не создаётся. Свой `text` — 1–500 знаков
29
+ после удаления пробелов по краям; он имеет приоритет и не раскрывается как спинтакс.
30
+ Ограничение — раз в UTC-сутки
31
+ на номер; автоматической апелляции нет.
32
+
33
+ Ответ пакетных инструментов содержит `items` с отдельным исходом каждого номера:
34
+ `QUEUED` с `taskId`, `FAILED` с `code/message` или `SKIPPED` с причиной. `APPEAL_NOT_RESTRICTED`
35
+ и `APPEAL_DAILY_LIMIT` дают `SKIPPED`. Очередь не подтверждает проверку или отправку апелляции.
36
+ Для системного текста исход номера содержит `appealTemplateId`; текст в ответе не возвращается.
37
+ Квитанции не обрезаются. При неизвестном исходе сначала прочитай задачу или доступность
38
+ номеров (`besales_get_telegram_personal_capacity`); новый ключ автоматически не создавай.
39
+ Если taskId неизвестен, capacity показывает последний результат и время проверки, но не
40
+ доказывает исход именно твоего запроса.
41
+
42
+ Чтение задачи принимает `channel_id` и `task_id`, входит также в `readonly` и возвращает
43
+ `state` (`PENDING`, `RUNNING`, `SUCCEEDED`, `FAILED`), код/текст отказа и `restrictionStatus`.
44
+ Последнее поле — текущий статус номера, прочитанный после задачи, а не исторический снимок
45
+ её исхода. Более поздние действия могли его изменить. `null` означает, что статус номера
46
+ недоступен; `SUCCEEDED` само по себе не означает отсутствие ограничений.
47
+
48
+ Примеры с вымышленными UUID:
49
+
50
+ ```json
51
+ {
52
+ "name": "besales_platform_telegram_personal_restriction_check",
53
+ "arguments": {
54
+ "channel_id": "23000000-0000-4000-8000-000000000001",
55
+ "all": true,
56
+ "idempotency_key": "example-check-1"
57
+ }
58
+ }
59
+ ```
60
+
61
+ ```json
62
+ {
63
+ "name": "besales_platform_telegram_personal_restriction_appeal",
64
+ "arguments": {
65
+ "channel_id": "23000000-0000-4000-8000-000000000001",
66
+ "account_ids": ["24000000-0000-4000-8000-000000000001"],
67
+ "explicit_confirmation": true,
68
+ "idempotency_key": "example-appeal-1"
69
+ }
70
+ }
71
+ ```
72
+
73
+ ```json
74
+ {
75
+ "name": "besales_platform_telegram_personal_operational_task_get",
76
+ "arguments": {
77
+ "channel_id": "23000000-0000-4000-8000-000000000001",
78
+ "task_id": "25000000-0000-4000-8000-000000000001"
79
+ }
80
+ }
81
+ ```
82
+
83
+ Выкладка: сначала ядро с поддержкой ключа в теле и `restrictionStatus`, затем мост после
84
+ вливания в отгружаемую ветку. В тот же день выгрузи реестр маршрутов командой
85
+ `BESALES_SPECS_CONTRACTS_DIR=/путь/к/specs/contracts BESALES_API_CONTRACTS_DIR=/путь/к/besales-api/contracts yarn publish:mcp-registry`.
86
+ В ядре выполни `yarn contracts:mcp-routes:check` и `yarn contracts:mcp-routes:check-fresh`.
87
+ До вливания моста выгрузка не выполняется; `contracts/mcp-tool-routes.json` вручную не правится.
@@ -0,0 +1,19 @@
1
+ # Поведение личного Telegram при потере номера
2
+
3
+ Единственный инструмент — `besales_platform_telegram_personal_pool_policy`.
4
+ Он работает через канал ядра и требует `manage:channels`.
5
+
6
+ Для чтения передай `platform_id` и `operation:get`. Для смены сначала прочитай настройку,
7
+ согласуй её с человеком и передай `operation:set`, `rebind_policy:rebind|escalate` и
8
+ стабильный `idempotency_key` (1–200 видимых ASCII-символов).
9
+
10
+ `rebind` выбирает другой доступный номер для автоматического ответа. `escalate` передаёт
11
+ разговор оператору; оператор сможет ответить с другого доступного номера. Дожимы и
12
+ напоминания при обеих настройках могут уходить с другого номера. Ответ ядра содержит
13
+ локализованные варианты `options` и цену смены `consequence`; показывай их человеку.
14
+ После записи приходит `previousRebindPolicy` из квитанции фермы.
15
+
16
+ Чтение и запись объединены, поэтому инструмент объявлен изменяющим и входит в профиль
17
+ `platform`, а не `readonly`. Смена повторяется тем же ключом: другое значение с прежним
18
+ ключом отклоняется. При неизвестном исходе сначала проверь настройку; автоматически
19
+ выдавать новый ключ нельзя. Прямых вызовов фермы и записи в Telegram нет.
@@ -8,8 +8,8 @@
8
8
  - `write` — изменение состояния Besales, внешней CRM или локальной MCP-сессии;
9
9
  - `spend` — операция может отправить сообщение, вызвать модель, индексацию или потратить квоту.
10
10
 
11
- На 11 сентября 2026 года активный каталог из 231 инструмента содержит 96 `none`, 116 `write`
12
- и 19 `spend`. Эти числа проверяются по живым definitions, а не поддерживаются отдельным списком.
11
+ Числа по группам здесь не фиксируются: они дрейфуют с каждым инструментом. Актуальные считаются
12
+ по живым определениям (`toolDefinitions` из `src/tools/definitions.ts`), отдельного списка нет.
13
13
 
14
14
  HTTP-метод не является источником эффекта. Например, `besales_prompt_diff`,
15
15
  `besales_prompt_lint` и `besales_knowledge_qa_search` читают через POST. В то же время
@@ -22,22 +22,28 @@ HTTP-метод не является источником эффекта. На
22
22
  в четыре стандартные подсказки MCP:
23
23
 
24
24
  - `readOnlyHint=true` только для `sideEffect=none`;
25
- - `destructiveHint=false` для чтения и доказуемо обратимых записей;
26
- - `idempotentHint=true` только при безусловной идемпотентности с теми же аргументами;
27
- - `openWorldHint=false` только если операция гарантированно не выходит за Besales.
25
+ - `destructiveHint=false` для чтения и доказуемо обратимых записей (`reversible`), иначе `true`;
26
+ - `idempotentHint=true` только при безусловной идемпотентности с теми же аргументами
27
+ (`idempotent`);
28
+ - `openWorldHint=false` только если операция гарантированно не выходит за Besales
29
+ (`closedWorld`).
28
30
 
29
- Неизвестное свойство трактуется консервативно. Аннотации помогают хосту показать характер
30
- операции, но не заменяют API scopes, tenant/workspace проверки и обязательный
31
- `explicit_confirmation` у опасных действий.
31
+ Неизвестное свойство трактуется консервативно: умолчание — худший случай, а не «неизвестно».
32
+ Аннотации помогают хосту показать характер операции, но не заменяют API scopes, tenant/workspace
33
+ проверки и обязательный `explicit_confirmation` у опасных действий.
32
34
 
33
35
  `explicit_confirmation` является гейтом самого MCP и не передаётся в API DTO, если endpoint
34
36
  его не принимает. Опубликованная JSON Schema использует `const: true`, а runtime-схема —
35
- `z.literal(true)`: вызывающий видит ровно то условие, которое затем проверяется.
37
+ `z.literal(true)`: вызывающий видит ровно то условие, которое затем проверяется. Расхождение
38
+ двух объявлений ловит `src/tools/confirmation-contract.spec.ts`.
36
39
 
37
40
  Поле `Tool.title` строится из первой русской фразы локализованного описания, ограничено 80
38
41
  символами и передаётся через `tools/list`. Это подпись для интерфейса; стабильным API-ключом
39
42
  операции остаётся `name`.
40
43
 
44
+ Признак «ответ несёт данные клиентов» (`carriesCustomerData`) — отдельная ось, не эффект:
45
+ [customer-data.md](customer-data.md).
46
+
41
47
  ## Проверка
42
48
 
43
49
  `src/tools/annotations.spec.ts` требует эффект у каждого определения, полный набор четырёх