@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,108 @@
1
+ #!/usr/bin/env node
2
+ // Выполняет поставщик на целевой ОС/архитектуре, после immutable install.
3
+ import {
4
+ cpSync,
5
+ existsSync,
6
+ mkdirSync,
7
+ readFileSync,
8
+ readdirSync,
9
+ renameSync,
10
+ rmSync,
11
+ writeFileSync,
12
+ } from 'node:fs';
13
+ import { resolve, join } from 'node:path';
14
+ import { execFileSync } from 'node:child_process';
15
+ const [rawBase, output] = process.argv.slice(2);
16
+ if (!rawBase || !output) throw new Error('Customer API URL and new output directory required');
17
+ const base = new URL(rawBase);
18
+ if (
19
+ base.protocol !== 'https:' ||
20
+ base.username ||
21
+ base.password ||
22
+ base.search ||
23
+ base.hash ||
24
+ base.pathname.replace(/\/+$/u, '') !== '/api/v2'
25
+ )
26
+ throw new Error(
27
+ 'Usage: node scripts/build-onprem.mjs https://customer.example/api/v2 NEW_OUTPUT_DIRECTORY',
28
+ );
29
+ base.pathname = '/api/v2';
30
+ const destination = resolve(output);
31
+ if (existsSync(destination)) throw new Error('Output directory already exists');
32
+ execFileSync('yarn', ['build'], { stdio: 'inherit' });
33
+ mkdirSync(destination, { recursive: true, mode: 0o700 });
34
+ cpSync('dist', join(destination, 'dist'), { recursive: true });
35
+ mkdirSync(join(destination, 'bin'));
36
+ cpSync('bin/besales-onprem.mjs', join(destination, 'bin/besales-onprem.mjs'));
37
+ cpSync('README.onprem.ru.md', join(destination, 'README.onprem.ru.md'));
38
+ const sourcePackage = JSON.parse(readFileSync('package.json', 'utf8'));
39
+ writeFileSync(
40
+ join(destination, 'package.json'),
41
+ JSON.stringify(
42
+ {
43
+ name: sourcePackage.name,
44
+ version: sourcePackage.version,
45
+ type: 'module',
46
+ bin: { 'besales-mcp': './bin/besales-onprem.mjs' },
47
+ },
48
+ null,
49
+ 2,
50
+ ),
51
+ );
52
+ writeFileSync(
53
+ join(destination, 'onprem.json'),
54
+ JSON.stringify(
55
+ { apiBaseUrl: base.href, oauthAuthorizeUrl: `${base.href}/auth/mcp-connect/start` },
56
+ null,
57
+ 2,
58
+ ),
59
+ { mode: 0o600 },
60
+ );
61
+ // Только runtime dependencies. Список берётся из установленного графа Yarn, без второго сетевого install.
62
+ execFileSync('yarn', ['workspaces', 'focus', '--production'], {
63
+ cwd: process.cwd(),
64
+ stdio: 'inherit',
65
+ });
66
+ cpSync('node_modules', join(destination, 'node_modules'), { recursive: true });
67
+ function clean(dir) {
68
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
69
+ const file = join(dir, entry.name);
70
+ if (
71
+ /\.(?:[cm]?ts|tsx|map|c|cc|cpp|h|hpp)$/iu.test(entry.name) ||
72
+ ['test', 'tests', '__tests__', '.cache', '.yarn-state.yml'].includes(entry.name)
73
+ )
74
+ rmSync(file, { recursive: true, force: true });
75
+ else if (entry.isDirectory()) {
76
+ if (entry.name === 'src') {
77
+ const runtime = join(dir, 'onprem_runtime');
78
+ renameSync(file, runtime);
79
+ clean(runtime);
80
+ } else clean(file);
81
+ }
82
+ }
83
+ }
84
+ function rewrite(dir) {
85
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
86
+ const file = join(dir, entry.name);
87
+ if (entry.isDirectory()) rewrite(file);
88
+ else if (entry.isFile() && /\.(?:[cm]?js|json)$/u.test(entry.name)) {
89
+ const text = readFileSync(file, 'utf8')
90
+ .replace(/^\s*\/\/[#@]\s*sourceMappingURL=.*$/gmu, '')
91
+ .replace(/\/\*[#@]\s*sourceMappingURL=[^*]*\*\//gu, '');
92
+ writeFileSync(
93
+ file,
94
+ text
95
+ .replace(/(^|[./])src(?=\/|["'`]|$)/gmu, '$1onprem_runtime')
96
+ .replace(/(["'`])src\//gu, '$1onprem_runtime/'),
97
+ );
98
+ }
99
+ }
100
+ }
101
+ clean(destination);
102
+ rewrite(destination);
103
+ execFileSync(process.execPath, [join(destination, 'bin/besales-onprem.mjs'), '--help'], {
104
+ stdio: 'inherit',
105
+ });
106
+ console.log(
107
+ `On-prem MCP ready: ${process.platform}/${process.arch}; archive the output directory (no build tools or source files).`,
108
+ );
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env bash
2
+ # Запускай своим пользователем: секреты идут только в настройки клиентов и закрытый файл.
3
+ set -euo pipefail
4
+
5
+ parse_connections() {
6
+ # Данные читаются только из stdin: ни имя, ни UUID не становятся кодом или опцией Node.
7
+ node -e '
8
+ const MAX_NAME_LENGTH = 200;
9
+ const MAX_SLUG_LENGTH = 64;
10
+ const UUID_PREFIX_LENGTH = 8;
11
+ const letters = {а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"e",ж:"zh",з:"z",и:"i",й:"y",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"h",ц:"ts",ч:"ch",ш:"sh",щ:"sch",ъ:"",ы:"y",ь:"",э:"e",ю:"yu",я:"ya"};
12
+ try {
13
+ const connections = JSON.parse(require("node:fs").readFileSync(0, "utf8"));
14
+ if (!Array.isArray(connections)) throw new Error();
15
+ const seen = new Set();
16
+ const lines = connections.map(connection => {
17
+ const id = connection?.workspaceId;
18
+ const name = connection?.workspaceName;
19
+ if (typeof id !== "string" || !/^[0-9a-f-]{36}$/.test(id) || seen.has(id) ||
20
+ (name != null && typeof name !== "string")) throw new Error();
21
+ seen.add(id);
22
+ const clean = (name ?? "").replace(/[\u0000-\u001f\u007f]/g, " ").slice(0, MAX_NAME_LENGTH);
23
+ const slug = [...clean.toLowerCase()].map(c => letters[c] ?? c).join("")
24
+ .normalize("NFKD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+/g, "-")
25
+ .slice(0, MAX_SLUG_LENGTH).replace(/^-|-$/g, "") || id.slice(0, UUID_PREFIX_LENGTH);
26
+ return id + "\tbesales-" + slug;
27
+ });
28
+ if (lines.length) process.stdout.write(lines.join("\n") + "\n");
29
+ } catch { process.exitCode = 1; }
30
+ ' --
31
+ }
32
+
33
+ main() (
34
+ local url=${BESALES_MCP_URL:-https://mcp.besales.ai/mcp}
35
+ local bridge_text=${BESALES_MCP_BRIDGE:-npx -y @besales/mcp@beta}
36
+ local bridge=()
37
+ # Это список аргументов, разделённых пробелами, без исполнения shell-кода.
38
+ read -r -a bridge <<< "$bridge_text"
39
+ local have_claude=false have_codex=false
40
+ if command -v claude >/dev/null 2>&1; then have_claude=true
41
+ else printf '%s\n' 'Claude Code отсутствует в PATH: пропускаю этот клиент.'; fi
42
+ if command -v codex >/dev/null 2>&1; then have_codex=true
43
+ else printf '%s\n' 'Codex CLI отсутствует в PATH: пропускаю этот клиент.'; fi
44
+ if [[ $have_claude == false && $have_codex == false ]]; then return 0; fi
45
+
46
+ local connections parsed id base entry key var selected arg index other count
47
+ connections=$("${bridge[@]}" connections --json 2>/dev/null) || {
48
+ printf '%s\n' 'Не удалось прочитать подключения. Выполни connect и повтори запуск.' >&2; return 1;
49
+ }
50
+ parsed=$(printf '%s' "$connections" | parse_connections) || {
51
+ printf '%s\n' 'Неверный JSON подключений. Обнови мост и повтори запуск.' >&2; return 1;
52
+ }
53
+ local ids=() bases=() entries=() matched=()
54
+ while IFS=$'\t' read -r id base; do
55
+ [[ -n $id ]] || continue
56
+ ids+=("$id"); bases+=("$base")
57
+ done <<< "$parsed"
58
+ count=${#ids[@]}
59
+ if [[ $count -eq 0 ]]; then printf '%s\n' 'Нет подключённых областей. Сначала выполни connect.'; return 0; fi
60
+ for ((index=0; index<count; index++)); do
61
+ base=${bases[$index]}; entry=$base
62
+ for ((other=0; other<count; other++)); do
63
+ if [[ $other -ne $index && ${bases[$other]} == "$base" ]]; then entry="$base-${ids[$index]:0:4}"; break; fi
64
+ done
65
+ entries+=("$entry")
66
+ done
67
+ # Редкое совпадение четырёх символов UUID тоже не должно перезаписать чужое подключение.
68
+ for ((index=0; index<count; index++)); do
69
+ for ((other=0; other<count; other++)); do
70
+ if [[ $other -ne $index && ${entries[$other]} == "${entries[$index]}" ]]; then
71
+ entries[$index]="${bases[$index]}-${ids[$index]}"
72
+ entries[$other]="${bases[$other]}-${ids[$other]}"
73
+ fi
74
+ done
75
+ done
76
+ for arg in "$@"; do matched+=(false); done
77
+
78
+ umask 077
79
+ local secrets_dir="$HOME/.besales-secrets" keys_file="$HOME/.besales-secrets/mcp-remote-keys.env"
80
+ mkdir -p "$secrets_dir"
81
+ chmod 700 "$secrets_dir"
82
+ local temporary
83
+ temporary=$(mktemp "$secrets_dir/.mcp-keys.XXXXXX")
84
+ # EXIT сохраняет прежний файл, если настройка клиента завершилась ошибкой.
85
+ trap 'rm -f -- "$temporary" "$temporary.next"' EXIT
86
+ local header='# Ключи онлайн-MCP Besales для Codex CLI.'
87
+ if [[ -f $keys_file ]]; then
88
+ # Сохраняем посторонние строки при полном и выборочном запуске, не исполняя файл.
89
+ awk -v header="$header" '{ print; if ($0 == header) found=1 } END { if (!found) print header }' "$keys_file" > "$temporary"
90
+ else printf '%s\n' "$header" > "$temporary"; fi
91
+
92
+ local connected=0 arg_index
93
+ for ((index=0; index<count; index++)); do
94
+ entry=${entries[$index]}; id=${ids[$index]}; selected=false; arg_index=0
95
+ if [[ $# -eq 0 ]]; then selected=true; fi
96
+ for arg in "$@"; do
97
+ if [[ $entry == "$arg" || $id == "$arg"* ]]; then selected=true; matched[$arg_index]=true; fi
98
+ arg_index=$((arg_index + 1))
99
+ done
100
+ [[ $selected == true ]] || continue
101
+ key=$("${bridge[@]}" key "$id" 2>/dev/null) || {
102
+ printf '[%s] пропуск: ключ не получен, повтори connect.\n' "$entry"; continue;
103
+ }
104
+ if [[ ! $key =~ ^mcp_[A-Za-z0-9_-]+$ ]]; then
105
+ printf '[%s] пропуск: неверный формат ключа, повтори connect.\n' "$entry"; continue
106
+ fi
107
+ var="BESALES_MCP_KEY_$(printf '%s' "$entry" | tr 'a-z-' 'A-Z_')"
108
+ if [[ $have_claude == true ]]; then
109
+ claude mcp remove --scope user "$entry" >/dev/null 2>&1 || true
110
+ claude mcp add --scope user --transport http "$entry" "$url" --header "Authorization: Bearer $key" >/dev/null 2>&1 || {
111
+ printf '[%s] ошибка настройки Claude Code.\n' "$entry" >&2; return 1;
112
+ }
113
+ printf '[%s] Claude Code подключён.\n' "$entry"
114
+ fi
115
+ if [[ $have_codex == true ]]; then
116
+ codex mcp remove "$entry" >/dev/null 2>&1 || true
117
+ codex mcp add "$entry" --url "$url" --bearer-token-env-var "$var" >/dev/null 2>&1 || {
118
+ printf '[%s] ошибка настройки Codex CLI.\n' "$entry" >&2; return 1;
119
+ }
120
+ printf '[%s] Codex CLI подключён.\n' "$entry"
121
+ fi
122
+ awk -v variable="$var" '$0 !~ "^export " variable "="' "$temporary" > "$temporary.next"
123
+ mv "$temporary.next" "$temporary"
124
+ printf 'export %s="%s"\n' "$var" "$key" >> "$temporary"
125
+ key=''; connected=$((connected + 1))
126
+ done
127
+ arg_index=0
128
+ for arg in "$@"; do
129
+ if [[ ${matched[$arg_index]} == false ]]; then printf 'Не найдено подключение: %s\n' "$arg" >&2; fi
130
+ arg_index=$((arg_index + 1))
131
+ done
132
+ chmod 600 "$temporary"
133
+ mv "$temporary" "$keys_file"
134
+ trap - EXIT
135
+ printf 'Подключено областей: %s\n' "$connected"
136
+ printf 'Для Codex добавь в ~/.zshrc (или ~/.bashrc) строку: source %q\n' "$keys_file"
137
+ printf '%s\n' 'Затем выполни source в текущем терминале и запускай Codex из него.'
138
+ printf '%s\n' 'Проверка: claude mcp list | codex mcp list'
139
+ )
140
+
141
+ if [[ ${BASH_SOURCE[0]} == "$0" ]]; then main "$@"; fi
@@ -0,0 +1,166 @@
1
+ // Права, которые отгруженный клиент реально запрашивает при подключении: значение, уходящее в параметр `scope`
2
+ // адреса страницы согласия.
3
+ //
4
+ // ⛔ Извлекается РАЗБОРОМ СИНТАКСИЧЕСКОГО ДЕРЕВА, а не поиском текста. Сервер обязан принять каждое право, которое
5
+ // отгруженный клиент шлёт, — иначе подключение ломается у всех, кто обновил пакет. Поиск строки по шаблону молча
6
+ // пропустил бы новую форму объявления (спред, импорт, вычисление) и отдал бы серверу устаревший набор. Поэтому
7
+ // поддержаны ровно формы, встречавшиеся в пакете, а любая другая — отказ выгрузки с названием формы.
8
+ import ts from 'typescript';
9
+
10
+ /**
11
+ * @param {string} source текст `src/auth/oauth-client.ts`
12
+ * @returns {string[]} права в порядке объявления
13
+ */
14
+ export function extractConnectScopes(source) {
15
+ const file = ts.createSourceFile('oauth-client.ts', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
16
+ const scopeArgument = singleScopeArgument(file);
17
+ const scopes = resolveScopes(file, scopeArgument, new Set());
18
+ if (scopes.length === 0) {
19
+ throw new Error('Набор прав подключения пуст: выгрузка без прав сделала бы проверку сервера пустой');
20
+ }
21
+ const duplicates = scopes.filter((scope, index) => scopes.indexOf(scope) !== index);
22
+ if (duplicates.length > 0) {
23
+ throw new Error(`Право подключения объявлено дважды: ${duplicates.join(', ')}`);
24
+ }
25
+ return scopes;
26
+ }
27
+
28
+ /** Ровно один вызов `<что-то>.set('scope', X)`: второй сделал бы выбор неоднозначным. */
29
+ function singleScopeArgument(file) {
30
+ const found = [];
31
+ const visit = (node) => {
32
+ if (
33
+ ts.isCallExpression(node) &&
34
+ ts.isPropertyAccessExpression(node.expression) &&
35
+ node.expression.name.text === 'set' &&
36
+ node.arguments.length === 2 &&
37
+ ts.isStringLiteralLike(node.arguments[0]) &&
38
+ node.arguments[0].text === 'scope'
39
+ ) {
40
+ found.push(node.arguments[1]);
41
+ }
42
+ ts.forEachChild(node, visit);
43
+ };
44
+ visit(file);
45
+ if (found.length !== 1) {
46
+ throw new Error(`Ожидался ровно один вызов set('scope', …), найдено ${found.length}`);
47
+ }
48
+ return found[0];
49
+ }
50
+
51
+ function resolveScopes(file, expression, seen) {
52
+ const node = unwrap(expression);
53
+ if (ts.isStringLiteralLike(node)) {
54
+ return node.text.split(' ').filter((token) => token !== '');
55
+ }
56
+ if (ts.isIdentifier(node)) {
57
+ return resolveScopes(file, initializerOf(file, node.text, seen), seen);
58
+ }
59
+ if (
60
+ ts.isCallExpression(node) &&
61
+ ts.isPropertyAccessExpression(node.expression) &&
62
+ node.expression.name.text === 'join' &&
63
+ node.arguments.length === 1 &&
64
+ ts.isStringLiteralLike(node.arguments[0]) &&
65
+ node.arguments[0].text === ' '
66
+ ) {
67
+ return resolveList(file, node.expression.expression, seen);
68
+ }
69
+ throw new Error(`Неподдержанная форма значения права подключения: ${ts.SyntaxKind[node.kind]}`);
70
+ }
71
+
72
+ function resolveList(file, expression, seen) {
73
+ const node = unwrap(expression);
74
+ if (ts.isIdentifier(node)) {
75
+ return resolveList(file, initializerOf(file, node.text, seen), seen);
76
+ }
77
+ if (!ts.isArrayLiteralExpression(node)) {
78
+ throw new Error(`Неподдержанная форма списка прав подключения: ${ts.SyntaxKind[node.kind]}`);
79
+ }
80
+ return node.elements.map((element) => {
81
+ if (!ts.isStringLiteralLike(element)) {
82
+ throw new Error(`Элемент списка прав подключения не строка: ${ts.SyntaxKind[element.kind]}`);
83
+ }
84
+ return element.text;
85
+ });
86
+ }
87
+
88
+ /** Приведения типа (`as const`, `as T`, `satisfies T`) и скобки на значение не влияют. */
89
+ function unwrap(node) {
90
+ let current = node;
91
+ while (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current)) {
92
+ current = current.expression;
93
+ }
94
+ return current;
95
+ }
96
+
97
+ /**
98
+ * Инициализатор переменной верхнего уровня файла; импорт или отсутствие объявления — отказ.
99
+ *
100
+ * ⛔ Значение инициализатора — это значение, уходящее в `scope`, только когда имя нельзя изменить и нельзя
101
+ * заслонить: `let` с переприсваиванием или локальное объявление того же имени внутри функции отдали бы выгрузке
102
+ * устаревший набор молча. Поэтому требуется `const`, а второе объявление имени где угодно в файле и любое
103
+ * присваивание ему — отказ.
104
+ */
105
+ function initializerOf(file, name, seen) {
106
+ if (seen.has(name)) throw new Error(`Циклическое объявление права подключения: ${name}`);
107
+ seen.add(name);
108
+ for (const statement of file.statements) {
109
+ if (!ts.isVariableStatement(statement)) continue;
110
+ for (const declaration of statement.declarationList.declarations) {
111
+ if (ts.isIdentifier(declaration.name) && declaration.name.text === name) {
112
+ if ((statement.declarationList.flags & ts.NodeFlags.Const) === 0) {
113
+ throw new Error(`Объявление ${name} не const: значение может быть переприсвоено`);
114
+ }
115
+ if (declaration.initializer === undefined) {
116
+ throw new Error(`У объявления ${name} нет значения`);
117
+ }
118
+ assertSingleBinding(file, name);
119
+ return declaration.initializer;
120
+ }
121
+ }
122
+ }
123
+ throw new Error(`Объявление ${name} не найдено в файле (импорт не разбирается)`);
124
+ }
125
+
126
+ /** Ровно одно объявление имени во всём файле и ни одного присваивания ему. */
127
+ function assertSingleBinding(file, name) {
128
+ let declarations = 0;
129
+ let assignments = 0;
130
+ const visit = (node) => {
131
+ if (ts.isIdentifier(node) && node.text === name && isDeclarationName(node.parent, node)) {
132
+ declarations += 1;
133
+ }
134
+ if (
135
+ ts.isBinaryExpression(node) &&
136
+ node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment &&
137
+ node.operatorToken.kind <= ts.SyntaxKind.LastAssignment
138
+ ) {
139
+ // Цель присваивания бывает обёрнута: `(NAME as string) = …`.
140
+ const target = unwrap(node.left);
141
+ if (ts.isIdentifier(target) && target.text === name) assignments += 1;
142
+ }
143
+ ts.forEachChild(node, visit);
144
+ };
145
+ visit(file);
146
+ if (declarations !== 1) {
147
+ throw new Error(`Имя ${name} объявлено в файле ${declarations} раз: затенение не разбирается`);
148
+ }
149
+ if (assignments > 0) {
150
+ throw new Error(`Имени ${name} присваивается значение: разбор видит только инициализатор`);
151
+ }
152
+ }
153
+
154
+ function isDeclarationName(parent, node) {
155
+ return (
156
+ ((ts.isVariableDeclaration(parent) ||
157
+ ts.isParameter(parent) ||
158
+ ts.isBindingElement(parent) ||
159
+ ts.isFunctionDeclaration(parent) ||
160
+ ts.isClassDeclaration(parent) ||
161
+ ts.isImportSpecifier(parent) ||
162
+ ts.isImportClause(parent) ||
163
+ ts.isNamespaceImport(parent)) &&
164
+ parent.name === node)
165
+ );
166
+ }
@@ -0,0 +1,83 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { extractConnectScopes } from './connect-scopes.mjs';
4
+
5
+ describe('extractConnectScopes — права, реально уходящие в параметр scope', () => {
6
+ it('форма отгруженного пакета: список as const → join → приведение типа → set', () => {
7
+ const source = `
8
+ export const MCP_OAUTH_SCOPES = ['mcp:*', 'mcp:platform-setup', 'mcp:funnel-test', 'read:campaigns',
9
+ 'launch:campaigns', 'read:contacts', 'write:operators'] as const;
10
+ export const OAUTH_SCOPE: ContractConnectScope = MCP_OAUTH_SCOPES.join(' ') as JoinWithSpace<typeof MCP_OAUTH_SCOPES>;
11
+ function start(url: URL) { url.searchParams.set('scope', OAUTH_SCOPE); }
12
+ `;
13
+ expect(extractConnectScopes(source)).toEqual([
14
+ 'mcp:*',
15
+ 'mcp:platform-setup',
16
+ 'mcp:funnel-test',
17
+ 'read:campaigns',
18
+ 'launch:campaigns',
19
+ 'read:contacts',
20
+ 'write:operators',
21
+ ]);
22
+ });
23
+
24
+ it('форма ветки v2: строка через пробел', () => {
25
+ const source = `
26
+ export const OAUTH_SCOPE = 'mcp:* mcp:platform-setup read:contacts';
27
+ function start(url: URL) { url.searchParams.set('scope', OAUTH_SCOPE); }
28
+ `;
29
+ expect(extractConnectScopes(source)).toEqual(['mcp:*', 'mcp:platform-setup', 'read:contacts']);
30
+ });
31
+
32
+ it.each([
33
+ ['спред', `const BASE = ['mcp:*']; const ALL = [...BASE, 'read:contacts'] as const; const S = ALL.join(' '); function f(u: URL) { u.searchParams.set('scope', S); }`],
34
+ ['импорт', `import { OAUTH_SCOPE } from './scopes'; function f(u: URL) { u.searchParams.set('scope', OAUTH_SCOPE); }`],
35
+ ['вычисление', `const S = ['mcp:*'].map((s) => s).join(' '); function f(u: URL) { u.searchParams.set('scope', S); }`],
36
+ ['шаблонная строка с подстановкой', 'const X = "read:contacts"; const S = `mcp:* ${X}`; function f(u: URL) { u.searchParams.set("scope", S); }'],
37
+ ])('⛔ незнакомая форма объявления — отказ выгрузки (%s), а не молча устаревший набор', (_label, source) => {
38
+ expect(() => extractConnectScopes(source)).toThrow();
39
+ });
40
+
41
+ it('⛔ изменяемое объявление с переприсваиванием — отказ, а не значение инициализатора', () => {
42
+ const source = `
43
+ export let OAUTH_SCOPE = 'mcp:*';
44
+ OAUTH_SCOPE = 'mcp:* read:contacts';
45
+ function start(url: URL) { url.searchParams.set('scope', OAUTH_SCOPE); }
46
+ `;
47
+ expect(() => extractConnectScopes(source)).toThrow(/не const/);
48
+ expect(() =>
49
+ extractConnectScopes(`
50
+ export const OAUTH_SCOPE = 'mcp:*';
51
+ function start(url: URL) { (OAUTH_SCOPE as string) = 'x'; url.searchParams.set('scope', OAUTH_SCOPE); }
52
+ `),
53
+ ).toThrow(/присваивается/);
54
+ });
55
+
56
+ it('⛔ локальное объявление того же имени заслоняет верхнее — отказ', () => {
57
+ const source = `
58
+ export const OAUTH_SCOPE = 'mcp:*';
59
+ function start(url: URL) {
60
+ const OAUTH_SCOPE = 'mcp:* read:contacts';
61
+ url.searchParams.set('scope', OAUTH_SCOPE);
62
+ }
63
+ `;
64
+ expect(() => extractConnectScopes(source)).toThrow(/объявлено в файле 2 раз/);
65
+ });
66
+
67
+ it('⛔ два вызова set(scope) — отказ: выбор неоднозначен', () => {
68
+ const source = `
69
+ const A = 'mcp:*'; const B = 'mcp:* read:contacts';
70
+ function f(u: URL) { u.searchParams.set('scope', A); u.searchParams.set('scope', B); }
71
+ `;
72
+ expect(() => extractConnectScopes(source)).toThrow(/ровно один/);
73
+ });
74
+
75
+ it('⛔ пустой набор и дубли — отказ', () => {
76
+ expect(() =>
77
+ extractConnectScopes(`const S = ''; function f(u: URL) { u.searchParams.set('scope', S); }`),
78
+ ).toThrow(/пуст/);
79
+ expect(() =>
80
+ extractConnectScopes(`const S = 'mcp:* mcp:*'; function f(u: URL) { u.searchParams.set('scope', S); }`),
81
+ ).toThrow(/дважды/);
82
+ });
83
+ });
@@ -0,0 +1,31 @@
1
+ // Доказательный fixture исполняет schema + createRequest точного отгруженного pin.
2
+ import { execFileSync } from 'node:child_process';
3
+ import { createHash } from 'node:crypto';
4
+ import { mkdirSync, writeFileSync } from 'node:fs';
5
+ import { dirname, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { loadShippedDefinitions } from './shipped-definitions.mjs';
8
+ const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
9
+ const sourceCommit = '8a8e4995a1589ed06862fab43539c97c06963255';
10
+ const shipped = await loadShippedDefinitions(root, sourceCommit);
11
+ const workspace_id = '00000000-0000-4000-8000-000000000001';
12
+ const link_id = '00000000-0000-4000-8000-000000000002';
13
+ const cases = [
14
+ { name: 'besales_tracked_link_create', input: { workspace_id, name: 'Synthetic personal address', slug: 'personal-fixture', target_url: 'https://school.example.test/catalog', personal_url_variable: 'AI_TRF' } },
15
+ { name: 'besales_tracked_link_update', input: { workspace_id, link_id, personal_url_variable: 'AI_NEXT' } },
16
+ { name: 'besales_tracked_link_update', input: { workspace_id, link_id, name: 'Synthetic renamed' } },
17
+ { name: 'besales_tracked_link_update', input: { workspace_id, link_id, personal_url_variable: null } },
18
+ ];
19
+ const requests = cases.map(({ name, input }) => {
20
+ const tool = shipped.toolDefinitions.find((entry) => entry.name === name);
21
+ if (!tool) throw new Error(`SHIPPED_LINK_TOOL_MISSING:${name}`);
22
+ const parsed = tool.schema.parse(input);
23
+ return { name, input, request: tool.createRequest(parsed) };
24
+ });
25
+ const hash = createHash('sha256');
26
+ for (const path of [...shipped.inputPaths].sort()) hash.update(path + '\0').update(execFileSync('git', ['-C', root, 'show', `${sourceCommit}:${path}`], { maxBuffer: 64 * 1024 * 1024 }));
27
+ const serialized = JSON.stringify({ sourceCommit, inputPaths: shipped.inputPaths, sourceSha256: hash.digest('hex'), requests }, null, 2) + '\n';
28
+ for (const path of ['../besales-api/test/fixtures/link-tracking/personal-link-mcp-carrier.json', 'src/tools/fixtures/personal-link-mcp-carrier.json']) {
29
+ const target = resolve(root, path); mkdirSync(dirname(target), { recursive: true }); writeFileSync(target, serialized);
30
+ }
31
+ console.log('personal-link carrier: shipped schema + builder, four requests emitted');
@@ -0,0 +1,24 @@
1
+ // Только изменённые формы выводятся из исполняемых Zod-определений; остальные описания сохраняются.
2
+ import { readFileSync, writeFileSync } from 'node:fs';
3
+ import { z } from 'zod';
4
+ import { toolDefinitions } from '../src/tools/definitions.ts';
5
+
6
+ const names = [
7
+ 'besales_platform_create_init',
8
+ 'besales_crm_create_init',
9
+ 'besales_datasource_create_init',
10
+ ];
11
+ const target = new URL('../src/schemas/mcp-tools.json', import.meta.url);
12
+ const contract = JSON.parse(readFileSync(target, 'utf8'));
13
+ for (const name of names) {
14
+ const definition = toolDefinitions.find((tool) => tool.name === name);
15
+ const tool = contract.tools.find((tool) => tool.name === name);
16
+ if (!definition || !tool) throw new Error('Missing setup init contract');
17
+ const generated = z.toJSONSchema(definition.schema, {
18
+ unrepresentable: 'any',
19
+ });
20
+ if (!generated.properties?.operation_id || generated.required?.includes('operation_id'))
21
+ throw new Error('Operation key must remain optional');
22
+ tool.inputSchema.properties.operation_id = generated.properties.operation_id;
23
+ }
24
+ writeFileSync(target, JSON.stringify(contract, null, 2) + '\n');