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.
Files changed (434) hide show
  1. package/.claude/agents/README.md +469 -0
  2. package/.claude/agents/auth-route-debugger.md +118 -0
  3. package/.claude/agents/auth-route-tester.md +93 -0
  4. package/.claude/agents/auto-error-resolver.md +97 -0
  5. package/.claude/agents/build-optimizer.md +236 -0
  6. package/.claude/agents/code-architecture-reviewer.md +83 -0
  7. package/.claude/agents/code-refactor-master.md +94 -0
  8. package/.claude/agents/cost-optimizer.md +134 -0
  9. package/.claude/agents/deployment-orchestrator.md +113 -0
  10. package/.claude/agents/documentation-architect.md +82 -0
  11. package/.claude/agents/frontend-error-fixer.md +77 -0
  12. package/.claude/agents/iac-code-generator.md +71 -0
  13. package/.claude/agents/incident-responder.md +346 -0
  14. package/.claude/agents/infrastructure-architect.md +31 -0
  15. package/.claude/agents/kubernetes-specialist.md +56 -0
  16. package/.claude/agents/migration-planner.md +181 -0
  17. package/.claude/agents/network-architect.md +196 -0
  18. package/.claude/agents/plan-reviewer.md +52 -0
  19. package/.claude/agents/refactor-planner.md +63 -0
  20. package/.claude/agents/security-scanner.md +102 -0
  21. package/.claude/agents/web-research-specialist.md +78 -0
  22. package/.claude/commands/cost-analysis.md +315 -0
  23. package/.claude/commands/dev-docs-update.md +55 -0
  24. package/.claude/commands/dev-docs.md +51 -0
  25. package/.claude/commands/incident-debug.md +247 -0
  26. package/.claude/commands/infra-plan.md +81 -0
  27. package/.claude/commands/migration-plan.md +478 -0
  28. package/.claude/commands/route-research-for-testing.md +37 -0
  29. package/.claude/commands/security-review.md +66 -0
  30. package/.claude/hooks/CONFIG.md +448 -0
  31. package/.claude/hooks/README.md +163 -0
  32. package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
  33. package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
  34. package/.claude/hooks/add-skill-activation-banners.ts +132 -0
  35. package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
  36. package/.claude/hooks/error-handling-reminder.sh +12 -0
  37. package/.claude/hooks/error-handling-reminder.ts +222 -0
  38. package/.claude/hooks/k8s-manifest-validator.sh +56 -0
  39. package/.claude/hooks/package-lock.json +556 -0
  40. package/.claude/hooks/package.json +16 -0
  41. package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
  42. package/.claude/hooks/post-tool-use-tracker.sh +183 -0
  43. package/.claude/hooks/security-policy-check.sh +247 -0
  44. package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
  45. package/.claude/hooks/skill-activation-prompt.sh +10 -0
  46. package/.claude/hooks/skill-activation-prompt.ts +141 -0
  47. package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
  48. package/.claude/hooks/terraform-validator.sh +53 -0
  49. package/.claude/hooks/test-input.json +7 -0
  50. package/.claude/hooks/test-skill-activation.ts +427 -0
  51. package/.claude/hooks/trigger-build-resolver.sh +79 -0
  52. package/.claude/hooks/tsc-check.sh +173 -0
  53. package/.claude/hooks/tsconfig.json +19 -0
  54. package/.claude/settings.json +55 -0
  55. package/.claude/settings.local.json +28 -3
  56. package/.claude/skills/README.md +507 -0
  57. package/.claude/skills/api-engineering/SKILL.md +63 -0
  58. package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
  59. package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
  60. package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
  61. package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
  62. package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
  63. package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
  64. package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
  65. package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
  66. package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
  67. package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
  68. package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
  69. package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
  70. package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
  71. package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
  72. package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
  73. package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
  74. package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
  75. package/.claude/skills/build-engineering/SKILL.md +431 -0
  76. package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
  77. package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
  78. package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
  79. package/.claude/skills/build-engineering/resources/build-security.md +95 -0
  80. package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
  81. package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
  82. package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
  83. package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
  84. package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
  85. package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
  86. package/.claude/skills/cloud-engineering/SKILL.md +675 -0
  87. package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
  88. package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
  89. package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
  90. package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
  91. package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
  92. package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
  93. package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
  94. package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
  95. package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
  96. package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
  97. package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
  98. package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
  99. package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
  100. package/.claude/skills/cybersecurity/SKILL.md +409 -0
  101. package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
  102. package/.claude/skills/database-engineering/SKILL.md +61 -0
  103. package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
  104. package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
  105. package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
  106. package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
  107. package/.claude/skills/devsecops/SKILL.md +374 -0
  108. package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
  109. package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
  110. package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
  111. package/.claude/skills/devsecops/resources/container-security.md +915 -0
  112. package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
  113. package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
  114. package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
  115. package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
  116. package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
  117. package/.claude/skills/devsecops/resources/security-testing.md +203 -0
  118. package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
  119. package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
  120. package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
  121. package/.claude/skills/documentation-as-code/SKILL.md +323 -0
  122. package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
  123. package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
  124. package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
  125. package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
  126. package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
  127. package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
  128. package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
  129. package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
  130. package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
  131. package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
  132. package/.claude/skills/engineering-management/SKILL.md +356 -0
  133. package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
  134. package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
  135. package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
  136. package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
  137. package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
  138. package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
  139. package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
  140. package/.claude/skills/error-tracking/SKILL.md +379 -0
  141. package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
  142. package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
  143. package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
  144. package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
  145. package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
  146. package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
  147. package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
  148. package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
  149. package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
  150. package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
  151. package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
  152. package/.claude/skills/general-it-engineering/SKILL.md +393 -0
  153. package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
  154. package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
  155. package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
  156. package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
  157. package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
  158. package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
  159. package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
  160. package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
  161. package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
  162. package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
  163. package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
  164. package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
  165. package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
  166. package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
  167. package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
  168. package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
  169. package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
  170. package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
  171. package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
  172. package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
  173. package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
  174. package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
  175. package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
  176. package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
  177. package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
  178. package/.claude/skills/network-engineering/SKILL.md +385 -0
  179. package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
  180. package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
  181. package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
  182. package/.claude/skills/network-engineering/resources/network-security.md +921 -0
  183. package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
  184. package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
  185. package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
  186. package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
  187. package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
  188. package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
  189. package/.claude/skills/observability-engineering/SKILL.md +101 -0
  190. package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
  191. package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
  192. package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
  193. package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
  194. package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
  195. package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
  196. package/.claude/skills/platform-engineering/SKILL.md +555 -0
  197. package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
  198. package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
  199. package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
  200. package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
  201. package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
  202. package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
  203. package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
  204. package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
  205. package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
  206. package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
  207. package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
  208. package/.claude/skills/release-engineering/SKILL.md +393 -0
  209. package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
  210. package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
  211. package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
  212. package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
  213. package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
  214. package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
  215. package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
  216. package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
  217. package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
  218. package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
  219. package/.claude/skills/route-tester/SKILL.md +392 -0
  220. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  221. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  222. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  223. package/.claude/skills/skill-developer/SKILL.md +430 -0
  224. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  225. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  226. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  227. package/.claude/skills/skill-rules.json +2940 -0
  228. package/.claude/skills/sre/SKILL.md +464 -0
  229. package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
  230. package/.claude/skills/sre/resources/capacity-planning.md +226 -0
  231. package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
  232. package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
  233. package/.claude/skills/sre/resources/incident-management.md +436 -0
  234. package/.claude/skills/sre/resources/observability-stack.md +240 -0
  235. package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
  236. package/.claude/skills/sre/resources/performance-optimization.md +108 -0
  237. package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
  238. package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
  239. package/.claude/skills/sre/resources/toil-reduction.md +145 -0
  240. package/.claude/skills/systems-engineering/SKILL.md +648 -0
  241. package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
  242. package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
  243. package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
  244. package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
  245. package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
  246. package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
  247. package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
  248. package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
  249. package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
  250. package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
  251. package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
  252. package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
  253. package/.claude/skills/technical-leadership/SKILL.md +728 -0
  254. package/CHANGELOG.md +90 -39
  255. package/README.md +94 -0
  256. package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
  257. package/backend/jest.config.js +59 -0
  258. package/backend/package-lock.json +6129 -0
  259. package/backend/package.json +16 -4
  260. package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
  261. package/backend/prisma/schema.prisma +33 -0
  262. package/backend/src/__tests__/core/DependencyService.test.js +336 -0
  263. package/backend/src/__tests__/core/UserService.test.js +875 -0
  264. package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
  265. package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
  266. package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
  267. package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
  268. package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
  269. package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
  270. package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
  271. package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
  272. package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
  273. package/backend/src/__tests__/secretsFilter.test.js +425 -0
  274. package/backend/src/__tests__/services/BotLifecycleService.test.js +411 -0
  275. package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
  276. package/backend/src/__tests__/services/CacheManager.test.js +125 -0
  277. package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
  278. package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
  279. package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
  280. package/backend/src/__tests__/setup.js +25 -0
  281. package/backend/src/api/routes/apiKeys.js +181 -0
  282. package/backend/src/api/routes/bots.js +49 -7
  283. package/backend/src/api/routes/plugins.js +2 -1
  284. package/backend/src/api/routes/system.js +174 -0
  285. package/backend/src/container.js +82 -0
  286. package/backend/src/core/BotManager.js +142 -871
  287. package/backend/src/core/BotManager.old.js +1093 -0
  288. package/backend/src/core/BotProcess.js +1092 -850
  289. package/backend/src/core/BreakLoopSignal.js +8 -0
  290. package/backend/src/core/EventGraphManager.js +280 -193
  291. package/backend/src/core/GraphExecutionEngine.js +321 -928
  292. package/backend/src/core/MessageQueue.js +27 -6
  293. package/backend/src/core/NodeRegistry.js +37 -991
  294. package/backend/src/core/PluginManager.js +62 -12
  295. package/backend/src/core/PrismaService.js +32 -0
  296. package/backend/src/core/UserService.js +3 -3
  297. package/backend/src/core/__tests__/PrismaService.test.js +24 -0
  298. package/backend/src/core/commands/README.md +305 -0
  299. package/backend/src/core/commands/dev.js +13 -7
  300. package/backend/src/core/commands/ping.js +10 -4
  301. package/backend/src/core/commands/whois.js +63 -0
  302. package/backend/src/core/config/validation.js +27 -0
  303. package/backend/src/core/constants/graphTypes.js +21 -0
  304. package/backend/src/core/node-registries/actions.js +132 -0
  305. package/backend/src/core/node-registries/arrays.js +137 -0
  306. package/backend/src/core/node-registries/bot.js +23 -0
  307. package/backend/src/core/node-registries/data.js +290 -0
  308. package/backend/src/core/node-registries/debug.js +26 -0
  309. package/backend/src/core/node-registries/events.js +187 -0
  310. package/backend/src/core/node-registries/flow.js +139 -0
  311. package/backend/src/core/node-registries/logic.js +45 -0
  312. package/backend/src/core/node-registries/math.js +42 -0
  313. package/backend/src/core/node-registries/objects.js +98 -0
  314. package/backend/src/core/node-registries/strings.js +153 -0
  315. package/backend/src/core/node-registries/time.js +113 -0
  316. package/backend/src/core/node-registries/users.js +79 -0
  317. package/backend/src/core/nodes/actions/bot_look_at.js +36 -0
  318. package/backend/src/core/nodes/actions/bot_set_variable.js +32 -0
  319. package/backend/src/core/nodes/actions/http_request.js +98 -0
  320. package/backend/src/core/nodes/actions/send_log.js +28 -0
  321. package/backend/src/core/nodes/actions/send_message.js +32 -0
  322. package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
  323. package/backend/src/core/nodes/arrays/add_element.js +23 -0
  324. package/backend/src/core/nodes/arrays/contains.js +40 -0
  325. package/backend/src/core/nodes/arrays/find_index.js +23 -0
  326. package/backend/src/core/nodes/arrays/get_by_index.js +23 -0
  327. package/backend/src/core/nodes/arrays/get_next.js +35 -0
  328. package/backend/src/core/nodes/arrays/get_random_element.js +32 -0
  329. package/backend/src/core/nodes/arrays/remove_by_index.js +30 -0
  330. package/backend/src/core/nodes/bot/get_position.js +20 -0
  331. package/backend/src/core/nodes/data/array_literal.js +31 -0
  332. package/backend/src/core/nodes/data/boolean_literal.js +21 -0
  333. package/backend/src/core/nodes/data/cast.js +42 -0
  334. package/backend/src/core/nodes/data/datetime_literal.js +27 -0
  335. package/backend/src/core/nodes/data/entity_info.js +69 -0
  336. package/backend/src/core/nodes/data/get_argument.js +23 -0
  337. package/backend/src/core/nodes/data/get_bot_look.js +14 -0
  338. package/backend/src/core/nodes/data/get_entity_field.js +18 -0
  339. package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
  340. package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
  341. package/backend/src/core/nodes/data/get_server_players.js +18 -0
  342. package/backend/src/core/nodes/data/get_user_field.js +40 -0
  343. package/backend/src/core/nodes/data/get_variable.js +23 -0
  344. package/backend/src/core/nodes/data/length.js +25 -0
  345. package/backend/src/core/nodes/data/make_object.js +31 -0
  346. package/backend/src/core/nodes/data/number_literal.js +21 -0
  347. package/backend/src/core/nodes/data/string_literal.js +34 -0
  348. package/backend/src/core/nodes/data/type_check.js +53 -0
  349. package/backend/src/core/nodes/debug/log.js +16 -0
  350. package/backend/src/core/nodes/flow/branch.js +15 -0
  351. package/backend/src/core/nodes/flow/break.js +14 -0
  352. package/backend/src/core/nodes/flow/delay.js +43 -0
  353. package/backend/src/core/nodes/flow/for_each.js +39 -0
  354. package/backend/src/core/nodes/flow/sequence.js +16 -0
  355. package/backend/src/core/nodes/flow/switch.js +47 -0
  356. package/backend/src/core/nodes/flow/while.js +64 -0
  357. package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
  358. package/backend/src/core/nodes/logic/compare.js +33 -0
  359. package/backend/src/core/nodes/logic/operation.js +35 -0
  360. package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
  361. package/backend/src/core/nodes/math/operation.js +31 -0
  362. package/backend/src/core/nodes/math/random_number.js +43 -0
  363. package/backend/src/core/nodes/objects/create.js +40 -0
  364. package/backend/src/core/nodes/objects/delete.js +26 -0
  365. package/backend/src/core/nodes/objects/get.js +23 -0
  366. package/backend/src/core/nodes/objects/has_key.js +30 -0
  367. package/backend/src/core/nodes/objects/set.js +27 -0
  368. package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
  369. package/backend/src/core/nodes/strings/concat.js +27 -0
  370. package/backend/src/core/nodes/strings/contains.js +41 -0
  371. package/backend/src/core/nodes/strings/ends_with.js +43 -0
  372. package/backend/src/core/nodes/strings/equals.js +36 -0
  373. package/backend/src/core/nodes/strings/length.js +36 -0
  374. package/backend/src/core/nodes/strings/matches.js +39 -0
  375. package/backend/src/core/nodes/strings/split.js +37 -0
  376. package/backend/src/core/nodes/strings/starts_with.js +43 -0
  377. package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
  378. package/backend/src/core/nodes/time/add.js +33 -0
  379. package/backend/src/core/nodes/time/compare.js +35 -0
  380. package/backend/src/core/nodes/time/diff.js +29 -0
  381. package/backend/src/core/nodes/time/format.js +32 -0
  382. package/backend/src/core/nodes/time/now.js +18 -0
  383. package/backend/src/core/nodes/users/check_blacklist.js +37 -0
  384. package/backend/src/core/nodes/users/get_groups.js +36 -0
  385. package/backend/src/core/nodes/users/get_permissions.js +36 -0
  386. package/backend/src/core/nodes/users/set_blacklist.js +37 -0
  387. package/backend/src/core/services/BotLifecycleService.js +596 -0
  388. package/backend/src/core/services/BotProcessManager.js +163 -0
  389. package/backend/src/core/services/CacheManager.js +111 -0
  390. package/backend/src/core/services/CommandExecutionService.js +351 -0
  391. package/backend/src/core/services/ResourceMonitorService.js +90 -0
  392. package/backend/src/core/services/TelemetryService.js +124 -0
  393. package/backend/src/core/services/ValidationService.js +132 -0
  394. package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
  395. package/backend/src/core/services.js +20 -5
  396. package/backend/src/core/system/CommandContext.js +84 -0
  397. package/backend/src/core/system/Transport.js +78 -0
  398. package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
  399. package/backend/src/core/utils/jsonParser.js +18 -0
  400. package/backend/src/core/utils/secretsFilter.js +262 -0
  401. package/backend/src/core/utils/variableParser.js +89 -0
  402. package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
  403. package/backend/src/core/validation/nodeSchemas.js +112 -0
  404. package/backend/src/lib/prisma.js +2 -4
  405. package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
  406. package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
  407. package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
  408. package/backend/src/real-time/botApi/handlers/index.js +43 -0
  409. package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
  410. package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
  411. package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
  412. package/backend/src/real-time/botApi/index.js +40 -0
  413. package/backend/src/real-time/botApi/middleware.js +79 -0
  414. package/backend/src/real-time/botApi/utils.js +54 -0
  415. package/backend/src/real-time/socketHandler.js +6 -2
  416. package/backend/src/repositories/BaseRepository.js +43 -0
  417. package/backend/src/repositories/BotRepository.js +42 -0
  418. package/backend/src/repositories/CommandRepository.js +53 -0
  419. package/backend/src/repositories/EventGraphRepository.js +40 -0
  420. package/backend/src/repositories/GroupRepository.js +69 -0
  421. package/backend/src/repositories/PermissionRepository.js +48 -0
  422. package/backend/src/repositories/PluginRepository.js +42 -0
  423. package/backend/src/repositories/ServerRepository.js +27 -0
  424. package/backend/src/repositories/UserRepository.js +48 -0
  425. package/backend/src/server.js +3 -0
  426. package/backend/src/test-refactor.js +85 -0
  427. package/frontend/dist/assets/index-CfTo92bP.css +1 -0
  428. package/frontend/dist/assets/index-CiFD5X9Z.js +8344 -0
  429. package/frontend/dist/index.html +2 -2
  430. package/frontend/package.json +1 -5
  431. package/package.json +2 -1
  432. package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
  433. package/frontend/dist/assets/index-CMMutadc.js +0 -8352
  434. package/nul +0 -0
@@ -1,3 +1,6 @@
1
+ const validationService = require('./services/ValidationService');
2
+ const { GRAPH_TYPES } = require('./constants/graphTypes');
3
+
1
4
  /**
2
5
  * @typedef {object} NodePin
3
6
  * @property {string} id - Уникальный идентификатор пина (например, "exec", "data_result").
@@ -34,7 +37,12 @@ class NodeRegistry {
34
37
  if (!nodeConfig.type) {
35
38
  throw new Error('Node type is required');
36
39
  }
37
-
40
+
41
+ const validation = validationService.validateNode(nodeConfig, 'NodeRegistry');
42
+ if (validation.shouldSkip) {
43
+ return;
44
+ }
45
+
38
46
  if (this.nodes.has(nodeConfig.type)) {
39
47
  console.warn(`Node type '${nodeConfig.type}' is already registered. Overriding.`);
40
48
  }
@@ -68,7 +76,7 @@ class NodeRegistry {
68
76
  getNodesByCategory(graphType) {
69
77
  const result = {};
70
78
  for (const node of this.nodes.values()) {
71
- if (node.graphType === 'all' || node.graphType === graphType) {
79
+ if (node.graphType === GRAPH_TYPES.ALL || node.graphType === graphType) {
72
80
  if (!result[node.category]) {
73
81
  result[node.category] = [];
74
82
  }
@@ -89,1001 +97,39 @@ class NodeRegistry {
89
97
 
90
98
  /**
91
99
  * Регистрирует базовую библиотеку узлов.
100
+ * Автоматически обнаруживает и загружает все файлы из директории node-registries.
92
101
  * @private
93
102
  */
94
103
  _registerBaseNodes() {
95
- const all = 'all';
96
- const command = 'command';
97
- const event = 'event';
98
-
99
- // События
100
- this.registerNodeType({
101
- type: 'event:command',
102
- label: '▶️ При выполнении команды',
103
- category: 'События',
104
- description: 'Стартовая точка для графа команды.',
105
- graphType: 'all',
106
- pins: {
107
- inputs: [],
108
- outputs: [
109
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
110
- { id: 'command_name', name: 'Имя команды', type: 'String' },
111
- { id: 'user', name: 'Пользователь', type: 'User' },
112
- { id: 'args', name: 'Аргументы', type: 'Object' },
113
- { id: 'chat_type', name: 'Тип чата', type: 'String' }
114
- ]
115
- }
116
- });
117
-
118
- this.registerNodeType({
119
- type: 'event:chat',
120
- name: 'Событие: Сообщение в чате',
121
- label: '💬 Сообщение в чате',
122
- description: 'Срабатывает, когда в чат приходит сообщение.',
123
- category: 'События',
124
- graphType: event,
125
- isEvent: true,
126
- pins: {
127
- inputs: [],
128
- outputs: [
129
- { id: 'exec', type: 'Exec', name: 'Выполнить' },
130
- { id: 'username', type: 'String', name: 'Игрок' },
131
- { id: 'message', type: 'String', name: 'Сообщение' },
132
- { id: 'chatType', type: 'String', name: 'Тип чата' },
133
- ]
134
- }
135
- });
136
-
137
- this.registerNodeType({
138
- type: 'event:raw_message',
139
- name: 'Событие: Сырое сообщение',
140
- label: '📝 Сырое сообщение',
141
- description: 'Срабатывает при получении любого сообщения в сыром виде (до парсинга).',
142
- category: 'События',
143
- graphType: event,
144
- isEvent: true,
145
- pins: {
146
- inputs: [],
147
- outputs: [
148
- { id: 'exec', type: 'Exec', name: 'Выполнить' },
149
- { id: 'rawText', type: 'String', name: 'Сырой текст' },
150
- ]
151
- }
152
- });
153
-
154
- this.registerNodeType({
155
- type: 'event:playerJoined',
156
- label: '👋 Игрок зашел',
157
- category: 'События',
158
- description: 'Срабатывает, когда игрок заходит на сервер.',
159
- graphType: event,
160
- pins: {
161
- inputs: [],
162
- outputs: [
163
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
164
- { id: 'user', name: 'Пользователь', type: 'User' },
165
- ]
166
- }
167
- });
168
-
169
- this.registerNodeType({
170
- type: 'event:playerLeft',
171
- label: '🚪 Игрок вышел',
172
- category: 'События',
173
- description: 'Срабатывает, когда игрок покидает сервер.',
174
- graphType: event,
175
- pins: {
176
- inputs: [],
177
- outputs: [
178
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
179
- { id: 'user', name: 'Пользователь', type: 'User' },
180
- ]
181
- }
182
- });
183
-
184
- this.registerNodeType({
185
- type: 'event:entitySpawn',
186
- label: '📦 Сущность появилась',
187
- category: 'События',
188
- description: 'Вызывается, когда новая сущность появляется в поле зрения бота.',
189
- graphType: event,
190
- pins: {
191
- inputs: [],
192
- outputs: [
193
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
194
- { id: 'entity', name: 'Сущность', type: 'Object' }
195
- ]
196
- }
197
- });
198
-
199
- this.registerNodeType({
200
- type: 'event:entityMoved',
201
- label: '🧍 Сущность подвинулась',
202
- category: 'События',
203
- description: 'Вызывается, когда любая сущность перемещается.',
204
- graphType: event,
205
- pins: {
206
- inputs: [],
207
- outputs: [
208
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
209
- { id: 'entity', name: 'Сущность', type: 'Object' }
210
- ]
211
- }
212
- });
213
-
214
- this.registerNodeType({
215
- type: 'event:entityGone',
216
- label: '❌ Сущность исчезла',
217
- category: 'События',
218
- description: 'Вызывается, когда сущность пропадает из зоны видимости бота.',
219
- graphType: event,
220
- pins: {
221
- inputs: [],
222
- outputs: [
223
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
224
- { id: 'entity', name: 'Сущность', type: 'Object' }
225
- ]
226
- }
227
- });
228
-
229
- this.registerNodeType({
230
- type: 'flow:branch',
231
- label: '↔️ Ветвление (Branch)',
232
- category: 'Поток',
233
- description: 'if/else логика',
234
- graphType: all,
235
- pins: {
236
- inputs: [
237
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
238
- { id: 'condition', name: 'Условие', type: 'Boolean', required: true }
239
- ],
240
- outputs: [
241
- { id: 'exec_true', name: 'True', type: 'Exec' },
242
- { id: 'exec_false', name: 'False', type: 'Exec' }
243
- ]
244
- }
245
- });
246
-
247
- this.registerNodeType({
248
- type: 'flow:sequence',
249
- label: '⛓️ Последовательность',
250
- category: 'Поток',
251
- description: 'Выполняет действия по очереди',
252
- graphType: all,
253
- pins: {
254
- inputs: [
255
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true }
256
- ],
257
- outputs: [
258
- { id: 'exec_0', name: '0', type: 'Exec' },
259
- { id: 'exec_1', name: '1', type: 'Exec' }
260
- ]
261
- }
262
- });
263
-
264
- this.registerNodeType({
265
- type: 'flow:for_each',
266
- label: '🔁 Перебор массива (цикл)',
267
- category: 'Поток',
268
- description: 'Выполняет "Тело цикла" для каждого элемента в "Массиве".',
269
- graphType: all,
270
- pins: {
271
- inputs: [
272
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
273
- { id: 'array', name: 'Массив', type: 'Array', required: true }
274
- ],
275
- outputs: [
276
- { id: 'loop_body', name: 'Тело цикла', type: 'Exec' },
277
- { id: 'element', name: 'Элемент', type: 'Any' },
278
- { id: 'index', name: 'Индекс', type: 'Number' },
279
- { id: 'completed', name: 'Завершено', type: 'Exec' }
280
- ]
281
- }
282
- });
283
-
284
- this.registerNodeType({
285
- type: 'flow:break',
286
- label: '🛑 Выйти из цикла',
287
- category: 'Поток',
288
- description: 'Немедленно прерывает выполнение цикла (For Each Loop) и передает управление на его выход Completed.',
289
- graphType: all,
290
- pins: {
291
- inputs: [
292
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true }
293
- ],
294
- outputs: []
295
- }
296
- });
297
-
298
- this.registerNodeType({
299
- type: 'action:send_message',
300
- label: '🗣️ Отправить сообщение',
301
- category: 'Действия',
302
- description: 'Отправляет сообщение в чат. Поддерживает переменные в формате {varName}',
303
- graphType: all,
304
- dynamicPins: true,
305
- pins: {
306
- inputs: [
307
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
308
- { id: 'chat_type', name: 'Тип чата', type: 'String', required: true },
309
- { id: 'message', name: 'Сообщение', type: 'String', required: true },
310
- { id: 'recipient', name: 'Адресат', type: 'String', required: false }
311
- ],
312
- outputs: [
313
- { id: 'exec', name: 'Выполнено', type: 'Exec' }
314
- ]
315
- }
316
- });
317
-
318
- this.registerNodeType({
319
- type: 'action:send_log',
320
- label: '📝 Записать в лог (веб)',
321
- category: 'Действия',
322
- description: 'Отправляет сообщение в консоль на странице бота.',
323
- graphType: all,
324
- pins: {
325
- inputs: [
326
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
327
- { id: 'message', name: 'Сообщение', type: 'String', required: true },
328
- ],
329
- outputs: [
330
- { id: 'exec', name: 'Выполнено', type: 'Exec' },
331
- ]
332
- }
333
- });
334
-
335
- this.registerNodeType({
336
- type: 'action:bot_look_at',
337
- label: '🤖 Бот: Посмотреть на',
338
- category: 'Действия',
339
- description: 'Поворачивает голову бота в сторону координат или сущности.',
340
- graphType: all,
341
- pins: {
342
- inputs: [
343
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
344
- { id: 'target', name: 'Цель (Позиция/Сущность)', type: 'Object', required: true },
345
- { id: 'add_y', name: 'Прибавить к Y', type: 'Number', required: false }
346
- ],
347
- outputs: [
348
- { id: 'exec', name: 'Выполнено', type: 'Exec' }
349
- ]
350
- }
351
- });
352
-
353
- this.registerNodeType({
354
- type: 'action:bot_set_variable',
355
- label: '💾 Записать переменную',
356
- category: 'Действия',
357
- description: 'Сохраняет значение в переменную графа.',
358
- graphType: all,
359
- pins: {
360
- inputs: [
361
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
362
- { id: 'name', name: 'Имя', type: 'String', required: true },
363
- { id: 'value', name: 'Значение', type: 'Wildcard', required: true },
364
- { id: 'persist', name: 'Хранить в БД?', type: 'Boolean', required: false }
365
- ],
366
- outputs: [
367
- { id: 'exec', name: 'Выполнено', type: 'Exec' }
368
- ]
369
- }
370
- });
371
-
372
- this.registerNodeType({
373
- type: 'data:get_argument',
374
- label: '📥 Получить аргумент',
375
- category: 'Данные',
376
- description: 'Получает значение аргумента команды по его имени.',
377
- graphType: command,
378
- data: {
379
- argumentName: {
380
- type: 'argument',
381
- label: 'Аргумент'
104
+ const fs = require('fs');
105
+ const path = require('path');
106
+
107
+ const registriesDir = path.join(__dirname, 'node-registries');
108
+
109
+ try {
110
+ // Получаем все файлы .js из директории node-registries
111
+ const files = fs.readdirSync(registriesDir)
112
+ .filter(file => file.endsWith('.js'));
113
+
114
+ // Загружаем и регистрируем ноды из каждого файла
115
+ for (const file of files) {
116
+ try {
117
+ const registry = require(path.join(registriesDir, file));
118
+
119
+ if (typeof registry.registerNodes === 'function') {
120
+ registry.registerNodes(this);
121
+ } else {
122
+ console.warn(`NodeRegistry: Файл ${file} не экспортирует функцию registerNodes`);
123
+ }
124
+ } catch (error) {
125
+ console.error(`NodeRegistry: Ошибка загрузки реестра из ${file}:`, error.message);
382
126
  }
383
- },
384
- pins: {
385
- inputs: [],
386
- outputs: [
387
- { id: 'value', name: 'Значение', type: 'Any' },
388
- { id: 'exists', name: 'Существует', type: 'Boolean' }
389
- ]
390
- }
391
- });
392
-
393
- this.registerNodeType({
394
- type: 'data:get_variable',
395
- label: '📤 Получить переменную',
396
- category: 'Данные',
397
- description: 'Получает значение переменной графа.',
398
- graphType: all,
399
- pins: {
400
- inputs: [],
401
- outputs: [
402
- { id: 'value', name: 'Значение', type: 'Wildcard' }
403
- ]
404
- }
405
- });
406
-
407
- this.registerNodeType({
408
- type: 'data:get_entity_field',
409
- label: '📦 Получить поле сущности',
410
- category: 'Данные',
411
- description: 'Получает определенное поле из объекта сущности (например, "position.x", "username").',
412
- graphType: all,
413
- pins: {
414
- inputs: [
415
- { id: 'entity', name: 'Сущность', type: 'Object', required: true },
416
- ],
417
- outputs: [
418
- { id: 'username', name: 'Никнейм', type: 'String' },
419
- { id: 'type', name: 'Тип', type: 'String' },
420
- { id: 'position', name: 'Позиция', type: 'Object' },
421
- { id: 'isValid', name: 'Валидна', type: 'Boolean' },
422
- ]
423
- }
424
- });
425
-
426
- this.registerNodeType({
427
- type: 'data:string_literal',
428
- label: '📜 Строка',
429
- category: 'Данные',
430
- description: 'Простое текстовое значение.',
431
- graphType: all,
432
- pins: {
433
- inputs: [],
434
- outputs: [
435
- { id: 'value', name: 'Значение', type: 'String' }
436
- ]
437
- }
438
- });
439
-
440
- this.registerNodeType({
441
- type: 'data:number_literal',
442
- label: '🔢 Число',
443
- category: 'Данные',
444
- description: 'Простое числовое значение.',
445
- graphType: all,
446
- pins: {
447
- inputs: [
448
- { id: 'value', name: 'Значение', type: 'Number', required: true }
449
- ],
450
- outputs: [
451
- { id: 'value', name: 'Значение', type: 'Number' }
452
- ]
453
- }
454
- });
455
-
456
- this.registerNodeType({
457
- type: 'data:boolean_literal',
458
- label: '✔️ Булево',
459
- category: 'Данные',
460
- description: 'Значение Истина/Ложь.',
461
- graphType: all,
462
- pins: {
463
- inputs: [
464
- { id: 'value', name: 'Значение', type: 'Boolean', required: true }
465
- ],
466
- outputs: [
467
- { id: 'value', name: 'Значение', type: 'Boolean' }
468
- ]
469
- }
470
- });
471
-
472
- this.registerNodeType({
473
- type: 'data:array_literal',
474
- label: '📋 Массив',
475
- category: 'Массив',
476
- description: 'Создает массив из элементов.',
477
- graphType: all,
478
- dynamicPins: true,
479
- pins: {
480
- inputs: [],
481
- outputs: [
482
- { id: 'value', name: 'Массив', type: 'Array' }
483
- ]
484
- }
485
- });
486
-
487
- this.registerNodeType({
488
- type: 'data:make_object',
489
- label: '🏗️ Собрать объект',
490
- category: 'Данные',
491
- description: 'Создает JSON-объект из пар ключ-значение.',
492
- graphType: all,
493
- dynamicPins: true,
494
- pins: {
495
- inputs: [],
496
- outputs: [
497
- { id: 'value', name: 'Объект', type: 'Object' }
498
- ]
499
- }
500
- });
501
-
502
- this.registerNodeType({
503
- type: 'data:cast',
504
- label: '✨ Приведение типов',
505
- category: 'Данные',
506
- description: 'Приводит входящее значение к указанному целевому типу.',
507
- graphType: all,
508
- pins: {
509
- inputs: [
510
- { id: 'value', name: 'Значение', type: 'Wildcard', required: true }
511
- ],
512
- outputs: [
513
- { id: 'value', name: 'Значение', type: 'Wildcard' }
514
- ]
515
- }
516
- });
517
-
518
- this.registerNodeType({
519
- type: 'data:length',
520
- label: '📏 Размер (длина)',
521
- category: 'Массив',
522
- graphType: 'all',
523
- description: 'Возвращает количество элементов в массиве или длину строки.',
524
- pins: {
525
- inputs: [
526
- { id: 'data', name: 'Массив или Строка', type: 'Any', required: true }
527
- ],
528
- outputs: [
529
- { id: 'length', name: 'Длина', type: 'Number' }
530
- ]
531
- }
532
- });
533
-
534
- this.registerNodeType({
535
- type: 'string:contains',
536
- label: '🔍 Строка: Содержит',
537
- category: 'Строки',
538
- description: 'Проверяет, содержит ли одна строка другую.',
539
- graphType: all,
540
- pins: {
541
- inputs: [
542
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
543
- { id: 'haystack', name: 'Строка', type: 'String', required: true },
544
- { id: 'needle', name: 'Подстрока', type: 'String', required: true },
545
- { id: 'case_sensitive', name: 'Учет регистра', type: 'Boolean', required: false }
546
- ],
547
- outputs: [
548
- { id: 'exec', name: 'Exec', type: 'Exec' },
549
- { id: 'result', name: 'Результат', type: 'Boolean' }
550
- ]
551
- }
552
- });
553
-
554
- this.registerNodeType({
555
- type: 'string:equals',
556
- label: 'Строка: Равно',
557
- category: 'Строки',
558
- description: 'Проверяет, равны ли строки (с учетом/без учета регистра).',
559
- graphType: all,
560
- pins: {
561
- inputs: [
562
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
563
- { id: 'a', name: 'A', type: 'String', required: true },
564
- { id: 'b', name: 'B', type: 'String', required: true },
565
- { id: 'case_sensitive', name: 'Учет регистра', type: 'Boolean', required: false }
566
- ],
567
- outputs: [
568
- { id: 'exec', name: 'Exec', type: 'Exec' },
569
- { id: 'result', name: 'Результат', type: 'Boolean' }
570
- ]
571
- }
572
- });
573
-
574
- this.registerNodeType({
575
- type: 'string:starts_with',
576
- label: 'Строка: Начинается с',
577
- category: 'Строки',
578
- description: 'Проверяет, начинается ли строка с указанной подстроки.',
579
- graphType: all,
580
- pins: {
581
- inputs: [
582
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
583
- { id: 'string', name: 'Строка', type: 'String', required: true },
584
- { id: 'prefix', name: 'Префикс', type: 'String', required: true },
585
- { id: 'case_sensitive', name: 'Учет регистра', type: 'Boolean', required: false }
586
- ],
587
- outputs: [
588
- { id: 'exec', name: 'Exec', type: 'Exec' },
589
- { id: 'result', name: 'Результат', type: 'Boolean' }
590
- ]
591
- }
592
- });
593
-
594
- this.registerNodeType({
595
- type: 'string:ends_with',
596
- label: 'Строка: Заканчивается на',
597
- category: 'Строки',
598
- description: 'Проверяет, заканчивается ли строка указанной подстрокой.',
599
- graphType: all,
600
- pins: {
601
- inputs: [
602
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
603
- { id: 'string', name: 'Строка', type: 'String', required: true },
604
- { id: 'suffix', name: 'Суффикс', type: 'String', required: true },
605
- { id: 'case_sensitive', name: 'Учет регистра', type: 'Boolean', required: false }
606
- ],
607
- outputs: [
608
- { id: 'exec', name: 'Exec', type: 'Exec' },
609
- { id: 'result', name: 'Результат', type: 'Boolean' }
610
- ]
611
127
  }
612
- });
613
128
 
614
- this.registerNodeType({
615
- type: 'string:length',
616
- label: 'Строка: Длина',
617
- category: 'Строки',
618
- description: 'Возвращает количество символов в строке.',
619
- graphType: all,
620
- pins: {
621
- inputs: [
622
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
623
- { id: 'string', name: 'Строка', type: 'String', required: true }
624
- ],
625
- outputs: [
626
- { id: 'exec', name: 'Exec', type: 'Exec' },
627
- { id: 'length', name: 'Длина', type: 'Number' }
628
- ]
629
- }
630
- });
631
-
632
- this.registerNodeType({
633
- type: 'string:split',
634
- label: 'Строка: Разделить',
635
- category: 'Строки',
636
- description: 'Разделяет строку на массив подстрок по разделителю.',
637
- graphType: all,
638
- pins: {
639
- inputs: [
640
- { id: 'exec', name: 'Exec', type: 'Exec', required: true },
641
- { id: 'string', name: 'Строка', type: 'String', required: true },
642
- { id: 'separator', name: 'Разделитель', type: 'String', required: true }
643
- ],
644
- outputs: [
645
- { id: 'exec', name: 'Exec', type: 'Exec' },
646
- { id: 'array', name: 'Массив', type: 'Array' }
647
- ]
648
- }
649
- });
650
-
651
- this.registerNodeType({
652
- type: 'string:concat',
653
- label: 'Строка: Объединить',
654
- category: 'Строки',
655
- description: 'Объединяет две или более строки в одну.',
656
- graphType: all,
657
- dynamicPins: true,
658
- pins: {
659
- inputs: [],
660
- outputs: [
661
- { id: 'result', name: 'Результат', type: 'String' }
662
- ]
663
- }
664
- });
665
-
666
- this.registerNodeType({
667
- type: 'math:operation',
668
- label: '🔢 Математика',
669
- category: 'Математика',
670
- description: 'Выполняет математическую операцию над двумя числами.',
671
- graphType: all,
672
- pins: {
673
- inputs: [
674
- { id: 'a', name: 'A', type: 'Number', required: true },
675
- { id: 'b', name: 'B', type: 'Number', required: true }
676
- ],
677
- outputs: [
678
- { id: 'result', name: 'Результат', type: 'Number' }
679
- ]
680
- }
681
- });
682
-
683
- this.registerNodeType({
684
- type: 'logic:operation',
685
- label: '💡 Логика',
686
- category: 'Логика',
687
- description: 'Выполняет логическую операцию. Для НЕ (NOT) используется только вход А.',
688
- graphType: all,
689
- dynamicPins: true,
690
- pins: {
691
- inputs: [
692
- { id: 'a', name: 'A', type: 'Boolean', required: true },
693
- { id: 'b', name: 'B', type: 'Boolean', required: true }
694
- ],
695
- outputs: [
696
- { id: 'result', name: 'Результат', type: 'Boolean' }
697
- ]
698
- }
699
- });
700
-
701
- this.registerNodeType({
702
- type: 'debug:log',
703
- label: '🐞 Отладка (консоль)',
704
- category: 'Отладка',
705
- description: 'Выводит значение в консоль терминала, где запущен бот.',
706
- graphType: all,
707
- pins: {
708
- inputs: [
709
- { id: 'exec', name: 'Exec', type: 'Exec' },
710
- { id: 'value', name: 'Значение', type: 'Wildcard', required: true }
711
- ],
712
- outputs: [
713
- { id: 'exec', name: 'Exec', type: 'Exec' }
714
- ]
715
- }
716
- });
717
-
718
- this.registerNodeType({
719
- type: 'math:random_number',
720
- label: '🎲 Случайное число',
721
- category: 'Математика',
722
- graphType: 'all',
723
- description: 'Генерирует случайное число в заданном диапазоне.',
724
- pins: {
725
- inputs: [
726
- { id: 'min', name: 'Мин', type: 'Number' },
727
- { id: 'max', name: 'Макс', type: 'Number' }
728
- ],
729
- outputs: [{ id: 'result', name: 'Результат', type: 'Number' }]
730
- }
731
- });
732
-
733
- this.registerNodeType({
734
- type: 'array:get_random_element',
735
- label: '🎲 Случайный элемент',
736
- category: 'Массив',
737
- graphType: 'all',
738
- description: 'Возвращает случайный элемент из массива и его индекс.',
739
- pins: {
740
- inputs: [
741
- { id: 'array', name: 'Массив', type: 'Array', required: true }
742
- ],
743
- outputs: [
744
- { id: 'element', name: 'Элемент', type: 'Any' },
745
- { id: 'index', name: 'Индекс', type: 'Number' }
746
- ]
747
- }
748
- });
749
-
750
- this.registerNodeType({
751
- type: 'array:contains',
752
- label: '🔍 Массив: Содержит',
753
- category: 'Массив',
754
- description: 'Проверяет, содержит ли массив указанный элемент и возвращает его индекс.',
755
- graphType: all,
756
- pins: {
757
- inputs: [
758
- { id: 'array', name: 'Массив', type: 'Array', required: true },
759
- { id: 'element', name: 'Элемент', type: 'Wildcard', required: true }
760
- ],
761
- outputs: [
762
- { id: 'result', name: 'Найден', type: 'Boolean' },
763
- { id: 'index', name: 'Индекс', type: 'Number' }
764
- ]
765
- }
766
- });
767
-
768
- this.registerNodeType({
769
- type: 'array:get_by_index',
770
- label: '📦 Элемент по индексу',
771
- category: 'Массив',
772
- description: 'Получает элемент массива по его индексу.',
773
- graphType: all,
774
- pins: {
775
- inputs: [
776
- { id: 'array', name: 'Массив', type: 'Array', required: true },
777
- { id: 'index', name: 'Индекс', type: 'Number', required: true }
778
- ],
779
- outputs: [
780
- { id: 'element', name: 'Элемент', type: 'Any' }
781
- ]
782
- }
783
- });
784
-
785
- this.registerNodeType({
786
- type: 'array:add_element',
787
- label: '➕ Добавить элемент',
788
- category: 'Массив',
789
- description: 'Добавляет элемент в конец массива.',
790
- graphType: all,
791
- pins: {
792
- inputs: [
793
- { id: 'array', name: 'Массив', type: 'Array', required: true },
794
- { id: 'element', name: 'Элемент', type: 'Wildcard', required: true }
795
- ],
796
- outputs: [
797
- { id: 'result', name: 'Новый массив', type: 'Array' }
798
- ]
799
- }
800
- });
801
-
802
- this.registerNodeType({
803
- type: 'array:remove_by_index',
804
- label: '➖ Удалить по индексу',
805
- category: 'Массив',
806
- description: 'Удаляет элемент из массива по его индексу.',
807
- graphType: all,
808
- pins: {
809
- inputs: [
810
- { id: 'array', name: 'Массив', type: 'Array', required: true },
811
- { id: 'index', name: 'Индекс', type: 'Number', required: true }
812
- ],
813
- outputs: [
814
- { id: 'result', name: 'Новый массив', type: 'Array' }
815
- ]
816
- }
817
- });
818
-
819
- this.registerNodeType({
820
- type: 'array:find_index',
821
- label: '🔍 Найти индекс',
822
- category: 'Массив',
823
- description: 'Находит индекс элемента в массиве (или -1 если не найден).',
824
- graphType: all,
825
- pins: {
826
- inputs: [
827
- { id: 'array', name: 'Массив', type: 'Array', required: true },
828
- { id: 'element', name: 'Элемент', type: 'Wildcard', required: true }
829
- ],
830
- outputs: [
831
- { id: 'index', name: 'Индекс', type: 'Number' }
832
- ]
833
- }
834
- });
835
-
836
- this.registerNodeType({
837
- type: 'object:create',
838
- label: '🏗️ Создать объект',
839
- category: 'Объект',
840
- description: 'Создает объект из пар ключ-значение.',
841
- graphType: all,
842
- dynamicPins: true,
843
- pins: {
844
- inputs: [],
845
- outputs: [
846
- { id: 'object', name: 'Объект', type: 'Object' }
847
- ]
848
- }
849
- });
850
-
851
- this.registerNodeType({
852
- type: 'object:get',
853
- label: '📤 Получить значение',
854
- category: 'Объект',
855
- description: 'Получает значение по ключу из объекта.',
856
- graphType: all,
857
- pins: {
858
- inputs: [
859
- { id: 'object', name: 'Объект', type: 'Object', required: true },
860
- { id: 'key', name: 'Ключ', type: 'String', required: true }
861
- ],
862
- outputs: [
863
- { id: 'value', name: 'Значение', type: 'Any' }
864
- ]
865
- }
866
- });
867
-
868
- this.registerNodeType({
869
- type: 'object:set',
870
- label: '➕ Добавить/Изменить ключ',
871
- category: 'Объект',
872
- description: 'Добавляет или изменяет значение по ключу в объекте.',
873
- graphType: all,
874
- pins: {
875
- inputs: [
876
- { id: 'object', name: 'Объект', type: 'Object', required: true },
877
- { id: 'key', name: 'Ключ', type: 'String', required: true },
878
- { id: 'value', name: 'Значение', type: 'Any', required: true }
879
- ],
880
- outputs: [
881
- { id: 'new_object', name: 'Новый объект', type: 'Object' }
882
- ]
883
- }
884
- });
885
-
886
- this.registerNodeType({
887
- type: 'object:delete',
888
- label: '➖ Удалить ключ',
889
- category: 'Объект',
890
- description: 'Удаляет ключ из объекта.',
891
- graphType: all,
892
- pins: {
893
- inputs: [
894
- { id: 'object', name: 'Объект', type: 'Object', required: true },
895
- { id: 'key', name: 'Ключ', type: 'String', required: true }
896
- ],
897
- outputs: [
898
- { id: 'new_object', name: 'Новый объект', type: 'Object' }
899
- ]
900
- }
901
- });
902
-
903
- this.registerNodeType({
904
- type: 'object:has_key',
905
- label: '🔍 Проверить ключ',
906
- category: 'Объект',
907
- description: 'Проверяет наличие ключа в объекте и возвращает значение.',
908
- graphType: all,
909
- pins: {
910
- inputs: [
911
- { id: 'object', name: 'Объект', type: 'Object', required: true },
912
- { id: 'key', name: 'Ключ', type: 'String', required: true }
913
- ],
914
- outputs: [
915
- { id: 'result', name: 'Найден', type: 'Boolean' },
916
- { id: 'value', name: 'Значение', type: 'Any' }
917
- ]
918
- }
919
- });
920
-
921
- this.registerNodeType({
922
- type: 'data:get_server_players',
923
- label: '👥 Список игроков',
924
- category: 'Данные',
925
- graphType: 'all',
926
- description: 'Возвращает массив с именами всех игроков на сервере.',
927
- pins: {
928
- inputs: [],
929
- outputs: [
930
- { id: 'players', name: 'Игроки', type: 'Array' }
931
- ]
932
- }
933
- });
934
-
935
- this.registerNodeType({
936
- type: 'logic:compare',
937
- label: '⎗ Сравнение',
938
- category: 'Логика',
939
- description: 'Сравнивает два значения.',
940
- graphType: all,
941
- pins: {
942
- inputs: [
943
- { id: 'a', name: 'A', type: 'Wildcard' },
944
- { id: 'b', name: 'B', type: 'Wildcard' }
945
- ],
946
- outputs: [
947
- { id: 'result', name: 'Результат', type: 'Boolean' }
948
- ]
949
- }
950
- });
951
-
952
- this.registerNodeType({
953
- type: 'bot:get_position',
954
- label: '🤖 Позиция бота',
955
- category: 'Бот',
956
- description: 'Возвращает текущую позицию бота в мире.',
957
- graphType: all,
958
- pins: {
959
- inputs: [],
960
- outputs: [
961
- { id: 'position', name: 'Позиция', type: 'Object' }
962
- ]
963
- }
964
- });
965
-
966
- // Пользователи
967
- this.registerNodeType({
968
- type: 'user:check_blacklist',
969
- label: '❓ В черном списке?',
970
- category: 'Пользователи',
971
- description: 'Проверяет, находится ли пользователь в черном списке.',
972
- graphType: all,
973
- pins: {
974
- inputs: [
975
- { id: 'user', name: 'Пользователь', type: 'User', required: true }
976
- ],
977
- outputs: [
978
- { id: 'is_blacklisted', name: 'В ЧС', type: 'Boolean' }
979
- ]
980
- }
981
- });
982
-
983
- this.registerNodeType({
984
- type: 'user:set_blacklist',
985
- label: '🚫 Установить ЧС',
986
- category: 'Пользователи',
987
- description: 'Добавляет или убирает пользователя из черного списка.',
988
- graphType: all,
989
- pins: {
990
- inputs: [
991
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
992
- { id: 'user', name: 'Пользователь', type: 'User', required: true },
993
- { id: 'blacklist_status', name: 'Статус ЧС', type: 'Boolean', required: true }
994
- ],
995
- outputs: [
996
- { id: 'exec', name: 'Далее', type: 'Exec' },
997
- { id: 'updated_user', name: 'Обновленный пользователь', type: 'User' }
998
- ]
999
- }
1000
- });
1001
-
1002
-
1003
- this.registerNodeType({
1004
- type: 'user:get_groups',
1005
- label: '👥 Получить группы',
1006
- category: 'Пользователь',
1007
- description: 'Возвращает массив названий групп, в которых состоит пользователь.',
1008
- graphType: all,
1009
- pins: {
1010
- inputs: [
1011
- { id: 'user', name: 'Пользователь', type: 'User', required: true }
1012
- ],
1013
- outputs: [
1014
- { id: 'groups', name: 'Группы', type: 'Array' }
1015
- ]
1016
- }
1017
- });
1018
-
1019
- this.registerNodeType({
1020
- type: 'user:get_permissions',
1021
- label: '🔑 Получить права',
1022
- category: 'Пользователь',
1023
- description: 'Возвращает массив прав пользователя.',
1024
- graphType: all,
1025
- pins: {
1026
- inputs: [
1027
- { id: 'user', name: 'Пользователь', type: 'User', required: true }
1028
- ],
1029
- outputs: [
1030
- { id: 'permissions', name: 'Права', type: 'Array' }
1031
- ]
1032
- }
1033
- });
1034
-
1035
- this.registerNodeType({
1036
- type: 'data:get_user_field',
1037
- label: '👤 Данные пользователя',
1038
- category: 'Данные',
1039
- description: 'Получает различные данные из объекта пользователя.',
1040
- graphType: all,
1041
- pins: {
1042
- inputs: [
1043
- { id: 'user', name: 'Пользователь', type: 'User', required: true }
1044
- ],
1045
- outputs: [
1046
- { id: 'username', name: 'Никнейм', type: 'String' },
1047
- { id: 'groups', name: 'Группы', type: 'Array' },
1048
- { id: 'permissions', name: 'Права', type: 'Array' },
1049
- { id: 'isBlacklisted', name: 'В черном списке', type: 'Boolean' },
1050
- ]
1051
- }
1052
- });
1053
-
1054
- this.registerNodeType({
1055
- type: 'event:botDied',
1056
- label: '💀 Бот умер',
1057
- category: 'События',
1058
- description: 'Срабатывает, когда бот умирает.',
1059
- graphType: event,
1060
- pins: {
1061
- inputs: [],
1062
- outputs: [
1063
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
1064
- ]
1065
- }
1066
- });
1067
-
1068
- this.registerNodeType({
1069
- type: 'flow:switch',
1070
- label: '🔄 Switch (свитч)',
1071
- category: 'Поток',
1072
- description: 'Выполняет разные действия в зависимости от значения. Автоматически определяет тип сравнения.',
1073
- graphType: all,
1074
- dynamicPins: true,
1075
- pins: {
1076
- inputs: [
1077
- { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
1078
- { id: 'value', name: 'Значение', type: 'Wildcard', required: true }
1079
- ],
1080
- outputs: [
1081
- { id: 'default', name: 'Default', type: 'Exec' }
1082
- ]
1083
- }
1084
- });
1085
-
1086
- console.log(`NodeRegistry: Registered ${this.nodes.size} base nodes`);
129
+ console.log(`NodeRegistry: Registered ${this.nodes.size} base nodes from ${files.length} registries`);
130
+ } catch (error) {
131
+ console.error('NodeRegistry: Ошибка чтения директории node-registries:', error.message);
132
+ }
1087
133
  }
1088
134
 
1089
135
  getNodesByTypes(types) {