@besales/mcp 0.48.0 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -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 +9902 -4734
- 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 -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 +28 -41
- package/dist/tools/definitions/crm-platform.js +235 -368
- 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 -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 +180 -254
- 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 +686 -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 +396 -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 +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 +1089 -636
- 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 +105875 -22205
- 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 -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,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 {
|
|
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
|
-
defineTool({
|
|
14
|
-
name: 'besales_variable_list',
|
|
15
|
-
sideEffect: 'none',
|
|
16
|
-
closedWorld: true,
|
|
17
|
-
requiredFields: ['scope'],
|
|
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
|
-
}),
|
|
50
|
-
createRequest: (input) => ({
|
|
51
|
-
method: 'GET',
|
|
52
|
-
path: `/workspaces/${input.workspace_id}/variables${buildVariableListQuery(input.scope, input.platform_id, input.filter, input.limit, input.cursor)}`,
|
|
53
|
-
}),
|
|
54
|
-
enhanceResponse: (response, input) => withInstructions(assertCompleteList(response, {
|
|
55
|
-
// Страницу попросили явно — отказ неуместен: постраничный обход это и есть.
|
|
56
|
-
pageRequested: input.limit !== undefined || input.cursor !== undefined,
|
|
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 в ответе означает, что показана НЕ вся выборка: дочитайте страницами.',
|
|
63
|
-
]),
|
|
64
|
-
}),
|
|
65
|
-
defineTool({
|
|
66
|
-
name: 'besales_variable_create',
|
|
67
|
-
sideEffect: 'write',
|
|
68
|
-
closedWorld: true,
|
|
69
|
-
requiredFields: ['scope', 'name', 'type'],
|
|
70
|
-
defaultWorkspaceId: true,
|
|
71
|
-
schema: z
|
|
72
|
-
.object({
|
|
73
|
-
workspace_id: uuidSchema.optional(),
|
|
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
|
-
}),
|
|
140
|
-
createRequest: (input) => ({
|
|
141
|
-
method: 'POST',
|
|
142
|
-
path: `/workspaces/${input.workspace_id}/variables`,
|
|
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
|
-
}),
|
|
154
|
-
}),
|
|
155
|
-
enhanceResponse: (response) => withInstructions(response, [
|
|
156
|
-
'name, scope, is_constant — immutable post-create (используй delete + create для смены).',
|
|
157
|
-
'WORKSPACE variables референсятся в шаблонах как {{{name}}} (triple braces), CHANNEL constants — {{name}} (double).',
|
|
158
|
-
REPEAT_CONSTANT_VALUE_INSTRUCTION,
|
|
159
|
-
]),
|
|
160
|
-
}),
|
|
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
8
|
// ============================================================
|
|
290
9
|
// v1.5 Increment 4b — CRM Pipelines (11 tools)
|
|
291
10
|
// ============================================================
|
|
@@ -310,14 +29,21 @@ export const crmPlatformTools = [
|
|
|
310
29
|
workspace_id: uuidSchema.optional(),
|
|
311
30
|
crm_id: uuidSchema,
|
|
312
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(),
|
|
313
35
|
})
|
|
314
36
|
.strict(),
|
|
315
37
|
createRequest: (input) => ({
|
|
316
38
|
method: 'GET',
|
|
317
|
-
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)}` : ''}`,
|
|
318
40
|
}),
|
|
319
|
-
enhanceResponse: (response) => withInstructions(response,
|
|
320
|
-
|
|
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; ошибка провайдера не блокирует локальную выдачу.',
|
|
321
47
|
]),
|
|
322
48
|
}),
|
|
323
49
|
defineTool({
|
|
@@ -334,7 +60,7 @@ export const crmPlatformTools = [
|
|
|
334
60
|
.strict(),
|
|
335
61
|
createRequest: (input) => ({
|
|
336
62
|
method: 'GET',
|
|
337
|
-
path: `/
|
|
63
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
338
64
|
}),
|
|
339
65
|
}),
|
|
340
66
|
defineTool({
|
|
@@ -357,7 +83,7 @@ export const crmPlatformTools = [
|
|
|
357
83
|
.strict(),
|
|
358
84
|
createRequest: (input) => ({
|
|
359
85
|
method: 'POST',
|
|
360
|
-
path: `/
|
|
86
|
+
path: `/crm-connections/${input.crm_id}/pipelines`,
|
|
361
87
|
body: compactObject({
|
|
362
88
|
name: input.name,
|
|
363
89
|
sort: input.sort,
|
|
@@ -377,11 +103,7 @@ export const crmPlatformTools = [
|
|
|
377
103
|
name: 'besales_crm_pipeline_update',
|
|
378
104
|
sideEffect: 'write',
|
|
379
105
|
defaultWorkspaceId: true,
|
|
380
|
-
requiredFields: [
|
|
381
|
-
'crm_id',
|
|
382
|
-
'pipeline_id',
|
|
383
|
-
'acknowledge_external_side_effect',
|
|
384
|
-
],
|
|
106
|
+
requiredFields: ['crm_id', 'pipeline_id', 'acknowledge_external_side_effect'],
|
|
385
107
|
schema: z
|
|
386
108
|
.object({
|
|
387
109
|
workspace_id: uuidSchema.optional(),
|
|
@@ -397,7 +119,7 @@ export const crmPlatformTools = [
|
|
|
397
119
|
.strict(),
|
|
398
120
|
createRequest: (input) => ({
|
|
399
121
|
method: 'PATCH',
|
|
400
|
-
path: `/
|
|
122
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
401
123
|
body: compactObject({
|
|
402
124
|
name: input.name,
|
|
403
125
|
sort: input.sort,
|
|
@@ -408,7 +130,7 @@ export const crmPlatformTools = [
|
|
|
408
130
|
}),
|
|
409
131
|
}),
|
|
410
132
|
enhanceResponse: (response) => withInstructions(response, [
|
|
411
|
-
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в
|
|
133
|
+
'Sync changes в external CRM (если поддерживается updatePipeline). Settings типа aiResponseMoveToStatus живут в настройках воронок канала — обновляй через besales_pipeline_settings_update.',
|
|
412
134
|
]),
|
|
413
135
|
}),
|
|
414
136
|
defineTool({
|
|
@@ -432,7 +154,7 @@ export const crmPlatformTools = [
|
|
|
432
154
|
.strict(),
|
|
433
155
|
createRequest: (input) => ({
|
|
434
156
|
method: 'DELETE',
|
|
435
|
-
path: `/
|
|
157
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}`,
|
|
436
158
|
body: {
|
|
437
159
|
explicitConfirmation: input.explicit_confirmation,
|
|
438
160
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -456,24 +178,34 @@ export const crmPlatformTools = [
|
|
|
456
178
|
workspace_id: uuidSchema.optional(),
|
|
457
179
|
crm_id: uuidSchema,
|
|
458
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(),
|
|
459
184
|
})
|
|
460
185
|
.strict(),
|
|
461
|
-
createRequest: (input) =>
|
|
462
|
-
|
|
463
|
-
|
|
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, пока он не станет пустым.`,
|
|
464
202
|
}),
|
|
465
203
|
}),
|
|
466
204
|
defineTool({
|
|
467
205
|
name: 'besales_crm_pipeline_status_create',
|
|
468
206
|
sideEffect: 'write',
|
|
469
207
|
defaultWorkspaceId: true,
|
|
470
|
-
requiredFields: [
|
|
471
|
-
'crm_id',
|
|
472
|
-
'pipeline_id',
|
|
473
|
-
'name',
|
|
474
|
-
'sort',
|
|
475
|
-
'acknowledge_external_side_effect',
|
|
476
|
-
],
|
|
208
|
+
requiredFields: ['crm_id', 'pipeline_id', 'name', 'sort', 'acknowledge_external_side_effect'],
|
|
477
209
|
schema: z
|
|
478
210
|
.object({
|
|
479
211
|
workspace_id: uuidSchema.optional(),
|
|
@@ -484,8 +216,16 @@ export const crmPlatformTools = [
|
|
|
484
216
|
color: z.string().optional(),
|
|
485
217
|
status_types: z.array(z.string()).optional(),
|
|
486
218
|
is_editable: z.boolean().optional(),
|
|
219
|
+
is_system_managed: z
|
|
220
|
+
.boolean()
|
|
221
|
+
.optional()
|
|
222
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
487
223
|
is_bot_active: z.boolean().optional(),
|
|
488
224
|
is_operator_available: z.boolean().optional(),
|
|
225
|
+
is_terminal: z
|
|
226
|
+
.boolean()
|
|
227
|
+
.optional()
|
|
228
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
489
229
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
490
230
|
status_id: z.number().int().optional(),
|
|
491
231
|
acknowledge_external_side_effect: z.literal(true),
|
|
@@ -493,15 +233,17 @@ export const crmPlatformTools = [
|
|
|
493
233
|
.strict(),
|
|
494
234
|
createRequest: (input) => ({
|
|
495
235
|
method: 'POST',
|
|
496
|
-
path: `/
|
|
236
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses`,
|
|
497
237
|
body: compactObject({
|
|
498
238
|
name: input.name,
|
|
499
239
|
sort: input.sort,
|
|
500
240
|
color: input.color,
|
|
501
241
|
statusTypes: input.status_types,
|
|
502
242
|
isEditable: input.is_editable,
|
|
243
|
+
isSystemManaged: input.is_system_managed,
|
|
503
244
|
isBotActive: input.is_bot_active,
|
|
504
245
|
isOperatorAvailable: input.is_operator_available,
|
|
246
|
+
isTerminal: input.is_terminal,
|
|
505
247
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
506
248
|
statusId: input.status_id,
|
|
507
249
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -515,12 +257,7 @@ export const crmPlatformTools = [
|
|
|
515
257
|
name: 'besales_crm_pipeline_status_update',
|
|
516
258
|
sideEffect: 'write',
|
|
517
259
|
defaultWorkspaceId: true,
|
|
518
|
-
requiredFields: [
|
|
519
|
-
'crm_id',
|
|
520
|
-
'pipeline_id',
|
|
521
|
-
'status_id',
|
|
522
|
-
'acknowledge_external_side_effect',
|
|
523
|
-
],
|
|
260
|
+
requiredFields: ['crm_id', 'pipeline_id', 'status_id', 'acknowledge_external_side_effect'],
|
|
524
261
|
schema: z
|
|
525
262
|
.object({
|
|
526
263
|
workspace_id: uuidSchema.optional(),
|
|
@@ -534,17 +271,21 @@ export const crmPlatformTools = [
|
|
|
534
271
|
is_system_managed: z
|
|
535
272
|
.boolean()
|
|
536
273
|
.optional()
|
|
537
|
-
.describe('
|
|
274
|
+
.describe('Колонка ведётся платформой. Не помечена — автоматика в неё не заходит: бот молчит, оператор из неё не зовётся'),
|
|
538
275
|
is_editable: z.boolean().optional(),
|
|
539
276
|
is_bot_active: z.boolean().optional(),
|
|
540
277
|
is_operator_available: z.boolean().optional(),
|
|
278
|
+
is_terminal: z
|
|
279
|
+
.boolean()
|
|
280
|
+
.optional()
|
|
281
|
+
.describe('Путь закончен: дожимать нечего, проактивных касаний из этой колонки нет'),
|
|
541
282
|
on_message_received_move_to_status: z.number().int().nullable().optional(),
|
|
542
283
|
acknowledge_external_side_effect: z.literal(true),
|
|
543
284
|
})
|
|
544
285
|
.strict(),
|
|
545
286
|
createRequest: (input) => ({
|
|
546
287
|
method: 'PATCH',
|
|
547
|
-
path: `/
|
|
288
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
548
289
|
body: compactObject({
|
|
549
290
|
name: input.name,
|
|
550
291
|
sort: input.sort,
|
|
@@ -554,6 +295,7 @@ export const crmPlatformTools = [
|
|
|
554
295
|
isEditable: input.is_editable,
|
|
555
296
|
isBotActive: input.is_bot_active,
|
|
556
297
|
isOperatorAvailable: input.is_operator_available,
|
|
298
|
+
isTerminal: input.is_terminal,
|
|
557
299
|
onMessageReceivedMoveToStatus: input.on_message_received_move_to_status,
|
|
558
300
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
559
301
|
}),
|
|
@@ -585,7 +327,7 @@ export const crmPlatformTools = [
|
|
|
585
327
|
.strict(),
|
|
586
328
|
createRequest: (input) => ({
|
|
587
329
|
method: 'DELETE',
|
|
588
|
-
path: `/
|
|
330
|
+
path: `/crm-connections/${input.crm_id}/pipelines/${input.pipeline_id}/statuses/${input.status_id}`,
|
|
589
331
|
body: {
|
|
590
332
|
explicitConfirmation: input.explicit_confirmation,
|
|
591
333
|
acknowledgeExternalSideEffect: input.acknowledge_external_side_effect,
|
|
@@ -599,6 +341,11 @@ export const crmPlatformTools = [
|
|
|
599
341
|
requiredFields: ['platform_id', 'pipeline_id', 'pipeline_crm_id'],
|
|
600
342
|
schema: z
|
|
601
343
|
.object({
|
|
344
|
+
expected_version: z
|
|
345
|
+
.string()
|
|
346
|
+
.min(1)
|
|
347
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
348
|
+
.optional(),
|
|
602
349
|
workspace_id: uuidSchema.optional(),
|
|
603
350
|
platform_id: uuidSchema,
|
|
604
351
|
pipeline_id: z.number().int(),
|
|
@@ -608,14 +355,16 @@ export const crmPlatformTools = [
|
|
|
608
355
|
.strict(),
|
|
609
356
|
createRequest: (input) => ({
|
|
610
357
|
method: 'POST',
|
|
611
|
-
path: `/
|
|
358
|
+
path: `/channels/${input.platform_id}/active-pipelines`,
|
|
612
359
|
body: compactObject({
|
|
360
|
+
expectedVersion: input.expected_version,
|
|
613
361
|
pipelineId: input.pipeline_id,
|
|
614
362
|
pipelineCrmId: input.pipeline_crm_id,
|
|
615
363
|
sort: input.sort,
|
|
616
364
|
}),
|
|
617
365
|
}),
|
|
618
366
|
enhanceResponse: (response) => withInstructions(response, [
|
|
367
|
+
editVersionInstruction(),
|
|
619
368
|
'Local-only M:N junction. Reversible audit — unlink восстановится через besales_audit_revert.',
|
|
620
369
|
]),
|
|
621
370
|
}),
|
|
@@ -626,6 +375,11 @@ export const crmPlatformTools = [
|
|
|
626
375
|
requiredFields: ['platform_id', 'platform_pipeline_id', 'explicit_confirmation'],
|
|
627
376
|
schema: z
|
|
628
377
|
.object({
|
|
378
|
+
expected_version: z
|
|
379
|
+
.string()
|
|
380
|
+
.min(1)
|
|
381
|
+
.regex(/^[A-Za-z0-9_.-]+$/u)
|
|
382
|
+
.optional(),
|
|
629
383
|
workspace_id: uuidSchema.optional(),
|
|
630
384
|
platform_id: uuidSchema,
|
|
631
385
|
platform_pipeline_id: uuidSchema,
|
|
@@ -634,9 +388,11 @@ export const crmPlatformTools = [
|
|
|
634
388
|
.strict(),
|
|
635
389
|
createRequest: (input) => ({
|
|
636
390
|
method: 'DELETE',
|
|
637
|
-
|
|
391
|
+
...compactObject({ ifMatch: input.expected_version }),
|
|
392
|
+
path: `/channels/${input.platform_id}/active-pipelines/${input.platform_pipeline_id}`,
|
|
638
393
|
body: { explicitConfirmation: input.explicit_confirmation },
|
|
639
394
|
}),
|
|
395
|
+
enhanceResponse: withEditVersionInstructions,
|
|
640
396
|
}),
|
|
641
397
|
// ============================================================
|
|
642
398
|
// v1.5 Increment 4d — cross-platform clone (3 tools)
|
|
@@ -686,10 +442,10 @@ export const crmPlatformTools = [
|
|
|
686
442
|
}),
|
|
687
443
|
createRequest: (input) => ({
|
|
688
444
|
method: 'POST',
|
|
689
|
-
path: `/workspaces/${input.workspace_id}/
|
|
445
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/preview`,
|
|
690
446
|
body: compactObject({
|
|
691
|
-
|
|
692
|
-
|
|
447
|
+
sourceChannelId: input.source_platform_id,
|
|
448
|
+
targetChannelId: input.target_platform_id,
|
|
693
449
|
include: compactObject({
|
|
694
450
|
agents: input.include.agents,
|
|
695
451
|
agentTools: input.include.agent_tools,
|
|
@@ -756,11 +512,11 @@ export const crmPlatformTools = [
|
|
|
756
512
|
.strict(),
|
|
757
513
|
createRequest: (input) => ({
|
|
758
514
|
method: 'POST',
|
|
759
|
-
path: `/workspaces/${input.workspace_id}/
|
|
515
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/execute`,
|
|
760
516
|
body: compactObject({
|
|
761
517
|
previewToken: input.preview_token,
|
|
762
|
-
|
|
763
|
-
|
|
518
|
+
sourceChannelId: input.source_platform_id,
|
|
519
|
+
targetChannelId: input.target_platform_id,
|
|
764
520
|
explicitConfirmation: input.explicit_confirmation,
|
|
765
521
|
acknowledgeDestructiveOverwrite: input.acknowledge_destructive_overwrite,
|
|
766
522
|
idempotencyKey: input.idempotency_key,
|
|
@@ -768,7 +524,7 @@ export const crmPlatformTools = [
|
|
|
768
524
|
}),
|
|
769
525
|
}),
|
|
770
526
|
enhanceResponse: (response) => withInstructions(response, [
|
|
771
|
-
'Result reversible через besales_audit_revert (kind=revertClone) —
|
|
527
|
+
'Result reversible через besales_audit_revert (kind=revertClone) — физически откатывает изменения клона и помечает запуск REVERTED.',
|
|
772
528
|
'idempotency_key reuse → returns cached result БЕЗ повторного выполнения.',
|
|
773
529
|
'preview_token expired (15 min) → 410 Gone, нужно повторить preview.',
|
|
774
530
|
'Если preview вернул `requires_destructive_ack: true` — обязательно передайте `acknowledge_destructive_overwrite: true` (overwrite mode фактически удалит target агентов / follow-ups / behavior).',
|
|
@@ -787,7 +543,7 @@ export const crmPlatformTools = [
|
|
|
787
543
|
.strict(),
|
|
788
544
|
createRequest: (input) => ({
|
|
789
545
|
method: 'GET',
|
|
790
|
-
path: `/workspaces/${input.workspace_id}/
|
|
546
|
+
path: `/workspaces/${input.workspace_id}/channels/clone/${input.clone_id}`,
|
|
791
547
|
}),
|
|
792
548
|
}),
|
|
793
549
|
// ============================================================
|
|
@@ -810,6 +566,10 @@ export const crmPlatformTools = [
|
|
|
810
566
|
source: mcpFileSourceSchema.optional(),
|
|
811
567
|
mime_type: z.string().max(255).optional(),
|
|
812
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(),
|
|
813
573
|
})
|
|
814
574
|
.strict(),
|
|
815
575
|
createRequest: (input) => ({
|
|
@@ -822,11 +582,14 @@ export const crmPlatformTools = [
|
|
|
822
582
|
source: input.source,
|
|
823
583
|
mime_type: input.mime_type,
|
|
824
584
|
size_bytes: input.size_bytes,
|
|
585
|
+
owner_kind: input.owner_kind,
|
|
586
|
+
owner_id: input.owner_id,
|
|
825
587
|
}),
|
|
826
588
|
}),
|
|
827
589
|
enhanceResponse: (response) => withInstructions(response, [
|
|
828
590
|
'Отдайте пользователю `upload_page_url` — он откроет его в браузере (уже залогинен) и загрузит файл. Секрет/файл НЕ проходит через LLM.',
|
|
829
|
-
'Затем поллите `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 карточки>. Такой файл принадлежит карточке: он не показывается в медиатеке, его нельзя поставить приветствием или вложением шага, и он удаляется вместе с карточкой.',
|
|
830
593
|
'TTL сессии 15 минут. Имя файла (`name`) должно быть уникальным в workspace.',
|
|
831
594
|
]),
|
|
832
595
|
}),
|
|
@@ -843,7 +606,7 @@ export const crmPlatformTools = [
|
|
|
843
606
|
.strict(),
|
|
844
607
|
createRequest: (input) => ({
|
|
845
608
|
method: 'GET',
|
|
846
|
-
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${input.upload_ref}`,
|
|
609
|
+
path: `/workspaces/${input.workspace_id}/file-upload-sessions/${encodeURIComponent(input.upload_ref)}`,
|
|
847
610
|
}),
|
|
848
611
|
enhanceResponse: (response) => withInstructions(response, [
|
|
849
612
|
'status: AWAITING_USER (ждём загрузку) → VALIDATING → READY (`stored_file_id` готов) | VALIDATION_FAILED (`error_message`, пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -886,6 +649,7 @@ export const crmPlatformTools = [
|
|
|
886
649
|
schema: z
|
|
887
650
|
.object({
|
|
888
651
|
workspace_id: uuidSchema.optional(),
|
|
652
|
+
operation_id: setupInitOperationIdSchema,
|
|
889
653
|
platform_type: apiKeyPlatformTypeSchema,
|
|
890
654
|
name: z.string().min(1).max(255),
|
|
891
655
|
// Публичные (НЕ секретные) поля канала. Секреты вводятся на /setup/:ref.
|
|
@@ -900,6 +664,7 @@ export const crmPlatformTools = [
|
|
|
900
664
|
method: 'POST',
|
|
901
665
|
path: `/workspaces/${input.workspace_id}/platform-setup-sessions`,
|
|
902
666
|
body: compactObject({
|
|
667
|
+
operationId: input.operation_id,
|
|
903
668
|
platform_type: input.platform_type,
|
|
904
669
|
name: input.name,
|
|
905
670
|
fields: input.fields,
|
|
@@ -925,7 +690,7 @@ export const crmPlatformTools = [
|
|
|
925
690
|
.strict(),
|
|
926
691
|
createRequest: (input) => ({
|
|
927
692
|
method: 'GET',
|
|
928
|
-
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${input.setup_ref}`,
|
|
693
|
+
path: `/workspaces/${input.workspace_id}/platform-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
929
694
|
}),
|
|
930
695
|
enhanceResponse: (response) => withInstructions(response, [
|
|
931
696
|
'status: AWAITING_USER → VALIDATING → READY (`platform_id` готов) | VALIDATION_FAILED (`error_message`, напр. невалидный токен — пользователь может повторить) | EXPIRED (создайте новую сессию).',
|
|
@@ -951,7 +716,10 @@ export const crmPlatformTools = [
|
|
|
951
716
|
createRequest: (input) => ({
|
|
952
717
|
method: 'POST',
|
|
953
718
|
path: `/workspaces/${input.workspace_id}/platform-oauth-sessions`,
|
|
954
|
-
body: compactObject({
|
|
719
|
+
body: compactObject({
|
|
720
|
+
platform_type: input.platform_type,
|
|
721
|
+
name: input.name,
|
|
722
|
+
}),
|
|
955
723
|
}),
|
|
956
724
|
enhanceResponse: (response) => withInstructions(response, [
|
|
957
725
|
'Отдайте пользователю `auth_url` — он откроет его в браузере и авторизуется у провайдера (Instagram/Avito). Код авторизации НЕ проходит через LLM.',
|
|
@@ -960,12 +728,10 @@ export const crmPlatformTools = [
|
|
|
960
728
|
]),
|
|
961
729
|
}),
|
|
962
730
|
// ============================================================
|
|
963
|
-
//
|
|
731
|
+
// CRM Connection + Field Mapping + Operators
|
|
964
732
|
// ============================================================
|
|
965
|
-
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM):
|
|
966
|
-
//
|
|
967
|
-
// вебхуком). Field mapping + operators — для уже подключённых CRM (AmoCRM/Bitrix24 для mapping;
|
|
968
|
-
// AmoCRM для operators).
|
|
733
|
+
// CRM create через Setup URL pattern (секреты в браузере, минуя LLM): GetCourse, AmoCRM и
|
|
734
|
+
// Bitrix24. Field mapping + operators — для уже подключённых CRM.
|
|
969
735
|
defineTool({
|
|
970
736
|
name: 'besales_crm_create_init',
|
|
971
737
|
sideEffect: 'write',
|
|
@@ -974,17 +740,22 @@ export const crmPlatformTools = [
|
|
|
974
740
|
schema: z
|
|
975
741
|
.object({
|
|
976
742
|
workspace_id: uuidSchema.optional(),
|
|
743
|
+
operation_id: setupInitOperationIdSchema,
|
|
977
744
|
crm_type: provisionableCrmTypeSchema,
|
|
978
745
|
// Публичные non-secret поля: GETCOURSE={account_domain, managed_tag_prefix?};
|
|
979
|
-
//
|
|
980
|
-
// Секреты (school_api_key /
|
|
746
|
+
// AMOCRM={sub_domain, client_id}; BITRIX24={domain, client_id}.
|
|
747
|
+
// Секреты (school_api_key / client_secret / long_access_token) — на /setup/:ref.
|
|
981
748
|
fields: optionalAnyObjectSchema,
|
|
982
749
|
})
|
|
983
750
|
.strict(),
|
|
984
751
|
createRequest: (input) => ({
|
|
985
752
|
method: 'POST',
|
|
986
753
|
path: `/workspaces/${input.workspace_id}/crm-setup-sessions`,
|
|
987
|
-
body: compactObject({
|
|
754
|
+
body: compactObject({
|
|
755
|
+
operationId: input.operation_id,
|
|
756
|
+
crm_type: input.crm_type,
|
|
757
|
+
fields: input.fields,
|
|
758
|
+
}),
|
|
988
759
|
}),
|
|
989
760
|
enhanceResponse: (response) => withInstructions(response, [
|
|
990
761
|
'Отдайте пользователю `setup_page_url` — он вводит в браузере ВСЕ поля (и секреты, и несекретные sub_domain/client_id/domain/...), минуя чат. Несекретные — в `required_non_secret_fields`, секреты — в `required_secret_fields`.',
|
|
@@ -1006,11 +777,11 @@ export const crmPlatformTools = [
|
|
|
1006
777
|
.strict(),
|
|
1007
778
|
createRequest: (input) => ({
|
|
1008
779
|
method: 'GET',
|
|
1009
|
-
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${input.setup_ref}`,
|
|
780
|
+
path: `/workspaces/${input.workspace_id}/crm-setup-sessions/${encodeURIComponent(input.setup_ref)}`,
|
|
1010
781
|
}),
|
|
1011
782
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1012
783
|
'status: AWAITING_USER → VALIDATING → READY (`crm_id`) | VALIDATION_FAILED (`error_message`) | EXPIRED.',
|
|
1013
|
-
'READY = CRM
|
|
784
|
+
'READY = CRM создана; GetCourse-ключ дополнительно проходит read-only API-probe, поэтому битый ключ даёт VALIDATION_FAILED.',
|
|
1014
785
|
'AmoCRM: на READY авто-активируется, ЕСЛИ это единственная CRM workspace (токен live-проверяется при активации). Если есть другая активная CRM или токен битый — остаётся inactive → включи besales_crm_activate({ crm_id }). Bitrix24: онлайн НЕ проверяется, требует РУЧНОЙ установки local-app в портале (вебхук).',
|
|
1015
786
|
]),
|
|
1016
787
|
}),
|
|
@@ -1027,12 +798,11 @@ export const crmPlatformTools = [
|
|
|
1027
798
|
.strict(),
|
|
1028
799
|
createRequest: (input) => ({
|
|
1029
800
|
method: 'POST',
|
|
1030
|
-
path: `/
|
|
801
|
+
path: `/crm-connections/${input.crm_id}/activate`,
|
|
1031
802
|
}),
|
|
1032
803
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1033
|
-
'CRM
|
|
1034
|
-
'
|
|
1035
|
-
'Битый/просроченный токен → ошибка активации (CRM остаётся неактивной). Зови после исправления токена либо для переключения активной CRM.',
|
|
804
|
+
'CRM connection активирована после live-проверки credentials.',
|
|
805
|
+
'Операция может переключить активное CRM-подключение workspace; предупреди пользователя.',
|
|
1036
806
|
]),
|
|
1037
807
|
}),
|
|
1038
808
|
defineTool({
|
|
@@ -1047,12 +817,12 @@ export const crmPlatformTools = [
|
|
|
1047
817
|
.strict(),
|
|
1048
818
|
createRequest: (input) => ({
|
|
1049
819
|
method: 'GET',
|
|
1050
|
-
path: `/workspaces/${input.workspace_id}/
|
|
820
|
+
path: `/workspaces/${input.workspace_id}/crm-connections`,
|
|
1051
821
|
}),
|
|
1052
822
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1053
|
-
'Список CRM workspace
|
|
823
|
+
'Список v2 CRM connections workspace без credentials.',
|
|
1054
824
|
'Пустой список → CRM не подключена (нужен besales_crm_create_init).',
|
|
1055
|
-
'
|
|
825
|
+
'Неактивное подключение можно включить через besales_crm_activate.',
|
|
1056
826
|
]),
|
|
1057
827
|
}),
|
|
1058
828
|
defineTool({
|
|
@@ -1072,8 +842,36 @@ export const crmPlatformTools = [
|
|
|
1072
842
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1073
843
|
'Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке НЕ появляется: channelId и channelSecretKey выдаёт только техподдержка AmoCRM по письму заданной формы.',
|
|
1074
844
|
'Текст письма и адрес вебхука отдаёт бэкенд — пересылай их человеку ДОСЛОВНО, не пересказывай и не собирай адрес сам. Тот же ответ показывает страница AmoCRM в интерфейсе.',
|
|
1075
|
-
'
|
|
1076
|
-
'
|
|
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. У прочих провайдеров такого адреса нет — инструмент ответит отказом.',
|
|
1077
875
|
]),
|
|
1078
876
|
}),
|
|
1079
877
|
defineTool({
|
|
@@ -1096,11 +894,11 @@ export const crmPlatformTools = [
|
|
|
1096
894
|
.strict(),
|
|
1097
895
|
createRequest: (input) => ({
|
|
1098
896
|
method: 'GET',
|
|
1099
|
-
path: `/
|
|
897
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1100
898
|
}),
|
|
1101
899
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1102
|
-
'Возвращает
|
|
1103
|
-
'
|
|
900
|
+
'Возвращает текущий список v2 field mappings.',
|
|
901
|
+
'crm_field_id для upsert берётся из каталога полей CRM-провайдера.',
|
|
1104
902
|
]),
|
|
1105
903
|
}),
|
|
1106
904
|
defineTool({
|
|
@@ -1120,16 +918,22 @@ export const crmPlatformTools = [
|
|
|
1120
918
|
.strict(),
|
|
1121
919
|
createRequest: (input) => ({
|
|
1122
920
|
method: 'PUT',
|
|
1123
|
-
path: `/
|
|
921
|
+
path: `/crm-connections/${input.crm_id}/field-mappings`,
|
|
1124
922
|
body: {
|
|
1125
|
-
replace_all_existing: input.replace_all_existing,
|
|
1126
923
|
enabled: input.enabled,
|
|
1127
|
-
|
|
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
|
+
})),
|
|
1128
932
|
},
|
|
1129
933
|
}),
|
|
1130
934
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1131
|
-
'Replace-all:
|
|
1132
|
-
'
|
|
935
|
+
'Replace-all: передавай весь желаемый набор mappings, а не патч.',
|
|
936
|
+
'crmFieldName/fieldType/category сервер гидратирует из каталога, если они отсутствуют.',
|
|
1133
937
|
]),
|
|
1134
938
|
}),
|
|
1135
939
|
defineTool({
|
|
@@ -1146,11 +950,11 @@ export const crmPlatformTools = [
|
|
|
1146
950
|
.strict(),
|
|
1147
951
|
createRequest: (input) => ({
|
|
1148
952
|
method: 'GET',
|
|
1149
|
-
path: `/
|
|
953
|
+
path: `/crm-connections/${input.crm_id}/operators${input.sync ? '?sync=true' : ''}`,
|
|
1150
954
|
}),
|
|
1151
955
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1152
|
-
'
|
|
1153
|
-
'sync=true
|
|
956
|
+
'Возвращаются активные локальные CRM operators.',
|
|
957
|
+
'sync=true сначала синхронизирует сотрудников из CRM; если не удалось — отказ с причиной (CRM отдала список не полностью, CRM недоступна, синхронизация уже идёт, лимит запросов). Сохранённый список читается тем же инструментом без sync.',
|
|
1154
958
|
]),
|
|
1155
959
|
}),
|
|
1156
960
|
defineTool({
|
|
@@ -1165,24 +969,87 @@ export const crmPlatformTools = [
|
|
|
1165
969
|
operator_id: uuidSchema,
|
|
1166
970
|
is_operator: z.boolean().optional(),
|
|
1167
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(),
|
|
1168
982
|
})
|
|
1169
983
|
.strict()
|
|
1170
984
|
.superRefine((input, ctx) => {
|
|
1171
|
-
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)) {
|
|
1172
993
|
ctx.addIssue({
|
|
1173
994
|
code: z.ZodIssueCode.custom,
|
|
1174
|
-
message: 'Provide at least one of is_operator / is_sdr',
|
|
995
|
+
message: 'Provide at least one of is_operator / is_sdr / workspace_member_id',
|
|
1175
996
|
});
|
|
1176
997
|
}
|
|
1177
998
|
}),
|
|
1178
999
|
createRequest: (input) => ({
|
|
1179
1000
|
method: 'PATCH',
|
|
1180
|
-
path: `/
|
|
1181
|
-
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)}`,
|
|
1182
1050
|
}),
|
|
1183
1051
|
enhanceResponse: (response) => withInstructions(response, [
|
|
1184
|
-
'
|
|
1185
|
-
'Передайте хотя бы один флаг; не указанный сохраняет текущее значение. operator_id берётся из `besales_crm_operator_list`.',
|
|
1052
|
+
'READY означает принятую смену ключей существующей CRM, авторизация или установка приложения могут ещё требоваться. Секреты и установочный адрес доступны только человеку в браузере.',
|
|
1186
1053
|
]),
|
|
1187
1054
|
}),
|
|
1188
1055
|
];
|