blockmine 1.21.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) 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 +59 -0
  55. package/.claude/settings.local.json +36 -14
  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 +102 -42
  255. package/CLAUDE.md +284 -0
  256. package/README.md +315 -71
  257. package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
  258. package/backend/jest.config.js +59 -0
  259. package/backend/package-lock.json +6801 -0
  260. package/backend/package.json +24 -4
  261. package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
  262. package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -0
  263. package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -0
  264. package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -0
  265. package/backend/prisma/migrations/migration_lock.toml +2 -2
  266. package/backend/prisma/schema.prisma +103 -1
  267. package/backend/src/__tests__/core/DependencyService.test.js +336 -0
  268. package/backend/src/__tests__/core/UserService.test.js +875 -0
  269. package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
  270. package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
  271. package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
  272. package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
  273. package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
  274. package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
  275. package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
  276. package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
  277. package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
  278. package/backend/src/__tests__/secretsFilter.test.js +425 -0
  279. package/backend/src/__tests__/services/BotLifecycleService.test.js +416 -0
  280. package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
  281. package/backend/src/__tests__/services/CacheManager.test.js +125 -0
  282. package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
  283. package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
  284. package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
  285. package/backend/src/__tests__/setup.js +25 -0
  286. package/backend/src/ai/plugin-assistant-system-prompt.md +788 -0
  287. package/backend/src/api/middleware/auth.js +27 -0
  288. package/backend/src/api/middleware/botAccess.js +7 -3
  289. package/backend/src/api/middleware/panelApiAuth.js +135 -0
  290. package/backend/src/api/routes/aiAssistant.js +995 -0
  291. package/backend/src/api/routes/apiKeys.js +181 -0
  292. package/backend/src/api/routes/auth.js +669 -633
  293. package/backend/src/api/routes/botCommands.js +107 -0
  294. package/backend/src/api/routes/botGroups.js +165 -0
  295. package/backend/src/api/routes/botHistory.js +108 -0
  296. package/backend/src/api/routes/botPermissions.js +99 -0
  297. package/backend/src/api/routes/botStatus.js +36 -0
  298. package/backend/src/api/routes/botUsers.js +162 -0
  299. package/backend/src/api/routes/bots.js +2451 -2360
  300. package/backend/src/api/routes/eventGraphs.js +4 -1
  301. package/backend/src/api/routes/logs.js +13 -3
  302. package/backend/src/api/routes/panel.js +66 -66
  303. package/backend/src/api/routes/panelApiKeys.js +179 -0
  304. package/backend/src/api/routes/pluginIde.js +1715 -135
  305. package/backend/src/api/routes/plugins.js +376 -218
  306. package/backend/src/api/routes/proxies.js +130 -0
  307. package/backend/src/api/routes/search.js +4 -0
  308. package/backend/src/api/routes/servers.js +20 -3
  309. package/backend/src/api/routes/settings.js +5 -0
  310. package/backend/src/api/routes/system.js +174 -0
  311. package/backend/src/api/routes/traces.js +131 -0
  312. package/backend/src/config/debug.config.js +36 -0
  313. package/backend/src/container.js +82 -0
  314. package/backend/src/core/BotHistoryStore.js +180 -0
  315. package/backend/src/core/BotManager.js +149 -868
  316. package/backend/src/core/BotManager.old.js +1093 -0
  317. package/backend/src/core/BotProcess.js +850 -191
  318. package/backend/src/core/EventGraphManager.js +194 -198
  319. package/backend/src/core/GraphExecutionEngine.js +709 -57
  320. package/backend/src/core/MessageQueue.js +39 -12
  321. package/backend/src/core/NodeRegistry.js +37 -1134
  322. package/backend/src/core/PluginLoader.js +99 -5
  323. package/backend/src/core/PluginManager.js +126 -15
  324. package/backend/src/core/PrismaService.js +32 -0
  325. package/backend/src/core/TaskScheduler.js +1 -1
  326. package/backend/src/core/UserService.js +3 -3
  327. package/backend/src/core/__tests__/PrismaService.test.js +24 -0
  328. package/backend/src/core/commands/README.md +305 -0
  329. package/backend/src/core/commands/dev.js +13 -7
  330. package/backend/src/core/commands/ping.js +10 -4
  331. package/backend/src/core/commands/whois.js +63 -0
  332. package/backend/src/core/config/validation.js +27 -0
  333. package/backend/src/core/constants/graphTypes.js +21 -0
  334. package/backend/src/core/node-registries/actions.js +202 -0
  335. package/backend/src/core/node-registries/arrays.js +155 -0
  336. package/backend/src/core/node-registries/bot.js +23 -0
  337. package/backend/src/core/node-registries/data.js +290 -0
  338. package/backend/src/core/node-registries/debug.js +26 -0
  339. package/backend/src/core/node-registries/events.js +201 -0
  340. package/backend/src/core/node-registries/flow.js +139 -0
  341. package/backend/src/core/node-registries/logic.js +62 -0
  342. package/backend/src/core/node-registries/math.js +42 -0
  343. package/backend/src/core/node-registries/objects.js +98 -0
  344. package/backend/src/core/node-registries/strings.js +187 -0
  345. package/backend/src/core/node-registries/time.js +113 -0
  346. package/backend/src/core/node-registries/type.js +25 -0
  347. package/backend/src/core/node-registries/users.js +79 -0
  348. package/backend/src/core/nodes/{action_bot_look_at.js → actions/bot_look_at.js} +36 -36
  349. package/backend/src/core/nodes/{action_bot_set_variable.js → actions/bot_set_variable.js} +32 -32
  350. package/backend/src/core/nodes/actions/create_command.js +189 -0
  351. package/backend/src/core/nodes/actions/delete_command.js +92 -0
  352. package/backend/src/core/nodes/{action_send_log.js → actions/send_log.js} +28 -23
  353. package/backend/src/core/nodes/{action_send_message.js → actions/send_message.js} +32 -32
  354. package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
  355. package/backend/src/core/nodes/actions/update_command.js +133 -0
  356. package/backend/src/core/nodes/arrays/get_next.js +35 -0
  357. package/backend/src/core/nodes/arrays/join.js +28 -0
  358. package/backend/src/core/nodes/{data_cast.js → data/cast.js} +10 -1
  359. package/backend/src/core/nodes/data/datetime_literal.js +27 -0
  360. package/backend/src/core/nodes/data/entity_info.js +69 -0
  361. package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
  362. package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
  363. package/backend/src/core/nodes/{data_get_user_field.js → data/get_user_field.js} +1 -1
  364. package/backend/src/core/nodes/data/type_check.js +53 -0
  365. package/backend/src/core/nodes/{debug_log.js → debug/log.js} +16 -16
  366. package/backend/src/core/nodes/{flow_branch.js → flow/branch.js} +15 -15
  367. package/backend/src/core/nodes/{flow_break.js → flow/break.js} +14 -14
  368. package/backend/src/core/nodes/flow/delay.js +43 -0
  369. package/backend/src/core/nodes/{flow_for_each.js → flow/for_each.js} +39 -39
  370. package/backend/src/core/nodes/{flow_sequence.js → flow/sequence.js} +16 -16
  371. package/backend/src/core/nodes/{flow_switch.js → flow/switch.js} +47 -47
  372. package/backend/src/core/nodes/{flow_while.js → flow/while.js} +1 -1
  373. package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
  374. package/backend/src/core/nodes/logic/not.js +22 -0
  375. package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
  376. package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
  377. package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +1 -1
  378. package/backend/src/core/nodes/strings/to_lower.js +22 -0
  379. package/backend/src/core/nodes/strings/to_upper.js +22 -0
  380. package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
  381. package/backend/src/core/nodes/time/add.js +33 -0
  382. package/backend/src/core/nodes/time/compare.js +35 -0
  383. package/backend/src/core/nodes/time/diff.js +29 -0
  384. package/backend/src/core/nodes/time/format.js +32 -0
  385. package/backend/src/core/nodes/time/now.js +18 -0
  386. package/backend/src/core/nodes/type/to_string.js +32 -0
  387. package/backend/src/core/nodes/{user_check_blacklist.js → users/check_blacklist.js} +37 -37
  388. package/backend/src/core/nodes/{user_get_groups.js → users/get_groups.js} +36 -36
  389. package/backend/src/core/nodes/{user_get_permissions.js → users/get_permissions.js} +36 -36
  390. package/backend/src/core/nodes/{user_set_blacklist.js → users/set_blacklist.js} +37 -37
  391. package/backend/src/core/services/BotLifecycleService.js +835 -0
  392. package/backend/src/core/services/BotProcessManager.js +163 -0
  393. package/backend/src/core/services/CacheManager.js +111 -0
  394. package/backend/src/core/services/CommandExecutionService.js +430 -0
  395. package/backend/src/core/services/DebugSessionManager.js +347 -0
  396. package/backend/src/core/services/GraphCollaborationManager.js +501 -0
  397. package/backend/src/core/services/MinecraftBotManager.js +259 -0
  398. package/backend/src/core/services/MinecraftViewerService.js +216 -0
  399. package/backend/src/core/services/ResourceMonitorService.js +90 -0
  400. package/backend/src/core/services/TelemetryService.js +124 -0
  401. package/backend/src/core/services/TraceCollectorService.js +545 -0
  402. package/backend/src/core/services/ValidationService.js +132 -0
  403. package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
  404. package/backend/src/core/services.js +20 -5
  405. package/backend/src/core/system/CommandContext.js +84 -0
  406. package/backend/src/core/system/RuntimeCommandRegistry.js +116 -0
  407. package/backend/src/core/system/Transport.js +74 -0
  408. package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
  409. package/backend/src/core/utils/jsonParser.js +18 -0
  410. package/backend/src/core/utils/secretsFilter.js +262 -0
  411. package/backend/src/core/utils/variableParser.js +89 -0
  412. package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
  413. package/backend/src/core/validation/nodeSchemas.js +112 -0
  414. package/backend/src/lib/prisma.js +2 -4
  415. package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
  416. package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
  417. package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
  418. package/backend/src/real-time/botApi/handlers/index.js +43 -0
  419. package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
  420. package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
  421. package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
  422. package/backend/src/real-time/botApi/index.js +40 -0
  423. package/backend/src/real-time/botApi/middleware.js +79 -0
  424. package/backend/src/real-time/botApi/utils.js +65 -0
  425. package/backend/src/real-time/panelNamespace.js +387 -0
  426. package/backend/src/real-time/presence.js +7 -2
  427. package/backend/src/real-time/socketHandler.js +400 -5
  428. package/backend/src/repositories/BaseRepository.js +43 -0
  429. package/backend/src/repositories/BotRepository.js +42 -0
  430. package/backend/src/repositories/CommandRepository.js +53 -0
  431. package/backend/src/repositories/EventGraphRepository.js +40 -0
  432. package/backend/src/repositories/GroupRepository.js +69 -0
  433. package/backend/src/repositories/PermissionRepository.js +48 -0
  434. package/backend/src/repositories/PluginRepository.js +42 -0
  435. package/backend/src/repositories/ServerRepository.js +27 -0
  436. package/backend/src/repositories/UserRepository.js +48 -0
  437. package/backend/src/server.js +21 -0
  438. package/backend/src/test-refactor.js +85 -0
  439. package/frontend/dist/assets/index-B1serztM.js +11210 -0
  440. package/frontend/dist/assets/index-t6K1u4OV.css +32 -0
  441. package/frontend/dist/index.html +2 -2
  442. package/frontend/package-lock.json +9437 -0
  443. package/frontend/package.json +8 -5
  444. package/package.json +3 -2
  445. package/screen/console.png +0 -0
  446. package/screen/dashboard.png +0 -0
  447. package/screen/graph_collabe.png +0 -0
  448. package/screen/graph_live_debug.png +0 -0
  449. package/screen/management_command.png +0 -0
  450. package/screen/node_debug_trace.png +0 -0
  451. package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
  452. package/screen/websocket.png +0 -0
  453. package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
  454. package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
  455. package/frontend/dist/assets/index-B9GedHEa.js +0 -8352
  456. package/frontend/dist/assets/index-zLiy9MDx.css +0 -1
  457. package/nul +0 -0
  458. /package/backend/src/core/nodes/{action_http_request.js → actions/http_request.js} +0 -0
  459. /package/backend/src/core/nodes/{array_add_element.js → arrays/add_element.js} +0 -0
  460. /package/backend/src/core/nodes/{array_contains.js → arrays/contains.js} +0 -0
  461. /package/backend/src/core/nodes/{array_find_index.js → arrays/find_index.js} +0 -0
  462. /package/backend/src/core/nodes/{array_get_by_index.js → arrays/get_by_index.js} +0 -0
  463. /package/backend/src/core/nodes/{array_get_random_element.js → arrays/get_random_element.js} +0 -0
  464. /package/backend/src/core/nodes/{array_remove_by_index.js → arrays/remove_by_index.js} +0 -0
  465. /package/backend/src/core/nodes/{bot_get_position.js → bot/get_position.js} +0 -0
  466. /package/backend/src/core/nodes/{data_array_literal.js → data/array_literal.js} +0 -0
  467. /package/backend/src/core/nodes/{data_boolean_literal.js → data/boolean_literal.js} +0 -0
  468. /package/backend/src/core/nodes/{data_get_argument.js → data/get_argument.js} +0 -0
  469. /package/backend/src/core/nodes/{data_get_bot_look.js → data/get_bot_look.js} +0 -0
  470. /package/backend/src/core/nodes/{data_get_entity_field.js → data/get_entity_field.js} +0 -0
  471. /package/backend/src/core/nodes/{data_get_server_players.js → data/get_server_players.js} +0 -0
  472. /package/backend/src/core/nodes/{data_get_variable.js → data/get_variable.js} +0 -0
  473. /package/backend/src/core/nodes/{data_length.js → data/length.js} +0 -0
  474. /package/backend/src/core/nodes/{data_make_object.js → data/make_object.js} +0 -0
  475. /package/backend/src/core/nodes/{data_number_literal.js → data/number_literal.js} +0 -0
  476. /package/backend/src/core/nodes/{data_string_literal.js → data/string_literal.js} +0 -0
  477. /package/backend/src/core/nodes/{logic_compare.js → logic/compare.js} +0 -0
  478. /package/backend/src/core/nodes/{logic_operation.js → logic/operation.js} +0 -0
  479. /package/backend/src/core/nodes/{math_operation.js → math/operation.js} +0 -0
  480. /package/backend/src/core/nodes/{math_random_number.js → math/random_number.js} +0 -0
  481. /package/backend/src/core/nodes/{object_create.js → objects/create.js} +0 -0
  482. /package/backend/src/core/nodes/{object_delete.js → objects/delete.js} +0 -0
  483. /package/backend/src/core/nodes/{object_get.js → objects/get.js} +0 -0
  484. /package/backend/src/core/nodes/{object_has_key.js → objects/has_key.js} +0 -0
  485. /package/backend/src/core/nodes/{object_set.js → objects/set.js} +0 -0
  486. /package/backend/src/core/nodes/{string_concat.js → strings/concat.js} +0 -0
  487. /package/backend/src/core/nodes/{string_contains.js → strings/contains.js} +0 -0
  488. /package/backend/src/core/nodes/{string_ends_with.js → strings/ends_with.js} +0 -0
  489. /package/backend/src/core/nodes/{string_equals.js → strings/equals.js} +0 -0
  490. /package/backend/src/core/nodes/{string_length.js → strings/length.js} +0 -0
  491. /package/backend/src/core/nodes/{string_matches.js → strings/matches.js} +0 -0
  492. /package/backend/src/core/nodes/{string_split.js → strings/split.js} +0 -0
@@ -0,0 +1,189 @@
1
+ const prismaService = require('../../PrismaService');
2
+ const prisma = prismaService.getClient();
3
+ const { getRuntimeCommandRegistry } = require('../../system/RuntimeCommandRegistry');
4
+ const Command = require('../../system/Command');
5
+
6
+ /**
7
+ * Создает новую команду (временную или постоянную)
8
+ * @param {object} node - Экземпляр узла из графа
9
+ * @param {object} context - Контекст выполнения графа
10
+ * @param {object} helpers - Вспомогательные функции движка
11
+ */
12
+ async function execute(node, context, helpers) {
13
+ const { resolvePinValue, traverse, memo } = helpers;
14
+ const { botId, botManager } = context;
15
+
16
+ try {
17
+ const name = await resolvePinValue(node, 'name');
18
+ const description = await resolvePinValue(node, 'description', '');
19
+ let aliases = await resolvePinValue(node, 'aliases', []);
20
+ const cooldown = await resolvePinValue(node, 'cooldown', 0);
21
+ let allowedChatTypes = await resolvePinValue(node, 'allowedChatTypes', ['chat', 'private']);
22
+ const permissionName = await resolvePinValue(node, 'permissionName', null);
23
+ const temporary = await resolvePinValue(node, 'temporary', false);
24
+
25
+ if (typeof aliases === 'string') {
26
+ try {
27
+ const normalizedString = aliases.replace(/'/g, '"');
28
+ aliases = JSON.parse(normalizedString);
29
+ } catch (e) {
30
+ console.warn('[create_command] Не удалось распарсить aliases:', e);
31
+ aliases = [];
32
+ }
33
+ }
34
+
35
+ if (typeof allowedChatTypes === 'string') {
36
+ try {
37
+ const normalizedString = allowedChatTypes.replace(/'/g, '"');
38
+ allowedChatTypes = JSON.parse(normalizedString);
39
+ } catch (e) {
40
+ console.warn('[create_command] Не удалось распарсить allowedChatTypes:', e);
41
+ allowedChatTypes = ['chat', 'private'];
42
+ }
43
+ }
44
+
45
+ if (!name) {
46
+ console.error('[create_command] Имя команды обязательно');
47
+ memo.set(`${node.id}:success`, false);
48
+ memo.set(`${node.id}:commandId`, null);
49
+ await traverse(node, 'exec');
50
+ return;
51
+ }
52
+
53
+ let commandId = null;
54
+
55
+ if (temporary) {
56
+ commandId = `temp_${Date.now()}`;
57
+
58
+ let permissionId = null;
59
+
60
+ if (permissionName) {
61
+ const permission = await prisma.permission.findFirst({
62
+ where: {
63
+ botId,
64
+ name: permissionName
65
+ }
66
+ });
67
+
68
+ if (permission) {
69
+ permissionId = permission.id;
70
+ }
71
+ }
72
+
73
+ const tempCommand = new Command({
74
+ name,
75
+ description: description || '',
76
+ aliases: Array.isArray(aliases) ? aliases : [],
77
+ cooldown: cooldown || 0,
78
+ allowedChatTypes: Array.isArray(allowedChatTypes) ? allowedChatTypes : ['chat', 'private'],
79
+ args: [],
80
+ owner: 'runtime',
81
+ });
82
+
83
+ tempCommand.permissionId = permissionId;
84
+ tempCommand.isTemporary = true;
85
+ tempCommand.tempId = commandId;
86
+ tempCommand.isVisual = false;
87
+
88
+ tempCommand.handler = () => {
89
+ // Handler будет вызван через validate_and_run_command в BotProcess
90
+ };
91
+
92
+ // Регистрируем в runtime registry (для главного процесса)
93
+ const runtimeRegistry = getRuntimeCommandRegistry();
94
+ runtimeRegistry.register(botId, name, tempCommand);
95
+
96
+ // Также регистрируем алиасы в runtime registry
97
+ if (Array.isArray(aliases)) {
98
+ for (const alias of aliases) {
99
+ runtimeRegistry.register(botId, alias, tempCommand);
100
+ }
101
+ }
102
+
103
+ // Отправляем IPC сообщение в child process для регистрации команды
104
+ if (botManager && botManager.processManager) {
105
+ botManager.processManager.sendMessage(botId, {
106
+ type: 'register_temp_command',
107
+ commandData: {
108
+ name,
109
+ description: description || '',
110
+ aliases: Array.isArray(aliases) ? aliases : [],
111
+ cooldown: cooldown || 0,
112
+ allowedChatTypes: Array.isArray(allowedChatTypes) ? allowedChatTypes : ['chat', 'private'],
113
+ permissionId,
114
+ tempId: commandId,
115
+ }
116
+ });
117
+ }
118
+
119
+ console.log(`[create_command] Временная команда "${name}" создана с ID ${commandId}`);
120
+ } else {
121
+ const existingCommand = await prisma.command.findFirst({
122
+ where: { botId, name }
123
+ });
124
+
125
+ if (existingCommand) {
126
+ console.error(`[create_command] Команда "${name}" уже существует`);
127
+ memo.set(`${node.id}:success`, false);
128
+ memo.set(`${node.id}:commandId`, null);
129
+ await traverse(node, 'exec');
130
+ return;
131
+ }
132
+
133
+ let permissionId = null;
134
+ if (permissionName) {
135
+ const permission = await prisma.permission.findFirst({
136
+ where: {
137
+ botId,
138
+ name: permissionName
139
+ }
140
+ });
141
+
142
+ if (permission) {
143
+ permissionId = permission.id;
144
+ } else {
145
+ console.warn(`[create_command] Право "${permissionName}" не найдено, команда будет создана без права`);
146
+ }
147
+ }
148
+
149
+ const newCommand = await prisma.command.create({
150
+ data: {
151
+ botId,
152
+ name,
153
+ description: description || '',
154
+ aliases: JSON.stringify(Array.isArray(aliases) ? aliases : []),
155
+ permissionId: permissionId || null,
156
+ cooldown: cooldown || 0,
157
+ allowedChatTypes: JSON.stringify(Array.isArray(allowedChatTypes) ? allowedChatTypes : ['chat', 'private']),
158
+ isVisual: true,
159
+ argumentsJson: '[]',
160
+ graphJson: JSON.stringify({
161
+ nodes: [],
162
+ edges: []
163
+ }),
164
+ pluginOwnerId: null
165
+ }
166
+ });
167
+
168
+ commandId = newCommand.id;
169
+ console.log(`[create_command] Постоянная команда "${name}" создана с ID ${commandId}`);
170
+
171
+ if (botManager && botManager.reloadBotConfigInRealTime) {
172
+ botManager.reloadBotConfigInRealTime(botId);
173
+ }
174
+ }
175
+
176
+ memo.set(`${node.id}:commandId`, commandId);
177
+ memo.set(`${node.id}:success`, true);
178
+ } catch (error) {
179
+ console.error('[create_command] Ошибка создания команды:', error);
180
+ memo.set(`${node.id}:success`, false);
181
+ memo.set(`${node.id}:commandId`, null);
182
+ }
183
+
184
+ await traverse(node, 'exec');
185
+ }
186
+
187
+ module.exports = {
188
+ execute,
189
+ };
@@ -0,0 +1,92 @@
1
+ const prismaService = require('../../PrismaService');
2
+ const prisma = prismaService.getClient();
3
+ const { getRuntimeCommandRegistry } = require('../../system/RuntimeCommandRegistry');
4
+
5
+ /**
6
+ * Удаляет существующую команду
7
+ * @param {object} node - Экземпляр узла из графа
8
+ * @param {object} context - Контекст выполнения графа
9
+ * @param {object} helpers - Вспомогательные функции движка
10
+ */
11
+ async function execute(node, context, helpers) {
12
+ const { resolvePinValue, traverse, memo } = helpers;
13
+ const { botId, botManager } = context;
14
+
15
+ try {
16
+ const commandName = await resolvePinValue(node, 'commandName');
17
+
18
+ if (!commandName) {
19
+ console.error('[delete_command] Имя команды обязательно');
20
+ memo.set(`${node.id}:success`, false);
21
+ await traverse(node, 'exec');
22
+ return;
23
+ }
24
+
25
+ const runtimeRegistry = getRuntimeCommandRegistry();
26
+
27
+ if (runtimeRegistry.has(botId, commandName)) {
28
+ const tempCommand = runtimeRegistry.get(botId, commandName);
29
+ const aliases = tempCommand && tempCommand.aliases ? tempCommand.aliases : [];
30
+
31
+ runtimeRegistry.unregister(botId, commandName);
32
+
33
+ if (Array.isArray(aliases)) {
34
+ for (const alias of aliases) {
35
+ runtimeRegistry.unregister(botId, alias);
36
+ }
37
+ }
38
+
39
+ if (botManager && botManager.processManager) {
40
+ botManager.processManager.sendMessage(botId, {
41
+ type: 'unregister_temp_command',
42
+ commandName,
43
+ aliases
44
+ });
45
+ }
46
+
47
+ console.log(`[delete_command] Временная команда "${commandName}" успешно удалена`);
48
+ memo.set(`${node.id}:success`, true);
49
+ await traverse(node, 'exec');
50
+ return;
51
+ }
52
+
53
+ const existingCommand = await prisma.command.findFirst({
54
+ where: { name: commandName, botId }
55
+ });
56
+
57
+ if (!existingCommand) {
58
+ console.error(`[delete_command] Команда "${commandName}" не найдена`);
59
+ memo.set(`${node.id}:success`, false);
60
+ await traverse(node, 'exec');
61
+ return;
62
+ }
63
+
64
+ if (!existingCommand.isVisual) {
65
+ console.error(`[delete_command] Команда "${commandName}" является системной и не может быть удалена`);
66
+ memo.set(`${node.id}:success`, false);
67
+ await traverse(node, 'exec');
68
+ return;
69
+ }
70
+
71
+ await prisma.command.delete({
72
+ where: { id: existingCommand.id }
73
+ });
74
+
75
+ console.log(`[delete_command] Команда "${commandName}" успешно удалена`);
76
+
77
+ if (botManager && botManager.reloadBotConfigInRealTime) {
78
+ botManager.reloadBotConfigInRealTime(botId);
79
+ }
80
+
81
+ memo.set(`${node.id}:success`, true);
82
+ } catch (error) {
83
+ console.error('[delete_command] Ошибка удаления команды:', error);
84
+ memo.set(`${node.id}:success`, false);
85
+ }
86
+
87
+ await traverse(node, 'exec');
88
+ }
89
+
90
+ module.exports = {
91
+ execute,
92
+ };
@@ -1,23 +1,28 @@
1
- /**
2
- * @param {object} node - Экземпляр узла из графа.
3
- * @param {object} context - Контекст выполнения графа.
4
- * @param {object} helpers - Вспомогательные функции движка.
5
- * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
- * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
- */
8
- async function execute(node, context, helpers) {
9
- const message = await helpers.resolvePinValue(node, 'message', '');
10
-
11
- // this.botManager - это экземпляр botManager из GraphExecutionEngine
12
- if (this.botManager?.appendLog && context?.botId) {
13
- this.botManager.appendLog(context.botId, `[Graph] ${message}`);
14
- } else {
15
- console.log(`[Graph Log] ${message}`);
16
- }
17
-
18
- await helpers.traverse(node, 'exec');
19
- }
20
-
21
- module.exports = {
22
- execute,
23
- };
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ let message = await helpers.resolvePinValue(node, 'message', '');
10
+
11
+ // Если сообщение - это объект или массив, форматируем как JSON
12
+ if (typeof message === 'object' && message !== null) {
13
+ message = JSON.stringify(message, null, 2);
14
+ }
15
+
16
+ if (context?.bot?.sendLog) {
17
+ context.bot.sendLog(`[Graph] ${message}`);
18
+ } else {
19
+ // Fallback - консоль терминала
20
+ console.log(`[Graph Log] ${message}`);
21
+ }
22
+
23
+ await helpers.traverse(node, 'exec');
24
+ }
25
+
26
+ module.exports = {
27
+ execute,
28
+ };
@@ -1,32 +1,32 @@
1
- /**
2
- * @param {object} node - Экземпляр узла из графа.
3
- * @param {object} context - Контекст выполнения графа.
4
- * @param {object} helpers - Вспомогательные функции движка.
5
- * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
- * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
- */
8
- async function execute(node, context, helpers) {
9
- const { resolvePinValue, traverse } = helpers;
10
-
11
- let message = String(await resolvePinValue(node, 'message', ''));
12
- const chatType = await resolvePinValue(node, 'chat_type', context.typeChat);
13
- const recipient = await resolvePinValue(node, 'recipient', context.user?.username);
14
-
15
- // Парсим и заменяем переменные в формате {varName}
16
- const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
17
- const matches = [...message.matchAll(variablePattern)];
18
-
19
- for (const match of matches) {
20
- const varName = match[1];
21
- // Для динамических пинов, созданных на фронтенде, значение нужно будет получить, используя resolvePinValue
22
- const varValue = await resolvePinValue(node, `var_${varName}`, '');
23
- message = message.replace(match[0], String(varValue));
24
- }
25
-
26
- context.bot.sendMessage(chatType, message, recipient);
27
- await traverse(node, 'exec');
28
- }
29
-
30
- module.exports = {
31
- execute,
32
- };
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const { resolvePinValue, traverse } = helpers;
10
+
11
+ let message = String(await resolvePinValue(node, 'message', ''));
12
+ const chatType = await resolvePinValue(node, 'chat_type', context.typeChat);
13
+ const recipient = await resolvePinValue(node, 'recipient', context.user?.username);
14
+
15
+ // Парсим и заменяем переменные в формате {varName}
16
+ const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
17
+ const matches = [...message.matchAll(variablePattern)];
18
+
19
+ for (const match of matches) {
20
+ const varName = match[1];
21
+ // Для динамических пинов, созданных на фронтенде, значение нужно будет получить, используя resolvePinValue
22
+ const varValue = await resolvePinValue(node, `var_${varName}`, '');
23
+ message = message.replace(match[0], String(varValue));
24
+ }
25
+
26
+ context.bot.sendMessage(chatType, message, recipient);
27
+ await traverse(node, 'exec');
28
+ }
29
+
30
+ module.exports = {
31
+ execute,
32
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Нода: Отправить ответ в WebSocket
3
+ * Отправляет данные обратно клиенту, вызвавшему граф через WebSocket API
4
+ *
5
+ * @param {object} node - Экземпляр узла из графа.
6
+ * @param {object} context - Контекст выполнения графа.
7
+ * @param {object} helpers - Вспомогательные функции движка.
8
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
9
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
10
+ */
11
+ async function execute(node, context, helpers) {
12
+ const data = await helpers.resolvePinValue(node, 'data', null);
13
+
14
+ // Проверяем, что граф был вызван через WebSocket API
15
+ if (!context.sendResponse || typeof context.sendResponse !== 'function') {
16
+ console.warn('[WebSocket Response] Нода может использоваться только в графах, вызванных через WebSocket API');
17
+ await helpers.traverse(node, 'exec');
18
+ return;
19
+ }
20
+
21
+ // Отправляем ответ клиенту
22
+ try {
23
+ context.sendResponse(data);
24
+ console.log('[WebSocket Response] Ответ отправлен клиенту:', data);
25
+ } catch (error) {
26
+ console.error('[WebSocket Response] Ошибка отправки ответа:', error);
27
+ }
28
+
29
+ // Продолжаем выполнение графа
30
+ await helpers.traverse(node, 'exec');
31
+ }
32
+
33
+ module.exports = { execute };
@@ -0,0 +1,133 @@
1
+ const prismaService = require('../../PrismaService');
2
+ const prisma = prismaService.getClient();
3
+
4
+ /**
5
+ * Обновляет существующую команду
6
+ * @param {object} node - Экземпляр узла из графа
7
+ * @param {object} context - Контекст выполнения графа
8
+ * @param {object} helpers - Вспомогательные функции движка
9
+ */
10
+ async function execute(node, context, helpers) {
11
+ const { resolvePinValue, traverse, memo } = helpers;
12
+ const { botId, botManager } = context;
13
+
14
+ try {
15
+ const commandName = await resolvePinValue(node, 'commandName');
16
+ const newName = await resolvePinValue(node, 'newName', null);
17
+ const description = await resolvePinValue(node, 'description', null);
18
+ let aliases = await resolvePinValue(node, 'aliases', null);
19
+ const cooldown = await resolvePinValue(node, 'cooldown', null);
20
+ let allowedChatTypes = await resolvePinValue(node, 'allowedChatTypes', null);
21
+ const permissionName = await resolvePinValue(node, 'permissionName', null);
22
+
23
+ if (aliases !== null && typeof aliases === 'string') {
24
+ try {
25
+ const normalizedString = aliases.replace(/'/g, '"');
26
+ aliases = JSON.parse(normalizedString);
27
+ } catch (e) {
28
+ console.warn('[update_command] Не удалось распарсить aliases:', e);
29
+ aliases = null;
30
+ }
31
+ }
32
+
33
+ if (allowedChatTypes !== null && typeof allowedChatTypes === 'string') {
34
+ try {
35
+ const normalizedString = allowedChatTypes.replace(/'/g, '"');
36
+ allowedChatTypes = JSON.parse(normalizedString);
37
+ } catch (e) {
38
+ console.warn('[update_command] Не удалось распарсить allowedChatTypes:', e);
39
+ allowedChatTypes = null;
40
+ }
41
+ }
42
+
43
+ if (!commandName) {
44
+ console.error('[update_command] Имя команды обязательно');
45
+ memo.set(`${node.id}:success`, false);
46
+ await traverse(node, 'exec');
47
+ return;
48
+ }
49
+
50
+ const existingCommand = await prisma.command.findFirst({
51
+ where: { name: commandName, botId }
52
+ });
53
+
54
+ if (!existingCommand) {
55
+ console.error(`[update_command] Команда "${commandName}" не найдена`);
56
+ memo.set(`${node.id}:success`, false);
57
+ await traverse(node, 'exec');
58
+ return;
59
+ }
60
+
61
+ if (newName && newName !== existingCommand.name) {
62
+ const duplicateCommand = await prisma.command.findFirst({
63
+ where: {
64
+ botId,
65
+ name: newName,
66
+ id: { not: existingCommand.id }
67
+ }
68
+ });
69
+
70
+ if (duplicateCommand) {
71
+ console.error(`[update_command] Команда с именем "${newName}" уже существует`);
72
+ memo.set(`${node.id}:success`, false);
73
+ await traverse(node, 'exec');
74
+ return;
75
+ }
76
+ }
77
+
78
+ const updateData = {};
79
+
80
+ if (newName !== null) updateData.name = newName;
81
+ if (description !== null) updateData.description = description;
82
+ if (aliases !== null) {
83
+ updateData.aliases = JSON.stringify(Array.isArray(aliases) ? aliases : []);
84
+ }
85
+ if (cooldown !== null) updateData.cooldown = cooldown;
86
+ if (allowedChatTypes !== null) {
87
+ updateData.allowedChatTypes = JSON.stringify(
88
+ Array.isArray(allowedChatTypes) ? allowedChatTypes : ['chat', 'private']
89
+ );
90
+ }
91
+
92
+ if (permissionName !== null) {
93
+ if (permissionName === '') {
94
+ updateData.permissionId = null;
95
+ } else {
96
+ const permission = await prisma.permission.findFirst({
97
+ where: {
98
+ botId,
99
+ name: permissionName
100
+ }
101
+ });
102
+
103
+ if (permission) {
104
+ updateData.permissionId = permission.id;
105
+ } else {
106
+ console.warn(`[update_command] Право "${permissionName}" не найдено, поле не будет обновлено`);
107
+ }
108
+ }
109
+ }
110
+
111
+ await prisma.command.update({
112
+ where: { id: existingCommand.id },
113
+ data: updateData
114
+ });
115
+
116
+ console.log(`[update_command] Команда "${commandName}" успешно обновлена`);
117
+
118
+ if (botManager && botManager.reloadBotConfigInRealTime) {
119
+ botManager.reloadBotConfigInRealTime(botId);
120
+ }
121
+
122
+ memo.set(`${node.id}:success`, true);
123
+ } catch (error) {
124
+ console.error('[update_command] Ошибка обновления команды:', error);
125
+ memo.set(`${node.id}:success`, false);
126
+ }
127
+
128
+ await traverse(node, 'exec');
129
+ }
130
+
131
+ module.exports = {
132
+ execute,
133
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Получает следующий элемент массива по текущему индексу
3
+ */
4
+ async function evaluate(node, pinId, context, helpers) {
5
+ const { resolvePinValue } = helpers;
6
+ const arr = await resolvePinValue(node, 'array', []);
7
+ const currentIndex = await resolvePinValue(node, 'current_index', -1);
8
+
9
+ const nextIndex = currentIndex + 1;
10
+ const hasNext = Array.isArray(arr) && nextIndex >= 0 && nextIndex < arr.length;
11
+
12
+ switch (pinId) {
13
+ case 'next_element':
14
+ return hasNext ? arr[nextIndex] : null;
15
+
16
+ case 'next_index':
17
+ return nextIndex;
18
+
19
+ case 'has_next':
20
+ return hasNext;
21
+
22
+ default:
23
+ return null;
24
+ }
25
+ }
26
+
27
+ module.exports = {
28
+ evaluate,
29
+ };
30
+
31
+
32
+
33
+
34
+
35
+
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'result') {
13
+ const array = await resolvePinValue(node, 'array', []);
14
+ const separator = String(await resolvePinValue(node, 'separator', ', '));
15
+
16
+ if (!Array.isArray(array)) {
17
+ return '';
18
+ }
19
+
20
+ return array.join(separator);
21
+ }
22
+
23
+ return '';
24
+ }
25
+
26
+ module.exports = {
27
+ evaluate,
28
+ };
@@ -9,12 +9,21 @@
9
9
  async function evaluate(node, pinId, context, helpers) {
10
10
  const { resolvePinValue } = helpers;
11
11
 
12
- if (pinId === 'value') {
12
+ // Поддерживаем оба варианта: 'result' (новая версия) и 'value' (старая версия для обратной совместимости)
13
+ if (pinId === 'result' || pinId === 'value') {
13
14
  const value = await resolvePinValue(node, 'value');
14
15
  const targetType = node.data?.targetType || 'String';
15
16
 
16
17
  switch (targetType) {
17
18
  case 'String':
19
+ // Для объектов и массивов используем JSON.stringify
20
+ if (typeof value === 'object' && value !== null) {
21
+ try {
22
+ return JSON.stringify(value);
23
+ } catch (e) {
24
+ return String(value ?? '');
25
+ }
26
+ }
18
27
  return String(value ?? '');
19
28
  case 'Number':
20
29
  const num = Number(value);