@besales/mcp 0.47.1 → 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.
- package/README.md +109 -164
- 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 +52 -7
- package/dist/http/api-client.js +131 -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 +8 -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 +106 -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 -4
- 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 +12061 -6753
- 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 +78 -21
- 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 -427
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +19 -13
- package/dist/tools/definitions/broadcast-scheduler.js +217 -128
- 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 +28 -39
- package/dist/tools/definitions/crm-platform.js +235 -344
- 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/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 -354
- 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 +17 -29
- package/dist/tools/definitions/getcourse-cold-welcome.js +182 -242
- 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 +1 -0
- 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 +701 -222
- 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 +414 -284
- package/dist/tools/definitions/shared.js +436 -619
- 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 +5 -5
- 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-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 +29 -0
- package/dist/tools/definitions/trigger-upsert.tool.js +122 -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 +1105 -621
- package/dist/tools/definitions.js +57 -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 +753 -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 +13 -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 +82 -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 +105862 -22115
- 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/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 +137 -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-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/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 +868 -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 +121 -0
- package/scripts/sync-trigger-repeat-mapping.mjs +12 -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/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 -927
- 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,267 +1,10 @@
|
|
|
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 {
|
|
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'];
|
|
4
7
|
export const crmPlatformTools = [
|
|
5
|
-
// ============================================================
|
|
6
|
-
// v1.5 Increment 4a — Unified Variables API (5 tools, v2-shaped scope discriminator)
|
|
7
|
-
// ============================================================
|
|
8
|
-
// Backend wraps two v1 tables (WorkspaceVariable + CustomVariable) под единый MCP shape.
|
|
9
|
-
// При v2 cutover (spec 23) обе таблицы → один `variables` с тем же `scope` discriminator —
|
|
10
|
-
// MCP shape работает без изменений.
|
|
11
|
-
defineTool({
|
|
12
|
-
name: 'besales_variable_list',
|
|
13
|
-
sideEffect: 'none',
|
|
14
|
-
closedWorld: true,
|
|
15
|
-
requiredFields: ['scope'],
|
|
16
|
-
defaultWorkspaceId: true,
|
|
17
|
-
// По этому перечню строят условия правил. Отсутствующая в усечённом списке переменная
|
|
18
|
-
// неотличима от «значение не проставлено», и правило получается недостижимым.
|
|
19
|
-
resultPolicy: { neverTruncate: true },
|
|
20
|
-
schema: z
|
|
21
|
-
.object({
|
|
22
|
-
workspace_id: uuidSchema.optional(),
|
|
23
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
24
|
-
platform_id: uuidSchema.optional(),
|
|
25
|
-
filter: z.enum(['all', 'variables', 'constants']).optional(),
|
|
26
|
-
// ⚠️ Без дефолта. Сервер СВОЙ дефолт имеет (50), и до появления этих двух ручек
|
|
27
|
-
// перечень молча обрывался на пятидесятой строке, а способа дочитать не было вовсе.
|
|
28
|
-
limit: z.number().int().min(1).max(VARIABLES_MAX_PAGE_SIZE).optional(),
|
|
29
|
-
cursor: z.string().min(1).optional(),
|
|
30
|
-
})
|
|
31
|
-
.strict()
|
|
32
|
-
.superRefine((input, ctx) => {
|
|
33
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
34
|
-
ctx.addIssue({
|
|
35
|
-
code: z.ZodIssueCode.custom,
|
|
36
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
37
|
-
path: ['platform_id'],
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
if (input.scope === 'WORKSPACE' && input.platform_id) {
|
|
41
|
-
ctx.addIssue({
|
|
42
|
-
code: z.ZodIssueCode.custom,
|
|
43
|
-
message: 'platform_id is forbidden when scope=WORKSPACE',
|
|
44
|
-
path: ['platform_id'],
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
}),
|
|
48
|
-
createRequest: (input) => ({
|
|
49
|
-
method: 'GET',
|
|
50
|
-
path: `/workspaces/${input.workspace_id}/variables${buildVariableListQuery(input.scope, input.platform_id, input.filter, input.limit, input.cursor)}`,
|
|
51
|
-
}),
|
|
52
|
-
enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
|
|
53
|
-
// Страницу попросили явно — отказ неуместен: постраничный обход это и есть.
|
|
54
|
-
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
55
|
-
toolName: 'besales_variable_list',
|
|
56
|
-
howToPage: `Позовите снова с limit (до ${VARIABLES_MAX_PAGE_SIZE}) и продолжайте по nextCursor, пока он не станет пустым.`,
|
|
57
|
-
}), [
|
|
58
|
-
'WORKSPACE scope возвращает глобальные переменные workspace; CHANNEL — переменные указанной платформы.',
|
|
59
|
-
'CHANNEL требует platform_id; filter=variables исключает константы, filter=constants оставляет только их.',
|
|
60
|
-
'nextCursor в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
|
|
61
|
-
]),
|
|
62
|
-
}),
|
|
63
|
-
defineTool({
|
|
64
|
-
name: 'besales_variable_create',
|
|
65
|
-
sideEffect: 'write',
|
|
66
|
-
closedWorld: true,
|
|
67
|
-
requiredFields: ['scope', 'name', 'type'],
|
|
68
|
-
defaultWorkspaceId: true,
|
|
69
|
-
schema: z
|
|
70
|
-
.object({
|
|
71
|
-
workspace_id: uuidSchema.optional(),
|
|
72
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
73
|
-
name: z.string().regex(/^[a-zA-Z_][a-zA-Z0-9_]*$/, {
|
|
74
|
-
message: 'name must be ASCII letters/digits/underscores; start with letter or _',
|
|
75
|
-
}),
|
|
76
|
-
description: z.string().optional(),
|
|
77
|
-
type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']),
|
|
78
|
-
// WORKSPACE-only
|
|
79
|
-
value: z.string().optional(),
|
|
80
|
-
// CHANNEL-only
|
|
81
|
-
platform_id: uuidSchema.optional(),
|
|
82
|
-
is_constant: z.boolean().optional(),
|
|
83
|
-
constant_value: z.string().optional(),
|
|
84
|
-
})
|
|
85
|
-
.strict()
|
|
86
|
-
.superRefine((input, ctx) => {
|
|
87
|
-
if (input.scope === 'WORKSPACE') {
|
|
88
|
-
if (input.platform_id) {
|
|
89
|
-
ctx.addIssue({
|
|
90
|
-
code: z.ZodIssueCode.custom,
|
|
91
|
-
message: 'platform_id is forbidden when scope=WORKSPACE',
|
|
92
|
-
path: ['platform_id'],
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
if (input.is_constant !== undefined || input.constant_value !== undefined) {
|
|
96
|
-
ctx.addIssue({
|
|
97
|
-
code: z.ZodIssueCode.custom,
|
|
98
|
-
message: 'is_constant and constant_value are forbidden when scope=WORKSPACE',
|
|
99
|
-
path: ['is_constant'],
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
// CHANNEL
|
|
105
|
-
if (!input.platform_id) {
|
|
106
|
-
ctx.addIssue({
|
|
107
|
-
code: z.ZodIssueCode.custom,
|
|
108
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
109
|
-
path: ['platform_id'],
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
if (input.value !== undefined) {
|
|
113
|
-
ctx.addIssue({
|
|
114
|
-
code: z.ZodIssueCode.custom,
|
|
115
|
-
message: 'value is forbidden when scope=CHANNEL — use constant_value if isConstant=true',
|
|
116
|
-
path: ['value'],
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
if (input.is_constant === true && !input.constant_value) {
|
|
120
|
-
ctx.addIssue({
|
|
121
|
-
code: z.ZodIssueCode.custom,
|
|
122
|
-
message: 'constant_value is required when scope=CHANNEL and is_constant=true',
|
|
123
|
-
path: ['constant_value'],
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}),
|
|
128
|
-
createRequest: (input) => ({
|
|
129
|
-
method: 'POST',
|
|
130
|
-
path: `/workspaces/${input.workspace_id}/variables`,
|
|
131
|
-
body: compactObject({
|
|
132
|
-
scope: input.scope,
|
|
133
|
-
name: input.name,
|
|
134
|
-
description: input.description,
|
|
135
|
-
type: input.type,
|
|
136
|
-
value: input.value,
|
|
137
|
-
platformId: input.platform_id,
|
|
138
|
-
isConstant: input.is_constant,
|
|
139
|
-
constantValue: input.constant_value,
|
|
140
|
-
}),
|
|
141
|
-
}),
|
|
142
|
-
enhanceResponse: (response) => withInstructions(response, [
|
|
143
|
-
'name, scope, is_constant — immutable post-create (используй delete + create для смены).',
|
|
144
|
-
'WORKSPACE variables референсятся в шаблонах как {{{name}}} (triple braces), CHANNEL constants — {{name}} (double).',
|
|
145
|
-
]),
|
|
146
|
-
}),
|
|
147
|
-
defineTool({
|
|
148
|
-
name: 'besales_variable_get',
|
|
149
|
-
sideEffect: 'none',
|
|
150
|
-
closedWorld: true,
|
|
151
|
-
requiredFields: ['variable_id', 'scope'],
|
|
152
|
-
defaultWorkspaceId: true,
|
|
153
|
-
schema: z
|
|
154
|
-
.object({
|
|
155
|
-
workspace_id: uuidSchema.optional(),
|
|
156
|
-
variable_id: uuidSchema,
|
|
157
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
158
|
-
platform_id: uuidSchema.optional(),
|
|
159
|
-
})
|
|
160
|
-
.strict()
|
|
161
|
-
.superRefine((input, ctx) => {
|
|
162
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
163
|
-
ctx.addIssue({
|
|
164
|
-
code: z.ZodIssueCode.custom,
|
|
165
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
166
|
-
path: ['platform_id'],
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}),
|
|
170
|
-
createRequest: (input) => ({
|
|
171
|
-
method: 'GET',
|
|
172
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}${buildVariableScopeQuery(input.scope, input.platform_id)}`,
|
|
173
|
-
}),
|
|
174
|
-
}),
|
|
175
|
-
defineTool({
|
|
176
|
-
name: 'besales_variable_update',
|
|
177
|
-
sideEffect: 'write',
|
|
178
|
-
closedWorld: true,
|
|
179
|
-
requiredFields: ['variable_id', 'scope'],
|
|
180
|
-
defaultWorkspaceId: true,
|
|
181
|
-
schema: z
|
|
182
|
-
.object({
|
|
183
|
-
workspace_id: uuidSchema.optional(),
|
|
184
|
-
variable_id: uuidSchema,
|
|
185
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
186
|
-
platform_id: uuidSchema.optional(),
|
|
187
|
-
description: z.string().optional(),
|
|
188
|
-
type: z.enum(['TEXT', 'NUMBER', 'FLOAT', 'BOOLEAN']).optional(),
|
|
189
|
-
// WORKSPACE-only (nullable для clear)
|
|
190
|
-
value: z.string().nullable().optional(),
|
|
191
|
-
// CHANNEL-only (nullable для clear)
|
|
192
|
-
constant_value: z.string().nullable().optional(),
|
|
193
|
-
})
|
|
194
|
-
.strict()
|
|
195
|
-
.superRefine((input, ctx) => {
|
|
196
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
197
|
-
ctx.addIssue({
|
|
198
|
-
code: z.ZodIssueCode.custom,
|
|
199
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
200
|
-
path: ['platform_id'],
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
if (input.scope === 'WORKSPACE' && input.constant_value !== undefined) {
|
|
204
|
-
ctx.addIssue({
|
|
205
|
-
code: z.ZodIssueCode.custom,
|
|
206
|
-
message: 'constant_value is forbidden when scope=WORKSPACE',
|
|
207
|
-
path: ['constant_value'],
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
if (input.scope === 'CHANNEL' && input.value !== undefined) {
|
|
211
|
-
ctx.addIssue({
|
|
212
|
-
code: z.ZodIssueCode.custom,
|
|
213
|
-
message: 'value is forbidden when scope=CHANNEL',
|
|
214
|
-
path: ['value'],
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
}),
|
|
218
|
-
createRequest: (input) => ({
|
|
219
|
-
method: 'PATCH',
|
|
220
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
|
|
221
|
-
body: compactObject({
|
|
222
|
-
scope: input.scope,
|
|
223
|
-
platformId: input.platform_id,
|
|
224
|
-
description: input.description,
|
|
225
|
-
type: input.type,
|
|
226
|
-
value: input.value,
|
|
227
|
-
constantValue: input.constant_value,
|
|
228
|
-
}),
|
|
229
|
-
}),
|
|
230
|
-
}),
|
|
231
|
-
defineTool({
|
|
232
|
-
name: 'besales_variable_delete',
|
|
233
|
-
sideEffect: 'write',
|
|
234
|
-
closedWorld: true,
|
|
235
|
-
requiredFields: ['variable_id', 'scope', 'explicit_confirmation'],
|
|
236
|
-
defaultWorkspaceId: true,
|
|
237
|
-
schema: z
|
|
238
|
-
.object({
|
|
239
|
-
workspace_id: uuidSchema.optional(),
|
|
240
|
-
variable_id: uuidSchema,
|
|
241
|
-
scope: z.enum(['WORKSPACE', 'CHANNEL']),
|
|
242
|
-
platform_id: uuidSchema.optional(),
|
|
243
|
-
explicit_confirmation: z.literal(true),
|
|
244
|
-
})
|
|
245
|
-
.strict()
|
|
246
|
-
.superRefine((input, ctx) => {
|
|
247
|
-
if (input.scope === 'CHANNEL' && !input.platform_id) {
|
|
248
|
-
ctx.addIssue({
|
|
249
|
-
code: z.ZodIssueCode.custom,
|
|
250
|
-
message: 'platform_id is required when scope=CHANNEL',
|
|
251
|
-
path: ['platform_id'],
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
}),
|
|
255
|
-
createRequest: (input) => ({
|
|
256
|
-
method: 'DELETE',
|
|
257
|
-
path: `/workspaces/${input.workspace_id}/variables/${input.variable_id}`,
|
|
258
|
-
body: compactObject({
|
|
259
|
-
scope: input.scope,
|
|
260
|
-
platformId: input.platform_id,
|
|
261
|
-
explicitConfirmation: input.explicit_confirmation,
|
|
262
|
-
}),
|
|
263
|
-
}),
|
|
264
|
-
}),
|
|
265
8
|
// ============================================================
|
|
266
9
|
// v1.5 Increment 4b — CRM Pipelines (11 tools)
|
|
267
10
|
// ============================================================
|
|
@@ -286,14 +29,21 @@ export const crmPlatformTools = [
|
|
|
286
29
|
workspace_id: uuidSchema.optional(),
|
|
287
30
|
crm_id: uuidSchema,
|
|
288
31
|
include_deleted: z.boolean().optional(),
|
|
32
|
+
// ⚠️ Без умолчания: отказ по размеру был отказом БЕЗ ВЫХОДА — сузить перечень было нечем.
|
|
33
|
+
limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
|
|
34
|
+
cursor: z.string().min(1).optional(),
|
|
289
35
|
})
|
|
290
36
|
.strict(),
|
|
291
37
|
createRequest: (input) => ({
|
|
292
38
|
method: 'GET',
|
|
293
|
-
path: `/
|
|
39
|
+
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)}` : ''}`,
|
|
294
40
|
}),
|
|
295
|
-
enhanceResponse: (response) => withInstructions(response,
|
|
296
|
-
|
|
41
|
+
enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
|
|
42
|
+
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
43
|
+
toolName: 'besales_crm_pipeline_list',
|
|
44
|
+
howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
|
|
45
|
+
}), [
|
|
46
|
+
'Перед list выполняется best-effort sync; ошибка провайдера не блокирует локальную выдачу.',
|
|
297
47
|
]),
|
|
298
48
|
}),
|
|
299
49
|
defineTool({
|
|
@@ -310,7 +60,7 @@ export const crmPlatformTools = [
|
|
|
310
60
|
.strict(),
|
|
311
61
|
createRequest: (input) => ({
|
|
312
62
|
method: 'GET',
|
|
313
|
-
path: `/
|
|
63
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
314
64
|
}),
|
|
315
65
|
}),
|
|
316
66
|
defineTool({
|
|
@@ -333,7 +83,7 @@ export const crmPlatformTools = [
|
|
|
333
83
|
.strict(),
|
|
334
84
|
createRequest: (input) => ({
|
|
335
85
|
method: 'POST',
|
|
336
|
-
path: `/
|
|
86
|
+
path: `/crm-connections/${input.crm_id}/pipelines`,
|
|
337
87
|
body: compactObject({
|
|
338
88
|
name: input.name,
|
|
339
89
|
sort: input.sort,
|
|
@@ -353,11 +103,7 @@ export const crmPlatformTools = [
|
|
|
353
103
|
name: 'besales_crm_pipeline_update',
|
|
354
104
|
sideEffect: 'write',
|
|
355
105
|
defaultWorkspaceId: true,
|
|
356
|
-
requiredFields: [
|
|
357
|
-
'crm_id',
|
|
358
|
-
'pipeline_id',
|
|
359
|
-
'acknowledge_external_side_effect',
|
|
360
|
-
],
|
|
106
|
+
requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
|
|
361
107
|
schema: z
|
|
362
108
|
.object({
|
|
363
109
|
workspace_id: uuidSchema.optional(),
|
|
@@ -373,7 +119,7 @@ export const crmPlatformTools = [
|
|
|
373
119
|
.strict(),
|
|
374
120
|
createRequest: (input) => ({
|
|
375
121
|
method: 'PATCH',
|
|
376
|
-
path: `/
|
|
122
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
377
123
|
body: compactObject({
|
|
378
124
|
name: input.name,
|
|
379
125
|
sort: input.sort,
|
|
@@ -384,7 +130,7 @@ export const crmPlatformTools = [
|
|
|
384
130
|
}),
|
|
385
131
|
}),
|
|
386
132
|
enhanceResponse: (response) => withInstructions(response, [
|
|
387
|
-
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в
|
|
133
|
+
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
|
|
388
134
|
]),
|
|
389
135
|
}),
|
|
390
136
|
defineTool({
|
|
@@ -408,7 +154,7 @@ export const crmPlatformTools = [
|
|
|
408
154
|
.strict(),
|
|
409
155
|
createRequest: (input) => ({
|
|
410
156
|
method: 'DELETE',
|
|
411
|
-
path: `/
|
|
157
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
412
158
|
body: {
|
|
413
159
|
explicitConfirmation: input.explicit_confirmation,
|
|
414
160
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -432,24 +178,34 @@ export const crmPlatformTools = [
|
|
|
432
178
|
workspace_id: uuidSchema.optional(),
|
|
433
179
|
crm_id: uuidSchema,
|
|
434
180
|
pipeline_id: z.number().int(),
|
|
181
|
+
// ⚠️ Без умолчания: недостающая стадия даёт недостижимое правило маршрутизации.
|
|
182
|
+
limit: z.number().int().min(1).max(CRM_PIPELINES_MAX_PAGE_SIZE).optional(),
|
|
183
|
+
cursor: z.string().min(1).optional(),
|
|
435
184
|
})
|
|
436
185
|
.strict(),
|
|
437
|
-
createRequest: (input) =>
|
|
438
|
-
|
|
439
|
-
|
|
186
|
+
createRequest: (input) => {
|
|
187
|
+
const query = new URLSearchParams();
|
|
188
|
+
if (input.limit !== undefined)
|
|
189
|
+
query.set('limit', String(input.limit));
|
|
190
|
+
if (input.cursor)
|
|
191
|
+
query.set('cursor', input.cursor);
|
|
192
|
+
const suffix = query.size > 0 ? `?${query.toString()}` : '';
|
|
193
|
+
return {
|
|
194
|
+
method: 'GET',
|
|
195
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses${suffix}`,
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
enhanceResponse: (response, input) => assertCompleteList(response, {
|
|
199
|
+
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
200
|
+
toolName: 'besales_crm_pipeline_status_list',
|
|
201
|
+
howToPage: `Позовите снова с limit (до ${CRM_PIPELINES_MAX_PAGE_SIZE}) и продолжайте по cursor, пока он не станет пустым.`,
|
|
440
202
|
}),
|
|
441
203
|
}),
|
|
442
204
|
defineTool({
|
|
443
205
|
name: 'besales_crm_pipeline_status_create',
|
|
444
206
|
sideEffect: 'write',
|
|
445
207
|
defaultWorkspaceId: true,
|
|
446
|
-
requiredFields: [
|
|
447
|
-
'crm_id',
|
|
448
|
-
'pipeline_id',
|
|
449
|
-
'name',
|
|
450
|
-
'sort',
|
|
451
|
-
'acknowledge_external_side_effect',
|
|
452
|
-
],
|
|
208
|
+
requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
|
|
453
209
|
schema: z
|
|
454
210
|
.object({
|
|
455
211
|
workspace_id: uuidSchema.optional(),
|
|
@@ -460,8 +216,16 @@ export const crmPlatformTools = [
|
|
|
460
216
|
color: z.string().optional(),
|
|
461
217
|
status_types: z.array(z.string()).optional(),
|
|
462
218
|
is_editable: z.boolean().optional(),
|
|
219
|
+
is_system_managed: z
|
|
220
|
+
.boolean()
|
|
221
|
+
.optional()
|
|
222
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
463
223
|
is_bot_active: z.boolean().optional(),
|
|
464
224
|
is_operator_available: z.boolean().optional(),
|
|
225
|
+
is_terminal: z
|
|
226
|
+
.boolean()
|
|
227
|
+
.optional()
|
|
228
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
465
229
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
466
230
|
status_id: z.number().int().optional(),
|
|
467
231
|
acknowledge_external_side_effect: z.literal(true),
|
|
@@ -469,15 +233,17 @@ export const crmPlatformTools = [
|
|
|
469
233
|
.strict(),
|
|
470
234
|
createRequest: (input) => ({
|
|
471
235
|
method: 'POST',
|
|
472
|
-
path: `/
|
|
236
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
|
|
473
237
|
body: compactObject({
|
|
474
238
|
name: input.name,
|
|
475
239
|
sort: input.sort,
|
|
476
240
|
color: input.color,
|
|
477
241
|
statusTypes: input.status_types,
|
|
478
242
|
isEditable: input.is_editable,
|
|
243
|
+
isSystemManaged: input.is_system_managed,
|
|
479
244
|
isBotActive: input.is_bot_active,
|
|
480
245
|
isOperatorAvailable: input.is_operator_available,
|
|
246
|
+
isTerminal: input.is_terminal,
|
|
481
247
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
482
248
|
statusId: input.status_id,
|
|
483
249
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -491,12 +257,7 @@ export const crmPlatformTools = [
|
|
|
491
257
|
name: 'besales_crm_pipeline_status_update',
|
|
492
258
|
sideEffect: 'write',
|
|
493
259
|
defaultWorkspaceId: true,
|
|
494
|
-
requiredFields: [
|
|
495
|
-
'crm_id',
|
|
496
|
-
'pipeline_id',
|
|
497
|
-
'status_id',
|
|
498
|
-
'acknowledge_external_side_effect',
|
|
499
|
-
],
|
|
260
|
+
requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
|
|
500
261
|
schema: z
|
|
501
262
|
.object({
|
|
502
263
|
workspace_id: uuidSchema.optional(),
|
|
@@ -510,17 +271,21 @@ export const crmPlatformTools = [
|
|
|
510
271
|
is_system_managed: z
|
|
511
272
|
.boolean()
|
|
512
273
|
.optional()
|
|
513
|
-
.describe('
|
|
274
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
514
275
|
is_editable: z.boolean().optional(),
|
|
515
276
|
is_bot_active: z.boolean().optional(),
|
|
516
277
|
is_operator_available: z.boolean().optional(),
|
|
278
|
+
is_terminal: z
|
|
279
|
+
.boolean()
|
|
280
|
+
.optional()
|
|
281
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
517
282
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
518
283
|
acknowledge_external_side_effect: z.literal(true),
|
|
519
284
|
})
|
|
520
285
|
.strict(),
|
|
521
286
|
createRequest: (input) => ({
|
|
522
287
|
method: 'PATCH',
|
|
523
|
-
path: `/
|
|
288
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
524
289
|
body: compactObject({
|
|
525
290
|
name: input.name,
|
|
526
291
|
sort: input.sort,
|
|
@@ -530,6 +295,7 @@ export const crmPlatformTools = [
|
|
|
530
295
|
isEditable: input.is_editable,
|
|
531
296
|
isBotActive: input.is_bot_active,
|
|
532
297
|
isOperatorAvailable: input.is_operator_available,
|
|
298
|
+
isTerminal: input.is_terminal,
|
|
533
299
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
534
300
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
535
301
|
}),
|
|
@@ -561,7 +327,7 @@ export const crmPlatformTools = [
|
|
|
561
327
|
.strict(),
|
|
562
328
|
createRequest: (input) => ({
|
|
563
329
|
method: 'DELETE',
|
|
564
|
-
path: `/
|
|
330
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
565
331
|
body: {
|
|
566
332
|
explicitConfirmation: input.explicit_confirmation,
|
|
567
333
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -575,6 +341,11 @@ export const crmPlatformTools = [
|
|
|
575
341
|
requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
|
|
576
342
|
schema: z
|
|
577
343
|
.object({
|
|
344
|
+
expected_version: z
|
|
345
|
+
.string()
|
|
346
|
+
.min(1)
|
|
347
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
348
|
+
.optional(),
|
|
578
349
|
workspace_id: uuidSchema.optional(),
|
|
579
350
|
platform_id: uuidSchema,
|
|
580
351
|
pipeline_id: z.number().int(),
|
|
@@ -584,14 +355,16 @@ export const crmPlatformTools = [
|
|
|
584
355
|
.strict(),
|
|
585
356
|
createRequest: (input) => ({
|
|
586
357
|
method: 'POST',
|
|
587
|
-
path: `/
|
|
358
|
+
path: `/channels/${input.platform_id}/active-pipelines`,
|
|
588
359
|
body: compactObject({
|
|
360
|
+
expectedVersion: input.expected_version,
|
|
589
361
|
pipelineId: input.pipeline_id,
|
|
590
362
|
pipelineCrmId: input.pipeline_crm_id,
|
|
591
363
|
sort: input.sort,
|
|
592
364
|
}),
|
|
593
365
|
}),
|
|
594
366
|
enhanceResponse: (response) => withInstructions(response, [
|
|
367
|
+
editVersionInstruction(),
|
|
595
368
|
'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
|
|
596
369
|
]),
|
|
597
370
|
}),
|
|
@@ -602,6 +375,11 @@ export const crmPlatformTools = [
|
|
|
602
375
|
requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
|
|
603
376
|
schema: z
|
|
604
377
|
.object({
|
|
378
|
+
expected_version: z
|
|
379
|
+
.string()
|
|
380
|
+
.min(1)
|
|
381
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
382
|
+
.optional(),
|
|
605
383
|
workspace_id: uuidSchema.optional(),
|
|
606
384
|
platform_id: uuidSchema,
|
|
607
385
|
platform_pipeline_id: uuidSchema,
|
|
@@ -610,9 +388,11 @@ export const crmPlatformTools = [
|
|
|
610
388
|
.strict(),
|
|
611
389
|
createRequest: (input) => ({
|
|
612
390
|
method: 'DELETE',
|
|
613
|
-
|
|
391
|
+
...compactObject({ ifMatch: input.expected_version }),
|
|
392
|
+
path: `/channels/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
|
|
614
393
|
body: { explicitConfirmation: input.explicit_confirmation },
|
|
615
394
|
}),
|
|
395
|
+
enhanceResponse: withEditVersionInstructions,
|
|
616
396
|
}),
|
|
617
397
|
// ============================================================
|
|
618
398
|
// v1.5 Increment 4d — cross-platform clone (3 tools)
|
|
@@ -662,10 +442,10 @@ export const crmPlatformTools = [
|
|
|
662
442
|
}),
|
|
663
443
|
createRequest: (input) => ({
|
|
664
444
|
method: 'POST',
|
|
665
|
-
path: `/workspaces/${input.workspace_id}/
|
|
445
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
|
|
666
446
|
body: compactObject({
|
|
667
|
-
|
|
668
|
-
|
|
447
|
+
sourceChannelId: input.source_platform_id,
|
|
448
|
+
targetChannelId: input.target_platform_id,
|
|
669
449
|
include: compactObject({
|
|
670
450
|
agents: input.include.agents,
|
|
671
451
|
agentTools: input.include.agent_tools,
|
|
@@ -732,11 +512,11 @@ export const crmPlatformTools = [
|
|
|
732
512
|
.strict(),
|
|
733
513
|
createRequest: (input) => ({
|
|
734
514
|
method: 'POST',
|
|
735
|
-
path: `/workspaces/${input.workspace_id}/
|
|
515
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
|
|
736
516
|
body: compactObject({
|
|
737
517
|
previewToken: input.preview_token,
|
|
738
|
-
|
|
739
|
-
|
|
518
|
+
sourceChannelId: input.source_platform_id,
|
|
519
|
+
targetChannelId: input.target_platform_id,
|
|
740
520
|
explicitConfirmation: input.explicit_confirmation,
|
|
741
521
|
acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
|
|
742
522
|
idempotencyKey: input.idempotency_key,
|
|
@@ -744,7 +524,7 @@ export const crmPlatformTools = [
|
|
|
744
524
|
}),
|
|
745
525
|
}),
|
|
746
526
|
enhanceResponse: (response) => withInstructions(response, [
|
|
747
|
-
'Result reversible через besales_audit_revert (kind=revertClone) —
|
|
527
|
+
'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
|
|
748
528
|
'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
|
|
749
529
|
'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
|
|
750
530
|
'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
|
|
@@ -763,7 +543,7 @@ export const crmPlatformTools = [
|
|
|
763
543
|
.strict(),
|
|
764
544
|
createRequest: (input) => ({
|
|
765
545
|
method: 'GET',
|
|
766
|
-
path: `/workspaces/${input.workspace_id}/
|
|
546
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
|
|
767
547
|
}),
|
|
768
548
|
}),
|
|
769
549
|
// ============================================================
|
|
@@ -786,6 +566,10 @@ export const crmPlatformTools = [
|
|
|
786
566
|
source: mcpFileSourceSchema.optional(),
|
|
787
567
|
mime_type: z.string().max(255).optional(),
|
|
788
568
|
size_bytes: z.number().int().positive().max(MAX_FILE_UPLOAD_BYTES).optional(),
|
|
569
|
+
// Носитель, РАДИ которого грузится файл: он станет владельцем и только он вправе его
|
|
570
|
+
// убрать. Порядок: создать карточку → запросить загрузку ДЛЯ НЕЁ → человек кладёт файл.
|
|
571
|
+
owner_kind: z.literal('KNOWLEDGE_SOURCE').optional(),
|
|
572
|
+
owner_id: uuidSchema.optional(),
|
|
789
573
|
})
|
|
790
574
|
.strict(),
|
|
791
575
|
createRequest: (input) => ({
|
|
@@ -798,11 +582,14 @@ export const crmPlatformTools = [
|
|
|
798
582
|
source: input.source,
|
|
799
583
|
mime_type: input.mime_type,
|
|
800
584
|
size_bytes: input.size_bytes,
|
|
585
|
+
owner_kind: input.owner_kind,
|
|
586
|
+
owner_id: input.owner_id,
|
|
801
587
|
}),
|
|
802
588
|
}),
|
|
803
589
|
enhanceResponse: (response) => withInstructions(response, [
|
|
804
590
|
'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
|
|
805
|
-
'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в
|
|
591
|
+
'Затем поллите `besales_file_upload_status({ upload_ref })`: status=READY → `stored_file_id` (используйте в besales_knowledge_document_upload с source_kind=STORED_FILE / behavior greeting).',
|
|
592
|
+
'Файл ДЛЯ карточки знаний: сначала создайте карточку, затем запросите загрузку с owner_kind=KNOWLEDGE_SOURCE и owner_id=<id карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
|
|
806
593
|
'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
|
|
807
594
|
]),
|
|
808
595
|
}),
|
|
@@ -819,7 +606,7 @@ export const crmPlatformTools = [
|
|
|
819
606
|
.strict(),
|
|
820
607
|
createRequest: (input) => ({
|
|
821
608
|
method: 'GET',
|
|
822
|
-
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
|
|
609
|
+
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
|
|
823
610
|
}),
|
|
824
611
|
enhanceResponse: (response) => withInstructions(response, [
|
|
825
612
|
'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -862,6 +649,7 @@ export const crmPlatformTools = [
|
|
|
862
649
|
schema: z
|
|
863
650
|
.object({
|
|
864
651
|
workspace_id: uuidSchema.optional(),
|
|
652
|
+
operation_id: setupInitOperationIdSchema,
|
|
865
653
|
platform_type: apiKeyPlatformTypeSchema,
|
|
866
654
|
name: z.string().min(1).max(255),
|
|
867
655
|
// Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
|
|
@@ -876,6 +664,7 @@ export const crmPlatformTools = [
|
|
|
876
664
|
method: 'POST',
|
|
877
665
|
path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
|
|
878
666
|
body: compactObject({
|
|
667
|
+
operationId: input.operation_id,
|
|
879
668
|
platform_type: input.platform_type,
|
|
880
669
|
name: input.name,
|
|
881
670
|
fields: input.fields,
|
|
@@ -901,7 +690,7 @@ export const crmPlatformTools = [
|
|
|
901
690
|
.strict(),
|
|
902
691
|
createRequest: (input) => ({
|
|
903
692
|
method: 'GET',
|
|
904
|
-
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
|
|
693
|
+
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
905
694
|
}),
|
|
906
695
|
enhanceResponse: (response) => withInstructions(response, [
|
|
907
696
|
'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -927,7 +716,10 @@ export const crmPlatformTools = [
|
|
|
927
716
|
createRequest: (input) => ({
|
|
928
717
|
method: 'POST',
|
|
929
718
|
path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
|
|
930
|
-
body: compactObject({
|
|
719
|
+
body: compactObject({
|
|
720
|
+
platform_type: input.platform_type,
|
|
721
|
+
name: input.name,
|
|
722
|
+
}),
|
|
931
723
|
}),
|
|
932
724
|
enhanceResponse: (response) => withInstructions(response, [
|
|
933
725
|
'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
|
|
@@ -936,12 +728,10 @@ export const crmPlatformTools = [
|
|
|
936
728
|
]),
|
|
937
729
|
}),
|
|
938
730
|
// ============================================================
|
|
939
|
-
//
|
|
731
|
+
// CRM Connection + Field Mapping + Operators
|
|
940
732
|
// ============================================================
|
|
941
|
-
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM):
|
|
942
|
-
//
|
|
943
|
-
// вебхуком). Field mapping + operators — для уже подключённых CRM (AmoCRM/Bitrix24 для mapping;
|
|
944
|
-
// AmoCRM для operators).
|
|
733
|
+
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
|
|
734
|
+
// Bitrix24. Field mapping + operators — для уже подключённых CRM.
|
|
945
735
|
defineTool({
|
|
946
736
|
name: 'besales_crm_create_init',
|
|
947
737
|
sideEffect: 'write',
|
|
@@ -950,17 +740,22 @@ export const crmPlatformTools = [
|
|
|
950
740
|
schema: z
|
|
951
741
|
.object({
|
|
952
742
|
workspace_id: uuidSchema.optional(),
|
|
743
|
+
operation_id: setupInitOperationIdSchema,
|
|
953
744
|
crm_type: provisionableCrmTypeSchema,
|
|
954
745
|
// Публичные non-secret поля: GETCOURSE={account_domain, managed_tag_prefix?};
|
|
955
|
-
//
|
|
956
|
-
// Секреты (school_api_key /
|
|
746
|
+
// AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
|
|
747
|
+
// Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
|
|
957
748
|
fields: optionalAnyObjectSchema,
|
|
958
749
|
})
|
|
959
750
|
.strict(),
|
|
960
751
|
createRequest: (input) => ({
|
|
961
752
|
method: 'POST',
|
|
962
753
|
path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
|
|
963
|
-
body: compactObject({
|
|
754
|
+
body: compactObject({
|
|
755
|
+
operationId: input.operation_id,
|
|
756
|
+
crm_type: input.crm_type,
|
|
757
|
+
fields: input.fields,
|
|
758
|
+
}),
|
|
964
759
|
}),
|
|
965
760
|
enhanceResponse: (response) => withInstructions(response, [
|
|
966
761
|
'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
|
|
@@ -982,11 +777,11 @@ export const crmPlatformTools = [
|
|
|
982
777
|
.strict(),
|
|
983
778
|
createRequest: (input) => ({
|
|
984
779
|
method: 'GET',
|
|
985
|
-
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
|
|
780
|
+
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
986
781
|
}),
|
|
987
782
|
enhanceResponse: (response) => withInstructions(response, [
|
|
988
783
|
'status: AWAITING_USER → VALIDATING → READY (`crm_id`) | VALIDATION_FAILED (`error_message`) | EXPIRED.',
|
|
989
|
-
'READY = CRM
|
|
784
|
+
'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
|
|
990
785
|
'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
|
|
991
786
|
]),
|
|
992
787
|
}),
|
|
@@ -1003,12 +798,11 @@ export const crmPlatformTools = [
|
|
|
1003
798
|
.strict(),
|
|
1004
799
|
createRequest: (input) => ({
|
|
1005
800
|
method: 'POST',
|
|
1006
|
-
path: `/
|
|
801
|
+
path: `/crm-connections/${input.crm_id}/activate`,
|
|
1007
802
|
}),
|
|
1008
803
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1009
|
-
'CRM
|
|
1010
|
-
'
|
|
1011
|
-
'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
|
|
804
|
+
'CRM connection активирована после live-проверки credentials.',
|
|
805
|
+
'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
|
|
1012
806
|
]),
|
|
1013
807
|
}),
|
|
1014
808
|
defineTool({
|
|
@@ -1023,12 +817,12 @@ export const crmPlatformTools = [
|
|
|
1023
817
|
.strict(),
|
|
1024
818
|
createRequest: (input) => ({
|
|
1025
819
|
method: 'GET',
|
|
1026
|
-
path: `/workspaces/${input.workspace_id}/
|
|
820
|
+
path: `/workspaces/${input.workspace_id}/crm-connections`,
|
|
1027
821
|
}),
|
|
1028
822
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1029
|
-
'Список CRM workspace
|
|
823
|
+
'Список v2 CRM connections workspace без credentials.',
|
|
1030
824
|
'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
|
|
1031
|
-
'
|
|
825
|
+
'Неактивное подключение можно включить через besales_crm_activate.',
|
|
1032
826
|
]),
|
|
1033
827
|
}),
|
|
1034
828
|
defineTool({
|
|
@@ -1048,8 +842,36 @@ export const crmPlatformTools = [
|
|
|
1048
842
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1049
843
|
'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
|
|
1050
844
|
'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
|
|
1051
|
-
'
|
|
1052
|
-
'
|
|
845
|
+
'⚠️ Метку :scope_id в адресе вебхука НЕ трогай и не заменяй: её подставляет сама amoCRM при каждом хуке. Секрета в адресе нет — это нормально.',
|
|
846
|
+
'placeholders — места, которые заполняет ЧЕЛОВЕК (номер учётной записи, Id интеграции, скриншот, контактный e-mail для связи при ошибках): их знает только владелец аккаунта, назови их отдельно.',
|
|
847
|
+
'crmConnectionId и crmConnectionName называют подключение, для которого собрана заявка: адрес принадлежит ПОДКЛЮЧЕНИЮ, а не рабочей области.',
|
|
848
|
+
'Если у рабочей области несколько подключений amoCRM и активное среди них не одно, сервер откажет и назовёт подключения по именам: заявку для нужного подключения открой в интерфейсе — этот инструмент подключение выбрать не умеет.',
|
|
849
|
+
'Полученные от поддержки channelId и секрет канала привязываются к каналу в интерфейсе (раздел подключения канала, чат amoCRM) — через ассистента секрет не проходит и этого шага в MCP нет.',
|
|
850
|
+
]),
|
|
851
|
+
}),
|
|
852
|
+
// ⛔ Адрес приёма событий CRM через этот инструмент НЕ проходит: он несёт пропуск параметром
|
|
853
|
+
// строки запроса, а ответ инструмента ложится в транскрипт хоста и его телеметрию. Вместо
|
|
854
|
+
// адреса выдаётся одноразовая ссылка; страница за ней требует входа и права управлять CRM.
|
|
855
|
+
defineTool({
|
|
856
|
+
name: 'besales_crm_webhook_url_reveal',
|
|
857
|
+
sideEffect: 'write',
|
|
858
|
+
requiredFields: ['crm_id'],
|
|
859
|
+
defaultWorkspaceId: false,
|
|
860
|
+
schema: z
|
|
861
|
+
.object({
|
|
862
|
+
crm_id: uuidSchema,
|
|
863
|
+
})
|
|
864
|
+
.strict(),
|
|
865
|
+
createRequest: (input) => ({
|
|
866
|
+
method: 'POST',
|
|
867
|
+
path: '/crm-webhook-url-reveals',
|
|
868
|
+
body: { crmConnectionId: input.crm_id },
|
|
869
|
+
}),
|
|
870
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
871
|
+
'Ответ: { revealUrl, revealExpiresAt }. Самого адреса в нём НЕТ и не будет: адрес несёт пропуск, а секреты через ассистента не проходят.',
|
|
872
|
+
'Передай человеку revealUrl и попроси открыть в браузере. Страница потребует входа и права управлять CRM и покажет адрес ОДИН раз.',
|
|
873
|
+
'Ссылка одноразовая и с ограниченным сроком (revealExpiresAt); просроченную или уже открытую заказывай заново этим же инструментом.',
|
|
874
|
+
'Адрес нужен, чтобы человек вписал его в настройки вебхуков amoCRM. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
|
|
1053
875
|
]),
|
|
1054
876
|
}),
|
|
1055
877
|
defineTool({
|
|
@@ -1072,11 +894,11 @@ export const crmPlatformTools = [
|
|
|
1072
894
|
.strict(),
|
|
1073
895
|
createRequest: (input) => ({
|
|
1074
896
|
method: 'GET',
|
|
1075
|
-
path: `/
|
|
897
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1076
898
|
}),
|
|
1077
899
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1078
|
-
'Возвращает
|
|
1079
|
-
'
|
|
900
|
+
'Возвращает текущий список v2 field mappings.',
|
|
901
|
+
'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
|
|
1080
902
|
]),
|
|
1081
903
|
}),
|
|
1082
904
|
defineTool({
|
|
@@ -1096,16 +918,22 @@ export const crmPlatformTools = [
|
|
|
1096
918
|
.strict(),
|
|
1097
919
|
createRequest: (input) => ({
|
|
1098
920
|
method: 'PUT',
|
|
1099
|
-
path: `/
|
|
921
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1100
922
|
body: {
|
|
1101
|
-
replace_all_existing: input.replace_all_existing,
|
|
1102
923
|
enabled: input.enabled,
|
|
1103
|
-
|
|
924
|
+
mappings: input.field_mappings.map((mapping) => compactObject({
|
|
925
|
+
crmFieldId: mapping.crm_field_id,
|
|
926
|
+
crmFieldName: mapping.crm_field_name,
|
|
927
|
+
saveAs: mapping.save_as,
|
|
928
|
+
isEnabled: mapping.enabled,
|
|
929
|
+
specialPurpose: mapping.special_purpose,
|
|
930
|
+
category: mapping.category,
|
|
931
|
+
})),
|
|
1104
932
|
},
|
|
1105
933
|
}),
|
|
1106
934
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1107
|
-
'Replace-all:
|
|
1108
|
-
'
|
|
935
|
+
'Replace-all: передавай весь желаемый набор mappings, а не патч.',
|
|
936
|
+
'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
|
|
1109
937
|
]),
|
|
1110
938
|
}),
|
|
1111
939
|
defineTool({
|
|
@@ -1122,11 +950,11 @@ export const crmPlatformTools = [
|
|
|
1122
950
|
.strict(),
|
|
1123
951
|
createRequest: (input) => ({
|
|
1124
952
|
method: 'GET',
|
|
1125
|
-
path: `/
|
|
953
|
+
path: `/crm-connections/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
|
|
1126
954
|
}),
|
|
1127
955
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1128
|
-
'
|
|
1129
|
-
'sync=true
|
|
956
|
+
'Возвращаются активные локальные CRM operators.',
|
|
957
|
+
'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
|
|
1130
958
|
]),
|
|
1131
959
|
}),
|
|
1132
960
|
defineTool({
|
|
@@ -1141,24 +969,87 @@ export const crmPlatformTools = [
|
|
|
1141
969
|
operator_id: uuidSchema,
|
|
1142
970
|
is_operator: z.boolean().optional(),
|
|
1143
971
|
is_sdr: z.boolean().optional(),
|
|
972
|
+
expected_version: z
|
|
973
|
+
.uuid()
|
|
974
|
+
.describe('Версия снимка из чтения; без автоматического перечитывания и повтора при конфликте')
|
|
975
|
+
.optional(),
|
|
976
|
+
workspace_member_id: z
|
|
977
|
+
.string()
|
|
978
|
+
.min(1)
|
|
979
|
+
.nullable()
|
|
980
|
+
.describe('users.id сотрудника Besales; null снимает связь вручную, пропуск сохраняет её')
|
|
981
|
+
.optional(),
|
|
1144
982
|
})
|
|
1145
983
|
.strict()
|
|
1146
984
|
.superRefine((input, ctx) => {
|
|
1147
|
-
if (input.
|
|
985
|
+
if (input.workspace_member_id !== undefined && input.expected_version === undefined) {
|
|
986
|
+
ctx.addIssue({
|
|
987
|
+
code: z.ZodIssueCode.custom,
|
|
988
|
+
path: ['expected_version'],
|
|
989
|
+
message: 'Provide expected_version when changing workspace_member_id',
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
if (!CRM_OPERATOR_CHANGE_FIELDS.some((field) => input[field] !== undefined)) {
|
|
1148
993
|
ctx.addIssue({
|
|
1149
994
|
code: z.ZodIssueCode.custom,
|
|
1150
|
-
message: 'Provide at least one of is_operator / is_sdr',
|
|
995
|
+
message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
|
|
1151
996
|
});
|
|
1152
997
|
}
|
|
1153
998
|
}),
|
|
1154
999
|
createRequest: (input) => ({
|
|
1155
1000
|
method: 'PATCH',
|
|
1156
|
-
path: `/
|
|
1157
|
-
body: compactObject({
|
|
1001
|
+
path: `/crm-connections/${input.crm_id}/operators/${input.operator_id}`,
|
|
1002
|
+
body: compactObject({
|
|
1003
|
+
isOperator: input.is_operator,
|
|
1004
|
+
isSdr: input.is_sdr,
|
|
1005
|
+
expectedVersion: input.expected_version,
|
|
1006
|
+
workspaceMemberId: input.workspace_member_id,
|
|
1007
|
+
}),
|
|
1008
|
+
}),
|
|
1009
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
1010
|
+
'Обновляет флаги и ручную связь с сотрудником. workspace_member_id — users.id; null снимает связь вручную.',
|
|
1011
|
+
'Передайте expected_version прочитанной строки при изменении связи. При 409 сохраните ввод и перечитайте для сравнения; автоматического повтора нет.',
|
|
1012
|
+
'Непереданный флаг сохраняет текущее значение; operator_id бери из besales_crm_operator_list.',
|
|
1013
|
+
]),
|
|
1014
|
+
}),
|
|
1015
|
+
defineTool({
|
|
1016
|
+
name: 'besales_crm_rotate_init',
|
|
1017
|
+
sideEffect: 'write',
|
|
1018
|
+
defaultWorkspaceId: true,
|
|
1019
|
+
requiredFields: ['connection_id'],
|
|
1020
|
+
schema: z
|
|
1021
|
+
.object({
|
|
1022
|
+
workspace_id: uuidSchema.optional(),
|
|
1023
|
+
connection_id: uuidSchema,
|
|
1024
|
+
mode: z.enum(['GETCOURSE_KEYS', 'LONG_LIVED', 'OAUTH_PENDING', 'OAUTH']).optional(),
|
|
1025
|
+
})
|
|
1026
|
+
.strict(),
|
|
1027
|
+
createRequest: (input) => ({
|
|
1028
|
+
method: 'POST',
|
|
1029
|
+
path: `/workspaces/${input.workspace_id}/crm-connections/${input.connection_id}/credential-setup-sessions`,
|
|
1030
|
+
body: compactObject({ mode: input.mode }),
|
|
1031
|
+
}),
|
|
1032
|
+
enhanceResponse: (response) => withInstructions(response, [
|
|
1033
|
+
'Передай setup_page_url человеку: ключи вводятся только в браузере. Не проси секреты в чат. Затем опрашивай besales_crm_rotate_status. Существующая CRM и её связи сохраняются.',
|
|
1034
|
+
]),
|
|
1035
|
+
}),
|
|
1036
|
+
defineTool({
|
|
1037
|
+
name: 'besales_crm_rotate_status',
|
|
1038
|
+
sideEffect: 'none',
|
|
1039
|
+
defaultWorkspaceId: true,
|
|
1040
|
+
requiredFields: ['setup_ref'],
|
|
1041
|
+
schema: z
|
|
1042
|
+
.object({
|
|
1043
|
+
workspace_id: uuidSchema.optional(),
|
|
1044
|
+
setup_ref: z.string().min(1),
|
|
1045
|
+
})
|
|
1046
|
+
.strict(),
|
|
1047
|
+
createRequest: (input) => ({
|
|
1048
|
+
method: 'GET',
|
|
1049
|
+
path: `/workspaces/${input.workspace_id}/crm-credential-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
1158
1050
|
}),
|
|
1159
1051
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1160
|
-
'
|
|
1161
|
-
'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
|
|
1052
|
+
'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
|
|
1162
1053
|
]),
|
|
1163
1054
|
}),
|
|
1164
1055
|
];
|