@besales/mcp 0.48.0 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/README.md +109 -164
  2. package/README.onprem.ru.md +35 -0
  3. package/bin/besales-mcp-http.js +9 -0
  4. package/bin/besales-onprem.mjs +19 -0
  5. package/dist/auth/connection-store.d.ts +3 -1
  6. package/dist/auth/connection-store.js +9 -3
  7. package/dist/auth/connection-store.js.map +1 -1
  8. package/dist/auth/oauth-client.d.ts +20 -27
  9. package/dist/auth/oauth-client.js +31 -23
  10. package/dist/auth/oauth-client.js.map +1 -1
  11. package/dist/auth/session-workspace.d.ts +1 -0
  12. package/dist/auth/session-workspace.js +10 -1
  13. package/dist/auth/session-workspace.js.map +1 -1
  14. package/dist/auth/token-storage.js +4 -1
  15. package/dist/auth/token-storage.js.map +1 -1
  16. package/dist/cli.d.ts +1 -0
  17. package/dist/cli.js +80 -19
  18. package/dist/cli.js.map +1 -1
  19. package/dist/constants/crm-catalog.d.ts +2 -0
  20. package/dist/constants/crm-catalog.js +3 -0
  21. package/dist/constants/crm-catalog.js.map +1 -0
  22. package/dist/http/api-client.d.ts +52 -7
  23. package/dist/http/api-client.js +131 -66
  24. package/dist/http/api-client.js.map +1 -1
  25. package/dist/http/feedback-document-error.d.ts +26 -0
  26. package/dist/http/feedback-document-error.js +22 -0
  27. package/dist/http/feedback-document-error.js.map +1 -0
  28. package/dist/http-server.d.ts +15 -0
  29. package/dist/http-server.js +378 -0
  30. package/dist/http-server.js.map +1 -0
  31. package/dist/instructions/server-instructions.d.ts +1 -1
  32. package/dist/instructions/server-instructions.js +6 -3
  33. package/dist/instructions/server-instructions.js.map +1 -1
  34. package/dist/network/constants.d.ts +25 -0
  35. package/dist/network/constants.js +26 -0
  36. package/dist/network/constants.js.map +1 -0
  37. package/dist/network/failed-verifications.d.ts +10 -0
  38. package/dist/network/failed-verifications.js +37 -0
  39. package/dist/network/failed-verifications.js.map +1 -0
  40. package/dist/network/http-test-fixture.d.ts +3 -0
  41. package/dist/network/http-test-fixture.js +86 -0
  42. package/dist/network/http-test-fixture.js.map +1 -0
  43. package/dist/network/known-keys.d.ts +10 -0
  44. package/dist/network/known-keys.js +38 -0
  45. package/dist/network/known-keys.js.map +1 -0
  46. package/dist/network/memory-credentials.d.ts +11 -0
  47. package/dist/network/memory-credentials.js +24 -0
  48. package/dist/network/memory-credentials.js.map +1 -0
  49. package/dist/network/rate-limit.d.ts +23 -0
  50. package/dist/network/rate-limit.js +62 -0
  51. package/dist/network/rate-limit.js.map +1 -0
  52. package/dist/network/rejected-keys.d.ts +9 -0
  53. package/dist/network/rejected-keys.js +39 -0
  54. package/dist/network/rejected-keys.js.map +1 -0
  55. package/dist/network/request-work.d.ts +8 -0
  56. package/dist/network/request-work.js +20 -0
  57. package/dist/network/request-work.js.map +1 -0
  58. package/dist/network/successful-keys.d.ts +17 -0
  59. package/dist/network/successful-keys.js +47 -0
  60. package/dist/network/successful-keys.js.map +1 -0
  61. package/dist/resources/concepts/external-execution.md +3 -1
  62. package/dist/resources/concepts/feedback-sheets.md +21 -12
  63. package/dist/resources/concepts/icp.md +8 -1
  64. package/dist/resources/concepts/sandbox.md +15 -6
  65. package/dist/resources/concepts/triggers.md +8 -0
  66. package/dist/resources/concepts/workbook-classification.md +104 -50
  67. package/dist/resources/docs/agent-behavior.md +51 -382
  68. package/dist/resources/docs/campaigns.md +9 -16
  69. package/dist/resources/docs/crm-integration.md +39 -523
  70. package/dist/resources/docs/files-and-uploads.md +23 -286
  71. package/dist/resources/docs/follow-up.md +47 -12
  72. package/dist/resources/docs/knowledge-base.md +52 -521
  73. package/dist/resources/docs/pipeline-builder.md +26 -216
  74. package/dist/resources/docs/pipeline-settings-deep.md +27 -220
  75. package/dist/resources/docs/platforms.md +106 -519
  76. package/dist/resources/docs/prompt-anatomy.md +39 -285
  77. package/dist/resources/docs/routing.md +8 -16
  78. package/dist/resources/docs/trigger-actions.md +40 -24
  79. package/dist/resources/docs/variables.md +8 -12
  80. package/dist/resources/operator-edit.contract.d.ts +7 -0
  81. package/dist/resources/operator-edit.contract.js +8 -0
  82. package/dist/resources/operator-edit.contract.js.map +1 -0
  83. package/dist/resources/registry.js +20 -4
  84. package/dist/resources/registry.js.map +1 -1
  85. package/dist/resources/workflows/audit-dialogues.md +23 -12
  86. package/dist/resources/workflows/compare-models.md +6 -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 +9902 -4734
  94. package/dist/schemas/voice-actions-api.contract.json +248 -0
  95. package/dist/shared/constants/broadcast-reason.constants.d.ts +2 -0
  96. package/dist/shared/constants/broadcast-reason.constants.js +47 -0
  97. package/dist/shared/constants/broadcast-reason.constants.js.map +1 -0
  98. package/dist/shared/constants/crm-stage-pool.constants.d.ts +2 -0
  99. package/dist/shared/constants/crm-stage-pool.constants.js +3 -0
  100. package/dist/shared/constants/crm-stage-pool.constants.js.map +1 -0
  101. package/dist/shared/constants/followup-note.constants.d.ts +3 -0
  102. package/dist/shared/constants/followup-note.constants.js +4 -0
  103. package/dist/shared/constants/followup-note.constants.js.map +1 -0
  104. package/dist/shared/constants/followup-session.constants.d.ts +2 -0
  105. package/dist/shared/constants/followup-session.constants.js +3 -0
  106. package/dist/shared/constants/followup-session.constants.js.map +1 -0
  107. package/dist/shared/constants/funnel-analytics.constants.d.ts +2 -0
  108. package/dist/shared/constants/funnel-analytics.constants.js +3 -0
  109. package/dist/shared/constants/funnel-analytics.constants.js.map +1 -0
  110. package/dist/shared/constants/message-filter.constants.d.ts +7 -0
  111. package/dist/shared/constants/message-filter.constants.js +8 -0
  112. package/dist/shared/constants/message-filter.constants.js.map +1 -0
  113. package/dist/shared/utils/trigger-repeat-mapping.d.ts +72 -0
  114. package/dist/shared/utils/trigger-repeat-mapping.js +53 -0
  115. package/dist/shared/utils/trigger-repeat-mapping.js.map +1 -0
  116. package/dist/skills/besales-dialogue-audit/SKILL.md +31 -20
  117. package/dist/tasks/task-state-store.js +5 -0
  118. package/dist/tasks/task-state-store.js.map +1 -1
  119. package/dist/tools/annotations.js +4 -3
  120. package/dist/tools/annotations.js.map +1 -1
  121. package/dist/tools/definitions/agent-design.d.ts +78 -21
  122. package/dist/tools/definitions/agent-design.js +246 -90
  123. package/dist/tools/definitions/agent-design.js.map +1 -1
  124. package/dist/tools/definitions/agent-model-notice.d.ts +5 -0
  125. package/dist/tools/definitions/agent-model-notice.js +31 -0
  126. package/dist/tools/definitions/agent-model-notice.js.map +1 -0
  127. package/dist/tools/definitions/agent-models.d.ts +5 -0
  128. package/dist/tools/definitions/agent-models.js +26 -0
  129. package/dist/tools/definitions/agent-models.js.map +1 -0
  130. package/dist/tools/definitions/agent-settings.d.ts +85 -0
  131. package/dist/tools/definitions/agent-settings.js +187 -0
  132. package/dist/tools/definitions/agent-settings.js.map +1 -0
  133. package/dist/tools/definitions/ai-costs.d.ts +12 -0
  134. package/dist/tools/definitions/ai-costs.js +142 -0
  135. package/dist/tools/definitions/ai-costs.js.map +1 -0
  136. package/dist/tools/definitions/api-tool-request.d.ts +15 -0
  137. package/dist/tools/definitions/api-tool-request.js +2 -0
  138. package/dist/tools/definitions/api-tool-request.js.map +1 -0
  139. package/dist/tools/definitions/behavior-shipped-form.d.ts +182 -0
  140. package/dist/tools/definitions/behavior-shipped-form.js +185 -0
  141. package/dist/tools/definitions/behavior-shipped-form.js.map +1 -0
  142. package/dist/tools/definitions/broadcast-alerts.d.ts +6 -0
  143. package/dist/tools/definitions/broadcast-alerts.js +72 -0
  144. package/dist/tools/definitions/broadcast-alerts.js.map +1 -0
  145. package/dist/tools/definitions/broadcast-analytics.d.ts +102 -18
  146. package/dist/tools/definitions/broadcast-analytics.js +732 -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 +28 -41
  158. package/dist/tools/definitions/crm-platform.js +235 -368
  159. package/dist/tools/definitions/crm-platform.js.map +1 -1
  160. package/dist/tools/definitions/crm-stage-pool.messages.d.ts +39 -0
  161. package/dist/tools/definitions/crm-stage-pool.messages.js +43 -0
  162. package/dist/tools/definitions/crm-stage-pool.messages.js.map +1 -0
  163. package/dist/tools/definitions/crm-stage-pool.schema.d.ts +64 -0
  164. package/dist/tools/definitions/crm-stage-pool.schema.js +109 -0
  165. package/dist/tools/definitions/crm-stage-pool.schema.js.map +1 -0
  166. package/dist/tools/definitions/custom-reports.d.ts +12 -0
  167. package/dist/tools/definitions/custom-reports.js +68 -0
  168. package/dist/tools/definitions/custom-reports.js.map +1 -0
  169. package/dist/tools/definitions/datasource.d.ts +2 -1
  170. package/dist/tools/definitions/datasource.js +28 -13
  171. package/dist/tools/definitions/datasource.js.map +1 -1
  172. package/dist/tools/definitions/dialog-review-findings-response.d.ts +14 -0
  173. package/dist/tools/definitions/dialog-review-findings-response.js +23 -0
  174. package/dist/tools/definitions/dialog-review-findings-response.js.map +1 -0
  175. package/dist/tools/definitions/dialog-review-safe-response.d.ts +5 -0
  176. package/dist/tools/definitions/dialog-review-safe-response.js +152 -0
  177. package/dist/tools/definitions/dialog-review-safe-response.js.map +1 -0
  178. package/dist/tools/definitions/dialog-review.d.ts +49 -0
  179. package/dist/tools/definitions/dialog-review.js +383 -0
  180. package/dist/tools/definitions/dialog-review.js.map +1 -0
  181. package/dist/tools/definitions/dialogue-analysis.d.ts +46 -0
  182. package/dist/tools/definitions/dialogue-analysis.js +170 -0
  183. package/dist/tools/definitions/dialogue-analysis.js.map +1 -0
  184. package/dist/tools/definitions/dialogue-audit-agent-scope.d.ts +7 -0
  185. package/dist/tools/definitions/dialogue-audit-agent-scope.js +41 -0
  186. package/dist/tools/definitions/dialogue-audit-agent-scope.js.map +1 -0
  187. package/dist/tools/definitions/dialogue-audit-alias.d.ts +67 -0
  188. package/dist/tools/definitions/dialogue-audit-alias.js +559 -0
  189. package/dist/tools/definitions/dialogue-audit-alias.js.map +1 -0
  190. package/dist/tools/definitions/dialogue-export.d.ts +7 -1
  191. package/dist/tools/definitions/dialogue-export.js +89 -32
  192. package/dist/tools/definitions/dialogue-export.js.map +1 -1
  193. package/dist/tools/definitions/dialogue-followup-state.d.ts +9 -0
  194. package/dist/tools/definitions/dialogue-followup-state.js +69 -0
  195. package/dist/tools/definitions/dialogue-followup-state.js.map +1 -0
  196. package/dist/tools/definitions/edit-version-transport.test-fixtures.d.ts +13 -0
  197. package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
  198. package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
  199. package/dist/tools/definitions/edit-version.d.ts +5 -0
  200. package/dist/tools/definitions/edit-version.js +20 -0
  201. package/dist/tools/definitions/edit-version.js.map +1 -0
  202. package/dist/tools/definitions/external-api-channels.js +17 -15
  203. package/dist/tools/definitions/external-api-channels.js.map +1 -1
  204. package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
  205. package/dist/tools/definitions/feedback-document-access.js +63 -0
  206. package/dist/tools/definitions/feedback-document-access.js.map +1 -0
  207. package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
  208. package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
  209. package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
  210. package/dist/tools/definitions/follow-up-config.d.ts +79 -0
  211. package/dist/tools/definitions/follow-up-config.js +258 -0
  212. package/dist/tools/definitions/follow-up-config.js.map +1 -0
  213. package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
  214. package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
  215. package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
  216. package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
  217. package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
  218. package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
  219. package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
  220. package/dist/tools/definitions/follow-up-setup.js +20 -87
  221. package/dist/tools/definitions/follow-up-setup.js.map +1 -1
  222. package/dist/tools/definitions/follow-up.d.ts +20 -122
  223. package/dist/tools/definitions/follow-up.js +200 -357
  224. package/dist/tools/definitions/follow-up.js.map +1 -1
  225. package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
  226. package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
  227. package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
  228. package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
  229. package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
  230. package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
  231. package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
  232. package/dist/tools/definitions/funnel-analytics.js +150 -0
  233. package/dist/tools/definitions/funnel-analytics.js.map +1 -0
  234. package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
  235. package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
  236. package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
  237. package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
  238. package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
  239. package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
  240. package/dist/tools/definitions/getcourse-cold-welcome.d.ts +14 -29
  241. package/dist/tools/definitions/getcourse-cold-welcome.js +180 -254
  242. package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
  243. package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
  244. package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
  245. package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
  246. package/dist/tools/definitions/help.js.map +1 -1
  247. package/dist/tools/definitions/icp-import-source.d.ts +75 -0
  248. package/dist/tools/definitions/icp-import-source.js +88 -0
  249. package/dist/tools/definitions/icp-import-source.js.map +1 -0
  250. package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
  251. package/dist/tools/definitions/inbound-analytics.js +55 -0
  252. package/dist/tools/definitions/inbound-analytics.js.map +1 -0
  253. package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
  254. package/dist/tools/definitions/instagram-comment.templates.js +34 -0
  255. package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
  256. package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
  257. package/dist/tools/definitions/instagram-settings-compat.js +7 -0
  258. package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
  259. package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
  260. package/dist/tools/definitions/knowledge-chunking.js +83 -0
  261. package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
  262. package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
  263. package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
  264. package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
  265. package/dist/tools/definitions/knowledge.d.ts +24 -14
  266. package/dist/tools/definitions/knowledge.js +342 -233
  267. package/dist/tools/definitions/knowledge.js.map +1 -1
  268. package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
  269. package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
  270. package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
  271. package/dist/tools/definitions/link-tracking.d.ts +8 -0
  272. package/dist/tools/definitions/link-tracking.js +141 -38
  273. package/dist/tools/definitions/link-tracking.js.map +1 -1
  274. package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
  275. package/dist/tools/definitions/mailing-variant-content.js +73 -0
  276. package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
  277. package/dist/tools/definitions/model-comparison.d.ts +1 -0
  278. package/dist/tools/definitions/model-comparison.js +4 -5
  279. package/dist/tools/definitions/model-comparison.js.map +1 -1
  280. package/dist/tools/definitions/money-currency.d.ts +5 -0
  281. package/dist/tools/definitions/money-currency.js +10 -0
  282. package/dist/tools/definitions/money-currency.js.map +1 -0
  283. package/dist/tools/definitions/operator-workflow.d.ts +5 -5
  284. package/dist/tools/definitions/operator-workflow.js +80 -27
  285. package/dist/tools/definitions/operator-workflow.js.map +1 -1
  286. package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
  287. package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
  288. package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
  289. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
  290. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
  291. package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
  292. package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
  293. package/dist/tools/definitions/platform-settings-limits.js +6 -0
  294. package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
  295. package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
  296. package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
  297. package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
  298. package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
  299. package/dist/tools/definitions/platform-settings-update.js +134 -0
  300. package/dist/tools/definitions/platform-settings-update.js.map +1 -0
  301. package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
  302. package/dist/tools/definitions/platform-setup-wave.js +1079 -0
  303. package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
  304. package/dist/tools/definitions/platform-setup.d.ts +686 -224
  305. package/dist/tools/definitions/platform-setup.js +313 -752
  306. package/dist/tools/definitions/platform-setup.js.map +1 -1
  307. package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
  308. package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
  309. package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
  310. package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
  311. package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
  312. package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
  313. package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
  314. package/dist/tools/definitions/prompt-batch-controls.js +40 -0
  315. package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
  316. package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
  317. package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
  318. package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
  319. package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
  320. package/dist/tools/definitions/prompt-text-projection.js +62 -0
  321. package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
  322. package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
  323. package/dist/tools/definitions/reviewer-paid.js +115 -0
  324. package/dist/tools/definitions/reviewer-paid.js.map +1 -0
  325. package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
  326. package/dist/tools/definitions/routing-condition-projection.js +97 -0
  327. package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
  328. package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
  329. package/dist/tools/definitions/schedule-selection-hints.js +42 -0
  330. package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
  331. package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
  332. package/dist/tools/definitions/scheduled-task-alias.js +207 -0
  333. package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
  334. package/dist/tools/definitions/session.js +3 -3
  335. package/dist/tools/definitions/session.js.map +1 -1
  336. package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
  337. package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
  338. package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
  339. package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
  340. package/dist/tools/definitions/shared-input.helpers.js +323 -0
  341. package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
  342. package/dist/tools/definitions/shared.d.ts +396 -307
  343. package/dist/tools/definitions/shared.js +430 -652
  344. package/dist/tools/definitions/shared.js.map +1 -1
  345. package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
  346. package/dist/tools/definitions/shipped-output-names.js +123 -0
  347. package/dist/tools/definitions/shipped-output-names.js.map +1 -0
  348. package/dist/tools/definitions/task-state.d.ts +5 -5
  349. package/dist/tools/definitions/task-state.js +2 -1
  350. package/dist/tools/definitions/task-state.js.map +1 -1
  351. package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
  352. package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
  353. package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
  354. package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
  355. package/dist/tools/definitions/telegram-pool-policy.js +56 -0
  356. package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
  357. package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
  358. package/dist/tools/definitions/touch-history-alias.js +99 -0
  359. package/dist/tools/definitions/touch-history-alias.js.map +1 -0
  360. package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
  361. package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
  362. package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
  363. package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
  364. package/dist/tools/definitions/trigger-argument.schema.js +23 -0
  365. package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
  366. package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
  367. package/dist/tools/definitions/trigger-claim-alias.js +90 -0
  368. package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
  369. package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
  370. package/dist/tools/definitions/trigger-echo-projection.js +41 -0
  371. package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
  372. package/dist/tools/definitions/trigger-upsert.tool.d.ts +29 -0
  373. package/dist/tools/definitions/trigger-upsert.tool.js +122 -0
  374. package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
  375. package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
  376. package/dist/tools/definitions/v15-port-descriptions.js +30 -0
  377. package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
  378. package/dist/tools/definitions/variables.d.ts +44 -0
  379. package/dist/tools/definitions/variables.js +310 -0
  380. package/dist/tools/definitions/variables.js.map +1 -0
  381. package/dist/tools/definitions/voice-action-input.d.ts +9 -0
  382. package/dist/tools/definitions/voice-action-input.js +141 -0
  383. package/dist/tools/definitions/voice-action-input.js.map +1 -0
  384. package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
  385. package/dist/tools/definitions/widget-customization-compat.js +23 -0
  386. package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
  387. package/dist/tools/definitions.d.ts +1089 -636
  388. package/dist/tools/definitions.js +57 -27
  389. package/dist/tools/definitions.js.map +1 -1
  390. package/dist/tools/description-localization.js +3 -2
  391. package/dist/tools/description-localization.js.map +1 -1
  392. package/dist/tools/follow-up-request.d.ts +19 -0
  393. package/dist/tools/follow-up-request.js +81 -0
  394. package/dist/tools/follow-up-request.js.map +1 -0
  395. package/dist/tools/followup-revision.d.ts +4 -0
  396. package/dist/tools/followup-revision.js +29 -0
  397. package/dist/tools/followup-revision.js.map +1 -0
  398. package/dist/tools/incomplete-list.js +4 -0
  399. package/dist/tools/incomplete-list.js.map +1 -1
  400. package/dist/tools/inventory.js +47 -11
  401. package/dist/tools/inventory.js.map +1 -1
  402. package/dist/tools/operation-recovery.d.ts +4 -0
  403. package/dist/tools/operation-recovery.js +33 -0
  404. package/dist/tools/operation-recovery.js.map +1 -0
  405. package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
  406. package/dist/tools/registry-mapping-primary.cases.js +753 -0
  407. package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
  408. package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
  409. package/dist/tools/registry-mapping-secondary.cases.js +626 -0
  410. package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
  411. package/dist/tools/registry-mapping.cases.d.ts +8 -0
  412. package/dist/tools/registry-mapping.cases.js +13 -0
  413. package/dist/tools/registry-mapping.cases.js.map +1 -0
  414. package/dist/tools/registry-test-fixtures.d.ts +50 -0
  415. package/dist/tools/registry-test-fixtures.js +120 -0
  416. package/dist/tools/registry-test-fixtures.js.map +1 -0
  417. package/dist/tools/registry.d.ts +2 -0
  418. package/dist/tools/registry.js +82 -52
  419. package/dist/tools/registry.js.map +1 -1
  420. package/dist/tools/result.d.ts +1 -0
  421. package/dist/tools/result.js +90 -22
  422. package/dist/tools/result.js.map +1 -1
  423. package/dist/tools/toolsets.d.ts +16 -0
  424. package/dist/tools/toolsets.js +25 -1
  425. package/dist/tools/toolsets.js.map +1 -1
  426. package/dist/types/api-contract.gen.d.ts +105875 -22205
  427. package/dist/utils/credential-signatures.d.ts +3 -0
  428. package/dist/utils/credential-signatures.js +10 -0
  429. package/dist/utils/credential-signatures.js.map +1 -0
  430. package/dist/utils/data-source-column-name.d.ts +10 -0
  431. package/dist/utils/data-source-column-name.js +36 -0
  432. package/dist/utils/data-source-column-name.js.map +1 -0
  433. package/dist/utils/logger.d.ts +1 -0
  434. package/dist/utils/logger.js +32 -8
  435. package/dist/utils/logger.js.map +1 -1
  436. package/dist/utils/secret-read-boundary.d.ts +2 -0
  437. package/dist/utils/secret-read-boundary.js +88 -0
  438. package/dist/utils/secret-read-boundary.js.map +1 -0
  439. package/dist/utils/setup-secrets.d.ts +4 -0
  440. package/dist/utils/setup-secrets.js +40 -0
  441. package/dist/utils/setup-secrets.js.map +1 -0
  442. package/docs/agent-models.md +9 -0
  443. package/docs/agent-usage-guide.full.ru.md +1 -4
  444. package/docs/analytics-contract.md +67 -0
  445. package/docs/async-operation-lifecycle.md +10 -3
  446. package/docs/connect.ru.md +144 -4
  447. package/docs/contact-company-profile.md +17 -0
  448. package/docs/contact-recommendations.md +7 -0
  449. package/docs/crm-stage-pool.md +73 -0
  450. package/docs/customer-data.md +61 -0
  451. package/docs/edit-versions.md +36 -0
  452. package/docs/failure-semantics.md +17 -9
  453. package/docs/help-navigation.md +15 -42
  454. package/docs/host-compatibility-matrix.md +72 -93
  455. package/docs/host-setup.md +33 -35
  456. package/docs/invariants/public-api-and-contracts.md +16 -0
  457. package/docs/legacy-action-settings.md +21 -0
  458. package/docs/main-transfer-dependencies.md +38 -0
  459. package/docs/mcp2-parity.md +50 -0
  460. package/docs/modules/analytics.md +79 -0
  461. package/docs/modules/besales-mcp.md +137 -0
  462. package/docs/modules/dialog-review-report.md +38 -0
  463. package/docs/modules/dialogue-followup-adapters.md +39 -0
  464. package/docs/modules/message-reactions.md +17 -0
  465. package/docs/modules/network-mode.md +284 -0
  466. package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
  467. package/docs/pii-policy.md +21 -16
  468. package/docs/response-size-budget.md +197 -7
  469. package/docs/secret-read-boundary.md +102 -0
  470. package/docs/task-state.md +7 -2
  471. package/docs/telegram-pool-policy.md +19 -0
  472. package/docs/tool-effects.md +15 -9
  473. package/docs/tool-surface.md +205 -4
  474. package/docs/voice-actions-and-inbox.md +95 -0
  475. package/docs/wazzup-instagram-comments.md +26 -0
  476. package/package.json +17 -10
  477. package/scripts/api-source-loader.spec.mjs +40 -0
  478. package/scripts/audit-bridge-controls.mjs +129 -0
  479. package/scripts/audit-revert-mutants.mjs +107 -0
  480. package/scripts/bridge-api-input.spec.mjs +98 -0
  481. package/scripts/bridge-controls-mutants.mjs +130 -0
  482. package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
  483. package/scripts/brx4-ledger-payload.spec.mjs +127 -0
  484. package/scripts/build-onprem.mjs +108 -0
  485. package/scripts/connect-clients.sh +141 -0
  486. package/scripts/connect-scopes.mjs +166 -0
  487. package/scripts/connect-scopes.spec.mjs +83 -0
  488. package/scripts/emit-personal-link-carrier.mjs +31 -0
  489. package/scripts/emit-setup-init-schemas.mjs +24 -0
  490. package/scripts/emit-tool-routes.mjs +878 -0
  491. package/scripts/emit-tool-routes.spec.mjs +300 -0
  492. package/scripts/followup-registry.spec.mjs +107 -0
  493. package/scripts/generate-crm-rotation-contract.mjs +98 -0
  494. package/scripts/generate-followup-session-contract.mjs +16 -0
  495. package/scripts/icp-import-verification/mutate.cjs +70 -0
  496. package/scripts/import-secret-read-contract.mjs +53 -0
  497. package/scripts/install-claude-desktop.js +1 -1
  498. package/scripts/lag-decisions.mjs +37 -0
  499. package/scripts/lag-decisions.spec.mjs +87 -0
  500. package/scripts/lag-open-task-owners.mjs +46 -0
  501. package/scripts/lag-open-task-owners.spec.mjs +78 -0
  502. package/scripts/lag-payload.mjs +10 -0
  503. package/scripts/legacy-action-lag.spec.mjs +22 -0
  504. package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
  505. package/scripts/mcpcompat-handler.mjs +34 -0
  506. package/scripts/mcpcompat-loader.mjs +36 -0
  507. package/scripts/mcpcompat-typescript.mjs +3 -0
  508. package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
  509. package/scripts/prbr-round1-recheck.spec.mjs +605 -0
  510. package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
  511. package/scripts/publish-mcp-registry.mjs +98 -0
  512. package/scripts/publish-mcp-registry.spec.mjs +68 -0
  513. package/scripts/record-scheduled-task-call.mjs +26 -0
  514. package/scripts/refusal-probe.mjs +17 -0
  515. package/scripts/refusal-probe.spec.mjs +29 -0
  516. package/scripts/registry-diff.mjs +502 -0
  517. package/scripts/registry-diff.spec.mjs +787 -0
  518. package/scripts/request-query.mjs +43 -0
  519. package/scripts/request-query.spec.mjs +82 -0
  520. package/scripts/route-lag.mjs +23 -0
  521. package/scripts/route-lag.spec.mjs +30 -0
  522. package/scripts/sample-args.mjs +174 -0
  523. package/scripts/sample-args.spec.mjs +160 -0
  524. package/scripts/shipped-definitions.mjs +197 -0
  525. package/scripts/shipped-definitions.spec.mjs +57 -0
  526. package/scripts/shipped-inputs.spec.mjs +136 -0
  527. package/scripts/shipped-recordings.spec.mjs +19 -0
  528. package/scripts/shipped-ref.d.mts +5 -0
  529. package/scripts/shipped-ref.mjs +20 -0
  530. package/scripts/shipped-ref.spec.mjs +59 -0
  531. package/scripts/shipped-registry.mjs +107 -0
  532. package/scripts/shipped-sample-candidates.mjs +69 -0
  533. package/scripts/shipped-sample-candidates.spec.mjs +117 -0
  534. package/scripts/shipped-sample.mjs +868 -0
  535. package/scripts/shipped-sample.spec.mjs +451 -0
  536. package/scripts/sync-agent-model-schemas.mjs +72 -0
  537. package/scripts/sync-api-contracts.mjs +85 -0
  538. package/scripts/sync-api-contracts.spec.mjs +144 -0
  539. package/scripts/sync-contract-ledger-schemas.mjs +161 -0
  540. package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
  541. package/scripts/sync-prompt-draft-schema.mjs +92 -0
  542. package/scripts/sync-route-map.mjs +94 -0
  543. package/scripts/sync-schema-descriptions.mjs +25 -0
  544. package/scripts/sync-tool-inventory.mjs +27 -0
  545. package/scripts/sync-trigger-argument-schema.mjs +121 -0
  546. package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
  547. package/scripts/sync-voice-actions-contract.mjs +67 -0
  548. package/scripts/sync-voice-actions-tools.mjs +97 -0
  549. package/scripts/sync-wave-id-schemas.mjs +55 -0
  550. package/scripts/tool-input-schemas.mjs +46 -0
  551. package/scripts/tool-input-schemas.spec.mjs +50 -0
  552. package/scripts/verify-followup-adapters.mjs +235 -0
  553. package/scripts/verify-secret-read-import.mjs +84 -0
  554. package/scripts/verify-secret-read-mutants.mjs +143 -0
  555. package/dist/tools/definitions/analytics.d.ts +0 -40
  556. package/dist/tools/definitions/analytics.js +0 -233
  557. package/dist/tools/definitions/analytics.js.map +0 -1
  558. package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
  559. package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
  560. package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
  561. package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
  562. package/dist/tools/definitions/dialogue-audit.js +0 -292
  563. package/dist/tools/definitions/dialogue-audit.js.map +0 -1
  564. package/dist/tools/definitions/getcourse-wave.js +0 -519
  565. package/dist/tools/definitions/getcourse-wave.js.map +0 -1
  566. package/dist/tools/definitions/operational-overview.d.ts +0 -3
  567. package/dist/tools/definitions/operational-overview.js +0 -23
  568. package/dist/tools/definitions/operational-overview.js.map +0 -1
  569. package/dist/tools/definitions/scheduled-tasks.js +0 -173
  570. package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
  571. package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
  572. package/dist/tools/definitions/trigger-contact-claims.js +0 -60
  573. package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
  574. package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
  575. package/dist/tools/registry-mapping-cases-core.js +0 -963
  576. package/dist/tools/registry-mapping-cases-core.js.map +0 -1
  577. package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
  578. package/dist/tools/registry-mapping-cases-platform.js +0 -1052
  579. package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
  580. package/dist/tools/trigger-action-config.d.ts +0 -49
  581. package/dist/tools/trigger-action-config.js +0 -171
  582. package/dist/tools/trigger-action-config.js.map +0 -1
  583. package/docs/evals/model-behavior-scorecard.md +0 -80
  584. package/docs/operation-coverage.md +0 -114
  585. package/scripts/mock-credentials.js +0 -77
  586. package/scripts/model-eval-server.js +0 -213
  587. package/scripts/run-model-eval.js +0 -447
@@ -1,5 +1,67 @@
1
1
  import { z } from 'zod';
2
- import { buildKnowledgeSpaceListQuery, buildListQuery, compactObject, defineTool, knowledgeTableSourceSchema, uuidSchema, withInstructions, } from './shared.js';
2
+ import { knowledgeSpaceSearchFields } from './knowledge-space-search-fields.js';
3
+ /** Номер страницы нельзя молча превратить в первую страницу курсорного списка. */
4
+ const retiredKnowledgePageSchema = z.number().int().min(1).optional().superRefine((value, context) => {
5
+ if (value !== undefined)
6
+ context.addIssue({
7
+ code: 'custom',
8
+ message: 'page упразднён: продолжайте список по cursor из предыдущего ответа; страница не прочитана',
9
+ });
10
+ });
11
+ import { refineSplitOverride, splitOverrideSchema, toV2Chunking } from './knowledge-chunking.js';
12
+ import { buildKnowledgeSpaceListQuery, compactObject, defineTool, knowledgeTableSourceSchema, knowledgeSpaceIdSchema, uuidSchema, withInstructions, } from './shared.js';
13
+ const QA_SOURCE_NAME_MAX_CODE_POINTS = 80;
14
+ function mapDocumentStatus(status) {
15
+ if (status === undefined)
16
+ return undefined;
17
+ if (status === 'COMPLETED')
18
+ return 'ACTIVE';
19
+ if (status === 'FAILED')
20
+ return 'FAILED';
21
+ if (status === 'LOADED' || status === 'TEXT_EXTRACTED')
22
+ return 'PENDING';
23
+ return 'INDEXING';
24
+ }
25
+ function mapWebsiteStatus(status) {
26
+ if (status === undefined || status === 'PENDING' || status === 'FAILED')
27
+ return status;
28
+ return status === 'COMPLETED' ? 'ACTIVE' : 'INDEXING';
29
+ }
30
+ /**
31
+ * limit и cursor передаются серверу; номер page отвергается до запроса с адресом поля.
32
+ * Курсор сохраняет обход при создании и удалении источников между страницами:
33
+ * смещение могло бы пропустить строку или показать её дважды.
34
+ */
35
+ function buildSourceListQuery(sourceType, filters = {}) {
36
+ const query = new URLSearchParams({ sourceType });
37
+ if (filters.status)
38
+ query.set('status', filters.status);
39
+ if (filters.qaMode)
40
+ query.set('qaMode', filters.qaMode);
41
+ if (filters.isActive !== undefined)
42
+ query.set('isActive', String(filters.isActive));
43
+ if (filters.limit !== undefined)
44
+ query.set('limit', String(filters.limit));
45
+ if (filters.cursor)
46
+ query.set('cursor', filters.cursor);
47
+ return `?${query.toString()}`;
48
+ }
49
+ function deriveQaSourceName(question) {
50
+ const normalized = question.normalize('NFC').trim().replace(/\s+/gu, ' ');
51
+ return [...normalized].slice(0, QA_SOURCE_NAME_MAX_CODE_POINTS).join('');
52
+ }
53
+ function mapQaAnswerChunks(chunks, answer, create) {
54
+ if (chunks) {
55
+ return chunks.map((chunk) => compactObject({
56
+ text: chunk.text,
57
+ storedFileId: chunk.stored_file_id,
58
+ buttons: chunk.buttons,
59
+ }));
60
+ }
61
+ if (answer !== undefined)
62
+ return [{ text: answer }];
63
+ return create ? [{}] : undefined;
64
+ }
3
65
  function requireSingleSheetSelector(value, ctx) {
4
66
  const count = [value.sheet_title, value.sheet_gid, value.sheet_index].filter((item) => item !== undefined).length;
5
67
  if (count !== 1) {
@@ -66,14 +128,14 @@ export const knowledgeTools = [
66
128
  }),
67
129
  }),
68
130
  enhanceResponse: (response) => withInstructions(response, [
69
- 'Это инвентаризация и sample, а не полное чтение. dimensionsKnown=false или truncated=true требуют постраничного `besales_workbook_sheet_read`.',
131
+ 'Это инвентаризация и sample, а не полное чтение. truncated/rowsTruncated/columnsTruncated требуют постраничного `besales_workbook_sheet_read` либо явного сообщения о parser cap.',
70
132
  'Проверь readError у каждой вкладки: ошибка чтения не означает, что лист пуст.',
71
- 'Пройди по ВСЕМ вкладкам — не делай вывод «этого нет в файле», пока не дочитал их страницы.',
133
+ 'Пройди по содержимому ВСЕХ вкладок — не делай вывод «этого нет в файле», пока не дочитал доступные страницы каждой.',
72
134
  'Если контент на языке, отличном от языка диалога с пользователем — ПЕРЕД внедрением (RAG/промпт/ICP) дай пользователю краткое саммари на его языке: что нашёл и что внедряешь; по цифрам/процентам/условиям дождись подтверждения.',
73
135
  'Классифицируй каждую вкладку по таксономии из `besales://concepts/workbook-classification`.',
74
136
  'Для compact knowledge (≤8k chars) — сделай локальную LLM-выжимку и положи через `besales_agent_facts_set`.',
75
137
  'Для bulk knowledge (>8k) — `besales_workbook_to_knowledge_document`.',
76
- 'Для диалог-индексов с amoCRM-ссылками — вызови `besales_workbook_extract_amocrm_leads`, затем передай leads[].id в `besales_icp_import_dialogues mode=audio audio_source_type=amocrm_leads`.',
138
+ 'XLSX с amoCRM-ссылками можно передать в besales_icp_import_dialogues с source.kind=xlsx_upload, storedFileId и crmConnectionId; потребуются request_key и явное gdpr_confirmed=true.',
77
139
  'Если Google Sheets 403 (`google_sheets_not_shared`) — покажи юзеру `serviceAccountEmail` из response и попроси расшарить таблицу.',
78
140
  'После классификации зафиксируй решения через `besales_workbook_classification_update`.',
79
141
  ]),
@@ -112,10 +174,9 @@ export const knowledgeTools = [
112
174
  path: `/workspaces/${input.workspace_id}/workbooks/${input.workbook_id}/sheets/read?${buildWorkbookSheetReadQuery(input)}`,
113
175
  }),
114
176
  enhanceResponse: (response) => withInstructions(response, [
115
- 'Это явная страница листа. Для полного 2D-обхода пройди rowOffset до scanUpperBoundRowCount для каждого columnOffset, затем сбрось rowOffset в 0 и перейди к следующему nextColumnOffset.',
116
- 'Для Google Sheets totalRowCount/totalColumnCount могут быть null: это неизвестный total, а не ноль.',
117
- 'Пустая страница внутри Google grid не доказывает конец данных: следуй nextRowOffset/nextColumnOffset до верхних границ.',
118
- 'Если sourceTruncated=true, backend знает, что часть источника лежит за parser cap: не называй результат полным и не внедряй его как полный набор.',
177
+ 'Для полного 2D-обхода пройди rowOffset до scanUpperBoundRowCount для каждого columnOffset, затем сбрось rowOffset в 0 и перейди к следующему nextColumnOffset.',
178
+ 'Пустая страница не доказывает конец данных: offsets продвигаются до явных scanUpperBound.',
179
+ 'Если sourceTruncated=true, часть источника лежит за parser cap: не называй результат полным и не внедряй его как полный набор.',
119
180
  'Повтори страницу перед внедрением и сравни pageFingerprint, если источник мог измениться во время чтения.',
120
181
  ]),
121
182
  }),
@@ -149,13 +210,13 @@ export const knowledgeTools = [
149
210
  path: `/workspaces/${input.workspace_id}/workbooks/${input.workbook_id}/archive`,
150
211
  }),
151
212
  enhanceResponse: (response) => withInstructions(response, [
152
- 'SourceWorkbook архивирован; созданные KnowledgeDocument не удалены.',
213
+ 'SourceWorkbook архивирован; созданные knowledge documents не удалены.',
153
214
  'Для проверки перечитай книгу через `besales_workbook_get` и проверь archivedAt.',
154
215
  ]),
155
216
  }),
156
217
  defineTool({
157
218
  name: 'besales_workbook_extract_amocrm_leads',
158
- sideEffect: 'write',
219
+ sideEffect: 'none',
159
220
  requiredFields: ['workbook_id'],
160
221
  defaultWorkspaceId: true,
161
222
  schema: z
@@ -179,7 +240,7 @@ export const knowledgeTools = [
179
240
  }),
180
241
  enhanceResponse: (response) => withInstructions(response, [
181
242
  'Возвращены все amoCRM lead-ID из ВСЕЙ вкладки (без sample-лимита inspect).',
182
- 'Используй leads[].id для `besales_icp_import_dialogues mode=audio audio_source_type=amocrm_leads`.',
243
+ 'lead-ID можно передать в besales_icp_import_dialogues с source.kind=amocrm_calls, crmConnectionId и leadIds; потребуются request_key и явное gdpr_confirmed=true.',
183
244
  'Если truncated=true — вкладка длиннее 10000 строк (hard cap); часть строк не прочитана.',
184
245
  ]),
185
246
  }),
@@ -195,42 +256,58 @@ export const knowledgeTools = [
195
256
  sheet_title: z.string().optional(),
196
257
  sheet_gid: z.number().int().optional(),
197
258
  sheet_index: z.number().int().min(0).optional(),
259
+ /**
260
+ * Два способа адресовать одно и то же пространство знаний, и это НЕ дублирование:
261
+ * отгруженный клиент называет пространство ИМЕНЕМ (`namespace`), а в v2 пространство —
262
+ * сущность с идентификатором. Прежняя редакция ветки оставляла только идентификатор, и
263
+ * отгруженный вызов с именем ронялся сервером на неизвестном поле. Разрешение имени
264
+ * делает СЕРВЕР — одной операцией, точным совпадением; поиск на стороне моста означал бы
265
+ * второй запрос и гонку между чтением списка и записью документа.
266
+ */
267
+ knowledge_space_id: knowledgeSpaceIdSchema.optional(),
198
268
  namespace: z.string().optional(),
199
- split_override: z
200
- .object({
201
- split_mode: z.enum(['size', 'separator']),
202
- separator: z.string().optional(),
203
- chunk_size: z.number().int().min(100).optional(),
204
- chunk_overlap: z.number().int().min(0).optional(),
205
- max_chunk_size: z.number().int().min(100).optional(),
206
- })
207
- .optional(),
269
+ split_override: splitOverrideSchema.optional(),
208
270
  replace_existing: z.boolean().optional(),
271
+ target_knowledge_source_id: uuidSchema.optional(),
209
272
  })
210
- .superRefine(requireSingleSheetSelector),
273
+ .superRefine((value, ctx) => {
274
+ requireSingleSheetSelector(value, ctx);
275
+ refineSplitOverride(value.split_override, ctx);
276
+ // Оба поля можно опустить: сервер разрешит имя general тем же правилом, что явное имя.
277
+ // Одновременная адресация двумя способами остаётся ошибкой до сетевого запроса.
278
+ const byId = value.knowledge_space_id !== undefined;
279
+ const byName = value.namespace !== undefined;
280
+ if (byId && byName) {
281
+ ctx.addIssue({
282
+ code: z.ZodIssueCode.custom,
283
+ message: 'knowledge_space_id и namespace взаимоисключающи: назови пространство одним способом',
284
+ path: ['knowledge_space_id'],
285
+ });
286
+ }
287
+ }),
211
288
  createRequest: (input) => ({
212
289
  path: `/workspaces/${input.workspace_id}/workbooks/${input.workbook_id}/knowledge-document`,
213
290
  body: compactObject({
214
291
  sheetTitle: input.sheet_title,
215
292
  sheetGid: input.sheet_gid,
216
293
  sheetIndex: input.sheet_index,
217
- namespace: input.namespace,
218
- splitOverride: input.split_override
219
- ? compactObject({
220
- splitMode: input.split_override.split_mode,
221
- separator: input.split_override.separator,
222
- chunkSize: input.split_override.chunk_size,
223
- chunkOverlap: input.split_override.chunk_overlap,
224
- maxChunkSize: input.split_override.max_chunk_size,
225
- })
226
- : undefined,
294
+ knowledgeSpaceId: input.knowledge_space_id,
295
+ knowledgeSpaceName: input.namespace,
296
+ chunking: input.split_override ? toV2Chunking(input.split_override) : undefined,
227
297
  replaceExisting: input.replace_existing,
298
+ targetKnowledgeSourceId: input.target_knowledge_source_id,
228
299
  }),
229
300
  }),
230
301
  enhanceResponse: (response) => withInstructions(response, [
231
- 'KnowledgeDocument создан. Привяжи namespace к агенту через `AgentChat.knowledgeNamespaces` если не привязан (см. besales_agent_update).',
232
- 'response.splitDecision.reason — почему сервер выбрал такой режим чанкинга (heuristic либо override).',
233
- 'При повторном вызове для того же листа — старый AI_INGESTED документ заменяется (idempotency).',
302
+ 'outcome=CONTENT_REPLACED означает, что содержимое выбранного документа поставлено на переиндексацию; outcome=CREATED — создан новый документ.',
303
+ 'Цель выбирается по порядку: явный target_knowledge_source_id → единственное доказуемое совпадение → новый документ. Признак совпадения зависит от рода книги: у Google это ТОЛЬКО стабильный gid (заголовок вкладки мутабелен и не участвует), у xlsx — книга и заголовок вкладки; Google без gid цель не ищет вовсе.',
304
+ 'Несколько совпадений — отказ 409 со списком knowledgeSourceIds, документ НЕ создаётся: удали лишние либо назови нужный в target_knowledge_source_id.',
305
+ 'Перезалитый xlsx автоматически не опознаётся как та же книга: для замены передай target_knowledge_source_id явно.',
306
+ 'possibleDuplicates — только подсказка и ничего не изменяет. При необходимости повтори вызов с target_knowledge_source_id.',
307
+ 'indexingStatus=QUEUED означает асинхронную индексацию: ответ не обещает, что новые чанки уже активны.',
308
+ 'splitDecision называет применённые правила разбиения: OVERRIDE — из split_override этого вызова, GLOBAL_DEFAULT — умолчание (памяти прошлых правил у документа нет: замена без split_override возвращает умолчание).',
309
+ 'Пространство можно назвать ОДНИМ способом: knowledge_space_id либо namespace (имя). Без обоих полей используется пространство с именем general. Имя сравнивается ТОЧНО — как его уникализирует база; несуществующее имя даёт отказ, пространство по нему не создаётся.',
310
+ 'Привяжи knowledge-пространство к агенту, если оно ещё не привязано (см. besales_agent_update).',
234
311
  ]),
235
312
  }),
236
313
  // v1.5 — Knowledge Spaces (Increment 1): создание/управление namespaces для агентов
@@ -245,7 +322,7 @@ export const knowledgeTools = [
245
322
  name: z.string().min(1).max(100),
246
323
  scope_type: z.enum(['WORKSPACE', 'CHANNEL']),
247
324
  channel_id: uuidSchema.optional(),
248
- access_mode: z.enum(['AUTO_QUERY', 'TOOL_ONLY']).optional(),
325
+ ...knowledgeSpaceSearchFields,
249
326
  })
250
327
  .superRefine((value, ctx) => {
251
328
  if (value.scope_type === 'CHANNEL' && !value.channel_id) {
@@ -262,19 +339,22 @@ export const knowledgeTools = [
262
339
  }
263
340
  }),
264
341
  createRequest: (input) => ({
265
- path: `/workspaces/${input.workspace_id}/knowledge-spaces`,
342
+ path: '/knowledge-spaces',
266
343
  body: compactObject({
344
+ workspaceId: input.workspace_id,
267
345
  name: input.name,
268
- scope_type: input.scope_type,
269
- channel_id: input.channel_id,
270
- access_mode: input.access_mode,
346
+ scopeType: input.scope_type,
347
+ scopeId: input.channel_id,
348
+ accessMode: input.access_mode,
349
+ purpose: input.purpose,
350
+ searchKeywords: input.search_keywords,
271
351
  }),
272
352
  }),
273
353
  enhanceResponse: (response) => withInstructions(response, [
274
- 'Knowledge space создан. id — UUID для последующих ingestion-операций.',
275
- 'WORKSPACE scope доступен всем каналам через besales_knowledge_space_channel_link_upsert.',
276
- 'CHANNEL scope привязан к channel_id жёстко (изолирован).',
277
- 'Дальше: загрузи документ через besales_knowledge_document_upload или Q&A (Increment 2).',
354
+ 'База знаний создана. Её идентификатор нужен для добавления источников.',
355
+ 'Общую базу можно подключить к нужным каналам; база отдельного канала доступна только ему.',
356
+ 'Добавь документ или проверенную пару вопрос–ответ и дождись индексации.',
357
+ 'Назначение помогает агенту выбрать базу по запросу. Слова обязательного поиска добавляют доступную активную базу в автоматический план при совпадении с вопросом.',
278
358
  ]),
279
359
  }),
280
360
  defineTool({
@@ -299,11 +379,11 @@ export const knowledgeTools = [
299
379
  defaultWorkspaceId: true,
300
380
  schema: z.object({
301
381
  workspace_id: uuidSchema.optional(),
302
- knowledge_space_id: uuidSchema,
382
+ knowledge_space_id: knowledgeSpaceIdSchema,
303
383
  }),
304
384
  createRequest: (input) => ({
305
385
  method: 'GET',
306
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}`,
386
+ path: `/knowledge-spaces/${input.knowledge_space_id}`,
307
387
  }),
308
388
  }),
309
389
  defineTool({
@@ -313,16 +393,18 @@ export const knowledgeTools = [
313
393
  defaultWorkspaceId: true,
314
394
  schema: z.object({
315
395
  workspace_id: uuidSchema.optional(),
316
- knowledge_space_id: uuidSchema,
396
+ knowledge_space_id: knowledgeSpaceIdSchema,
317
397
  name: z.string().min(1).max(100).optional(),
318
- access_mode: z.enum(['AUTO_QUERY', 'TOOL_ONLY']).optional(),
398
+ ...knowledgeSpaceSearchFields,
319
399
  }),
320
400
  createRequest: (input) => ({
321
401
  method: 'PATCH',
322
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}`,
402
+ path: `/knowledge-spaces/${input.knowledge_space_id}`,
323
403
  body: compactObject({
324
404
  name: input.name,
325
- access_mode: input.access_mode,
405
+ accessMode: input.access_mode,
406
+ purpose: input.purpose,
407
+ searchKeywords: input.search_keywords,
326
408
  }),
327
409
  }),
328
410
  }),
@@ -333,12 +415,13 @@ export const knowledgeTools = [
333
415
  defaultWorkspaceId: true,
334
416
  schema: z.object({
335
417
  workspace_id: uuidSchema.optional(),
336
- knowledge_space_id: uuidSchema,
418
+ knowledge_space_id: knowledgeSpaceIdSchema,
337
419
  channel_id: uuidSchema,
338
420
  }),
339
421
  createRequest: (input) => ({
340
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/channel-links`,
341
- body: { channel_id: input.channel_id },
422
+ method: 'PUT',
423
+ path: `/knowledge-spaces/${input.knowledge_space_id}/channel-links/${input.channel_id}`,
424
+ body: {},
342
425
  }),
343
426
  }),
344
427
  defineTool({
@@ -348,39 +431,32 @@ export const knowledgeTools = [
348
431
  defaultWorkspaceId: true,
349
432
  schema: z.object({
350
433
  workspace_id: uuidSchema.optional(),
351
- knowledge_space_id: uuidSchema,
434
+ knowledge_space_id: knowledgeSpaceIdSchema,
352
435
  channel_id: uuidSchema,
353
436
  }),
354
437
  createRequest: (input) => ({
355
438
  method: 'DELETE',
356
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/channel-links/${input.channel_id}`,
439
+ path: `/knowledge-spaces/${input.knowledge_space_id}/channel-links/${input.channel_id}`,
357
440
  }),
358
441
  }),
359
442
  // v1.5 — Knowledge Documents (Increment 1): загрузка/удаление документов в space
360
443
  defineTool({
361
444
  name: 'besales_knowledge_document_upload',
362
- sideEffect: 'write',
445
+ sideEffect: 'spend',
363
446
  requiredFields: ['knowledge_space_id', 'source_kind'],
364
447
  defaultWorkspaceId: true,
365
448
  schema: z
366
449
  .object({
367
450
  workspace_id: uuidSchema.optional(),
368
- knowledge_space_id: uuidSchema,
451
+ knowledge_space_id: knowledgeSpaceIdSchema,
369
452
  source_kind: z.enum(['STORED_FILE', 'TEXT']),
370
453
  stored_file_id: uuidSchema.optional(),
371
454
  content: z.string().optional(),
372
455
  filename: z.string().optional(),
373
- split_override: z
374
- .object({
375
- split_mode: z.enum(['size', 'separator']),
376
- separator: z.string().optional(),
377
- chunk_size: z.number().int().min(100).optional(),
378
- chunk_overlap: z.number().int().min(0).optional(),
379
- max_chunk_size: z.number().int().min(100).optional(),
380
- })
381
- .optional(),
456
+ split_override: splitOverrideSchema.optional(),
382
457
  })
383
458
  .superRefine((value, ctx) => {
459
+ refineSplitOverride(value.split_override, ctx);
384
460
  if (value.source_kind === 'STORED_FILE' && !value.stored_file_id) {
385
461
  ctx.addIssue({
386
462
  code: z.ZodIssueCode.custom,
@@ -393,30 +469,49 @@ export const knowledgeTools = [
393
469
  message: 'content и filename обязательны для source_kind=TEXT',
394
470
  });
395
471
  }
472
+ else if (value.source_kind === 'TEXT' && value.content.trim() === '') {
473
+ // Как у прежней системы: пустой текст — отказ, а не документ (и не замена рабочего документа пустотой).
474
+ ctx.addIssue({
475
+ code: z.ZodIssueCode.custom,
476
+ path: ['content'],
477
+ message: 'content не может состоять из одних пробелов',
478
+ });
479
+ }
396
480
  }),
397
- createRequest: (input) => ({
398
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/documents`,
399
- body: compactObject({
400
- source_kind: input.source_kind,
401
- stored_file_id: input.stored_file_id,
402
- content: input.content,
403
- filename: input.filename,
404
- split_override: input.split_override
405
- ? compactObject({
406
- split_mode: input.split_override.split_mode,
407
- separator: input.split_override.separator,
408
- chunk_size: input.split_override.chunk_size,
409
- chunk_overlap: input.split_override.chunk_overlap,
410
- max_chunk_size: input.split_override.max_chunk_size,
411
- })
412
- : undefined,
413
- }),
414
- }),
481
+ createRequest: (input) => {
482
+ const chunking = input.split_override ? toV2Chunking(input.split_override) : undefined;
483
+ // Файл библиотеки: сервер копирует тело в собственный файл документа; content и filename не читаются (как у
484
+ // прежней системы — имя документа берётся из имени файла).
485
+ if (input.source_kind === 'STORED_FILE') {
486
+ return {
487
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/document/from-file`,
488
+ body: compactObject({ storedFileId: input.stored_file_id, chunking }),
489
+ };
490
+ }
491
+ const filename = input.filename ?? 'document.txt';
492
+ const body = new FormData();
493
+ body.append('name', filename);
494
+ // Как у прежней системы: повтор текста с тем же именем даёт документу новое содержимое, а не второй документ.
495
+ // Сервер заменяет текстом только документ, созданный ассистентом (текстом, из файла библиотеки, из вкладки книги):
496
+ // документ с тем же именем, загруженный человеком файлом, — отказ 409.
497
+ body.append('replaceExisting', 'true');
498
+ // ⛔ Правила — ОДНИМ полем JSON: плоское поле формы уходит с заменой перевода строки на «возврат каретки +
499
+ // перевод строки», и разделитель вида «\\n## » пришёл бы на сервер изменённым.
500
+ if (chunking !== undefined)
501
+ body.append('chunking', JSON.stringify(chunking));
502
+ body.append('file', new Blob([input.content ?? ''], { type: 'text/plain;charset=utf-8' }), filename);
503
+ return {
504
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/document`,
505
+ body,
506
+ };
507
+ },
415
508
  enhanceResponse: (response) => withInstructions(response, [
416
- 'Document uploaded. Processing is async — статус движется PENDING → COMPLETED либо FAILED.',
417
- 'Опрашивай статус через besales_knowledge_document_get пока status=COMPLETED.',
418
- 'Для TEXT source_kind при повторном вызове с тем же filename — старый документ заменяется (document_replaced=true).',
419
- 'Binary файлы (PDF/DOCX) — загрузи сначала через POST /api/v2/files отдельно, затем передай stored_file_id сюда.',
509
+ 'outcome=CREATED — документ создан в статусе PENDING; outcome=CONTENT_REPLACED — у текстового документа с тем же именем заменено содержимое (document_replaced прежней системы). Индексация асинхронна.',
510
+ 'Создание: опрашивай besales_knowledge_document_get до status=ACTIVE, FAILED либо EMPTY. EMPTY — в файле не нашлось текста (например, скан без текстового слоя): такой документ ничего не отвечает — удали его и загрузи файл с текстом.',
511
+ 'Замена: status остаётся ACTIVE и во время переиндексации, и после её провала — по статусу замену не проверить. Новый текст отвечает, когда lastIndexedAt станет позже updatedAt из этого ответа; непустой errorMessage — переиндексация не удалась, отвечает прежний текст. Не сообщай «новый текст в базе знаний», пока lastIndexedAt не обновился.',
512
+ 'Текстом заменяется документ, созданный ассистентом: текстом этого инструмента, из файла библиотеки (source_kind=STORED_FILE) или из вкладки книги. Документ с тем же именем, загруженный человеком файлом через интерфейс (в том числе .txt или .md), — отказ 409 KNOWLEDGE_REPLACE_TARGET_UPLOADED; выбери другое имя или удали документ.',
513
+ 'Файл из библиотеки: besales_file_upload_request → besales_file_upload_status (READY → stored_file_id) → этот инструмент с source_kind=STORED_FILE. Имя документа — имя файла; документ с таким именем уже есть — отказ 409 «имя занято»: удали его либо загрузи файл под другим именем. В знания идёт только файл библиотеки: присланный человеком в переписке и пришедший из CRM — отказ (знания видят все клиенты).',
514
+ 'split_override задаёт правила разбиения этого документа: size — по размеру куска, separator — по разделителю (раздел длиннее max_chunk_size дорезается). Без split_override — правила по умолчанию.',
420
515
  ]),
421
516
  }),
422
517
  defineTool({
@@ -427,8 +522,9 @@ export const knowledgeTools = [
427
522
  requiredFields: ['knowledge_space_id'],
428
523
  defaultWorkspaceId: true,
429
524
  schema: z.object({
525
+ page: retiredKnowledgePageSchema,
430
526
  workspace_id: uuidSchema.optional(),
431
- knowledge_space_id: uuidSchema,
527
+ knowledge_space_id: knowledgeSpaceIdSchema,
432
528
  status: z
433
529
  .enum([
434
530
  'LOADED',
@@ -441,12 +537,12 @@ export const knowledgeTools = [
441
537
  'CHUNKS_SAVED',
442
538
  ])
443
539
  .optional(),
444
- page: z.number().int().min(1).optional(),
540
+ cursor: z.string().min(1).optional(),
445
541
  limit: z.number().int().min(1).max(100).optional(),
446
542
  }),
447
543
  createRequest: (input) => ({
448
544
  method: 'GET',
449
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/documents${buildListQuery({ status: input.status, page: input.page, limit: input.limit })}`,
545
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources${buildSourceListQuery('DOCUMENT', { status: mapDocumentStatus(input.status), limit: input.limit, cursor: input.cursor })}`,
450
546
  }),
451
547
  }),
452
548
  defineTool({
@@ -456,12 +552,12 @@ export const knowledgeTools = [
456
552
  defaultWorkspaceId: true,
457
553
  schema: z.object({
458
554
  workspace_id: uuidSchema.optional(),
459
- knowledge_space_id: uuidSchema,
555
+ knowledge_space_id: knowledgeSpaceIdSchema,
460
556
  document_id: uuidSchema,
461
557
  }),
462
558
  createRequest: (input) => ({
463
559
  method: 'GET',
464
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/documents/${input.document_id}`,
560
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.document_id}`,
465
561
  }),
466
562
  }),
467
563
  defineTool({
@@ -471,25 +567,24 @@ export const knowledgeTools = [
471
567
  defaultWorkspaceId: true,
472
568
  schema: z.object({
473
569
  workspace_id: uuidSchema.optional(),
474
- knowledge_space_id: uuidSchema,
570
+ knowledge_space_id: knowledgeSpaceIdSchema,
475
571
  document_id: uuidSchema,
476
572
  explicit_confirmation: z.literal(true),
477
573
  }),
478
574
  createRequest: (input) => ({
479
575
  method: 'DELETE',
480
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/documents/${input.document_id}`,
481
- body: { explicit_confirmation: input.explicit_confirmation },
576
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.document_id}`,
482
577
  }),
483
578
  }),
484
579
  // ----- v1.5 Increment 2: Q&A CRUD (7 tools) -----
485
580
  defineTool({
486
581
  name: 'besales_knowledge_qa_create',
487
- sideEffect: 'write',
582
+ sideEffect: 'spend',
488
583
  requiredFields: ['knowledge_space_id', 'question'],
489
584
  defaultWorkspaceId: true,
490
585
  schema: z.object({
491
586
  workspace_id: uuidSchema.optional(),
492
- knowledge_space_id: uuidSchema,
587
+ knowledge_space_id: knowledgeSpaceIdSchema,
493
588
  question: z.string().min(1),
494
589
  answer: z.string().optional(),
495
590
  answer_chunks: z
@@ -509,22 +604,25 @@ export const knowledgeTools = [
509
604
  is_call_qa_only: z.boolean().optional(),
510
605
  }),
511
606
  createRequest: (input) => ({
512
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs`,
513
- body: compactObject({
514
- question: input.question,
515
- answer: input.answer,
516
- answer_chunks: input.answer_chunks,
517
- alias: input.alias,
518
- mode: input.mode,
519
- call_operator: input.call_operator,
520
- chunk_delay_seconds: input.chunk_delay_seconds,
521
- is_call_qa_only: input.is_call_qa_only,
522
- }),
607
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources`,
608
+ body: {
609
+ sourceType: 'QA',
610
+ name: deriveQaSourceName(input.question),
611
+ qa: compactObject({
612
+ question: input.question,
613
+ alias: input.alias,
614
+ mode: input.mode ?? 'SIMPLE',
615
+ callOperator: input.call_operator,
616
+ chunkDelaySeconds: input.chunk_delay_seconds,
617
+ isCallQaOnly: input.is_call_qa_only,
618
+ answerChunks: mapQaAnswerChunks(input.answer_chunks, input.answer, true),
619
+ }),
620
+ },
523
621
  }),
524
622
  enhanceResponse: (response) => withInstructions(response, [
525
- 'Q&A создана. Embedding для вопроса генерируется sync — статус COMPLETED в большинстве случаев сразу.',
526
- 'mode=SIMPLE с одним чанком → используется с RAG; STRICT — только QA-промпт без RAG; ONCE_STRICT — первый раз STRICT, далее как контекст.',
527
- 'is_call_qa_only=true → QA не векторизуется, доступна только через call_qa tool.',
623
+ 'QA source создан в статусе PENDING; индексация выполняется асинхронно.',
624
+ 'mode=SIMPLE участвует в обычном retrieval; STRICT/ONCE_STRICT сохраняют специальную QA-семантику.',
625
+ 'is_call_qa_only=true исключает source из auto-retrieval.',
528
626
  ]),
529
627
  }),
530
628
  defineTool({
@@ -535,15 +633,16 @@ export const knowledgeTools = [
535
633
  requiredFields: ['knowledge_space_id'],
536
634
  defaultWorkspaceId: true,
537
635
  schema: z.object({
636
+ page: retiredKnowledgePageSchema,
538
637
  workspace_id: uuidSchema.optional(),
539
- knowledge_space_id: uuidSchema,
638
+ knowledge_space_id: knowledgeSpaceIdSchema,
540
639
  mode: z.enum(['SIMPLE', 'STRICT', 'ONCE_STRICT']).optional(),
541
- page: z.number().int().min(1).optional(),
640
+ cursor: z.string().min(1).optional(),
542
641
  limit: z.number().int().min(1).max(100).optional(),
543
642
  }),
544
643
  createRequest: (input) => ({
545
644
  method: 'GET',
546
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs${buildListQuery({ mode: input.mode, page: input.page, limit: input.limit })}`,
645
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources${buildSourceListQuery('QA', { qaMode: input.mode, limit: input.limit, cursor: input.cursor })}`,
547
646
  }),
548
647
  }),
549
648
  defineTool({
@@ -553,12 +652,12 @@ export const knowledgeTools = [
553
652
  defaultWorkspaceId: true,
554
653
  schema: z.object({
555
654
  workspace_id: uuidSchema.optional(),
556
- knowledge_space_id: uuidSchema,
655
+ knowledge_space_id: knowledgeSpaceIdSchema,
557
656
  qa_id: uuidSchema,
558
657
  }),
559
658
  createRequest: (input) => ({
560
659
  method: 'GET',
561
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs/${input.qa_id}`,
660
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.qa_id}`,
562
661
  }),
563
662
  }),
564
663
  defineTool({
@@ -568,14 +667,17 @@ export const knowledgeTools = [
568
667
  defaultWorkspaceId: true,
569
668
  schema: z.object({
570
669
  workspace_id: uuidSchema.optional(),
571
- knowledge_space_id: uuidSchema,
670
+ knowledge_space_id: knowledgeSpaceIdSchema,
572
671
  qa_id: uuidSchema,
573
672
  question: z.string().min(1).optional(),
574
673
  answer: z.string().optional(),
575
674
  answer_chunks: z
576
675
  .array(z.object({
577
676
  text: z.string().optional(),
578
- stored_file_id: uuidSchema.optional(),
677
+ // ⛔ nullable, а не только optional: «ключ не прислан» = не менять, а `null` =
678
+ // СНЯТЬ вложение. Без null снять его было нечем — схема отвергала значение до
679
+ // отправки, и построенного пути открепления у клиента не существовало вовсе.
680
+ stored_file_id: uuidSchema.nullable().optional(),
579
681
  buttons: z
580
682
  .array(z.object({ name: z.string().min(1), url: z.string().min(1) }))
581
683
  .optional(),
@@ -590,17 +692,18 @@ export const knowledgeTools = [
590
692
  }),
591
693
  createRequest: (input) => ({
592
694
  method: 'PATCH',
593
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs/${input.qa_id}`,
594
- body: compactObject({
595
- question: input.question,
596
- answer: input.answer,
597
- answer_chunks: input.answer_chunks,
598
- alias: input.alias,
599
- mode: input.mode,
600
- call_operator: input.call_operator,
601
- chunk_delay_seconds: input.chunk_delay_seconds,
602
- is_call_qa_only: input.is_call_qa_only,
603
- }),
695
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.qa_id}`,
696
+ body: {
697
+ qa: compactObject({
698
+ question: input.question,
699
+ alias: input.alias,
700
+ mode: input.mode,
701
+ callOperator: input.call_operator,
702
+ chunkDelaySeconds: input.chunk_delay_seconds,
703
+ isCallQaOnly: input.is_call_qa_only,
704
+ answerChunks: mapQaAnswerChunks(input.answer_chunks, input.answer, false),
705
+ }),
706
+ },
604
707
  }),
605
708
  }),
606
709
  defineTool({
@@ -610,35 +713,34 @@ export const knowledgeTools = [
610
713
  defaultWorkspaceId: true,
611
714
  schema: z.object({
612
715
  workspace_id: uuidSchema.optional(),
613
- knowledge_space_id: uuidSchema,
716
+ knowledge_space_id: knowledgeSpaceIdSchema,
614
717
  qa_id: uuidSchema,
615
718
  explicit_confirmation: z.literal(true),
616
719
  }),
617
720
  createRequest: (input) => ({
618
721
  method: 'DELETE',
619
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs/${input.qa_id}`,
620
- body: { explicit_confirmation: input.explicit_confirmation },
722
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.qa_id}`,
621
723
  }),
622
724
  }),
623
725
  defineTool({
624
726
  name: 'besales_knowledge_qa_search',
625
727
  sideEffect: 'none',
626
- closedWorld: true,
627
728
  requiredFields: ['knowledge_space_id', 'query'],
628
729
  defaultWorkspaceId: true,
629
730
  schema: z.object({
630
731
  workspace_id: uuidSchema.optional(),
631
- knowledge_space_id: uuidSchema,
732
+ knowledge_space_id: knowledgeSpaceIdSchema,
632
733
  query: z.string().min(1),
633
734
  top_k: z.number().int().min(1).max(50).optional(),
634
735
  min_score: z.number().optional(),
635
736
  }),
636
737
  createRequest: (input) => ({
637
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/qa-pairs/search`,
738
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/search`,
638
739
  body: compactObject({
639
740
  query: input.query,
640
- top_k: input.top_k,
641
- min_score: input.min_score,
741
+ sourceType: 'QA',
742
+ topK: input.top_k,
743
+ minScore: input.min_score,
642
744
  }),
643
745
  }),
644
746
  }),
@@ -649,47 +751,46 @@ export const knowledgeTools = [
649
751
  defaultWorkspaceId: true,
650
752
  schema: z.object({
651
753
  workspace_id: uuidSchema.optional(),
652
- source_space_id: uuidSchema,
754
+ source_space_id: knowledgeSpaceIdSchema,
653
755
  qa_id: uuidSchema,
654
- target_space_id: uuidSchema,
756
+ target_space_id: knowledgeSpaceIdSchema,
655
757
  explicit_confirmation: z.literal(true),
656
758
  }),
657
759
  createRequest: (input) => ({
658
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.source_space_id}/qa-pairs/${input.qa_id}/move`,
760
+ path: `/knowledge-spaces/${input.source_space_id}/sources/${input.qa_id}/move`,
659
761
  body: {
660
- target_space_id: input.target_space_id,
661
- explicit_confirmation: input.explicit_confirmation,
762
+ targetSpaceId: input.target_space_id,
662
763
  },
663
764
  }),
664
765
  enhanceResponse: (response) => withInstructions(response, [
665
- 'Move = delete + recreate в новом knowledge space. Возвращается новый ID — обнови ссылки в caller-коде.',
666
- 'Pinecone vectors переиндексируются: старый embedding удаляется из source namespace, новый создаётся в target.',
667
- 'Alias НЕ переносится (unique-per-workspace constraint).',
766
+ 'Источник перенесён транзакционно в новый knowledge space.',
767
+ 'ID источника, alias и существующие chunks сохраняются; ссылки обновлять не нужно.',
768
+ 'Перенос не запускает переиндексацию.',
668
769
  ]),
669
770
  }),
670
771
  // ----- v1.5 Increment 2: Websites (4 tools) -----
671
772
  defineTool({
672
773
  name: 'besales_knowledge_website_add',
673
- sideEffect: 'write',
774
+ sideEffect: 'spend',
674
775
  requiredFields: ['knowledge_space_id', 'url'],
675
776
  defaultWorkspaceId: true,
676
777
  schema: z.object({
677
778
  workspace_id: uuidSchema.optional(),
678
- knowledge_space_id: uuidSchema,
779
+ knowledge_space_id: knowledgeSpaceIdSchema,
679
780
  url: z.string().url(),
680
781
  display_name: z.string().optional(),
681
782
  }),
682
783
  createRequest: (input) => ({
683
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/websites`,
684
- body: compactObject({
685
- url: input.url,
686
- display_name: input.display_name,
687
- }),
784
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources`,
785
+ body: {
786
+ sourceType: 'WEBSITE',
787
+ name: input.display_name ?? input.url,
788
+ website: { url: input.url },
789
+ },
688
790
  }),
689
791
  enhanceResponse: (response) => withInstructions(response, [
690
- 'SYNC operation — может занять несколько секунд для краулинга + chunking + Pinecone upsert.',
691
- 'Idempotency: повторный POST с тем же URL вернёт existing site, replaced=true. FAILED перезапускается автоматически.',
692
- 'Status: PENDING → CRAWLING → PROCESSING → COMPLETED | FAILED.',
792
+ 'WEBSITE source создан в статусе PENDING; crawl и индексация выполняются асинхронно.',
793
+ 'Опрашивай besales_knowledge_website_get до status=ACTIVE либо FAILED.',
693
794
  ]),
694
795
  }),
695
796
  defineTool({
@@ -700,15 +801,16 @@ export const knowledgeTools = [
700
801
  requiredFields: ['knowledge_space_id'],
701
802
  defaultWorkspaceId: true,
702
803
  schema: z.object({
804
+ page: retiredKnowledgePageSchema,
703
805
  workspace_id: uuidSchema.optional(),
704
- knowledge_space_id: uuidSchema,
806
+ knowledge_space_id: knowledgeSpaceIdSchema,
705
807
  status: z.enum(['PENDING', 'CRAWLING', 'PROCESSING', 'COMPLETED', 'FAILED']).optional(),
706
- page: z.number().int().min(1).optional(),
808
+ cursor: z.string().min(1).optional(),
707
809
  limit: z.number().int().min(1).max(100).optional(),
708
810
  }),
709
811
  createRequest: (input) => ({
710
812
  method: 'GET',
711
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/websites${buildListQuery({ status: input.status, page: input.page, limit: input.limit })}`,
813
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources${buildSourceListQuery('WEBSITE', { status: mapWebsiteStatus(input.status), limit: input.limit, cursor: input.cursor })}`,
712
814
  }),
713
815
  }),
714
816
  defineTool({
@@ -718,12 +820,12 @@ export const knowledgeTools = [
718
820
  defaultWorkspaceId: true,
719
821
  schema: z.object({
720
822
  workspace_id: uuidSchema.optional(),
721
- knowledge_space_id: uuidSchema,
823
+ knowledge_space_id: knowledgeSpaceIdSchema,
722
824
  website_id: uuidSchema,
723
825
  }),
724
826
  createRequest: (input) => ({
725
827
  method: 'GET',
726
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/websites/${input.website_id}`,
828
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.website_id}`,
727
829
  }),
728
830
  }),
729
831
  defineTool({
@@ -733,14 +835,13 @@ export const knowledgeTools = [
733
835
  defaultWorkspaceId: true,
734
836
  schema: z.object({
735
837
  workspace_id: uuidSchema.optional(),
736
- knowledge_space_id: uuidSchema,
838
+ knowledge_space_id: knowledgeSpaceIdSchema,
737
839
  website_id: uuidSchema,
738
840
  explicit_confirmation: z.literal(true),
739
841
  }),
740
842
  createRequest: (input) => ({
741
843
  method: 'DELETE',
742
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/websites/${input.website_id}`,
743
- body: { explicit_confirmation: input.explicit_confirmation },
844
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.website_id}`,
744
845
  }),
745
846
  }),
746
847
  // ============================================================
@@ -748,12 +849,12 @@ export const knowledgeTools = [
748
849
  // ============================================================
749
850
  defineTool({
750
851
  name: 'besales_knowledge_table_link',
751
- sideEffect: 'write',
852
+ sideEffect: 'spend',
752
853
  requiredFields: ['knowledge_space_id', 'source', 'display_name'],
753
854
  defaultWorkspaceId: true,
754
855
  schema: z.object({
755
856
  workspace_id: uuidSchema.optional(),
756
- knowledge_space_id: uuidSchema,
857
+ knowledge_space_id: knowledgeSpaceIdSchema,
757
858
  source: knowledgeTableSourceSchema,
758
859
  display_name: z.string(),
759
860
  header_row_index: z.number().int().min(1).optional(),
@@ -765,25 +866,26 @@ export const knowledgeTools = [
765
866
  }),
766
867
  createRequest: (input) => ({
767
868
  method: 'POST',
768
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables`,
769
- body: compactObject({
770
- source: {
771
- kind: input.source.kind,
772
- spreadsheet_url: input.source.spreadsheet_url,
773
- table_schema: input.source.table_schema,
774
- },
775
- display_name: input.display_name,
776
- header_row_index: input.header_row_index,
777
- cache_ttl_seconds: input.cache_ttl_seconds,
778
- use_vector_index: input.use_vector_index,
779
- vector_top_k: input.vector_top_k,
780
- vector_embed_max_chars: input.vector_embed_max_chars,
781
- access: input.access,
782
- }),
869
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources`,
870
+ body: {
871
+ sourceType: 'TABLE',
872
+ name: input.display_name,
873
+ table: compactObject({
874
+ tableName: input.display_name,
875
+ type: 'GOOGLE_SHEETS',
876
+ url: input.source.spreadsheet_url,
877
+ access: input.access,
878
+ headerRowIndex: input.header_row_index === undefined ? undefined : input.header_row_index - 1,
879
+ cacheTtlSeconds: input.cache_ttl_seconds,
880
+ useVectorIndex: input.use_vector_index,
881
+ vectorTopK: input.vector_top_k,
882
+ vectorEmbedMaxChars: input.vector_embed_max_chars,
883
+ }),
884
+ },
783
885
  }),
784
886
  enhanceResponse: (response) => withInstructions(response, [
785
- 'Knowledge table связана. Если URL уже существовал, replaced=true (idempotency by namespace+url).',
786
- 'Для индексации в Pinecone установи use_vector_index=true и вызови besales_knowledge_table_reindex.',
887
+ 'TABLE source создан в статусе PENDING.',
888
+ 'Для row-level vector retrieval включи use_vector_index и вызови besales_knowledge_table_reindex.',
787
889
  ]),
788
890
  }),
789
891
  defineTool({
@@ -794,15 +896,16 @@ export const knowledgeTools = [
794
896
  requiredFields: ['knowledge_space_id'],
795
897
  defaultWorkspaceId: true,
796
898
  schema: z.object({
899
+ page: retiredKnowledgePageSchema,
797
900
  workspace_id: uuidSchema.optional(),
798
- knowledge_space_id: uuidSchema,
901
+ knowledge_space_id: knowledgeSpaceIdSchema,
799
902
  is_active: z.boolean().optional(),
800
- page: z.number().int().min(1).optional(),
903
+ cursor: z.string().min(1).optional(),
801
904
  limit: z.number().int().min(1).max(100).optional(),
802
905
  }),
803
906
  createRequest: (input) => ({
804
907
  method: 'GET',
805
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables${buildListQuery({ is_active: input.is_active, page: input.page, limit: input.limit })}`,
908
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources${buildSourceListQuery('TABLE', { isActive: input.is_active, limit: input.limit, cursor: input.cursor })}`,
806
909
  }),
807
910
  }),
808
911
  defineTool({
@@ -812,12 +915,12 @@ export const knowledgeTools = [
812
915
  defaultWorkspaceId: true,
813
916
  schema: z.object({
814
917
  workspace_id: uuidSchema.optional(),
815
- knowledge_space_id: uuidSchema,
918
+ knowledge_space_id: knowledgeSpaceIdSchema,
816
919
  table_id: uuidSchema,
817
920
  }),
818
921
  createRequest: (input) => ({
819
922
  method: 'GET',
820
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables/${input.table_id}`,
923
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.table_id}`,
821
924
  }),
822
925
  }),
823
926
  defineTool({
@@ -827,9 +930,9 @@ export const knowledgeTools = [
827
930
  defaultWorkspaceId: true,
828
931
  schema: z.object({
829
932
  workspace_id: uuidSchema.optional(),
830
- knowledge_space_id: uuidSchema,
933
+ knowledge_space_id: knowledgeSpaceIdSchema,
831
934
  table_id: uuidSchema,
832
- // source присутствует только для validation (URL иммутабельный).
935
+ // NATIVE/table_schema остаются неподдержанными, GOOGLE_SHEETS URL патчабелен.
833
936
  source: knowledgeTableSourceSchema.optional(),
834
937
  display_name: z.string().optional(),
835
938
  header_row_index: z.number().int().min(1).optional(),
@@ -840,29 +943,29 @@ export const knowledgeTools = [
840
943
  access: z.enum(['PUBLIC', 'PRIVATE']).optional(),
841
944
  is_active: z.boolean().optional(),
842
945
  }),
843
- createRequest: (input) => ({
844
- method: 'PATCH',
845
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables/${input.table_id}`,
846
- body: compactObject({
847
- source: input.source
848
- ? {
849
- kind: input.source.kind,
850
- spreadsheet_url: input.source.spreadsheet_url,
851
- table_schema: input.source.table_schema,
852
- }
853
- : undefined,
854
- display_name: input.display_name,
855
- header_row_index: input.header_row_index,
856
- cache_ttl_seconds: input.cache_ttl_seconds,
857
- use_vector_index: input.use_vector_index,
858
- vector_top_k: input.vector_top_k,
859
- vector_embed_max_chars: input.vector_embed_max_chars,
860
- access: input.access,
861
- is_active: input.is_active,
862
- }),
863
- }),
946
+ createRequest: (input) => {
947
+ return {
948
+ method: 'PATCH',
949
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.table_id}`,
950
+ body: compactObject({
951
+ name: input.display_name,
952
+ table: compactObject({
953
+ tableName: input.display_name,
954
+ type: input.source?.kind,
955
+ url: input.source?.spreadsheet_url,
956
+ access: input.access,
957
+ headerRowIndex: input.header_row_index === undefined ? undefined : input.header_row_index - 1,
958
+ cacheTtlSeconds: input.cache_ttl_seconds,
959
+ useVectorIndex: input.use_vector_index,
960
+ vectorTopK: input.vector_top_k,
961
+ vectorEmbedMaxChars: input.vector_embed_max_chars,
962
+ isActive: input.is_active,
963
+ }),
964
+ }),
965
+ };
966
+ },
864
967
  enhanceResponse: (response) => withInstructions(response, [
865
- 'source.url иммутабельный — для смены URL используй delete + create.',
968
+ 'source.spreadsheet_url обновляет URL существующей GOOGLE_SHEETS-таблицы.',
866
969
  ]),
867
970
  }),
868
971
  defineTool({
@@ -872,36 +975,33 @@ export const knowledgeTools = [
872
975
  defaultWorkspaceId: true,
873
976
  schema: z.object({
874
977
  workspace_id: uuidSchema.optional(),
875
- knowledge_space_id: uuidSchema,
978
+ knowledge_space_id: knowledgeSpaceIdSchema,
876
979
  table_id: uuidSchema,
877
980
  explicit_confirmation: z.literal(true),
878
981
  }),
879
982
  createRequest: (input) => ({
880
983
  method: 'DELETE',
881
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables/${input.table_id}`,
882
- body: { explicit_confirmation: input.explicit_confirmation },
984
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.table_id}`,
883
985
  }),
884
986
  }),
885
987
  defineTool({
886
988
  name: 'besales_knowledge_table_reindex',
887
- sideEffect: 'spend',
888
989
  verifyWithToolName: 'besales_knowledge_table_reindex_status',
990
+ sideEffect: 'spend',
889
991
  requiredFields: ['knowledge_space_id', 'table_id', 'explicit_confirmation'],
890
992
  defaultWorkspaceId: true,
891
993
  schema: z.object({
892
994
  workspace_id: uuidSchema.optional(),
893
- knowledge_space_id: uuidSchema,
995
+ knowledge_space_id: knowledgeSpaceIdSchema,
894
996
  table_id: uuidSchema,
895
997
  explicit_confirmation: z.literal(true),
896
998
  }),
897
999
  createRequest: (input) => ({
898
1000
  method: 'POST',
899
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables/${input.table_id}/reindex`,
900
- body: { explicit_confirmation: input.explicit_confirmation },
1001
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.table_id}/reindex`,
901
1002
  }),
902
1003
  enhanceResponse: (response) => withInstructions(response, [
903
- 'Полная переиндексация выполняется в фоне (delete vectors + re-fetch CSV + re-embed + upsert). Сохрани job_id из ответа.',
904
- 'Первую проверку сделай через 10–30 секунд через besales_knowledge_table_reindex_status; повторяй до COMPLETED, FAILED или EXPIRED.',
1004
+ 'Переиндексация поставлена в knowledge-indexing очередь; повторный живой job дедуплицируется.',
905
1005
  ]),
906
1006
  }),
907
1007
  defineTool({
@@ -911,38 +1011,46 @@ export const knowledgeTools = [
911
1011
  defaultWorkspaceId: true,
912
1012
  schema: z.object({
913
1013
  workspace_id: uuidSchema.optional(),
914
- knowledge_space_id: uuidSchema,
1014
+ knowledge_space_id: knowledgeSpaceIdSchema,
915
1015
  table_id: uuidSchema,
916
1016
  }),
917
1017
  createRequest: (input) => ({
918
1018
  method: 'GET',
919
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/tables/${input.table_id}/reindex/status`,
1019
+ path: `/knowledge-spaces/${input.knowledge_space_id}/sources/${input.table_id}/reindex/status`,
920
1020
  }),
921
1021
  enhanceResponse: (response) => withInstructions(response, [
922
- 'QUEUED/RUNNING — подожди 10–30 секунд и проверь снова. COMPLETED/FAILED/EXPIRED — терминальные состояния.',
923
- 'EXPIRED означает, что retained job уже удалён; не считай это доказательством успеха или ошибки.',
1022
+ 'QUEUED/RUNNING — подожди 10–30 секунд и спроси снова; COMPLETED/FAILED — исход известен.',
1023
+ // ⛔ Значение EXPIRED в v2 означает ДРУГОЕ, чем у прежнего сервера. Там оно означало «след
1024
+ // задания очереди уже удалён хранением», то есть исход неизвестен. Здесь статус считается
1025
+ // по прогону РЕСУРСА, и удержание задания на ответ не влияет: EXPIRED означает, что
1026
+ // переиндексации этой цели не было вовсе. Промолчав, инструмент склеил бы «не запускали» с
1027
+ // «не знаем» — за первым идут и запускают, за вторым ждут.
1028
+ 'EXPIRED — прогона по этой цели нет: переиндексацию не запускали. Это не «исход неизвестен».',
924
1029
  ]),
925
1030
  }),
926
1031
  defineTool({
927
1032
  name: 'besales_knowledge_namespace_reindex',
928
- sideEffect: 'spend',
929
1033
  verifyWithToolName: 'besales_knowledge_namespace_reindex_status',
1034
+ sideEffect: 'spend',
1035
+ // Жёсткий гейт: переиндексация ВСЕГО пространства знаний — та же операция, что у одной
1036
+ // таблицы, только по всему набору источников. Гейт стоял на частном случае и отсутствовал
1037
+ // на общем.
930
1038
  requiredFields: ['knowledge_space_id', 'explicit_confirmation'],
931
1039
  defaultWorkspaceId: true,
932
1040
  schema: z.object({
933
1041
  workspace_id: uuidSchema.optional(),
934
- knowledge_space_id: uuidSchema,
1042
+ knowledge_space_id: knowledgeSpaceIdSchema,
935
1043
  types: z.array(z.enum(['qa', 'doc'])).optional(),
936
1044
  explicit_confirmation: z.literal(true),
937
1045
  }),
938
1046
  createRequest: (input) => ({
939
1047
  method: 'POST',
940
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/reindex`,
1048
+ path: `/knowledge-spaces/${input.knowledge_space_id}/reindex`,
941
1049
  body: compactObject({ types: input.types }),
942
1050
  }),
943
1051
  enhanceResponse: (response) => withInstructions(response, [
944
- 'Фоновый re-embed существующих Q&A + чанков документов из Postgres → Pinecone. Сохрани job_id из ответа. types опционально (по умолчанию qa+doc).',
945
- 'Первую проверку сделай через 10–30 секунд через besales_knowledge_namespace_reindex_status; повторяй до COMPLETED, FAILED или EXPIRED.',
1052
+ 'Фоновая переиндексация QA/DOCUMENT sources в pgvector через knowledge-indexing очередь.',
1053
+ 'types опционально; по умолчанию обрабатываются qa и doc. TABLE/WEBSITE не входят.',
946
1054
  ]),
947
1055
  }),
948
1056
  defineTool({
@@ -952,15 +1060,16 @@ export const knowledgeTools = [
952
1060
  defaultWorkspaceId: true,
953
1061
  schema: z.object({
954
1062
  workspace_id: uuidSchema.optional(),
955
- knowledge_space_id: uuidSchema,
1063
+ knowledge_space_id: knowledgeSpaceIdSchema,
956
1064
  }),
957
1065
  createRequest: (input) => ({
958
1066
  method: 'GET',
959
- path: `/workspaces/${input.workspace_id}/knowledge-spaces/${input.knowledge_space_id}/reindex/status`,
1067
+ path: `/knowledge-spaces/${input.knowledge_space_id}/reindex/status`,
960
1068
  }),
961
1069
  enhanceResponse: (response) => withInstructions(response, [
962
- 'QUEUED/RUNNING — подожди 10–30 секунд и проверь снова. COMPLETED/FAILED/EXPIRED — терминальные состояния.',
963
- 'После COMPLETED подожди eventual consistency Pinecone и проверь поиск чтением.',
1070
+ 'QUEUED/RUNNING — подожди 10–30 секунд и спроси снова; COMPLETED/FAILED — исход известен.',
1071
+ 'EXPIRED — прогона по этому пространству нет: переиндексацию не запускали. Это не «исход неизвестен».',
1072
+ 'progress считает ИСТОЧНИКИ прогона; removed — источники, удалённые или перенесённые во время него.',
964
1073
  ]),
965
1074
  }),
966
1075
  ];