@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 @@
1
+ {"version":3,"file":"failed-verifications.js","sourceRoot":"","sources":["../../src/network/failed-verifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE/G,kFAAkF;AAClF,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,UAAU,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,wBAAwB,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,0BAA0B,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,WAAmB,IAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
@@ -0,0 +1,3 @@
1
+ import { type Server } from 'node:http';
2
+ /** Дополнительный тестовый адаптер: настоящие SDK и HTTP-обработчик без listen в песочнице. */
3
+ export declare function inProcessFetch(server: Server): typeof fetch;
@@ -0,0 +1,86 @@
1
+ import { IncomingMessage } from 'node:http';
2
+ import { Socket } from 'node:net';
3
+ import { Writable } from 'node:stream';
4
+ /** Дополнительный тестовый адаптер: настоящие SDK и HTTP-обработчик без listen в песочнице. */
5
+ export function inProcessFetch(server) {
6
+ return async (input, init) => {
7
+ const target = new Request(input, init);
8
+ const body = target.body ? Buffer.from(await target.arrayBuffer()) : undefined;
9
+ return new Promise((resolve, reject) => {
10
+ const incoming = new IncomingMessage(new Socket());
11
+ incoming.method = target.method;
12
+ incoming.url = new URL(target.url).pathname;
13
+ incoming.headers = Object.fromEntries(target.headers);
14
+ incoming.headers.host = new URL(target.url).host;
15
+ incoming.rawHeaders = Object.entries(incoming.headers).flatMap(([key, value]) => [key, String(value)]);
16
+ incoming.httpVersion = '1.1';
17
+ let controller;
18
+ let ended = false;
19
+ let published = false;
20
+ const stream = new ReadableStream({
21
+ start(value) { controller = value; },
22
+ cancel() { outgoing.destroy(); },
23
+ });
24
+ const headers = new Headers();
25
+ const publish = () => {
26
+ if (published)
27
+ return;
28
+ published = true;
29
+ resolve(new Response(outgoing.statusCode === 204 ? null : stream, {
30
+ status: outgoing.statusCode, headers,
31
+ }));
32
+ };
33
+ const outgoing = Object.assign(new Writable({
34
+ write(chunk, _encoding, callback) {
35
+ publish();
36
+ if (!ended)
37
+ controller.enqueue(new Uint8Array(chunk));
38
+ callback();
39
+ },
40
+ final(callback) {
41
+ publish();
42
+ if (!ended)
43
+ controller.close();
44
+ ended = true;
45
+ callback();
46
+ },
47
+ }), {
48
+ statusCode: 200,
49
+ headersSent: false,
50
+ setHeader(name, value) { headers.set(name, String(value)); },
51
+ getHeader(name) { return headers.get(name); },
52
+ writeHead(status, values) {
53
+ outgoing.statusCode = status;
54
+ for (const [name, value] of Object.entries(values ?? {}))
55
+ headers.set(name, String(value));
56
+ outgoing.headersSent = true;
57
+ publish();
58
+ return outgoing;
59
+ },
60
+ flushHeaders: publish,
61
+ });
62
+ const abort = () => {
63
+ outgoing.destroy();
64
+ if (!ended)
65
+ controller.error(new Error('HTTP test connection closed'));
66
+ ended = true;
67
+ if (!published)
68
+ reject(new Error('HTTP test connection closed'));
69
+ };
70
+ outgoing.on('error', reject);
71
+ outgoing.on('close', () => target.signal.removeEventListener('abort', abort));
72
+ target.signal.addEventListener('abort', abort, { once: true });
73
+ if (target.signal.aborted) {
74
+ abort();
75
+ return;
76
+ }
77
+ server.emit('request', incoming, outgoing);
78
+ if (body)
79
+ incoming.push(body);
80
+ // Настоящий HTTP-парсер отмечает полное тело до end; иначе destroy имитирует обрыв.
81
+ incoming.complete = true;
82
+ incoming.push(null);
83
+ });
84
+ };
85
+ }
86
+ //# sourceMappingURL=http-test-fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test-fixture.js","sourceRoot":"","sources":["../../src/network/http-test-fixture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Долгая память подтверждённых ключей: только SHA-256, без секрета и полномочий. */
2
+ export declare class KnownKeys {
3
+ private readonly entries;
4
+ get size(): number;
5
+ has(fingerprint: Buffer, now?: number): boolean;
6
+ remember(fingerprint: Buffer, now?: number): void;
7
+ forget(fingerprint: Buffer): void;
8
+ sweep(now?: number): void;
9
+ clear(): void;
10
+ }
@@ -0,0 +1,38 @@
1
+ import { KNOWN_KEY_TTL_MS, MAX_KNOWN_KEYS } from './constants.js';
2
+ /** Долгая память подтверждённых ключей: только SHA-256, без секрета и полномочий. */
3
+ export class KnownKeys {
4
+ entries = new Map();
5
+ get size() { return this.entries.size; }
6
+ has(fingerprint, now = Date.now()) {
7
+ const id = fingerprint.toString('hex');
8
+ const expiresAt = this.entries.get(id);
9
+ if (expiresAt === undefined)
10
+ return false;
11
+ if (now >= expiresAt) {
12
+ this.entries.delete(id);
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ remember(fingerprint, now = Date.now()) {
18
+ this.sweep(now);
19
+ const id = fingerprint.toString('hex');
20
+ // Только новая успешная проверка ядром продлевает срок и меняет порядок вытеснения.
21
+ this.entries.delete(id);
22
+ if (this.entries.size >= MAX_KNOWN_KEYS) {
23
+ const oldest = this.entries.keys().next().value;
24
+ if (oldest !== undefined)
25
+ this.entries.delete(oldest);
26
+ }
27
+ this.entries.set(id, now + KNOWN_KEY_TTL_MS);
28
+ }
29
+ forget(fingerprint) { this.entries.delete(fingerprint.toString('hex')); }
30
+ sweep(now = Date.now()) {
31
+ for (const [id, expiresAt] of this.entries) {
32
+ if (now >= expiresAt)
33
+ this.entries.delete(id);
34
+ }
35
+ }
36
+ clear() { this.entries.clear(); }
37
+ }
38
+ //# sourceMappingURL=known-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"known-keys.js","sourceRoot":"","sources":["../../src/network/known-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElE,qFAAqF;AACrF,MAAM,OAAO,SAAS;IACH,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,oFAAoF;QACpF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,WAAmB,IAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
@@ -0,0 +1,11 @@
1
+ import type { CredentialStore } from '../auth/token-storage.js';
2
+ /** Секреты существуют только до закрытия одного HTTP-запроса. */
3
+ export declare class MemoryCredentials implements CredentialStore {
4
+ private readonly values;
5
+ private closed;
6
+ set(account: string, value: string): Promise<void>;
7
+ get(account: string): Promise<string | null>;
8
+ delete(account: string): Promise<void>;
9
+ accounts(): Promise<string[]>;
10
+ clear(): void;
11
+ }
@@ -0,0 +1,24 @@
1
+ /** Секреты существуют только до закрытия одного HTTP-запроса. */
2
+ export class MemoryCredentials {
3
+ values = new Map();
4
+ closed = false;
5
+ async set(account, value) {
6
+ if (this.closed)
7
+ throw new Error('HTTP request is closed');
8
+ this.values.set(account, value);
9
+ }
10
+ async get(account) {
11
+ return this.values.get(account) ?? null;
12
+ }
13
+ async delete(account) {
14
+ this.values.delete(account);
15
+ }
16
+ async accounts() {
17
+ return [...this.values.keys()];
18
+ }
19
+ clear() {
20
+ this.closed = true;
21
+ this.values.clear();
22
+ }
23
+ }
24
+ //# sourceMappingURL=memory-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-credentials.js","sourceRoot":"","sources":["../../src/network/memory-credentials.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,OAAO,iBAAiB;IACX,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,GAAG,KAAK,CAAC;IAEvB,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,KAAa;QACtC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /** Общая арифметика ограниченных вёдер; параметры задаются только константами ниже. */
2
+ declare class TokenBuckets {
3
+ private readonly capacity;
4
+ private readonly refillMs;
5
+ private readonly maxBuckets;
6
+ private readonly buckets;
7
+ constructor(capacity: number, refillMs: number, maxBuckets: number);
8
+ get size(): number;
9
+ protected consumeId(id: string, now: number): number;
10
+ sweep(now?: number): void;
11
+ clear(): void;
12
+ }
13
+ /** Ведро хранит только SHA-256, никогда исходный ключ. */
14
+ export declare class KeyRateLimit extends TokenBuckets {
15
+ constructor();
16
+ consume(fingerprint: Buffer, now?: number): number;
17
+ }
18
+ /** Адрес живёт только в этой таблице; отсутствие заголовка объединяет клиентов в одно ведро. */
19
+ export declare class VerificationRateLimit extends TokenBuckets {
20
+ constructor();
21
+ consume(address: string | undefined, now?: number): number;
22
+ }
23
+ export {};
@@ -0,0 +1,62 @@
1
+ import { MAX_RATE_LIMIT_BUCKETS, MAX_CLIENT_ADDRESS_BUCKETS, MILLISECONDS_PER_SECOND, RATE_LIMIT_CAPACITY, RATE_LIMIT_REFILL_MS, VERIFICATION_ATTEMPT_CAPACITY, VERIFICATION_ATTEMPT_REFILL_MS, } from './constants.js';
2
+ /** Общая арифметика ограниченных вёдер; параметры задаются только константами ниже. */
3
+ class TokenBuckets {
4
+ capacity;
5
+ refillMs;
6
+ maxBuckets;
7
+ buckets = new Map();
8
+ constructor(capacity, refillMs, maxBuckets) {
9
+ this.capacity = capacity;
10
+ this.refillMs = refillMs;
11
+ this.maxBuckets = maxBuckets;
12
+ }
13
+ get size() { return this.buckets.size; }
14
+ consumeId(id, now) {
15
+ let bucket = this.buckets.get(id);
16
+ if (!bucket) {
17
+ if (this.buckets.size >= this.maxBuckets)
18
+ this.sweep(now);
19
+ if (this.buckets.size >= this.maxBuckets) {
20
+ return Math.ceil(this.refillMs / MILLISECONDS_PER_SECOND);
21
+ }
22
+ bucket = { tokens: this.capacity, updatedAt: now };
23
+ this.buckets.set(id, bucket);
24
+ }
25
+ bucket.tokens = Math.min(this.capacity, bucket.tokens + Math.max(0, now - bucket.updatedAt) / this.refillMs);
26
+ bucket.updatedAt = now;
27
+ if (bucket.tokens < 1) {
28
+ return Math.ceil((1 - bucket.tokens) * this.refillMs / MILLISECONDS_PER_SECOND);
29
+ }
30
+ bucket.tokens -= 1;
31
+ return 0;
32
+ }
33
+ sweep(now = Date.now()) {
34
+ for (const [id, bucket] of this.buckets) {
35
+ if (now - bucket.updatedAt >= this.capacity * this.refillMs) {
36
+ this.buckets.delete(id);
37
+ }
38
+ }
39
+ }
40
+ clear() {
41
+ this.buckets.clear();
42
+ }
43
+ }
44
+ /** Ведро хранит только SHA-256, никогда исходный ключ. */
45
+ export class KeyRateLimit extends TokenBuckets {
46
+ constructor() {
47
+ super(RATE_LIMIT_CAPACITY, RATE_LIMIT_REFILL_MS, MAX_RATE_LIMIT_BUCKETS);
48
+ }
49
+ consume(fingerprint, now = Date.now()) {
50
+ return super.consumeId(fingerprint.toString('hex'), now);
51
+ }
52
+ }
53
+ /** Адрес живёт только в этой таблице; отсутствие заголовка объединяет клиентов в одно ведро. */
54
+ export class VerificationRateLimit extends TokenBuckets {
55
+ constructor() {
56
+ super(VERIFICATION_ATTEMPT_CAPACITY, VERIFICATION_ATTEMPT_REFILL_MS, MAX_CLIENT_ADDRESS_BUCKETS);
57
+ }
58
+ consume(address, now = Date.now()) {
59
+ return super.consumeId(address || '', now);
60
+ }
61
+ }
62
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/network/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AAOxB,uFAAuF;AACvF,MAAM,YAAY;IAIG;IACA;IACA;IALF,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YACmB,QAAgB,EAChB,QAAgB,EAChB,UAAkB;QAFlB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;IAClC,CAAC;IAEJ,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtC,SAAS,CAAC,EAAU,EAAE,GAAW;QACzC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACtB,IAAI,CAAC,QAAQ,EACb,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,CACpE,CAAC;QACF,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C;QACE,KAAK,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC3C,OAAO,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,gGAAgG;AAChG,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IACrD;QACE,KAAK,CAAC,6BAA6B,EAAE,8BAA8B,EAAE,0BAA0B,CAAC,CAAC;IACnG,CAAC;IAED,OAAO,CAAC,OAA2B,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACnD,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /** Короткая память только подтверждённых API отказов 401/403; исходных ключей здесь нет. */
2
+ export declare class RejectedKeys {
3
+ private readonly entries;
4
+ get size(): number;
5
+ has(fingerprint: Buffer, now?: number): boolean;
6
+ remember(fingerprint: Buffer, now?: number): void;
7
+ sweep(now?: number): void;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,39 @@
1
+ import { MAX_REJECTED_KEYS, REJECTED_KEY_TTL_MS } from './constants.js';
2
+ /** Короткая память только подтверждённых API отказов 401/403; исходных ключей здесь нет. */
3
+ export class RejectedKeys {
4
+ entries = new Map();
5
+ get size() { return this.entries.size; }
6
+ has(fingerprint, now = Date.now()) {
7
+ const id = fingerprint.toString('hex');
8
+ const expiresAt = this.entries.get(id);
9
+ if (expiresAt === undefined)
10
+ return false;
11
+ if (now >= expiresAt) {
12
+ this.entries.delete(id);
13
+ return false;
14
+ }
15
+ return true;
16
+ }
17
+ remember(fingerprint, now = Date.now()) {
18
+ const id = fingerprint.toString('hex');
19
+ this.sweep(now);
20
+ // Порядок Map соответствует времени последнего подтверждённого отказа.
21
+ this.entries.delete(id);
22
+ if (this.entries.size >= MAX_REJECTED_KEYS) {
23
+ const oldest = this.entries.keys().next().value;
24
+ if (oldest !== undefined)
25
+ this.entries.delete(oldest);
26
+ }
27
+ this.entries.set(id, now + REJECTED_KEY_TTL_MS);
28
+ }
29
+ sweep(now = Date.now()) {
30
+ for (const [id, expiresAt] of this.entries) {
31
+ if (now >= expiresAt)
32
+ this.entries.delete(id);
33
+ }
34
+ }
35
+ clear() {
36
+ this.entries.clear();
37
+ }
38
+ }
39
+ //# sourceMappingURL=rejected-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejected-keys.js","sourceRoot":"","sources":["../../src/network/rejected-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAExE,4FAA4F;AAC5F,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,uEAAuE;QACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { ToolApiClient } from '../http/api-client.js';
2
+ /** Работа запроса переживает закрытие транспорта, включая последовательные обращения инструмента. */
3
+ export declare class RequestWork {
4
+ private readonly pending;
5
+ track<T>(promise: Promise<T>): Promise<T>;
6
+ client(apiClient: ToolApiClient): ToolApiClient;
7
+ drain(): Promise<void>;
8
+ }
@@ -0,0 +1,20 @@
1
+ /** Работа запроса переживает закрытие транспорта, включая последовательные обращения инструмента. */
2
+ export class RequestWork {
3
+ pending = new Set();
4
+ track(promise) {
5
+ this.pending.add(promise);
6
+ void promise.finally(() => { this.pending.delete(promise); }).catch(() => { });
7
+ return promise;
8
+ }
9
+ client(apiClient) {
10
+ return {
11
+ request: (...args) => this.track(apiClient.request(...args)),
12
+ post: (...args) => this.track(apiClient.post(...args)),
13
+ };
14
+ }
15
+ async drain() {
16
+ while (this.pending.size > 0)
17
+ await Promise.allSettled([...this.pending]);
18
+ }
19
+ }
20
+ //# sourceMappingURL=request-work.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-work.js","sourceRoot":"","sources":["../../src/network/request-work.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,MAAM,OAAO,WAAW;IACL,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEvD,KAAK,CAAI,OAAmB;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,SAAwB;QAC7B,OAAO;YACL,OAAO,EAAE,CAAI,GAAG,IAA0C,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAI,GAAG,IAAI,CAAC,CAAC;YACxG,IAAI,EAAE,CAAI,GAAG,IAAuC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAI,GAAG,IAAI,CAAC,CAAC;SAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export interface WorkspaceContext {
2
+ readonly workspace_id: string;
3
+ readonly workspace_name: string;
4
+ readonly account_label: string | null;
5
+ readonly scopes: readonly string[];
6
+ }
7
+ /** Кэш только успешных вердиктов: SHA-256 и контекст области, без исходного ключа. */
8
+ export declare class SuccessfulKeys {
9
+ private readonly ttlMs;
10
+ private readonly entries;
11
+ constructor(ttlMs?: number);
12
+ get size(): number;
13
+ get(fingerprint: Buffer, now?: number): WorkspaceContext | undefined;
14
+ remember(fingerprint: Buffer, context: WorkspaceContext, now?: number): void;
15
+ sweep(now?: number): void;
16
+ clear(): void;
17
+ }
@@ -0,0 +1,47 @@
1
+ import { MAX_SUCCESSFUL_KEYS, SUCCESSFUL_KEY_TTL_MS } from './constants.js';
2
+ /** Кэш только успешных вердиктов: SHA-256 и контекст области, без исходного ключа. */
3
+ export class SuccessfulKeys {
4
+ ttlMs;
5
+ entries = new Map();
6
+ constructor(ttlMs = SUCCESSFUL_KEY_TTL_MS) {
7
+ this.ttlMs = ttlMs;
8
+ }
9
+ get size() { return this.entries.size; }
10
+ get(fingerprint, now = Date.now()) {
11
+ const id = fingerprint.toString('hex');
12
+ const entry = this.entries.get(id);
13
+ if (!entry)
14
+ return undefined;
15
+ if (now >= entry.expiresAt) {
16
+ this.entries.delete(id);
17
+ return undefined;
18
+ }
19
+ return entry.context;
20
+ }
21
+ remember(fingerprint, context, now = Date.now()) {
22
+ // Несколько ожидавших один вердикт не продлевают его TTL.
23
+ if (this.get(fingerprint, now))
24
+ return;
25
+ this.sweep(now);
26
+ if (this.entries.size >= MAX_SUCCESSFUL_KEYS) {
27
+ const oldest = this.entries.keys().next().value;
28
+ if (oldest !== undefined)
29
+ this.entries.delete(oldest);
30
+ }
31
+ this.entries.set(fingerprint.toString('hex'), {
32
+ context: {
33
+ workspace_id: context.workspace_id, workspace_name: context.workspace_name,
34
+ account_label: context.account_label, scopes: [...context.scopes],
35
+ },
36
+ expiresAt: now + this.ttlMs,
37
+ });
38
+ }
39
+ sweep(now = Date.now()) {
40
+ for (const [id, entry] of this.entries) {
41
+ if (now >= entry.expiresAt)
42
+ this.entries.delete(id);
43
+ }
44
+ }
45
+ clear() { this.entries.clear(); }
46
+ }
47
+ //# sourceMappingURL=successful-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"successful-keys.js","sourceRoot":"","sources":["../../src/network/successful-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAS5E,sFAAsF;AACtF,MAAM,OAAO,cAAc;IAGI;IAFZ,OAAO,GAAG,IAAI,GAAG,EAA4D,CAAC;IAE/F,YAA6B,QAAQ,qBAAqB;QAA7B,UAAK,GAAL,KAAK,CAAwB;IAAG,CAAC;IAE9D,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,OAAyB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvE,0DAA0D;QAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC5C,OAAO,EAAE;gBACP,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;gBAC1E,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;aAClE;YACD,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
@@ -14,7 +14,9 @@ Claude должен соблюдать invariants:
14
14
  - Не менять `operationId` между get и submit.
15
15
  - Выполнять все stages в заданном порядке.
16
16
  - Возвращать JSON в форме, которую запросил backend.
17
- - При 410 expired начинать заново с matching `*_get_instructions`.
17
+ - При отказе приёма сначала проверить известную промптовую операцию. Завершённая операция с тем же телом возвращает сохранённый успех; новый платный запуск не нужен.
18
+ - При неизвестном исходе прежняя работа могла быть оплачена без сохранённого результата. Мост проверяет известную промптовую операцию сам. Сообщи человеку об отдельной оплате нового запуска и получи его решение перед запуском.
19
+ - Предупреждение об оплате в 410 относится к платным операциям и их submit-инструментам. Истёкшая ссылка, настроечный токен или предварительный просмотр получают нейтральную подсказку получить новое значение через соответствующий инструмент.
18
20
  - Не отправлять raw secrets, API keys или Authorization headers в submit body.
19
21
 
20
22
  Связанные external pairs включают prompt generation, prompt iterate, prompt analyze, ICP analysis, sandbox findings, simulation findings и Q&A generation.
@@ -6,6 +6,8 @@
6
6
 
7
7
  ## Инструменты
8
8
 
9
+ - `besales_feedback_document_access_get` — email до привязки, режим всего документа, все связи и свежая оценка прав Google.
10
+ - `besales_feedback_document_access_update` — подтверждённая смена общего режима существующего документа.
9
11
  - `besales_feedback_sheet_link` — привязать таблицу к промпту агента по ссылке.
10
12
  - `besales_feedback_sheet_list` — список таблиц, привязанных к агенту.
11
13
  - `besales_feedback_sheet_read` — прочитать строки замечаний.
@@ -19,12 +21,18 @@
19
21
  с `agent_id` нужного агента и `source_url`. Один файл можно привязать к нескольким промптам:
20
22
  повторный вызов с другим `agent_id` создаёт ещё одну привязку, дубликата файла не возникает.
21
23
 
22
- В ответе придёт `serviceAccountEmail` — попроси пользователя расшарить таблицу на этот email
24
+ Email также приходит в list/read и безопасных отказах read. До привязки вызовите document-access-get. В ответе придёт `serviceAccountEmail` — попросите пользователя расшарить таблицу на этот email
23
25
  (Viewer достаточно для чтения). Без расшаривания чтение вернёт ошибку доступа.
24
26
 
25
27
  Поддерживаются только нативные Google Sheets. Ссылка на `.xlsx`/`.csv` в Google Drive вернёт
26
28
  ошибку — попроси пользователя открыть файл как Google Sheet.
27
29
 
30
+ ## Общий режим и подтверждение
31
+
32
+ Режим действует на весь документ, включая другие вкладки и агентов этой рабочей области. Без access_mode новая связь наследует текущий режим, первый документ начинает с READ_ONLY.
33
+ Перед изменением вызовите besales_feedback_document_access_get и покажите весь affectedLinks с affectedLinksCount: агент, вкладка, закреплённая версия. Только после явного согласия человека передайте confirm_document_access_change=true и expected_document_snapshot из этого ответа. Не подставляйте согласие автоматически. При 409 с устаревшим снимком перечитайте полный список и снова получите согласие. Google ACL инструмент не меняет.
34
+ Повтор link существующей пары даёт 409 с currentLink. Сохраните эту связь и версию; не делайте unlink/link автоматически. Для режима существующего документа используйте отдельный document-access-update.
35
+
28
36
  ## Когда читать
29
37
 
30
38
  Перед тем как улучшать промпт по замечаниям тестировщиков, вызови
@@ -35,21 +43,22 @@
35
43
 
36
44
  ## Режимы — различай по `accessMode`
37
45
 
38
- **`READ_ONLY`** — у тебя нет прав на запись в файл. Воркфлоу:
46
+ **`READ_ONLY`** — приложение запрещает запись независимо от роли Google. Воркфлоу:
39
47
  1. `besales_feedback_sheet_read` → проанализируй замечания, сгруппируй по смыслу.
40
- 2. Сформулируй конкретные правки промпта.
41
- 3. `besales_prompt_patch_start` → создай черновик и прочитай текущий промпт целиком через
42
- `besales_prompt_patch_get`.
43
- 4. Собери точечные patch-операции и примени их через `besales_prompt_patch_apply`.
44
- Проверь `appliedCount`, `skippedCount` и diff; при необходимости перечитай черновик.
45
- 5. Покажи пользователю итоговые изменения. **После явного подтверждения пользователя** вызови
46
- `besales_prompt_patch_commit`. Если подтверждения нет, черновик можно удалить через
48
+ 2. `besales_prompt_patch_start` → `besales_prompt_patch_get`: открой черновик и прочитай его
49
+ целиком, чтобы менять существующие правила по месту, без дублирующих секций.
50
+ 3. Сформулируй конкретные операции и примени их через `besales_prompt_patch_apply`.
51
+ Проверь `appliedCount`, `skippedCount` и diff; пропущенные операции не считай выполненными.
52
+ 4. Покажи пользователю итоговый черновик и **дождись явного подтверждения**.
53
+ 5. После подтверждения вызови `besales_prompt_patch_commit`; он запускает полный PromptLint и
54
+ либо публикует новую версию, либо возвращает ошибки без частичного коммита.
55
+ Если пользователь не согласовал публикацию, черновик можно удалить через
47
56
  `besales_prompt_patch_discard`.
48
57
 
49
58
  Никогда не финализируй промпт без явного согласия пользователя. В файл при `READ_ONLY`
50
- ничего не пиши — доступа нет.
59
+ ничего не пиши — локальный режим запрещает запись.
51
60
 
52
- **`EDITABLE`** — у тебя есть права на запись. Воркфлоу тот же по части правки промпта, плюс
61
+ **`EDITABLE`** — приложение допускает запись, если её разрешает Google. Свежий отказ Sheets остаётся отказом, даже при providerAccess.canEdit=true (например, защищённый диапазон). Patch flow тот же, плюс
53
62
  после обработки замечаний отметь их статус прямо в таблице через
54
63
  `besales_feedback_sheet_row_update`:
55
64
 
@@ -72,7 +81,7 @@ read-only режиме: читай замечания и предлагай пр
72
81
  - Не меняй ячейки с исходными замечаниями тестировщиков — пиши только в служебные колонки
73
82
  статуса/комментария.
74
83
  - Если `besales_feedback_sheet_read` вернул ошибку доступа — таблица не расшарена на service
75
- account. Сообщи пользователю email из ответа `link` и попроси выдать доступ.
84
+ account. Сообщите пользователю serviceAccountEmail из ответа чтения и попросите выдать доступ.
76
85
 
77
86
  ## Отвязка
78
87
 
@@ -2,7 +2,9 @@
2
2
 
3
3
  ICP (Ideal Customer Profile) в Besales описывает не абстрактную аудиторию для рассылок, а рабочую модель покупателя, по которой строятся промпты, сценарии проверки и sandbox-симуляции. ICP объединяет сегменты, personas, реальные или импортированные dialogue samples и test scenarios. Он помогает агенту отвечать не "для всех", а под конкретные боли, критерии выбора, возражения и стиль коммуникации целевого клиента.
4
4
 
5
- В v1.5 ICP хранится в новых таблицах `icp_profiles`, `icp_segments`, `icp_dialogue_samples`, `personas`, `test_scenarios` и связывается с агентами через `agent_icp_links`. Эти таблицы создаются сразу в v2-shape, поэтому MCP tools работают с будущей моделью данных без прямого доступа к существующим v1 сущностям.
5
+ ICP хранится в `icp_profiles`, `icp_segments`, `icp_dialogue_samples`, `personas` и
6
+ `test_scenarios`, а с агентами связывается через `agent_icp_links`. MCP работает только с этой
7
+ канонической моделью и не обращается к старым сущностям напрямую.
6
8
 
7
9
  Когда Claude создаёт ICP через MCP, он должен сначала определить workspace context и выбрать источник: ручное описание, CRM dialogues или AI-generated draft. Для CRM-источника используется импорт samples с анонимизацией и подтверждением GDPR. После накопления samples Claude может запросить analysis instructions, локально выполнить stage-пайплайн сегментации/persona generation и отправить результат через submit tool.
8
10
 
@@ -10,7 +12,12 @@ ICP (Ideal Customer Profile) в Besales описывает не абстракт
10
12
 
11
13
  - `besales_icp_create` — создать ICP-профиль.
12
14
  - `besales_icp_import_dialogues` — импортировать и анонимизировать CRM-диалоги.
15
+ - `besales_icp_import_status` и `besales_icp_import_history` — прочитать статус и историю импорта, включая `continuationState` и `remainderExpiredAt`, если сервер их прислал.
13
16
  - `besales_icp_analysis_get_instructions` — получить stages для анализа ICP.
14
17
  - `besales_icp_analysis_submit` — сохранить сегменты, personas и сценарии после external execution.
15
18
 
16
19
  Практическое правило: если пользователь просит "создай ICP для SaaS B2B", Claude должен создать профиль, затем уточнить или импортировать samples, после чего выполнить analysis pair. ICP не заменяет prompt generation, а даёт ей качественный контекст.
20
+
21
+ Продолжение импорта: `AVAILABLE` — сохранённый остаток доступен; `FORWARDED` — уже создан следующий прогон; `EXPIRED` — остаток устарел; `NONE` — продолжения нет. `remainderExpiredAt` — момент удаления старого остатка уборкой; `null` означает, что уборка ещё не удаляла строки, и само по себе не доказывает доступность продолжения. Старые ответы без этих полей остаются допустимыми.
22
+
23
+ Отказ `409 ICP_INGEST_CONTINUATION_EXPIRED` означает: остаток выборки устарел — начните новый импорт. Продолжение автоматически не повторять. Новый импорт запускается по решению человека с новым `request_key` и явным `gdpr_confirmed=true`.
@@ -2,7 +2,10 @@
2
2
 
3
3
  Sandbox в Besales — это контролируемый прогон агента по ICP personas и test scenarios до выката изменений в production. Цель sandbox не в том, чтобы отправить реальные сообщения клиентам, а в том, чтобы проверить промпт, routing, ответы на возражения, handoff-поведение и качество реакции на разные сегменты.
4
4
 
5
- В v1.5 sandbox реализуется как отдельный домен с `sandbox_runs` и `sandbox_run_feedbacks`. Запуск создаёт run для агента и набора сценариев, а дальнейший анализ findings может выполняться через external execution pair. Production runtime остаётся authoritative через `AgentChat.baseSystemPrompt`, но sandbox позволяет безопасно оценить draft или updated prompt до approve/finalize.
5
+ Sandbox хранит прогоны в `sandbox_runs` и обратную связь в `sandbox_run_feedbacks`. Запуск создаёт
6
+ run для агента и набора сценариев, а дальнейший анализ findings может выполняться через external
7
+ execution pair. Источник production-инструкции — опубликованная запись `agent_versions`; sandbox
8
+ позволяет безопасно оценить черновик или новую версию до публикации.
6
9
 
7
10
  Для Claude важна последовательность:
8
11
 
@@ -27,13 +30,19 @@ Sandbox в Besales — это контролируемый прогон аген
27
30
 
28
31
  Один прогон = один режим. «Прогнать оба режима» = два вызова `besales_sandbox_run_start`.
29
32
 
30
- Выбирай режим по цели. Для детерминированной регрессии используй `scripted` по умолчанию;
31
- для исследования поведения персоны — `simulated`; для широкой проверки можно предложить оба.
32
- Уточнение обязательно только когда цель не позволяет выбрать безопасно или стоимость/охват
33
- заметно различаются. Обычный regression-прогон не нужно останавливать лишним вопросом.
33
+ Без вопроса запускай обычный прогон: `mode=single_agent` и `client_mode=scripted` (умолчания
34
+ схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до
35
+ публикации (`candidate_prompt`). Перед запуском спроси пользователя одним коротким вопросом
36
+ с ценой в одну фразу только если нужен:
37
+
38
+ - `client_mode=simulated` (LLM играет клиента — дороже и каждый раз по-разному);
39
+ - оба режима клиента (= два прогона);
40
+ - `mode=workflow` (все агенты канала через роутер — шире и дороже).
34
41
 
35
42
  В findings: если симулированный клиент ушёл с `outcome: refused` или `endReason: gave_up` — это не автоматически провал агента; оценивай по тексту диалога.
36
43
 
37
- Sandbox не должен обращаться к реальным channel adapters и не должен создавать внешние side effects. Если сценарий требует проверки CRM или отправки сообщений, backend должен использовать sandbox adapters/ports или mock behavior.
44
+ Sandbox проходит те же runtime-швы и ActionGovernor, что production, но после governor действует
45
+ белый список допустимых шагов и подавление внешней доставки. Проверка CRM или отправки не должна
46
+ создавать реальных внешних side effects.
38
47
 
39
48
  Практическое правило: sandbox — это безопасная проверка качества агента. Claude должен использовать его перед финализацией рискованных prompt changes, особенно если ICP содержит несколько сегментов или есть новые handoff/routing правила.