blockmine 1.20.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 +28 -3
- 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 -39
- 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 -850
- package/backend/src/core/BreakLoopSignal.js +8 -0
- package/backend/src/core/EventGraphManager.js +280 -193
- package/backend/src/core/GraphExecutionEngine.js +321 -928
- package/backend/src/core/MessageQueue.js +27 -6
- package/backend/src/core/NodeRegistry.js +37 -991
- 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/actions/bot_look_at.js +36 -0
- package/backend/src/core/nodes/actions/bot_set_variable.js +32 -0
- package/backend/src/core/nodes/actions/http_request.js +98 -0
- package/backend/src/core/nodes/actions/send_log.js +28 -0
- package/backend/src/core/nodes/actions/send_message.js +32 -0
- package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
- package/backend/src/core/nodes/arrays/add_element.js +23 -0
- package/backend/src/core/nodes/arrays/contains.js +40 -0
- package/backend/src/core/nodes/arrays/find_index.js +23 -0
- package/backend/src/core/nodes/arrays/get_by_index.js +23 -0
- package/backend/src/core/nodes/arrays/get_next.js +35 -0
- package/backend/src/core/nodes/arrays/get_random_element.js +32 -0
- package/backend/src/core/nodes/arrays/remove_by_index.js +30 -0
- package/backend/src/core/nodes/bot/get_position.js +20 -0
- package/backend/src/core/nodes/data/array_literal.js +31 -0
- package/backend/src/core/nodes/data/boolean_literal.js +21 -0
- package/backend/src/core/nodes/data/cast.js +42 -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_argument.js +23 -0
- package/backend/src/core/nodes/data/get_bot_look.js +14 -0
- package/backend/src/core/nodes/data/get_entity_field.js +18 -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_server_players.js +18 -0
- package/backend/src/core/nodes/data/get_user_field.js +40 -0
- package/backend/src/core/nodes/data/get_variable.js +23 -0
- package/backend/src/core/nodes/data/length.js +25 -0
- package/backend/src/core/nodes/data/make_object.js +31 -0
- package/backend/src/core/nodes/data/number_literal.js +21 -0
- package/backend/src/core/nodes/data/string_literal.js +34 -0
- package/backend/src/core/nodes/data/type_check.js +53 -0
- package/backend/src/core/nodes/debug/log.js +16 -0
- package/backend/src/core/nodes/flow/branch.js +15 -0
- package/backend/src/core/nodes/flow/break.js +14 -0
- package/backend/src/core/nodes/flow/delay.js +43 -0
- package/backend/src/core/nodes/flow/for_each.js +39 -0
- package/backend/src/core/nodes/flow/sequence.js +16 -0
- package/backend/src/core/nodes/flow/switch.js +47 -0
- package/backend/src/core/nodes/flow/while.js +64 -0
- package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
- package/backend/src/core/nodes/logic/compare.js +33 -0
- package/backend/src/core/nodes/logic/operation.js +35 -0
- package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
- package/backend/src/core/nodes/math/operation.js +31 -0
- package/backend/src/core/nodes/math/random_number.js +43 -0
- package/backend/src/core/nodes/objects/create.js +40 -0
- package/backend/src/core/nodes/objects/delete.js +26 -0
- package/backend/src/core/nodes/objects/get.js +23 -0
- package/backend/src/core/nodes/objects/has_key.js +30 -0
- package/backend/src/core/nodes/objects/set.js +27 -0
- package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
- package/backend/src/core/nodes/strings/concat.js +27 -0
- package/backend/src/core/nodes/strings/contains.js +41 -0
- package/backend/src/core/nodes/strings/ends_with.js +43 -0
- package/backend/src/core/nodes/strings/equals.js +36 -0
- package/backend/src/core/nodes/strings/length.js +36 -0
- package/backend/src/core/nodes/strings/matches.js +39 -0
- package/backend/src/core/nodes/strings/split.js +37 -0
- package/backend/src/core/nodes/strings/starts_with.js +43 -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/users/check_blacklist.js +37 -0
- package/backend/src/core/nodes/users/get_groups.js +36 -0
- package/backend/src/core/nodes/users/get_permissions.js +36 -0
- package/backend/src/core/nodes/users/set_blacklist.js +37 -0
- 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 +1 -5
- package/package.json +2 -1
- package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
- package/frontend/dist/assets/index-CMMutadc.js +0 -8352
- package/nul +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const BreakLoopSignal = require('../../BreakLoopSignal');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
5
|
+
* @param {object} context - Контекст выполнения графа.
|
|
6
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
7
|
+
*/
|
|
8
|
+
async function execute(node, context, helpers) {
|
|
9
|
+
throw new BreakLoopSignal();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
execute,
|
|
14
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Узел задержки выполнения.
|
|
3
|
+
*
|
|
4
|
+
* Логика:
|
|
5
|
+
* - Ждет указанное количество миллисекунд.
|
|
6
|
+
* - После ожидания продолжает выполнение по выходу exec.
|
|
7
|
+
*
|
|
8
|
+
* Использование в графе:
|
|
9
|
+
* - Вход exec подключается от предыдущего действия.
|
|
10
|
+
* - Вход delay (Number) можно задать константой или подать с другого узла.
|
|
11
|
+
* - Выход exec соединяется с следующим действием.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
16
|
+
* @param {object} context - Контекст выполнения графа.
|
|
17
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
18
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
19
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
20
|
+
*/
|
|
21
|
+
async function execute(node, context, helpers) {
|
|
22
|
+
const { resolvePinValue, traverse } = helpers;
|
|
23
|
+
|
|
24
|
+
// Значение задержки в миллисекундах.
|
|
25
|
+
// Можно задать как data.delay в ноде, либо через входной пин delay.
|
|
26
|
+
let delayMs = await resolvePinValue(node, 'delay', node.data?.delay ?? 0);
|
|
27
|
+
|
|
28
|
+
// Нормализуем значение
|
|
29
|
+
delayMs = Number(delayMs);
|
|
30
|
+
if (!Number.isFinite(delayMs) || delayMs < 0) {
|
|
31
|
+
delayMs = 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (delayMs > 0) {
|
|
35
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
await traverse(node, 'exec');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = {
|
|
42
|
+
execute,
|
|
43
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const BreakLoopSignal = require('../../BreakLoopSignal');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
5
|
+
* @param {object} context - Контекст выполнения графа.
|
|
6
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
7
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
|
|
8
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
9
|
+
* @param {Map} helpers.memo - Карта для мемоизации значений в рамках одного выполнения графа.
|
|
10
|
+
* @param {function} helpers.clearLoopBodyMemo - Функция для очистки мемоизации внутри тела цикла.
|
|
11
|
+
*/
|
|
12
|
+
async function execute(node, context, helpers) {
|
|
13
|
+
const { resolvePinValue, traverse, memo, clearLoopBodyMemo } = helpers;
|
|
14
|
+
|
|
15
|
+
const array = await resolvePinValue(node, 'array', []);
|
|
16
|
+
if (Array.isArray(array)) {
|
|
17
|
+
try {
|
|
18
|
+
for (let i = 0; i < array.length; i++) {
|
|
19
|
+
const element = array[i];
|
|
20
|
+
memo.set(`${node.id}:element`, element);
|
|
21
|
+
memo.set(`${node.id}:index`, i);
|
|
22
|
+
clearLoopBodyMemo(node);
|
|
23
|
+
await traverse(node, 'loop_body');
|
|
24
|
+
}
|
|
25
|
+
} catch (e) {
|
|
26
|
+
if (e instanceof BreakLoopSignal) {
|
|
27
|
+
// Цикл был прерван узлом Break, это ожидаемое поведение.
|
|
28
|
+
} else {
|
|
29
|
+
// Перебрасываем другие, неожиданные ошибки.
|
|
30
|
+
throw e;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
await traverse(node, 'completed');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = {
|
|
38
|
+
execute,
|
|
39
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {object} context - Контекст выполнения графа.
|
|
4
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
5
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
6
|
+
*/
|
|
7
|
+
async function execute(node, context, helpers) {
|
|
8
|
+
const pinCount = node.data?.pinCount || 2;
|
|
9
|
+
for (let i = 0; i < pinCount; i++) {
|
|
10
|
+
await helpers.traverse(node, `exec_${i}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports = {
|
|
15
|
+
execute,
|
|
16
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
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 value = await resolvePinValue(node, 'value');
|
|
12
|
+
const caseCount = node.data?.caseCount || 0;
|
|
13
|
+
let matched = false;
|
|
14
|
+
|
|
15
|
+
for (let i = 0; i < caseCount; i++) {
|
|
16
|
+
const caseValue = node.data?.[`case_${i}`];
|
|
17
|
+
if (caseValue !== undefined) {
|
|
18
|
+
let isMatch = false;
|
|
19
|
+
|
|
20
|
+
if (Array.isArray(value) && Array.isArray(caseValue)) {
|
|
21
|
+
isMatch = JSON.stringify(value) === JSON.stringify(caseValue);
|
|
22
|
+
} else if (typeof value === 'object' && typeof caseValue === 'object' && value !== null && caseValue !== null) {
|
|
23
|
+
isMatch = JSON.stringify(value) === JSON.stringify(caseValue);
|
|
24
|
+
} else if (typeof value === 'number' && typeof caseValue === 'number') {
|
|
25
|
+
isMatch = value === caseValue;
|
|
26
|
+
} else if (typeof value === 'boolean' && typeof caseValue === 'boolean') {
|
|
27
|
+
isMatch = value === caseValue;
|
|
28
|
+
} else {
|
|
29
|
+
isMatch = String(value) === String(caseValue);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (isMatch) {
|
|
33
|
+
await traverse(node, `case_${i}`);
|
|
34
|
+
matched = true;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!matched) {
|
|
41
|
+
await traverse(node, 'default');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
module.exports = {
|
|
46
|
+
execute,
|
|
47
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const BreakLoopSignal = require('../../BreakLoopSignal');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
5
|
+
* @param {object} context - Контекст выполнения графа.
|
|
6
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
7
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
8
|
+
* @param {function} helpers.traverse - Функция для перехода к следующему узлу.
|
|
9
|
+
* @param {function} helpers.clearLoopBodyMemo - Функция для очистки мемоизации тела цикла.
|
|
10
|
+
* @param {Map} helpers.memo - Map для хранения мемоизированных значений.
|
|
11
|
+
*/
|
|
12
|
+
async function execute(node, context, helpers) {
|
|
13
|
+
const { resolvePinValue, traverse, clearLoopBodyMemo, memo } = helpers;
|
|
14
|
+
|
|
15
|
+
let iteration = 0;
|
|
16
|
+
const maxIterations = 1000;
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
while (iteration < maxIterations) {
|
|
20
|
+
const condition = await resolvePinValue(node, 'condition', false);
|
|
21
|
+
if (!condition) break;
|
|
22
|
+
|
|
23
|
+
memo.set(`${node.id}:iteration`, iteration);
|
|
24
|
+
clearLoopBodyMemo(node);
|
|
25
|
+
await traverse(node, 'loop_body');
|
|
26
|
+
iteration++;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (iteration >= maxIterations) {
|
|
30
|
+
console.warn(`[GraphExecutionEngine] Цикл while достиг максимального количества итераций (${maxIterations})`);
|
|
31
|
+
}
|
|
32
|
+
} catch (e) {
|
|
33
|
+
if (e instanceof BreakLoopSignal) {
|
|
34
|
+
// Прерывание цикла - это нормально
|
|
35
|
+
} else {
|
|
36
|
+
throw e;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await traverse(node, 'completed');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
45
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
46
|
+
* @param {object} context - Контекст выполнения графа.
|
|
47
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
48
|
+
* @param {Map} helpers.memo - Map для хранения мемоизированных значений.
|
|
49
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
50
|
+
*/
|
|
51
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
52
|
+
const { memo } = helpers;
|
|
53
|
+
|
|
54
|
+
if (pinId === 'iteration') {
|
|
55
|
+
return memo.get(`${node.id}:iteration`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = {
|
|
62
|
+
execute,
|
|
63
|
+
evaluate,
|
|
64
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
describe('logic:compare node', () => {
|
|
2
|
+
const logicCompare = require('../compare');
|
|
3
|
+
|
|
4
|
+
const mockHelpers = (aValue, bValue) => ({
|
|
5
|
+
resolvePinValue: jest.fn(async (node, pinId) => {
|
|
6
|
+
if (pinId === 'a') return aValue;
|
|
7
|
+
if (pinId === 'b') return bValue;
|
|
8
|
+
return null;
|
|
9
|
+
}),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should compare greater than', async () => {
|
|
13
|
+
const node = { id: 'test', data: { operation: '>' } };
|
|
14
|
+
const helpers = mockHelpers(10, 5);
|
|
15
|
+
|
|
16
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
17
|
+
|
|
18
|
+
expect(result).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should compare less than', async () => {
|
|
22
|
+
const node = { id: 'test', data: { operation: '<' } };
|
|
23
|
+
const helpers = mockHelpers(5, 10);
|
|
24
|
+
|
|
25
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
26
|
+
|
|
27
|
+
expect(result).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should compare equals', async () => {
|
|
31
|
+
const node = { id: 'test', data: { operation: '==' } };
|
|
32
|
+
const helpers = mockHelpers(10, 10);
|
|
33
|
+
|
|
34
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
35
|
+
|
|
36
|
+
expect(result).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should compare not equals', async () => {
|
|
40
|
+
const node = { id: 'test', data: { operation: '!=' } };
|
|
41
|
+
const helpers = mockHelpers(10, 5);
|
|
42
|
+
|
|
43
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
44
|
+
|
|
45
|
+
expect(result).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should compare greater or equal', async () => {
|
|
49
|
+
const node = { id: 'test', data: { operation: '>=' } };
|
|
50
|
+
const helpers = mockHelpers(10, 10);
|
|
51
|
+
|
|
52
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
53
|
+
|
|
54
|
+
expect(result).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should compare less or equal', async () => {
|
|
58
|
+
const node = { id: 'test', data: { operation: '<=' } };
|
|
59
|
+
const helpers = mockHelpers(5, 10);
|
|
60
|
+
|
|
61
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
62
|
+
|
|
63
|
+
expect(result).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should handle string comparison', async () => {
|
|
67
|
+
const node = { id: 'test', data: { operation: '<' } };
|
|
68
|
+
const helpers = mockHelpers('apple', 'banana');
|
|
69
|
+
|
|
70
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
71
|
+
|
|
72
|
+
expect(result).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should default to equals if no operation specified', async () => {
|
|
76
|
+
const node = { id: 'test', data: {} };
|
|
77
|
+
const helpers = mockHelpers(5, 5);
|
|
78
|
+
|
|
79
|
+
const result = await logicCompare.evaluate(node, 'result', {}, helpers);
|
|
80
|
+
|
|
81
|
+
expect(result).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'result') {
|
|
13
|
+
const op = node.data?.operation || '==';
|
|
14
|
+
const valA = await resolvePinValue(node, 'a');
|
|
15
|
+
const valB = await resolvePinValue(node, 'b');
|
|
16
|
+
|
|
17
|
+
switch (op) {
|
|
18
|
+
case '==': return valA == valB;
|
|
19
|
+
case '!=': return valA != valB;
|
|
20
|
+
case '>': return valA > valB;
|
|
21
|
+
case '<': return valA < valB;
|
|
22
|
+
case '>=': return valA >= valB;
|
|
23
|
+
case '<=': return valA <= valB;
|
|
24
|
+
default: return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = {
|
|
32
|
+
evaluate,
|
|
33
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'result') {
|
|
13
|
+
const op = node.data?.operation || 'AND';
|
|
14
|
+
const inputs = [];
|
|
15
|
+
const pinCount = node.data?.pinCount || 2;
|
|
16
|
+
|
|
17
|
+
for (let i = 0; i < pinCount; i++) {
|
|
18
|
+
const value = await resolvePinValue(node, `pin_${i}`, false);
|
|
19
|
+
inputs.push(value);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
switch (op) {
|
|
23
|
+
case 'AND': return inputs.every(Boolean);
|
|
24
|
+
case 'OR': return inputs.some(Boolean);
|
|
25
|
+
case 'NOT': return !inputs[0];
|
|
26
|
+
default: return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = {
|
|
34
|
+
evaluate,
|
|
35
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
describe('math:operation node', () => {
|
|
2
|
+
const mathOperation = require('../operation');
|
|
3
|
+
|
|
4
|
+
const mockHelpers = (aValue, bValue) => ({
|
|
5
|
+
resolvePinValue: jest.fn(async (node, pinId, defaultValue) => {
|
|
6
|
+
if (pinId === 'a') return aValue;
|
|
7
|
+
if (pinId === 'b') return bValue;
|
|
8
|
+
return defaultValue;
|
|
9
|
+
}),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should add two numbers', async () => {
|
|
13
|
+
const node = { id: 'test', data: { operation: '+' } };
|
|
14
|
+
const helpers = mockHelpers(5, 3);
|
|
15
|
+
|
|
16
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
17
|
+
|
|
18
|
+
expect(result).toBe(8);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should subtract two numbers', async () => {
|
|
22
|
+
const node = { id: 'test', data: { operation: '-' } };
|
|
23
|
+
const helpers = mockHelpers(10, 3);
|
|
24
|
+
|
|
25
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
26
|
+
|
|
27
|
+
expect(result).toBe(7);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should multiply two numbers', async () => {
|
|
31
|
+
const node = { id: 'test', data: { operation: '*' } };
|
|
32
|
+
const helpers = mockHelpers(4, 5);
|
|
33
|
+
|
|
34
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
35
|
+
|
|
36
|
+
expect(result).toBe(20);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should divide two numbers', async () => {
|
|
40
|
+
const node = { id: 'test', data: { operation: '/' } };
|
|
41
|
+
const helpers = mockHelpers(20, 4);
|
|
42
|
+
|
|
43
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
44
|
+
|
|
45
|
+
expect(result).toBe(5);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should handle division by zero', async () => {
|
|
49
|
+
const node = { id: 'test', data: { operation: '/' } };
|
|
50
|
+
const helpers = mockHelpers(10, 0);
|
|
51
|
+
|
|
52
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
53
|
+
|
|
54
|
+
expect(result).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should default to addition if operation not specified', async () => {
|
|
58
|
+
const node = { id: 'test', data: {} };
|
|
59
|
+
const helpers = mockHelpers(5, 3);
|
|
60
|
+
|
|
61
|
+
const result = await mathOperation.evaluate(node, 'result', {}, helpers);
|
|
62
|
+
|
|
63
|
+
expect(result).toBe(8);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'result') {
|
|
13
|
+
const op = node.data?.operation || '+';
|
|
14
|
+
const a = Number(await resolvePinValue(node, 'a', 0));
|
|
15
|
+
const b = Number(await resolvePinValue(node, 'b', 0));
|
|
16
|
+
|
|
17
|
+
switch (op) {
|
|
18
|
+
case '+': return a + b;
|
|
19
|
+
case '-': return a - b;
|
|
20
|
+
case '*': return a * b;
|
|
21
|
+
case '/': return b !== 0 ? a / b : 0;
|
|
22
|
+
default: return 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
evaluate,
|
|
31
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'result') {
|
|
13
|
+
const minRaw = await resolvePinValue(node, 'min', node.data.min ?? '0');
|
|
14
|
+
const maxRaw = await resolvePinValue(node, 'max', node.data.max ?? '1');
|
|
15
|
+
|
|
16
|
+
const minStr = String(minRaw);
|
|
17
|
+
const maxStr = String(maxRaw);
|
|
18
|
+
|
|
19
|
+
const min = parseFloat(minStr.replace(',', '.'));
|
|
20
|
+
const max = parseFloat(maxStr.replace(',', '.'));
|
|
21
|
+
|
|
22
|
+
if (isNaN(min) || isNaN(max)) {
|
|
23
|
+
return NaN;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const produceFloat = minStr.includes('.') || minStr.includes(',') || !Number.isInteger(min) ||
|
|
27
|
+
maxStr.includes('.') || maxStr.includes(',') || !Number.isInteger(max);
|
|
28
|
+
|
|
29
|
+
if (produceFloat) {
|
|
30
|
+
return Math.random() * (max - min) + min;
|
|
31
|
+
} else {
|
|
32
|
+
const minInt = Math.ceil(min);
|
|
33
|
+
const maxInt = Math.floor(max);
|
|
34
|
+
return Math.floor(Math.random() * (maxInt - minInt + 1)) + minInt;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = {
|
|
42
|
+
evaluate,
|
|
43
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'object') {
|
|
13
|
+
if (node.data?.advanced) {
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(node.data.jsonValue || '{}');
|
|
16
|
+
} catch (e) {
|
|
17
|
+
console.error('Ошибка парсинга JSON в object:create:', e);
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
const numPins = node.data?.pinCount || 0;
|
|
22
|
+
const obj = {};
|
|
23
|
+
|
|
24
|
+
for (let i = 0; i < numPins; i++) {
|
|
25
|
+
const key = node.data[`key_${i}`];
|
|
26
|
+
if (key) {
|
|
27
|
+
obj[key] = await resolvePinValue(node, `value_${i}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = {
|
|
39
|
+
evaluate,
|
|
40
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'new_object') {
|
|
13
|
+
const obj = await resolvePinValue(node, 'object', {});
|
|
14
|
+
const key = await resolvePinValue(node, 'key', '');
|
|
15
|
+
|
|
16
|
+
const newObj = { ...obj };
|
|
17
|
+
delete newObj[key];
|
|
18
|
+
return newObj;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
evaluate,
|
|
26
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
8
|
+
*/
|
|
9
|
+
async function evaluate(node, pinId, context, helpers, defaultValue = null) {
|
|
10
|
+
const { resolvePinValue } = helpers;
|
|
11
|
+
|
|
12
|
+
if (pinId === 'value') {
|
|
13
|
+
const obj = await resolvePinValue(node, 'object', {});
|
|
14
|
+
const key = await resolvePinValue(node, 'key', '');
|
|
15
|
+
return obj[key] ?? defaultValue;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = {
|
|
22
|
+
evaluate,
|
|
23
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {object} node - Экземпляр узла из графа.
|
|
3
|
+
* @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
|
|
4
|
+
* @param {object} context - Контекст выполнения графа.
|
|
5
|
+
* @param {object} helpers - Вспомогательные функции движка.
|
|
6
|
+
* @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
|
|
7
|
+
* @param {Map} helpers.memo - Map для хранения мемоизированных значений.
|
|
8
|
+
* @returns {Promise<any>} - Вычисленное значение для выходного пина.
|
|
9
|
+
*/
|
|
10
|
+
async function evaluate(node, pinId, context, helpers) {
|
|
11
|
+
const { resolvePinValue, memo } = helpers;
|
|
12
|
+
|
|
13
|
+
const obj = await resolvePinValue(node, 'object', {});
|
|
14
|
+
const key = await resolvePinValue(node, 'key', '');
|
|
15
|
+
const exists = obj.hasOwnProperty(key);
|
|
16
|
+
|
|
17
|
+
memo.set(`${node.id}:value`, exists ? obj[key] : null);
|
|
18
|
+
|
|
19
|
+
if (pinId === 'result') {
|
|
20
|
+
return exists;
|
|
21
|
+
} else if (pinId === 'value') {
|
|
22
|
+
return memo.get(`${node.id}:value`);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = {
|
|
29
|
+
evaluate,
|
|
30
|
+
};
|