blockmine 1.21.0 → 1.22.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 +55 -0
- package/.claude/settings.local.json +27 -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 +90 -54
- package/README.md +94 -0
- package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
- package/backend/jest.config.js +59 -0
- package/backend/package-lock.json +6129 -0
- package/backend/package.json +16 -4
- package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
- package/backend/prisma/schema.prisma +33 -0
- 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 +411 -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/api/routes/apiKeys.js +181 -0
- package/backend/src/api/routes/bots.js +49 -7
- package/backend/src/api/routes/plugins.js +2 -1
- package/backend/src/api/routes/system.js +174 -0
- package/backend/src/container.js +82 -0
- package/backend/src/core/BotManager.js +142 -871
- package/backend/src/core/BotManager.old.js +1093 -0
- package/backend/src/core/BotProcess.js +1092 -858
- package/backend/src/core/EventGraphManager.js +280 -198
- package/backend/src/core/GraphExecutionEngine.js +321 -325
- package/backend/src/core/MessageQueue.js +27 -6
- package/backend/src/core/NodeRegistry.js +37 -1134
- package/backend/src/core/PluginManager.js +62 -12
- package/backend/src/core/PrismaService.js +32 -0
- 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 +132 -0
- package/backend/src/core/node-registries/arrays.js +137 -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 +187 -0
- package/backend/src/core/node-registries/flow.js +139 -0
- package/backend/src/core/node-registries/logic.js +45 -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 +153 -0
- package/backend/src/core/node-registries/time.js +113 -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/{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/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/{data_cast.js → data/cast.js} +8 -0
- 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/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -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/{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 +596 -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 +351 -0
- package/backend/src/core/services/ResourceMonitorService.js +90 -0
- package/backend/src/core/services/TelemetryService.js +124 -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/Transport.js +78 -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 +54 -0
- package/backend/src/real-time/socketHandler.js +6 -2
- 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 +3 -0
- package/backend/src/test-refactor.js +85 -0
- package/frontend/dist/assets/index-CfTo92bP.css +1 -0
- package/frontend/dist/assets/index-CiFD5X9Z.js +8344 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +0 -5
- package/package.json +2 -1
- 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
- /package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const { GRAPH_TYPES } = require('../constants/graphTypes');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Регистрация нод категории "Время"
|
|
5
|
+
*/
|
|
6
|
+
function registerNodes(registry) {
|
|
7
|
+
registry.registerNodeType({
|
|
8
|
+
type: 'time:datetime_literal',
|
|
9
|
+
label: '📅 Дата и время',
|
|
10
|
+
category: 'Время',
|
|
11
|
+
description: 'Создает объект даты и времени из строки. Если строка пустая, вернет текущее время.',
|
|
12
|
+
graphType: GRAPH_TYPES.ALL,
|
|
13
|
+
evaluator: require('../nodes/data/datetime_literal').evaluate,
|
|
14
|
+
pins: {
|
|
15
|
+
inputs: [
|
|
16
|
+
{ id: 'date', name: 'Дата (строка)', type: 'String', required: false }
|
|
17
|
+
],
|
|
18
|
+
outputs: [
|
|
19
|
+
{ id: 'value', name: 'Дата', type: 'DateTime' }
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
registry.registerNodeType({
|
|
25
|
+
type: 'time:now',
|
|
26
|
+
label: '⏰ Текущее время',
|
|
27
|
+
category: 'Время',
|
|
28
|
+
description: 'Возвращает текущую дату и время.',
|
|
29
|
+
graphType: GRAPH_TYPES.ALL,
|
|
30
|
+
evaluator: require('../nodes/time/now').evaluate,
|
|
31
|
+
pins: {
|
|
32
|
+
inputs: [],
|
|
33
|
+
outputs: [
|
|
34
|
+
{ id: 'now', name: 'Сейчас', type: 'DateTime' }
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
registry.registerNodeType({
|
|
40
|
+
type: 'time:format',
|
|
41
|
+
label: '📝 Отформатировать дату',
|
|
42
|
+
category: 'Время',
|
|
43
|
+
description: 'Форматирует дату в строку. Формат по-умолчанию: yyyy-MM-dd HH:mm:ss',
|
|
44
|
+
graphType: GRAPH_TYPES.ALL,
|
|
45
|
+
evaluator: require('../nodes/time/format').evaluate,
|
|
46
|
+
pins: {
|
|
47
|
+
inputs: [
|
|
48
|
+
{ id: 'date', name: 'Дата', type: 'DateTime', required: true },
|
|
49
|
+
{ id: 'format', name: 'Формат', type: 'String', required: false }
|
|
50
|
+
],
|
|
51
|
+
outputs: [
|
|
52
|
+
{ id: 'formatted', name: 'Строка', type: 'String' }
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
registry.registerNodeType({
|
|
58
|
+
type: 'time:add',
|
|
59
|
+
label: '➕ Прибавить время',
|
|
60
|
+
category: 'Время',
|
|
61
|
+
description: 'Добавляет к дате указанный промежуток времени. Пример объекта продолжительности: { "seconds": 5, "minutes": 1 }',
|
|
62
|
+
graphType: GRAPH_TYPES.ALL,
|
|
63
|
+
evaluator: require('../nodes/time/add').evaluate,
|
|
64
|
+
pins: {
|
|
65
|
+
inputs: [
|
|
66
|
+
{ id: 'date', name: 'Дата', type: 'DateTime', required: true },
|
|
67
|
+
{ id: 'duration', name: 'Продолжительность (объект)', type: 'Object', required: true }
|
|
68
|
+
],
|
|
69
|
+
outputs: [
|
|
70
|
+
{ id: 'result', name: 'Новая дата', type: 'DateTime' }
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
registry.registerNodeType({
|
|
76
|
+
type: 'time:diff',
|
|
77
|
+
label: '↔️ Разница во времени',
|
|
78
|
+
category: 'Время',
|
|
79
|
+
description: 'Вычисляет разницу между двумя датами в миллисекундах (Дата А - Дата Б).',
|
|
80
|
+
graphType: GRAPH_TYPES.ALL,
|
|
81
|
+
evaluator: require('../nodes/time/diff').evaluate,
|
|
82
|
+
pins: {
|
|
83
|
+
inputs: [
|
|
84
|
+
{ id: 'date_left', name: 'Дата А', type: 'DateTime', required: true },
|
|
85
|
+
{ id: 'date_right', name: 'Дата Б', type: 'DateTime', required: true }
|
|
86
|
+
],
|
|
87
|
+
outputs: [
|
|
88
|
+
{ id: 'diff', name: 'Разница (мс)', type: 'Number' }
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
registry.registerNodeType({
|
|
94
|
+
type: 'time:compare',
|
|
95
|
+
label: '⚖️ Сравнить даты',
|
|
96
|
+
category: 'Время',
|
|
97
|
+
description: 'Сравнивает две даты.',
|
|
98
|
+
graphType: GRAPH_TYPES.ALL,
|
|
99
|
+
evaluator: require('../nodes/time/compare').evaluate,
|
|
100
|
+
pins: {
|
|
101
|
+
inputs: [
|
|
102
|
+
{ id: 'date_left', name: 'Дата А', type: 'DateTime', required: true },
|
|
103
|
+
{ id: 'date_right', name: 'Дата Б', type: 'DateTime', required: true },
|
|
104
|
+
{ id: 'operation', name: 'Операция', type: 'String', required: false }
|
|
105
|
+
],
|
|
106
|
+
outputs: [
|
|
107
|
+
{ id: 'result', name: 'Результат', type: 'Boolean' }
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = { registerNodes };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const { GRAPH_TYPES } = require('../constants/graphTypes');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Регистрация нод категории "Пользователи"
|
|
5
|
+
*/
|
|
6
|
+
function registerNodes(registry) {
|
|
7
|
+
registry.registerNodeType({
|
|
8
|
+
type: 'user:check_blacklist',
|
|
9
|
+
label: '❓ В черном списке?',
|
|
10
|
+
category: 'Пользователи',
|
|
11
|
+
description: 'Проверяет, находится ли пользователь в черном списке.',
|
|
12
|
+
graphType: GRAPH_TYPES.ALL,
|
|
13
|
+
evaluator: require('../nodes/users/check_blacklist').evaluate,
|
|
14
|
+
pins: {
|
|
15
|
+
inputs: [
|
|
16
|
+
{ id: 'user', name: 'Пользователь', type: 'User', required: true }
|
|
17
|
+
],
|
|
18
|
+
outputs: [
|
|
19
|
+
{ id: 'is_blacklisted', name: 'В ЧС', type: 'Boolean' }
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
registry.registerNodeType({
|
|
25
|
+
type: 'user:set_blacklist',
|
|
26
|
+
label: '🚫 Установить ЧС',
|
|
27
|
+
category: 'Пользователи',
|
|
28
|
+
description: 'Добавляет или убирает пользователя из черного списка.',
|
|
29
|
+
graphType: GRAPH_TYPES.ALL,
|
|
30
|
+
executor: require('../nodes/users/set_blacklist').execute,
|
|
31
|
+
pins: {
|
|
32
|
+
inputs: [
|
|
33
|
+
{ id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
|
|
34
|
+
{ id: 'user', name: 'Пользователь', type: 'User', required: true },
|
|
35
|
+
{ id: 'blacklist_status', name: 'Статус ЧС', type: 'Boolean', required: true }
|
|
36
|
+
],
|
|
37
|
+
outputs: [
|
|
38
|
+
{ id: 'exec', name: 'Далее', type: 'Exec' },
|
|
39
|
+
{ id: 'updated_user', name: 'Обновленный пользователь', type: 'User' }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
registry.registerNodeType({
|
|
45
|
+
type: 'user:get_groups',
|
|
46
|
+
label: '👥 Получить группы',
|
|
47
|
+
category: 'Пользователи',
|
|
48
|
+
description: 'Возвращает массив названий групп, в которых состоит пользователь.',
|
|
49
|
+
graphType: GRAPH_TYPES.ALL,
|
|
50
|
+
evaluator: require('../nodes/users/get_groups').evaluate,
|
|
51
|
+
pins: {
|
|
52
|
+
inputs: [
|
|
53
|
+
{ id: 'user', name: 'Пользователь', type: 'User', required: true }
|
|
54
|
+
],
|
|
55
|
+
outputs: [
|
|
56
|
+
{ id: 'groups', name: 'Группы', type: 'Array' }
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
registry.registerNodeType({
|
|
62
|
+
type: 'user:get_permissions',
|
|
63
|
+
label: '🔑 Получить права',
|
|
64
|
+
category: 'Пользователи',
|
|
65
|
+
description: 'Возвращает массив прав пользователя.',
|
|
66
|
+
graphType: GRAPH_TYPES.ALL,
|
|
67
|
+
evaluator: require('../nodes/users/get_permissions').evaluate,
|
|
68
|
+
pins: {
|
|
69
|
+
inputs: [
|
|
70
|
+
{ id: 'user', name: 'Пользователь', type: 'User', required: true }
|
|
71
|
+
],
|
|
72
|
+
outputs: [
|
|
73
|
+
{ id: 'permissions', name: 'Права', type: 'Array' }
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
module.exports = { registerNodes };
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
-
* @param {object} context - Контекст выполнения графа.
|
|
4
|
-
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
-
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
-
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
-
*/
|
|
8
|
-
async function execute(node, context, helpers) {
|
|
9
|
-
const { resolvePinValue, traverse } = helpers;
|
|
10
|
-
|
|
11
|
-
const target = await resolvePinValue(node, 'target');
|
|
12
|
-
const yOffset = await resolvePinValue(node, 'add_y', 0);
|
|
13
|
-
|
|
14
|
-
if (target && context.bot?.lookAt) {
|
|
15
|
-
let finalPosition;
|
|
16
|
-
// Если цель - это сущность, у которой есть позиция
|
|
17
|
-
if (target.position) {
|
|
18
|
-
finalPosition = { ...target.position };
|
|
19
|
-
}
|
|
20
|
-
// Если цель - это объект с координатами
|
|
21
|
-
else if (target.x !== undefined && target.y !== undefined && target.z !== undefined) {
|
|
22
|
-
finalPosition = { ...target };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (finalPosition) {
|
|
26
|
-
finalPosition.y += Number(yOffset || 0);
|
|
27
|
-
context.bot.lookAt(finalPosition);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
await traverse(node, 'exec');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
module.exports = {
|
|
35
|
-
execute,
|
|
36
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {object} context - Контекст выполнения графа.
|
|
4
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
+
*/
|
|
8
|
+
async function execute(node, context, helpers) {
|
|
9
|
+
const { resolvePinValue, traverse } = helpers;
|
|
10
|
+
|
|
11
|
+
const target = await resolvePinValue(node, 'target');
|
|
12
|
+
const yOffset = await resolvePinValue(node, 'add_y', 0);
|
|
13
|
+
|
|
14
|
+
if (target && context.bot?.lookAt) {
|
|
15
|
+
let finalPosition;
|
|
16
|
+
// Если цель - это сущность, у которой есть позиция
|
|
17
|
+
if (target.position) {
|
|
18
|
+
finalPosition = { ...target.position };
|
|
19
|
+
}
|
|
20
|
+
// Если цель - это объект с координатами
|
|
21
|
+
else if (target.x !== undefined && target.y !== undefined && target.z !== undefined) {
|
|
22
|
+
finalPosition = { ...target };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (finalPosition) {
|
|
26
|
+
finalPosition.y += Number(yOffset || 0);
|
|
27
|
+
context.bot.lookAt(finalPosition);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
await traverse(node, 'exec');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = {
|
|
35
|
+
execute,
|
|
36
|
+
};
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
-
* @param {object} context - Контекст выполнения графа.
|
|
4
|
-
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
-
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
-
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
-
*/
|
|
8
|
-
async function execute(node, context, helpers) {
|
|
9
|
-
const { resolvePinValue, traverse } = helpers;
|
|
10
|
-
|
|
11
|
-
const varName = await resolvePinValue(node, 'name', '');
|
|
12
|
-
const varValue = await resolvePinValue(node, 'value');
|
|
13
|
-
let shouldPersist = await resolvePinValue(node, 'persist', false);
|
|
14
|
-
|
|
15
|
-
// В графах команд принудительно отключаем сохранение в БД, чтобы избежать случайных записей
|
|
16
|
-
if (context.eventType === 'command') {
|
|
17
|
-
shouldPersist = false;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (varName) {
|
|
21
|
-
context.variables[varName] = varValue;
|
|
22
|
-
if (context.persistenceIntent) {
|
|
23
|
-
context.persistenceIntent.set(varName, shouldPersist);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
await traverse(node, 'exec');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
module.exports = {
|
|
31
|
-
execute,
|
|
32
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {object} context - Контекст выполнения графа.
|
|
4
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
+
*/
|
|
8
|
+
async function execute(node, context, helpers) {
|
|
9
|
+
const { resolvePinValue, traverse } = helpers;
|
|
10
|
+
|
|
11
|
+
const varName = await resolvePinValue(node, 'name', '');
|
|
12
|
+
const varValue = await resolvePinValue(node, 'value');
|
|
13
|
+
let shouldPersist = await resolvePinValue(node, 'persist', false);
|
|
14
|
+
|
|
15
|
+
// В графах команд принудительно отключаем сохранение в БД, чтобы избежать случайных записей
|
|
16
|
+
if (context.eventType === 'command') {
|
|
17
|
+
shouldPersist = false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (varName) {
|
|
21
|
+
context.variables[varName] = varValue;
|
|
22
|
+
if (context.persistenceIntent) {
|
|
23
|
+
context.persistenceIntent.set(varName, shouldPersist);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
await traverse(node, 'exec');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
execute,
|
|
32
|
+
};
|
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
-
* @param {object} context - Контекст выполнения графа.
|
|
4
|
-
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
-
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
-
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
-
*/
|
|
8
|
-
async function execute(node, context, helpers) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
if (
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {object} context - Контекст выполнения графа.
|
|
4
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
+
*/
|
|
8
|
+
async function execute(node, context, helpers) {
|
|
9
|
+
let message = await helpers.resolvePinValue(node, 'message', '');
|
|
10
|
+
|
|
11
|
+
// Если сообщение - это объект или массив, форматируем как JSON
|
|
12
|
+
if (typeof message === 'object' && message !== null) {
|
|
13
|
+
message = JSON.stringify(message, null, 2);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (context?.bot?.sendLog) {
|
|
17
|
+
context.bot.sendLog(`[Graph] ${message}`);
|
|
18
|
+
} else {
|
|
19
|
+
// Fallback - консоль терминала
|
|
20
|
+
console.log(`[Graph Log] ${message}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
await helpers.traverse(node, 'exec');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
module.exports = {
|
|
27
|
+
execute,
|
|
28
|
+
};
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
-
* @param {object} context - Контекст выполнения графа.
|
|
4
|
-
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
-
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
-
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
-
*/
|
|
8
|
-
async function execute(node, context, helpers) {
|
|
9
|
-
const { resolvePinValue, traverse } = helpers;
|
|
10
|
-
|
|
11
|
-
let message = String(await resolvePinValue(node, 'message', ''));
|
|
12
|
-
const chatType = await resolvePinValue(node, 'chat_type', context.typeChat);
|
|
13
|
-
const recipient = await resolvePinValue(node, 'recipient', context.user?.username);
|
|
14
|
-
|
|
15
|
-
// Парсим и заменяем переменные в формате {varName}
|
|
16
|
-
const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
|
|
17
|
-
const matches = [...message.matchAll(variablePattern)];
|
|
18
|
-
|
|
19
|
-
for (const match of matches) {
|
|
20
|
-
const varName = match[1];
|
|
21
|
-
// Для динамических пинов, созданных на фронтенде, значение нужно будет получить, используя resolvePinValue
|
|
22
|
-
const varValue = await resolvePinValue(node, `var_${varName}`, '');
|
|
23
|
-
message = message.replace(match[0], String(varValue));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
context.bot.sendMessage(chatType, message, recipient);
|
|
27
|
-
await traverse(node, 'exec');
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
module.exports = {
|
|
31
|
-
execute,
|
|
32
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {object} context - Контекст выполнения графа.
|
|
4
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
6
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
7
|
+
*/
|
|
8
|
+
async function execute(node, context, helpers) {
|
|
9
|
+
const { resolvePinValue, traverse } = helpers;
|
|
10
|
+
|
|
11
|
+
let message = String(await resolvePinValue(node, 'message', ''));
|
|
12
|
+
const chatType = await resolvePinValue(node, 'chat_type', context.typeChat);
|
|
13
|
+
const recipient = await resolvePinValue(node, 'recipient', context.user?.username);
|
|
14
|
+
|
|
15
|
+
// Парсим и заменяем переменные в формате {varName}
|
|
16
|
+
const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
|
|
17
|
+
const matches = [...message.matchAll(variablePattern)];
|
|
18
|
+
|
|
19
|
+
for (const match of matches) {
|
|
20
|
+
const varName = match[1];
|
|
21
|
+
// Для динамических пинов, созданных на фронтенде, значение нужно будет получить, используя resolvePinValue
|
|
22
|
+
const varValue = await resolvePinValue(node, `var_${varName}`, '');
|
|
23
|
+
message = message.replace(match[0], String(varValue));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
context.bot.sendMessage(chatType, message, recipient);
|
|
27
|
+
await traverse(node, 'exec');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
execute,
|
|
32
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Нода: Отправить ответ в WebSocket
|
|
3
|
+
* Отправляет данные обратно клиенту, вызвавшему граф через WebSocket API
|
|
4
|
+
*
|
|
5
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
6
|
+
* @param {object} context - Контекст выполнения графа.
|
|
7
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
8
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
9
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
10
|
+
*/
|
|
11
|
+
async function execute(node, context, helpers) {
|
|
12
|
+
const data = await helpers.resolvePinValue(node, 'data', null);
|
|
13
|
+
|
|
14
|
+
// Проверяем, что граф был вызван через WebSocket API
|
|
15
|
+
if (!context.sendResponse || typeof context.sendResponse !== 'function') {
|
|
16
|
+
console.warn('[WebSocket Response] Нода может использоваться только в графах, вызванных через WebSocket API');
|
|
17
|
+
await helpers.traverse(node, 'exec');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Отправляем ответ клиенту
|
|
22
|
+
try {
|
|
23
|
+
context.sendResponse(data);
|
|
24
|
+
console.log('[WebSocket Response] Ответ отправлен клиенту:', data);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
console.error('[WebSocket Response] Ошибка отправки ответа:', error);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Продолжаем выполнение графа
|
|
30
|
+
await helpers.traverse(node, 'exec');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { execute };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Получает следующий элемент массива по текущему индексу
|
|
3
|
+
*/
|
|
4
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
5
|
+
const { resolvePinValue } = helpers;
|
|
6
|
+
const arr = await resolvePinValue(node, 'array', []);
|
|
7
|
+
const currentIndex = await resolvePinValue(node, 'current_index', -1);
|
|
8
|
+
|
|
9
|
+
const nextIndex = currentIndex + 1;
|
|
10
|
+
const hasNext = Array.isArray(arr) && nextIndex >= 0 && nextIndex < arr.length;
|
|
11
|
+
|
|
12
|
+
switch (pinId) {
|
|
13
|
+
case 'next_element':
|
|
14
|
+
return hasNext ? arr[nextIndex] : null;
|
|
15
|
+
|
|
16
|
+
case 'next_index':
|
|
17
|
+
return nextIndex;
|
|
18
|
+
|
|
19
|
+
case 'has_next':
|
|
20
|
+
return hasNext;
|
|
21
|
+
|
|
22
|
+
default:
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
module.exports = {
|
|
28
|
+
evaluate,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
@@ -15,6 +15,14 @@ async function evaluate(node, pinId, context, helpers) {
|
|
|
15
15
|
|
|
16
16
|
switch (targetType) {
|
|
17
17
|
case 'String':
|
|
18
|
+
// Для объектов и массивов используем JSON.stringify
|
|
19
|
+
if (typeof value === 'object' && value !== null) {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.stringify(value);
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return String(value ?? '');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
18
26
|
return String(value ?? '');
|
|
19
27
|
case 'Number':
|
|
20
28
|
const num = Number(value);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node
|
|
3
|
+
* @param {string} pinId
|
|
4
|
+
* @param {object} context
|
|
5
|
+
* @param {object} helpers
|
|
6
|
+
* @returns {Promise<any>}
|
|
7
|
+
*/
|
|
8
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
9
|
+
const { resolvePinValue } = helpers;
|
|
10
|
+
|
|
11
|
+
if (pinId === 'value') {
|
|
12
|
+
const dateString = await resolvePinValue(node, 'date', '');
|
|
13
|
+
if (dateString) {
|
|
14
|
+
const date = new Date(dateString);
|
|
15
|
+
if (!isNaN(date.getTime())) {
|
|
16
|
+
return date;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return new Date();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = {
|
|
26
|
+
evaluate,
|
|
27
|
+
};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Нода для извлечения информации из объекта существа
|
|
3
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
4
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
5
|
+
* @param {object} context - Контекст выполнения графа.
|
|
6
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
7
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
8
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
9
|
+
*/
|
|
10
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
11
|
+
const { resolvePinValue } = helpers;
|
|
12
|
+
|
|
13
|
+
// Получаем объект существа из входного пина
|
|
14
|
+
const entity = await resolvePinValue(node, 'entity');
|
|
15
|
+
|
|
16
|
+
if (!entity) {
|
|
17
|
+
// Возвращаем значения по умолчанию если существо не передано
|
|
18
|
+
if (pinId === 'type') return null;
|
|
19
|
+
if (pinId === 'username') return null;
|
|
20
|
+
if (pinId === 'distance') return null;
|
|
21
|
+
if (pinId === 'position') return null;
|
|
22
|
+
if (pinId === 'id') return null;
|
|
23
|
+
if (pinId === 'isPlayer') return false;
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Возвращаем нужное поле в зависимости от запрошенного выходного пина
|
|
28
|
+
switch (pinId) {
|
|
29
|
+
case 'type':
|
|
30
|
+
return entity.type || 'unknown';
|
|
31
|
+
|
|
32
|
+
case 'username':
|
|
33
|
+
// Для игроков - username, для остальных - displayName или type
|
|
34
|
+
return entity.username || entity.displayName || entity.type || 'unknown';
|
|
35
|
+
|
|
36
|
+
case 'distance':
|
|
37
|
+
// Вычисляем расстояние от бота до существа
|
|
38
|
+
if (entity.position && context.bot?.entity?.position) {
|
|
39
|
+
const botPos = context.bot.entity.position;
|
|
40
|
+
const entityPos = entity.position;
|
|
41
|
+
|
|
42
|
+
const dx = entityPos.x - botPos.x;
|
|
43
|
+
const dy = entityPos.y - botPos.y;
|
|
44
|
+
const dz = entityPos.z - botPos.z;
|
|
45
|
+
const distance = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
46
|
+
|
|
47
|
+
// Округляем до 2 знаков после запятой
|
|
48
|
+
return Math.round(distance * 100) / 100;
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
|
|
52
|
+
case 'position':
|
|
53
|
+
return entity.position || null;
|
|
54
|
+
|
|
55
|
+
case 'id':
|
|
56
|
+
return entity.id || null;
|
|
57
|
+
|
|
58
|
+
case 'isPlayer':
|
|
59
|
+
return entity.type === 'player';
|
|
60
|
+
|
|
61
|
+
default:
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
module.exports = {
|
|
67
|
+
evaluate,
|
|
68
|
+
};
|
|
69
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Нода для получения списка существ рядом с ботом
|
|
3
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
4
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
5
|
+
* @param {object} context - Контекст выполнения графа.
|
|
6
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
7
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
8
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
9
|
+
*/
|
|
10
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
11
|
+
const { resolvePinValue } = helpers;
|
|
12
|
+
|
|
13
|
+
if (pinId === 'entities') {
|
|
14
|
+
// Получаем радиус из входного пина (по умолчанию 32 блока)
|
|
15
|
+
const radius = await resolvePinValue(node, 'radius', 32);
|
|
16
|
+
|
|
17
|
+
// Получаем список существ через botApi
|
|
18
|
+
if (context.bot && context.bot.getNearbyEntities) {
|
|
19
|
+
const entities = await context.bot.getNearbyEntities(null, radius);
|
|
20
|
+
return entities || [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
evaluate,
|
|
31
|
+
};
|
|
32
|
+
|