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,113 @@
1
+ const { GRAPH_TYPES } = require('../constants/graphTypes');
2
+
3
+ /**
4
+ * Регистрация нод категории "Время"
5
+ */
6
+ function registerNodes(registry) {
7
+ registry.registerNodeType({
8
+ type: 'time:datetime_literal',
9
+ label: '📅 Дата и время',
10
+ category: 'Время',
11
+ description: 'Создает объект даты и времени из строки. Если строка пустая, вернет текущее время.',
12
+ graphType: GRAPH_TYPES.ALL,
13
+ evaluator: require('../nodes/data/datetime_literal').evaluate,
14
+ pins: {
15
+ inputs: [
16
+ { id: 'date', name: 'Дата (строка)', type: 'String', required: false }
17
+ ],
18
+ outputs: [
19
+ { id: 'value', name: 'Дата', type: 'DateTime' }
20
+ ]
21
+ }
22
+ });
23
+
24
+ registry.registerNodeType({
25
+ type: 'time:now',
26
+ label: '⏰ Текущее время',
27
+ category: 'Время',
28
+ description: 'Возвращает текущую дату и время.',
29
+ graphType: GRAPH_TYPES.ALL,
30
+ evaluator: require('../nodes/time/now').evaluate,
31
+ pins: {
32
+ inputs: [],
33
+ outputs: [
34
+ { id: 'now', name: 'Сейчас', type: 'DateTime' }
35
+ ]
36
+ }
37
+ });
38
+
39
+ registry.registerNodeType({
40
+ type: 'time:format',
41
+ label: '📝 Отформатировать дату',
42
+ category: 'Время',
43
+ description: 'Форматирует дату в строку. Формат по-умолчанию: yyyy-MM-dd HH:mm:ss',
44
+ graphType: GRAPH_TYPES.ALL,
45
+ evaluator: require('../nodes/time/format').evaluate,
46
+ pins: {
47
+ inputs: [
48
+ { id: 'date', name: 'Дата', type: 'DateTime', required: true },
49
+ { id: 'format', name: 'Формат', type: 'String', required: false }
50
+ ],
51
+ outputs: [
52
+ { id: 'formatted', name: 'Строка', type: 'String' }
53
+ ]
54
+ }
55
+ });
56
+
57
+ registry.registerNodeType({
58
+ type: 'time:add',
59
+ label: '➕ Прибавить время',
60
+ category: 'Время',
61
+ description: 'Добавляет к дате указанный промежуток времени. Пример объекта продолжительности: { "seconds": 5, "minutes": 1 }',
62
+ graphType: GRAPH_TYPES.ALL,
63
+ evaluator: require('../nodes/time/add').evaluate,
64
+ pins: {
65
+ inputs: [
66
+ { id: 'date', name: 'Дата', type: 'DateTime', required: true },
67
+ { id: 'duration', name: 'Продолжительность (объект)', type: 'Object', required: true }
68
+ ],
69
+ outputs: [
70
+ { id: 'result', name: 'Новая дата', type: 'DateTime' }
71
+ ]
72
+ }
73
+ });
74
+
75
+ registry.registerNodeType({
76
+ type: 'time:diff',
77
+ label: '↔️ Разница во времени',
78
+ category: 'Время',
79
+ description: 'Вычисляет разницу между двумя датами в миллисекундах (Дата А - Дата Б).',
80
+ graphType: GRAPH_TYPES.ALL,
81
+ evaluator: require('../nodes/time/diff').evaluate,
82
+ pins: {
83
+ inputs: [
84
+ { id: 'date_left', name: 'Дата А', type: 'DateTime', required: true },
85
+ { id: 'date_right', name: 'Дата Б', type: 'DateTime', required: true }
86
+ ],
87
+ outputs: [
88
+ { id: 'diff', name: 'Разница (мс)', type: 'Number' }
89
+ ]
90
+ }
91
+ });
92
+
93
+ registry.registerNodeType({
94
+ type: 'time:compare',
95
+ label: '⚖️ Сравнить даты',
96
+ category: 'Время',
97
+ description: 'Сравнивает две даты.',
98
+ graphType: GRAPH_TYPES.ALL,
99
+ evaluator: require('../nodes/time/compare').evaluate,
100
+ pins: {
101
+ inputs: [
102
+ { id: 'date_left', name: 'Дата А', type: 'DateTime', required: true },
103
+ { id: 'date_right', name: 'Дата Б', type: 'DateTime', required: true },
104
+ { id: 'operation', name: 'Операция', type: 'String', required: false }
105
+ ],
106
+ outputs: [
107
+ { id: 'result', name: 'Результат', type: 'Boolean' }
108
+ ]
109
+ }
110
+ });
111
+ }
112
+
113
+ module.exports = { registerNodes };
@@ -0,0 +1,79 @@
1
+ const { GRAPH_TYPES } = require('../constants/graphTypes');
2
+
3
+ /**
4
+ * Регистрация нод категории "Пользователи"
5
+ */
6
+ function registerNodes(registry) {
7
+ registry.registerNodeType({
8
+ type: 'user:check_blacklist',
9
+ label: '❓ В черном списке?',
10
+ category: 'Пользователи',
11
+ description: 'Проверяет, находится ли пользователь в черном списке.',
12
+ graphType: GRAPH_TYPES.ALL,
13
+ evaluator: require('../nodes/users/check_blacklist').evaluate,
14
+ pins: {
15
+ inputs: [
16
+ { id: 'user', name: 'Пользователь', type: 'User', required: true }
17
+ ],
18
+ outputs: [
19
+ { id: 'is_blacklisted', name: 'В ЧС', type: 'Boolean' }
20
+ ]
21
+ }
22
+ });
23
+
24
+ registry.registerNodeType({
25
+ type: 'user:set_blacklist',
26
+ label: '🚫 Установить ЧС',
27
+ category: 'Пользователи',
28
+ description: 'Добавляет или убирает пользователя из черного списка.',
29
+ graphType: GRAPH_TYPES.ALL,
30
+ executor: require('../nodes/users/set_blacklist').execute,
31
+ pins: {
32
+ inputs: [
33
+ { id: 'exec', name: 'Выполнить', type: 'Exec', required: true },
34
+ { id: 'user', name: 'Пользователь', type: 'User', required: true },
35
+ { id: 'blacklist_status', name: 'Статус ЧС', type: 'Boolean', required: true }
36
+ ],
37
+ outputs: [
38
+ { id: 'exec', name: 'Далее', type: 'Exec' },
39
+ { id: 'updated_user', name: 'Обновленный пользователь', type: 'User' }
40
+ ]
41
+ }
42
+ });
43
+
44
+ registry.registerNodeType({
45
+ type: 'user:get_groups',
46
+ label: '👥 Получить группы',
47
+ category: 'Пользователи',
48
+ description: 'Возвращает массив названий групп, в которых состоит пользователь.',
49
+ graphType: GRAPH_TYPES.ALL,
50
+ evaluator: require('../nodes/users/get_groups').evaluate,
51
+ pins: {
52
+ inputs: [
53
+ { id: 'user', name: 'Пользователь', type: 'User', required: true }
54
+ ],
55
+ outputs: [
56
+ { id: 'groups', name: 'Группы', type: 'Array' }
57
+ ]
58
+ }
59
+ });
60
+
61
+ registry.registerNodeType({
62
+ type: 'user:get_permissions',
63
+ label: '🔑 Получить права',
64
+ category: 'Пользователи',
65
+ description: 'Возвращает массив прав пользователя.',
66
+ graphType: GRAPH_TYPES.ALL,
67
+ evaluator: require('../nodes/users/get_permissions').evaluate,
68
+ pins: {
69
+ inputs: [
70
+ { id: 'user', name: 'Пользователь', type: 'User', required: true }
71
+ ],
72
+ outputs: [
73
+ { id: 'permissions', name: 'Права', type: 'Array' }
74
+ ]
75
+ }
76
+ });
77
+ }
78
+
79
+ module.exports = { registerNodes };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const { resolvePinValue, traverse } = helpers;
10
+
11
+ const target = await resolvePinValue(node, 'target');
12
+ const yOffset = await resolvePinValue(node, 'add_y', 0);
13
+
14
+ if (target && context.bot?.lookAt) {
15
+ let finalPosition;
16
+ // Если цель - это сущность, у которой есть позиция
17
+ if (target.position) {
18
+ finalPosition = { ...target.position };
19
+ }
20
+ // Если цель - это объект с координатами
21
+ else if (target.x !== undefined && target.y !== undefined && target.z !== undefined) {
22
+ finalPosition = { ...target };
23
+ }
24
+
25
+ if (finalPosition) {
26
+ finalPosition.y += Number(yOffset || 0);
27
+ context.bot.lookAt(finalPosition);
28
+ }
29
+ }
30
+
31
+ await traverse(node, 'exec');
32
+ }
33
+
34
+ module.exports = {
35
+ execute,
36
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const { resolvePinValue, traverse } = helpers;
10
+
11
+ const varName = await resolvePinValue(node, 'name', '');
12
+ const varValue = await resolvePinValue(node, 'value');
13
+ let shouldPersist = await resolvePinValue(node, 'persist', false);
14
+
15
+ // В графах команд принудительно отключаем сохранение в БД, чтобы избежать случайных записей
16
+ if (context.eventType === 'command') {
17
+ shouldPersist = false;
18
+ }
19
+
20
+ if (varName) {
21
+ context.variables[varName] = varValue;
22
+ if (context.persistenceIntent) {
23
+ context.persistenceIntent.set(varName, shouldPersist);
24
+ }
25
+ }
26
+
27
+ await traverse(node, 'exec');
28
+ }
29
+
30
+ module.exports = {
31
+ execute,
32
+ };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ * @param {Map} helpers.memo - Карта для мемоизации значений.
8
+ */
9
+ async function execute(node, context, helpers) {
10
+ const { resolvePinValue, traverse, memo } = helpers;
11
+
12
+ const url = await resolvePinValue(node, 'url', '');
13
+ const method = await resolvePinValue(node, 'method', node.data?.method || 'GET');
14
+ const headersStr = await resolvePinValue(node, 'headers', '');
15
+ const body = await resolvePinValue(node, 'body', '');
16
+ const timeout = await resolvePinValue(node, 'timeout', 5000);
17
+
18
+ let headers = {};
19
+ if (headersStr) {
20
+ try {
21
+ headers = JSON.parse(headersStr);
22
+ } catch (e) {
23
+ console.error('[HTTP Request] Ошибка парсинга headers:', e);
24
+ headers = {};
25
+ }
26
+ }
27
+
28
+ let requestBody = null;
29
+ if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
30
+ if (typeof body === 'object') {
31
+ requestBody = JSON.stringify(body);
32
+ } else if (typeof body === 'string') {
33
+ // Пробуем распарсить строку как JSON
34
+ try {
35
+ const parsed = JSON.parse(body);
36
+ requestBody = JSON.stringify(parsed);
37
+ } catch {
38
+ // Если не JSON, отправляем как есть
39
+ requestBody = body;
40
+ }
41
+ } else {
42
+ requestBody = String(body);
43
+ }
44
+
45
+ if (!headers['Content-Type']) {
46
+ headers['Content-Type'] = 'application/json';
47
+ }
48
+ }
49
+
50
+ try {
51
+ const controller = new AbortController();
52
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
53
+
54
+ const response = await fetch(url, {
55
+ method,
56
+ headers,
57
+ body: requestBody,
58
+ signal: controller.signal
59
+ });
60
+
61
+ clearTimeout(timeoutId);
62
+
63
+ const responseText = await response.text();
64
+ let responseBody;
65
+ try {
66
+ responseBody = JSON.parse(responseText);
67
+ } catch {
68
+ responseBody = responseText;
69
+ }
70
+
71
+ const responseHeaders = {};
72
+ response.headers.forEach((value, key) => {
73
+ responseHeaders[key] = value;
74
+ });
75
+
76
+ memo.set(`${node.id}:status`, response.status);
77
+ memo.set(`${node.id}:response`, responseBody);
78
+ memo.set(`${node.id}:response_headers`, responseHeaders);
79
+ memo.set(`${node.id}:success`, response.ok);
80
+ memo.set(`${node.id}:error`, null);
81
+
82
+ await traverse(node, 'exec');
83
+ } catch (error) {
84
+ console.error('[HTTP Request] Ошибка запроса:', error);
85
+
86
+ memo.set(`${node.id}:status`, 0);
87
+ memo.set(`${node.id}:response`, null);
88
+ memo.set(`${node.id}:response_headers`, {});
89
+ memo.set(`${node.id}:success`, false);
90
+ memo.set(`${node.id}:error`, error.message);
91
+
92
+ await traverse(node, 'exec_error');
93
+ }
94
+ }
95
+
96
+ module.exports = {
97
+ execute,
98
+ };
@@ -0,0 +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
+ 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
+ };
@@ -0,0 +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
+ };
@@ -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,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'result') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+ return Array.isArray(arr) ? [...arr, element] : [element];
16
+ }
17
+
18
+ return [];
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @param {Map} helpers.memo - Map для хранения мемоизированных значений.
8
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue, memo } = helpers;
12
+
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+
16
+ if (Array.isArray(arr)) {
17
+ const index = arr.indexOf(element);
18
+ memo.set(`${node.id}:index`, index);
19
+
20
+ if (pinId === 'result') {
21
+ return index !== -1;
22
+ } else if (pinId === 'index') {
23
+ return index;
24
+ }
25
+ } else {
26
+ memo.set(`${node.id}:index`, -1);
27
+
28
+ if (pinId === 'result') {
29
+ return false;
30
+ } else if (pinId === 'index') {
31
+ return -1;
32
+ }
33
+ }
34
+
35
+ return null;
36
+ }
37
+
38
+ module.exports = {
39
+ evaluate,
40
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'index') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+ return Array.isArray(arr) ? arr.indexOf(element) : -1;
16
+ }
17
+
18
+ return -1;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'element') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const index = await resolvePinValue(node, 'index', -1);
15
+ return (!Array.isArray(arr) || index < 0 || index >= arr.length) ? null : arr[index];
16
+ }
17
+
18
+ return null;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -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,32 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @param {Map} helpers.memo - Map для хранения мемоизированных значений.
8
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue, memo } = helpers;
12
+
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ if (!Array.isArray(arr) || arr.length === 0) {
15
+ return pinId === 'index' ? -1 : null;
16
+ }
17
+
18
+ const randomIndex = Math.floor(Math.random() * arr.length);
19
+ memo.set(`${node.id}:index`, randomIndex);
20
+
21
+ if (pinId === 'element') {
22
+ return arr[randomIndex];
23
+ } else if (pinId === 'index') {
24
+ return randomIndex;
25
+ }
26
+
27
+ return null;
28
+ }
29
+
30
+ module.exports = {
31
+ evaluate,
32
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'result') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const index = await resolvePinValue(node, 'index', -1);
15
+
16
+ if (!Array.isArray(arr) || index < 0 || index >= arr.length) {
17
+ return arr || [];
18
+ }
19
+
20
+ const newArr = [...arr];
21
+ newArr.splice(index, 1);
22
+ return newArr;
23
+ }
24
+
25
+ return [];
26
+ }
27
+
28
+ module.exports = {
29
+ evaluate,
30
+ };