@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
package/docs/tool-surface.md
CHANGED
|
@@ -1,7 +1,83 @@
|
|
|
1
1
|
# Поверхность инструментов: группы, а не укрупнение
|
|
2
2
|
|
|
3
|
+
Каждый опубликованный инструмент содержит короткий русский `Tool.title`, построенный из
|
|
4
|
+
локализованного описания и ограниченный 80 символами. Интерфейс хоста может показывать его
|
|
5
|
+
человеку, а стабильным идентификатором вызова остаётся `name`.
|
|
6
|
+
|
|
7
|
+
## Безопасная публикация контрактов
|
|
8
|
+
|
|
9
|
+
Эталон отгруженной линии задаётся единой настройкой `BESALES_MCP_SHIPPED_REF` через
|
|
10
|
+
`scripts/shipped-ref.mjs`. Умолчание, в том числе при пустом или пробельном значении, —
|
|
11
|
+
`origin/v1-line`: после замены `main` сверка продолжает читать прежнюю линию пакета.
|
|
12
|
+
|
|
13
|
+
Публикация идёт только из закоммиченного дерева моста: выгрузка подписывается коммитом `HEAD`, а
|
|
14
|
+
инструменты берутся из рабочей сборки, и при незакоммиченных правках подпись называла бы коммит, из
|
|
15
|
+
которого выгрузка не собрана. Незакоммиченное дерево — отказ с перечнем правок.
|
|
16
|
+
|
|
17
|
+
`yarn publish:mcp-registry` требует два явных каталога: `BESALES_SPECS_CONTRACTS_DIR`
|
|
18
|
+
для зеркала `mcp-tools.json` и `BESALES_API_CONTRACTS_DIR` для tracked-карты маршрутов API.
|
|
19
|
+
До сборки команда проверяет оба каталога, наличие OpenAPI и принадлежность API contracts
|
|
20
|
+
выбранному Git checkout. Артефакты сначала строятся во временном каталоге и попадают в цели
|
|
21
|
+
только после успешной генерации обоих файлов. Поздняя ошибка не оставляет обновлённый
|
|
22
|
+
specs-снимок рядом со старой картой API.
|
|
23
|
+
|
|
24
|
+
Карта маршрутов для API несёт и схемы входа ВСЕХ инструментов обоих реестров — отдельными ключами
|
|
25
|
+
`shippedInputSchemas` (отгруженный реестр) и `v2InputSchemas` (ветка v2), картой «имя → схема». По ним
|
|
26
|
+
сервер сверяет аргументы шагов, которые его навигация называет ассистенту: аргумент мимо схемы мост
|
|
27
|
+
отвергнет или молча срежет. Записи `tools` при этом не меняются. Инструмент выгрузки без схемы ветки v2 —
|
|
28
|
+
отказ публикации, а не пропуск.
|
|
29
|
+
|
|
30
|
+
## Сохранение входных полей
|
|
31
|
+
|
|
32
|
+
Сторож в `scripts/registry-diff.spec.mjs` сверяет объявленные пути с выходной JSON-схемой
|
|
33
|
+
Zod: входная схема разрешает лишние поля даже тогда, когда разбор их удаляет. Объект с
|
|
34
|
+
`passthrough` сохраняет произвольные поля вместе с их вложенным содержимым. Для известного
|
|
35
|
+
дочернего объекта действует его собственная схема, поэтому разрешение лишних полей у
|
|
36
|
+
родителя не скрывает удаление внутри дочернего объекта или элемента массива.
|
|
37
|
+
|
|
38
|
+
У `besales_followup_sequence_upsert` конфигурация проходит как произвольный объект и
|
|
39
|
+
передаётся в тело POST/PATCH целиком, с ключами camelCase. Проверка реактивационной формы
|
|
40
|
+
добавляет ошибки, но не заменяет исходник своим результатом разбора. Мост сохраняет
|
|
41
|
+
в том числе инертные поля и null; API проверяет допустимость перевода в исполняемую цепочку
|
|
42
|
+
и отвечает адресным отказом на неподдерживаемые настройки. Передача поля сама по себе
|
|
43
|
+
не обещает его исполнения. `followup-b2.spec.ts` проверяет полное тело обеих ветвей записи.
|
|
44
|
+
|
|
45
|
+
## Смена ключей CRM
|
|
46
|
+
|
|
47
|
+
Генератор `scripts/generate-crm-rotation-contract.mjs` строит локальные схемы и случаи запросов
|
|
48
|
+
`besales_crm_rotate_init` и `besales_crm_rotate_status` из определений инструментов. При переносе
|
|
49
|
+
этих случаев в `besales-api/contracts/mcp-v2-route-map.json` он фиксирует `requiredScopes: ["write:crm"]`
|
|
50
|
+
для обоих входов. Опрос состояния смены ключей требует управления CRM, несмотря на GET.
|
|
51
|
+
В списке контракта эта пара стоит в группе CRM сразу после `besales_crm_operator_update`,
|
|
52
|
+
как и в регистрации. Генератор сохраняет порядок остальных инструментов при повторном выпуске.
|
|
53
|
+
После обновления списка он пересчитывает `summary.total_tools`, `summary.tools_by_category`
|
|
54
|
+
и блок `GENERATED TOOL INVENTORY` в README функциями из `src/tools/inventory.ts`.
|
|
55
|
+
Числа выводятся из активных имён, без ручного счётчика. Обычный запуск после `yarn build`:
|
|
56
|
+
`node scripts/generate-crm-rotation-contract.mjs`. Для выпуска непосредственно из исходников:
|
|
57
|
+
`node --loader ./src/utils/setup-sessions-loader.mjs scripts/generate-crm-rotation-contract.mjs --source`.
|
|
58
|
+
Порядок перечисления не задаёт приоритет выполнения: вызов выбирает инструмент по имени.
|
|
59
|
+
Эта фикстура не заменяет `contracts/mcp-tool-routes.json`: полное перечисление, схемы обоих
|
|
60
|
+
реестров и происхождение отгруженного эталона выпускает `yarn publish:mcp-registry` после коммита
|
|
61
|
+
моста. Добавление инструмента в локальную схему само по себе не обновляет выгрузку для API.
|
|
62
|
+
|
|
63
|
+
Локальную `src/schemas/mcp-v2-route-map.json` отдельно пересобирает
|
|
64
|
+
`BESALES_API_CONTRACTS_DIR=<API>/contracts node scripts/sync-route-map.mjs` после `yarn build`;
|
|
65
|
+
`--check` сверяет её без записи. Генератор исполняет определения и сохраняет точные query/body,
|
|
66
|
+
проверяет маршруты по снимку API и регистрацию скрытого маршрута по контроллеру.
|
|
67
|
+
`sync-api-contracts.mjs` использует тот же генератор. `sync-contract-ledger-schemas.mjs`
|
|
68
|
+
обновляет схемы и метаданные перенесённых полей описи; новые DELIBERATE-ключи требуют
|
|
69
|
+
отдельных ACTIVE-решений в `besales-api/docs/contract-ledger/cledg-decisions.md`.
|
|
70
|
+
|
|
3
71
|
## Решение
|
|
4
72
|
|
|
73
|
+
Число активных инструментов определяется длиной `tools` в `mcp-tools.json`.
|
|
74
|
+
Число случаев запроса определяется длиной карты `mcp-v2-route-map.json`, а число покрытых
|
|
75
|
+
инструментов — количеством уникальных имён до суффикса варианта `@...` в поле `tool`;
|
|
76
|
+
ветви учитываются отдельными случаями.
|
|
77
|
+
Категории в `summary.tools_by_category` и таблица README сверяются с именами реестра тестом
|
|
78
|
+
`inventory.spec.ts`, а случаи карты — с реальными конструкторами запросов тестом
|
|
79
|
+
`v2-route-map.spec.ts`. Число случаев карты не заменяет число инструментов.
|
|
80
|
+
|
|
5
81
|
**Инструменты не укрупняются. Их число не сокращается. Появляются профили — набор имён,
|
|
6
82
|
которым сессия ограничивает себя сама.**
|
|
7
83
|
|
|
@@ -16,12 +92,19 @@
|
|
|
16
92
|
разрушительный ВСЕГДА, и хост больше никогда не сможет считать безопасной ни одну его ветку.
|
|
17
93
|
Работа по аннотациям была бы обесценена ровно в тот момент, когда она начала приносить пользу.
|
|
18
94
|
2. **Имена — это контракт отгруженной линии.** Пакет стоит у пользователей и вызывается по
|
|
19
|
-
именам; переименование
|
|
20
|
-
|
|
95
|
+
именам; переименование бьёт мажор и требует синхронной правки инструкций, ресурсов, скиллов
|
|
96
|
+
и README — 428 упоминаний. Переименования и алиасы для v2 отменены отдельным решением.
|
|
21
97
|
3. **Слитый инструмент хуже выбирается моделью.** Вместо ста имён с собственными схемами
|
|
22
98
|
появляется десяток имён с перечислением действий, где ошибка в поле `action` неотличима от
|
|
23
99
|
ошибки в аргументах, а схема каждого «действия» вырождается в необязательные поля.
|
|
24
100
|
|
|
101
|
+
Узкое исключение — **именной преемник при смене самого контракта**, а не алиас. Плановый разбор
|
|
102
|
+
переписки переехал с площадок на каналы, внешние номера охвата заменил локальными справочниками,
|
|
103
|
+
а сырые промпты — именами шаблонов. Поэтому v2 публикует `besales_dialogue_analysis_*`, старые
|
|
104
|
+
`besales_scheduled_task_*` наружу не регистрирует, а fail-closed сверка связывает обе пары через
|
|
105
|
+
`toolSuccessors`. Сопоставление нужно только для контроля расхождений отгруженного контракта: оно
|
|
106
|
+
не создаёт второе имя, не маршрутизирует вызов и не скрывает отсутствие реализации.
|
|
107
|
+
|
|
25
108
|
Профили решают ту задачу, ради которой укрупнение и предлагалось — **вес и досягаемость**, — и
|
|
26
109
|
не платят ничем из перечисленного.
|
|
27
110
|
|
|
@@ -40,6 +123,60 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
|
|
|
40
123
|
- **Доменная группа выводится из имени** (`besales_<группа>_…`), рукописного реестра нет. Реестр
|
|
41
124
|
пришлось бы пополнять при каждом добавлении, и забытая строка тихо выкидывала бы новый
|
|
42
125
|
инструмент из всех профилей — он просто перестал бы существовать для тех, кто выбрал группу.
|
|
126
|
+
⚠️ Однокоренные имена сводятся коротким списком псевдонимов: `dialog_review_*`,
|
|
127
|
+
`dialogues_query` и `dialogue_transcript` — один домен, но второй токен написан по-разному, и
|
|
128
|
+
попросивший `dialog` не получил бы ни чтения переписки, ни выборки диалогов. Переименовать их
|
|
129
|
+
вместо этого нельзя: имена — контракт отгруженной линии. Список самопроверяемый — тест требует,
|
|
130
|
+
чтобы каждый источник псевдонима исчез из групп, а цель существовала; полный перечень
|
|
131
|
+
30 категорий тоже объявлен в тесте, поэтому новая категория становится осознанным решением, а
|
|
132
|
+
не побочным следствием названия.
|
|
133
|
+
|
|
134
|
+
## Профиль принадлежит ПОДКЛЮЧЕНИЮ, а не подагенту
|
|
135
|
+
|
|
136
|
+
Объявление читается один раз, при запуске процесса. Один процесс — одно подключение MCP, значит
|
|
137
|
+
профиль ограничивает **подключение целиком**.
|
|
138
|
+
|
|
139
|
+
⛔ Подагент хоста своего процесса моста не поднимает: он пользуется тем, что уже подключено в
|
|
140
|
+
сессии, и подставить туда своё окружение ему некуда. Ограничить подагента списком инструментов
|
|
141
|
+
хост умеет **сам, по именам** — профиль для этого не нужен и не поможет.
|
|
142
|
+
|
|
143
|
+
Профиль закрывает другое: **инструмента, не зарегистрированного в подключении, не существует**.
|
|
144
|
+
Его не позовёт ни автоодобряющий хост, ни ошибшийся агент. Отсюда настоящие места применения —
|
|
145
|
+
отдельное подключение «только чтение» для разбора и аудита, фоновый запуск, которому нельзя
|
|
146
|
+
ничего менять, узкое подключение под конкретную работу.
|
|
147
|
+
|
|
148
|
+
Если профиль на подагента всё-таки нужен, мост регистрируется **дважды** под разными именами с
|
|
149
|
+
разным окружением, а подагенту разрешаются инструменты только нужного сервера:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
claude mcp add besales-ro -e BESALES_MCP_TOOLSETS=readonly -- npx -y @besales/mcp
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
⚠️ Приём обоюдоострый: подключив в ОДНОЙ сессии и полный мост, и профильные, вы заплатите
|
|
156
|
+
БОЛЬШЕ — каждое подключение грузит свой список. Смысл появляется, когда разные сессии или разные
|
|
157
|
+
хосты используют разные записи, а не когда все записи живут рядом.
|
|
158
|
+
|
|
159
|
+
## Категорий агент НЕ видит
|
|
160
|
+
|
|
161
|
+
⛔ Частое недопонимание: категория — это фильтр **на входе**, а не уровень, по которому агент
|
|
162
|
+
ходит. Протокол отдаёт **плоский список**: вложенности, папок и поля «категория» в нём нет.
|
|
163
|
+
Модель получает имена, описания и схемы ровно тех инструментов, которые профиль пропустил, — и
|
|
164
|
+
не знает, что остальные существуют.
|
|
165
|
+
|
|
166
|
+
Двухуровневая выдача («сначала категории, потом инструменты в ней») протоколом **достижима**, но
|
|
167
|
+
другим механизмом: сервер объявляет способность «список инструментов может меняться», отдаёт
|
|
168
|
+
сперва горстку инструментов-категорий, а на вызов категории подменяет набор и уведомляет хост.
|
|
169
|
+
Сегодня эта способность у моста НЕ объявлена (`capabilities.tools = {}`), то есть режим не
|
|
170
|
+
построен.
|
|
171
|
+
|
|
172
|
+
**Замер, ради которого об этом вообще думают:** полная выдача списка — **201 КБ** (имена 5,
|
|
173
|
+
описания 71, схемы 125). Одни только названия 30 категорий — **0,3 КБ**.
|
|
174
|
+
|
|
175
|
+
Цена двухуровневого режима, которая этим замером не видна: каждая смена категории — лишний
|
|
176
|
+
круг обмена, а типовая работа здесь сквозная (завести канал = платформа + агент + промпт +
|
|
177
|
+
знания + CRM + триггеры), то есть переключений будет много и модель обязана заранее угадывать,
|
|
178
|
+
в какой категории что лежит. Профиль тот же выигрыш даёт без динамики — но только когда сессия
|
|
179
|
+
узкая заранее.
|
|
43
180
|
- **`readonly` — не группа, а срез**: состав выводится из уже объявленного `sideEffect === 'none'`.
|
|
44
181
|
- **Отбор действует и на перечисление, и на вызов.** Профиль, который только прячет, — декорация:
|
|
45
182
|
хост, знающий имя, всё равно позовёт скрытое, а ровно от такого вызова профиль и заводится.
|
|
@@ -62,6 +199,10 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
|
|
|
62
199
|
инструмента вне профиля для сессии не существует. Слои дополняют друг друга и не заменяют:
|
|
63
200
|
аннотации помогают хосту решать, профиль — не даёт ошибиться.
|
|
64
201
|
|
|
202
|
+
План теста воронки дожимов ничего не отправляет человеку, но сохраняет черновик и удаляет
|
|
203
|
+
прежние черновики того же автора. Поэтому у него нет признака «только чтение». Предпросмотр
|
|
204
|
+
«Первого сообщения» считает охват без записи и отправки и остаётся читающим POST.
|
|
205
|
+
|
|
65
206
|
---
|
|
66
207
|
|
|
67
208
|
# Составной инструмент правки промпта: строить не нужно
|
|
@@ -87,5 +228,65 @@ BESALES_MCP_TOOLSETS=readonly,knowledge # профили складываютс
|
|
|
87
228
|
Что остаётся неизменным: **сначала прочитать промпт целиком** (`besales_prompt_patch_get`), иначе
|
|
88
229
|
неоткуда взять точные якоря. Это не обходится ни одним из вариантов.
|
|
89
230
|
|
|
90
|
-
Итог: правильное количество кода здесь — ноль.
|
|
91
|
-
|
|
231
|
+
Итог: правильное количество кода здесь — ноль. Описание `besales_prompt_batch_start` называет
|
|
232
|
+
одиночный случай явно: список из одного идентификатора с режимом «всё или ничего» даёт ту же
|
|
233
|
+
цепочку целиком.
|
|
234
|
+
|
|
235
|
+
## Каталог аналитики и проверка исполнителя
|
|
236
|
+
|
|
237
|
+
Группа `inbound` входит в категорию `outbound_and_analytics`; входящая аналитика остаётся
|
|
238
|
+
отдельным инструментом. Все активные имена обязаны иметь ровно одну категорию; README и
|
|
239
|
+
счётчики реестра сверяются с этим же каталогом.
|
|
240
|
+
|
|
241
|
+
Сравнение принимает до 36 моделей (предел `MAX_MODELS` в `prompt-services`, f649530).
|
|
242
|
+
Проверка предела сравнения моделей читает настоящий `prompt-services` рядом с деревом.
|
|
243
|
+
В изолированном дереве путь задаётся через `BESALES_PROMPT_SERVICES_DIR`; отсутствие
|
|
244
|
+
исходника или несовпадение предела остаётся ошибкой.
|
|
245
|
+
|
|
246
|
+
В «Пул сегодня» outsideSegmentsBy содержит одну причину на регистрацию: paid, application,
|
|
247
|
+
attendanceNoMinutes, paidElsewhere («покупал в другой воронке»), seriesRunning («серия ещё идёт»),
|
|
248
|
+
other. Сумма равна outsideSegments; старые снимки могли относить две новые причины к other.
|
|
249
|
+
|
|
250
|
+
## Поиск контактов .77
|
|
251
|
+
|
|
252
|
+
В v2 besales_contact_search сохраняет имя и JSON-schema аргументов, но отправляет POST
|
|
253
|
+
`/workspaces/:workspaceId/contacts/search`, селекторы и пагинацию — в JSON-body. GET fallback отсутствует.
|
|
254
|
+
Подсказка хосту `readOnlyHint=false`: POST-поиск не объявляется безопасным GET-чтением.
|
|
255
|
+
Побочных эффектов у поиска нет (`sideEffect=none`), поэтому `destructiveHint=false`;
|
|
256
|
+
снятие подсказки не превращает поиск в запись и не меняет обработку ошибок чтения.
|
|
257
|
+
Сервер продолжает обслуживать опубликованный GET старого моста. Выгрузка сохраняет оригинальный
|
|
258
|
+
GET с shippedMethod/shippedSamplePath/shippedSampleQuery отдельно от нового POST, поэтому проверка
|
|
259
|
+
v2 не подменяет проверку отгруженного клиента. Выпуск маршрутов из закоммиченного моста и генерация
|
|
260
|
+
типов по новому OpenAPI — шаг кресла до запуска; клиенты переключаются совместно с экранами.
|
|
261
|
+
|
|
262
|
+
Описание поиска контактов учитывает ники с `@` и без, регистронезависимость, все слова имени одной
|
|
263
|
+
карточки в любом порядке и литеральные `%/_/\`. Одиночный `@` не задаёт ник. Аргумент search можно
|
|
264
|
+
опустить; явно пустой/пробельный search, а также пустые phone/email/external_id отвергаются схемой.
|
|
265
|
+
Селекторы остаются в POST-body, scope read:contacts/CONTACT_VIEW не меняется. Параметр telegramId
|
|
266
|
+
профилей к этому инструменту не добавляется. Расширяемое metadata партнёрских входящих и selector
|
|
267
|
+
существующего счёта задаются в API-контрактах соответствующих операций; отдельный инструмент
|
|
268
|
+
для входящего партнёрского пуша не создаётся.
|
|
269
|
+
|
|
270
|
+
## Уточнения моста v1.5 в словаре v2
|
|
271
|
+
|
|
272
|
+
Тексты и проверки ввода находятся в `src/tools/definitions/*.ts`;
|
|
273
|
+
`scripts/sync-contract-ledger-schemas.mjs` синхронизирует описания и изменённые узлы
|
|
274
|
+
`src/schemas/mcp-tools.json`, сохраняя остальные ограничения схемы.
|
|
275
|
+
После сборки запускай его и `scripts/sync-tool-inventory.mjs` повторно: файлы должны
|
|
276
|
+
оставаться теми же. `README.md` генерируется только между маркерами TOOL INVENTORY;
|
|
277
|
+
остальная часть README и этот документ редактируются вручную.
|
|
278
|
+
|
|
279
|
+
Волны GetCourse проверяют множество десяти допустимых транспортов после trim,
|
|
280
|
+
приведения регистра и удаления дублей. Повторы и пробелы принимаются; пустой список
|
|
281
|
+
отвергается. В API передаётся исходное написание. `funnel` — код
|
|
282
|
+
школьной воронки fNN или метка с кодом; подпись запуска хранится в `cohort_label`.
|
|
283
|
+
У планового разбора прежнее `daily/hourly.model` переводится в `model_id`,
|
|
284
|
+
`max_tokens` принимает 1–4000 или null. Запись зависит от флага выпуска API
|
|
285
|
+
`SCHEDULED_TASK_MODEL_WRITES_ENABLED`; мост возвращает отказ API без подмены.
|
|
286
|
+
|
|
287
|
+
Фасад аналитики принимает открытые периоды mode=range (только from или только to).
|
|
288
|
+
Список и сводка оплат получают общую область фильтрации через periodMode, channelId,
|
|
289
|
+
funnel и остальные поддержанные измерения; include_archived действует на оба отчёта.
|
|
290
|
+
У besales_dialogue_audit_findings необязательный agent_id проверяет принадлежность
|
|
291
|
+
разбора перед чтением находок. Несовпадение агента или ошибка чтения разбора
|
|
292
|
+
останавливает вызов до запроса находок. Без agent_id остаётся один запрос.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Голосовые шаги и покупка во Входящих
|
|
2
|
+
|
|
3
|
+
## ЗВ-111: read → edit → write
|
|
4
|
+
|
|
5
|
+
Читай полный текущий состав через `besales_platform_context_get`, изменяй нужные поля и передавай
|
|
6
|
+
полный массив `actions` с `replace_actions=true` в `besales_trigger_upsert`. Прочитай результат
|
|
7
|
+
ещё раз. Запись конфигурации не делает dial/REFER.
|
|
8
|
+
|
|
9
|
+
Текущий API принимает `stepType` (также `actionType` / `type`) и `config`:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"stepType": "VOICE_INITIATE_OUTBOUND_CALL",
|
|
14
|
+
"config": {
|
|
15
|
+
"timing": "CALLBACK",
|
|
16
|
+
"fromNumberId": null,
|
|
17
|
+
"reason": "Продолжить разговор",
|
|
18
|
+
"delayDays": 0,
|
|
19
|
+
"delayHours": 1,
|
|
20
|
+
"delayMinutes": 30,
|
|
21
|
+
"callingWindow": { "days": [1, 2, 3, 4, 5], "startHour": 8, "endHour": 21 },
|
|
22
|
+
"callingTimezone": "Europe/Moscow",
|
|
23
|
+
"maxCallbacksPerContact": 2
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Перевод: `VOICE_TRANSFER_CALL`, `config: {"targetLabel":"Reception"}`; `targetLabel:null`
|
|
29
|
+
сохраняется как явный выбор. Прежние имена типов `INITIATE_OUTBOUND_CALL`, `TRANSFER_CALL` и
|
|
30
|
+
`initiateOutboundCall`, `transferCall` принимаются. Пары входных имён:
|
|
31
|
+
|
|
32
|
+
| Действие | Relation из старого чтения | Старое имя входа |
|
|
33
|
+
| ------------------- | -------------------------- | ---------------------------- |
|
|
34
|
+
| Позвонить | `initiateOutboundCall` | `initiateOutboundCallConfig` |
|
|
35
|
+
| Перевести оператору | `transferCall` | `transferCallConfig` |
|
|
36
|
+
|
|
37
|
+
Нормализация сводит голосовой шаг к `stepType` + одному `config`. Непустой relation вместе с
|
|
38
|
+
input-key (даже с `null` / явно переданным `undefined`), два input-key, конфликт типов или
|
|
39
|
+
непустой чужой relation/config отвергаются **до HTTP**. Пустые чужие relations `null`/`undefined`
|
|
40
|
+
снимаются. Неизвестный голосовой тип и неизвестный тип с голосовыми relations получают безопасный
|
|
41
|
+
отказ. Другие новые типы остаются свободной строкой с полным config: их пригодность судит строгий
|
|
42
|
+
v2 mapper API при сохранении, не исполнитель звонка; мост не обрезает их к прежнему enum.
|
|
43
|
+
|
|
44
|
+
С action снимаются только `id/triggerId/createdAt/updatedAt`; с верхнего уровня выбранного
|
|
45
|
+
config — `id/actionId/createdAt/updatedAt`. Вложенные пользовательские поля не обходятся рекурсивно.
|
|
46
|
+
Отсутствие config не материализует defaults; `config:null` не является объектом по опубликованному
|
|
47
|
+
DTO и отклоняется; null разрешённых полей конфига сохраняется. Тексты typed issues есть на пяти языках.
|
|
48
|
+
|
|
49
|
+
`src/schemas/voice-actions-api.contract.json` — узкий машинный срез принятого API и списка relations;
|
|
50
|
+
обновление: `node scripts/sync-voice-actions-contract.mjs`, затем
|
|
51
|
+
`node scripts/sync-voice-actions-tools.mjs`. Источники и SHA-256 закреплены в срезе.
|
|
52
|
+
|
|
53
|
+
## УП-3.03: отдельный признак покупки
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"source": "inbox",
|
|
58
|
+
"purchased": true,
|
|
59
|
+
"has_payment": false,
|
|
60
|
+
"channel_id": "00000000-0000-4000-8000-000000000001",
|
|
61
|
+
"with_totals": true,
|
|
62
|
+
"limit": 50
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Это аргументы **существующего** `besales_dialogues_query`. Режим `source=inbox` читает
|
|
67
|
+
`POST /workspaces/:workspaceId/conversations/search`, scope `read:conversations`.
|
|
68
|
+
Без `source` либо с `source=export` сохраняется прежняя выгрузка диалогов.
|
|
69
|
+
|
|
70
|
+
`purchased:true` — успешный заказ агента **или** текущая продажная стадия своей CRM; false —
|
|
71
|
+
отрицание того же объединения. Это не оплата: `has_payment` независим. Omission не добавляет фильтр.
|
|
72
|
+
Без `channel_id` область — видимые каналы человека; с ним — выбранный канал. Принимается также
|
|
73
|
+
`contact_id`. Строковый/числовой/null boolean отклоняется до HTTP.
|
|
74
|
+
|
|
75
|
+
`hasPurchase` в строке, предикат и итоги считает сервер до пагинации. Мост сохраняет его ответ,
|
|
76
|
+
не вычисляет покупку из оплаты. Повтори с `source=inbox`, теми же фильтрами и `cursor`, пока
|
|
77
|
+
курсор не пуст; `with_totals` возвращает ограниченные итоги только первой страницы (`capped`
|
|
78
|
+
значит 999+, не точное число). Фильтры выгрузки (даты, action_type, platform_ids и прочие)
|
|
79
|
+
с inbox не смешиваются: адресный отказ до запроса. Разрешения и чужую область проверяет API.
|
|
80
|
+
|
|
81
|
+
Проверки: `voice-actions-bridge.spec.ts` проходит через настоящий MCP registry и ApiClient с
|
|
82
|
+
подставным HTTP transport и хранилищем конфигурации; серверная БД и живые звонки здесь не имитируются
|
|
83
|
+
результатом PASS. Полноту ветки inbox держит `v2-route-map.spec.ts`.
|
|
84
|
+
|
|
85
|
+
Отгруженная линия не знает `source` и всегда вызывает `GET dialogue-export`. Поэтому образца
|
|
86
|
+
отгруженного вызова для `inbox` нет: генератор сохраняет новый переключатель и указывает
|
|
87
|
+
`V2_ONLY_VARIANT` с путём `source`. Точное решение находится в `shipped-lag.json`, раздел
|
|
88
|
+
`contractExtensions`, ключ `besales_dialogues_query@inbox::source`. Строка станет ошибкой,
|
|
89
|
+
когда отгруженная линия получит этот вариант. Проверка одинакового метода и адреса сохранена.
|
|
90
|
+
|
|
91
|
+
Для диагностики `emit-tool-routes.mjs --dry-run` принимает `BESALES_MCP_SHIPPED_REGISTRY`
|
|
92
|
+
и `BESALES_MCP_SHIPPED_COMMIT`. Каталог `BESALES_API_CONTRACTS_DIR` должен находиться внутри
|
|
93
|
+
`.codex-artifacts-*/`; файл эталона сверяется с указанным git-коммитом. Результат помечен
|
|
94
|
+
`shippedRegistry.diagnosticOnly: true`, `source: file`, без `fetched: true` и непригоден для коммита.
|
|
95
|
+
Штатная выгрузка без флага требует чистое дерево и обновлённый git-эталон.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Настройки комментариев Instagram через Wazzup
|
|
2
|
+
|
|
3
|
+
`besales_platform_settings_update` использует существующий `PATCH /api/v2/channels/:id/settings`.
|
|
4
|
+
Поле `instagram_comment_behavior` переводится в `instagramCommentBehavior` того же документа,
|
|
5
|
+
который читает и пишет web-форма. Мост и web-форма — независимые клиенты API.
|
|
6
|
+
|
|
7
|
+
Раздел применяется к прямому Instagram и к сохранённому подключению `WHATSAPP / WAZZUP_API`
|
|
8
|
+
с подтипом `instagram`; остальные подтипы отвергаются API. При правке Wazzup не передают
|
|
9
|
+
`reply_to_story_mentions`: транспорт не поддерживает истории. Не передают старый provider/config
|
|
10
|
+
выключатель; режим двух ответов называется `PUBLIC_AND_DM`. Сохранение настроек не отправляет сообщение.
|
|
11
|
+
|
|
12
|
+
Пропущенные поля сохраняют прочитанные значения, включая keywords/templates. Переданная группа
|
|
13
|
+
шаблонов заменяет документ целиком, явные `null` и `{}` неравнозначны. Слоты утверждённых текстов —
|
|
14
|
+
`ru`, `uz`, `uz_cyrl` (на API `uzCyrl`); пять языков интерфейса не добавляют слотов шаблона.
|
|
15
|
+
Соседняя правка имени или таймзоны не добавляет раздел комментариев и не сбрасывает его.
|
|
16
|
+
Общий fixture `src/tools/definitions/__fixtures__/wazzup-comment-settings.json` побайтово совпадает
|
|
17
|
+
с `besales-api/test/fixtures/wazzup-comment-settings.json` и задаёт форму, перевод моста и канон БД.
|
|
18
|
+
|
|
19
|
+
Публичный ответ цитирует комментарий. Личный ответ разрешён один раз на комментарий не позже
|
|
20
|
+
семи суток; писать первым и отвечать на истории нельзя. Подключение/живые отправки и ночная
|
|
21
|
+
активация требуют отдельной приёмки; наличие настройки не подтверждает работающий аккаунт.
|
|
22
|
+
|
|
23
|
+
Для перехода сначала выключают прежний канал Besales и отключают его в кабинете Wazzup,
|
|
24
|
+
потом Connect/Reconnect и включение прямого Instagram. Общая подтверждённая карточка сохраняет
|
|
25
|
+
доступ к истории, когда связь уже есть. Username сам по себе людей не объединяет, семь суток
|
|
26
|
+
Wazzup не дают права писать в новом 24-часовом окне Meta. Демо не включается этой настройкой.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@besales/mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Model Context Protocol server for
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
|
+
"description": "Model Context Protocol server for Besales",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/be-sales/mcp#readme",
|
|
7
7
|
"repository": {
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
"mcp",
|
|
16
16
|
"model-context-protocol",
|
|
17
17
|
"besales",
|
|
18
|
-
"animaly",
|
|
19
18
|
"claude",
|
|
20
19
|
"codex"
|
|
21
20
|
],
|
|
@@ -36,12 +35,14 @@
|
|
|
36
35
|
"dist",
|
|
37
36
|
"bin",
|
|
38
37
|
"scripts",
|
|
38
|
+
"!scripts/generate-operator-contract.ts",
|
|
39
39
|
"docs",
|
|
40
40
|
"!docs/evidence",
|
|
41
|
-
"README.md"
|
|
41
|
+
"README.md",
|
|
42
|
+
"README.onprem.ru.md"
|
|
42
43
|
],
|
|
43
44
|
"bin": {
|
|
44
|
-
"besales-mcp": "bin/besales-mcp.js"
|
|
45
|
+
"besales-mcp": "./bin/besales-mcp.js"
|
|
45
46
|
},
|
|
46
47
|
"scripts": {
|
|
47
48
|
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc && mkdir -p dist/schemas dist/resources/concepts dist/resources/workflows dist/resources/docs dist/skills/besales-dialogue-audit && cp src/schemas/mcp-tools.json dist/schemas/mcp-tools.json && cp src/resources/concepts/*.md dist/resources/concepts/ && cp src/resources/workflows/*.md dist/resources/workflows/ && cp src/resources/docs/*.md dist/resources/docs/ && cp src/skills/besales-dialogue-audit/SKILL.md dist/skills/besales-dialogue-audit/SKILL.md",
|
|
@@ -50,16 +51,21 @@
|
|
|
50
51
|
"dev:mock:seed": "node scripts/mock-credentials.js seed",
|
|
51
52
|
"dev:mock:clear": "node scripts/mock-credentials.js clear",
|
|
52
53
|
"host:probe": "node scripts/probe-mcp-protocol.js",
|
|
53
|
-
"model:eval:server": "node scripts/model-eval-server.js",
|
|
54
|
-
"model:eval": "node scripts/run-model-eval.js",
|
|
55
54
|
"install:claude-desktop": "node scripts/install-claude-desktop.js",
|
|
56
55
|
"prepack": "yarn build",
|
|
57
56
|
"prepublishOnly": "yarn lint:errors && yarn test && yarn build",
|
|
58
|
-
"test": "vitest run
|
|
57
|
+
"test": "vitest run",
|
|
59
58
|
"lint:fix": "eslint src bin scripts eslint.config.js --fix",
|
|
60
59
|
"lint:errors": "eslint src bin scripts eslint.config.js",
|
|
61
|
-
"types:gen:api": "
|
|
62
|
-
"
|
|
60
|
+
"types:gen:api": "node scripts/sync-api-contracts.mjs --types-only",
|
|
61
|
+
"publish:mcp-registry": "node scripts/publish-mcp-registry.mjs",
|
|
62
|
+
"schemas:sync:agent-models": "node scripts/sync-agent-model-schemas.mjs",
|
|
63
|
+
"schemas:sync:trigger-arguments": "node scripts/sync-trigger-argument-schema.mjs",
|
|
64
|
+
"schemas:sync:wave-ids": "node scripts/sync-wave-id-schemas.mjs",
|
|
65
|
+
"schemas:sync:crm-stage-pool": "node scripts/sync-crm-stage-pool-schema.mjs",
|
|
66
|
+
"typecheck": "tsc --noEmit",
|
|
67
|
+
"lint": "eslint src bin scripts eslint.config.js",
|
|
68
|
+
"contracts:sync:api": "node scripts/sync-api-contracts.mjs"
|
|
63
69
|
},
|
|
64
70
|
"engines": {
|
|
65
71
|
"node": ">=20.0.0"
|
|
@@ -74,6 +80,7 @@
|
|
|
74
80
|
"zod": "^4.4.3"
|
|
75
81
|
},
|
|
76
82
|
"devDependencies": {
|
|
83
|
+
"@besales/contract-ledger": "file:vendor/contract-ledger-1.0.0.tgz",
|
|
77
84
|
"@types/node": "^25.7.0",
|
|
78
85
|
"@typescript-eslint/eslint-plugin": "^8.59.3",
|
|
79
86
|
"@typescript-eslint/parser": "^8.59.3",
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { afterAll, describe, expect, it } from 'vitest';
|
|
7
|
+
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
const apiRoot = process.env.BESALES_API_ROOT ?? fileURLToPath(new URL('../../besales-api', import.meta.url));
|
|
10
|
+
const fixtureRoot = mkdtempSync(join(tmpdir(), 'brx1-api-source-'));
|
|
11
|
+
mkdirSync(join(fixtureRoot, 'src/shared'), { recursive: true });
|
|
12
|
+
symlinkSync(join(apiRoot, 'node_modules'), join(fixtureRoot, 'node_modules'), 'dir');
|
|
13
|
+
writeFileSync(join(fixtureRoot, 'package.json'), '{}');
|
|
14
|
+
writeFileSync(join(fixtureRoot, 'src/shared/entities.json'), '{"amp":[38]}');
|
|
15
|
+
writeFileSync(join(fixtureRoot, 'src/shared/broken.json'), '{');
|
|
16
|
+
writeFileSync(join(fixtureRoot, 'src/shared/relative.ts'), `
|
|
17
|
+
import entities from './entities.json';
|
|
18
|
+
export { entities };
|
|
19
|
+
`);
|
|
20
|
+
writeFileSync(join(fixtureRoot, 'src/entry.ts'), `
|
|
21
|
+
import entities from '@shared/entities.json';
|
|
22
|
+
import { entities as relative } from './shared/relative.js';
|
|
23
|
+
export { entities, relative };
|
|
24
|
+
`);
|
|
25
|
+
const load = require('../test/bridge-contract/api-source-loader.cjs')(fixtureRoot);
|
|
26
|
+
afterAll(() => rmSync(fixtureRoot, { recursive: true, force: true }));
|
|
27
|
+
|
|
28
|
+
describe('чтение исходников API без сборки', () => {
|
|
29
|
+
it('JSON через @shared и относительный импорт даёт один разобранный документ', () => {
|
|
30
|
+
const { entities, relative } = load('entry.ts');
|
|
31
|
+
expect(entities).toEqual({ amp: [38] });
|
|
32
|
+
expect(relative).toBe(entities);
|
|
33
|
+
expect(load('shared/entities.json')).toBe(entities);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('битый JSON и выход за корень API не принимаются', () => {
|
|
37
|
+
expect(() => load('shared/broken.json')).toThrow(SyntaxError);
|
|
38
|
+
expect(() => load('../outside.json')).toThrow('API source root escaped');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Только чтение: проверяет входы кресла, не выпускает подписанный contracts/mcp-tool-routes.json.
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { load } from 'js-yaml';
|
|
6
|
+
|
|
7
|
+
const contracts = process.env.BESALES_API_CONTRACTS_DIR?.trim();
|
|
8
|
+
if (!contracts) throw new Error('BESALES_API_CONTRACTS_DIR обязателен');
|
|
9
|
+
const read = (name) => JSON.parse(readFileSync(resolve(contracts, name), 'utf8'));
|
|
10
|
+
const api = load(readFileSync(resolve(contracts, 'openapi-besales-api.yaml'), 'utf8'));
|
|
11
|
+
const published = read('mcp-tool-routes.json');
|
|
12
|
+
const apiMap = read('mcp-v2-route-map.json');
|
|
13
|
+
const registry = JSON.parse(
|
|
14
|
+
readFileSync(new URL('../src/schemas/mcp-tools.json', import.meta.url), 'utf8'),
|
|
15
|
+
);
|
|
16
|
+
const localMap = JSON.parse(
|
|
17
|
+
readFileSync(new URL('../src/schemas/mcp-v2-route-map.json', import.meta.url), 'utf8'),
|
|
18
|
+
);
|
|
19
|
+
const lag = JSON.parse(
|
|
20
|
+
readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'),
|
|
21
|
+
);
|
|
22
|
+
const stable = [
|
|
23
|
+
'besales_agent_create',
|
|
24
|
+
'besales_agent_update',
|
|
25
|
+
'besales_agent_clone',
|
|
26
|
+
'besales_agent_get',
|
|
27
|
+
'besales_icp_get',
|
|
28
|
+
];
|
|
29
|
+
const selected = new Set([
|
|
30
|
+
...stable,
|
|
31
|
+
'besales_platform_settings_update',
|
|
32
|
+
'besales_prompt_batch_start',
|
|
33
|
+
'besales_prompt_batch_status',
|
|
34
|
+
'besales_prompt_batch_resume',
|
|
35
|
+
'besales_prompt_batch_stop',
|
|
36
|
+
'besales_prompt_batch_by_key',
|
|
37
|
+
'besales_dialogue_followup_state_get',
|
|
38
|
+
]);
|
|
39
|
+
const rows = localMap.filter((row) => selected.has(row.tool.split('@')[0]));
|
|
40
|
+
const pendingExport = [];
|
|
41
|
+
for (const row of rows) {
|
|
42
|
+
const path = '/api/v2' + row.expected.pathTemplate.replace(/:([A-Za-z0-9_]+)/gu, '{$1}');
|
|
43
|
+
assert.ok(api.paths[path]?.[row.expected.method.toLowerCase()], `${row.tool}: API route missing`);
|
|
44
|
+
if (!apiMap.some((entry) => entry.tool === row.tool)) pendingExport.push(row.tool);
|
|
45
|
+
}
|
|
46
|
+
for (const name of stable) {
|
|
47
|
+
const schema = registry.tools.find((tool) => tool.name === name).inputSchema;
|
|
48
|
+
assert.deepEqual(
|
|
49
|
+
schema.required,
|
|
50
|
+
published.shippedInputSchemas[name].required,
|
|
51
|
+
`${name}: shipped required changed`,
|
|
52
|
+
);
|
|
53
|
+
assert.deepEqual(
|
|
54
|
+
schema.required,
|
|
55
|
+
published.v2InputSchemas[name].required,
|
|
56
|
+
`${name}: v2 required changed`,
|
|
57
|
+
);
|
|
58
|
+
const local = localMap.find((row) => row.tool === name);
|
|
59
|
+
const mapped = apiMap.find((row) => row.tool === name);
|
|
60
|
+
const exported = published.tools.find((row) => row.name === name);
|
|
61
|
+
for (const [field, value] of Object.entries(local.expected)) {
|
|
62
|
+
assert.deepEqual(value, mapped.expected[field], `${name}: API map ${field} changed`);
|
|
63
|
+
}
|
|
64
|
+
assert.equal(local.expected.method, exported.method, `${name}: exported method changed`);
|
|
65
|
+
assert.equal(local.expected.path, exported.samplePath, `${name}: exported path changed`);
|
|
66
|
+
}
|
|
67
|
+
for (const name of ['besales_agent_create', 'besales_agent_update']) {
|
|
68
|
+
const schema = registry.tools.find((tool) => tool.name === name).inputSchema;
|
|
69
|
+
assert.deepEqual(
|
|
70
|
+
schema.properties.default_icp_profile_id,
|
|
71
|
+
published.shippedInputSchemas[name].properties.default_icp_profile_id,
|
|
72
|
+
);
|
|
73
|
+
assert.deepEqual(
|
|
74
|
+
schema.properties.default_icp_profile_id,
|
|
75
|
+
published.v2InputSchemas[name].properties.default_icp_profile_id,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
for (const map of [localMap, apiMap]) {
|
|
79
|
+
assert.equal(
|
|
80
|
+
map.some(
|
|
81
|
+
(row) => row.expected.method === 'POST' && row.expected.pathTemplate.endsWith('/icp-links'),
|
|
82
|
+
),
|
|
83
|
+
false,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
assert.equal(
|
|
87
|
+
published.tools.some(
|
|
88
|
+
(row) => row.method === 'POST' && /\/icp-links(?:\?|$)/u.test(row.samplePath ?? ''),
|
|
89
|
+
),
|
|
90
|
+
false,
|
|
91
|
+
);
|
|
92
|
+
assert.equal(
|
|
93
|
+
Object.values(lag.contractLag).some((entry) => entry.owner === 'TASK-6.28.204'),
|
|
94
|
+
false,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const deref = (schema) =>
|
|
98
|
+
schema.$ref ? api.components.schemas[schema.$ref.split('/').at(-1)] : schema;
|
|
99
|
+
const settings =
|
|
100
|
+
api.paths['/api/v2/channels/{channelId}/settings'].patch.requestBody.content['application/json']
|
|
101
|
+
.schema;
|
|
102
|
+
for (const [section, fields] of [
|
|
103
|
+
['smsgorodSettings', ['channel', 'sender']],
|
|
104
|
+
['bitrix24BotSettings', ['botId', 'botCode', 'botName', 'openLineId', 'ignoreCrmStageGate']],
|
|
105
|
+
['crmBehavior', ['useCrossPlatformHistory']],
|
|
106
|
+
]) {
|
|
107
|
+
const schema = deref(settings.properties[section]);
|
|
108
|
+
for (const field of fields)
|
|
109
|
+
assert.ok(schema.properties[field], `${section}.${field}: API field missing`);
|
|
110
|
+
}
|
|
111
|
+
const byKey = api.paths['/api/v2/prompt-batch/runs/by-key'].get.parameters.find(
|
|
112
|
+
(entry) => entry.name === 'idempotencyKey',
|
|
113
|
+
);
|
|
114
|
+
assert.equal(byKey.required, true);
|
|
115
|
+
assert.equal(byKey.schema.maxLength, 200);
|
|
116
|
+
assert.equal(byKey.schema.pattern, '\\S');
|
|
117
|
+
console.log(
|
|
118
|
+
JSON.stringify(
|
|
119
|
+
{
|
|
120
|
+
checkedRouteVariants: rows.length,
|
|
121
|
+
stableToolsComparedAgainstBothApiMaps: stable,
|
|
122
|
+
removedLagOwner: 'TASK-6.28.204',
|
|
123
|
+
pendingChairExport: pendingExport,
|
|
124
|
+
signedExportChanged: false,
|
|
125
|
+
},
|
|
126
|
+
null,
|
|
127
|
+
2,
|
|
128
|
+
),
|
|
129
|
+
);
|