@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.
- package/README.md +117 -163
- package/README.onprem.ru.md +35 -0
- package/bin/besales-mcp-http.js +9 -0
- package/bin/besales-onprem.mjs +19 -0
- package/dist/auth/connection-store.d.ts +3 -1
- package/dist/auth/connection-store.js +9 -3
- package/dist/auth/connection-store.js.map +1 -1
- package/dist/auth/oauth-client.d.ts +20 -27
- package/dist/auth/oauth-client.js +31 -23
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/auth/session-workspace.d.ts +1 -0
- package/dist/auth/session-workspace.js +10 -1
- package/dist/auth/session-workspace.js.map +1 -1
- package/dist/auth/token-storage.js +4 -1
- package/dist/auth/token-storage.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +80 -19
- package/dist/cli.js.map +1 -1
- package/dist/constants/crm-catalog.d.ts +2 -0
- package/dist/constants/crm-catalog.js +3 -0
- package/dist/constants/crm-catalog.js.map +1 -0
- package/dist/http/api-client.d.ts +54 -7
- package/dist/http/api-client.js +132 -66
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/feedback-document-error.d.ts +26 -0
- package/dist/http/feedback-document-error.js +22 -0
- package/dist/http/feedback-document-error.js.map +1 -0
- package/dist/http-server.d.ts +15 -0
- package/dist/http-server.js +378 -0
- package/dist/http-server.js.map +1 -0
- package/dist/instructions/server-instructions.d.ts +1 -1
- package/dist/instructions/server-instructions.js +6 -3
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/network/constants.d.ts +25 -0
- package/dist/network/constants.js +26 -0
- package/dist/network/constants.js.map +1 -0
- package/dist/network/failed-verifications.d.ts +10 -0
- package/dist/network/failed-verifications.js +37 -0
- package/dist/network/failed-verifications.js.map +1 -0
- package/dist/network/http-test-fixture.d.ts +3 -0
- package/dist/network/http-test-fixture.js +86 -0
- package/dist/network/http-test-fixture.js.map +1 -0
- package/dist/network/known-keys.d.ts +10 -0
- package/dist/network/known-keys.js +38 -0
- package/dist/network/known-keys.js.map +1 -0
- package/dist/network/memory-credentials.d.ts +11 -0
- package/dist/network/memory-credentials.js +24 -0
- package/dist/network/memory-credentials.js.map +1 -0
- package/dist/network/rate-limit.d.ts +23 -0
- package/dist/network/rate-limit.js +62 -0
- package/dist/network/rate-limit.js.map +1 -0
- package/dist/network/rejected-keys.d.ts +9 -0
- package/dist/network/rejected-keys.js +39 -0
- package/dist/network/rejected-keys.js.map +1 -0
- package/dist/network/request-work.d.ts +8 -0
- package/dist/network/request-work.js +20 -0
- package/dist/network/request-work.js.map +1 -0
- package/dist/network/successful-keys.d.ts +17 -0
- package/dist/network/successful-keys.js +47 -0
- package/dist/network/successful-keys.js.map +1 -0
- package/dist/resources/concepts/external-execution.md +3 -1
- package/dist/resources/concepts/feedback-sheets.md +21 -12
- package/dist/resources/concepts/icp.md +8 -1
- package/dist/resources/concepts/sandbox.md +15 -6
- package/dist/resources/concepts/triggers.md +43 -0
- package/dist/resources/concepts/workbook-classification.md +104 -50
- package/dist/resources/docs/agent-behavior.md +51 -382
- package/dist/resources/docs/campaigns.md +9 -16
- package/dist/resources/docs/crm-integration.md +39 -523
- package/dist/resources/docs/files-and-uploads.md +23 -286
- package/dist/resources/docs/follow-up.md +47 -12
- package/dist/resources/docs/knowledge-base.md +52 -521
- package/dist/resources/docs/pipeline-builder.md +26 -216
- package/dist/resources/docs/pipeline-settings-deep.md +27 -220
- package/dist/resources/docs/platforms.md +149 -519
- package/dist/resources/docs/prompt-anatomy.md +39 -285
- package/dist/resources/docs/routing.md +8 -16
- package/dist/resources/docs/trigger-actions.md +40 -24
- package/dist/resources/docs/variables.md +8 -12
- package/dist/resources/operator-edit.contract.d.ts +7 -0
- package/dist/resources/operator-edit.contract.js +8 -0
- package/dist/resources/operator-edit.contract.js.map +1 -0
- package/dist/resources/registry.js +20 -4
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/audit-dialogues.md +23 -12
- package/dist/resources/workflows/compare-models.md +6 -6
- package/dist/resources/workflows/connect-crm-from-scratch.md +15 -12
- package/dist/resources/workflows/connect-datasource-from-scratch.md +5 -4
- package/dist/resources/workflows/extract-from-document.md +8 -6
- package/dist/resources/workflows/operator-edit.md +15 -0
- package/dist/resources/workflows/platform-setup-from-scratch.md +59 -70
- package/dist/resources/workflows/production-readiness-check.md +25 -15
- package/dist/schemas/mcp-tools.json +12389 -6657
- package/dist/schemas/voice-actions-api.contract.json +248 -0
- package/dist/shared/constants/broadcast-reason.constants.d.ts +2 -0
- package/dist/shared/constants/broadcast-reason.constants.js +47 -0
- package/dist/shared/constants/broadcast-reason.constants.js.map +1 -0
- package/dist/shared/constants/crm-stage-pool.constants.d.ts +2 -0
- package/dist/shared/constants/crm-stage-pool.constants.js +3 -0
- package/dist/shared/constants/crm-stage-pool.constants.js.map +1 -0
- package/dist/shared/constants/followup-note.constants.d.ts +3 -0
- package/dist/shared/constants/followup-note.constants.js +4 -0
- package/dist/shared/constants/followup-note.constants.js.map +1 -0
- package/dist/shared/constants/followup-session.constants.d.ts +2 -0
- package/dist/shared/constants/followup-session.constants.js +3 -0
- package/dist/shared/constants/followup-session.constants.js.map +1 -0
- package/dist/shared/constants/funnel-analytics.constants.d.ts +2 -0
- package/dist/shared/constants/funnel-analytics.constants.js +3 -0
- package/dist/shared/constants/funnel-analytics.constants.js.map +1 -0
- package/dist/shared/constants/message-filter.constants.d.ts +7 -0
- package/dist/shared/constants/message-filter.constants.js +8 -0
- package/dist/shared/constants/message-filter.constants.js.map +1 -0
- package/dist/shared/utils/trigger-repeat-mapping.d.ts +72 -0
- package/dist/shared/utils/trigger-repeat-mapping.js +53 -0
- package/dist/shared/utils/trigger-repeat-mapping.js.map +1 -0
- package/dist/skills/besales-dialogue-audit/SKILL.md +31 -20
- package/dist/tasks/task-state-store.js +5 -0
- package/dist/tasks/task-state-store.js.map +1 -1
- package/dist/tools/annotations.js +4 -3
- package/dist/tools/annotations.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +81 -24
- package/dist/tools/definitions/agent-design.js +246 -90
- package/dist/tools/definitions/agent-design.js.map +1 -1
- package/dist/tools/definitions/agent-model-notice.d.ts +5 -0
- package/dist/tools/definitions/agent-model-notice.js +31 -0
- package/dist/tools/definitions/agent-model-notice.js.map +1 -0
- package/dist/tools/definitions/agent-models.d.ts +5 -0
- package/dist/tools/definitions/agent-models.js +26 -0
- package/dist/tools/definitions/agent-models.js.map +1 -0
- package/dist/tools/definitions/agent-settings.d.ts +85 -0
- package/dist/tools/definitions/agent-settings.js +187 -0
- package/dist/tools/definitions/agent-settings.js.map +1 -0
- package/dist/tools/definitions/ai-costs.d.ts +12 -0
- package/dist/tools/definitions/ai-costs.js +142 -0
- package/dist/tools/definitions/ai-costs.js.map +1 -0
- package/dist/tools/definitions/api-tool-request.d.ts +15 -0
- package/dist/tools/definitions/api-tool-request.js +2 -0
- package/dist/tools/definitions/api-tool-request.js.map +1 -0
- package/dist/tools/definitions/behavior-shipped-form.d.ts +182 -0
- package/dist/tools/definitions/behavior-shipped-form.js +185 -0
- package/dist/tools/definitions/behavior-shipped-form.js.map +1 -0
- package/dist/tools/definitions/broadcast-alerts.d.ts +6 -0
- package/dist/tools/definitions/broadcast-alerts.js +72 -0
- package/dist/tools/definitions/broadcast-alerts.js.map +1 -0
- package/dist/tools/definitions/broadcast-analytics.d.ts +102 -18
- package/dist/tools/definitions/broadcast-analytics.js +732 -431
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +10 -13
- package/dist/tools/definitions/broadcast-scheduler.js +196 -154
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
- package/dist/tools/definitions/call-operator-task.schema.d.ts +11 -0
- package/dist/tools/definitions/call-operator-task.schema.js +30 -0
- package/dist/tools/definitions/call-operator-task.schema.js.map +1 -0
- package/dist/tools/definitions/contacts.d.ts +3 -0
- package/dist/tools/definitions/contacts.js +57 -31
- package/dist/tools/definitions/contacts.js.map +1 -1
- package/dist/tools/definitions/crm-platform.d.ts +29 -39
- package/dist/tools/definitions/crm-platform.js +249 -352
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/crm-stage-pool.messages.d.ts +39 -0
- package/dist/tools/definitions/crm-stage-pool.messages.js +43 -0
- package/dist/tools/definitions/crm-stage-pool.messages.js.map +1 -0
- package/dist/tools/definitions/crm-stage-pool.schema.d.ts +64 -0
- package/dist/tools/definitions/crm-stage-pool.schema.js +109 -0
- package/dist/tools/definitions/crm-stage-pool.schema.js.map +1 -0
- package/dist/tools/definitions/custom-reports.d.ts +12 -0
- package/dist/tools/definitions/custom-reports.js +68 -0
- package/dist/tools/definitions/custom-reports.js.map +1 -0
- package/dist/tools/definitions/datasource.d.ts +2 -1
- package/dist/tools/definitions/datasource.js +28 -13
- package/dist/tools/definitions/datasource.js.map +1 -1
- package/dist/tools/definitions/dialog-review-findings-response.d.ts +14 -0
- package/dist/tools/definitions/dialog-review-findings-response.js +23 -0
- package/dist/tools/definitions/dialog-review-findings-response.js.map +1 -0
- package/dist/tools/definitions/dialog-review-safe-response.d.ts +5 -0
- package/dist/tools/definitions/dialog-review-safe-response.js +152 -0
- package/dist/tools/definitions/dialog-review-safe-response.js.map +1 -0
- package/dist/tools/definitions/dialog-review.d.ts +49 -0
- package/dist/tools/definitions/dialog-review.js +383 -0
- package/dist/tools/definitions/dialog-review.js.map +1 -0
- package/dist/tools/definitions/dialogue-analysis.d.ts +46 -0
- package/dist/tools/definitions/dialogue-analysis.js +170 -0
- package/dist/tools/definitions/dialogue-analysis.js.map +1 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.d.ts +7 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.js +41 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.js.map +1 -0
- package/dist/tools/definitions/dialogue-audit-alias.d.ts +67 -0
- package/dist/tools/definitions/dialogue-audit-alias.js +559 -0
- package/dist/tools/definitions/dialogue-audit-alias.js.map +1 -0
- package/dist/tools/definitions/dialogue-export.d.ts +7 -1
- package/dist/tools/definitions/dialogue-export.js +89 -32
- package/dist/tools/definitions/dialogue-export.js.map +1 -1
- package/dist/tools/definitions/dialogue-followup-state.d.ts +9 -0
- package/dist/tools/definitions/dialogue-followup-state.js +69 -0
- package/dist/tools/definitions/dialogue-followup-state.js.map +1 -0
- package/dist/tools/definitions/dialogue-reprocess.d.ts +5 -0
- package/dist/tools/definitions/dialogue-reprocess.js +107 -0
- package/dist/tools/definitions/dialogue-reprocess.js.map +1 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.d.ts +13 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
- package/dist/tools/definitions/edit-version.d.ts +5 -0
- package/dist/tools/definitions/edit-version.js +20 -0
- package/dist/tools/definitions/edit-version.js.map +1 -0
- package/dist/tools/definitions/external-api-channels.js +17 -15
- package/dist/tools/definitions/external-api-channels.js.map +1 -1
- package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
- package/dist/tools/definitions/feedback-document-access.js +63 -0
- package/dist/tools/definitions/feedback-document-access.js.map +1 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
- package/dist/tools/definitions/follow-up-config.d.ts +79 -0
- package/dist/tools/definitions/follow-up-config.js +258 -0
- package/dist/tools/definitions/follow-up-config.js.map +1 -0
- package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
- package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
- package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
- package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
- package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
- package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
- package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
- package/dist/tools/definitions/follow-up-setup.js +20 -87
- package/dist/tools/definitions/follow-up-setup.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +20 -122
- package/dist/tools/definitions/follow-up.js +200 -357
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
- package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
- package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
- package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
- package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
- package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
- package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
- package/dist/tools/definitions/funnel-analytics.js +150 -0
- package/dist/tools/definitions/funnel-analytics.js.map +1 -0
- package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
- package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
- package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
- package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
- package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +14 -29
- package/dist/tools/definitions/getcourse-cold-welcome.js +190 -253
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
- package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
- package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
- package/dist/tools/definitions/help.js.map +1 -1
- package/dist/tools/definitions/icp-import-source.d.ts +75 -0
- package/dist/tools/definitions/icp-import-source.js +88 -0
- package/dist/tools/definitions/icp-import-source.js.map +1 -0
- package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
- package/dist/tools/definitions/inbound-analytics.js +55 -0
- package/dist/tools/definitions/inbound-analytics.js.map +1 -0
- package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
- package/dist/tools/definitions/instagram-comment.templates.js +34 -0
- package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
- package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
- package/dist/tools/definitions/instagram-settings-compat.js +7 -0
- package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
- package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
- package/dist/tools/definitions/knowledge-chunking.js +83 -0
- package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
- package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
- package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
- package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +24 -14
- package/dist/tools/definitions/knowledge.js +342 -233
- package/dist/tools/definitions/knowledge.js.map +1 -1
- package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
- package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
- package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
- package/dist/tools/definitions/link-tracking.d.ts +8 -0
- package/dist/tools/definitions/link-tracking.js +141 -38
- package/dist/tools/definitions/link-tracking.js.map +1 -1
- package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
- package/dist/tools/definitions/mailing-variant-content.js +73 -0
- package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
- package/dist/tools/definitions/model-comparison.d.ts +2 -1
- package/dist/tools/definitions/model-comparison.js +4 -5
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/money-currency.d.ts +5 -0
- package/dist/tools/definitions/money-currency.js +10 -0
- package/dist/tools/definitions/money-currency.js.map +1 -0
- package/dist/tools/definitions/operator-workflow.d.ts +5 -5
- package/dist/tools/definitions/operator-workflow.js +80 -27
- package/dist/tools/definitions/operator-workflow.js.map +1 -1
- package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
- package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
- package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
- package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
- package/dist/tools/definitions/platform-settings-limits.js +6 -0
- package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
- package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
- package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
- package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
- package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
- package/dist/tools/definitions/platform-settings-update.js +134 -0
- package/dist/tools/definitions/platform-settings-update.js.map +1 -0
- package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
- package/dist/tools/definitions/platform-setup-wave.js +1079 -0
- package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +697 -224
- package/dist/tools/definitions/platform-setup.js +313 -752
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
- package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
- package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
- package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
- package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
- package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
- package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
- package/dist/tools/definitions/prompt-batch-controls.js +40 -0
- package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
- package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
- package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
- package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
- package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
- package/dist/tools/definitions/prompt-text-projection.js +62 -0
- package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
- package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
- package/dist/tools/definitions/reviewer-paid.js +115 -0
- package/dist/tools/definitions/reviewer-paid.js.map +1 -0
- package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
- package/dist/tools/definitions/routing-condition-projection.js +97 -0
- package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
- package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
- package/dist/tools/definitions/schedule-selection-hints.js +42 -0
- package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
- package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
- package/dist/tools/definitions/scheduled-task-alias.js +207 -0
- package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
- package/dist/tools/definitions/session.js +3 -3
- package/dist/tools/definitions/session.js.map +1 -1
- package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
- package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
- package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
- package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
- package/dist/tools/definitions/shared-input.helpers.js +323 -0
- package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
- package/dist/tools/definitions/shared.d.ts +401 -307
- package/dist/tools/definitions/shared.js +430 -652
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
- package/dist/tools/definitions/shipped-output-names.js +123 -0
- package/dist/tools/definitions/shipped-output-names.js.map +1 -0
- package/dist/tools/definitions/task-state.d.ts +4 -4
- package/dist/tools/definitions/task-state.js +2 -1
- package/dist/tools/definitions/task-state.js.map +1 -1
- package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
- package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
- package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
- package/dist/tools/definitions/telegram-personal-management.d.ts +34 -0
- package/dist/tools/definitions/telegram-personal-management.js +139 -0
- package/dist/tools/definitions/telegram-personal-management.js.map +1 -0
- package/dist/tools/definitions/telegram-personal-restrictions.d.ts +19 -0
- package/dist/tools/definitions/telegram-personal-restrictions.js +109 -0
- package/dist/tools/definitions/telegram-personal-restrictions.js.map +1 -0
- package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
- package/dist/tools/definitions/telegram-pool-policy.js +56 -0
- package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
- package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
- package/dist/tools/definitions/touch-history-alias.js +99 -0
- package/dist/tools/definitions/touch-history-alias.js.map +1 -0
- package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
- package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
- package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
- package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
- package/dist/tools/definitions/trigger-argument.schema.js +23 -0
- package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
- package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
- package/dist/tools/definitions/trigger-claim-alias.js +90 -0
- package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
- package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
- package/dist/tools/definitions/trigger-echo-projection.js +41 -0
- package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
- package/dist/tools/definitions/trigger-upsert.tool.d.ts +41 -0
- package/dist/tools/definitions/trigger-upsert.tool.js +159 -0
- package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
- package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
- package/dist/tools/definitions/v15-port-descriptions.js +30 -0
- package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
- package/dist/tools/definitions/variables.d.ts +44 -0
- package/dist/tools/definitions/variables.js +310 -0
- package/dist/tools/definitions/variables.js.map +1 -0
- package/dist/tools/definitions/voice-action-input.d.ts +9 -0
- package/dist/tools/definitions/voice-action-input.js +141 -0
- package/dist/tools/definitions/voice-action-input.js.map +1 -0
- package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
- package/dist/tools/definitions/widget-customization-compat.js +23 -0
- package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
- package/dist/tools/definitions.d.ts +1134 -617
- package/dist/tools/definitions.js +63 -27
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/description-localization.js +3 -2
- package/dist/tools/description-localization.js.map +1 -1
- package/dist/tools/follow-up-request.d.ts +19 -0
- package/dist/tools/follow-up-request.js +81 -0
- package/dist/tools/follow-up-request.js.map +1 -0
- package/dist/tools/followup-revision.d.ts +4 -0
- package/dist/tools/followup-revision.js +29 -0
- package/dist/tools/followup-revision.js.map +1 -0
- package/dist/tools/incomplete-list.js +4 -0
- package/dist/tools/incomplete-list.js.map +1 -1
- package/dist/tools/inventory.js +47 -11
- package/dist/tools/inventory.js.map +1 -1
- package/dist/tools/operation-recovery.d.ts +4 -0
- package/dist/tools/operation-recovery.js +33 -0
- package/dist/tools/operation-recovery.js.map +1 -0
- package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
- package/dist/tools/registry-mapping-primary.cases.js +765 -0
- package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
- package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
- package/dist/tools/registry-mapping-secondary.cases.js +626 -0
- package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
- package/dist/tools/registry-mapping.cases.d.ts +8 -0
- package/dist/tools/registry-mapping.cases.js +170 -0
- package/dist/tools/registry-mapping.cases.js.map +1 -0
- package/dist/tools/registry-test-fixtures.d.ts +50 -0
- package/dist/tools/registry-test-fixtures.js +120 -0
- package/dist/tools/registry-test-fixtures.js.map +1 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +84 -52
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result.d.ts +1 -0
- package/dist/tools/result.js +90 -22
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/toolsets.d.ts +16 -0
- package/dist/tools/toolsets.js +25 -1
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/types/api-contract.gen.d.ts +131892 -22453
- package/dist/utils/credential-signatures.d.ts +3 -0
- package/dist/utils/credential-signatures.js +10 -0
- package/dist/utils/credential-signatures.js.map +1 -0
- package/dist/utils/data-source-column-name.d.ts +10 -0
- package/dist/utils/data-source-column-name.js +36 -0
- package/dist/utils/data-source-column-name.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.js +32 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/secret-read-boundary.d.ts +2 -0
- package/dist/utils/secret-read-boundary.js +88 -0
- package/dist/utils/secret-read-boundary.js.map +1 -0
- package/dist/utils/setup-secrets.d.ts +4 -0
- package/dist/utils/setup-secrets.js +40 -0
- package/dist/utils/setup-secrets.js.map +1 -0
- package/docs/agent-models.md +9 -0
- package/docs/agent-usage-guide.full.ru.md +1 -4
- package/docs/analytics-contract.md +67 -0
- package/docs/async-operation-lifecycle.md +10 -3
- package/docs/connect.ru.md +144 -4
- package/docs/contact-company-profile.md +17 -0
- package/docs/contact-recommendations.md +7 -0
- package/docs/crm-stage-pool.md +73 -0
- package/docs/customer-data.md +61 -0
- package/docs/dialogue-reprocess.md +37 -0
- package/docs/edit-versions.md +36 -0
- package/docs/failure-semantics.md +17 -9
- package/docs/help-navigation.md +15 -42
- package/docs/host-compatibility-matrix.md +72 -93
- package/docs/host-setup.md +33 -35
- package/docs/invariants/public-api-and-contracts.md +16 -0
- package/docs/legacy-action-settings.md +21 -0
- package/docs/main-transfer-dependencies.md +38 -0
- package/docs/mcp2-parity.md +50 -0
- package/docs/modules/analytics.md +79 -0
- package/docs/modules/besales-mcp.md +144 -0
- package/docs/modules/dialog-review-report.md +38 -0
- package/docs/modules/dialogue-followup-adapters.md +39 -0
- package/docs/modules/message-reactions.md +17 -0
- package/docs/modules/network-mode.md +284 -0
- package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
- package/docs/pii-policy.md +21 -16
- package/docs/response-size-budget.md +197 -7
- package/docs/secret-read-boundary.md +102 -0
- package/docs/task-state.md +7 -2
- package/docs/telegram-personal-management.md +50 -0
- package/docs/telegram-personal-restrictions.md +87 -0
- package/docs/telegram-pool-policy.md +19 -0
- package/docs/tool-effects.md +15 -9
- package/docs/tool-surface.md +205 -4
- package/docs/voice-actions-and-inbox.md +95 -0
- package/docs/wazzup-instagram-comments.md +26 -0
- package/package.json +17 -10
- package/scripts/api-source-loader.spec.mjs +40 -0
- package/scripts/audit-bridge-controls.mjs +129 -0
- package/scripts/audit-revert-mutants.mjs +107 -0
- package/scripts/bridge-api-input.spec.mjs +98 -0
- package/scripts/bridge-controls-mutants.mjs +130 -0
- package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
- package/scripts/brx4-ledger-payload.spec.mjs +127 -0
- package/scripts/build-onprem.mjs +108 -0
- package/scripts/connect-clients.sh +141 -0
- package/scripts/connect-scopes.mjs +166 -0
- package/scripts/connect-scopes.spec.mjs +83 -0
- package/scripts/emit-personal-link-carrier.mjs +31 -0
- package/scripts/emit-setup-init-schemas.mjs +24 -0
- package/scripts/emit-tool-routes.mjs +878 -0
- package/scripts/emit-tool-routes.spec.mjs +300 -0
- package/scripts/followup-registry.spec.mjs +107 -0
- package/scripts/generate-crm-rotation-contract.mjs +98 -0
- package/scripts/generate-followup-session-contract.mjs +16 -0
- package/scripts/getcourse-text-source.spec.mjs +110 -0
- package/scripts/icp-import-verification/mutate.cjs +70 -0
- package/scripts/import-secret-read-contract.mjs +53 -0
- package/scripts/install-claude-desktop.js +1 -1
- package/scripts/lag-decisions.mjs +37 -0
- package/scripts/lag-decisions.spec.mjs +87 -0
- package/scripts/lag-open-task-owners.mjs +46 -0
- package/scripts/lag-open-task-owners.spec.mjs +78 -0
- package/scripts/lag-payload.mjs +10 -0
- package/scripts/legacy-action-lag.spec.mjs +22 -0
- package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
- package/scripts/mcpcompat-handler.mjs +34 -0
- package/scripts/mcpcompat-loader.mjs +36 -0
- package/scripts/mcpcompat-typescript.mjs +3 -0
- package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
- package/scripts/prbr-round1-recheck.spec.mjs +605 -0
- package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
- package/scripts/publish-mcp-registry.mjs +98 -0
- package/scripts/publish-mcp-registry.spec.mjs +68 -0
- package/scripts/record-scheduled-task-call.mjs +26 -0
- package/scripts/refusal-probe.mjs +17 -0
- package/scripts/refusal-probe.spec.mjs +29 -0
- package/scripts/registry-diff.mjs +502 -0
- package/scripts/registry-diff.spec.mjs +787 -0
- package/scripts/request-query.mjs +43 -0
- package/scripts/request-query.spec.mjs +82 -0
- package/scripts/route-lag.mjs +23 -0
- package/scripts/route-lag.spec.mjs +30 -0
- package/scripts/sample-args.mjs +174 -0
- package/scripts/sample-args.spec.mjs +160 -0
- package/scripts/shipped-definitions.mjs +197 -0
- package/scripts/shipped-definitions.spec.mjs +57 -0
- package/scripts/shipped-inputs.spec.mjs +136 -0
- package/scripts/shipped-recordings.spec.mjs +19 -0
- package/scripts/shipped-ref.d.mts +5 -0
- package/scripts/shipped-ref.mjs +20 -0
- package/scripts/shipped-ref.spec.mjs +59 -0
- package/scripts/shipped-registry.mjs +107 -0
- package/scripts/shipped-sample-candidates.mjs +69 -0
- package/scripts/shipped-sample-candidates.spec.mjs +117 -0
- package/scripts/shipped-sample.mjs +871 -0
- package/scripts/shipped-sample.spec.mjs +451 -0
- package/scripts/sync-agent-model-schemas.mjs +72 -0
- package/scripts/sync-api-contracts.mjs +85 -0
- package/scripts/sync-api-contracts.spec.mjs +144 -0
- package/scripts/sync-contract-ledger-schemas.mjs +161 -0
- package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
- package/scripts/sync-prompt-draft-schema.mjs +92 -0
- package/scripts/sync-route-map.mjs +94 -0
- package/scripts/sync-schema-descriptions.mjs +25 -0
- package/scripts/sync-tool-inventory.mjs +27 -0
- package/scripts/sync-trigger-argument-schema.mjs +97 -0
- package/scripts/sync-trigger-argument-schema.spec.mjs +91 -0
- package/scripts/sync-trigger-event-schema.mjs +20 -0
- package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
- package/scripts/sync-trigger-task-schema.mjs +45 -0
- package/scripts/sync-voice-actions-contract.mjs +67 -0
- package/scripts/sync-voice-actions-tools.mjs +97 -0
- package/scripts/sync-wave-id-schemas.mjs +55 -0
- package/scripts/telegram-personal-confirmation-mutants.mjs +74 -0
- package/scripts/tool-input-schemas.mjs +46 -0
- package/scripts/tool-input-schemas.spec.mjs +50 -0
- package/scripts/verify-followup-adapters.mjs +235 -0
- package/scripts/verify-secret-read-import.mjs +84 -0
- package/scripts/verify-secret-read-mutants.mjs +143 -0
- package/dist/tools/definitions/analytics.d.ts +0 -40
- package/dist/tools/definitions/analytics.js +0 -233
- package/dist/tools/definitions/analytics.js.map +0 -1
- package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
- package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
- package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
- package/dist/tools/definitions/dialogue-audit.js +0 -292
- package/dist/tools/definitions/dialogue-audit.js.map +0 -1
- package/dist/tools/definitions/getcourse-wave.js +0 -519
- package/dist/tools/definitions/getcourse-wave.js.map +0 -1
- package/dist/tools/definitions/operational-overview.d.ts +0 -3
- package/dist/tools/definitions/operational-overview.js +0 -23
- package/dist/tools/definitions/operational-overview.js.map +0 -1
- package/dist/tools/definitions/scheduled-tasks.js +0 -173
- package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
- package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
- package/dist/tools/definitions/trigger-contact-claims.js +0 -60
- package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
- package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
- package/dist/tools/registry-mapping-cases-core.js +0 -963
- package/dist/tools/registry-mapping-cases-core.js.map +0 -1
- package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
- package/dist/tools/registry-mapping-cases-platform.js +0 -1052
- package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
- package/dist/tools/trigger-action-config.d.ts +0 -49
- package/dist/tools/trigger-action-config.js +0 -171
- package/dist/tools/trigger-action-config.js.map +0 -1
- package/docs/evals/model-behavior-scorecard.md +0 -80
- package/docs/operation-coverage.md +0 -114
- package/scripts/mock-credentials.js +0 -77
- package/scripts/model-eval-server.js +0 -213
- package/scripts/run-model-eval.js +0 -447
|
@@ -1,291 +1,40 @@
|
|
|
1
|
+
import { withEditVersionInstructions, editVersionInstruction } from './edit-version.js';
|
|
2
|
+
import { setupInitOperationIdSchema } from './setup-init-operation.schema.js';
|
|
1
3
|
import { z } from 'zod';
|
|
2
4
|
import { assertCompleteList } from '../incomplete-list.js';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const REPEAT_CONSTANT_VALUE_INSTRUCTION = 'repeat_constant_value подставляется вместо constant_value человеку, которому мы уже писали, — только в холодных рассылках (например, {intro}: «это снова Светлана.» вместо полного представления). Только константы CHANNEL; фигурные скобки запрещены; пустая строка или null очищает — тогда повтору уходит constant_value.';
|
|
5
|
+
import { CRM_PIPELINES_MAX_PAGE_SIZE, MAX_FILE_UPLOAD_BYTES, apiKeyPlatformTypeSchema, buildFileListQuery, compactObject, crmFieldMappingItemSchema, defineTool, mcpFileSourceSchema, oauthPlatformTypeSchema, optionalAnyObjectSchema, provisionableCrmTypeSchema, storedFileTypeSchema, uuidSchema, withInstructions, } from './shared.js';
|
|
6
|
+
export const CRM_OPERATOR_CHANGE_FIELDS = ['is_operator', 'is_sdr', 'workspace_member_id'];
|
|
6
7
|
export const crmPlatformTools = [
|
|
7
|
-
// ============================================================
|
|
8
|
-
// v1.5 Increment 4a — Unified Variables API (5 tools, v2-shaped scope discriminator)
|
|
9
|
-
// ============================================================
|
|
10
|
-
// Backend wraps two v1 tables (WorkspaceVariable + CustomVariable) под единый MCP shape.
|
|
11
|
-
// При v2 cutover (spec 23) обе таблицы → один `variables` с тем же `scope` discriminator —
|
|
12
|
-
// MCP shape работает без изменений.
|
|
13
8
|
defineTool({
|
|
14
|
-
name: '
|
|
9
|
+
name: 'besales_crm_bitrix24_deal_tab_get',
|
|
15
10
|
sideEffect: 'none',
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
defaultWorkspaceId: true,
|
|
19
|
-
// По этому перечню строят условия правил. Отсутствующая в усечённом списке переменная
|
|
20
|
-
// неотличима от «значение не проставлено», и правило получается недостижимым.
|
|
21
|
-
resultPolicy: { neverTruncate: true },
|
|
22
|
-
schema: z
|
|
23
|
-
.object({
|
|
24
|
-
workspace_id: uuidSchema.optional(),
|
|
25
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
26
|
-
platform_id: uuidSchema.optional(),
|
|
27
|
-
filter: z.enum(['all', 'variables', 'constants']).optional(),
|
|
28
|
-
// ⚠️ Без дефолта. Сервер СВОЙ дефолт имеет (50), и до появления этих двух ручек
|
|
29
|
-
// перечень молча обрывался на пятидесятой строке, а способа дочитать не было вовсе.
|
|
30
|
-
limit: z.number().int().min(1).max(VARIABLES_MAX_PAGE_SIZE).optional(),
|
|
31
|
-
cursor: z.string().min(1).optional(),
|
|
32
|
-
})
|
|
33
|
-
.strict()
|
|
34
|
-
.superRefine((input, ctx) => {
|
|
35
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
36
|
-
ctx.addIssue({
|
|
37
|
-
code: z.ZodIssueCode.custom,
|
|
38
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
39
|
-
path: ['platform_id'],
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
if (input.scope === 'WORKSPACE' && input.platform_id) {
|
|
43
|
-
ctx.addIssue({
|
|
44
|
-
code: z.ZodIssueCode.custom,
|
|
45
|
-
message: 'platform_id is forbidden when scope=WORKSPACE',
|
|
46
|
-
path: ['platform_id'],
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}),
|
|
11
|
+
requiredFields: ['crm_id'],
|
|
12
|
+
schema: z.object({ crm_id: uuidSchema }).strict(),
|
|
50
13
|
createRequest: (input) => ({
|
|
51
14
|
method: 'GET',
|
|
52
|
-
path: `/
|
|
15
|
+
path: `/crm-connections/${input.crm_id}/bitrix24/deal-tab`,
|
|
53
16
|
}),
|
|
54
|
-
enhanceResponse: (response
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
toolName: 'besales_variable_list',
|
|
58
|
-
howToPage: `Позовите снова с limit (до ${VARIABLES_MAX_PAGE_SIZE}) и продолжайте по nextCursor, пока он не станет пустым.`,
|
|
59
|
-
}), [
|
|
60
|
-
'WORKSPACE scope возвращает глобальные переменные workspace; CHANNEL — переменные указанной платформы.',
|
|
61
|
-
'CHANNEL требует platform_id; filter=variables исключает константы, filter=constants оставляет только их.',
|
|
62
|
-
'nextCursor в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
|
|
17
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
18
|
+
'Состояние последней регистрации вкладки AI Агенты. BOUND подтверждено placement.get на checkedAt; отсутствие поля не означает работающую вкладку.',
|
|
19
|
+
'FAILED: объясни причину человеческим языком; reason оставь только для диагностики. При нехватке области placement попроси добавить её, при нехватке прав — выдать права на регистрацию приложений. UNKNOWN означает неопределённый исход: сервер сначала проверяет прежнюю попытку, повтор не обещает новую отправку.',
|
|
63
20
|
]),
|
|
64
21
|
}),
|
|
65
22
|
defineTool({
|
|
66
|
-
name: '
|
|
23
|
+
name: 'besales_crm_bitrix24_deal_tab_register',
|
|
67
24
|
sideEffect: 'write',
|
|
68
|
-
|
|
69
|
-
requiredFields: ['scope', 'name', 'type'],
|
|
70
|
-
defaultWorkspaceId: true,
|
|
25
|
+
requiredFields: ['crm_id', 'acknowledge_external_side_effect'],
|
|
71
26
|
schema: z
|
|
72
|
-
.object({
|
|
73
|
-
|
|
74
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
75
|
-
name: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
|
|
76
|
-
message: 'name must be ASCII letters/digits/underscores; start with letter or _',
|
|
77
|
-
}),
|
|
78
|
-
description: z.string().optional(),
|
|
79
|
-
type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']),
|
|
80
|
-
// WORKSPACE-only
|
|
81
|
-
value: z.string().optional(),
|
|
82
|
-
// CHANNEL-only
|
|
83
|
-
platform_id: uuidSchema.optional(),
|
|
84
|
-
is_constant: z.boolean().optional(),
|
|
85
|
-
constant_value: z.string().optional(),
|
|
86
|
-
repeat_constant_value: z.string().optional(),
|
|
87
|
-
})
|
|
88
|
-
.strict()
|
|
89
|
-
.superRefine((input, ctx) => {
|
|
90
|
-
if (input.scope === 'WORKSPACE') {
|
|
91
|
-
if (input.platform_id) {
|
|
92
|
-
ctx.addIssue({
|
|
93
|
-
code: z.ZodIssueCode.custom,
|
|
94
|
-
message: 'platform_id is forbidden when scope=WORKSPACE',
|
|
95
|
-
path: ['platform_id'],
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
if (input.is_constant !== undefined ||
|
|
99
|
-
input.constant_value !== undefined ||
|
|
100
|
-
input.repeat_constant_value !== undefined) {
|
|
101
|
-
ctx.addIssue({
|
|
102
|
-
code: z.ZodIssueCode.custom,
|
|
103
|
-
message: 'is_constant, constant_value and repeat_constant_value are forbidden when scope=WORKSPACE',
|
|
104
|
-
path: ['is_constant'],
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
// CHANNEL
|
|
110
|
-
if (!input.platform_id) {
|
|
111
|
-
ctx.addIssue({
|
|
112
|
-
code: z.ZodIssueCode.custom,
|
|
113
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
114
|
-
path: ['platform_id'],
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
if (input.value !== undefined) {
|
|
118
|
-
ctx.addIssue({
|
|
119
|
-
code: z.ZodIssueCode.custom,
|
|
120
|
-
message: 'value is forbidden when scope=CHANNEL — use constant_value if isConstant=true',
|
|
121
|
-
path: ['value'],
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
if (input.is_constant === true && !input.constant_value) {
|
|
125
|
-
ctx.addIssue({
|
|
126
|
-
code: z.ZodIssueCode.custom,
|
|
127
|
-
message: 'constant_value is required when scope=CHANNEL and is_constant=true',
|
|
128
|
-
path: ['constant_value'],
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
if (input.is_constant !== true && input.repeat_constant_value !== undefined) {
|
|
132
|
-
ctx.addIssue({
|
|
133
|
-
code: z.ZodIssueCode.custom,
|
|
134
|
-
message: 'repeat_constant_value is allowed only when scope=CHANNEL and is_constant=true',
|
|
135
|
-
path: ['repeat_constant_value'],
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}),
|
|
27
|
+
.object({ crm_id: uuidSchema, acknowledge_external_side_effect: z.literal(true) })
|
|
28
|
+
.strict(),
|
|
140
29
|
createRequest: (input) => ({
|
|
141
30
|
method: 'POST',
|
|
142
|
-
path: `/
|
|
143
|
-
body: compactObject({
|
|
144
|
-
scope: input.scope,
|
|
145
|
-
name: input.name,
|
|
146
|
-
description: input.description,
|
|
147
|
-
type: input.type,
|
|
148
|
-
value: input.value,
|
|
149
|
-
platformId: input.platform_id,
|
|
150
|
-
isConstant: input.is_constant,
|
|
151
|
-
constantValue: input.constant_value,
|
|
152
|
-
repeatConstantValue: input.repeat_constant_value,
|
|
153
|
-
}),
|
|
31
|
+
path: `/crm-connections/${input.crm_id}/bitrix24/deal-tab/retry`,
|
|
154
32
|
}),
|
|
155
33
|
enhanceResponse: (response) => withInstructions(response, [
|
|
156
|
-
'
|
|
157
|
-
'
|
|
158
|
-
REPEAT_CONSTANT_VALUE_INSTRUCTION,
|
|
34
|
+
'Идемпотентный повтор регистрации вкладки AI Агенты. Адрес и токен выбирает сервер из окружения и сохранённого подключения; переустановка не требуется.',
|
|
35
|
+
'HTTP 200 с status=FAILED или UNKNOWN не является успехом регистрации. Объясни причину человеческим языком; reason оставь только для диагностики. При неопределённом исходе повтори проверку позже; новый bind разрешает только сервер после подтверждения отсутствия.',
|
|
159
36
|
]),
|
|
160
37
|
}),
|
|
161
|
-
defineTool({
|
|
162
|
-
name: 'besales_variable_get',
|
|
163
|
-
sideEffect: 'none',
|
|
164
|
-
closedWorld: true,
|
|
165
|
-
requiredFields: ['variable_id', 'scope'],
|
|
166
|
-
defaultWorkspaceId: true,
|
|
167
|
-
schema: z
|
|
168
|
-
.object({
|
|
169
|
-
workspace_id: uuidSchema.optional(),
|
|
170
|
-
variable_id: uuidSchema,
|
|
171
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
172
|
-
platform_id: uuidSchema.optional(),
|
|
173
|
-
})
|
|
174
|
-
.strict()
|
|
175
|
-
.superRefine((input, ctx) => {
|
|
176
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
177
|
-
ctx.addIssue({
|
|
178
|
-
code: z.ZodIssueCode.custom,
|
|
179
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
180
|
-
path: ['platform_id'],
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}),
|
|
184
|
-
createRequest: (input) => ({
|
|
185
|
-
method: 'GET',
|
|
186
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}${buildVariableScopeQuery(input.scope, input.platform_id)}`,
|
|
187
|
-
}),
|
|
188
|
-
}),
|
|
189
|
-
defineTool({
|
|
190
|
-
name: 'besales_variable_update',
|
|
191
|
-
sideEffect: 'write',
|
|
192
|
-
closedWorld: true,
|
|
193
|
-
requiredFields: ['variable_id', 'scope'],
|
|
194
|
-
defaultWorkspaceId: true,
|
|
195
|
-
schema: z
|
|
196
|
-
.object({
|
|
197
|
-
workspace_id: uuidSchema.optional(),
|
|
198
|
-
variable_id: uuidSchema,
|
|
199
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
200
|
-
platform_id: uuidSchema.optional(),
|
|
201
|
-
description: z.string().optional(),
|
|
202
|
-
type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']).optional(),
|
|
203
|
-
// WORKSPACE-only (nullable для clear)
|
|
204
|
-
value: z.string().nullable().optional(),
|
|
205
|
-
// CHANNEL-only (nullable для clear)
|
|
206
|
-
constant_value: z.string().nullable().optional(),
|
|
207
|
-
repeat_constant_value: z.string().nullable().optional(),
|
|
208
|
-
})
|
|
209
|
-
.strict()
|
|
210
|
-
.superRefine((input, ctx) => {
|
|
211
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
212
|
-
ctx.addIssue({
|
|
213
|
-
code: z.ZodIssueCode.custom,
|
|
214
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
215
|
-
path: ['platform_id'],
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
if (input.scope === 'WORKSPACE' && input.constant_value !== undefined) {
|
|
219
|
-
ctx.addIssue({
|
|
220
|
-
code: z.ZodIssueCode.custom,
|
|
221
|
-
message: 'constant_value is forbidden when scope=WORKSPACE',
|
|
222
|
-
path: ['constant_value'],
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
if (input.scope === 'WORKSPACE' && input.repeat_constant_value !== undefined) {
|
|
226
|
-
ctx.addIssue({
|
|
227
|
-
code: z.ZodIssueCode.custom,
|
|
228
|
-
message: 'repeat_constant_value is forbidden when scope=WORKSPACE',
|
|
229
|
-
path: ['repeat_constant_value'],
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
if (input.scope === 'CHANNEL' && input.value !== undefined) {
|
|
233
|
-
ctx.addIssue({
|
|
234
|
-
code: z.ZodIssueCode.custom,
|
|
235
|
-
message: 'value is forbidden when scope=CHANNEL',
|
|
236
|
-
path: ['value'],
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
}),
|
|
240
|
-
createRequest: (input) => ({
|
|
241
|
-
method: 'PATCH',
|
|
242
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
|
|
243
|
-
body: compactObject({
|
|
244
|
-
scope: input.scope,
|
|
245
|
-
platformId: input.platform_id,
|
|
246
|
-
description: input.description,
|
|
247
|
-
type: input.type,
|
|
248
|
-
value: input.value,
|
|
249
|
-
constantValue: input.constant_value,
|
|
250
|
-
repeatConstantValue: input.repeat_constant_value,
|
|
251
|
-
}),
|
|
252
|
-
}),
|
|
253
|
-
enhanceResponse: (response) => withInstructions(response, [REPEAT_CONSTANT_VALUE_INSTRUCTION]),
|
|
254
|
-
}),
|
|
255
|
-
defineTool({
|
|
256
|
-
name: 'besales_variable_delete',
|
|
257
|
-
sideEffect: 'write',
|
|
258
|
-
closedWorld: true,
|
|
259
|
-
requiredFields: ['variable_id', 'scope', 'explicit_confirmation'],
|
|
260
|
-
defaultWorkspaceId: true,
|
|
261
|
-
schema: z
|
|
262
|
-
.object({
|
|
263
|
-
workspace_id: uuidSchema.optional(),
|
|
264
|
-
variable_id: uuidSchema,
|
|
265
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
266
|
-
platform_id: uuidSchema.optional(),
|
|
267
|
-
explicit_confirmation: z.literal(true),
|
|
268
|
-
})
|
|
269
|
-
.strict()
|
|
270
|
-
.superRefine((input, ctx) => {
|
|
271
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
272
|
-
ctx.addIssue({
|
|
273
|
-
code: z.ZodIssueCode.custom,
|
|
274
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
275
|
-
path: ['platform_id'],
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}),
|
|
279
|
-
createRequest: (input) => ({
|
|
280
|
-
method: 'DELETE',
|
|
281
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
|
|
282
|
-
body: compactObject({
|
|
283
|
-
scope: input.scope,
|
|
284
|
-
platformId: input.platform_id,
|
|
285
|
-
explicitConfirmation: input.explicit_confirmation,
|
|
286
|
-
}),
|
|
287
|
-
}),
|
|
288
|
-
}),
|
|
289
38
|
// ============================================================
|
|
290
39
|
// v1.5 Increment 4b — CRM Pipelines (11 tools)
|
|
291
40
|
// ============================================================
|
|
@@ -310,14 +59,21 @@ export const crmPlatformTools = [
|
|
|
310
59
|
workspace_id: uuidSchema.optional(),
|
|
311
60
|
crm_id: uuidSchema,
|
|
312
61
|
include_deleted: z.boolean().optional(),
|
|
62
|
+
// ⚠️ Без умолчания: отказ по размеру был отказом БЕЗ ВЫХОДА — сузить перечень было нечем.
|
|
63
|
+
limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
|
|
64
|
+
cursor: z.string().min(1).optional(),
|
|
313
65
|
})
|
|
314
66
|
.strict(),
|
|
315
67
|
createRequest: (input) => ({
|
|
316
68
|
method: 'GET',
|
|
317
|
-
path: `/
|
|
69
|
+
path: `/crm-connections/${input.crm_id}/pipelines?sync=true${input.include_deleted !== undefined ? `&includeDeleted=${input.include_deleted}` : ''}${input.limit !== undefined ? `&limit=${input.limit}` : ''}${input.cursor ? `&cursor=${encodeURIComponent(input.cursor)}` : ''}`,
|
|
318
70
|
}),
|
|
319
|
-
enhanceResponse: (response) => withInstructions(response,
|
|
320
|
-
|
|
71
|
+
enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
|
|
72
|
+
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
73
|
+
toolName: 'besales_crm_pipeline_list',
|
|
74
|
+
howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
|
|
75
|
+
}), [
|
|
76
|
+
'Перед list выполняется best-effort sync; ошибка провайдера не блокирует локальную выдачу.',
|
|
321
77
|
]),
|
|
322
78
|
}),
|
|
323
79
|
defineTool({
|
|
@@ -334,7 +90,7 @@ export const crmPlatformTools = [
|
|
|
334
90
|
.strict(),
|
|
335
91
|
createRequest: (input) => ({
|
|
336
92
|
method: 'GET',
|
|
337
|
-
path: `/
|
|
93
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
338
94
|
}),
|
|
339
95
|
}),
|
|
340
96
|
defineTool({
|
|
@@ -357,7 +113,7 @@ export const crmPlatformTools = [
|
|
|
357
113
|
.strict(),
|
|
358
114
|
createRequest: (input) => ({
|
|
359
115
|
method: 'POST',
|
|
360
|
-
path: `/
|
|
116
|
+
path: `/crm-connections/${input.crm_id}/pipelines`,
|
|
361
117
|
body: compactObject({
|
|
362
118
|
name: input.name,
|
|
363
119
|
sort: input.sort,
|
|
@@ -377,11 +133,7 @@ export const crmPlatformTools = [
|
|
|
377
133
|
name: 'besales_crm_pipeline_update',
|
|
378
134
|
sideEffect: 'write',
|
|
379
135
|
defaultWorkspaceId: true,
|
|
380
|
-
requiredFields: [
|
|
381
|
-
'crm_id',
|
|
382
|
-
'pipeline_id',
|
|
383
|
-
'acknowledge_external_side_effect',
|
|
384
|
-
],
|
|
136
|
+
requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
|
|
385
137
|
schema: z
|
|
386
138
|
.object({
|
|
387
139
|
workspace_id: uuidSchema.optional(),
|
|
@@ -397,7 +149,7 @@ export const crmPlatformTools = [
|
|
|
397
149
|
.strict(),
|
|
398
150
|
createRequest: (input) => ({
|
|
399
151
|
method: 'PATCH',
|
|
400
|
-
path: `/
|
|
152
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
401
153
|
body: compactObject({
|
|
402
154
|
name: input.name,
|
|
403
155
|
sort: input.sort,
|
|
@@ -408,7 +160,7 @@ export const crmPlatformTools = [
|
|
|
408
160
|
}),
|
|
409
161
|
}),
|
|
410
162
|
enhanceResponse: (response) => withInstructions(response, [
|
|
411
|
-
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в
|
|
163
|
+
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
|
|
412
164
|
]),
|
|
413
165
|
}),
|
|
414
166
|
defineTool({
|
|
@@ -432,7 +184,7 @@ export const crmPlatformTools = [
|
|
|
432
184
|
.strict(),
|
|
433
185
|
createRequest: (input) => ({
|
|
434
186
|
method: 'DELETE',
|
|
435
|
-
path: `/
|
|
187
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
436
188
|
body: {
|
|
437
189
|
explicitConfirmation: input.explicit_confirmation,
|
|
438
190
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -456,24 +208,34 @@ export const crmPlatformTools = [
|
|
|
456
208
|
workspace_id: uuidSchema.optional(),
|
|
457
209
|
crm_id: uuidSchema,
|
|
458
210
|
pipeline_id: z.number().int(),
|
|
211
|
+
// ⚠️ Без умолчания: недостающая стадия даёт недостижимое правило маршрутизации.
|
|
212
|
+
limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
|
|
213
|
+
cursor: z.string().min(1).optional(),
|
|
459
214
|
})
|
|
460
215
|
.strict(),
|
|
461
|
-
createRequest: (input) =>
|
|
462
|
-
|
|
463
|
-
|
|
216
|
+
createRequest: (input) => {
|
|
217
|
+
const query = new URLSearchParams();
|
|
218
|
+
if (input.limit !== undefined)
|
|
219
|
+
query.set('limit', String(input.limit));
|
|
220
|
+
if (input.cursor)
|
|
221
|
+
query.set('cursor', input.cursor);
|
|
222
|
+
const suffix = query.size > 0 ? `?${query.toString()}` : '';
|
|
223
|
+
return {
|
|
224
|
+
method: 'GET',
|
|
225
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses${suffix}`,
|
|
226
|
+
};
|
|
227
|
+
},
|
|
228
|
+
enhanceResponse: (response, input) => assertCompleteList(response, {
|
|
229
|
+
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
230
|
+
toolName: 'besales_crm_pipeline_status_list',
|
|
231
|
+
howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
|
|
464
232
|
}),
|
|
465
233
|
}),
|
|
466
234
|
defineTool({
|
|
467
235
|
name: 'besales_crm_pipeline_status_create',
|
|
468
236
|
sideEffect: 'write',
|
|
469
237
|
defaultWorkspaceId: true,
|
|
470
|
-
requiredFields: [
|
|
471
|
-
'crm_id',
|
|
472
|
-
'pipeline_id',
|
|
473
|
-
'name',
|
|
474
|
-
'sort',
|
|
475
|
-
'acknowledge_external_side_effect',
|
|
476
|
-
],
|
|
238
|
+
requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
|
|
477
239
|
schema: z
|
|
478
240
|
.object({
|
|
479
241
|
workspace_id: uuidSchema.optional(),
|
|
@@ -484,8 +246,16 @@ export const crmPlatformTools = [
|
|
|
484
246
|
color: z.string().optional(),
|
|
485
247
|
status_types: z.array(z.string()).optional(),
|
|
486
248
|
is_editable: z.boolean().optional(),
|
|
249
|
+
is_system_managed: z
|
|
250
|
+
.boolean()
|
|
251
|
+
.optional()
|
|
252
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
487
253
|
is_bot_active: z.boolean().optional(),
|
|
488
254
|
is_operator_available: z.boolean().optional(),
|
|
255
|
+
is_terminal: z
|
|
256
|
+
.boolean()
|
|
257
|
+
.optional()
|
|
258
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
489
259
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
490
260
|
status_id: z.number().int().optional(),
|
|
491
261
|
acknowledge_external_side_effect: z.literal(true),
|
|
@@ -493,15 +263,17 @@ export const crmPlatformTools = [
|
|
|
493
263
|
.strict(),
|
|
494
264
|
createRequest: (input) => ({
|
|
495
265
|
method: 'POST',
|
|
496
|
-
path: `/
|
|
266
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
|
|
497
267
|
body: compactObject({
|
|
498
268
|
name: input.name,
|
|
499
269
|
sort: input.sort,
|
|
500
270
|
color: input.color,
|
|
501
271
|
statusTypes: input.status_types,
|
|
502
272
|
isEditable: input.is_editable,
|
|
273
|
+
isSystemManaged: input.is_system_managed,
|
|
503
274
|
isBotActive: input.is_bot_active,
|
|
504
275
|
isOperatorAvailable: input.is_operator_available,
|
|
276
|
+
isTerminal: input.is_terminal,
|
|
505
277
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
506
278
|
statusId: input.status_id,
|
|
507
279
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -515,12 +287,7 @@ export const crmPlatformTools = [
|
|
|
515
287
|
name: 'besales_crm_pipeline_status_update',
|
|
516
288
|
sideEffect: 'write',
|
|
517
289
|
defaultWorkspaceId: true,
|
|
518
|
-
requiredFields: [
|
|
519
|
-
'crm_id',
|
|
520
|
-
'pipeline_id',
|
|
521
|
-
'status_id',
|
|
522
|
-
'acknowledge_external_side_effect',
|
|
523
|
-
],
|
|
290
|
+
requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
|
|
524
291
|
schema: z
|
|
525
292
|
.object({
|
|
526
293
|
workspace_id: uuidSchema.optional(),
|
|
@@ -534,17 +301,21 @@ export const crmPlatformTools = [
|
|
|
534
301
|
is_system_managed: z
|
|
535
302
|
.boolean()
|
|
536
303
|
.optional()
|
|
537
|
-
.describe('
|
|
304
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
538
305
|
is_editable: z.boolean().optional(),
|
|
539
306
|
is_bot_active: z.boolean().optional(),
|
|
540
307
|
is_operator_available: z.boolean().optional(),
|
|
308
|
+
is_terminal: z
|
|
309
|
+
.boolean()
|
|
310
|
+
.optional()
|
|
311
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
541
312
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
542
313
|
acknowledge_external_side_effect: z.literal(true),
|
|
543
314
|
})
|
|
544
315
|
.strict(),
|
|
545
316
|
createRequest: (input) => ({
|
|
546
317
|
method: 'PATCH',
|
|
547
|
-
path: `/
|
|
318
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
548
319
|
body: compactObject({
|
|
549
320
|
name: input.name,
|
|
550
321
|
sort: input.sort,
|
|
@@ -554,6 +325,7 @@ export const crmPlatformTools = [
|
|
|
554
325
|
isEditable: input.is_editable,
|
|
555
326
|
isBotActive: input.is_bot_active,
|
|
556
327
|
isOperatorAvailable: input.is_operator_available,
|
|
328
|
+
isTerminal: input.is_terminal,
|
|
557
329
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
558
330
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
559
331
|
}),
|
|
@@ -585,7 +357,7 @@ export const crmPlatformTools = [
|
|
|
585
357
|
.strict(),
|
|
586
358
|
createRequest: (input) => ({
|
|
587
359
|
method: 'DELETE',
|
|
588
|
-
path: `/
|
|
360
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
589
361
|
body: {
|
|
590
362
|
explicitConfirmation: input.explicit_confirmation,
|
|
591
363
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -599,6 +371,11 @@ export const crmPlatformTools = [
|
|
|
599
371
|
requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
|
|
600
372
|
schema: z
|
|
601
373
|
.object({
|
|
374
|
+
expected_version: z
|
|
375
|
+
.string()
|
|
376
|
+
.min(1)
|
|
377
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
378
|
+
.optional(),
|
|
602
379
|
workspace_id: uuidSchema.optional(),
|
|
603
380
|
platform_id: uuidSchema,
|
|
604
381
|
pipeline_id: z.number().int(),
|
|
@@ -608,14 +385,16 @@ export const crmPlatformTools = [
|
|
|
608
385
|
.strict(),
|
|
609
386
|
createRequest: (input) => ({
|
|
610
387
|
method: 'POST',
|
|
611
|
-
path: `/
|
|
388
|
+
path: `/channels/${input.platform_id}/active-pipelines`,
|
|
612
389
|
body: compactObject({
|
|
390
|
+
expectedVersion: input.expected_version,
|
|
613
391
|
pipelineId: input.pipeline_id,
|
|
614
392
|
pipelineCrmId: input.pipeline_crm_id,
|
|
615
393
|
sort: input.sort,
|
|
616
394
|
}),
|
|
617
395
|
}),
|
|
618
396
|
enhanceResponse: (response) => withInstructions(response, [
|
|
397
|
+
editVersionInstruction(),
|
|
619
398
|
'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
|
|
620
399
|
]),
|
|
621
400
|
}),
|
|
@@ -626,6 +405,11 @@ export const crmPlatformTools = [
|
|
|
626
405
|
requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
|
|
627
406
|
schema: z
|
|
628
407
|
.object({
|
|
408
|
+
expected_version: z
|
|
409
|
+
.string()
|
|
410
|
+
.min(1)
|
|
411
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
412
|
+
.optional(),
|
|
629
413
|
workspace_id: uuidSchema.optional(),
|
|
630
414
|
platform_id: uuidSchema,
|
|
631
415
|
platform_pipeline_id: uuidSchema,
|
|
@@ -634,9 +418,11 @@ export const crmPlatformTools = [
|
|
|
634
418
|
.strict(),
|
|
635
419
|
createRequest: (input) => ({
|
|
636
420
|
method: 'DELETE',
|
|
637
|
-
|
|
421
|
+
...compactObject({ ifMatch: input.expected_version }),
|
|
422
|
+
path: `/channels/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
|
|
638
423
|
body: { explicitConfirmation: input.explicit_confirmation },
|
|
639
424
|
}),
|
|
425
|
+
enhanceResponse: withEditVersionInstructions,
|
|
640
426
|
}),
|
|
641
427
|
// ============================================================
|
|
642
428
|
// v1.5 Increment 4d — cross-platform clone (3 tools)
|
|
@@ -686,10 +472,10 @@ export const crmPlatformTools = [
|
|
|
686
472
|
}),
|
|
687
473
|
createRequest: (input) => ({
|
|
688
474
|
method: 'POST',
|
|
689
|
-
path: `/workspaces/${input.workspace_id}/
|
|
475
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
|
|
690
476
|
body: compactObject({
|
|
691
|
-
|
|
692
|
-
|
|
477
|
+
sourceChannelId: input.source_platform_id,
|
|
478
|
+
targetChannelId: input.target_platform_id,
|
|
693
479
|
include: compactObject({
|
|
694
480
|
agents: input.include.agents,
|
|
695
481
|
agentTools: input.include.agent_tools,
|
|
@@ -756,11 +542,11 @@ export const crmPlatformTools = [
|
|
|
756
542
|
.strict(),
|
|
757
543
|
createRequest: (input) => ({
|
|
758
544
|
method: 'POST',
|
|
759
|
-
path: `/workspaces/${input.workspace_id}/
|
|
545
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
|
|
760
546
|
body: compactObject({
|
|
761
547
|
previewToken: input.preview_token,
|
|
762
|
-
|
|
763
|
-
|
|
548
|
+
sourceChannelId: input.source_platform_id,
|
|
549
|
+
targetChannelId: input.target_platform_id,
|
|
764
550
|
explicitConfirmation: input.explicit_confirmation,
|
|
765
551
|
acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
|
|
766
552
|
idempotencyKey: input.idempotency_key,
|
|
@@ -768,7 +554,7 @@ export const crmPlatformTools = [
|
|
|
768
554
|
}),
|
|
769
555
|
}),
|
|
770
556
|
enhanceResponse: (response) => withInstructions(response, [
|
|
771
|
-
'Result reversible через besales_audit_revert (kind=revertClone) —
|
|
557
|
+
'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
|
|
772
558
|
'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
|
|
773
559
|
'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
|
|
774
560
|
'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
|
|
@@ -787,7 +573,7 @@ export const crmPlatformTools = [
|
|
|
787
573
|
.strict(),
|
|
788
574
|
createRequest: (input) => ({
|
|
789
575
|
method: 'GET',
|
|
790
|
-
path: `/workspaces/${input.workspace_id}/
|
|
576
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
|
|
791
577
|
}),
|
|
792
578
|
}),
|
|
793
579
|
// ============================================================
|
|
@@ -810,6 +596,10 @@ export const crmPlatformTools = [
|
|
|
810
596
|
source: mcpFileSourceSchema.optional(),
|
|
811
597
|
mime_type: z.string().max(255).optional(),
|
|
812
598
|
size_bytes: z.number().int().positive().max(MAX_FILE_UPLOAD_BYTES).optional(),
|
|
599
|
+
// Носитель, РАДИ которого грузится файл: он станет владельцем и только он вправе его
|
|
600
|
+
// убрать. Порядок: создать карточку → запросить загрузку ДЛЯ НЕЁ → человек кладёт файл.
|
|
601
|
+
owner_kind: z.literal('KNOWLEDGE_SOURCE').optional(),
|
|
602
|
+
owner_id: uuidSchema.optional(),
|
|
813
603
|
})
|
|
814
604
|
.strict(),
|
|
815
605
|
createRequest: (input) => ({
|
|
@@ -822,11 +612,14 @@ export const crmPlatformTools = [
|
|
|
822
612
|
source: input.source,
|
|
823
613
|
mime_type: input.mime_type,
|
|
824
614
|
size_bytes: input.size_bytes,
|
|
615
|
+
owner_kind: input.owner_kind,
|
|
616
|
+
owner_id: input.owner_id,
|
|
825
617
|
}),
|
|
826
618
|
}),
|
|
827
619
|
enhanceResponse: (response) => withInstructions(response, [
|
|
828
620
|
'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
|
|
829
|
-
'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в
|
|
621
|
+
'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в besales_knowledge_document_upload с source_kind=STORED_FILE / behavior greeting).',
|
|
622
|
+
'Файл ДЛЯ карточки знаний: сначала создайте карточку, затем запросите загрузку с owner_kind=KNOWLEDGE_SOURCE и owner_id=<id карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
|
|
830
623
|
'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
|
|
831
624
|
]),
|
|
832
625
|
}),
|
|
@@ -843,7 +636,7 @@ export const crmPlatformTools = [
|
|
|
843
636
|
.strict(),
|
|
844
637
|
createRequest: (input) => ({
|
|
845
638
|
method: 'GET',
|
|
846
|
-
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
|
|
639
|
+
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
|
|
847
640
|
}),
|
|
848
641
|
enhanceResponse: (response) => withInstructions(response, [
|
|
849
642
|
'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -886,6 +679,7 @@ export const crmPlatformTools = [
|
|
|
886
679
|
schema: z
|
|
887
680
|
.object({
|
|
888
681
|
workspace_id: uuidSchema.optional(),
|
|
682
|
+
operation_id: setupInitOperationIdSchema,
|
|
889
683
|
platform_type: apiKeyPlatformTypeSchema,
|
|
890
684
|
name: z.string().min(1).max(255),
|
|
891
685
|
// Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
|
|
@@ -900,6 +694,7 @@ export const crmPlatformTools = [
|
|
|
900
694
|
method: 'POST',
|
|
901
695
|
path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
|
|
902
696
|
body: compactObject({
|
|
697
|
+
operationId: input.operation_id,
|
|
903
698
|
platform_type: input.platform_type,
|
|
904
699
|
name: input.name,
|
|
905
700
|
fields: input.fields,
|
|
@@ -925,7 +720,7 @@ export const crmPlatformTools = [
|
|
|
925
720
|
.strict(),
|
|
926
721
|
createRequest: (input) => ({
|
|
927
722
|
method: 'GET',
|
|
928
|
-
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
|
|
723
|
+
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
929
724
|
}),
|
|
930
725
|
enhanceResponse: (response) => withInstructions(response, [
|
|
931
726
|
'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -951,7 +746,10 @@ export const crmPlatformTools = [
|
|
|
951
746
|
createRequest: (input) => ({
|
|
952
747
|
method: 'POST',
|
|
953
748
|
path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
|
|
954
|
-
body: compactObject({
|
|
749
|
+
body: compactObject({
|
|
750
|
+
platform_type: input.platform_type,
|
|
751
|
+
name: input.name,
|
|
752
|
+
}),
|
|
955
753
|
}),
|
|
956
754
|
enhanceResponse: (response) => withInstructions(response, [
|
|
957
755
|
'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
|
|
@@ -960,12 +758,10 @@ export const crmPlatformTools = [
|
|
|
960
758
|
]),
|
|
961
759
|
}),
|
|
962
760
|
// ============================================================
|
|
963
|
-
//
|
|
761
|
+
// CRM Connection + Field Mapping + Operators
|
|
964
762
|
// ============================================================
|
|
965
|
-
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM):
|
|
966
|
-
//
|
|
967
|
-
// вебхуком). Field mapping + operators — для уже подключённых CRM (AmoCRM/Bitrix24 для mapping;
|
|
968
|
-
// AmoCRM для operators).
|
|
763
|
+
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
|
|
764
|
+
// Bitrix24. Field mapping + operators — для уже подключённых CRM.
|
|
969
765
|
defineTool({
|
|
970
766
|
name: 'besales_crm_create_init',
|
|
971
767
|
sideEffect: 'write',
|
|
@@ -974,17 +770,22 @@ export const crmPlatformTools = [
|
|
|
974
770
|
schema: z
|
|
975
771
|
.object({
|
|
976
772
|
workspace_id: uuidSchema.optional(),
|
|
773
|
+
operation_id: setupInitOperationIdSchema,
|
|
977
774
|
crm_type: provisionableCrmTypeSchema,
|
|
978
775
|
// Публичные non-secret поля: GETCOURSE={account_domain, managed_tag_prefix?};
|
|
979
|
-
//
|
|
980
|
-
// Секреты (school_api_key /
|
|
776
|
+
// AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
|
|
777
|
+
// Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
|
|
981
778
|
fields: optionalAnyObjectSchema,
|
|
982
779
|
})
|
|
983
780
|
.strict(),
|
|
984
781
|
createRequest: (input) => ({
|
|
985
782
|
method: 'POST',
|
|
986
783
|
path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
|
|
987
|
-
body: compactObject({
|
|
784
|
+
body: compactObject({
|
|
785
|
+
operationId: input.operation_id,
|
|
786
|
+
crm_type: input.crm_type,
|
|
787
|
+
fields: input.fields,
|
|
788
|
+
}),
|
|
988
789
|
}),
|
|
989
790
|
enhanceResponse: (response) => withInstructions(response, [
|
|
990
791
|
'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
|
|
@@ -1006,11 +807,11 @@ export const crmPlatformTools = [
|
|
|
1006
807
|
.strict(),
|
|
1007
808
|
createRequest: (input) => ({
|
|
1008
809
|
method: 'GET',
|
|
1009
|
-
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
|
|
810
|
+
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
1010
811
|
}),
|
|
1011
812
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1012
813
|
'status: AWAITING_USER → VALIDATING → READY (`crm_id`) | VALIDATION_FAILED (`error_message`) | EXPIRED.',
|
|
1013
|
-
'READY = CRM
|
|
814
|
+
'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
|
|
1014
815
|
'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
|
|
1015
816
|
]),
|
|
1016
817
|
}),
|
|
@@ -1027,12 +828,11 @@ export const crmPlatformTools = [
|
|
|
1027
828
|
.strict(),
|
|
1028
829
|
createRequest: (input) => ({
|
|
1029
830
|
method: 'POST',
|
|
1030
|
-
path: `/
|
|
831
|
+
path: `/crm-connections/${input.crm_id}/activate`,
|
|
1031
832
|
}),
|
|
1032
833
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1033
|
-
'CRM
|
|
1034
|
-
'
|
|
1035
|
-
'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
|
|
834
|
+
'CRM connection активирована после live-проверки credentials.',
|
|
835
|
+
'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
|
|
1036
836
|
]),
|
|
1037
837
|
}),
|
|
1038
838
|
defineTool({
|
|
@@ -1047,12 +847,12 @@ export const crmPlatformTools = [
|
|
|
1047
847
|
.strict(),
|
|
1048
848
|
createRequest: (input) => ({
|
|
1049
849
|
method: 'GET',
|
|
1050
|
-
path: `/workspaces/${input.workspace_id}/
|
|
850
|
+
path: `/workspaces/${input.workspace_id}/crm-connections`,
|
|
1051
851
|
}),
|
|
1052
852
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1053
|
-
'Список CRM workspace
|
|
853
|
+
'Список v2 CRM connections workspace без credentials.',
|
|
1054
854
|
'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
|
|
1055
|
-
'
|
|
855
|
+
'Неактивное подключение можно включить через besales_crm_activate.',
|
|
1056
856
|
]),
|
|
1057
857
|
}),
|
|
1058
858
|
defineTool({
|
|
@@ -1072,8 +872,36 @@ export const crmPlatformTools = [
|
|
|
1072
872
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1073
873
|
'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
|
|
1074
874
|
'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
|
|
1075
|
-
'
|
|
1076
|
-
'
|
|
875
|
+
'⚠️ Метку :scope_id в адресе вебхука НЕ трогай и не заменяй: её подставляет сама amoCRM при каждом хуке. Секрета в адресе нет — это нормально.',
|
|
876
|
+
'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот, контактный e-mail для связи при ошибках): их знает только владелец аккаунта, назови их отдельно.',
|
|
877
|
+
'crmConnectionId и crmConnectionName называют подключение, для которого собрана заявка: адрес принадлежит ПОДКЛЮЧЕНИЮ, а не рабочей области.',
|
|
878
|
+
'Если у рабочей области несколько подключений amoCRM и активное среди них не одно, сервер откажет и назовёт подключения по именам: заявку для нужного подключения открой в интерфейсе — этот инструмент подключение выбрать не умеет.',
|
|
879
|
+
'Полученные от поддержки channelId и секрет канала привязываются к каналу в интерфейсе (раздел подключения канала, чат amoCRM) — через ассистента секрет не проходит и этого шага в MCP нет.',
|
|
880
|
+
]),
|
|
881
|
+
}),
|
|
882
|
+
// ⛔ Адрес приёма событий CRM через этот инструмент НЕ проходит: он несёт пропуск параметром
|
|
883
|
+
// строки запроса, а ответ инструмента ложится в транскрипт хоста и его телеметрию. Вместо
|
|
884
|
+
// адреса выдаётся одноразовая ссылка; страница за ней требует входа и права управлять CRM.
|
|
885
|
+
defineTool({
|
|
886
|
+
name: 'besales_crm_webhook_url_reveal',
|
|
887
|
+
sideEffect: 'write',
|
|
888
|
+
requiredFields: ['crm_id'],
|
|
889
|
+
defaultWorkspaceId: false,
|
|
890
|
+
schema: z
|
|
891
|
+
.object({
|
|
892
|
+
crm_id: uuidSchema,
|
|
893
|
+
})
|
|
894
|
+
.strict(),
|
|
895
|
+
createRequest: (input) => ({
|
|
896
|
+
method: 'POST',
|
|
897
|
+
path: '/crm-webhook-url-reveals',
|
|
898
|
+
body: { crmConnectionId: input.crm_id },
|
|
899
|
+
}),
|
|
900
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
901
|
+
'Ответ: { revealUrl, revealExpiresAt }. Самого адреса в нём НЕТ и не будет: адрес несёт пропуск, а секреты через ассистента не проходят.',
|
|
902
|
+
'Передай человеку revealUrl и попроси открыть в браузере. Страница потребует входа и права управлять CRM и покажет адрес ОДИН раз.',
|
|
903
|
+
'Ссылка одноразовая и с ограниченным сроком (revealExpiresAt); просроченную или уже открытую заказывай заново этим же инструментом.',
|
|
904
|
+
'Адрес нужен, чтобы человек вписал его в настройки вебхуков amoCRM. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
|
|
1077
905
|
]),
|
|
1078
906
|
}),
|
|
1079
907
|
defineTool({
|
|
@@ -1096,11 +924,11 @@ export const crmPlatformTools = [
|
|
|
1096
924
|
.strict(),
|
|
1097
925
|
createRequest: (input) => ({
|
|
1098
926
|
method: 'GET',
|
|
1099
|
-
path: `/
|
|
927
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1100
928
|
}),
|
|
1101
929
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1102
|
-
'Возвращает
|
|
1103
|
-
'
|
|
930
|
+
'Возвращает текущий список v2 field mappings.',
|
|
931
|
+
'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
|
|
1104
932
|
]),
|
|
1105
933
|
}),
|
|
1106
934
|
defineTool({
|
|
@@ -1120,16 +948,22 @@ export const crmPlatformTools = [
|
|
|
1120
948
|
.strict(),
|
|
1121
949
|
createRequest: (input) => ({
|
|
1122
950
|
method: 'PUT',
|
|
1123
|
-
path: `/
|
|
951
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1124
952
|
body: {
|
|
1125
|
-
replace_all_existing: input.replace_all_existing,
|
|
1126
953
|
enabled: input.enabled,
|
|
1127
|
-
|
|
954
|
+
mappings: input.field_mappings.map((mapping) => compactObject({
|
|
955
|
+
crmFieldId: mapping.crm_field_id,
|
|
956
|
+
crmFieldName: mapping.crm_field_name,
|
|
957
|
+
saveAs: mapping.save_as,
|
|
958
|
+
isEnabled: mapping.enabled,
|
|
959
|
+
specialPurpose: mapping.special_purpose,
|
|
960
|
+
category: mapping.category,
|
|
961
|
+
})),
|
|
1128
962
|
},
|
|
1129
963
|
}),
|
|
1130
964
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1131
|
-
'Replace-all:
|
|
1132
|
-
'
|
|
965
|
+
'Replace-all: передавай весь желаемый набор mappings, а не патч.',
|
|
966
|
+
'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
|
|
1133
967
|
]),
|
|
1134
968
|
}),
|
|
1135
969
|
defineTool({
|
|
@@ -1146,11 +980,11 @@ export const crmPlatformTools = [
|
|
|
1146
980
|
.strict(),
|
|
1147
981
|
createRequest: (input) => ({
|
|
1148
982
|
method: 'GET',
|
|
1149
|
-
path: `/
|
|
983
|
+
path: `/crm-connections/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
|
|
1150
984
|
}),
|
|
1151
985
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1152
|
-
'
|
|
1153
|
-
'sync=true
|
|
986
|
+
'Возвращаются активные локальные CRM operators.',
|
|
987
|
+
'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
|
|
1154
988
|
]),
|
|
1155
989
|
}),
|
|
1156
990
|
defineTool({
|
|
@@ -1165,24 +999,87 @@ export const crmPlatformTools = [
|
|
|
1165
999
|
operator_id: uuidSchema,
|
|
1166
1000
|
is_operator: z.boolean().optional(),
|
|
1167
1001
|
is_sdr: z.boolean().optional(),
|
|
1002
|
+
expected_version: z
|
|
1003
|
+
.uuid()
|
|
1004
|
+
.describe('Версия снимка из чтения; без автоматического перечитывания и повтора при конфликте')
|
|
1005
|
+
.optional(),
|
|
1006
|
+
workspace_member_id: z
|
|
1007
|
+
.string()
|
|
1008
|
+
.min(1)
|
|
1009
|
+
.nullable()
|
|
1010
|
+
.describe('users.id сотрудника Besales; null снимает связь вручную, пропуск сохраняет её')
|
|
1011
|
+
.optional(),
|
|
1168
1012
|
})
|
|
1169
1013
|
.strict()
|
|
1170
1014
|
.superRefine((input, ctx) => {
|
|
1171
|
-
if (input.
|
|
1015
|
+
if (input.workspace_member_id !== undefined && input.expected_version === undefined) {
|
|
1016
|
+
ctx.addIssue({
|
|
1017
|
+
code: z.ZodIssueCode.custom,
|
|
1018
|
+
path: ['expected_version'],
|
|
1019
|
+
message: 'Provide expected_version when changing workspace_member_id',
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
if (!CRM_OPERATOR_CHANGE_FIELDS.some((field) => input[field] !== undefined)) {
|
|
1172
1023
|
ctx.addIssue({
|
|
1173
1024
|
code: z.ZodIssueCode.custom,
|
|
1174
|
-
message: 'Provide at least one of is_operator / is_sdr',
|
|
1025
|
+
message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
|
|
1175
1026
|
});
|
|
1176
1027
|
}
|
|
1177
1028
|
}),
|
|
1178
1029
|
createRequest: (input) => ({
|
|
1179
1030
|
method: 'PATCH',
|
|
1180
|
-
path: `/
|
|
1181
|
-
body: compactObject({
|
|
1031
|
+
path: `/crm-connections/${input.crm_id}/operators/${input.operator_id}`,
|
|
1032
|
+
body: compactObject({
|
|
1033
|
+
isOperator: input.is_operator,
|
|
1034
|
+
isSdr: input.is_sdr,
|
|
1035
|
+
expectedVersion: input.expected_version,
|
|
1036
|
+
workspaceMemberId: input.workspace_member_id,
|
|
1037
|
+
}),
|
|
1038
|
+
}),
|
|
1039
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
1040
|
+
'Обновляет флаги и ручную связь с сотрудником. workspace_member_id — users.id; null снимает связь вручную.',
|
|
1041
|
+
'Передайте expected_version прочитанной строки при изменении связи. При 409 сохраните ввод и перечитайте для сравнения; автоматического повтора нет.',
|
|
1042
|
+
'Непереданный флаг сохраняет текущее значение; operator_id бери из besales_crm_operator_list.',
|
|
1043
|
+
]),
|
|
1044
|
+
}),
|
|
1045
|
+
defineTool({
|
|
1046
|
+
name: 'besales_crm_rotate_init',
|
|
1047
|
+
sideEffect: 'write',
|
|
1048
|
+
defaultWorkspaceId: true,
|
|
1049
|
+
requiredFields: ['connection_id'],
|
|
1050
|
+
schema: z
|
|
1051
|
+
.object({
|
|
1052
|
+
workspace_id: uuidSchema.optional(),
|
|
1053
|
+
connection_id: uuidSchema,
|
|
1054
|
+
mode: z.enum(['GETCOURSE_KEYS', 'LONG_LIVED', 'OAUTH_PENDING', 'OAUTH']).optional(),
|
|
1055
|
+
})
|
|
1056
|
+
.strict(),
|
|
1057
|
+
createRequest: (input) => ({
|
|
1058
|
+
method: 'POST',
|
|
1059
|
+
path: `/workspaces/${input.workspace_id}/crm-connections/${input.connection_id}/credential-setup-sessions`,
|
|
1060
|
+
body: compactObject({ mode: input.mode }),
|
|
1061
|
+
}),
|
|
1062
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
1063
|
+
'Передай setup_page_url человеку: ключи вводятся только в браузере. Не проси секреты в чат. Затем опрашивай besales_crm_rotate_status. Существующая CRM и её связи сохраняются.',
|
|
1064
|
+
]),
|
|
1065
|
+
}),
|
|
1066
|
+
defineTool({
|
|
1067
|
+
name: 'besales_crm_rotate_status',
|
|
1068
|
+
sideEffect: 'none',
|
|
1069
|
+
defaultWorkspaceId: true,
|
|
1070
|
+
requiredFields: ['setup_ref'],
|
|
1071
|
+
schema: z
|
|
1072
|
+
.object({
|
|
1073
|
+
workspace_id: uuidSchema.optional(),
|
|
1074
|
+
setup_ref: z.string().min(1),
|
|
1075
|
+
})
|
|
1076
|
+
.strict(),
|
|
1077
|
+
createRequest: (input) => ({
|
|
1078
|
+
method: 'GET',
|
|
1079
|
+
path: `/workspaces/${input.workspace_id}/crm-credential-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
1182
1080
|
}),
|
|
1183
1081
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1184
|
-
'
|
|
1185
|
-
'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
|
|
1082
|
+
'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
|
|
1186
1083
|
]),
|
|
1187
1084
|
}),
|
|
1188
1085
|
];
|