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
@@ -0,0 +1,90 @@
1
+ const pidusage = require('pidusage');
2
+
3
+ class ResourceMonitorService {
4
+ constructor({ botProcessManager, logger }) {
5
+ this.processManager = botProcessManager;
6
+ this.logger = logger;
7
+ this.resourceUsage = new Map();
8
+ this.updateInterval = null;
9
+ }
10
+
11
+ startMonitoring(intervalMs = 5000) {
12
+ if (this.updateInterval) {
13
+ clearInterval(this.updateInterval);
14
+ }
15
+ this.updateInterval = setInterval(() => this.updateAllResourceUsage(), intervalMs);
16
+ }
17
+
18
+ stopMonitoring() {
19
+ if (this.updateInterval) {
20
+ clearInterval(this.updateInterval);
21
+ this.updateInterval = null;
22
+ }
23
+ }
24
+
25
+ async updateAllResourceUsage() {
26
+ const processes = this.processManager.getAllProcesses();
27
+
28
+ if (processes.size === 0) {
29
+ if (this.resourceUsage.size > 0) {
30
+ this.resourceUsage.clear();
31
+ }
32
+ return [];
33
+ }
34
+
35
+ const pids = Array.from(processes.values())
36
+ .map(child => child.pid)
37
+ .filter(Boolean);
38
+
39
+ if (pids.length === 0) return [];
40
+
41
+ try {
42
+ const stats = await pidusage(pids);
43
+ const usageData = [];
44
+
45
+ for (const pid in stats) {
46
+ if (!stats[pid]) continue;
47
+
48
+ const botId = this.getBotIdByPid(parseInt(pid, 10));
49
+ if (botId) {
50
+ const usage = {
51
+ botId: botId,
52
+ cpu: parseFloat(stats[pid].cpu.toFixed(1)),
53
+ memory: parseFloat((stats[pid].memory / 1024 / 1024).toFixed(1)),
54
+ };
55
+ this.resourceUsage.set(botId, usage);
56
+ usageData.push(usage);
57
+ }
58
+ }
59
+
60
+ return usageData;
61
+ } catch (error) {
62
+ this.logger.error({ error }, 'Ошибка обновления ресурсов');
63
+ return [];
64
+ }
65
+ }
66
+
67
+ getBotIdByPid(pid) {
68
+ const processes = this.processManager.getAllProcesses();
69
+ for (const [botId, child] of processes.entries()) {
70
+ if (child.pid === pid) {
71
+ return botId;
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+
77
+ getResourceUsage(botId) {
78
+ return this.resourceUsage.get(botId);
79
+ }
80
+
81
+ getAllResourceUsage() {
82
+ return Array.from(this.resourceUsage.values());
83
+ }
84
+
85
+ clearResourceUsage(botId) {
86
+ this.resourceUsage.delete(botId);
87
+ }
88
+ }
89
+
90
+ module.exports = ResourceMonitorService;
@@ -0,0 +1,124 @@
1
+ const crypto = require('crypto');
2
+ const fs = require('fs');
3
+ const os = require('os');
4
+ const path = require('path');
5
+ const { v4: uuidv4 } = require('uuid');
6
+
7
+ class TelemetryService {
8
+ constructor({ config, botProcessManager, logger }) {
9
+ this.config = config;
10
+ this.processManager = botProcessManager;
11
+ this.logger = logger;
12
+ this.instanceId = null;
13
+ this.heartbeatDebounceTimer = null;
14
+ this.heartbeatInterval = null;
15
+
16
+ this.STATS_SERVER_URL = 'http://185.65.200.184:3000';
17
+ this.DATA_DIR = path.join(os.homedir(), '.blockmine');
18
+ this.INSTANCE_ID_PATH = path.join(this.DATA_DIR, '.instance_id');
19
+
20
+ this.loadInstanceId();
21
+ }
22
+
23
+ loadInstanceId() {
24
+ if (this.instanceId) return this.instanceId;
25
+
26
+ try {
27
+ if (fs.existsSync(this.INSTANCE_ID_PATH)) {
28
+ this.instanceId = fs.readFileSync(this.INSTANCE_ID_PATH, 'utf-8');
29
+ } else {
30
+ this.instanceId = uuidv4();
31
+ if (!fs.existsSync(this.DATA_DIR)) {
32
+ fs.mkdirSync(this.DATA_DIR, { recursive: true });
33
+ }
34
+ fs.writeFileSync(this.INSTANCE_ID_PATH, this.instanceId, 'utf-8');
35
+ }
36
+ } catch (error) {
37
+ this.logger.error({ error }, 'Ошибка загрузки Instance ID');
38
+ return null;
39
+ }
40
+
41
+ return this.instanceId;
42
+ }
43
+
44
+ getInstanceId() {
45
+ return this.instanceId;
46
+ }
47
+
48
+ startHeartbeat(intervalMs = 5 * 60 * 1000) {
49
+ if (!this.config.telemetry?.enabled) return;
50
+
51
+ if (this.heartbeatInterval) {
52
+ clearInterval(this.heartbeatInterval);
53
+ }
54
+
55
+ this.heartbeatInterval = setInterval(() => this.sendHeartbeat(), intervalMs);
56
+ }
57
+
58
+ stopHeartbeat() {
59
+ if (this.heartbeatInterval) {
60
+ clearInterval(this.heartbeatInterval);
61
+ this.heartbeatInterval = null;
62
+ }
63
+ }
64
+
65
+ triggerHeartbeat() {
66
+ if (!this.config.telemetry?.enabled) return;
67
+
68
+ if (this.heartbeatDebounceTimer) {
69
+ clearTimeout(this.heartbeatDebounceTimer);
70
+ }
71
+
72
+ this.heartbeatDebounceTimer = setTimeout(() => {
73
+ this.sendHeartbeat();
74
+ }, 3000);
75
+ }
76
+
77
+ async sendHeartbeat() {
78
+ if (!this.config.telemetry?.enabled || !this.instanceId) return;
79
+
80
+ try {
81
+ const processes = this.processManager.getAllProcesses();
82
+ const runningBots = Array.from(processes.values())
83
+ .filter(p => p.botConfig)
84
+ .map(p => ({
85
+ username: p.botConfig.username,
86
+ serverHost: p.botConfig.server.host,
87
+ serverPort: p.botConfig.server.port
88
+ }));
89
+
90
+ if (runningBots.length === 0) return;
91
+
92
+ const challengeRes = await fetch(`${this.STATS_SERVER_URL}/api/challenge?uuid=${this.instanceId}`);
93
+ if (!challengeRes.ok) throw new Error(`Challenge server error: ${challengeRes.statusText}`);
94
+
95
+ const { challenge, difficulty, prefix } = await challengeRes.json();
96
+
97
+ // Proof of work
98
+ let nonce = 0;
99
+ let hash = '';
100
+ do {
101
+ nonce++;
102
+ hash = crypto.createHash('sha256').update(prefix + challenge + nonce).digest('hex');
103
+ } while (!hash.startsWith('0'.repeat(difficulty)));
104
+
105
+ const packageJson = require('../../../../package.json');
106
+ await fetch(`${this.STATS_SERVER_URL}/api/heartbeat`, {
107
+ method: 'POST',
108
+ headers: { 'Content-Type': 'application/json' },
109
+ body: JSON.stringify({
110
+ instanceUuid: this.instanceId,
111
+ appVersion: packageJson.version,
112
+ bots: runningBots,
113
+ nonce: nonce
114
+ })
115
+ });
116
+
117
+ this.logger.debug('Heartbeat отправлен успешно');
118
+ } catch (error) {
119
+ this.logger.error({ error }, 'Не удалось отправить heartbeat');
120
+ }
121
+ }
122
+ }
123
+
124
+ module.exports = TelemetryService;
@@ -0,0 +1,132 @@
1
+ const { validateGraph, validateNodeConfig } = require('../validation/nodeSchemas');
2
+ const { safeJsonParse } = require('../utils/jsonParser');
3
+ const { VALIDATION_ENABLED, VALIDATION_STRICT_MODE } = require('../config/validation');
4
+
5
+ /**
6
+ * Сервис для централизованной валидации графов и нод
7
+ *
8
+ * Предоставляет единую точку входа для валидации с учетом конфигурации окружения.
9
+ * В строгом режиме (dev/test) выбрасывает исключения, в production логирует и возвращает результат.
10
+ */
11
+ class ValidationService {
12
+ constructor() {
13
+ this.validationEnabled = VALIDATION_ENABLED;
14
+ this.strictMode = VALIDATION_STRICT_MODE;
15
+ }
16
+
17
+ /**
18
+ * Парсит JSON строку графа с безопасной обработкой ошибок
19
+ * @param {string|object} graph - Граф в виде строки или объекта
20
+ * @param {string} contextName - Имя контекста для логирования
21
+ * @returns {object|null} - Распарсенный граф или null при ошибке
22
+ */
23
+ parseGraph(graph, contextName = 'unknown context') {
24
+ if (typeof graph === 'string') {
25
+ return safeJsonParse(graph, null, contextName);
26
+ }
27
+ return graph;
28
+ }
29
+
30
+ /**
31
+ * Валидирует конфигурацию графа
32
+ * @param {object} graph - Объект графа для валидации
33
+ * @param {string} contextName - Имя контекста для логирования (например, 'GraphExecutionEngine')
34
+ * @returns {{success: boolean, error?: any, shouldSkip: boolean}} - Результат валидации
35
+ */
36
+ validateGraphStructure(graph, contextName = 'unknown context') {
37
+ if (!this.validationEnabled) {
38
+ return { success: true, shouldSkip: false };
39
+ }
40
+
41
+ // Сначала проверяем базовую структуру
42
+ if (!graph || !Array.isArray(graph.nodes) || !Array.isArray(graph.connections)) {
43
+ console.error(`[${contextName}] Graph validation failed: missing or invalid nodes/connections arrays`);
44
+
45
+ if (this.strictMode) {
46
+ throw new Error('Invalid graph structure: missing nodes or connections');
47
+ }
48
+
49
+ console.warn(`[${contextName}] Skipping graph execution due to missing basic structure in production mode`);
50
+ return { success: false, error: 'Missing nodes or connections', shouldSkip: true };
51
+ }
52
+
53
+ // Затем выполняем полную валидацию схемы
54
+ const validation = validateGraph(graph);
55
+
56
+ if (!validation.success) {
57
+ console.error(`[${contextName}] Graph validation failed:`, {
58
+ errors: validation.error
59
+ });
60
+
61
+ if (this.strictMode) {
62
+ throw new Error('Invalid graph structure');
63
+ }
64
+
65
+ // В production логируем и пропускаем выполнение
66
+ console.warn(`[${contextName}] Skipping graph execution due to validation errors in production mode`);
67
+ return { success: false, error: validation.error, shouldSkip: true };
68
+ }
69
+
70
+ return { success: true, shouldSkip: false };
71
+ }
72
+
73
+ /**
74
+ * Валидирует конфигурацию ноды
75
+ * @param {object} nodeConfig - Конфигурация ноды для валидации
76
+ * @param {string} contextName - Имя контекста для логирования (например, 'NodeRegistry')
77
+ * @returns {{success: boolean, error?: any, shouldSkip: boolean}} - Результат валидации
78
+ */
79
+ validateNode(nodeConfig, contextName = 'unknown context') {
80
+ if (!this.validationEnabled) {
81
+ return { success: true, shouldSkip: false };
82
+ }
83
+
84
+ const validation = validateNodeConfig(nodeConfig);
85
+
86
+ if (!validation.success) {
87
+ console.error(`[${contextName}] Validation failed for node type '${nodeConfig.type}':`, {
88
+ type: nodeConfig.type,
89
+ errors: validation.error
90
+ });
91
+
92
+ if (this.strictMode) {
93
+ throw new Error(`Invalid node configuration for '${nodeConfig.type}'`);
94
+ }
95
+
96
+ // В production пропускаем невалидную ноду
97
+ console.warn(`[${contextName}] Skipping registration of invalid node '${nodeConfig.type}' in production mode`);
98
+ return { success: false, error: validation.error, shouldSkip: true };
99
+ }
100
+
101
+ return { success: true, shouldSkip: false };
102
+ }
103
+
104
+ /**
105
+ * Проверяет базовую структуру графа (nodes и connections)
106
+ * @param {object} graph - Объект графа
107
+ * @returns {boolean} - true если структура валидна
108
+ */
109
+ hasValidBasicStructure(graph) {
110
+ return !!(graph && Array.isArray(graph.nodes) && Array.isArray(graph.connections));
111
+ }
112
+
113
+ /**
114
+ * Проверяет, включена ли валидация
115
+ * @returns {boolean}
116
+ */
117
+ isValidationEnabled() {
118
+ return this.validationEnabled;
119
+ }
120
+
121
+ /**
122
+ * Проверяет, включен ли строгий режим
123
+ * @returns {boolean}
124
+ */
125
+ isStrictMode() {
126
+ return this.strictMode;
127
+ }
128
+ }
129
+
130
+ // Экспортируем singleton instance
131
+ const validationServiceInstance = new ValidationService();
132
+ module.exports = validationServiceInstance;
@@ -0,0 +1,148 @@
1
+ const validationService = require('../ValidationService');
2
+ const { GRAPH_TYPES } = require('../../constants/graphTypes');
3
+
4
+ describe('ValidationService', () => {
5
+ describe('parseGraph', () => {
6
+ it('should parse JSON string graph', () => {
7
+ const graphJson = JSON.stringify({ nodes: [], connections: [] });
8
+ const result = validationService.parseGraph(graphJson, 'test');
9
+
10
+ expect(result).toEqual({ nodes: [], connections: [] });
11
+ });
12
+
13
+ it('should return graph object as-is', () => {
14
+ const graphObj = { nodes: [], connections: [] };
15
+ const result = validationService.parseGraph(graphObj, 'test');
16
+
17
+ expect(result).toBe(graphObj);
18
+ });
19
+
20
+ it('should return null for invalid JSON', () => {
21
+ const result = validationService.parseGraph('invalid json', 'test');
22
+
23
+ expect(result).toBeNull();
24
+ });
25
+ });
26
+
27
+ describe('hasValidBasicStructure', () => {
28
+ it('should return true for valid graph structure', () => {
29
+ const graph = { nodes: [], connections: [] };
30
+
31
+ expect(validationService.hasValidBasicStructure(graph)).toBe(true);
32
+ });
33
+
34
+ it('should return false for graph without nodes', () => {
35
+ const graph = { connections: [] };
36
+
37
+ expect(validationService.hasValidBasicStructure(graph)).toBe(false);
38
+ });
39
+
40
+ it('should return false for graph without connections', () => {
41
+ const graph = { nodes: [] };
42
+
43
+ expect(validationService.hasValidBasicStructure(graph)).toBe(false);
44
+ });
45
+
46
+ it('should return false for null graph', () => {
47
+ expect(validationService.hasValidBasicStructure(null)).toBe(false);
48
+ });
49
+
50
+ it('should return false for undefined graph', () => {
51
+ expect(validationService.hasValidBasicStructure(undefined)).toBe(false);
52
+ });
53
+ });
54
+
55
+ describe('validateGraphStructure', () => {
56
+ it('should validate correct graph structure', () => {
57
+ const graph = {
58
+ nodes: [
59
+ {
60
+ id: '1',
61
+ type: 'event:command',
62
+ position: { x: 0, y: 0 },
63
+ data: {}
64
+ }
65
+ ],
66
+ connections: [],
67
+ variables: []
68
+ };
69
+
70
+ const result = validationService.validateGraphStructure(graph, 'test');
71
+
72
+ expect(result.success).toBe(true);
73
+ expect(result.shouldSkip).toBe(false);
74
+ });
75
+
76
+ it('should fail validation for invalid graph', () => {
77
+ const graph = {
78
+ nodes: 'not an array',
79
+ connections: []
80
+ };
81
+
82
+ // В production mode не выбрасывает исключение, а возвращает shouldSkip: true
83
+ if (process.env.NODE_ENV === 'production') {
84
+ const result = validationService.validateGraphStructure(graph, 'test');
85
+
86
+ expect(result.success).toBe(false);
87
+ expect(result.shouldSkip).toBe(true);
88
+ expect(result.error).toBeDefined();
89
+ } else {
90
+ // В dev/test mode выбрасывает исключение
91
+ expect(() => {
92
+ validationService.validateGraphStructure(graph, 'test');
93
+ }).toThrow('Invalid graph structure');
94
+ }
95
+ });
96
+ });
97
+
98
+ describe('validateNode', () => {
99
+ it('should validate correct node configuration', () => {
100
+ const nodeConfig = {
101
+ type: 'test:node',
102
+ label: 'Test Node',
103
+ category: 'Test',
104
+ description: 'Test description',
105
+ inputs: [],
106
+ outputs: [],
107
+ graphType: GRAPH_TYPES.ALL
108
+ };
109
+
110
+ const result = validationService.validateNode(nodeConfig, 'test');
111
+
112
+ expect(result.success).toBe(true);
113
+ expect(result.shouldSkip).toBe(false);
114
+ });
115
+
116
+ it('should fail validation for invalid node', () => {
117
+ const nodeConfig = {
118
+ type: 'test:node',
119
+ // Missing required fields
120
+ };
121
+
122
+ // В production mode не выбрасывает исключение, а возвращает shouldSkip: true
123
+ if (process.env.NODE_ENV === 'production') {
124
+ const result = validationService.validateNode(nodeConfig, 'test');
125
+
126
+ expect(result.success).toBe(false);
127
+ expect(result.shouldSkip).toBe(true);
128
+ expect(result.error).toBeDefined();
129
+ } else {
130
+ // В dev/test mode выбрасывает исключение
131
+ expect(() => {
132
+ validationService.validateNode(nodeConfig, 'test');
133
+ }).toThrow();
134
+ }
135
+ });
136
+ });
137
+
138
+ describe('utility methods', () => {
139
+ it('isValidationEnabled should return true', () => {
140
+ expect(validationService.isValidationEnabled()).toBe(true);
141
+ });
142
+
143
+ it('isStrictMode should reflect environment', () => {
144
+ const expected = process.env.NODE_ENV !== 'production';
145
+ expect(validationService.isStrictMode()).toBe(expected);
146
+ });
147
+ });
148
+ });
@@ -1,11 +1,26 @@
1
- const botManager = require('./BotManager');
2
- const PluginManager = require('./PluginManager');
1
+ const { asValue } = require('awilix');
2
+ const configureContainer = require('../container');
3
3
 
4
- const pluginManager = new PluginManager(botManager);
4
+ const container = configureContainer();
5
+
6
+ const BotManager = require('./BotManager');
7
+ const botManager = new BotManager(container.cradle);
8
+
9
+ // Регистрируем botManager в контейнере для PluginManager
10
+ container.register({
11
+ botManager: asValue(botManager)
12
+ });
13
+
14
+ const pluginManager = container.resolve('pluginManager');
15
+ const eventGraphManager = container.resolve('eventGraphManager');
16
+
17
+ // EventGraphManager требует botManager через setter из-за циклической зависимости
18
+ eventGraphManager.setBotManager(botManager);
5
19
 
6
20
  botManager.initialize();
7
21
 
8
22
  module.exports = {
9
23
  botManager,
10
- pluginManager
11
- };
24
+ pluginManager,
25
+ container
26
+ };
@@ -0,0 +1,84 @@
1
+ const Transport = require('./Transport');
2
+ const UserService = require('../UserService');
3
+
4
+ /**
5
+ * CommandContext - контекст выполнения команды
6
+ * Предоставляет единый интерфейс для команд независимо от источника (Minecraft, WebSocket, Telegram)
7
+ */
8
+ class CommandContext {
9
+ /**
10
+ * @param {object} bot - Экземпляр бота
11
+ * @param {object} user - User объект с методами
12
+ * @param {object} args - Аргументы команды
13
+ * @param {Transport} transport - Transport объект
14
+ */
15
+ constructor(bot, user, args, transport) {
16
+ this.bot = bot;
17
+ this.user = user;
18
+ this.args = args;
19
+ this.transport = transport;
20
+
21
+ // Для обратной совместимости
22
+ this.typeChat = transport.type;
23
+
24
+ // Добавляем информацию о позиции бота
25
+ this.botEntity = bot.entity ? {
26
+ position: bot.entity.position,
27
+ yaw: bot.entity.yaw,
28
+ pitch: bot.entity.pitch
29
+ } : null;
30
+ }
31
+
32
+ /**
33
+ * Отправить ответ пользователю
34
+ * @param {string} message - Текст сообщения
35
+ * @returns {string|void} - Для websocket возвращает message, для остальных void
36
+ */
37
+ reply(message) {
38
+ return this.transport.send(message, this.user.username);
39
+ }
40
+
41
+ /**
42
+ * Отправить сообщение в определенный чат
43
+ * @param {string} chatType - Тип чата ('chat', 'clan', 'private', etc)
44
+ * @param {string} message - Текст сообщения
45
+ * @param {string} recipient - Получатель (для private)
46
+ */
47
+ sendTo(chatType, message, recipient = null) {
48
+ if (this.bot.api) {
49
+ this.bot.api.sendMessage(chatType, message, recipient);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Получить User объект с методами
55
+ * @param {string} username - Имя пользователя
56
+ * @returns {Promise<User>} - User объект с методами
57
+ */
58
+ async getUser(username) {
59
+ return await UserService.getUser(username, this.bot.config.id, this.bot.config);
60
+ }
61
+
62
+ /**
63
+ * Проверка, выполняется ли команда через WebSocket API
64
+ */
65
+ isWebSocket() {
66
+ return this.transport.type === 'websocket';
67
+ }
68
+
69
+ /**
70
+ * Проверка, выполняется ли команда из Minecraft
71
+ */
72
+ isMinecraft() {
73
+ return this.transport.isMinecraftTransport();
74
+ }
75
+
76
+ /**
77
+ * Получить название транспорта
78
+ */
79
+ getTransportName() {
80
+ return this.transport.getDisplayName();
81
+ }
82
+ }
83
+
84
+ module.exports = CommandContext;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Transport - абстракция для различных способов доставки сообщений
3
+ * Поддерживает: websocket, minecraft (chat/clan/private/command), telegram (будущее)
4
+ */
5
+ class Transport {
6
+ constructor(type, bot = null) {
7
+ this.type = type; // 'websocket' | 'chat' | 'clan' | 'private' | 'command' | 'telegram'
8
+ this.bot = bot;
9
+ }
10
+
11
+ /**
12
+ * Отправить сообщение через этот транспорт
13
+ * @param {string} message - Текст сообщения
14
+ * @param {string} recipient - Получатель (для private/telegram)
15
+ * @returns {string|void} - Для websocket возвращает message, для остальных void
16
+ */
17
+ send(message, recipient = null) {
18
+ if (this.type === 'websocket') {
19
+ // WebSocket - возвращаем результат как есть
20
+ return message;
21
+ } else if (this.isMinecraftTransport()) {
22
+ // Minecraft - отправляем через бота
23
+ if (this.bot && this.bot.api) {
24
+ this.bot.api.sendMessage(this.type, message, recipient);
25
+ }
26
+ } else if (this.type === 'telegram') {
27
+ // Telegram - будущая интеграция
28
+ // TODO: Implement telegram sending
29
+ console.warn('[Transport] Telegram transport not implemented yet');
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Проверка, является ли этот транспорт Minecraft-транспортом
35
+ */
36
+ isMinecraftTransport() {
37
+ return ['chat', 'local', 'clan', 'private', 'command'].includes(this.type);
38
+ }
39
+
40
+ /**
41
+ * Проверка, является ли этот транспорт универсальным (не требует проверки allowedChatTypes)
42
+ */
43
+ isUniversal() {
44
+ return this.type === 'websocket';
45
+ }
46
+
47
+ /**
48
+ * Проверка, может ли команда быть выполнена через этот транспорт
49
+ * @param {Array<string>} allowedTypes - Список разрешенных типов чата из команды
50
+ */
51
+ isAllowedFor(allowedTypes) {
52
+ // Универсальные транспорты всегда разрешены
53
+ if (this.isUniversal()) {
54
+ return true;
55
+ }
56
+
57
+ // Для остальных проверяем список разрешенных типов
58
+ return allowedTypes.includes(this.type);
59
+ }
60
+
61
+ /**
62
+ * Получить читаемое название транспорта
63
+ */
64
+ getDisplayName() {
65
+ const names = {
66
+ websocket: 'WebSocket API',
67
+ chat: 'Общий чат',
68
+ local: 'Локальный чат',
69
+ clan: 'Клан',
70
+ private: 'Личное сообщение',
71
+ command: 'Команда',
72
+ telegram: 'Telegram'
73
+ };
74
+ return names[this.type] || this.type;
75
+ }
76
+ }
77
+
78
+ module.exports = Transport;