blockmine 1.21.0 → 1.23.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/.claude/agents/README.md +469 -0
- package/.claude/agents/auth-route-debugger.md +118 -0
- package/.claude/agents/auth-route-tester.md +93 -0
- package/.claude/agents/auto-error-resolver.md +97 -0
- package/.claude/agents/build-optimizer.md +236 -0
- package/.claude/agents/code-architecture-reviewer.md +83 -0
- package/.claude/agents/code-refactor-master.md +94 -0
- package/.claude/agents/cost-optimizer.md +134 -0
- package/.claude/agents/deployment-orchestrator.md +113 -0
- package/.claude/agents/documentation-architect.md +82 -0
- package/.claude/agents/frontend-error-fixer.md +77 -0
- package/.claude/agents/iac-code-generator.md +71 -0
- package/.claude/agents/incident-responder.md +346 -0
- package/.claude/agents/infrastructure-architect.md +31 -0
- package/.claude/agents/kubernetes-specialist.md +56 -0
- package/.claude/agents/migration-planner.md +181 -0
- package/.claude/agents/network-architect.md +196 -0
- package/.claude/agents/plan-reviewer.md +52 -0
- package/.claude/agents/refactor-planner.md +63 -0
- package/.claude/agents/security-scanner.md +102 -0
- package/.claude/agents/web-research-specialist.md +78 -0
- package/.claude/commands/cost-analysis.md +315 -0
- package/.claude/commands/dev-docs-update.md +55 -0
- package/.claude/commands/dev-docs.md +51 -0
- package/.claude/commands/incident-debug.md +247 -0
- package/.claude/commands/infra-plan.md +81 -0
- package/.claude/commands/migration-plan.md +478 -0
- package/.claude/commands/route-research-for-testing.md +37 -0
- package/.claude/commands/security-review.md +66 -0
- package/.claude/hooks/CONFIG.md +448 -0
- package/.claude/hooks/README.md +163 -0
- package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
- package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
- package/.claude/hooks/add-skill-activation-banners.ts +132 -0
- package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
- package/.claude/hooks/error-handling-reminder.sh +12 -0
- package/.claude/hooks/error-handling-reminder.ts +222 -0
- package/.claude/hooks/k8s-manifest-validator.sh +56 -0
- package/.claude/hooks/package-lock.json +556 -0
- package/.claude/hooks/package.json +16 -0
- package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
- package/.claude/hooks/post-tool-use-tracker.sh +183 -0
- package/.claude/hooks/security-policy-check.sh +247 -0
- package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
- package/.claude/hooks/skill-activation-prompt.sh +10 -0
- package/.claude/hooks/skill-activation-prompt.ts +141 -0
- package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
- package/.claude/hooks/terraform-validator.sh +53 -0
- package/.claude/hooks/test-input.json +7 -0
- package/.claude/hooks/test-skill-activation.ts +427 -0
- package/.claude/hooks/trigger-build-resolver.sh +79 -0
- package/.claude/hooks/tsc-check.sh +173 -0
- package/.claude/hooks/tsconfig.json +19 -0
- package/.claude/settings.json +59 -0
- package/.claude/settings.local.json +36 -14
- package/.claude/skills/README.md +507 -0
- package/.claude/skills/api-engineering/SKILL.md +63 -0
- package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
- package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
- package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
- package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
- package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
- package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
- package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
- package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
- package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
- package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
- package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
- package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
- package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
- package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
- package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
- package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
- package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
- package/.claude/skills/build-engineering/SKILL.md +431 -0
- package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
- package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
- package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
- package/.claude/skills/build-engineering/resources/build-security.md +95 -0
- package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
- package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
- package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
- package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
- package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
- package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
- package/.claude/skills/cloud-engineering/SKILL.md +675 -0
- package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
- package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
- package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
- package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
- package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
- package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
- package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
- package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
- package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
- package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
- package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
- package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
- package/.claude/skills/cybersecurity/SKILL.md +409 -0
- package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
- package/.claude/skills/database-engineering/SKILL.md +61 -0
- package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
- package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
- package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
- package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
- package/.claude/skills/devsecops/SKILL.md +374 -0
- package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
- package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
- package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
- package/.claude/skills/devsecops/resources/container-security.md +915 -0
- package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
- package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
- package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
- package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
- package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
- package/.claude/skills/devsecops/resources/security-testing.md +203 -0
- package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
- package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
- package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
- package/.claude/skills/documentation-as-code/SKILL.md +323 -0
- package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
- package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
- package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
- package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
- package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
- package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
- package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
- package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
- package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
- package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
- package/.claude/skills/engineering-management/SKILL.md +356 -0
- package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
- package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
- package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
- package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
- package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
- package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
- package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
- package/.claude/skills/error-tracking/SKILL.md +379 -0
- package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
- package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
- package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
- package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
- package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
- package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
- package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
- package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
- package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
- package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
- package/.claude/skills/general-it-engineering/SKILL.md +393 -0
- package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
- package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
- package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
- package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
- package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
- package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
- package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
- package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
- package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
- package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
- package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
- package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
- package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
- package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
- package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
- package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
- package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
- package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
- package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
- package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
- package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
- package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
- package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
- package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
- package/.claude/skills/network-engineering/SKILL.md +385 -0
- package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
- package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
- package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
- package/.claude/skills/network-engineering/resources/network-security.md +921 -0
- package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
- package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
- package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
- package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
- package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
- package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
- package/.claude/skills/observability-engineering/SKILL.md +101 -0
- package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
- package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
- package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
- package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
- package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
- package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
- package/.claude/skills/platform-engineering/SKILL.md +555 -0
- package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
- package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
- package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
- package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
- package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
- package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
- package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
- package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
- package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
- package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
- package/.claude/skills/release-engineering/SKILL.md +393 -0
- package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
- package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
- package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
- package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
- package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
- package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
- package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
- package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
- package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
- package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
- package/.claude/skills/route-tester/SKILL.md +392 -0
- package/.claude/skills/skill-developer/ADVANCED.md +197 -0
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
- package/.claude/skills/skill-developer/SKILL.md +430 -0
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
- package/.claude/skills/skill-rules.json +2940 -0
- package/.claude/skills/sre/SKILL.md +464 -0
- package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
- package/.claude/skills/sre/resources/capacity-planning.md +226 -0
- package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
- package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
- package/.claude/skills/sre/resources/incident-management.md +436 -0
- package/.claude/skills/sre/resources/observability-stack.md +240 -0
- package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
- package/.claude/skills/sre/resources/performance-optimization.md +108 -0
- package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
- package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
- package/.claude/skills/sre/resources/toil-reduction.md +145 -0
- package/.claude/skills/systems-engineering/SKILL.md +648 -0
- package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
- package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
- package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
- package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
- package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
- package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
- package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
- package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
- package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
- package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
- package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
- package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
- package/.claude/skills/technical-leadership/SKILL.md +728 -0
- package/CHANGELOG.md +102 -42
- package/CLAUDE.md +284 -0
- package/README.md +315 -71
- package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
- package/backend/jest.config.js +59 -0
- package/backend/package-lock.json +6801 -0
- package/backend/package.json +24 -4
- package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
- package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -0
- package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -0
- package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -0
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/prisma/schema.prisma +103 -1
- package/backend/src/__tests__/core/DependencyService.test.js +336 -0
- package/backend/src/__tests__/core/UserService.test.js +875 -0
- package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
- package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
- package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
- package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
- package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
- package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
- package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
- package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
- package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
- package/backend/src/__tests__/secretsFilter.test.js +425 -0
- package/backend/src/__tests__/services/BotLifecycleService.test.js +416 -0
- package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
- package/backend/src/__tests__/services/CacheManager.test.js +125 -0
- package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
- package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
- package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
- package/backend/src/__tests__/setup.js +25 -0
- package/backend/src/ai/plugin-assistant-system-prompt.md +788 -0
- package/backend/src/api/middleware/auth.js +27 -0
- package/backend/src/api/middleware/botAccess.js +7 -3
- package/backend/src/api/middleware/panelApiAuth.js +135 -0
- package/backend/src/api/routes/aiAssistant.js +995 -0
- package/backend/src/api/routes/apiKeys.js +181 -0
- package/backend/src/api/routes/auth.js +669 -633
- package/backend/src/api/routes/botCommands.js +107 -0
- package/backend/src/api/routes/botGroups.js +165 -0
- package/backend/src/api/routes/botHistory.js +108 -0
- package/backend/src/api/routes/botPermissions.js +99 -0
- package/backend/src/api/routes/botStatus.js +36 -0
- package/backend/src/api/routes/botUsers.js +162 -0
- package/backend/src/api/routes/bots.js +2451 -2360
- package/backend/src/api/routes/eventGraphs.js +4 -1
- package/backend/src/api/routes/logs.js +13 -3
- package/backend/src/api/routes/panel.js +66 -66
- package/backend/src/api/routes/panelApiKeys.js +179 -0
- package/backend/src/api/routes/pluginIde.js +1715 -135
- package/backend/src/api/routes/plugins.js +376 -218
- package/backend/src/api/routes/proxies.js +130 -0
- package/backend/src/api/routes/search.js +4 -0
- package/backend/src/api/routes/servers.js +20 -3
- package/backend/src/api/routes/settings.js +5 -0
- package/backend/src/api/routes/system.js +174 -0
- package/backend/src/api/routes/traces.js +131 -0
- package/backend/src/config/debug.config.js +36 -0
- package/backend/src/container.js +82 -0
- package/backend/src/core/BotHistoryStore.js +180 -0
- package/backend/src/core/BotManager.js +149 -868
- package/backend/src/core/BotManager.old.js +1093 -0
- package/backend/src/core/BotProcess.js +850 -191
- package/backend/src/core/EventGraphManager.js +194 -198
- package/backend/src/core/GraphExecutionEngine.js +709 -57
- package/backend/src/core/MessageQueue.js +39 -12
- package/backend/src/core/NodeRegistry.js +37 -1134
- package/backend/src/core/PluginLoader.js +99 -5
- package/backend/src/core/PluginManager.js +126 -15
- package/backend/src/core/PrismaService.js +32 -0
- package/backend/src/core/TaskScheduler.js +1 -1
- package/backend/src/core/UserService.js +3 -3
- package/backend/src/core/__tests__/PrismaService.test.js +24 -0
- package/backend/src/core/commands/README.md +305 -0
- package/backend/src/core/commands/dev.js +13 -7
- package/backend/src/core/commands/ping.js +10 -4
- package/backend/src/core/commands/whois.js +63 -0
- package/backend/src/core/config/validation.js +27 -0
- package/backend/src/core/constants/graphTypes.js +21 -0
- package/backend/src/core/node-registries/actions.js +202 -0
- package/backend/src/core/node-registries/arrays.js +155 -0
- package/backend/src/core/node-registries/bot.js +23 -0
- package/backend/src/core/node-registries/data.js +290 -0
- package/backend/src/core/node-registries/debug.js +26 -0
- package/backend/src/core/node-registries/events.js +201 -0
- package/backend/src/core/node-registries/flow.js +139 -0
- package/backend/src/core/node-registries/logic.js +62 -0
- package/backend/src/core/node-registries/math.js +42 -0
- package/backend/src/core/node-registries/objects.js +98 -0
- package/backend/src/core/node-registries/strings.js +187 -0
- package/backend/src/core/node-registries/time.js +113 -0
- package/backend/src/core/node-registries/type.js +25 -0
- package/backend/src/core/node-registries/users.js +79 -0
- package/backend/src/core/nodes/{action_bot_look_at.js → actions/bot_look_at.js} +36 -36
- package/backend/src/core/nodes/{action_bot_set_variable.js → actions/bot_set_variable.js} +32 -32
- package/backend/src/core/nodes/actions/create_command.js +189 -0
- package/backend/src/core/nodes/actions/delete_command.js +92 -0
- package/backend/src/core/nodes/{action_send_log.js → actions/send_log.js} +28 -23
- package/backend/src/core/nodes/{action_send_message.js → actions/send_message.js} +32 -32
- package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
- package/backend/src/core/nodes/actions/update_command.js +133 -0
- package/backend/src/core/nodes/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/arrays/join.js +28 -0
- package/backend/src/core/nodes/{data_cast.js → data/cast.js} +10 -1
- package/backend/src/core/nodes/data/datetime_literal.js +27 -0
- package/backend/src/core/nodes/data/entity_info.js +69 -0
- package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
- package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
- package/backend/src/core/nodes/{data_get_user_field.js → data/get_user_field.js} +1 -1
- package/backend/src/core/nodes/data/type_check.js +53 -0
- package/backend/src/core/nodes/{debug_log.js → debug/log.js} +16 -16
- package/backend/src/core/nodes/{flow_branch.js → flow/branch.js} +15 -15
- package/backend/src/core/nodes/{flow_break.js → flow/break.js} +14 -14
- package/backend/src/core/nodes/flow/delay.js +43 -0
- package/backend/src/core/nodes/{flow_for_each.js → flow/for_each.js} +39 -39
- package/backend/src/core/nodes/{flow_sequence.js → flow/sequence.js} +16 -16
- package/backend/src/core/nodes/{flow_switch.js → flow/switch.js} +47 -47
- package/backend/src/core/nodes/{flow_while.js → flow/while.js} +1 -1
- package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
- package/backend/src/core/nodes/logic/not.js +22 -0
- package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
- package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +1 -1
- package/backend/src/core/nodes/strings/to_lower.js +22 -0
- package/backend/src/core/nodes/strings/to_upper.js +22 -0
- package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
- package/backend/src/core/nodes/time/add.js +33 -0
- package/backend/src/core/nodes/time/compare.js +35 -0
- package/backend/src/core/nodes/time/diff.js +29 -0
- package/backend/src/core/nodes/time/format.js +32 -0
- package/backend/src/core/nodes/time/now.js +18 -0
- package/backend/src/core/nodes/type/to_string.js +32 -0
- package/backend/src/core/nodes/{user_check_blacklist.js → users/check_blacklist.js} +37 -37
- package/backend/src/core/nodes/{user_get_groups.js → users/get_groups.js} +36 -36
- package/backend/src/core/nodes/{user_get_permissions.js → users/get_permissions.js} +36 -36
- package/backend/src/core/nodes/{user_set_blacklist.js → users/set_blacklist.js} +37 -37
- package/backend/src/core/services/BotLifecycleService.js +835 -0
- package/backend/src/core/services/BotProcessManager.js +163 -0
- package/backend/src/core/services/CacheManager.js +111 -0
- package/backend/src/core/services/CommandExecutionService.js +430 -0
- package/backend/src/core/services/DebugSessionManager.js +347 -0
- package/backend/src/core/services/GraphCollaborationManager.js +501 -0
- package/backend/src/core/services/MinecraftBotManager.js +259 -0
- package/backend/src/core/services/MinecraftViewerService.js +216 -0
- package/backend/src/core/services/ResourceMonitorService.js +90 -0
- package/backend/src/core/services/TelemetryService.js +124 -0
- package/backend/src/core/services/TraceCollectorService.js +545 -0
- package/backend/src/core/services/ValidationService.js +132 -0
- package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
- package/backend/src/core/services.js +20 -5
- package/backend/src/core/system/CommandContext.js +84 -0
- package/backend/src/core/system/RuntimeCommandRegistry.js +116 -0
- package/backend/src/core/system/Transport.js +74 -0
- package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
- package/backend/src/core/utils/jsonParser.js +18 -0
- package/backend/src/core/utils/secretsFilter.js +262 -0
- package/backend/src/core/utils/variableParser.js +89 -0
- package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
- package/backend/src/core/validation/nodeSchemas.js +112 -0
- package/backend/src/lib/prisma.js +2 -4
- package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
- package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
- package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
- package/backend/src/real-time/botApi/handlers/index.js +43 -0
- package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
- package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
- package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
- package/backend/src/real-time/botApi/index.js +40 -0
- package/backend/src/real-time/botApi/middleware.js +79 -0
- package/backend/src/real-time/botApi/utils.js +65 -0
- package/backend/src/real-time/panelNamespace.js +387 -0
- package/backend/src/real-time/presence.js +7 -2
- package/backend/src/real-time/socketHandler.js +400 -5
- package/backend/src/repositories/BaseRepository.js +43 -0
- package/backend/src/repositories/BotRepository.js +42 -0
- package/backend/src/repositories/CommandRepository.js +53 -0
- package/backend/src/repositories/EventGraphRepository.js +40 -0
- package/backend/src/repositories/GroupRepository.js +69 -0
- package/backend/src/repositories/PermissionRepository.js +48 -0
- package/backend/src/repositories/PluginRepository.js +42 -0
- package/backend/src/repositories/ServerRepository.js +27 -0
- package/backend/src/repositories/UserRepository.js +48 -0
- package/backend/src/server.js +21 -0
- package/backend/src/test-refactor.js +85 -0
- package/frontend/dist/assets/index-B1serztM.js +11210 -0
- package/frontend/dist/assets/index-t6K1u4OV.css +32 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package-lock.json +9437 -0
- package/frontend/package.json +8 -5
- package/package.json +3 -2
- 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/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/frontend/dist/assets/index-B9GedHEa.js +0 -8352
- package/frontend/dist/assets/index-zLiy9MDx.css +0 -1
- package/nul +0 -0
- /package/backend/src/core/nodes/{action_http_request.js → actions/http_request.js} +0 -0
- /package/backend/src/core/nodes/{array_add_element.js → arrays/add_element.js} +0 -0
- /package/backend/src/core/nodes/{array_contains.js → arrays/contains.js} +0 -0
- /package/backend/src/core/nodes/{array_find_index.js → arrays/find_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_by_index.js → arrays/get_by_index.js} +0 -0
- /package/backend/src/core/nodes/{array_get_random_element.js → arrays/get_random_element.js} +0 -0
- /package/backend/src/core/nodes/{array_remove_by_index.js → arrays/remove_by_index.js} +0 -0
- /package/backend/src/core/nodes/{bot_get_position.js → bot/get_position.js} +0 -0
- /package/backend/src/core/nodes/{data_array_literal.js → data/array_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_boolean_literal.js → data/boolean_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_get_argument.js → data/get_argument.js} +0 -0
- /package/backend/src/core/nodes/{data_get_bot_look.js → data/get_bot_look.js} +0 -0
- /package/backend/src/core/nodes/{data_get_entity_field.js → data/get_entity_field.js} +0 -0
- /package/backend/src/core/nodes/{data_get_server_players.js → data/get_server_players.js} +0 -0
- /package/backend/src/core/nodes/{data_get_variable.js → data/get_variable.js} +0 -0
- /package/backend/src/core/nodes/{data_length.js → data/length.js} +0 -0
- /package/backend/src/core/nodes/{data_make_object.js → data/make_object.js} +0 -0
- /package/backend/src/core/nodes/{data_number_literal.js → data/number_literal.js} +0 -0
- /package/backend/src/core/nodes/{data_string_literal.js → data/string_literal.js} +0 -0
- /package/backend/src/core/nodes/{logic_compare.js → logic/compare.js} +0 -0
- /package/backend/src/core/nodes/{logic_operation.js → logic/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_operation.js → math/operation.js} +0 -0
- /package/backend/src/core/nodes/{math_random_number.js → math/random_number.js} +0 -0
- /package/backend/src/core/nodes/{object_create.js → objects/create.js} +0 -0
- /package/backend/src/core/nodes/{object_delete.js → objects/delete.js} +0 -0
- /package/backend/src/core/nodes/{object_get.js → objects/get.js} +0 -0
- /package/backend/src/core/nodes/{object_has_key.js → objects/has_key.js} +0 -0
- /package/backend/src/core/nodes/{object_set.js → objects/set.js} +0 -0
- /package/backend/src/core/nodes/{string_concat.js → strings/concat.js} +0 -0
- /package/backend/src/core/nodes/{string_contains.js → strings/contains.js} +0 -0
- /package/backend/src/core/nodes/{string_ends_with.js → strings/ends_with.js} +0 -0
- /package/backend/src/core/nodes/{string_equals.js → strings/equals.js} +0 -0
- /package/backend/src/core/nodes/{string_length.js → strings/length.js} +0 -0
- /package/backend/src/core/nodes/{string_matches.js → strings/matches.js} +0 -0
- /package/backend/src/core/nodes/{string_split.js → strings/split.js} +0 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> ⚠️ **АХТУНГ**: ДОКУМЕНТАЦИЯ СГЕНЕРИРОВАНА @CLAUDE.
|
|
4
|
+
|
|
5
|
+
# Создание команд для BlockMine
|
|
6
|
+
|
|
7
|
+
Система команд BlockMine поддерживает две сигнатуры для handler'ов: **старую** (обратно совместимую) и **новую** (с CommandContext).
|
|
8
|
+
|
|
9
|
+
## 📋 Две сигнатуры команд
|
|
10
|
+
|
|
11
|
+
### 1️⃣ Старая сигнатура (рекомендуется для простых команд)
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
async handler(bot, typeChat, user, args) {
|
|
15
|
+
// bot - экземпляр бота
|
|
16
|
+
// typeChat - тип чата ('chat', 'clan', 'private', 'websocket', etc)
|
|
17
|
+
// user - User объект с методами (hasPermission, addGroup, etc)
|
|
18
|
+
// args - объект с аргументами команды
|
|
19
|
+
|
|
20
|
+
const message = `Привет, ${user.username}!`;
|
|
21
|
+
|
|
22
|
+
// Для WebSocket API нужно вернуть результат
|
|
23
|
+
if (typeChat === 'websocket') {
|
|
24
|
+
return message;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Для остальных отправляем в чат
|
|
28
|
+
bot.sendMessage(typeChat, message, user.username);
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### 2️⃣ Новая сигнатура (рекомендуется для универсальных команд)
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
async handler(context) {
|
|
36
|
+
// context.bot - экземпляр бота
|
|
37
|
+
// context.user - User объект с методами
|
|
38
|
+
// context.args - объект с аргументами
|
|
39
|
+
// context.transport - Transport объект
|
|
40
|
+
// context.typeChat - тип чата (для совместимости)
|
|
41
|
+
|
|
42
|
+
const message = `Привет, ${context.user.username}!`;
|
|
43
|
+
|
|
44
|
+
// context.reply() автоматически работает для всех транспортов
|
|
45
|
+
return context.reply(message);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## ✨ Автоматическое определение сигнатуры
|
|
50
|
+
|
|
51
|
+
Система **автоматически** определяет какую сигнатуру использует команда:
|
|
52
|
+
|
|
53
|
+
- **4 параметра** (`handler(bot, typeChat, user, args)`) → старая сигнатура
|
|
54
|
+
- **1 параметр** (`handler(context)`) → новая сигнатура
|
|
55
|
+
|
|
56
|
+
Вы можете использовать любую из них!
|
|
57
|
+
|
|
58
|
+
## 📖 Примеры команд
|
|
59
|
+
|
|
60
|
+
### Пример 1: Простая команда (старая сигнатура)
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
const Command = require('../system/Command');
|
|
64
|
+
|
|
65
|
+
class HelloCommand extends Command {
|
|
66
|
+
constructor() {
|
|
67
|
+
super({
|
|
68
|
+
name: 'hello',
|
|
69
|
+
description: 'Поздороваться с пользователем',
|
|
70
|
+
aliases: ['hi', 'привет'],
|
|
71
|
+
cooldown: 5,
|
|
72
|
+
permissions: 'user.say',
|
|
73
|
+
owner: 'system',
|
|
74
|
+
allowedChatTypes: ['chat', 'clan', 'private', 'websocket'],
|
|
75
|
+
args: []
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async handler(bot, typeChat, user) {
|
|
80
|
+
const message = `Привет, ${user.username}!`;
|
|
81
|
+
|
|
82
|
+
if (typeChat === 'websocket') {
|
|
83
|
+
return message;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
bot.sendMessage(typeChat, message, user.username);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = HelloCommand;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Пример 2: Команда с аргументами (старая сигнатура)
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
const Command = require('../system/Command');
|
|
97
|
+
|
|
98
|
+
class SayCommand extends Command {
|
|
99
|
+
constructor() {
|
|
100
|
+
super({
|
|
101
|
+
name: 'say',
|
|
102
|
+
description: 'Отправить сообщение от имени бота',
|
|
103
|
+
cooldown: 3,
|
|
104
|
+
permissions: 'admin.say',
|
|
105
|
+
owner: 'system',
|
|
106
|
+
allowedChatTypes: ['chat', 'clan', 'websocket'],
|
|
107
|
+
args: [
|
|
108
|
+
{
|
|
109
|
+
name: 'message',
|
|
110
|
+
type: 'greedy_string',
|
|
111
|
+
required: true,
|
|
112
|
+
description: 'Текст сообщения'
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async handler(bot, typeChat, user, { message }) {
|
|
119
|
+
if (typeChat === 'websocket') {
|
|
120
|
+
bot.sendMessage('chat', message);
|
|
121
|
+
return `Сообщение отправлено: "${message}"`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
bot.sendMessage('chat', message);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
module.exports = SayCommand;
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Пример 3: Универсальная команда (новая сигнатура)
|
|
132
|
+
|
|
133
|
+
```javascript
|
|
134
|
+
const Command = require('../system/Command');
|
|
135
|
+
|
|
136
|
+
class InfoCommand extends Command {
|
|
137
|
+
constructor() {
|
|
138
|
+
super({
|
|
139
|
+
name: 'info',
|
|
140
|
+
description: 'Информация о пользователе',
|
|
141
|
+
cooldown: 10,
|
|
142
|
+
permissions: 'user.info',
|
|
143
|
+
owner: 'system',
|
|
144
|
+
allowedChatTypes: ['chat', 'private', 'websocket'],
|
|
145
|
+
args: [
|
|
146
|
+
{
|
|
147
|
+
name: 'target',
|
|
148
|
+
type: 'string',
|
|
149
|
+
required: false,
|
|
150
|
+
description: 'Имя пользователя'
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async handler(context) {
|
|
157
|
+
const targetUsername = context.args.target || context.user.username;
|
|
158
|
+
|
|
159
|
+
// Получаем данные о пользователе
|
|
160
|
+
const targetUser = await context.bot.api.getUser(targetUsername);
|
|
161
|
+
|
|
162
|
+
const groups = targetUser.groups.map(g => g.group.name).join(', ');
|
|
163
|
+
const message = `👤 ${targetUser.username}\n📋 Группы: ${groups}`;
|
|
164
|
+
|
|
165
|
+
// Автоматически работает для всех транспортов
|
|
166
|
+
return context.reply(message);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
module.exports = InfoCommand;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Пример 4: Команда с методами User (новая сигнатура)
|
|
174
|
+
|
|
175
|
+
```javascript
|
|
176
|
+
const Command = require('../system/Command');
|
|
177
|
+
|
|
178
|
+
class PromoteCommand extends Command {
|
|
179
|
+
constructor() {
|
|
180
|
+
super({
|
|
181
|
+
name: 'promote',
|
|
182
|
+
description: 'Повысить пользователя до VIP',
|
|
183
|
+
cooldown: 0,
|
|
184
|
+
permissions: 'admin.promote',
|
|
185
|
+
owner: 'system',
|
|
186
|
+
allowedChatTypes: ['chat', 'private', 'websocket'],
|
|
187
|
+
args: [
|
|
188
|
+
{
|
|
189
|
+
name: 'username',
|
|
190
|
+
type: 'string',
|
|
191
|
+
required: true,
|
|
192
|
+
description: 'Имя пользователя'
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async handler(context) {
|
|
199
|
+
const targetUsername = context.args.username;
|
|
200
|
+
|
|
201
|
+
// Получаем полноценный User объект с методами
|
|
202
|
+
const targetUser = await context.bot.api.getUser(targetUsername);
|
|
203
|
+
|
|
204
|
+
// Используем методы User
|
|
205
|
+
if (targetUser.hasPermission('vip.*')) {
|
|
206
|
+
return context.reply(`${targetUsername} уже VIP!`);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
await targetUser.addGroup('vip');
|
|
210
|
+
return context.reply(`✅ ${targetUsername} повышен до VIP!`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
module.exports = PromoteCommand;
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 🔄 Transport и CommandContext API
|
|
218
|
+
|
|
219
|
+
### CommandContext
|
|
220
|
+
|
|
221
|
+
```javascript
|
|
222
|
+
class CommandContext {
|
|
223
|
+
bot // Экземпляр бота
|
|
224
|
+
user // User объект с методами
|
|
225
|
+
args // Объект с аргументами
|
|
226
|
+
transport // Transport объект
|
|
227
|
+
typeChat // Тип чата (для обратной совместимости)
|
|
228
|
+
|
|
229
|
+
// Методы
|
|
230
|
+
reply(message) // Отправить ответ пользователю
|
|
231
|
+
sendTo(chatType, message, recipient) // Отправить в конкретный чат
|
|
232
|
+
isWebSocket() // Проверка на WebSocket API
|
|
233
|
+
isMinecraft() // Проверка на Minecraft
|
|
234
|
+
getTransportName() // Получить название транспорта
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Transport
|
|
239
|
+
|
|
240
|
+
```javascript
|
|
241
|
+
class Transport {
|
|
242
|
+
type // 'websocket' | 'chat' | 'clan' | 'private' | 'telegram'
|
|
243
|
+
bot // Экземпляр бота
|
|
244
|
+
|
|
245
|
+
// Методы
|
|
246
|
+
send(message, recipient) // Отправить сообщение
|
|
247
|
+
isMinecraftTransport() // Проверка на Minecraft
|
|
248
|
+
isUniversal() // Проверка на универсальный транспорт
|
|
249
|
+
isAllowedFor(allowedTypes) // Проверка разрешений
|
|
250
|
+
getDisplayName() // Получить читаемое название
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## 🎯 Когда использовать какую сигнатуру?
|
|
255
|
+
|
|
256
|
+
### Используйте **старую сигнатуру** если:
|
|
257
|
+
- ✅ Команда простая и не требует сложной логики
|
|
258
|
+
- ✅ Не нужны методы User (hasPermission, addGroup, etc)
|
|
259
|
+
- ✅ Вы портируете существующие команды
|
|
260
|
+
- ✅ Команда работает только в Minecraft
|
|
261
|
+
|
|
262
|
+
### Используйте **новую сигнатуру** если:
|
|
263
|
+
- ✅ Команда должна работать везде (Minecraft, WebSocket)
|
|
264
|
+
- ✅ Нужны методы User (для управления группами, проверки прав и т.д.)
|
|
265
|
+
- ✅ Команда сложная и требует чистого кода
|
|
266
|
+
- ✅ Вы пишете новую команду с нуля
|
|
267
|
+
|
|
268
|
+
## 🚀 Будущие транспорты
|
|
269
|
+
|
|
270
|
+
Архитектура готова к добавлению новых транспортов:
|
|
271
|
+
|
|
272
|
+
- **WebSocket API** ✅ (уже работает)
|
|
273
|
+
- **Minecraft** ✅ (уже работает)
|
|
274
|
+
|
|
275
|
+
Команды с новой сигнатурой (`handler(context)`) будут **автоматически** работать во всех транспортах!
|
|
276
|
+
|
|
277
|
+
## 📝 Важные замечания
|
|
278
|
+
|
|
279
|
+
1. **User восстановление**: User объект полностью восстанавливается в child process с помощью `UserService.getUser()`, поэтому все методы класса User доступны в командах.
|
|
280
|
+
|
|
281
|
+
2. **Кэширование User**: UserService использует кэш, поэтому повторные вызовы `getUser()` не создают лишних запросов к БД.
|
|
282
|
+
|
|
283
|
+
3. **WebSocket результаты**: Для WebSocket API команды должны либо **вернуть** результат через `return`, либо вызвать `context.reply()` (в новой сигнатуре).
|
|
284
|
+
|
|
285
|
+
4. **Обратная совместимость**: Все существующие команды продолжают работать без изменений!
|
|
286
|
+
|
|
287
|
+
## 🔍 Как система определяет сигнатуру
|
|
288
|
+
|
|
289
|
+
Магия в `BotProcess.js`:
|
|
290
|
+
|
|
291
|
+
```javascript
|
|
292
|
+
// Проверяем количество параметров функции handler
|
|
293
|
+
const handlerParamCount = commandInstance.handler.length;
|
|
294
|
+
|
|
295
|
+
if (handlerParamCount === 1) {
|
|
296
|
+
// Новая сигнатура: handler(context)
|
|
297
|
+
const context = new CommandContext(bot, user, args, transport);
|
|
298
|
+
await commandInstance.handler(context);
|
|
299
|
+
} else {
|
|
300
|
+
// Старая сигнатура: handler(bot, typeChat, user, args)
|
|
301
|
+
await commandInstance.handler(bot, typeChat, user, args);
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Система **автоматически** выбирает правильный способ вызова!
|
|
@@ -14,29 +14,29 @@ class DevCommand extends Command {
|
|
|
14
14
|
cooldown: 10,
|
|
15
15
|
permissions: 'user.say',
|
|
16
16
|
owner: 'system',
|
|
17
|
-
allowedChatTypes: ['chat', 'local', 'clan', 'private'],
|
|
17
|
+
allowedChatTypes: ['chat', 'local', 'clan', 'private', 'websocket'],
|
|
18
18
|
args: []
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// Переопределяем метод для кастомного сообщения при отсутствии прав
|
|
23
23
|
onInsufficientPermissions(bot, typeChat, user) {
|
|
24
|
-
bot.
|
|
24
|
+
bot.sendMessage(typeChat, `${user.username}, у вас нет прав для этой команды.`, user.username);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// Переопределяем метод для неправильного типа чата
|
|
28
28
|
onWrongChatType(bot, typeChat, user) {
|
|
29
|
-
bot.
|
|
29
|
+
bot.sendMessage('private', `${user.username}, команду dev нельзя использовать в чате типа "${typeChat}"`, user.username);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
// Переопределяем метод для кулдауна
|
|
33
33
|
onCooldown(bot, typeChat, user, timeLeft) {
|
|
34
|
-
bot.
|
|
34
|
+
bot.sendMessage(typeChat, `${user.username}, подождите еще ${timeLeft} секунд перед повторным использованием команды.`, user.username);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
// Переопределяем метод для черного списка (по умолчанию ничего не отправляется)
|
|
38
38
|
onBlacklisted(bot, typeChat, user) {
|
|
39
|
-
bot.
|
|
39
|
+
bot.sendMessage(typeChat, `${user.username}, вы находитесь в черном списке.`, user.username);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
async handler(bot, typeChat, user) {
|
|
@@ -52,14 +52,20 @@ class DevCommand extends Command {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
const enabledPluginsCount = bot.config.plugins.length;
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
const uniqueCommands = new Set();
|
|
57
57
|
for (const command of bot.commands.values()) {
|
|
58
58
|
uniqueCommands.add(command.name);
|
|
59
59
|
}
|
|
60
60
|
const totalCommandsCount = uniqueCommands.size;
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
const message = `Бот создан с помощью - BlockMine. Версия: v${appVersion}. Активных плагинов: ${enabledPluginsCount}. Всего команд: ${totalCommandsCount}`;
|
|
63
|
+
|
|
64
|
+
if (typeChat === 'websocket') {
|
|
65
|
+
return message;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
bot.sendMessage(typeChat, message, user.username);
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
|
|
@@ -9,7 +9,7 @@ class PingCommand extends Command {
|
|
|
9
9
|
cooldown: 5,
|
|
10
10
|
permissions: 'user.ping',
|
|
11
11
|
owner: 'system',
|
|
12
|
-
allowedChatTypes: ['local', 'clan', 'private'],
|
|
12
|
+
allowedChatTypes: ['local', 'clan', 'private', 'websocket'],
|
|
13
13
|
|
|
14
14
|
args: [
|
|
15
15
|
{
|
|
@@ -23,12 +23,18 @@ class PingCommand extends Command {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
async handler(bot, typeChat, user, { target }) {
|
|
26
|
-
|
|
26
|
+
let message;
|
|
27
27
|
if (target) {
|
|
28
|
-
|
|
28
|
+
message = `Понг, ${user.username}! Пингую игрока ${target}.`;
|
|
29
29
|
} else {
|
|
30
|
-
|
|
30
|
+
message = `Понг, ${user.username}!`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (typeChat === 'websocket') {
|
|
34
|
+
return message;
|
|
31
35
|
}
|
|
36
|
+
|
|
37
|
+
bot.sendMessage(typeChat, message, user.username);
|
|
32
38
|
}
|
|
33
39
|
}
|
|
34
40
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const Command = require('../system/Command');
|
|
2
|
+
|
|
3
|
+
class WhoisCommand extends Command {
|
|
4
|
+
constructor() {
|
|
5
|
+
super({
|
|
6
|
+
name: 'whois',
|
|
7
|
+
description: 'Показывает информацию о пользователе',
|
|
8
|
+
aliases: ['userinfo', 'кто'],
|
|
9
|
+
cooldown: 5,
|
|
10
|
+
permissions: 'user.whois',
|
|
11
|
+
owner: 'system',
|
|
12
|
+
allowedChatTypes: ['chat', 'local', 'clan', 'private', 'websocket'],
|
|
13
|
+
args: [
|
|
14
|
+
{
|
|
15
|
+
name: 'username',
|
|
16
|
+
type: 'string',
|
|
17
|
+
required: false,
|
|
18
|
+
description: 'Имя пользователя (по умолчанию - вы)'
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async handler(context) {
|
|
25
|
+
const targetUsername = context.args.username || context.user.username;
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
const targetUser = await context.getUser(targetUsername);
|
|
29
|
+
|
|
30
|
+
// Получаем список групп
|
|
31
|
+
const groups = targetUser.groups
|
|
32
|
+
.map(ug => ug.group.name)
|
|
33
|
+
.join(', ') || 'Нет групп';
|
|
34
|
+
|
|
35
|
+
// Статус
|
|
36
|
+
const status = targetUser.isBlacklisted ? '⛔ В черном списке' : '✅ Не в чс';
|
|
37
|
+
|
|
38
|
+
// Форматируем вывод в зависимости от транспорта
|
|
39
|
+
let message;
|
|
40
|
+
|
|
41
|
+
if (context.isWebSocket()) {
|
|
42
|
+
// Для WebSocket API возвращаем структурированные данные
|
|
43
|
+
message = {
|
|
44
|
+
username: targetUser.username,
|
|
45
|
+
isOwner: targetUser.isOwner,
|
|
46
|
+
isBlacklisted: targetUser.isBlacklisted,
|
|
47
|
+
groups: targetUser.groups.map(ug => ug.group.name),
|
|
48
|
+
status: status
|
|
49
|
+
};
|
|
50
|
+
} else {
|
|
51
|
+
message = `${targetUser.username} | Группы: ${groups} | ${status}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return context.reply(message);
|
|
55
|
+
|
|
56
|
+
} catch (error) {
|
|
57
|
+
const errorMsg = `❌ Ошибка: ${error.message}`;
|
|
58
|
+
return context.reply(errorMsg);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = WhoisCommand;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Конфигурация для валидации
|
|
3
|
+
*
|
|
4
|
+
* Строгая валидация (выброс исключений) включена в dev/test окружениях
|
|
5
|
+
* В production валидация тоже выполняется, но только логирует ошибки
|
|
6
|
+
* вместо выброса исключений для предотвращения полного падения
|
|
7
|
+
*/
|
|
8
|
+
const VALIDATION_ENABLED = true;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Строгий режим валидации - выбрасывать исключения при ошибках
|
|
12
|
+
* В production отключен для graceful degradation
|
|
13
|
+
*/
|
|
14
|
+
const VALIDATION_STRICT_MODE = process.env.NODE_ENV !== 'production';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Максимальная глубина рекурсии для операций обхода графа
|
|
18
|
+
* Предотвращает бесконечные циклы в циклических структурах графа
|
|
19
|
+
* Значение 100 выбрано как норм лимит для типичной глубины графов
|
|
20
|
+
*/
|
|
21
|
+
const MAX_RECURSION_DEPTH = 100;
|
|
22
|
+
|
|
23
|
+
module.exports = {
|
|
24
|
+
VALIDATION_ENABLED,
|
|
25
|
+
VALIDATION_STRICT_MODE,
|
|
26
|
+
MAX_RECURSION_DEPTH,
|
|
27
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Константы для типов графов
|
|
3
|
+
* Используются для фильтрации доступных нод в зависимости от контекста
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @typedef {('all'|'command'|'event')} GraphType
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const GRAPH_TYPES = {
|
|
11
|
+
/** Нода доступна во всех типах графов */
|
|
12
|
+
ALL: 'all',
|
|
13
|
+
/** Нода доступна только в графах команд */
|
|
14
|
+
COMMAND: 'command',
|
|
15
|
+
/** Нода доступна только в графах событий */
|
|
16
|
+
EVENT: 'event',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
GRAPH_TYPES,
|
|
21
|
+
};
|