blockmine 1.24.0 → 1.25.0
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/CHANGELOG.md +32 -0
- package/README.en.md +427 -0
- package/README.md +40 -0
- package/backend/cli.js +1 -1
- package/backend/src/ai/plugin-assistant-system-prompt.md +664 -5
- package/backend/src/api/routes/bots.js +13 -0
- package/backend/src/api/routes/servers.js +14 -2
- package/backend/src/core/BotProcess.js +98 -2
- package/backend/src/core/PluginLoader.js +83 -3
- package/backend/src/core/PluginManager.js +75 -5
- package/backend/src/core/services/BotLifecycleService.js +186 -2
- package/backend/src/server.js +11 -1
- package/frontend/dist/assets/browser-ponyfill-DN7pwmHT.js +2 -0
- package/frontend/dist/assets/index-LSy71uwm.js +11261 -0
- package/frontend/dist/assets/index-SfhKxI4-.css +32 -0
- package/frontend/dist/flags/en.svg +32 -0
- package/frontend/dist/flags/ru.svg +5 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/dist/locales/en/admin.json +100 -0
- package/frontend/dist/locales/en/api-keys.json +58 -0
- package/frontend/dist/locales/en/bots.json +110 -0
- package/frontend/dist/locales/en/common.json +47 -0
- package/frontend/dist/locales/en/configuration.json +22 -0
- package/frontend/dist/locales/en/console.json +10 -0
- package/frontend/dist/locales/en/dashboard.json +85 -0
- package/frontend/dist/locales/en/dialogs.json +70 -0
- package/frontend/dist/locales/en/event-graphs.json +50 -0
- package/frontend/dist/locales/en/graph-store.json +70 -0
- package/frontend/dist/locales/en/login.json +34 -0
- package/frontend/dist/locales/en/management.json +114 -0
- package/frontend/dist/locales/en/minecraft-viewer.json +27 -0
- package/frontend/dist/locales/en/nodes.json +1077 -0
- package/frontend/dist/locales/en/permissions.json +50 -0
- package/frontend/dist/locales/en/plugin-detail.json +49 -0
- package/frontend/dist/locales/en/plugins.json +110 -0
- package/frontend/dist/locales/en/proxies.json +81 -0
- package/frontend/dist/locales/en/servers.json +39 -0
- package/frontend/dist/locales/en/setup.json +17 -0
- package/frontend/dist/locales/en/sidebar.json +27 -0
- package/frontend/dist/locales/en/tasks.json +62 -0
- package/frontend/dist/locales/en/visual-editor.json +219 -0
- package/frontend/dist/locales/en/websocket.json +86 -0
- package/frontend/dist/locales/ru/admin.json +100 -0
- package/frontend/dist/locales/ru/api-keys.json +58 -0
- package/frontend/dist/locales/ru/bots.json +110 -0
- package/frontend/dist/locales/ru/common.json +49 -0
- package/frontend/dist/locales/ru/configuration.json +22 -0
- package/frontend/dist/locales/ru/console.json +10 -0
- package/frontend/dist/locales/ru/dashboard.json +85 -0
- package/frontend/dist/locales/ru/dialogs.json +70 -0
- package/frontend/dist/locales/ru/event-graphs.json +50 -0
- package/frontend/dist/locales/ru/graph-store.json +70 -0
- package/frontend/dist/locales/ru/login.json +34 -0
- package/frontend/dist/locales/ru/management.json +114 -0
- package/frontend/dist/locales/ru/minecraft-viewer.json +27 -0
- package/frontend/dist/locales/ru/nodes.json +1077 -0
- package/frontend/dist/locales/ru/permissions.json +50 -0
- package/frontend/dist/locales/ru/plugin-detail.json +49 -0
- package/frontend/dist/locales/ru/plugins.json +110 -0
- package/frontend/dist/locales/ru/proxies.json +81 -0
- package/frontend/dist/locales/ru/servers.json +39 -0
- package/frontend/dist/locales/ru/setup.json +17 -0
- package/frontend/dist/locales/ru/sidebar.json +27 -0
- package/frontend/dist/locales/ru/tasks.json +62 -0
- package/frontend/dist/locales/ru/visual-editor.json +221 -0
- package/frontend/dist/locales/ru/websocket.json +86 -0
- package/frontend/dist/monacoeditorwork/css.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/html.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/json.worker.bundle.js +7 -7
- package/frontend/dist/monacoeditorwork/ts.worker.bundle.js +3 -3
- package/frontend/package.json +4 -0
- package/package.json +1 -1
- package/screen/3dviewer.png +0 -0
- package/screen/console.png +0 -0
- package/screen/dashboard.png +0 -0
- package/screen/graph_collabe.png +0 -0
- package/screen/graph_live_debug.png +0 -0
- package/screen/language_selector.png +0 -0
- package/screen/management_command.png +0 -0
- package/screen/node_debug_trace.png +0 -0
- package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
- package/screen/websocket.png +0 -0
- package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
- package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
- package/.claude/agents/README.md +0 -469
- package/.claude/agents/auth-route-debugger.md +0 -118
- package/.claude/agents/auth-route-tester.md +0 -93
- package/.claude/agents/auto-error-resolver.md +0 -97
- package/.claude/agents/build-optimizer.md +0 -236
- package/.claude/agents/code-architect.md +0 -34
- package/.claude/agents/code-architecture-reviewer.md +0 -83
- package/.claude/agents/code-explorer.md +0 -51
- package/.claude/agents/code-refactor-master.md +0 -94
- package/.claude/agents/code-reviewer.md +0 -46
- package/.claude/agents/cost-optimizer.md +0 -134
- package/.claude/agents/deployment-orchestrator.md +0 -113
- package/.claude/agents/documentation-architect.md +0 -82
- package/.claude/agents/frontend-error-fixer.md +0 -77
- package/.claude/agents/iac-code-generator.md +0 -71
- package/.claude/agents/incident-responder.md +0 -346
- package/.claude/agents/infrastructure-architect.md +0 -31
- package/.claude/agents/kubernetes-specialist.md +0 -56
- package/.claude/agents/migration-planner.md +0 -181
- package/.claude/agents/network-architect.md +0 -196
- package/.claude/agents/plan-reviewer.md +0 -52
- package/.claude/agents/refactor-planner.md +0 -63
- package/.claude/agents/security-scanner.md +0 -102
- package/.claude/agents/web-research-specialist.md +0 -78
- package/.claude/commands/cost-analysis.md +0 -315
- package/.claude/commands/dev-docs-update.md +0 -55
- package/.claude/commands/dev-docs.md +0 -51
- package/.claude/commands/feature-dev.md +0 -125
- package/.claude/commands/incident-debug.md +0 -247
- package/.claude/commands/infra-plan.md +0 -81
- package/.claude/commands/migration-plan.md +0 -478
- package/.claude/commands/route-research-for-testing.md +0 -37
- package/.claude/commands/security-review.md +0 -66
- package/.claude/hooks/CONFIG.md +0 -448
- package/.claude/hooks/README.md +0 -163
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +0 -226
- package/.claude/hooks/WINDOWS_HOOKS_README.md +0 -151
- package/.claude/hooks/add-skill-activation-banners.ts +0 -132
- package/.claude/hooks/comprehensive-skill-test.ts +0 -1315
- package/.claude/hooks/error-handling-reminder.sh +0 -12
- package/.claude/hooks/error-handling-reminder.ts +0 -222
- package/.claude/hooks/k8s-manifest-validator.sh +0 -56
- package/.claude/hooks/package-lock.json +0 -556
- package/.claude/hooks/package.json +0 -16
- package/.claude/hooks/post-tool-use-tracker.ps1 +0 -174
- package/.claude/hooks/post-tool-use-tracker.sh +0 -183
- package/.claude/hooks/security-policy-check.sh +0 -247
- package/.claude/hooks/skill-activation-prompt.ps1 +0 -10
- package/.claude/hooks/skill-activation-prompt.sh +0 -10
- package/.claude/hooks/skill-activation-prompt.ts +0 -141
- package/.claude/hooks/stop-build-check-enhanced.sh +0 -130
- package/.claude/hooks/terraform-validator.sh +0 -53
- package/.claude/hooks/test-input.json +0 -7
- package/.claude/hooks/test-skill-activation.ts +0 -427
- package/.claude/hooks/trigger-build-resolver.sh +0 -79
- package/.claude/hooks/tsc-check.sh +0 -173
- package/.claude/hooks/tsconfig.json +0 -19
- package/.claude/settings.json +0 -59
- package/.claude/settings.local.json +0 -67
- package/.claude/skills/README.md +0 -507
- package/.claude/skills/api-engineering/SKILL.md +0 -63
- package/.claude/skills/api-engineering/resources/api-versioning.md +0 -88
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +0 -106
- package/.claude/skills/api-engineering/resources/rate-limiting.md +0 -118
- package/.claude/skills/api-engineering/resources/rest-api-design.md +0 -105
- package/.claude/skills/backend-dev-guidelines/SKILL.md +0 -306
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +0 -451
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +0 -307
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +0 -638
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +0 -275
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +0 -224
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +0 -213
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +0 -756
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +0 -336
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +0 -789
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +0 -235
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +0 -754
- package/.claude/skills/budget-and-cost-management/SKILL.md +0 -850
- package/.claude/skills/build-engineering/SKILL.md +0 -431
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +0 -72
- package/.claude/skills/build-engineering/resources/build-caching.md +0 -96
- package/.claude/skills/build-engineering/resources/build-pipelines.md +0 -105
- package/.claude/skills/build-engineering/resources/build-security.md +0 -95
- package/.claude/skills/build-engineering/resources/build-systems.md +0 -389
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +0 -201
- package/.claude/skills/build-engineering/resources/dependency-management.md +0 -73
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +0 -110
- package/.claude/skills/build-engineering/resources/performance-optimization.md +0 -113
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +0 -82
- package/.claude/skills/cloud-engineering/SKILL.md +0 -675
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +0 -742
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +0 -714
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +0 -987
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +0 -757
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +0 -1058
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +0 -1530
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +0 -990
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +0 -758
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +0 -820
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +0 -670
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +0 -1198
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +0 -795
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +0 -966
- package/.claude/skills/cybersecurity/SKILL.md +0 -409
- package/.claude/skills/cybersecurity/resources/security-architecture.md +0 -266
- package/.claude/skills/database-engineering/SKILL.md +0 -61
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +0 -72
- package/.claude/skills/database-engineering/resources/database-replication.md +0 -63
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +0 -70
- package/.claude/skills/database-engineering/resources/query-optimization.md +0 -68
- package/.claude/skills/devsecops/SKILL.md +0 -374
- package/.claude/skills/devsecops/resources/ci-cd-security.md +0 -204
- package/.claude/skills/devsecops/resources/compliance-automation.md +0 -530
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +0 -2322
- package/.claude/skills/devsecops/resources/container-security.md +0 -915
- package/.claude/skills/devsecops/resources/cspm-integration.md +0 -1440
- package/.claude/skills/devsecops/resources/policy-enforcement.md +0 -619
- package/.claude/skills/devsecops/resources/secrets-management.md +0 -755
- package/.claude/skills/devsecops/resources/security-monitoring.md +0 -146
- package/.claude/skills/devsecops/resources/security-scanning.md +0 -887
- package/.claude/skills/devsecops/resources/security-testing.md +0 -203
- package/.claude/skills/devsecops/resources/supply-chain-security.md +0 -518
- package/.claude/skills/devsecops/resources/vulnerability-management.md +0 -481
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +0 -177
- package/.claude/skills/documentation-as-code/SKILL.md +0 -323
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +0 -90
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +0 -79
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +0 -44
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +0 -99
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +0 -68
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +0 -79
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +0 -162
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +0 -77
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +0 -60
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +0 -202
- package/.claude/skills/engineering-management/SKILL.md +0 -356
- package/.claude/skills/engineering-management/resources/career-ladders.md +0 -609
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +0 -555
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +0 -609
- package/.claude/skills/engineering-management/resources/resource-planning.md +0 -557
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +0 -491
- package/.claude/skills/engineering-management/resources/technical-interviews.md +0 -474
- package/.claude/skills/engineering-operations-management/SKILL.md +0 -817
- package/.claude/skills/error-tracking/SKILL.md +0 -379
- package/.claude/skills/frontend-design/SKILL.md +0 -42
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +0 -403
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +0 -331
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +0 -872
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +0 -502
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +0 -767
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +0 -502
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +0 -501
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +0 -406
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +0 -364
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +0 -428
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +0 -418
- package/.claude/skills/general-it-engineering/SKILL.md +0 -393
- package/.claude/skills/general-it-engineering/resources/asset-management.md +0 -712
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +0 -817
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +0 -786
- package/.claude/skills/general-it-engineering/resources/change-management.md +0 -715
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +0 -729
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +0 -738
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +0 -834
- package/.claude/skills/general-it-engineering/resources/it-governance.md +0 -753
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +0 -503
- package/.claude/skills/general-it-engineering/resources/service-management.md +0 -669
- package/.claude/skills/infrastructure-architecture/SKILL.md +0 -328
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +0 -505
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +0 -528
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +0 -453
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +0 -773
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +0 -499
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +0 -501
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +0 -535
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +0 -512
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +0 -608
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +0 -562
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +0 -538
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +0 -489
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +0 -1000
- package/.claude/skills/infrastructure-strategy/SKILL.md +0 -924
- package/.claude/skills/network-engineering/SKILL.md +0 -385
- package/.claude/skills/network-engineering/resources/dns-management.md +0 -738
- package/.claude/skills/network-engineering/resources/load-balancing.md +0 -820
- package/.claude/skills/network-engineering/resources/network-architecture.md +0 -546
- package/.claude/skills/network-engineering/resources/network-security.md +0 -921
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +0 -749
- package/.claude/skills/network-engineering/resources/routing-switching.md +0 -373
- package/.claude/skills/network-engineering/resources/sdn-networking.md +0 -695
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +0 -777
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +0 -444
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +0 -672
- package/.claude/skills/node-development/SKILL.md +0 -317
- package/.claude/skills/observability-engineering/SKILL.md +0 -101
- package/.claude/skills/observability-engineering/resources/apm-tools.md +0 -97
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +0 -87
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +0 -98
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +0 -118
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +0 -141
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +0 -110
- package/.claude/skills/platform-engineering/SKILL.md +0 -555
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +0 -600
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +0 -916
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +0 -634
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +0 -670
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +0 -650
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +0 -778
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +0 -708
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +0 -602
- package/.claude/skills/platform-engineering/resources/platform-security.md +0 -711
- package/.claude/skills/platform-engineering/resources/resource-management.md +0 -592
- package/.claude/skills/platform-engineering/resources/service-mesh.md +0 -628
- package/.claude/skills/release-engineering/SKILL.md +0 -393
- package/.claude/skills/release-engineering/resources/artifact-management.md +0 -108
- package/.claude/skills/release-engineering/resources/build-optimization.md +0 -84
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +0 -411
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +0 -197
- package/.claude/skills/release-engineering/resources/pipeline-security.md +0 -62
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +0 -83
- package/.claude/skills/release-engineering/resources/release-automation.md +0 -68
- package/.claude/skills/release-engineering/resources/release-orchestration.md +0 -77
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +0 -66
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +0 -59
- package/.claude/skills/route-tester/SKILL.md +0 -392
- package/.claude/skills/skill-developer/ADVANCED.md +0 -197
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +0 -306
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +0 -152
- package/.claude/skills/skill-developer/SKILL.md +0 -430
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +0 -315
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +0 -305
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +0 -514
- package/.claude/skills/skill-rules.json +0 -2989
- package/.claude/skills/sre/SKILL.md +0 -464
- package/.claude/skills/sre/resources/alerting-best-practices.md +0 -282
- package/.claude/skills/sre/resources/capacity-planning.md +0 -226
- package/.claude/skills/sre/resources/chaos-engineering.md +0 -193
- package/.claude/skills/sre/resources/disaster-recovery.md +0 -232
- package/.claude/skills/sre/resources/incident-management.md +0 -436
- package/.claude/skills/sre/resources/observability-stack.md +0 -240
- package/.claude/skills/sre/resources/on-call-runbooks.md +0 -167
- package/.claude/skills/sre/resources/performance-optimization.md +0 -108
- package/.claude/skills/sre/resources/reliability-patterns.md +0 -183
- package/.claude/skills/sre/resources/slo-sli-sla.md +0 -464
- package/.claude/skills/sre/resources/toil-reduction.md +0 -145
- package/.claude/skills/systems-engineering/SKILL.md +0 -648
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +0 -771
- package/.claude/skills/systems-engineering/resources/configuration-management.md +0 -998
- package/.claude/skills/systems-engineering/resources/linux-administration.md +0 -672
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +0 -982
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +0 -871
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +0 -482
- package/.claude/skills/systems-engineering/resources/security-hardening.md +0 -739
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +0 -915
- package/.claude/skills/systems-engineering/resources/storage-management.md +0 -628
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +0 -787
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +0 -753
- package/.claude/skills/systems-engineering/resources/windows-administration.md +0 -738
- package/.claude/skills/technical-leadership/SKILL.md +0 -728
- package/backend/docs/SECRETS_DOCUMENTATION.md +0 -327
- package/frontend/dist/assets/index-BC-NbKXi.css +0 -32
- package/frontend/dist/assets/index-DqJXZMHY.js +0 -11266
|
@@ -363,17 +363,19 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
|
|
|
363
363
|
|
|
364
364
|
"botpanel": {
|
|
365
365
|
"icon": "Settings",
|
|
366
|
+
"categories": ["Core", "AI"],
|
|
366
367
|
"dependencies": {
|
|
367
|
-
"
|
|
368
|
+
"ai-core": "^1.0.0"
|
|
368
369
|
},
|
|
369
370
|
"supportedHosts": ["mc.example.com"],
|
|
370
371
|
|
|
371
372
|
"settings": {
|
|
372
373
|
"apiToken": {
|
|
373
|
-
"type": "
|
|
374
|
+
"type": "string",
|
|
374
375
|
"label": "API Токен",
|
|
375
376
|
"description": "Секретный токен API",
|
|
376
|
-
"default": ""
|
|
377
|
+
"default": "",
|
|
378
|
+
"secret": true
|
|
377
379
|
},
|
|
378
380
|
|
|
379
381
|
"enabled": {
|
|
@@ -412,6 +414,26 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
|
|
|
412
414
|
"defaultPath": "config/default.json"
|
|
413
415
|
},
|
|
414
416
|
|
|
417
|
+
"mode": {
|
|
418
|
+
"type": "select",
|
|
419
|
+
"label": "Режим работы",
|
|
420
|
+
"description": "Выберите режим работы плагина",
|
|
421
|
+
"options": ["easy", "normal", "hard"],
|
|
422
|
+
"default": "normal"
|
|
423
|
+
},
|
|
424
|
+
|
|
425
|
+
"language": {
|
|
426
|
+
"type": "select",
|
|
427
|
+
"label": "Язык",
|
|
428
|
+
"description": "Выберите язык интерфейса",
|
|
429
|
+
"options": [
|
|
430
|
+
{ "value": "ru", "label": "Русский" },
|
|
431
|
+
{ "value": "en", "label": "English" },
|
|
432
|
+
{ "value": "uk", "label": "Українська" }
|
|
433
|
+
],
|
|
434
|
+
"default": "ru"
|
|
435
|
+
},
|
|
436
|
+
|
|
415
437
|
"proxy": {
|
|
416
438
|
"type": "proxy",
|
|
417
439
|
"label": "Прокси для запросов",
|
|
@@ -430,12 +452,41 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
|
|
|
430
452
|
| `string` | Строка | `"Hello"` |
|
|
431
453
|
| `number` | Число | `42` |
|
|
432
454
|
| `boolean` | Переключатель | `true` |
|
|
433
|
-
| `secret` | Секретная строка (скрыта в UI) | `"api_key_123"` |
|
|
434
455
|
| `string[]` | Массив строк | `["a", "b"]` |
|
|
435
456
|
| `json` | JSON объект | `{"key": "value"}` |
|
|
436
457
|
| `json_file` | JSON из файла | Путь к файлу |
|
|
458
|
+
| `select` | Выпадающий список | `"normal"` (строка или объект) |
|
|
437
459
|
| `proxy` | Выбор прокси (из списка или вручную) | `{ enabled: true, host: "...", port: 1080 }` |
|
|
438
460
|
|
|
461
|
+
### Защита секретных данных
|
|
462
|
+
|
|
463
|
+
Для защиты чувствительных данных (API ключи, токены, пароли) используйте поле `secret: true`:
|
|
464
|
+
|
|
465
|
+
```json
|
|
466
|
+
{
|
|
467
|
+
"apiKey": {
|
|
468
|
+
"type": "string",
|
|
469
|
+
"label": "API ключ",
|
|
470
|
+
"description": "Ваш секретный API ключ",
|
|
471
|
+
"default": "",
|
|
472
|
+
"secret": true
|
|
473
|
+
},
|
|
474
|
+
"apiKeys": {
|
|
475
|
+
"type": "string[]",
|
|
476
|
+
"label": "API ключи",
|
|
477
|
+
"description": "Список API ключей",
|
|
478
|
+
"default": [],
|
|
479
|
+
"secret": true
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
**Как работает `secret: true`:**
|
|
485
|
+
- В UI поле отображается как `<input type="password">` (скрыто точками)
|
|
486
|
+
- Backend автоматически маскирует значения при отправке на фронтенд (`********`)
|
|
487
|
+
- При сохранении маска не перезаписывает реальное значение
|
|
488
|
+
- Работает с типами: `string`, `string[]`
|
|
489
|
+
|
|
439
490
|
### Структура объекта proxy
|
|
440
491
|
|
|
441
492
|
Когда пользователь настраивает прокси в UI, объект `settings.proxy` имеет следующую структуру:
|
|
@@ -454,6 +505,226 @@ bot.events.on('core:raw_message', (rawText, jsonMsg) => {
|
|
|
454
505
|
|
|
455
506
|
Если прокси отключен: `{ enabled: false }`
|
|
456
507
|
|
|
508
|
+
### Структура настройки select
|
|
509
|
+
|
|
510
|
+
Настройка типа `select` позволяет пользователю выбрать одно значение из предопределенного списка опций.
|
|
511
|
+
|
|
512
|
+
**Формат options:**
|
|
513
|
+
|
|
514
|
+
1. **Простой массив строк** - когда значение и label совпадают:
|
|
515
|
+
|
|
516
|
+
```javascript
|
|
517
|
+
"options": ["easy", "normal", "hard"]
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
1. **Массив объектов** - когда нужны разные value и label:
|
|
521
|
+
|
|
522
|
+
```javascript
|
|
523
|
+
"options": [
|
|
524
|
+
{ "value": "ru", "label": "Русский" },
|
|
525
|
+
{ "value": "en", "label": "English" },
|
|
526
|
+
{ "value": "uk", "label": "Українська" }
|
|
527
|
+
]
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
**Результат:**
|
|
531
|
+
Сохраненное значение всегда будет строкой (например: `"normal"`, `"ru"`)
|
|
532
|
+
|
|
533
|
+
**Пример использования в плагине:**
|
|
534
|
+
|
|
535
|
+
```javascript
|
|
536
|
+
module.exports = (bot, { settings }) => {
|
|
537
|
+
const mode = settings.mode; // "easy" | "normal" | "hard"
|
|
538
|
+
const language = settings.language; // "ru" | "en" | "uk"
|
|
539
|
+
|
|
540
|
+
if (mode === 'hard') {
|
|
541
|
+
console.log('Включён сложный режим');
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Условная зависимость настроек (dependsOn)
|
|
547
|
+
|
|
548
|
+
Система `dependsOn` позволяет показывать/скрывать настройки в UI в зависимости от значений других полей. Это делает интерфейс настроек чище и понятнее.
|
|
549
|
+
|
|
550
|
+
**Базовый синтаксис:**
|
|
551
|
+
|
|
552
|
+
```json
|
|
553
|
+
{
|
|
554
|
+
"provider": {
|
|
555
|
+
"type": "select",
|
|
556
|
+
"label": "Провайдер",
|
|
557
|
+
"options": ["openrouter", "google"],
|
|
558
|
+
"default": "openrouter"
|
|
559
|
+
},
|
|
560
|
+
|
|
561
|
+
"openrouterApiKey": {
|
|
562
|
+
"type": "string",
|
|
563
|
+
"label": "OpenRouter API Key",
|
|
564
|
+
"default": "",
|
|
565
|
+
"secret": true,
|
|
566
|
+
"dependsOn": { "field": "provider", "value": "openrouter" }
|
|
567
|
+
},
|
|
568
|
+
|
|
569
|
+
"googleApiKeys": {
|
|
570
|
+
"type": "string[]",
|
|
571
|
+
"label": "Google API Keys",
|
|
572
|
+
"default": [],
|
|
573
|
+
"secret": true,
|
|
574
|
+
"dependsOn": { "field": "provider", "value": "google" }
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
**В этом примере:**
|
|
580
|
+
- Поле `openrouterApiKey` отображается **только** когда `provider === "openrouter"`
|
|
581
|
+
- Поле `googleApiKeys` отображается **только** когда `provider === "google"`
|
|
582
|
+
|
|
583
|
+
**Поддерживаемые операторы сравнения:**
|
|
584
|
+
|
|
585
|
+
```json
|
|
586
|
+
{
|
|
587
|
+
"advancedMode": {
|
|
588
|
+
"type": "boolean",
|
|
589
|
+
"label": "Расширенный режим",
|
|
590
|
+
"default": false
|
|
591
|
+
},
|
|
592
|
+
|
|
593
|
+
"maxConnections": {
|
|
594
|
+
"type": "number",
|
|
595
|
+
"label": "Максимум подключений",
|
|
596
|
+
"default": 10,
|
|
597
|
+
"dependsOn": { "field": "advancedMode", "value": true }
|
|
598
|
+
},
|
|
599
|
+
|
|
600
|
+
"minAge": {
|
|
601
|
+
"type": "number",
|
|
602
|
+
"label": "Минимальный возраст",
|
|
603
|
+
"default": 18,
|
|
604
|
+
"dependsOn": { "field": "age", "operator": "gte", "value": 18 }
|
|
605
|
+
},
|
|
606
|
+
|
|
607
|
+
"specialFeature": {
|
|
608
|
+
"type": "boolean",
|
|
609
|
+
"label": "Специальная функция",
|
|
610
|
+
"default": false,
|
|
611
|
+
"dependsOn": { "field": "plan", "operator": "ne", "value": "free" }
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
**Доступные операторы:**
|
|
617
|
+
- `eq` или без оператора - равно (по умолчанию)
|
|
618
|
+
- `ne` - не равно
|
|
619
|
+
- `gt` - больше
|
|
620
|
+
- `gte` - больше или равно
|
|
621
|
+
- `lt` - меньше
|
|
622
|
+
- `lte` - меньше или равно
|
|
623
|
+
|
|
624
|
+
**Множественные условия (AND логика):**
|
|
625
|
+
|
|
626
|
+
```json
|
|
627
|
+
{
|
|
628
|
+
"sslCert": {
|
|
629
|
+
"type": "string",
|
|
630
|
+
"label": "SSL сертификат",
|
|
631
|
+
"default": "",
|
|
632
|
+
"dependsOn": [
|
|
633
|
+
{ "field": "useSSL", "value": true },
|
|
634
|
+
{ "field": "environment", "value": "production" }
|
|
635
|
+
]
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
Поле `sslCert` отобразится **только** когда `useSSL === true` **И** `environment === "production"`.
|
|
641
|
+
|
|
642
|
+
**Инверсия условия (NOT логика):**
|
|
643
|
+
|
|
644
|
+
```json
|
|
645
|
+
{
|
|
646
|
+
"customEndpoint": {
|
|
647
|
+
"type": "string",
|
|
648
|
+
"label": "Кастомный endpoint",
|
|
649
|
+
"default": "",
|
|
650
|
+
"dependsOn": {
|
|
651
|
+
"field": "useDefaultEndpoint",
|
|
652
|
+
"value": false
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
**Реальный пример из ai-core плагина:**
|
|
659
|
+
|
|
660
|
+
```json
|
|
661
|
+
{
|
|
662
|
+
"provider": {
|
|
663
|
+
"type": "select",
|
|
664
|
+
"label": "AI провайдер",
|
|
665
|
+
"options": [
|
|
666
|
+
{ "value": "openrouter", "label": "OpenRouter" },
|
|
667
|
+
{ "value": "google", "label": "Google Gemini" }
|
|
668
|
+
],
|
|
669
|
+
"default": "openrouter"
|
|
670
|
+
},
|
|
671
|
+
|
|
672
|
+
"openrouterApiKey": {
|
|
673
|
+
"type": "string",
|
|
674
|
+
"label": "OpenRouter API Key",
|
|
675
|
+
"secret": true,
|
|
676
|
+
"dependsOn": { "field": "provider", "value": "openrouter" }
|
|
677
|
+
},
|
|
678
|
+
|
|
679
|
+
"openrouterModel": {
|
|
680
|
+
"type": "string",
|
|
681
|
+
"label": "Модель",
|
|
682
|
+
"default": "google/gemini-2.5-flash",
|
|
683
|
+
"dependsOn": { "field": "provider", "value": "openrouter" }
|
|
684
|
+
},
|
|
685
|
+
|
|
686
|
+
"openrouterApiEndpoint": {
|
|
687
|
+
"type": "string",
|
|
688
|
+
"label": "API Endpoint (опционально)",
|
|
689
|
+
"default": "",
|
|
690
|
+
"dependsOn": { "field": "provider", "value": "openrouter" }
|
|
691
|
+
},
|
|
692
|
+
|
|
693
|
+
"enableCostTracking": {
|
|
694
|
+
"type": "boolean",
|
|
695
|
+
"label": "Отслеживать стоимость",
|
|
696
|
+
"default": false,
|
|
697
|
+
"dependsOn": { "field": "provider", "value": "openrouter" }
|
|
698
|
+
},
|
|
699
|
+
|
|
700
|
+
"googleApiKeys": {
|
|
701
|
+
"type": "string[]",
|
|
702
|
+
"label": "Google AI API Keys",
|
|
703
|
+
"secret": true,
|
|
704
|
+
"dependsOn": { "field": "provider", "value": "google" }
|
|
705
|
+
},
|
|
706
|
+
|
|
707
|
+
"googleModel": {
|
|
708
|
+
"type": "string",
|
|
709
|
+
"label": "Google модель",
|
|
710
|
+
"default": "gemini-2.5-flash",
|
|
711
|
+
"dependsOn": { "field": "provider", "value": "google" }
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
**Результат:**
|
|
717
|
+
- При выборе "OpenRouter" → показываются: `openrouterApiKey`, `openrouterModel`, `openrouterApiEndpoint`, `enableCostTracking`
|
|
718
|
+
- При выборе "Google Gemini" → показываются: `googleApiKeys`, `googleModel`
|
|
719
|
+
|
|
720
|
+
**Best Practices:**
|
|
721
|
+
- ✅ Используйте `dependsOn` для группировки связанных настроек по провайдерам/режимам
|
|
722
|
+
- ✅ Делайте UI чище, показывая только релевантные поля
|
|
723
|
+
- ✅ Комбинируйте с `secret: true` для защиты чувствительных данных
|
|
724
|
+
- ✅ Используйте понятные значения в select для условий
|
|
725
|
+
- ❌ Не создавайте циклические зависимости (A зависит от B, B зависит от A)
|
|
726
|
+
- ❌ Не делайте слишком сложные цепочки зависимостей (максимум 2-3 уровня)
|
|
727
|
+
|
|
457
728
|
### Доступ к настройкам
|
|
458
729
|
|
|
459
730
|
```javascript
|
|
@@ -475,7 +746,382 @@ module.exports = (bot, { settings }) => {
|
|
|
475
746
|
};
|
|
476
747
|
```
|
|
477
748
|
|
|
478
|
-
## 7.
|
|
749
|
+
## 7. PLUGIN REGISTRY - ИСПОЛЬЗОВАНИЕ API ДРУГИХ ПЛАГИНОВ
|
|
750
|
+
|
|
751
|
+
### Обзор
|
|
752
|
+
|
|
753
|
+
Plugin Registry позволяет плагинам **экспортировать свой API** и **использовать функции других плагинов** без дублирования кода.
|
|
754
|
+
|
|
755
|
+
**Основные концепции:**
|
|
756
|
+
- ✅ Плагин экспортирует API через поле `exports` в module.exports
|
|
757
|
+
- ✅ Другие плагины получают доступ через `bot.pluginRegistry.get(pluginName)`
|
|
758
|
+
- ✅ Зависимости указываются в `botpanel.dependencies`
|
|
759
|
+
- ✅ При установке система проверяет наличие зависимостей
|
|
760
|
+
|
|
761
|
+
---
|
|
762
|
+
|
|
763
|
+
### 7.1. Экспорт API из плагина
|
|
764
|
+
|
|
765
|
+
Если твой плагин предоставляет переиспользуемый функционал (AI, база данных, утилиты), экспортируй API:
|
|
766
|
+
|
|
767
|
+
```javascript
|
|
768
|
+
// plugins/ai-core/index.js
|
|
769
|
+
async function onLoad(bot, options) {
|
|
770
|
+
const { settings } = options;
|
|
771
|
+
|
|
772
|
+
// Инициализация плагина
|
|
773
|
+
const aiClient = initializeAIClient(settings);
|
|
774
|
+
|
|
775
|
+
// ... остальная логика ...
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
async function onUnload({ botId, prisma }) {
|
|
779
|
+
// Cleanup
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
// ✅ ЭКСПОРТ API ДЛЯ ДРУГИХ ПЛАГИНОВ
|
|
783
|
+
module.exports = {
|
|
784
|
+
onLoad,
|
|
785
|
+
onUnload,
|
|
786
|
+
exports: {
|
|
787
|
+
/**
|
|
788
|
+
* Генерация текста через AI
|
|
789
|
+
* @param {Array<{role: string, content: string}>} messages - Массив сообщений
|
|
790
|
+
* @param {Object} [options] - Опции генерации
|
|
791
|
+
* @returns {Promise<{content: string, model: string, usage: Object}>}
|
|
792
|
+
*/
|
|
793
|
+
generate: async (messages, options = {}) => {
|
|
794
|
+
return await aiClient.generate({ messages, options });
|
|
795
|
+
},
|
|
796
|
+
|
|
797
|
+
/**
|
|
798
|
+
* Проверить доступность AI сервиса
|
|
799
|
+
*/
|
|
800
|
+
isAvailable: () => {
|
|
801
|
+
return !!aiClient;
|
|
802
|
+
},
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Получить информацию о провайдере
|
|
806
|
+
*/
|
|
807
|
+
getProviderInfo: () => {
|
|
808
|
+
return {
|
|
809
|
+
type: settings.provider,
|
|
810
|
+
model: settings.model
|
|
811
|
+
};
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
**Важно:**
|
|
818
|
+
- Экспортируй только PUBLIC API
|
|
819
|
+
- Документируй каждую функцию через JSDoc
|
|
820
|
+
- Обрабатывай ошибки внутри экспортируемых функций
|
|
821
|
+
- Не экспортируй изменяемое состояние напрямую
|
|
822
|
+
|
|
823
|
+
---
|
|
824
|
+
|
|
825
|
+
### 7.2. Использование API другого плагина
|
|
826
|
+
|
|
827
|
+
#### Шаг 1: Указать зависимость в package.json
|
|
828
|
+
|
|
829
|
+
```json
|
|
830
|
+
{
|
|
831
|
+
"name": "ai-code-reviewer",
|
|
832
|
+
"version": "1.0.0",
|
|
833
|
+
"botpanel": {
|
|
834
|
+
"dependencies": {
|
|
835
|
+
"ai-core": "^1.0.0"
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
При установке система проверит:
|
|
842
|
+
- ✅ Установлен ли плагин `ai-core`
|
|
843
|
+
- ⚠️ Совместима ли версия (мажорная версия)
|
|
844
|
+
- ❌ Если плагин не установлен - выведет предупреждение
|
|
845
|
+
|
|
846
|
+
#### Шаг 2: Проверить доступность и использовать API
|
|
847
|
+
|
|
848
|
+
```javascript
|
|
849
|
+
// plugins/ai-code-reviewer/index.js
|
|
850
|
+
async function onLoad(bot, options) {
|
|
851
|
+
const log = bot.sendLog;
|
|
852
|
+
|
|
853
|
+
// ✅ Получаем API плагина ai-core
|
|
854
|
+
const aiCoreAPI = bot.pluginRegistry.get('ai-core');
|
|
855
|
+
|
|
856
|
+
// Проверка доступности
|
|
857
|
+
if (!aiCoreAPI) {
|
|
858
|
+
log('[ai-code-reviewer] ❌ Требуется плагин ai-core!');
|
|
859
|
+
log('[ai-code-reviewer] Установите плагин ai-core v1.0.0+');
|
|
860
|
+
return; // Прерываем загрузку
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
if (!aiCoreAPI.isAvailable()) {
|
|
864
|
+
log('[ai-code-reviewer] ⚠️ AI сервис недоступен');
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
log('[ai-code-reviewer] ✓ AI Core подключен');
|
|
869
|
+
|
|
870
|
+
// ✅ Используем API
|
|
871
|
+
const Command = bot.api.Command;
|
|
872
|
+
|
|
873
|
+
class ReviewCommand extends Command {
|
|
874
|
+
constructor() {
|
|
875
|
+
super({
|
|
876
|
+
name: 'review',
|
|
877
|
+
description: 'Отправить код на ревью AI',
|
|
878
|
+
owner: 'plugin:ai-code-reviewer'
|
|
879
|
+
});
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
async handler(bot, typeChat, user, args) {
|
|
883
|
+
const { code } = args;
|
|
884
|
+
|
|
885
|
+
try {
|
|
886
|
+
bot.api.sendMessage(typeChat, '🔍 Анализирую код...', user.username);
|
|
887
|
+
|
|
888
|
+
// ✅ Вызов API другого плагина
|
|
889
|
+
const messages = [
|
|
890
|
+
{
|
|
891
|
+
role: 'system',
|
|
892
|
+
content: 'Ты код ревьюер. Дай краткие рекомендации (2-3 предложения).'
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
role: 'user',
|
|
896
|
+
content: `Проверь код:\n\n${code}`
|
|
897
|
+
}
|
|
898
|
+
];
|
|
899
|
+
|
|
900
|
+
const result = await aiCoreAPI.generate(messages);
|
|
901
|
+
|
|
902
|
+
bot.api.sendMessage(typeChat, `📝 ${result.content}`, user.username);
|
|
903
|
+
|
|
904
|
+
} catch (error) {
|
|
905
|
+
log(`[ai-code-reviewer] Ошибка: ${error.message}`);
|
|
906
|
+
bot.api.sendMessage(typeChat, '❌ Ошибка при ревью', user.username);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
await bot.api.registerCommand(new ReviewCommand());
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
module.exports = { onLoad };
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
---
|
|
918
|
+
|
|
919
|
+
### 7.3. Паттерны использования
|
|
920
|
+
|
|
921
|
+
#### Паттерн 1: Stateless API (без истории)
|
|
922
|
+
|
|
923
|
+
Плагин-потребитель сам управляет состоянием:
|
|
924
|
+
|
|
925
|
+
```javascript
|
|
926
|
+
// ai-code-reviewer - БЕЗ истории
|
|
927
|
+
const messages = [
|
|
928
|
+
{ role: 'system', content: 'Ты ревьюер' },
|
|
929
|
+
{ role: 'user', content: code }
|
|
930
|
+
];
|
|
931
|
+
|
|
932
|
+
const result = await aiCoreAPI.generate(messages);
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
#### Паттерн 2: Stateful с PluginStore (с историей)
|
|
936
|
+
|
|
937
|
+
Плагин-потребитель хранит историю в своём store:
|
|
938
|
+
|
|
939
|
+
```javascript
|
|
940
|
+
// ai-translator - С историей контекста
|
|
941
|
+
async function translateHandler(bot, typeChat, user, args, store) {
|
|
942
|
+
const { text, targetLang } = args;
|
|
943
|
+
|
|
944
|
+
// 1. Загружаем историю из store
|
|
945
|
+
const historyKey = `translator:history:${user.username}`;
|
|
946
|
+
let history = await store.get(historyKey) || [];
|
|
947
|
+
|
|
948
|
+
// Ограничиваем последними 5 переводами
|
|
949
|
+
if (history.length > 10) {
|
|
950
|
+
history = history.slice(-10);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
// 2. Формируем messages
|
|
954
|
+
const messages = [
|
|
955
|
+
{ role: 'system', content: `Переводчик на ${targetLang}` },
|
|
956
|
+
...history,
|
|
957
|
+
{ role: 'user', content: text }
|
|
958
|
+
];
|
|
959
|
+
|
|
960
|
+
// 3. Вызов AI Core
|
|
961
|
+
const result = await aiCoreAPI.generate(messages);
|
|
962
|
+
|
|
963
|
+
// 4. Сохраняем историю
|
|
964
|
+
history.push({ role: 'user', content: text });
|
|
965
|
+
history.push({ role: 'assistant', content: result.content });
|
|
966
|
+
await store.set(historyKey, history);
|
|
967
|
+
|
|
968
|
+
return result.content;
|
|
969
|
+
}
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
#### Паттерн 3: Опциональная зависимость
|
|
973
|
+
|
|
974
|
+
Плагин работает с AI и без него:
|
|
975
|
+
|
|
976
|
+
```javascript
|
|
977
|
+
async function onLoad(bot, options) {
|
|
978
|
+
const aiCoreAPI = bot.pluginRegistry.get('ai-core');
|
|
979
|
+
const useAI = !!aiCoreAPI;
|
|
980
|
+
|
|
981
|
+
if (useAI) {
|
|
982
|
+
log('✓ AI поддержка включена');
|
|
983
|
+
} else {
|
|
984
|
+
log('⚠️ AI поддержка отключена (плагин ai-core не установлен)');
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
// Плагин работает в обоих случаях
|
|
988
|
+
// ...
|
|
989
|
+
}
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
#### Паттерн 4: Множественные зависимости
|
|
993
|
+
|
|
994
|
+
```javascript
|
|
995
|
+
async function onLoad(bot, options) {
|
|
996
|
+
const dependencies = {
|
|
997
|
+
ai: bot.pluginRegistry.get('ai-core'),
|
|
998
|
+
database: bot.pluginRegistry.get('database-manager'),
|
|
999
|
+
cache: bot.pluginRegistry.get('redis-cache')
|
|
1000
|
+
};
|
|
1001
|
+
|
|
1002
|
+
// Проверяем все обязательные зависимости
|
|
1003
|
+
const missing = Object.entries(dependencies)
|
|
1004
|
+
.filter(([name, api]) => !api)
|
|
1005
|
+
.map(([name]) => name);
|
|
1006
|
+
|
|
1007
|
+
if (missing.length > 0) {
|
|
1008
|
+
log(`❌ Отсутствуют плагины: ${missing.join(', ')}`);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
// Все зависимости на месте
|
|
1013
|
+
log('✓ Все зависимости загружены');
|
|
1014
|
+
}
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
---
|
|
1018
|
+
|
|
1019
|
+
### 7.4. Проверка совместимости версий
|
|
1020
|
+
|
|
1021
|
+
```javascript
|
|
1022
|
+
async function onLoad(bot, options) {
|
|
1023
|
+
const aiCoreAPI = bot.pluginRegistry.get('ai-core');
|
|
1024
|
+
|
|
1025
|
+
if (!aiCoreAPI) {
|
|
1026
|
+
log('❌ Требуется плагин ai-core');
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
// Проверка наличия конкретного метода
|
|
1031
|
+
if (typeof aiCoreAPI.generate !== 'function') {
|
|
1032
|
+
log('❌ Несовместимая версия ai-core (нет метода generate)');
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
// Проверка версии провайдера (если нужно)
|
|
1037
|
+
const providerInfo = aiCoreAPI.getProviderInfo();
|
|
1038
|
+
if (providerInfo.type !== 'openrouter') {
|
|
1039
|
+
log('⚠️ Плагин оптимизирован для OpenRouter провайдера');
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
```
|
|
1043
|
+
|
|
1044
|
+
---
|
|
1045
|
+
|
|
1046
|
+
### 7.5. Экспорт нескольких сервисов
|
|
1047
|
+
|
|
1048
|
+
Плагин может экспортировать несколько сервисов:
|
|
1049
|
+
|
|
1050
|
+
```javascript
|
|
1051
|
+
module.exports = {
|
|
1052
|
+
onLoad,
|
|
1053
|
+
onUnload,
|
|
1054
|
+
exports: {
|
|
1055
|
+
// Сервис работы с AI
|
|
1056
|
+
ai: {
|
|
1057
|
+
generate: async (messages, options) => { ... },
|
|
1058
|
+
isAvailable: () => true
|
|
1059
|
+
},
|
|
1060
|
+
|
|
1061
|
+
// Сервис управления историей
|
|
1062
|
+
history: {
|
|
1063
|
+
get: async (userId) => { ... },
|
|
1064
|
+
clear: async (userId) => { ... },
|
|
1065
|
+
export: async (userId) => { ... }
|
|
1066
|
+
},
|
|
1067
|
+
|
|
1068
|
+
// Утилиты
|
|
1069
|
+
utils: {
|
|
1070
|
+
cleanEmojis: (text) => { ... },
|
|
1071
|
+
formatResponse: (text) => { ... },
|
|
1072
|
+
estimateTokens: (text) => { ... }
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
// Использование
|
|
1078
|
+
const aiChatAPI = bot.pluginRegistry.get('ai-chat');
|
|
1079
|
+
await aiChatAPI.ai.generate(messages);
|
|
1080
|
+
await aiChatAPI.history.clear('user123');
|
|
1081
|
+
const clean = aiChatAPI.utils.cleanEmojis('🎉 text');
|
|
1082
|
+
```
|
|
1083
|
+
|
|
1084
|
+
---
|
|
1085
|
+
|
|
1086
|
+
### 7.6. Best Practices для Plugin Registry
|
|
1087
|
+
|
|
1088
|
+
✅ **DO:**
|
|
1089
|
+
- Всегда проверяй наличие плагина перед использованием
|
|
1090
|
+
- Указывай зависимости в `botpanel.dependencies`
|
|
1091
|
+
- Обрабатывай ошибки при вызове API других плагинов
|
|
1092
|
+
- Документируй экспортируемые функции через JSDoc
|
|
1093
|
+
- Используй семантическое версионирование
|
|
1094
|
+
- Экспортируй только стабильное PUBLIC API
|
|
1095
|
+
|
|
1096
|
+
❌ **DON'T:**
|
|
1097
|
+
- Не полагайся на порядок загрузки плагинов
|
|
1098
|
+
- Не модифицируй объекты других плагинов
|
|
1099
|
+
- Не создавай циклические зависимости (A → B → A)
|
|
1100
|
+
- Не экспортируй изменяемое состояние напрямую
|
|
1101
|
+
- Не захватывай контекст (closure) - передавай параметры явно
|
|
1102
|
+
|
|
1103
|
+
---
|
|
1104
|
+
|
|
1105
|
+
### 7.7. Отладка Plugin Registry
|
|
1106
|
+
|
|
1107
|
+
#### Просмотр зарегистрированных плагинов
|
|
1108
|
+
|
|
1109
|
+
```javascript
|
|
1110
|
+
// В любом плагине
|
|
1111
|
+
async function onLoad(bot, options) {
|
|
1112
|
+
console.log('Зарегистрированные плагины с API:');
|
|
1113
|
+
|
|
1114
|
+
for (const [name, api] of bot.pluginRegistry.entries()) {
|
|
1115
|
+
const methods = Object.keys(api).join(', ');
|
|
1116
|
+
console.log(`- ${name}: ${methods}`);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
---
|
|
1123
|
+
|
|
1124
|
+
## 8. ХРАНЕНИЕ ДАННЫХ (PluginStore)
|
|
479
1125
|
|
|
480
1126
|
KV хранилище в базе данных:
|
|
481
1127
|
|
|
@@ -836,6 +1482,8 @@ try {
|
|
|
836
1482
|
|
|
837
1483
|
## 16. BEST PRACTICES
|
|
838
1484
|
|
|
1485
|
+
### Общие практики
|
|
1486
|
+
|
|
839
1487
|
1. **Всегда используй PLUGIN_OWNER_ID** для команд, прав и групп
|
|
840
1488
|
2. **Очищай ресурсы в onUnload** - удаляй команды и права из БД
|
|
841
1489
|
3. **Обрабатывай ошибки** - не давай плагину крашить бота
|
|
@@ -846,3 +1494,14 @@ try {
|
|
|
846
1494
|
8. **Не дублируй логику** - выноси в lib/
|
|
847
1495
|
9. **Пиши понятные имена** - файлов, функций, переменных
|
|
848
1496
|
10. **Документируй** - README обязателен
|
|
1497
|
+
|
|
1498
|
+
### Plugin Registry практики
|
|
1499
|
+
|
|
1500
|
+
11. **Проверяй зависимости** - всегда проверяй `bot.pluginRegistry.get()` перед использованием
|
|
1501
|
+
12. **Указывай dependencies** - в `botpanel.dependencies` для автоматической проверки
|
|
1502
|
+
13. **Экспортируй только PUBLIC API** - внутренние функции не экспортируй
|
|
1503
|
+
14. **Документируй экспорты** - используй JSDoc для всех экспортируемых функций
|
|
1504
|
+
15. **Избегай циклических зависимостей** - плагин A не должен зависеть от B, который зависит от A
|
|
1505
|
+
16. **Версионируй правильно** - используй semver (major.minor.patch)
|
|
1506
|
+
17. **Не захватывай контекст** - экспортируемые функции должны получать все через параметры
|
|
1507
|
+
18. **Обрабатывай ошибки в exports** - не допускай чтобы ошибки вылетали наружу
|