@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failed-verifications.js","sourceRoot":"","sources":["../../src/network/failed-verifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE/G,kFAAkF;AAClF,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,UAAU,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC9C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC;IAChE,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,wBAAwB,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,0BAA0B,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,WAAmB,IAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { IncomingMessage } from 'node:http';
|
|
2
|
+
import { Socket } from 'node:net';
|
|
3
|
+
import { Writable } from 'node:stream';
|
|
4
|
+
/** Дополнительный тестовый адаптер: настоящие SDK и HTTP-обработчик без listen в песочнице. */
|
|
5
|
+
export function inProcessFetch(server) {
|
|
6
|
+
return async (input, init) => {
|
|
7
|
+
const target = new Request(input, init);
|
|
8
|
+
const body = target.body ? Buffer.from(await target.arrayBuffer()) : undefined;
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const incoming = new IncomingMessage(new Socket());
|
|
11
|
+
incoming.method = target.method;
|
|
12
|
+
incoming.url = new URL(target.url).pathname;
|
|
13
|
+
incoming.headers = Object.fromEntries(target.headers);
|
|
14
|
+
incoming.headers.host = new URL(target.url).host;
|
|
15
|
+
incoming.rawHeaders = Object.entries(incoming.headers).flatMap(([key, value]) => [key, String(value)]);
|
|
16
|
+
incoming.httpVersion = '1.1';
|
|
17
|
+
let controller;
|
|
18
|
+
let ended = false;
|
|
19
|
+
let published = false;
|
|
20
|
+
const stream = new ReadableStream({
|
|
21
|
+
start(value) { controller = value; },
|
|
22
|
+
cancel() { outgoing.destroy(); },
|
|
23
|
+
});
|
|
24
|
+
const headers = new Headers();
|
|
25
|
+
const publish = () => {
|
|
26
|
+
if (published)
|
|
27
|
+
return;
|
|
28
|
+
published = true;
|
|
29
|
+
resolve(new Response(outgoing.statusCode === 204 ? null : stream, {
|
|
30
|
+
status: outgoing.statusCode, headers,
|
|
31
|
+
}));
|
|
32
|
+
};
|
|
33
|
+
const outgoing = Object.assign(new Writable({
|
|
34
|
+
write(chunk, _encoding, callback) {
|
|
35
|
+
publish();
|
|
36
|
+
if (!ended)
|
|
37
|
+
controller.enqueue(new Uint8Array(chunk));
|
|
38
|
+
callback();
|
|
39
|
+
},
|
|
40
|
+
final(callback) {
|
|
41
|
+
publish();
|
|
42
|
+
if (!ended)
|
|
43
|
+
controller.close();
|
|
44
|
+
ended = true;
|
|
45
|
+
callback();
|
|
46
|
+
},
|
|
47
|
+
}), {
|
|
48
|
+
statusCode: 200,
|
|
49
|
+
headersSent: false,
|
|
50
|
+
setHeader(name, value) { headers.set(name, String(value)); },
|
|
51
|
+
getHeader(name) { return headers.get(name); },
|
|
52
|
+
writeHead(status, values) {
|
|
53
|
+
outgoing.statusCode = status;
|
|
54
|
+
for (const [name, value] of Object.entries(values ?? {}))
|
|
55
|
+
headers.set(name, String(value));
|
|
56
|
+
outgoing.headersSent = true;
|
|
57
|
+
publish();
|
|
58
|
+
return outgoing;
|
|
59
|
+
},
|
|
60
|
+
flushHeaders: publish,
|
|
61
|
+
});
|
|
62
|
+
const abort = () => {
|
|
63
|
+
outgoing.destroy();
|
|
64
|
+
if (!ended)
|
|
65
|
+
controller.error(new Error('HTTP test connection closed'));
|
|
66
|
+
ended = true;
|
|
67
|
+
if (!published)
|
|
68
|
+
reject(new Error('HTTP test connection closed'));
|
|
69
|
+
};
|
|
70
|
+
outgoing.on('error', reject);
|
|
71
|
+
outgoing.on('close', () => target.signal.removeEventListener('abort', abort));
|
|
72
|
+
target.signal.addEventListener('abort', abort, { once: true });
|
|
73
|
+
if (target.signal.aborted) {
|
|
74
|
+
abort();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
server.emit('request', incoming, outgoing);
|
|
78
|
+
if (body)
|
|
79
|
+
incoming.push(body);
|
|
80
|
+
// Настоящий HTTP-парсер отмечает полное тело до end; иначе destroy имитирует обрыв.
|
|
81
|
+
incoming.complete = true;
|
|
82
|
+
incoming.push(null);
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=http-test-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-test-fixture.js","sourceRoot":"","sources":["../../src/network/http-test-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoC,MAAM,WAAW,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;YACnD,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,QAAQ,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAC5C,QAAQ,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtD,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjD,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvG,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC;YAC7B,IAAI,UAAuD,CAAC;YAC5D,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAa;gBAC5C,KAAK,CAAC,KAAK,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;gBACpC,MAAM,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;aACjC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,IAAI,SAAS;oBAAE,OAAO;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;oBAChE,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO;iBACrC,CAAC,CAAC,CAAC;YACN,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;gBAC1C,KAAK,CAAC,KAAa,EAAE,SAAS,EAAE,QAAQ;oBACtC,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC,KAAK;wBAAE,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtD,QAAQ,EAAE,CAAC;gBACb,CAAC;gBACD,KAAK,CAAC,QAAQ;oBACZ,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC,KAAK;wBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;oBAC/B,KAAK,GAAG,IAAI,CAAC;oBACb,QAAQ,EAAE,CAAC;gBACb,CAAC;aACF,CAAC,EAAE;gBACF,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,KAAK;gBAClB,SAAS,CAAC,IAAY,EAAE,KAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,SAAS,CAAC,IAAY,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrD,SAAS,CAAC,MAAc,EAAE,MAA+B;oBACvD,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC;oBAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3F,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;oBAC5B,OAAO,EAAE,CAAC;oBACV,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,YAAY,EAAE,OAAO;aACtB,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,EAAE;gBACjB,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK;oBAAE,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBACvE,KAAK,GAAG,IAAI,CAAC;gBACb,IAAI,CAAC,SAAS;oBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC;YACF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAqC,CAAC,CAAC;YACxE,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,oFAAoF;YACpF,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Долгая память подтверждённых ключей: только SHA-256, без секрета и полномочий. */
|
|
2
|
+
export declare class KnownKeys {
|
|
3
|
+
private readonly entries;
|
|
4
|
+
get size(): number;
|
|
5
|
+
has(fingerprint: Buffer, now?: number): boolean;
|
|
6
|
+
remember(fingerprint: Buffer, now?: number): void;
|
|
7
|
+
forget(fingerprint: Buffer): void;
|
|
8
|
+
sweep(now?: number): void;
|
|
9
|
+
clear(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { KNOWN_KEY_TTL_MS, MAX_KNOWN_KEYS } from './constants.js';
|
|
2
|
+
/** Долгая память подтверждённых ключей: только SHA-256, без секрета и полномочий. */
|
|
3
|
+
export class KnownKeys {
|
|
4
|
+
entries = new Map();
|
|
5
|
+
get size() { return this.entries.size; }
|
|
6
|
+
has(fingerprint, now = Date.now()) {
|
|
7
|
+
const id = fingerprint.toString('hex');
|
|
8
|
+
const expiresAt = this.entries.get(id);
|
|
9
|
+
if (expiresAt === undefined)
|
|
10
|
+
return false;
|
|
11
|
+
if (now >= expiresAt) {
|
|
12
|
+
this.entries.delete(id);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
remember(fingerprint, now = Date.now()) {
|
|
18
|
+
this.sweep(now);
|
|
19
|
+
const id = fingerprint.toString('hex');
|
|
20
|
+
// Только новая успешная проверка ядром продлевает срок и меняет порядок вытеснения.
|
|
21
|
+
this.entries.delete(id);
|
|
22
|
+
if (this.entries.size >= MAX_KNOWN_KEYS) {
|
|
23
|
+
const oldest = this.entries.keys().next().value;
|
|
24
|
+
if (oldest !== undefined)
|
|
25
|
+
this.entries.delete(oldest);
|
|
26
|
+
}
|
|
27
|
+
this.entries.set(id, now + KNOWN_KEY_TTL_MS);
|
|
28
|
+
}
|
|
29
|
+
forget(fingerprint) { this.entries.delete(fingerprint.toString('hex')); }
|
|
30
|
+
sweep(now = Date.now()) {
|
|
31
|
+
for (const [id, expiresAt] of this.entries) {
|
|
32
|
+
if (now >= expiresAt)
|
|
33
|
+
this.entries.delete(id);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
clear() { this.entries.clear(); }
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=known-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-keys.js","sourceRoot":"","sources":["../../src/network/known-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAElE,qFAAqF;AACrF,MAAM,OAAO,SAAS;IACH,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,oFAAoF;QACpF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,WAAmB,IAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvF,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CredentialStore } from '../auth/token-storage.js';
|
|
2
|
+
/** Секреты существуют только до закрытия одного HTTP-запроса. */
|
|
3
|
+
export declare class MemoryCredentials implements CredentialStore {
|
|
4
|
+
private readonly values;
|
|
5
|
+
private closed;
|
|
6
|
+
set(account: string, value: string): Promise<void>;
|
|
7
|
+
get(account: string): Promise<string | null>;
|
|
8
|
+
delete(account: string): Promise<void>;
|
|
9
|
+
accounts(): Promise<string[]>;
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Секреты существуют только до закрытия одного HTTP-запроса. */
|
|
2
|
+
export class MemoryCredentials {
|
|
3
|
+
values = new Map();
|
|
4
|
+
closed = false;
|
|
5
|
+
async set(account, value) {
|
|
6
|
+
if (this.closed)
|
|
7
|
+
throw new Error('HTTP request is closed');
|
|
8
|
+
this.values.set(account, value);
|
|
9
|
+
}
|
|
10
|
+
async get(account) {
|
|
11
|
+
return this.values.get(account) ?? null;
|
|
12
|
+
}
|
|
13
|
+
async delete(account) {
|
|
14
|
+
this.values.delete(account);
|
|
15
|
+
}
|
|
16
|
+
async accounts() {
|
|
17
|
+
return [...this.values.keys()];
|
|
18
|
+
}
|
|
19
|
+
clear() {
|
|
20
|
+
this.closed = true;
|
|
21
|
+
this.values.clear();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=memory-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-credentials.js","sourceRoot":"","sources":["../../src/network/memory-credentials.ts"],"names":[],"mappings":"AAEA,iEAAiE;AACjE,MAAM,OAAO,iBAAiB;IACX,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,GAAG,KAAK,CAAC;IAEvB,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,KAAa;QACtC,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Общая арифметика ограниченных вёдер; параметры задаются только константами ниже. */
|
|
2
|
+
declare class TokenBuckets {
|
|
3
|
+
private readonly capacity;
|
|
4
|
+
private readonly refillMs;
|
|
5
|
+
private readonly maxBuckets;
|
|
6
|
+
private readonly buckets;
|
|
7
|
+
constructor(capacity: number, refillMs: number, maxBuckets: number);
|
|
8
|
+
get size(): number;
|
|
9
|
+
protected consumeId(id: string, now: number): number;
|
|
10
|
+
sweep(now?: number): void;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
13
|
+
/** Ведро хранит только SHA-256, никогда исходный ключ. */
|
|
14
|
+
export declare class KeyRateLimit extends TokenBuckets {
|
|
15
|
+
constructor();
|
|
16
|
+
consume(fingerprint: Buffer, now?: number): number;
|
|
17
|
+
}
|
|
18
|
+
/** Адрес живёт только в этой таблице; отсутствие заголовка объединяет клиентов в одно ведро. */
|
|
19
|
+
export declare class VerificationRateLimit extends TokenBuckets {
|
|
20
|
+
constructor();
|
|
21
|
+
consume(address: string | undefined, now?: number): number;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { MAX_RATE_LIMIT_BUCKETS, MAX_CLIENT_ADDRESS_BUCKETS, MILLISECONDS_PER_SECOND, RATE_LIMIT_CAPACITY, RATE_LIMIT_REFILL_MS, VERIFICATION_ATTEMPT_CAPACITY, VERIFICATION_ATTEMPT_REFILL_MS, } from './constants.js';
|
|
2
|
+
/** Общая арифметика ограниченных вёдер; параметры задаются только константами ниже. */
|
|
3
|
+
class TokenBuckets {
|
|
4
|
+
capacity;
|
|
5
|
+
refillMs;
|
|
6
|
+
maxBuckets;
|
|
7
|
+
buckets = new Map();
|
|
8
|
+
constructor(capacity, refillMs, maxBuckets) {
|
|
9
|
+
this.capacity = capacity;
|
|
10
|
+
this.refillMs = refillMs;
|
|
11
|
+
this.maxBuckets = maxBuckets;
|
|
12
|
+
}
|
|
13
|
+
get size() { return this.buckets.size; }
|
|
14
|
+
consumeId(id, now) {
|
|
15
|
+
let bucket = this.buckets.get(id);
|
|
16
|
+
if (!bucket) {
|
|
17
|
+
if (this.buckets.size >= this.maxBuckets)
|
|
18
|
+
this.sweep(now);
|
|
19
|
+
if (this.buckets.size >= this.maxBuckets) {
|
|
20
|
+
return Math.ceil(this.refillMs / MILLISECONDS_PER_SECOND);
|
|
21
|
+
}
|
|
22
|
+
bucket = { tokens: this.capacity, updatedAt: now };
|
|
23
|
+
this.buckets.set(id, bucket);
|
|
24
|
+
}
|
|
25
|
+
bucket.tokens = Math.min(this.capacity, bucket.tokens + Math.max(0, now - bucket.updatedAt) / this.refillMs);
|
|
26
|
+
bucket.updatedAt = now;
|
|
27
|
+
if (bucket.tokens < 1) {
|
|
28
|
+
return Math.ceil((1 - bucket.tokens) * this.refillMs / MILLISECONDS_PER_SECOND);
|
|
29
|
+
}
|
|
30
|
+
bucket.tokens -= 1;
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
sweep(now = Date.now()) {
|
|
34
|
+
for (const [id, bucket] of this.buckets) {
|
|
35
|
+
if (now - bucket.updatedAt >= this.capacity * this.refillMs) {
|
|
36
|
+
this.buckets.delete(id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
clear() {
|
|
41
|
+
this.buckets.clear();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Ведро хранит только SHA-256, никогда исходный ключ. */
|
|
45
|
+
export class KeyRateLimit extends TokenBuckets {
|
|
46
|
+
constructor() {
|
|
47
|
+
super(RATE_LIMIT_CAPACITY, RATE_LIMIT_REFILL_MS, MAX_RATE_LIMIT_BUCKETS);
|
|
48
|
+
}
|
|
49
|
+
consume(fingerprint, now = Date.now()) {
|
|
50
|
+
return super.consumeId(fingerprint.toString('hex'), now);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Адрес живёт только в этой таблице; отсутствие заголовка объединяет клиентов в одно ведро. */
|
|
54
|
+
export class VerificationRateLimit extends TokenBuckets {
|
|
55
|
+
constructor() {
|
|
56
|
+
super(VERIFICATION_ATTEMPT_CAPACITY, VERIFICATION_ATTEMPT_REFILL_MS, MAX_CLIENT_ADDRESS_BUCKETS);
|
|
57
|
+
}
|
|
58
|
+
consume(address, now = Date.now()) {
|
|
59
|
+
return super.consumeId(address || '', now);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/network/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Короткая память только подтверждённых API отказов 401/403; исходных ключей здесь нет. */
|
|
2
|
+
export declare class RejectedKeys {
|
|
3
|
+
private readonly entries;
|
|
4
|
+
get size(): number;
|
|
5
|
+
has(fingerprint: Buffer, now?: number): boolean;
|
|
6
|
+
remember(fingerprint: Buffer, now?: number): void;
|
|
7
|
+
sweep(now?: number): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { MAX_REJECTED_KEYS, REJECTED_KEY_TTL_MS } from './constants.js';
|
|
2
|
+
/** Короткая память только подтверждённых API отказов 401/403; исходных ключей здесь нет. */
|
|
3
|
+
export class RejectedKeys {
|
|
4
|
+
entries = new Map();
|
|
5
|
+
get size() { return this.entries.size; }
|
|
6
|
+
has(fingerprint, now = Date.now()) {
|
|
7
|
+
const id = fingerprint.toString('hex');
|
|
8
|
+
const expiresAt = this.entries.get(id);
|
|
9
|
+
if (expiresAt === undefined)
|
|
10
|
+
return false;
|
|
11
|
+
if (now >= expiresAt) {
|
|
12
|
+
this.entries.delete(id);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
remember(fingerprint, now = Date.now()) {
|
|
18
|
+
const id = fingerprint.toString('hex');
|
|
19
|
+
this.sweep(now);
|
|
20
|
+
// Порядок Map соответствует времени последнего подтверждённого отказа.
|
|
21
|
+
this.entries.delete(id);
|
|
22
|
+
if (this.entries.size >= MAX_REJECTED_KEYS) {
|
|
23
|
+
const oldest = this.entries.keys().next().value;
|
|
24
|
+
if (oldest !== undefined)
|
|
25
|
+
this.entries.delete(oldest);
|
|
26
|
+
}
|
|
27
|
+
this.entries.set(id, now + REJECTED_KEY_TTL_MS);
|
|
28
|
+
}
|
|
29
|
+
sweep(now = Date.now()) {
|
|
30
|
+
for (const [id, expiresAt] of this.entries) {
|
|
31
|
+
if (now >= expiresAt)
|
|
32
|
+
this.entries.delete(id);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this.entries.clear();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=rejected-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejected-keys.js","sourceRoot":"","sources":["../../src/network/rejected-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAExE,4FAA4F;AAC5F,MAAM,OAAO,YAAY;IACN,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,uEAAuE;QACvE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,mBAAmB,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,IAAI,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolApiClient } from '../http/api-client.js';
|
|
2
|
+
/** Работа запроса переживает закрытие транспорта, включая последовательные обращения инструмента. */
|
|
3
|
+
export declare class RequestWork {
|
|
4
|
+
private readonly pending;
|
|
5
|
+
track<T>(promise: Promise<T>): Promise<T>;
|
|
6
|
+
client(apiClient: ToolApiClient): ToolApiClient;
|
|
7
|
+
drain(): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Работа запроса переживает закрытие транспорта, включая последовательные обращения инструмента. */
|
|
2
|
+
export class RequestWork {
|
|
3
|
+
pending = new Set();
|
|
4
|
+
track(promise) {
|
|
5
|
+
this.pending.add(promise);
|
|
6
|
+
void promise.finally(() => { this.pending.delete(promise); }).catch(() => { });
|
|
7
|
+
return promise;
|
|
8
|
+
}
|
|
9
|
+
client(apiClient) {
|
|
10
|
+
return {
|
|
11
|
+
request: (...args) => this.track(apiClient.request(...args)),
|
|
12
|
+
post: (...args) => this.track(apiClient.post(...args)),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async drain() {
|
|
16
|
+
while (this.pending.size > 0)
|
|
17
|
+
await Promise.allSettled([...this.pending]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=request-work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-work.js","sourceRoot":"","sources":["../../src/network/request-work.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,MAAM,OAAO,WAAW;IACL,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEvD,KAAK,CAAI,OAAmB;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1B,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9E,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,SAAwB;QAC7B,OAAO;YACL,OAAO,EAAE,CAAI,GAAG,IAA0C,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAI,GAAG,IAAI,CAAC,CAAC;YACxG,IAAI,EAAE,CAAI,GAAG,IAAuC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAI,GAAG,IAAI,CAAC,CAAC;SAChG,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface WorkspaceContext {
|
|
2
|
+
readonly workspace_id: string;
|
|
3
|
+
readonly workspace_name: string;
|
|
4
|
+
readonly account_label: string | null;
|
|
5
|
+
readonly scopes: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
/** Кэш только успешных вердиктов: SHA-256 и контекст области, без исходного ключа. */
|
|
8
|
+
export declare class SuccessfulKeys {
|
|
9
|
+
private readonly ttlMs;
|
|
10
|
+
private readonly entries;
|
|
11
|
+
constructor(ttlMs?: number);
|
|
12
|
+
get size(): number;
|
|
13
|
+
get(fingerprint: Buffer, now?: number): WorkspaceContext | undefined;
|
|
14
|
+
remember(fingerprint: Buffer, context: WorkspaceContext, now?: number): void;
|
|
15
|
+
sweep(now?: number): void;
|
|
16
|
+
clear(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { MAX_SUCCESSFUL_KEYS, SUCCESSFUL_KEY_TTL_MS } from './constants.js';
|
|
2
|
+
/** Кэш только успешных вердиктов: SHA-256 и контекст области, без исходного ключа. */
|
|
3
|
+
export class SuccessfulKeys {
|
|
4
|
+
ttlMs;
|
|
5
|
+
entries = new Map();
|
|
6
|
+
constructor(ttlMs = SUCCESSFUL_KEY_TTL_MS) {
|
|
7
|
+
this.ttlMs = ttlMs;
|
|
8
|
+
}
|
|
9
|
+
get size() { return this.entries.size; }
|
|
10
|
+
get(fingerprint, now = Date.now()) {
|
|
11
|
+
const id = fingerprint.toString('hex');
|
|
12
|
+
const entry = this.entries.get(id);
|
|
13
|
+
if (!entry)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (now >= entry.expiresAt) {
|
|
16
|
+
this.entries.delete(id);
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return entry.context;
|
|
20
|
+
}
|
|
21
|
+
remember(fingerprint, context, now = Date.now()) {
|
|
22
|
+
// Несколько ожидавших один вердикт не продлевают его TTL.
|
|
23
|
+
if (this.get(fingerprint, now))
|
|
24
|
+
return;
|
|
25
|
+
this.sweep(now);
|
|
26
|
+
if (this.entries.size >= MAX_SUCCESSFUL_KEYS) {
|
|
27
|
+
const oldest = this.entries.keys().next().value;
|
|
28
|
+
if (oldest !== undefined)
|
|
29
|
+
this.entries.delete(oldest);
|
|
30
|
+
}
|
|
31
|
+
this.entries.set(fingerprint.toString('hex'), {
|
|
32
|
+
context: {
|
|
33
|
+
workspace_id: context.workspace_id, workspace_name: context.workspace_name,
|
|
34
|
+
account_label: context.account_label, scopes: [...context.scopes],
|
|
35
|
+
},
|
|
36
|
+
expiresAt: now + this.ttlMs,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
sweep(now = Date.now()) {
|
|
40
|
+
for (const [id, entry] of this.entries) {
|
|
41
|
+
if (now >= entry.expiresAt)
|
|
42
|
+
this.entries.delete(id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
clear() { this.entries.clear(); }
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=successful-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"successful-keys.js","sourceRoot":"","sources":["../../src/network/successful-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAS5E,sFAAsF;AACtF,MAAM,OAAO,cAAc;IAGI;IAFZ,OAAO,GAAG,IAAI,GAAG,EAA4D,CAAC;IAE/F,YAA6B,QAAQ,qBAAqB;QAA7B,UAAK,GAAL,KAAK,CAAwB;IAAG,CAAC;IAE9D,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,GAAG,CAAC,WAAmB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,QAAQ,CAAC,WAAmB,EAAE,OAAyB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACvE,0DAA0D;QAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;YAAE,OAAO;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC5C,OAAO,EAAE;gBACP,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc;gBAC1E,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;aAClE;YACD,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACxC"}
|
|
@@ -14,7 +14,9 @@ Claude должен соблюдать invariants:
|
|
|
14
14
|
- Не менять `operationId` между get и submit.
|
|
15
15
|
- Выполнять все stages в заданном порядке.
|
|
16
16
|
- Возвращать JSON в форме, которую запросил backend.
|
|
17
|
-
- При
|
|
17
|
+
- При отказе приёма сначала проверить известную промптовую операцию. Завершённая операция с тем же телом возвращает сохранённый успех; новый платный запуск не нужен.
|
|
18
|
+
- При неизвестном исходе прежняя работа могла быть оплачена без сохранённого результата. Мост проверяет известную промптовую операцию сам. Сообщи человеку об отдельной оплате нового запуска и получи его решение перед запуском.
|
|
19
|
+
- Предупреждение об оплате в 410 относится к платным операциям и их submit-инструментам. Истёкшая ссылка, настроечный токен или предварительный просмотр получают нейтральную подсказку получить новое значение через соответствующий инструмент.
|
|
18
20
|
- Не отправлять raw secrets, API keys или Authorization headers в submit body.
|
|
19
21
|
|
|
20
22
|
Связанные external pairs включают prompt generation, prompt iterate, prompt analyze, ICP analysis, sandbox findings, simulation findings и Q&A generation.
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
## Инструменты
|
|
8
8
|
|
|
9
|
+
- `besales_feedback_document_access_get` — email до привязки, режим всего документа, все связи и свежая оценка прав Google.
|
|
10
|
+
- `besales_feedback_document_access_update` — подтверждённая смена общего режима существующего документа.
|
|
9
11
|
- `besales_feedback_sheet_link` — привязать таблицу к промпту агента по ссылке.
|
|
10
12
|
- `besales_feedback_sheet_list` — список таблиц, привязанных к агенту.
|
|
11
13
|
- `besales_feedback_sheet_read` — прочитать строки замечаний.
|
|
@@ -19,12 +21,18 @@
|
|
|
19
21
|
с `agent_id` нужного агента и `source_url`. Один файл можно привязать к нескольким промптам:
|
|
20
22
|
повторный вызов с другим `agent_id` создаёт ещё одну привязку, дубликата файла не возникает.
|
|
21
23
|
|
|
22
|
-
В ответе придёт `serviceAccountEmail` —
|
|
24
|
+
Email также приходит в list/read и безопасных отказах read. До привязки вызовите document-access-get. В ответе придёт `serviceAccountEmail` — попросите пользователя расшарить таблицу на этот email
|
|
23
25
|
(Viewer достаточно для чтения). Без расшаривания чтение вернёт ошибку доступа.
|
|
24
26
|
|
|
25
27
|
Поддерживаются только нативные Google Sheets. Ссылка на `.xlsx`/`.csv` в Google Drive вернёт
|
|
26
28
|
ошибку — попроси пользователя открыть файл как Google Sheet.
|
|
27
29
|
|
|
30
|
+
## Общий режим и подтверждение
|
|
31
|
+
|
|
32
|
+
Режим действует на весь документ, включая другие вкладки и агентов этой рабочей области. Без access_mode новая связь наследует текущий режим, первый документ начинает с READ_ONLY.
|
|
33
|
+
Перед изменением вызовите besales_feedback_document_access_get и покажите весь affectedLinks с affectedLinksCount: агент, вкладка, закреплённая версия. Только после явного согласия человека передайте confirm_document_access_change=true и expected_document_snapshot из этого ответа. Не подставляйте согласие автоматически. При 409 с устаревшим снимком перечитайте полный список и снова получите согласие. Google ACL инструмент не меняет.
|
|
34
|
+
Повтор link существующей пары даёт 409 с currentLink. Сохраните эту связь и версию; не делайте unlink/link автоматически. Для режима существующего документа используйте отдельный document-access-update.
|
|
35
|
+
|
|
28
36
|
## Когда читать
|
|
29
37
|
|
|
30
38
|
Перед тем как улучшать промпт по замечаниям тестировщиков, вызови
|
|
@@ -35,21 +43,22 @@
|
|
|
35
43
|
|
|
36
44
|
## Режимы — различай по `accessMode`
|
|
37
45
|
|
|
38
|
-
**`READ_ONLY`** —
|
|
46
|
+
**`READ_ONLY`** — приложение запрещает запись независимо от роли Google. Воркфлоу:
|
|
39
47
|
1. `besales_feedback_sheet_read` → проанализируй замечания, сгруппируй по смыслу.
|
|
40
|
-
2.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
5.
|
|
46
|
-
|
|
48
|
+
2. `besales_prompt_patch_start` → `besales_prompt_patch_get`: открой черновик и прочитай его
|
|
49
|
+
целиком, чтобы менять существующие правила по месту, без дублирующих секций.
|
|
50
|
+
3. Сформулируй конкретные операции и примени их через `besales_prompt_patch_apply`.
|
|
51
|
+
Проверь `appliedCount`, `skippedCount` и diff; пропущенные операции не считай выполненными.
|
|
52
|
+
4. Покажи пользователю итоговый черновик и **дождись явного подтверждения**.
|
|
53
|
+
5. После подтверждения вызови `besales_prompt_patch_commit`; он запускает полный PromptLint и
|
|
54
|
+
либо публикует новую версию, либо возвращает ошибки без частичного коммита.
|
|
55
|
+
Если пользователь не согласовал публикацию, черновик можно удалить через
|
|
47
56
|
`besales_prompt_patch_discard`.
|
|
48
57
|
|
|
49
58
|
Никогда не финализируй промпт без явного согласия пользователя. В файл при `READ_ONLY`
|
|
50
|
-
ничего не пиши —
|
|
59
|
+
ничего не пиши — локальный режим запрещает запись.
|
|
51
60
|
|
|
52
|
-
**`EDITABLE`** —
|
|
61
|
+
**`EDITABLE`** — приложение допускает запись, если её разрешает Google. Свежий отказ Sheets остаётся отказом, даже при providerAccess.canEdit=true (например, защищённый диапазон). Patch flow тот же, плюс
|
|
53
62
|
после обработки замечаний отметь их статус прямо в таблице через
|
|
54
63
|
`besales_feedback_sheet_row_update`:
|
|
55
64
|
|
|
@@ -72,7 +81,7 @@ read-only режиме: читай замечания и предлагай пр
|
|
|
72
81
|
- Не меняй ячейки с исходными замечаниями тестировщиков — пиши только в служебные колонки
|
|
73
82
|
статуса/комментария.
|
|
74
83
|
- Если `besales_feedback_sheet_read` вернул ошибку доступа — таблица не расшарена на service
|
|
75
|
-
account.
|
|
84
|
+
account. Сообщите пользователю serviceAccountEmail из ответа чтения и попросите выдать доступ.
|
|
76
85
|
|
|
77
86
|
## Отвязка
|
|
78
87
|
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
ICP (Ideal Customer Profile) в Besales описывает не абстрактную аудиторию для рассылок, а рабочую модель покупателя, по которой строятся промпты, сценарии проверки и sandbox-симуляции. ICP объединяет сегменты, personas, реальные или импортированные dialogue samples и test scenarios. Он помогает агенту отвечать не "для всех", а под конкретные боли, критерии выбора, возражения и стиль коммуникации целевого клиента.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
ICP хранится в `icp_profiles`, `icp_segments`, `icp_dialogue_samples`, `personas` и
|
|
6
|
+
`test_scenarios`, а с агентами связывается через `agent_icp_links`. MCP работает только с этой
|
|
7
|
+
канонической моделью и не обращается к старым сущностям напрямую.
|
|
6
8
|
|
|
7
9
|
Когда Claude создаёт ICP через MCP, он должен сначала определить workspace context и выбрать источник: ручное описание, CRM dialogues или AI-generated draft. Для CRM-источника используется импорт samples с анонимизацией и подтверждением GDPR. После накопления samples Claude может запросить analysis instructions, локально выполнить stage-пайплайн сегментации/persona generation и отправить результат через submit tool.
|
|
8
10
|
|
|
@@ -10,7 +12,12 @@ ICP (Ideal Customer Profile) в Besales описывает не абстракт
|
|
|
10
12
|
|
|
11
13
|
- `besales_icp_create` — создать ICP-профиль.
|
|
12
14
|
- `besales_icp_import_dialogues` — импортировать и анонимизировать CRM-диалоги.
|
|
15
|
+
- `besales_icp_import_status` и `besales_icp_import_history` — прочитать статус и историю импорта, включая `continuationState` и `remainderExpiredAt`, если сервер их прислал.
|
|
13
16
|
- `besales_icp_analysis_get_instructions` — получить stages для анализа ICP.
|
|
14
17
|
- `besales_icp_analysis_submit` — сохранить сегменты, personas и сценарии после external execution.
|
|
15
18
|
|
|
16
19
|
Практическое правило: если пользователь просит "создай ICP для SaaS B2B", Claude должен создать профиль, затем уточнить или импортировать samples, после чего выполнить analysis pair. ICP не заменяет prompt generation, а даёт ей качественный контекст.
|
|
20
|
+
|
|
21
|
+
Продолжение импорта: `AVAILABLE` — сохранённый остаток доступен; `FORWARDED` — уже создан следующий прогон; `EXPIRED` — остаток устарел; `NONE` — продолжения нет. `remainderExpiredAt` — момент удаления старого остатка уборкой; `null` означает, что уборка ещё не удаляла строки, и само по себе не доказывает доступность продолжения. Старые ответы без этих полей остаются допустимыми.
|
|
22
|
+
|
|
23
|
+
Отказ `409 ICP_INGEST_CONTINUATION_EXPIRED` означает: остаток выборки устарел — начните новый импорт. Продолжение автоматически не повторять. Новый импорт запускается по решению человека с новым `request_key` и явным `gdpr_confirmed=true`.
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Sandbox в Besales — это контролируемый прогон агента по ICP personas и test scenarios до выката изменений в production. Цель sandbox не в том, чтобы отправить реальные сообщения клиентам, а в том, чтобы проверить промпт, routing, ответы на возражения, handoff-поведение и качество реакции на разные сегменты.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Sandbox хранит прогоны в `sandbox_runs` и обратную связь в `sandbox_run_feedbacks`. Запуск создаёт
|
|
6
|
+
run для агента и набора сценариев, а дальнейший анализ findings может выполняться через external
|
|
7
|
+
execution pair. Источник production-инструкции — опубликованная запись `agent_versions`; sandbox
|
|
8
|
+
позволяет безопасно оценить черновик или новую версию до публикации.
|
|
6
9
|
|
|
7
10
|
Для Claude важна последовательность:
|
|
8
11
|
|
|
@@ -27,13 +30,19 @@ Sandbox в Besales — это контролируемый прогон аген
|
|
|
27
30
|
|
|
28
31
|
Один прогон = один режим. «Прогнать оба режима» = два вызова `besales_sandbox_run_start`.
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
Без вопроса запускай обычный прогон: `mode=single_agent` и `client_mode=scripted` (умолчания
|
|
34
|
+
схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до
|
|
35
|
+
публикации (`candidate_prompt`). Перед запуском спроси пользователя одним коротким вопросом
|
|
36
|
+
с ценой в одну фразу только если нужен:
|
|
37
|
+
|
|
38
|
+
- `client_mode=simulated` (LLM играет клиента — дороже и каждый раз по-разному);
|
|
39
|
+
- оба режима клиента (= два прогона);
|
|
40
|
+
- `mode=workflow` (все агенты канала через роутер — шире и дороже).
|
|
34
41
|
|
|
35
42
|
В findings: если симулированный клиент ушёл с `outcome: refused` или `endReason: gave_up` — это не автоматически провал агента; оценивай по тексту диалога.
|
|
36
43
|
|
|
37
|
-
Sandbox
|
|
44
|
+
Sandbox проходит те же runtime-швы и ActionGovernor, что production, но после governor действует
|
|
45
|
+
белый список допустимых шагов и подавление внешней доставки. Проверка CRM или отправки не должна
|
|
46
|
+
создавать реальных внешних side effects.
|
|
38
47
|
|
|
39
48
|
Практическое правило: sandbox — это безопасная проверка качества агента. Claude должен использовать его перед финализацией рискованных prompt changes, особенно если ICP содержит несколько сегментов или есть новые handoff/routing правила.
|