@besales/mcp 0.48.0 → 1.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -163
- package/README.onprem.ru.md +35 -0
- package/bin/besales-mcp-http.js +9 -0
- package/bin/besales-onprem.mjs +19 -0
- package/dist/auth/connection-store.d.ts +3 -1
- package/dist/auth/connection-store.js +9 -3
- package/dist/auth/connection-store.js.map +1 -1
- package/dist/auth/oauth-client.d.ts +20 -27
- package/dist/auth/oauth-client.js +31 -23
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/auth/session-workspace.d.ts +1 -0
- package/dist/auth/session-workspace.js +10 -1
- package/dist/auth/session-workspace.js.map +1 -1
- package/dist/auth/token-storage.js +4 -1
- package/dist/auth/token-storage.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +80 -19
- package/dist/cli.js.map +1 -1
- package/dist/constants/crm-catalog.d.ts +2 -0
- package/dist/constants/crm-catalog.js +3 -0
- package/dist/constants/crm-catalog.js.map +1 -0
- package/dist/http/api-client.d.ts +54 -7
- package/dist/http/api-client.js +132 -66
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/feedback-document-error.d.ts +26 -0
- package/dist/http/feedback-document-error.js +22 -0
- package/dist/http/feedback-document-error.js.map +1 -0
- package/dist/http-server.d.ts +15 -0
- package/dist/http-server.js +378 -0
- package/dist/http-server.js.map +1 -0
- package/dist/instructions/server-instructions.d.ts +1 -1
- package/dist/instructions/server-instructions.js +6 -3
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/network/constants.d.ts +25 -0
- package/dist/network/constants.js +26 -0
- package/dist/network/constants.js.map +1 -0
- package/dist/network/failed-verifications.d.ts +10 -0
- package/dist/network/failed-verifications.js +37 -0
- package/dist/network/failed-verifications.js.map +1 -0
- package/dist/network/http-test-fixture.d.ts +3 -0
- package/dist/network/http-test-fixture.js +86 -0
- package/dist/network/http-test-fixture.js.map +1 -0
- package/dist/network/known-keys.d.ts +10 -0
- package/dist/network/known-keys.js +38 -0
- package/dist/network/known-keys.js.map +1 -0
- package/dist/network/memory-credentials.d.ts +11 -0
- package/dist/network/memory-credentials.js +24 -0
- package/dist/network/memory-credentials.js.map +1 -0
- package/dist/network/rate-limit.d.ts +23 -0
- package/dist/network/rate-limit.js +62 -0
- package/dist/network/rate-limit.js.map +1 -0
- package/dist/network/rejected-keys.d.ts +9 -0
- package/dist/network/rejected-keys.js +39 -0
- package/dist/network/rejected-keys.js.map +1 -0
- package/dist/network/request-work.d.ts +8 -0
- package/dist/network/request-work.js +20 -0
- package/dist/network/request-work.js.map +1 -0
- package/dist/network/successful-keys.d.ts +17 -0
- package/dist/network/successful-keys.js +47 -0
- package/dist/network/successful-keys.js.map +1 -0
- package/dist/resources/concepts/external-execution.md +3 -1
- package/dist/resources/concepts/feedback-sheets.md +21 -12
- package/dist/resources/concepts/icp.md +8 -1
- package/dist/resources/concepts/sandbox.md +15 -6
- package/dist/resources/concepts/triggers.md +43 -0
- package/dist/resources/concepts/workbook-classification.md +104 -50
- package/dist/resources/docs/agent-behavior.md +51 -382
- package/dist/resources/docs/campaigns.md +9 -16
- package/dist/resources/docs/crm-integration.md +39 -523
- package/dist/resources/docs/files-and-uploads.md +23 -286
- package/dist/resources/docs/follow-up.md +47 -12
- package/dist/resources/docs/knowledge-base.md +52 -521
- package/dist/resources/docs/pipeline-builder.md +26 -216
- package/dist/resources/docs/pipeline-settings-deep.md +27 -220
- package/dist/resources/docs/platforms.md +149 -519
- package/dist/resources/docs/prompt-anatomy.md +39 -285
- package/dist/resources/docs/routing.md +8 -16
- package/dist/resources/docs/trigger-actions.md +40 -24
- package/dist/resources/docs/variables.md +8 -12
- package/dist/resources/operator-edit.contract.d.ts +7 -0
- package/dist/resources/operator-edit.contract.js +8 -0
- package/dist/resources/operator-edit.contract.js.map +1 -0
- package/dist/resources/registry.js +20 -4
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/audit-dialogues.md +23 -12
- package/dist/resources/workflows/compare-models.md +6 -6
- package/dist/resources/workflows/connect-crm-from-scratch.md +15 -12
- package/dist/resources/workflows/connect-datasource-from-scratch.md +5 -4
- package/dist/resources/workflows/extract-from-document.md +8 -6
- package/dist/resources/workflows/operator-edit.md +15 -0
- package/dist/resources/workflows/platform-setup-from-scratch.md +59 -70
- package/dist/resources/workflows/production-readiness-check.md +25 -15
- package/dist/schemas/mcp-tools.json +12389 -6657
- package/dist/schemas/voice-actions-api.contract.json +248 -0
- package/dist/shared/constants/broadcast-reason.constants.d.ts +2 -0
- package/dist/shared/constants/broadcast-reason.constants.js +47 -0
- package/dist/shared/constants/broadcast-reason.constants.js.map +1 -0
- package/dist/shared/constants/crm-stage-pool.constants.d.ts +2 -0
- package/dist/shared/constants/crm-stage-pool.constants.js +3 -0
- package/dist/shared/constants/crm-stage-pool.constants.js.map +1 -0
- package/dist/shared/constants/followup-note.constants.d.ts +3 -0
- package/dist/shared/constants/followup-note.constants.js +4 -0
- package/dist/shared/constants/followup-note.constants.js.map +1 -0
- package/dist/shared/constants/followup-session.constants.d.ts +2 -0
- package/dist/shared/constants/followup-session.constants.js +3 -0
- package/dist/shared/constants/followup-session.constants.js.map +1 -0
- package/dist/shared/constants/funnel-analytics.constants.d.ts +2 -0
- package/dist/shared/constants/funnel-analytics.constants.js +3 -0
- package/dist/shared/constants/funnel-analytics.constants.js.map +1 -0
- package/dist/shared/constants/message-filter.constants.d.ts +7 -0
- package/dist/shared/constants/message-filter.constants.js +8 -0
- package/dist/shared/constants/message-filter.constants.js.map +1 -0
- package/dist/shared/utils/trigger-repeat-mapping.d.ts +72 -0
- package/dist/shared/utils/trigger-repeat-mapping.js +53 -0
- package/dist/shared/utils/trigger-repeat-mapping.js.map +1 -0
- package/dist/skills/besales-dialogue-audit/SKILL.md +31 -20
- package/dist/tasks/task-state-store.js +5 -0
- package/dist/tasks/task-state-store.js.map +1 -1
- package/dist/tools/annotations.js +4 -3
- package/dist/tools/annotations.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +81 -24
- package/dist/tools/definitions/agent-design.js +246 -90
- package/dist/tools/definitions/agent-design.js.map +1 -1
- package/dist/tools/definitions/agent-model-notice.d.ts +5 -0
- package/dist/tools/definitions/agent-model-notice.js +31 -0
- package/dist/tools/definitions/agent-model-notice.js.map +1 -0
- package/dist/tools/definitions/agent-models.d.ts +5 -0
- package/dist/tools/definitions/agent-models.js +26 -0
- package/dist/tools/definitions/agent-models.js.map +1 -0
- package/dist/tools/definitions/agent-settings.d.ts +85 -0
- package/dist/tools/definitions/agent-settings.js +187 -0
- package/dist/tools/definitions/agent-settings.js.map +1 -0
- package/dist/tools/definitions/ai-costs.d.ts +12 -0
- package/dist/tools/definitions/ai-costs.js +142 -0
- package/dist/tools/definitions/ai-costs.js.map +1 -0
- package/dist/tools/definitions/api-tool-request.d.ts +15 -0
- package/dist/tools/definitions/api-tool-request.js +2 -0
- package/dist/tools/definitions/api-tool-request.js.map +1 -0
- package/dist/tools/definitions/behavior-shipped-form.d.ts +182 -0
- package/dist/tools/definitions/behavior-shipped-form.js +185 -0
- package/dist/tools/definitions/behavior-shipped-form.js.map +1 -0
- package/dist/tools/definitions/broadcast-alerts.d.ts +6 -0
- package/dist/tools/definitions/broadcast-alerts.js +72 -0
- package/dist/tools/definitions/broadcast-alerts.js.map +1 -0
- package/dist/tools/definitions/broadcast-analytics.d.ts +102 -18
- package/dist/tools/definitions/broadcast-analytics.js +732 -431
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +10 -13
- package/dist/tools/definitions/broadcast-scheduler.js +196 -154
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -1
- package/dist/tools/definitions/call-operator-task.schema.d.ts +11 -0
- package/dist/tools/definitions/call-operator-task.schema.js +30 -0
- package/dist/tools/definitions/call-operator-task.schema.js.map +1 -0
- package/dist/tools/definitions/contacts.d.ts +3 -0
- package/dist/tools/definitions/contacts.js +57 -31
- package/dist/tools/definitions/contacts.js.map +1 -1
- package/dist/tools/definitions/crm-platform.d.ts +29 -39
- package/dist/tools/definitions/crm-platform.js +249 -352
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/crm-stage-pool.messages.d.ts +39 -0
- package/dist/tools/definitions/crm-stage-pool.messages.js +43 -0
- package/dist/tools/definitions/crm-stage-pool.messages.js.map +1 -0
- package/dist/tools/definitions/crm-stage-pool.schema.d.ts +64 -0
- package/dist/tools/definitions/crm-stage-pool.schema.js +109 -0
- package/dist/tools/definitions/crm-stage-pool.schema.js.map +1 -0
- package/dist/tools/definitions/custom-reports.d.ts +12 -0
- package/dist/tools/definitions/custom-reports.js +68 -0
- package/dist/tools/definitions/custom-reports.js.map +1 -0
- package/dist/tools/definitions/datasource.d.ts +2 -1
- package/dist/tools/definitions/datasource.js +28 -13
- package/dist/tools/definitions/datasource.js.map +1 -1
- package/dist/tools/definitions/dialog-review-findings-response.d.ts +14 -0
- package/dist/tools/definitions/dialog-review-findings-response.js +23 -0
- package/dist/tools/definitions/dialog-review-findings-response.js.map +1 -0
- package/dist/tools/definitions/dialog-review-safe-response.d.ts +5 -0
- package/dist/tools/definitions/dialog-review-safe-response.js +152 -0
- package/dist/tools/definitions/dialog-review-safe-response.js.map +1 -0
- package/dist/tools/definitions/dialog-review.d.ts +49 -0
- package/dist/tools/definitions/dialog-review.js +383 -0
- package/dist/tools/definitions/dialog-review.js.map +1 -0
- package/dist/tools/definitions/dialogue-analysis.d.ts +46 -0
- package/dist/tools/definitions/dialogue-analysis.js +170 -0
- package/dist/tools/definitions/dialogue-analysis.js.map +1 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.d.ts +7 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.js +41 -0
- package/dist/tools/definitions/dialogue-audit-agent-scope.js.map +1 -0
- package/dist/tools/definitions/dialogue-audit-alias.d.ts +67 -0
- package/dist/tools/definitions/dialogue-audit-alias.js +559 -0
- package/dist/tools/definitions/dialogue-audit-alias.js.map +1 -0
- package/dist/tools/definitions/dialogue-export.d.ts +7 -1
- package/dist/tools/definitions/dialogue-export.js +89 -32
- package/dist/tools/definitions/dialogue-export.js.map +1 -1
- package/dist/tools/definitions/dialogue-followup-state.d.ts +9 -0
- package/dist/tools/definitions/dialogue-followup-state.js +69 -0
- package/dist/tools/definitions/dialogue-followup-state.js.map +1 -0
- package/dist/tools/definitions/dialogue-reprocess.d.ts +5 -0
- package/dist/tools/definitions/dialogue-reprocess.js +107 -0
- package/dist/tools/definitions/dialogue-reprocess.js.map +1 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.d.ts +13 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.js +292 -0
- package/dist/tools/definitions/edit-version-transport.test-fixtures.js.map +1 -0
- package/dist/tools/definitions/edit-version.d.ts +5 -0
- package/dist/tools/definitions/edit-version.js +20 -0
- package/dist/tools/definitions/edit-version.js.map +1 -0
- package/dist/tools/definitions/external-api-channels.js +17 -15
- package/dist/tools/definitions/external-api-channels.js.map +1 -1
- package/dist/tools/definitions/feedback-document-access.d.ts +16 -0
- package/dist/tools/definitions/feedback-document-access.js +63 -0
- package/dist/tools/definitions/feedback-document-access.js.map +1 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.d.ts +3 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.js +9 -0
- package/dist/tools/definitions/fixtures/shipped-setup-status.js.map +1 -0
- package/dist/tools/definitions/follow-up-config.d.ts +79 -0
- package/dist/tools/definitions/follow-up-config.js +258 -0
- package/dist/tools/definitions/follow-up-config.js.map +1 -0
- package/dist/tools/definitions/follow-up-funnel-test.d.ts +4 -3
- package/dist/tools/definitions/follow-up-funnel-test.js +65 -52
- package/dist/tools/definitions/follow-up-funnel-test.js.map +1 -1
- package/dist/tools/definitions/follow-up-promotion-instructions.d.ts +2 -0
- package/dist/tools/definitions/follow-up-promotion-instructions.js +7 -0
- package/dist/tools/definitions/follow-up-promotion-instructions.js.map +1 -0
- package/dist/tools/definitions/follow-up-setup.d.ts +4 -28
- package/dist/tools/definitions/follow-up-setup.js +20 -87
- package/dist/tools/definitions/follow-up-setup.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +20 -122
- package/dist/tools/definitions/follow-up.js +200 -357
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/followup-getcourse-compat.d.ts +29 -0
- package/dist/tools/definitions/followup-getcourse-compat.js +62 -0
- package/dist/tools/definitions/followup-getcourse-compat.js.map +1 -0
- package/dist/tools/definitions/followup-sequence-config.schema.d.ts +10 -0
- package/dist/tools/definitions/followup-sequence-config.schema.js +14 -0
- package/dist/tools/definitions/followup-sequence-config.schema.js.map +1 -0
- package/dist/tools/definitions/funnel-analytics.d.ts +18 -0
- package/dist/tools/definitions/funnel-analytics.js +150 -0
- package/dist/tools/definitions/funnel-analytics.js.map +1 -0
- package/dist/tools/definitions/getcourse-anchor-refresh.d.ts +5 -9
- package/dist/tools/definitions/getcourse-anchor-refresh.js +26 -31
- package/dist/tools/definitions/getcourse-anchor-refresh.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-outbound-settings.d.ts +46 -0
- package/dist/tools/definitions/getcourse-cold-outbound-settings.js +37 -0
- package/dist/tools/definitions/getcourse-cold-outbound-settings.js.map +1 -0
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +14 -29
- package/dist/tools/definitions/getcourse-cold-welcome.js +190 -253
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave-welcome.messages.d.ts +10 -0
- package/dist/tools/definitions/getcourse-wave-welcome.messages.js +17 -0
- package/dist/tools/definitions/getcourse-wave-welcome.messages.js.map +1 -0
- package/dist/tools/definitions/help.js.map +1 -1
- package/dist/tools/definitions/icp-import-source.d.ts +75 -0
- package/dist/tools/definitions/icp-import-source.js +88 -0
- package/dist/tools/definitions/icp-import-source.js.map +1 -0
- package/dist/tools/definitions/inbound-analytics.d.ts +13 -0
- package/dist/tools/definitions/inbound-analytics.js +55 -0
- package/dist/tools/definitions/inbound-analytics.js.map +1 -0
- package/dist/tools/definitions/instagram-comment.templates.d.ts +19 -0
- package/dist/tools/definitions/instagram-comment.templates.js +34 -0
- package/dist/tools/definitions/instagram-comment.templates.js.map +1 -0
- package/dist/tools/definitions/instagram-settings-compat.d.ts +33 -0
- package/dist/tools/definitions/instagram-settings-compat.js +7 -0
- package/dist/tools/definitions/instagram-settings-compat.js.map +1 -0
- package/dist/tools/definitions/knowledge-chunking.d.ts +42 -0
- package/dist/tools/definitions/knowledge-chunking.js +83 -0
- package/dist/tools/definitions/knowledge-chunking.js.map +1 -0
- package/dist/tools/definitions/knowledge-space-search-fields.d.ts +12 -0
- package/dist/tools/definitions/knowledge-space-search-fields.js +30 -0
- package/dist/tools/definitions/knowledge-space-search-fields.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +24 -14
- package/dist/tools/definitions/knowledge.js +342 -233
- package/dist/tools/definitions/knowledge.js.map +1 -1
- package/dist/tools/definitions/legacy-trigger-repeat.d.ts +17 -0
- package/dist/tools/definitions/legacy-trigger-repeat.js +53 -0
- package/dist/tools/definitions/legacy-trigger-repeat.js.map +1 -0
- package/dist/tools/definitions/link-tracking.d.ts +8 -0
- package/dist/tools/definitions/link-tracking.js +141 -38
- package/dist/tools/definitions/link-tracking.js.map +1 -1
- package/dist/tools/definitions/mailing-variant-content.d.ts +75 -0
- package/dist/tools/definitions/mailing-variant-content.js +73 -0
- package/dist/tools/definitions/mailing-variant-content.js.map +1 -0
- package/dist/tools/definitions/model-comparison.d.ts +2 -1
- package/dist/tools/definitions/model-comparison.js +4 -5
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/money-currency.d.ts +5 -0
- package/dist/tools/definitions/money-currency.js +10 -0
- package/dist/tools/definitions/money-currency.js.map +1 -0
- package/dist/tools/definitions/operator-workflow.d.ts +5 -5
- package/dist/tools/definitions/operator-workflow.js +80 -27
- package/dist/tools/definitions/operator-workflow.js.map +1 -1
- package/dist/tools/definitions/platform-funnel-analytics.d.ts +42 -0
- package/dist/tools/definitions/platform-funnel-analytics.js +72 -0
- package/dist/tools/definitions/platform-funnel-analytics.js.map +1 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.d.ts +42 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js +51 -0
- package/dist/tools/definitions/platform-getcourse-wave-field-bindings.js.map +1 -0
- package/dist/tools/definitions/platform-settings-limits.d.ts +5 -0
- package/dist/tools/definitions/platform-settings-limits.js +6 -0
- package/dist/tools/definitions/platform-settings-limits.js.map +1 -0
- package/dist/tools/definitions/platform-settings-shipped-form.d.ts +37 -0
- package/dist/tools/definitions/platform-settings-shipped-form.js +310 -0
- package/dist/tools/definitions/platform-settings-shipped-form.js.map +1 -0
- package/dist/tools/definitions/platform-settings-update.d.ts +300 -0
- package/dist/tools/definitions/platform-settings-update.js +134 -0
- package/dist/tools/definitions/platform-settings-update.js.map +1 -0
- package/dist/tools/definitions/{getcourse-wave.d.ts → platform-setup-wave.d.ts} +75 -6
- package/dist/tools/definitions/platform-setup-wave.js +1079 -0
- package/dist/tools/definitions/platform-setup-wave.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +697 -224
- package/dist/tools/definitions/platform-setup.js +313 -752
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/platform-widget-page-rules.schema.d.ts +10 -0
- package/dist/tools/definitions/platform-widget-page-rules.schema.js +7 -0
- package/dist/tools/definitions/platform-widget-page-rules.schema.js.map +1 -0
- package/dist/tools/definitions/prompt-authoring.constants.d.ts +2 -0
- package/dist/tools/definitions/prompt-authoring.constants.js +3 -0
- package/dist/tools/definitions/prompt-authoring.constants.js.map +1 -0
- package/dist/tools/definitions/prompt-batch-controls.d.ts +5 -0
- package/dist/tools/definitions/prompt-batch-controls.js +40 -0
- package/dist/tools/definitions/prompt-batch-controls.js.map +1 -0
- package/dist/tools/definitions/prompt-draft-authoring.d.ts +5 -0
- package/dist/tools/definitions/prompt-draft-authoring.js +24 -0
- package/dist/tools/definitions/prompt-draft-authoring.js.map +1 -0
- package/dist/tools/definitions/prompt-text-projection.d.ts +11 -0
- package/dist/tools/definitions/prompt-text-projection.js +62 -0
- package/dist/tools/definitions/prompt-text-projection.js.map +1 -0
- package/dist/tools/definitions/reviewer-paid.d.ts +19 -0
- package/dist/tools/definitions/reviewer-paid.js +115 -0
- package/dist/tools/definitions/reviewer-paid.js.map +1 -0
- package/dist/tools/definitions/routing-condition-projection.d.ts +31 -0
- package/dist/tools/definitions/routing-condition-projection.js +97 -0
- package/dist/tools/definitions/routing-condition-projection.js.map +1 -0
- package/dist/tools/definitions/schedule-selection-hints.d.ts +3 -0
- package/dist/tools/definitions/schedule-selection-hints.js +42 -0
- package/dist/tools/definitions/schedule-selection-hints.js.map +1 -0
- package/dist/tools/definitions/{scheduled-tasks.d.ts → scheduled-task-alias.d.ts} +12 -10
- package/dist/tools/definitions/scheduled-task-alias.js +207 -0
- package/dist/tools/definitions/scheduled-task-alias.js.map +1 -0
- package/dist/tools/definitions/session.js +3 -3
- package/dist/tools/definitions/session.js.map +1 -1
- package/dist/tools/definitions/setup-init-operation.schema.d.ts +2 -0
- package/dist/tools/definitions/setup-init-operation.schema.js +6 -0
- package/dist/tools/definitions/setup-init-operation.schema.js.map +1 -0
- package/dist/tools/definitions/shared-input.helpers.d.ts +51 -0
- package/dist/tools/definitions/shared-input.helpers.js +323 -0
- package/dist/tools/definitions/shared-input.helpers.js.map +1 -0
- package/dist/tools/definitions/shared.d.ts +401 -307
- package/dist/tools/definitions/shared.js +430 -652
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions/shipped-output-names.d.ts +19 -0
- package/dist/tools/definitions/shipped-output-names.js +123 -0
- package/dist/tools/definitions/shipped-output-names.js.map +1 -0
- package/dist/tools/definitions/task-state.d.ts +4 -4
- package/dist/tools/definitions/task-state.js +2 -1
- package/dist/tools/definitions/task-state.js.map +1 -1
- package/dist/tools/definitions/telegram-personal-capacity.d.ts +4 -0
- package/dist/tools/definitions/telegram-personal-capacity.js +18 -0
- package/dist/tools/definitions/telegram-personal-capacity.js.map +1 -0
- package/dist/tools/definitions/telegram-personal-management.d.ts +34 -0
- package/dist/tools/definitions/telegram-personal-management.js +139 -0
- package/dist/tools/definitions/telegram-personal-management.js.map +1 -0
- package/dist/tools/definitions/telegram-personal-restrictions.d.ts +19 -0
- package/dist/tools/definitions/telegram-personal-restrictions.js +109 -0
- package/dist/tools/definitions/telegram-personal-restrictions.js.map +1 -0
- package/dist/tools/definitions/telegram-pool-policy.d.ts +8 -0
- package/dist/tools/definitions/telegram-pool-policy.js +56 -0
- package/dist/tools/definitions/telegram-pool-policy.js.map +1 -0
- package/dist/tools/definitions/touch-history-alias.d.ts +4 -0
- package/dist/tools/definitions/touch-history-alias.js +99 -0
- package/dist/tools/definitions/touch-history-alias.js.map +1 -0
- package/dist/tools/definitions/trigger-action-item.schema.d.ts +254 -0
- package/dist/tools/definitions/trigger-action-item.schema.js +121 -0
- package/dist/tools/definitions/trigger-action-item.schema.js.map +1 -0
- package/dist/tools/definitions/trigger-argument.schema.d.ts +14 -0
- package/dist/tools/definitions/trigger-argument.schema.js +23 -0
- package/dist/tools/definitions/trigger-argument.schema.js.map +1 -0
- package/dist/tools/definitions/trigger-claim-alias.d.ts +10 -0
- package/dist/tools/definitions/trigger-claim-alias.js +90 -0
- package/dist/tools/definitions/trigger-claim-alias.js.map +1 -0
- package/dist/tools/definitions/trigger-echo-projection.d.ts +1 -0
- package/dist/tools/definitions/trigger-echo-projection.js +41 -0
- package/dist/tools/definitions/trigger-echo-projection.js.map +1 -0
- package/dist/tools/definitions/trigger-upsert.tool.d.ts +41 -0
- package/dist/tools/definitions/trigger-upsert.tool.js +159 -0
- package/dist/tools/definitions/trigger-upsert.tool.js.map +1 -0
- package/dist/tools/definitions/v15-port-descriptions.d.ts +11 -0
- package/dist/tools/definitions/v15-port-descriptions.js +30 -0
- package/dist/tools/definitions/v15-port-descriptions.js.map +1 -0
- package/dist/tools/definitions/variables.d.ts +44 -0
- package/dist/tools/definitions/variables.js +310 -0
- package/dist/tools/definitions/variables.js.map +1 -0
- package/dist/tools/definitions/voice-action-input.d.ts +9 -0
- package/dist/tools/definitions/voice-action-input.js +141 -0
- package/dist/tools/definitions/voice-action-input.js.map +1 -0
- package/dist/tools/definitions/widget-customization-compat.d.ts +51 -0
- package/dist/tools/definitions/widget-customization-compat.js +23 -0
- package/dist/tools/definitions/widget-customization-compat.js.map +1 -0
- package/dist/tools/definitions.d.ts +1134 -617
- package/dist/tools/definitions.js +63 -27
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/description-localization.js +3 -2
- package/dist/tools/description-localization.js.map +1 -1
- package/dist/tools/follow-up-request.d.ts +19 -0
- package/dist/tools/follow-up-request.js +81 -0
- package/dist/tools/follow-up-request.js.map +1 -0
- package/dist/tools/followup-revision.d.ts +4 -0
- package/dist/tools/followup-revision.js +29 -0
- package/dist/tools/followup-revision.js.map +1 -0
- package/dist/tools/incomplete-list.js +4 -0
- package/dist/tools/incomplete-list.js.map +1 -1
- package/dist/tools/inventory.js +47 -11
- package/dist/tools/inventory.js.map +1 -1
- package/dist/tools/operation-recovery.d.ts +4 -0
- package/dist/tools/operation-recovery.js +33 -0
- package/dist/tools/operation-recovery.js.map +1 -0
- package/dist/tools/registry-mapping-primary.cases.d.ts +2 -0
- package/dist/tools/registry-mapping-primary.cases.js +765 -0
- package/dist/tools/registry-mapping-primary.cases.js.map +1 -0
- package/dist/tools/registry-mapping-secondary.cases.d.ts +2 -0
- package/dist/tools/registry-mapping-secondary.cases.js +626 -0
- package/dist/tools/registry-mapping-secondary.cases.js.map +1 -0
- package/dist/tools/registry-mapping.cases.d.ts +8 -0
- package/dist/tools/registry-mapping.cases.js +170 -0
- package/dist/tools/registry-mapping.cases.js.map +1 -0
- package/dist/tools/registry-test-fixtures.d.ts +50 -0
- package/dist/tools/registry-test-fixtures.js +120 -0
- package/dist/tools/registry-test-fixtures.js.map +1 -0
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +84 -52
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result.d.ts +1 -0
- package/dist/tools/result.js +90 -22
- package/dist/tools/result.js.map +1 -1
- package/dist/tools/toolsets.d.ts +16 -0
- package/dist/tools/toolsets.js +25 -1
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/types/api-contract.gen.d.ts +131892 -22453
- package/dist/utils/credential-signatures.d.ts +3 -0
- package/dist/utils/credential-signatures.js +10 -0
- package/dist/utils/credential-signatures.js.map +1 -0
- package/dist/utils/data-source-column-name.d.ts +10 -0
- package/dist/utils/data-source-column-name.js +36 -0
- package/dist/utils/data-source-column-name.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.js +32 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/secret-read-boundary.d.ts +2 -0
- package/dist/utils/secret-read-boundary.js +88 -0
- package/dist/utils/secret-read-boundary.js.map +1 -0
- package/dist/utils/setup-secrets.d.ts +4 -0
- package/dist/utils/setup-secrets.js +40 -0
- package/dist/utils/setup-secrets.js.map +1 -0
- package/docs/agent-models.md +9 -0
- package/docs/agent-usage-guide.full.ru.md +1 -4
- package/docs/analytics-contract.md +67 -0
- package/docs/async-operation-lifecycle.md +10 -3
- package/docs/connect.ru.md +144 -4
- package/docs/contact-company-profile.md +17 -0
- package/docs/contact-recommendations.md +7 -0
- package/docs/crm-stage-pool.md +73 -0
- package/docs/customer-data.md +61 -0
- package/docs/dialogue-reprocess.md +37 -0
- package/docs/edit-versions.md +36 -0
- package/docs/failure-semantics.md +17 -9
- package/docs/help-navigation.md +15 -42
- package/docs/host-compatibility-matrix.md +72 -93
- package/docs/host-setup.md +33 -35
- package/docs/invariants/public-api-and-contracts.md +16 -0
- package/docs/legacy-action-settings.md +21 -0
- package/docs/main-transfer-dependencies.md +38 -0
- package/docs/mcp2-parity.md +50 -0
- package/docs/modules/analytics.md +79 -0
- package/docs/modules/besales-mcp.md +144 -0
- package/docs/modules/dialog-review-report.md +38 -0
- package/docs/modules/dialogue-followup-adapters.md +39 -0
- package/docs/modules/message-reactions.md +17 -0
- package/docs/modules/network-mode.md +284 -0
- package/docs/modules/prompt-batch-and-dialogue-controls.md +69 -0
- package/docs/pii-policy.md +21 -16
- package/docs/response-size-budget.md +197 -7
- package/docs/secret-read-boundary.md +102 -0
- package/docs/task-state.md +7 -2
- package/docs/telegram-personal-management.md +50 -0
- package/docs/telegram-personal-restrictions.md +87 -0
- package/docs/telegram-pool-policy.md +19 -0
- package/docs/tool-effects.md +15 -9
- package/docs/tool-surface.md +205 -4
- package/docs/voice-actions-and-inbox.md +95 -0
- package/docs/wazzup-instagram-comments.md +26 -0
- package/package.json +17 -10
- package/scripts/api-source-loader.spec.mjs +40 -0
- package/scripts/audit-bridge-controls.mjs +129 -0
- package/scripts/audit-revert-mutants.mjs +107 -0
- package/scripts/bridge-api-input.spec.mjs +98 -0
- package/scripts/bridge-controls-mutants.mjs +130 -0
- package/scripts/brx3-shipped-refusals.spec.mjs +149 -0
- package/scripts/brx4-ledger-payload.spec.mjs +127 -0
- package/scripts/build-onprem.mjs +108 -0
- package/scripts/connect-clients.sh +141 -0
- package/scripts/connect-scopes.mjs +166 -0
- package/scripts/connect-scopes.spec.mjs +83 -0
- package/scripts/emit-personal-link-carrier.mjs +31 -0
- package/scripts/emit-setup-init-schemas.mjs +24 -0
- package/scripts/emit-tool-routes.mjs +878 -0
- package/scripts/emit-tool-routes.spec.mjs +300 -0
- package/scripts/followup-registry.spec.mjs +107 -0
- package/scripts/generate-crm-rotation-contract.mjs +98 -0
- package/scripts/generate-followup-session-contract.mjs +16 -0
- package/scripts/getcourse-text-source.spec.mjs +110 -0
- package/scripts/icp-import-verification/mutate.cjs +70 -0
- package/scripts/import-secret-read-contract.mjs +53 -0
- package/scripts/install-claude-desktop.js +1 -1
- package/scripts/lag-decisions.mjs +37 -0
- package/scripts/lag-decisions.spec.mjs +87 -0
- package/scripts/lag-open-task-owners.mjs +46 -0
- package/scripts/lag-open-task-owners.spec.mjs +78 -0
- package/scripts/lag-payload.mjs +10 -0
- package/scripts/legacy-action-lag.spec.mjs +22 -0
- package/scripts/legacy-field-refusal.shipped.spec.mjs +99 -0
- package/scripts/mcpcompat-handler.mjs +34 -0
- package/scripts/mcpcompat-loader.mjs +36 -0
- package/scripts/mcpcompat-typescript.mjs +3 -0
- package/scripts/platform-settings-shipped-parity.spec.mjs +89 -0
- package/scripts/prbr-round1-recheck.spec.mjs +605 -0
- package/scripts/prbr-shipped-compatibility.spec.mjs +276 -0
- package/scripts/publish-mcp-registry.mjs +98 -0
- package/scripts/publish-mcp-registry.spec.mjs +68 -0
- package/scripts/record-scheduled-task-call.mjs +26 -0
- package/scripts/refusal-probe.mjs +17 -0
- package/scripts/refusal-probe.spec.mjs +29 -0
- package/scripts/registry-diff.mjs +502 -0
- package/scripts/registry-diff.spec.mjs +787 -0
- package/scripts/request-query.mjs +43 -0
- package/scripts/request-query.spec.mjs +82 -0
- package/scripts/route-lag.mjs +23 -0
- package/scripts/route-lag.spec.mjs +30 -0
- package/scripts/sample-args.mjs +174 -0
- package/scripts/sample-args.spec.mjs +160 -0
- package/scripts/shipped-definitions.mjs +197 -0
- package/scripts/shipped-definitions.spec.mjs +57 -0
- package/scripts/shipped-inputs.spec.mjs +136 -0
- package/scripts/shipped-recordings.spec.mjs +19 -0
- package/scripts/shipped-ref.d.mts +5 -0
- package/scripts/shipped-ref.mjs +20 -0
- package/scripts/shipped-ref.spec.mjs +59 -0
- package/scripts/shipped-registry.mjs +107 -0
- package/scripts/shipped-sample-candidates.mjs +69 -0
- package/scripts/shipped-sample-candidates.spec.mjs +117 -0
- package/scripts/shipped-sample.mjs +871 -0
- package/scripts/shipped-sample.spec.mjs +451 -0
- package/scripts/sync-agent-model-schemas.mjs +72 -0
- package/scripts/sync-api-contracts.mjs +85 -0
- package/scripts/sync-api-contracts.spec.mjs +144 -0
- package/scripts/sync-contract-ledger-schemas.mjs +161 -0
- package/scripts/sync-crm-stage-pool-schema.mjs +85 -0
- package/scripts/sync-prompt-draft-schema.mjs +92 -0
- package/scripts/sync-route-map.mjs +94 -0
- package/scripts/sync-schema-descriptions.mjs +25 -0
- package/scripts/sync-tool-inventory.mjs +27 -0
- package/scripts/sync-trigger-argument-schema.mjs +97 -0
- package/scripts/sync-trigger-argument-schema.spec.mjs +91 -0
- package/scripts/sync-trigger-event-schema.mjs +20 -0
- package/scripts/sync-trigger-repeat-mapping.mjs +12 -0
- package/scripts/sync-trigger-task-schema.mjs +45 -0
- package/scripts/sync-voice-actions-contract.mjs +67 -0
- package/scripts/sync-voice-actions-tools.mjs +97 -0
- package/scripts/sync-wave-id-schemas.mjs +55 -0
- package/scripts/telegram-personal-confirmation-mutants.mjs +74 -0
- package/scripts/tool-input-schemas.mjs +46 -0
- package/scripts/tool-input-schemas.spec.mjs +50 -0
- package/scripts/verify-followup-adapters.mjs +235 -0
- package/scripts/verify-secret-read-import.mjs +84 -0
- package/scripts/verify-secret-read-mutants.mjs +143 -0
- package/dist/tools/definitions/analytics.d.ts +0 -40
- package/dist/tools/definitions/analytics.js +0 -233
- package/dist/tools/definitions/analytics.js.map +0 -1
- package/dist/tools/definitions/broadcast-mailing-variants.d.ts +0 -41
- package/dist/tools/definitions/broadcast-mailing-variants.js +0 -194
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +0 -1
- package/dist/tools/definitions/dialogue-audit.d.ts +0 -38
- package/dist/tools/definitions/dialogue-audit.js +0 -292
- package/dist/tools/definitions/dialogue-audit.js.map +0 -1
- package/dist/tools/definitions/getcourse-wave.js +0 -519
- package/dist/tools/definitions/getcourse-wave.js.map +0 -1
- package/dist/tools/definitions/operational-overview.d.ts +0 -3
- package/dist/tools/definitions/operational-overview.js +0 -23
- package/dist/tools/definitions/operational-overview.js.map +0 -1
- package/dist/tools/definitions/scheduled-tasks.js +0 -173
- package/dist/tools/definitions/scheduled-tasks.js.map +0 -1
- package/dist/tools/definitions/trigger-contact-claims.d.ts +0 -7
- package/dist/tools/definitions/trigger-contact-claims.js +0 -60
- package/dist/tools/definitions/trigger-contact-claims.js.map +0 -1
- package/dist/tools/registry-mapping-cases-core.d.ts +0 -38
- package/dist/tools/registry-mapping-cases-core.js +0 -963
- package/dist/tools/registry-mapping-cases-core.js.map +0 -1
- package/dist/tools/registry-mapping-cases-platform.d.ts +0 -2
- package/dist/tools/registry-mapping-cases-platform.js +0 -1052
- package/dist/tools/registry-mapping-cases-platform.js.map +0 -1
- package/dist/tools/trigger-action-config.d.ts +0 -49
- package/dist/tools/trigger-action-config.js +0 -171
- package/dist/tools/trigger-action-config.js.map +0 -1
- package/docs/evals/model-behavior-scorecard.md +0 -80
- package/docs/operation-coverage.md +0 -114
- package/scripts/mock-credentials.js +0 -77
- package/scripts/model-eval-server.js +0 -213
- package/scripts/run-model-eval.js +0 -447
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const fs = require('node:fs');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const crypto = require('node:crypto');
|
|
4
|
+
const { spawnSync } = require('node:child_process');
|
|
5
|
+
const root = process.cwd();
|
|
6
|
+
const maxMs = Number(process.env.VERIFY_PORTION_MAX_MS ?? 540000);
|
|
7
|
+
if (!Number.isSafeInteger(maxMs) || maxMs <= 0) throw new Error('Invalid VERIFY_PORTION_MAX_MS');
|
|
8
|
+
const manifest = JSON.parse(fs.readFileSync('test/icp-import/mutations.json', 'utf8'));
|
|
9
|
+
const wanted = process.argv.slice(2);
|
|
10
|
+
if (wanted.length === 0 || wanted.some(id => !manifest.some(row => row.id === id)))
|
|
11
|
+
throw new Error('Supply existing mutant IDs; one invocation is one bounded portion');
|
|
12
|
+
const deadline = Date.now() + maxMs;
|
|
13
|
+
const directory = path.join(root, '.codex-artifacts-codex-icpb14417', 'mutations');
|
|
14
|
+
fs.mkdirSync(directory, { recursive: true });
|
|
15
|
+
const sha = data => crypto.createHash('sha256').update(data).digest('hex');
|
|
16
|
+
function run(row, phase) {
|
|
17
|
+
const report = path.join(directory, row.id + '-' + phase + '.json');
|
|
18
|
+
if (fs.existsSync(report)) fs.unlinkSync(report);
|
|
19
|
+
const args = ['--max-old-space-size=6144', 'node_modules/vitest/vitest.mjs', 'run', '--maxWorkers=2', row.test, '--testNamePattern', row.name, '--reporter=json', '--outputFile', report];
|
|
20
|
+
const remaining = deadline - Date.now();
|
|
21
|
+
if (remaining <= 0) throw new Error('Portion expired before ' + row.id);
|
|
22
|
+
const processResult = spawnSync(process.execPath, args, {
|
|
23
|
+
cwd: root, env: process.env, timeout: remaining, killSignal: 'SIGTERM', encoding: 'utf8', maxBuffer: 8 * 1024 * 1024,
|
|
24
|
+
});
|
|
25
|
+
fs.writeFileSync(path.join(directory, row.id + '-' + phase + '.log'),
|
|
26
|
+
processResult.stdout + '\n' + processResult.stderr);
|
|
27
|
+
const payload = fs.existsSync(report) ? JSON.parse(fs.readFileSync(report, 'utf8')) : null;
|
|
28
|
+
const failures = (payload?.testResults ?? []).flatMap(suite => suite.assertionResults ?? [])
|
|
29
|
+
.filter(result => result.status === 'failed' && new RegExp(row.name).test(result.fullName));
|
|
30
|
+
const targetPath = row.test.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
31
|
+
const targetStack = new RegExp('\\bat\\s+[^\\n]*' + targetPath + ':\\d+:\\d+');
|
|
32
|
+
const targetAssertion = failures.some(result => result.failureMessages.some(message => {
|
|
33
|
+
const plain = message.replace(/\u001b\[[0-9;]*m/g, '');
|
|
34
|
+
return /expect\(|AssertionError|Expected:/.test(plain) && targetStack.test(plain);
|
|
35
|
+
}));
|
|
36
|
+
return { rc: processResult.status, signal: processResult.signal, timedOut: processResult.error?.code === 'ETIMEDOUT',
|
|
37
|
+
tested: payload?.numPassedTests ?? 0, failed: payload?.numFailedTests ?? 0, targetAssertion };
|
|
38
|
+
}
|
|
39
|
+
let failed = false;
|
|
40
|
+
for (const row of manifest.filter(row => wanted.includes(row.id))) {
|
|
41
|
+
const originals = new Map();
|
|
42
|
+
let result;
|
|
43
|
+
try {
|
|
44
|
+
const baseline = run(row, 'control');
|
|
45
|
+
if (baseline.rc !== 0 || baseline.tested < 1) throw new Error('Control is not green: ' + JSON.stringify(baseline));
|
|
46
|
+
for (const patch of row.patches) {
|
|
47
|
+
const file = path.resolve(root, patch.file);
|
|
48
|
+
if (!file.startsWith(root + path.sep)) throw new Error('Patch escapes root');
|
|
49
|
+
if (!originals.has(file)) originals.set(file, fs.readFileSync(file));
|
|
50
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
51
|
+
if (text.split(patch.from).length - 1 !== patch.count) throw new Error('Patch drift: ' + row.id);
|
|
52
|
+
fs.writeFileSync(file, text.split(patch.from).join(patch.to));
|
|
53
|
+
}
|
|
54
|
+
const mutated = run(row, 'mutant');
|
|
55
|
+
const state = mutated.rc !== null && mutated.rc !== 0 && !mutated.signal && !mutated.timedOut && mutated.targetAssertion ? 'KILLED'
|
|
56
|
+
: mutated.rc === 0 ? 'SURVIVED' : 'INFRASTRUCTURE';
|
|
57
|
+
result = { id: row.id, criterion: row.criterion, state, baseline, mutated };
|
|
58
|
+
} catch (error) {
|
|
59
|
+
result = { id: row.id, criterion: row.criterion, state: 'INFRASTRUCTURE', error: String(error) };
|
|
60
|
+
} finally {
|
|
61
|
+
for (const [file, content] of originals) {
|
|
62
|
+
fs.writeFileSync(file, content);
|
|
63
|
+
if (sha(fs.readFileSync(file)) !== sha(content)) throw new Error('RESTORATION FAILED: ' + file);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
fs.writeFileSync(path.join(directory, row.id + '-result.json'), JSON.stringify(result, null, 2) + '\n');
|
|
67
|
+
console.log(JSON.stringify(result));
|
|
68
|
+
if (result.state !== 'KILLED') { failed = true; break; }
|
|
69
|
+
}
|
|
70
|
+
process.exitCode = failed ? 1 : 0;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
|
|
7
|
+
const [apiRoot, verifierLog] = process.argv.slice(2);
|
|
8
|
+
assert(apiRoot && verifierLog, 'Usage: node scripts/import-secret-read-contract.mjs API_ROOT VREQ_LOG');
|
|
9
|
+
const matches = [...readFileSync(verifierLog, 'utf8').matchAll(/PRSM_BRIDGE_CONTRACT=([A-Za-z0-9+/=]+)/gu)];
|
|
10
|
+
assert.equal(matches.length, 1, 'Exactly one successful API contract is required');
|
|
11
|
+
const contract = JSON.parse(Buffer.from(matches[0][1], 'base64').toString('utf8'));
|
|
12
|
+
assert.equal(contract.version, 1);
|
|
13
|
+
assert.match(contract.apiRevision, /^[a-f0-9]{40}$/u);
|
|
14
|
+
const git = (...args) => execFileSync('git', ['-C', apiRoot, ...args], { encoding: 'utf8' }).trimEnd();
|
|
15
|
+
const localRevision = git('rev-parse', 'HEAD');
|
|
16
|
+
// Канал синхронизирует рабочие файлы, но его Git-метка может отставать. Чужая ветка
|
|
17
|
+
// запрещена; любой изменённый runtime-файл обязан иметь совпавший проверенный хэш.
|
|
18
|
+
git('merge-base', '--is-ancestor', contract.apiRevision, localRevision);
|
|
19
|
+
const roots = ['src', 'scripts/migration'];
|
|
20
|
+
const committed = git('diff', '--name-only', contract.apiRevision, localRevision, '--', ...roots).split('\n').filter(Boolean);
|
|
21
|
+
const uncommitted = git('status', '--porcelain', '--untracked-files=all', '--', ...roots).split('\n').filter(Boolean).map(line => line.slice(3));
|
|
22
|
+
for (const file of new Set([...committed, ...uncommitted])) {
|
|
23
|
+
if (!file.endsWith('.spec.ts')) assert(Object.hasOwn(contract.sources, file), 'API runtime has unverified changes: ' + file);
|
|
24
|
+
}
|
|
25
|
+
assert.equal(contract.samples.length, 30);
|
|
26
|
+
assert.equal(Object.keys(contract.sources).length, 17);
|
|
27
|
+
const rejectedColumns = contract.columnNames.filter(vector => vector.decision !== 'SAFE').length;
|
|
28
|
+
assert.equal(contract.metadataWrites.length, rejectedColumns + 18);
|
|
29
|
+
assert.equal(contract.metadataWrites.filter(sample => sample.status === 400).length, rejectedColumns + 16);
|
|
30
|
+
assert(contract.metadataWrites.some(sample => JSON.stringify(sample.requestBody).includes('ghp_1234567890abcdefghij') && sample.status === 400));
|
|
31
|
+
for (const sample of contract.metadataWrites) {
|
|
32
|
+
assert([201, 400].includes(sample.status));
|
|
33
|
+
for (const secret of contract.forbidden)
|
|
34
|
+
assert(!JSON.stringify(sample.response).includes(JSON.stringify(secret).slice(1, -1)), 'Unsafe metadata write response');
|
|
35
|
+
}
|
|
36
|
+
assert.equal(contract.inventory.version, 1);
|
|
37
|
+
assert.equal(contract.inventory.groups.flatMap(group => group.tools).length, 292);
|
|
38
|
+
for (const [file, expected] of Object.entries(contract.sources)) {
|
|
39
|
+
assert(/^(?:src|test|scripts)\//u.test(file) && !file.includes('..'));
|
|
40
|
+
const actual = createHash('sha256').update(readFileSync(resolve(apiRoot, file))).digest('hex');
|
|
41
|
+
assert.equal(actual, expected, 'API source changed since verification: ' + file);
|
|
42
|
+
}
|
|
43
|
+
for (const sample of contract.samples) {
|
|
44
|
+
const wire = JSON.stringify(sample.response);
|
|
45
|
+
for (const secret of contract.forbidden) assert(!wire.includes(JSON.stringify(secret).slice(1, -1)), sample.tool + ': unsafe fixture');
|
|
46
|
+
assert(sample.principal === 'owner' ? [200, 422].includes(sample.status) : [403, 404].includes(sample.status));
|
|
47
|
+
}
|
|
48
|
+
contract.verifiedApiRevision = localRevision;
|
|
49
|
+
const destination = new URL('../src/tools/__fixtures__/secret-read-contract.json', import.meta.url);
|
|
50
|
+
// Compact wire capture: response bodies are never rewritten.
|
|
51
|
+
mkdirSync(new URL('.', destination), { recursive: true });
|
|
52
|
+
writeFileSync(destination, JSON.stringify(contract) + '\n');
|
|
53
|
+
console.log('Imported ' + contract.samples.length + ' verified HTTP responses; all source hashes and runtime changes match');
|
|
@@ -11,7 +11,7 @@ const CLAUDE_CONFIG_PATH = join(
|
|
|
11
11
|
'Library/Application Support/Claude/claude_desktop_config.json',
|
|
12
12
|
);
|
|
13
13
|
const LOCAL_API_BASE_URL = 'http://localhost:3000/api/v2';
|
|
14
|
-
const LOCAL_OAUTH_AUTHORIZE_URL = 'http://localhost:
|
|
14
|
+
const LOCAL_OAUTH_AUTHORIZE_URL = 'http://localhost:3000/api/v2/auth/mcp-connect/start';
|
|
15
15
|
const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
16
16
|
const packageRoot = dirname(fileURLToPath(new URL('../package.json', import.meta.url)));
|
|
17
17
|
const binPath = join(packageRoot, 'bin/besales-mcp.js');
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** ACTIVE без причины и точной пары ID + ключ не разрешает расхождение отгруженного контракта. */
|
|
2
|
+
export function lagDecisionErrors(registry, decisionsText) {
|
|
3
|
+
const decisions = new Map();
|
|
4
|
+
const ids = new Set();
|
|
5
|
+
const errors = [];
|
|
6
|
+
for (const match of decisionsText.matchAll(/<!-- contract-ledger-decision (.+?) -->/gu)) {
|
|
7
|
+
const entry = JSON.parse(match[1]);
|
|
8
|
+
if (entry.status !== 'ACTIVE') continue;
|
|
9
|
+
if (
|
|
10
|
+
typeof entry.id !== 'string' ||
|
|
11
|
+
!/^\d+(?:\.\d+)+:[^\s;,]+$/u.test(entry.id) ||
|
|
12
|
+
typeof entry.key !== 'string' ||
|
|
13
|
+
typeof entry.reason !== 'string' ||
|
|
14
|
+
!entry.reason.replace(/decision:[^\s;,]+/gu, '').replace(/[;\s]/gu, '') ||
|
|
15
|
+
ids.has(entry.id) ||
|
|
16
|
+
decisions.has(entry.key)
|
|
17
|
+
) {
|
|
18
|
+
errors.push(`решение ${entry.id}: нужны уникальные ID, ключ и непустая причина`);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
ids.add(entry.id);
|
|
22
|
+
decisions.set(entry.key, entry);
|
|
23
|
+
}
|
|
24
|
+
for (const [section, rows] of Object.entries(registry)) {
|
|
25
|
+
if (rows === null || typeof rows !== 'object' || Array.isArray(rows)) continue;
|
|
26
|
+
for (const [key, row] of Object.entries(rows)) {
|
|
27
|
+
if (row?.owner !== 'DELIBERATE') continue;
|
|
28
|
+
const fullKey = `${section}:${key}`;
|
|
29
|
+
const entry = decisions.get(fullKey);
|
|
30
|
+
const reason = typeof row.reason === 'string' ? row.reason : '';
|
|
31
|
+
const refs = [...reason.matchAll(/decision:([^\s;,]+)/gu)].map((match) => match[1]);
|
|
32
|
+
if (entry === undefined || !refs.includes(entry.id))
|
|
33
|
+
errors.push(`${fullKey}: нет ACTIVE решения для точного ключа и ссылки`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return errors.sort();
|
|
37
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { lagDecisionErrors } from './lag-decisions.mjs';
|
|
6
|
+
import { lagMetadataErrors } from './registry-diff.mjs';
|
|
7
|
+
|
|
8
|
+
const root = fileURLToPath(new URL('../..', import.meta.url));
|
|
9
|
+
const text = readFileSync(`${root}/besales-api/docs/contract-ledger/cledg-decisions.md`, 'utf8');
|
|
10
|
+
const registry = JSON.parse(
|
|
11
|
+
readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'),
|
|
12
|
+
);
|
|
13
|
+
const entries = [...text.matchAll(/<!-- contract-ledger-decision (.+?) -->/gu)]
|
|
14
|
+
.map((match) => JSON.parse(match[1]))
|
|
15
|
+
.filter((entry) => entry.status === 'ACTIVE');
|
|
16
|
+
const restorations = [...text.matchAll(/<!-- contract-ledger-restoration (.+?) -->/gu)].map(
|
|
17
|
+
(match) => JSON.parse(match[1]),
|
|
18
|
+
);
|
|
19
|
+
const require = createRequire(import.meta.url);
|
|
20
|
+
const api = require(`${root}/besales-api/scripts/contract-ledger/lag-owners.js`);
|
|
21
|
+
|
|
22
|
+
describe('адресное решение обязательно у производителя и независимого API-потребителя', () => {
|
|
23
|
+
it('все 90 строк аудита и 26 прежних ссылок разобраны; каждая ACTIVE имеет точный ключ', () => {
|
|
24
|
+
expect(
|
|
25
|
+
[...entries, ...restorations]
|
|
26
|
+
.filter((entry) => entry.auditNumber)
|
|
27
|
+
.map((entry) => entry.auditNumber)
|
|
28
|
+
.sort((a, b) => a - b),
|
|
29
|
+
).toEqual(Array.from({ length: 90 }, (_, index) => index + 1));
|
|
30
|
+
expect(
|
|
31
|
+
[...entries, ...restorations]
|
|
32
|
+
.filter((entry) => entry.referenceNumber)
|
|
33
|
+
.map((entry) => entry.referenceNumber)
|
|
34
|
+
.sort((a, b) => a - b),
|
|
35
|
+
).toEqual(Array.from({ length: 26 }, (_, index) => index + 1));
|
|
36
|
+
expect(lagDecisionErrors(registry, text)).toEqual([]);
|
|
37
|
+
expect(lagMetadataErrors(registry)).toEqual([]);
|
|
38
|
+
const rows = api.collectRows(registry, 'bridge');
|
|
39
|
+
expect(api.ownershipErrors(rows, text, '', { requireOpenOwners: false })).toEqual([]);
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
expect(rows.filter((row) => row.key === entry.key)).toHaveLength(1);
|
|
42
|
+
expect(entry.reason.trim()).not.toBe('');
|
|
43
|
+
for (const file of [...entry.code, ...entry.tests])
|
|
44
|
+
expect(readFileSync(`${root}/${file}`, 'utf8').length, file).toBeGreaterThan(0);
|
|
45
|
+
}
|
|
46
|
+
for (const entry of restorations) {
|
|
47
|
+
expect(
|
|
48
|
+
rows.filter((row) => row.key === entry.key),
|
|
49
|
+
entry.key,
|
|
50
|
+
).toHaveLength(0);
|
|
51
|
+
for (const file of [...entry.code, ...entry.tests])
|
|
52
|
+
expect(readFileSync(`${root}/${file}`, 'utf8').length, file).toBeGreaterThan(0);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it.each(entries)('$id: удаление причины или ACTIVE не проходит ни один сторож', (entry) => {
|
|
57
|
+
for (const broken of [
|
|
58
|
+
{ ...entry, reason: '' },
|
|
59
|
+
{ ...entry, reason: 'decision:' + entry.id },
|
|
60
|
+
{ ...entry, status: 'PROPOSED' },
|
|
61
|
+
{ ...entry, key: entry.key + '-other' },
|
|
62
|
+
]) {
|
|
63
|
+
const changed = text.replace(JSON.stringify(entry), JSON.stringify(broken));
|
|
64
|
+
expect(lagDecisionErrors(registry, changed), entry.id).not.toEqual([]);
|
|
65
|
+
expect(
|
|
66
|
+
api.ownershipErrors(api.collectRows(registry, 'bridge'), changed, '', {
|
|
67
|
+
requireOpenOwners: false,
|
|
68
|
+
}),
|
|
69
|
+
entry.id,
|
|
70
|
+
).not.toEqual([]);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it.each(['contractLag', 'optionalInputExtensions', 'contractExtensions'])(
|
|
75
|
+
'%s: одна ссылка вместо причины недостаточна',
|
|
76
|
+
(section) => {
|
|
77
|
+
const row = {
|
|
78
|
+
owner: 'DELIBERATE',
|
|
79
|
+
severity: 'DELIBERATE',
|
|
80
|
+
reason: 'decision:6.19.51:empty',
|
|
81
|
+
};
|
|
82
|
+
expect(lagMetadataErrors({ [section]: { field: row } })).toEqual([`${section}:field`]);
|
|
83
|
+
expect(api.metadataErrors(section, row)).toContain('пустая причина');
|
|
84
|
+
expect(lagDecisionErrors({ [section]: { field: row } }, '')).not.toEqual([]);
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
import { LAG_SECTIONS, lagMetadataErrors } from './registry-diff.mjs';
|
|
4
|
+
import { lagDecisionErrors } from './lag-decisions.mjs';
|
|
5
|
+
|
|
6
|
+
/** Планы — обязательные входы CI, а не снимок списка открытых задач в пакете. */
|
|
7
|
+
export function readLagPlans(env = process.env) {
|
|
8
|
+
const texts = ['BESALES_WORKING_PLAN', 'BESALES_CLOSED_PLAN'].map((name) => {
|
|
9
|
+
const path = env[name]?.trim();
|
|
10
|
+
if (!path) throw new Error(`${name}: укажите файл плана; открытость владельцев не проверена`);
|
|
11
|
+
return readFileSync(path, 'utf8');
|
|
12
|
+
});
|
|
13
|
+
const decisionsText = readFileSync(
|
|
14
|
+
env.BESALES_LAG_DECISIONS_FILE ??
|
|
15
|
+
new URL('../../besales-api/docs/contract-ledger/cledg-decisions.md', import.meta.url),
|
|
16
|
+
'utf8',
|
|
17
|
+
);
|
|
18
|
+
return { workingText: texts[0], closedText: texts[1], decisionsText };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Только заголовок задачи: упоминания номера и старые списки владельцев не подходят. */
|
|
22
|
+
export function planTaskIds(text) {
|
|
23
|
+
const ids = new Set();
|
|
24
|
+
for (const match of text.matchAll(/^#### Task (\d+(?:\.\d+)+)(?=[: (])/gmu)) {
|
|
25
|
+
ids.add(match[1]);
|
|
26
|
+
}
|
|
27
|
+
if (ids.size === 0) throw new Error('План не содержит заголовков Task');
|
|
28
|
+
return ids;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Ни бюджета, ни исключений для старых строк: проверяются все разделы реестра. */
|
|
32
|
+
export function lagOpenTaskErrors(registry, { workingText, closedText, decisionsText = '' }) {
|
|
33
|
+
const working = planTaskIds(workingText);
|
|
34
|
+
const closed = planTaskIds(closedText);
|
|
35
|
+
const errors = [...lagMetadataErrors(registry), ...lagDecisionErrors(registry, decisionsText)];
|
|
36
|
+
for (const section of LAG_SECTIONS) {
|
|
37
|
+
for (const [key, row] of Object.entries(registry[section] ?? {})) {
|
|
38
|
+
if (row.owner === 'DELIBERATE') continue;
|
|
39
|
+
const id = typeof row.owner === 'string' ? row.owner.replace(/^TASK-/u, '') : '';
|
|
40
|
+
if (!working.has(id) || closed.has(id)) {
|
|
41
|
+
errors.push(`${section}:${key}: ${row.owner} — задача не открыта однозначно`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return [...new Set(errors)].sort();
|
|
46
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
import { LAG_SECTIONS } from './registry-diff.mjs';
|
|
5
|
+
import { lagOpenTaskErrors, planTaskIds, readLagPlans } from './lag-open-task-owners.mjs';
|
|
6
|
+
|
|
7
|
+
const plans = {
|
|
8
|
+
workingText: '#### Task 6.19.51: Открытая\nСсылка на Task 6.22.10\n',
|
|
9
|
+
closedText: '#### Task 6.22.10: Закрытая\n',
|
|
10
|
+
};
|
|
11
|
+
const row = {
|
|
12
|
+
owner: 'TASK-6.19.51',
|
|
13
|
+
reason: 'Отказ проверяет владелец; decision:6.19.51:test',
|
|
14
|
+
severity: 'LIVE_400',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
describe('владелец — открытая задача рабочего плана или DELIBERATE', () => {
|
|
18
|
+
it.each(LAG_SECTIONS)('%s: нет исключений для раздела или прежней строки', (section) => {
|
|
19
|
+
expect(lagOpenTaskErrors({ [section]: { field: row } }, plans)).toEqual([]);
|
|
20
|
+
for (const owner of ['домен', 'TASK-6.999.1', 'TASK-6.22.10', 'TASK-6.19.51 (закрыта)']) {
|
|
21
|
+
expect(
|
|
22
|
+
lagOpenTaskErrors({ [section]: { field: { ...row, owner } } }, plans).join('\n'),
|
|
23
|
+
).toContain(`${section}:field`);
|
|
24
|
+
}
|
|
25
|
+
expect(
|
|
26
|
+
lagOpenTaskErrors(
|
|
27
|
+
{ [section]: { field: row } },
|
|
28
|
+
{
|
|
29
|
+
...plans,
|
|
30
|
+
closedText: plans.closedText + '\n#### Task 6.19.51: тоже закрытая',
|
|
31
|
+
},
|
|
32
|
+
),
|
|
33
|
+
).toEqual([`${section}:field: TASK-6.19.51 — задача не открыта однозначно`]);
|
|
34
|
+
expect(
|
|
35
|
+
lagOpenTaskErrors(
|
|
36
|
+
{
|
|
37
|
+
[section]: {
|
|
38
|
+
field: {
|
|
39
|
+
...row,
|
|
40
|
+
owner: 'DELIBERATE',
|
|
41
|
+
severity: 'DELIBERATE',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
...plans,
|
|
47
|
+
decisionsText:
|
|
48
|
+
'Решение <!-- contract-ledger-decision ' +
|
|
49
|
+
JSON.stringify({
|
|
50
|
+
id: '6.19.51:test',
|
|
51
|
+
key: section + ':field',
|
|
52
|
+
status: 'ACTIVE',
|
|
53
|
+
reason: 'Защита данных',
|
|
54
|
+
}) +
|
|
55
|
+
' -->',
|
|
56
|
+
},
|
|
57
|
+
),
|
|
58
|
+
).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('пустой и недоступный план не дают зелёный ответ', () => {
|
|
62
|
+
expect(() => readLagPlans({})).toThrow('BESALES_WORKING_PLAN');
|
|
63
|
+
expect(() => readLagPlans({ BESALES_WORKING_PLAN: '/nonexistent/br6191/plan' })).toThrow();
|
|
64
|
+
expect(() => readLagPlans({ BESALES_WORKING_PLAN: new URL(import.meta.url).pathname })).toThrow(
|
|
65
|
+
'BESALES_CLOSED_PLAN',
|
|
66
|
+
);
|
|
67
|
+
expect(() => planTaskIds('Task 6.19.51 упомянута')).toThrow('не содержит');
|
|
68
|
+
expect([...planTaskIds(plans.workingText.repeat(2))]).toEqual(['6.19.51']);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Мутант: вернуть проверку только формата TASK-N либо пропустить закрытый план.
|
|
72
|
+
it('каждая строка реального реестра принадлежит открытой задаче или DELIBERATE', () => {
|
|
73
|
+
const registry = JSON.parse(
|
|
74
|
+
readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'),
|
|
75
|
+
);
|
|
76
|
+
expect(lagOpenTaskErrors(registry, readLagPlans())).toEqual([]);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LAG_SECTIONS } from './registry-diff.mjs';
|
|
2
|
+
|
|
3
|
+
/** Missing tools and observed schema differences have their own emitted representation. */
|
|
4
|
+
export function remainingLagSections(registry) {
|
|
5
|
+
return Object.fromEntries(
|
|
6
|
+
LAG_SECTIONS.filter((section) => !['missingTools', 'contractLag'].includes(section)).map(
|
|
7
|
+
(section) => [section, registry[section] ?? {}],
|
|
8
|
+
),
|
|
9
|
+
);
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
const registry = JSON.parse(
|
|
5
|
+
readFileSync(new URL('../src/schemas/shipped-lag.json', import.meta.url), 'utf8'),
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
describe('отставание прежних конфигов действий', () => {
|
|
9
|
+
/** Мутация, которая красит: вернуть хотя бы одну строку отставания для уже поддержанного поля. */
|
|
10
|
+
it('остаётся только осознанный отказ от общей константы для пересказа', () => {
|
|
11
|
+
expect(Object.keys(registry.legacyActionLag)).toEqual([
|
|
12
|
+
'besales_trigger_upsert::actions[].summarizeConfig.targetType#PLATFORM_CONSTANT',
|
|
13
|
+
]);
|
|
14
|
+
expect(Object.values(registry.legacyActionLag)).toEqual([
|
|
15
|
+
{
|
|
16
|
+
owner: 'DELIBERATE',
|
|
17
|
+
severity: 'DELIBERATE',
|
|
18
|
+
reason: expect.stringContaining('пересказ человека'),
|
|
19
|
+
},
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { shippedRef } from './shipped-ref.mjs';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { loadShippedModule } from './shipped-definitions.mjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* ⭐ Отказ сервера v2 на прежнее имя поля — глазами УСТАНОВЛЕННОГО у клиентов моста, а не ветки.
|
|
11
|
+
*
|
|
12
|
+
* После переключения домена прежняя установка моста зовёт сервер v2 и шлёт прежние имена (`platformId`). Сервер
|
|
13
|
+
* отвечает именованным отказом `LEGACY_FIELD_NAME`. Проверяется итоговый ответ, который прежний мост отдаёт модели:
|
|
14
|
+
* исполняется КОД отгруженной линии по общей настройке ссылки, извлечённый из git тем же загрузчиком, что и отгруженные
|
|
15
|
+
* определения. Прежний мост на отказ 400 добавляет своё «исправь причину и повтори вызов» — модель могла бы убрать
|
|
16
|
+
* необязательный фильтр канала и получить успешный НЕВЕРНЫЙ ответ. С полем `remediation` в корне тела он показывает
|
|
17
|
+
* действие сервера («перезапустите приложение, без поля не отправляйте»), а своё приглашение повторить не добавляет.
|
|
18
|
+
*
|
|
19
|
+
* Форму тела закрепляет сервер (`besales-api/src/shared/pipes/http-validation.pipe.spec.ts`); здесь — что эта форма
|
|
20
|
+
* значит для установленного клиента.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const packageRoot = fileURLToPath(new URL('..', import.meta.url));
|
|
24
|
+
const shippedCommit = execFileSync('git', ['-C', packageRoot, 'rev-parse', shippedRef()], {
|
|
25
|
+
encoding: 'utf8',
|
|
26
|
+
}).trim();
|
|
27
|
+
|
|
28
|
+
const REMEDIATION =
|
|
29
|
+
'Если запрос отправил мост besales-mcp, он устарел. Попросите человека перезапустить приложение ' +
|
|
30
|
+
'(Claude Desktop, Claude Code или Codex). При запуске через npx без версии с npm 9.6.5 или новее ' +
|
|
31
|
+
'мост может обновиться до latest; старый npm, закреплённая версия, локальный пакет или кэш могут ' +
|
|
32
|
+
'помешать обновлению. Если ошибка сохранилась после перезапуска, обновите npm и настройте запуск ' +
|
|
33
|
+
'актуального @besales/mcp@latest либо обновите локальный пакет; если это не помогло, обратитесь ' +
|
|
34
|
+
'в поддержку. До обновления этот инструмент недоступен прежнему мосту. Другому клиенту нужно ' +
|
|
35
|
+
'заменить имя поля на указанное. Не отправляйте запрос без этого поля: пропал бы фильтр, ' +
|
|
36
|
+
'и ответ был бы неверным.';
|
|
37
|
+
|
|
38
|
+
/** Тело отказа в той форме, которую отдаёт сервер v2 (после общего фильтра — с correlationId). */
|
|
39
|
+
function legacyRefusal(overrides = {}) {
|
|
40
|
+
return {
|
|
41
|
+
statusCode: 400,
|
|
42
|
+
message: ['Поле platformId переименовано в channelId.'],
|
|
43
|
+
error: 'Bad Request',
|
|
44
|
+
code: 'LEGACY_FIELD_NAME',
|
|
45
|
+
field: 'platformId',
|
|
46
|
+
replacement: 'channelId',
|
|
47
|
+
remediation: REMEDIATION,
|
|
48
|
+
correlationId: 'corr-legacy-1',
|
|
49
|
+
...overrides,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Итоговый ответ отгруженного моста на отказ сервера с этим телом. */
|
|
54
|
+
async function shippedToolResult(body) {
|
|
55
|
+
const { ApiClient } = await loadShippedModule(packageRoot, shippedCommit, 'src/http/api-client.ts');
|
|
56
|
+
const { mapToolError } = await loadShippedModule(packageRoot, shippedCommit, 'src/tools/result.ts');
|
|
57
|
+
const transport = {
|
|
58
|
+
async request() {
|
|
59
|
+
// Форма отказа axios: по ней отгруженный клиент отличает ответ сервера от обрыва связи.
|
|
60
|
+
throw {
|
|
61
|
+
isAxiosError: true,
|
|
62
|
+
message: 'Request failed with status code 400',
|
|
63
|
+
response: { status: 400, data: body, headers: {} },
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
const client = new ApiClient({ transport, apiBaseUrl: 'https://core.besales.ai/api/v2' });
|
|
68
|
+
let failure;
|
|
69
|
+
try {
|
|
70
|
+
await client.request('GET', '/workspaces/ws/broadcast-analytics?platformId=channel', 'mcp_key');
|
|
71
|
+
} catch (error) {
|
|
72
|
+
failure = error;
|
|
73
|
+
}
|
|
74
|
+
return mapToolError(failure, { sideEffect: 'none' });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
describe('именованный отказ на прежнее имя поля — у установленного моста', () => {
|
|
78
|
+
it('модель видит действие сервера: перезапуск приложения и запрет повтора без поля', async () => {
|
|
79
|
+
const actual = await shippedToolResult(legacyRefusal());
|
|
80
|
+
|
|
81
|
+
expect(actual.isError).toBe(true);
|
|
82
|
+
expect(actual.structuredContent.error).toMatchObject({
|
|
83
|
+
code: 'LEGACY_FIELD_NAME',
|
|
84
|
+
status: 400,
|
|
85
|
+
continuation: REMEDIATION,
|
|
86
|
+
});
|
|
87
|
+
expect(actual.content[0].text).toContain('переименовано в channelId');
|
|
88
|
+
expect(actual.content[0].text).toContain('перезапустить приложение');
|
|
89
|
+
expect(JSON.stringify(actual)).not.toContain('повтори вызов');
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it('без действия в теле прежний мост добавляет своё «повтори вызов» — поэтому поле обязательно', async () => {
|
|
93
|
+
const { remediation: _omitted, ...inputBody } = legacyRefusal();
|
|
94
|
+
|
|
95
|
+
const actual = await shippedToolResult(inputBody);
|
|
96
|
+
|
|
97
|
+
expect(actual.structuredContent.error.continuation).toBe('Исправь причину из сообщения и повтори вызов.');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Исполняется только дочерним процессом HTTP-приёмки; не читает keychain оператора.
|
|
2
|
+
import { createTools } from '../src/tools/registry.ts';
|
|
3
|
+
import { ConnectionStore } from '../src/auth/connection-store.ts';
|
|
4
|
+
import { ApiClient } from '../src/http/api-client.ts';
|
|
5
|
+
process.on('message', async ({ id, baseUrl, workspaceId, key, name, args }) => {
|
|
6
|
+
try {
|
|
7
|
+
const values = new Map();
|
|
8
|
+
const store = new ConnectionStore({
|
|
9
|
+
async get(account) {
|
|
10
|
+
return values.get(account) ?? null;
|
|
11
|
+
},
|
|
12
|
+
async set(account, value) {
|
|
13
|
+
values.set(account, value);
|
|
14
|
+
},
|
|
15
|
+
async delete(account) {
|
|
16
|
+
values.delete(account);
|
|
17
|
+
},
|
|
18
|
+
async accounts() {
|
|
19
|
+
return [...values.keys()];
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
await store.addOrReplace(workspaceId, key);
|
|
23
|
+
const apiClient = new ApiClient({ apiBaseUrl: baseUrl, locale: 'ru' });
|
|
24
|
+
const tool = createTools({ store, apiClient, toolsets: null }).find(
|
|
25
|
+
(entry) => entry.name === name,
|
|
26
|
+
);
|
|
27
|
+
if (!tool) throw new Error(`Unknown tool: ${name}`);
|
|
28
|
+
const result = await tool.handler(args);
|
|
29
|
+
process.send?.({ id, result });
|
|
30
|
+
} catch (error) {
|
|
31
|
+
process.send?.({ id, error: String(error) });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
process.on('disconnect', () => process.exit(0));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Узкий загрузчик исходников моста для HTTP-приёмки соседнего API, без артефактов сборки.
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import ts from 'typescript';
|
|
5
|
+
const source = new URL('../src/', import.meta.url).href;
|
|
6
|
+
export function resolve(specifier, context, nextResolve) {
|
|
7
|
+
// Приёмка задаёт ConnectionStore в памяти: native keychain оператора недоступен.
|
|
8
|
+
if (specifier === 'keytar') return { url: 'mcpcompat:keychain-disabled', shortCircuit: true };
|
|
9
|
+
if (context.parentURL?.startsWith(source) && specifier.endsWith('.js')) {
|
|
10
|
+
const target = new URL(specifier.slice(0, -3) + '.ts', context.parentURL);
|
|
11
|
+
if (target.href.startsWith(source) && existsSync(target))
|
|
12
|
+
return { url: target.href, shortCircuit: true };
|
|
13
|
+
}
|
|
14
|
+
return nextResolve(specifier, context);
|
|
15
|
+
}
|
|
16
|
+
export function load(url, context, nextLoad) {
|
|
17
|
+
if (url === 'mcpcompat:keychain-disabled')
|
|
18
|
+
return {
|
|
19
|
+
format: 'module',
|
|
20
|
+
shortCircuit: true,
|
|
21
|
+
source:
|
|
22
|
+
'export default new Proxy({}, { get() { throw new Error("Keychain disabled in HTTP acceptance"); } });',
|
|
23
|
+
};
|
|
24
|
+
if (url.startsWith(source) && url.endsWith('.ts'))
|
|
25
|
+
return {
|
|
26
|
+
format: 'module',
|
|
27
|
+
shortCircuit: true,
|
|
28
|
+
source: ts.transpileModule(readFileSync(fileURLToPath(url), 'utf8'), {
|
|
29
|
+
compilerOptions: {
|
|
30
|
+
target: ts.ScriptTarget.ES2022,
|
|
31
|
+
module: ts.ModuleKind.ESNext,
|
|
32
|
+
},
|
|
33
|
+
}).outputText,
|
|
34
|
+
};
|
|
35
|
+
return nextLoad(url, context);
|
|
36
|
+
}
|