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,27 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'new_object') {
13
+ const obj = await resolvePinValue(node, 'object', {});
14
+ const key = await resolvePinValue(node, 'key', '');
15
+ const val = await resolvePinValue(node, 'value');
16
+
17
+ const newObj = { ...obj };
18
+ newObj[key] = val;
19
+ return newObj;
20
+ }
21
+
22
+ return {};
23
+ }
24
+
25
+ module.exports = {
26
+ evaluate,
27
+ };
@@ -0,0 +1,89 @@
1
+ describe('strings:concat node', () => {
2
+ const stringConcat = require('../concat');
3
+
4
+ const mockHelpers = (...strings) => ({
5
+ resolvePinValue: jest.fn(async (node, pinId, defaultValue) => {
6
+ const match = pinId.match(/^pin_(\d+)$/);
7
+ if (match) {
8
+ const index = parseInt(match[1]);
9
+ return strings[index] !== undefined ? strings[index] : defaultValue;
10
+ }
11
+ return defaultValue;
12
+ }),
13
+ });
14
+
15
+ it('should concatenate two strings', async () => {
16
+ const node = { id: 'test', data: { pinCount: 2 } };
17
+ const helpers = mockHelpers('Hello', ' World');
18
+
19
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
20
+
21
+ expect(result).toBe('Hello World');
22
+ });
23
+
24
+ it('should concatenate multiple strings', async () => {
25
+ const node = { id: 'test', data: { pinCount: 4 } };
26
+ const helpers = mockHelpers('A', 'B', 'C', 'D');
27
+
28
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
29
+
30
+ expect(result).toBe('ABCD');
31
+ });
32
+
33
+ it('should handle empty strings', async () => {
34
+ const node = { id: 'test', data: { pinCount: 3 } };
35
+ const helpers = mockHelpers('Hello', '', 'World');
36
+
37
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
38
+
39
+ expect(result).toBe('HelloWorld');
40
+ });
41
+
42
+ it('should use default pinCount of 2', async () => {
43
+ const node = { id: 'test', data: {} };
44
+ const helpers = mockHelpers('A', 'B');
45
+
46
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
47
+
48
+ expect(result).toBe('AB');
49
+ });
50
+
51
+ it('should handle non-string inputs by converting to string', async () => {
52
+ const node = { id: 'test', data: { pinCount: 4 } };
53
+ const helpers = mockHelpers('String: ', 123, ' Boolean: ', true);
54
+
55
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
56
+
57
+ expect(result).toBe('String: 123 Boolean: true');
58
+ });
59
+
60
+ it('should handle null and undefined inputs', async () => {
61
+ const node = { id: 'test', data: { pinCount: 4 } };
62
+ const helpers = mockHelpers('Value: ', null, ' | ', undefined);
63
+
64
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
65
+
66
+ // null и undefined заменяются на пустые строки в текущей реализации
67
+ expect(result).toBe('Value: | ');
68
+ });
69
+
70
+ it('should handle very large number of inputs', async () => {
71
+ const node = { id: 'test', data: { pinCount: 100 } };
72
+ const inputs = Array(100).fill('x');
73
+ const helpers = mockHelpers(...inputs);
74
+
75
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
76
+
77
+ expect(result).toBe('x'.repeat(100));
78
+ expect(result.length).toBe(100);
79
+ });
80
+
81
+ it('should handle object inputs by stringifying', async () => {
82
+ const node = { id: 'test', data: { pinCount: 2 } };
83
+ const helpers = mockHelpers('Object: ', { key: 'value' });
84
+
85
+ const result = await stringConcat.evaluate(node, 'result', {}, helpers);
86
+
87
+ expect(result).toBe('Object: [object Object]');
88
+ });
89
+ });
@@ -0,0 +1,27 @@
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 pinCount = node.data?.pinCount || 2;
14
+ let finalString = '';
15
+ for (let i = 0; i < pinCount; i++) {
16
+ const part = await resolvePinValue(node, `pin_${i}`, '');
17
+ finalString += String(part ?? '');
18
+ }
19
+ return finalString;
20
+ }
21
+
22
+ return '';
23
+ }
24
+
25
+ module.exports = {
26
+ evaluate,
27
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
6
+ */
7
+ async function execute(node, context, helpers) {
8
+ const { traverse } = helpers;
9
+ await traverse(node, 'exec');
10
+ }
11
+
12
+ /**
13
+ * @param {object} node - Экземпляр узла из графа.
14
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
15
+ * @param {object} context - Контекст выполнения графа.
16
+ * @param {object} helpers - Вспомогательные функции движка.
17
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
18
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
19
+ */
20
+ async function evaluate(node, pinId, context, helpers) {
21
+ const { resolvePinValue } = helpers;
22
+
23
+ if (pinId === 'result') {
24
+ const haystack = String(await resolvePinValue(node, 'haystack', ''));
25
+ const needle = String(await resolvePinValue(node, 'needle', ''));
26
+ const caseSensitive = await resolvePinValue(node, 'case_sensitive', false);
27
+
28
+ if (caseSensitive) {
29
+ return haystack.includes(needle);
30
+ } else {
31
+ return haystack.toLowerCase().includes(needle.toLowerCase());
32
+ }
33
+ }
34
+
35
+ return null;
36
+ }
37
+
38
+ module.exports = {
39
+ execute,
40
+ evaluate,
41
+ };
@@ -0,0 +1,43 @@
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
+ await traverse(node, 'exec');
12
+ }
13
+
14
+ /**
15
+ * @param {object} node - Экземпляр узла из графа.
16
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
17
+ * @param {object} context - Контекст выполнения графа.
18
+ * @param {object} helpers - Вспомогательные функции движка.
19
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
20
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
21
+ */
22
+ async function evaluate(node, pinId, context, helpers) {
23
+ const { resolvePinValue } = helpers;
24
+
25
+ if (pinId === 'result') {
26
+ const str = String(await resolvePinValue(node, 'string', ''));
27
+ const suffix = String(await resolvePinValue(node, 'suffix', ''));
28
+ const caseSensitive = await resolvePinValue(node, 'case_sensitive', false);
29
+
30
+ if (caseSensitive) {
31
+ return str.endsWith(suffix);
32
+ } else {
33
+ return str.toLowerCase().endsWith(suffix.toLowerCase());
34
+ }
35
+ }
36
+
37
+ return null;
38
+ }
39
+
40
+ module.exports = {
41
+ execute,
42
+ evaluate,
43
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
6
+ */
7
+ async function execute(node, context, helpers) {
8
+ const { traverse } = helpers;
9
+ await traverse(node, 'exec');
10
+ }
11
+
12
+ /**
13
+ * @param {object} node - Экземпляр узла из графа.
14
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
15
+ * @param {object} context - Контекст выполнения графа.
16
+ * @param {object} helpers - Вспомогательные функции движка.
17
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
18
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
19
+ */
20
+ async function evaluate(node, pinId, context, helpers) {
21
+ const { resolvePinValue } = helpers;
22
+
23
+ if (pinId === 'result') {
24
+ const strA = String(await resolvePinValue(node, 'a', ''));
25
+ const strB = String(await resolvePinValue(node, 'b', ''));
26
+ const caseSensitive = node.data?.case_sensitive ?? true;
27
+ return caseSensitive ? strA === strB : strA.toLowerCase() === strB.toLowerCase();
28
+ }
29
+
30
+ return null;
31
+ }
32
+
33
+ module.exports = {
34
+ execute,
35
+ evaluate,
36
+ };
@@ -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
+ await traverse(node, 'exec');
12
+ }
13
+
14
+ /**
15
+ * @param {object} node - Экземпляр узла из графа.
16
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
17
+ * @param {object} context - Контекст выполнения графа.
18
+ * @param {object} helpers - Вспомогательные функции движка.
19
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
20
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
21
+ */
22
+ async function evaluate(node, pinId, context, helpers) {
23
+ const { resolvePinValue } = helpers;
24
+
25
+ if (pinId === 'length') {
26
+ const str = String(await resolvePinValue(node, 'string', ''));
27
+ return str.length;
28
+ }
29
+
30
+ return 0;
31
+ }
32
+
33
+ module.exports = {
34
+ execute,
35
+ evaluate,
36
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
6
+ */
7
+ async function execute(node, context, helpers) {
8
+ const { traverse } = helpers;
9
+ await traverse(node, 'exec');
10
+ }
11
+
12
+ /**
13
+ * @param {object} node - Экземпляр узла из графа.
14
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
15
+ * @param {object} context - Контекст выполнения графа.
16
+ * @param {object} helpers - Вспомогательные функции движка.
17
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
18
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
19
+ */
20
+ async function evaluate(node, pinId, context, helpers) {
21
+ const { resolvePinValue } = helpers;
22
+
23
+ if (pinId === 'result') {
24
+ const str = String(await resolvePinValue(node, 'string', ''));
25
+ const regexStr = String(await resolvePinValue(node, 'regex', ''));
26
+ try {
27
+ return new RegExp(regexStr).test(str);
28
+ } catch (e) {
29
+ return false;
30
+ }
31
+ }
32
+
33
+ return null;
34
+ }
35
+
36
+ module.exports = {
37
+ execute,
38
+ evaluate,
39
+ };
@@ -0,0 +1,37 @@
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
+ await traverse(node, 'exec');
12
+ }
13
+
14
+ /**
15
+ * @param {object} node - Экземпляр узла из графа.
16
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
17
+ * @param {object} context - Контекст выполнения графа.
18
+ * @param {object} helpers - Вспомогательные функции движка.
19
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
20
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
21
+ */
22
+ async function evaluate(node, pinId, context, helpers) {
23
+ const { resolvePinValue } = helpers;
24
+
25
+ if (pinId === 'array') {
26
+ const str = String(await resolvePinValue(node, 'string', ''));
27
+ const separator = String(await resolvePinValue(node, 'separator', ''));
28
+ return str.split(separator);
29
+ }
30
+
31
+ return [];
32
+ }
33
+
34
+ module.exports = {
35
+ execute,
36
+ evaluate,
37
+ };
@@ -0,0 +1,43 @@
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
+ await traverse(node, 'exec');
12
+ }
13
+
14
+ /**
15
+ * @param {object} node - Экземпляр узла из графа.
16
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
17
+ * @param {object} context - Контекст выполнения графа.
18
+ * @param {object} helpers - Вспомогательные функции движка.
19
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
20
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
21
+ */
22
+ async function evaluate(node, pinId, context, helpers) {
23
+ const { resolvePinValue } = helpers;
24
+
25
+ if (pinId === 'result') {
26
+ const str = String(await resolvePinValue(node, 'string', ''));
27
+ const prefix = String(await resolvePinValue(node, 'prefix', ''));
28
+ const caseSensitive = await resolvePinValue(node, 'case_sensitive', false);
29
+
30
+ if (caseSensitive) {
31
+ return str.startsWith(prefix);
32
+ } else {
33
+ return str.toLowerCase().startsWith(prefix.toLowerCase());
34
+ }
35
+ }
36
+
37
+ return null;
38
+ }
39
+
40
+ module.exports = {
41
+ execute,
42
+ evaluate,
43
+ };
@@ -0,0 +1,24 @@
1
+ describe('time:now node', () => {
2
+ const timeNow = require('../now');
3
+
4
+ it('should return current date from now pin', async () => {
5
+ const node = { id: 'test', type: 'time:now' };
6
+ const context = {};
7
+ const helpers = {};
8
+
9
+ const result = await timeNow.evaluate(node, 'now', context, helpers);
10
+
11
+ expect(result).toBeInstanceOf(Date);
12
+ expect(result.getTime()).toBeLessThanOrEqual(Date.now());
13
+ });
14
+
15
+ it('should return null for unknown pin', async () => {
16
+ const node = { id: 'test', type: 'time:now' };
17
+ const context = {};
18
+ const helpers = {};
19
+
20
+ const result = await timeNow.evaluate(node, 'unknown', context, helpers);
21
+
22
+ expect(result).toBeNull();
23
+ });
24
+ });
@@ -0,0 +1,33 @@
1
+ const { add } = require('date-fns');
2
+
3
+ /**
4
+ * @param {object} node
5
+ * @param {string} pinId
6
+ * @param {object} context
7
+ * @param {object} helpers
8
+ * @returns {Promise<any>}
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue } = helpers;
12
+
13
+ if (pinId === 'result') {
14
+ const date = await resolvePinValue(node, 'date', new Date());
15
+ const duration = await resolvePinValue(node, 'duration', {});
16
+
17
+ if (date instanceof Date && !isNaN(date.getTime())) {
18
+ try {
19
+ return add(date, duration);
20
+ } catch (error) {
21
+ // Либо пробросить ошибку, либо вернуть null
22
+ throw new Error(`Ошибка добавления продолжительности: ${error.message}`);
23
+ }
24
+ }
25
+ throw new Error('Невалидная входная дата');
26
+ }
27
+
28
+ return null;
29
+ }
30
+
31
+ module.exports = {
32
+ evaluate,
33
+ };
@@ -0,0 +1,35 @@
1
+ const { isAfter, isBefore, isEqual } = require('date-fns');
2
+
3
+ /**
4
+ * @param {object} node
5
+ * @param {string} pinId
6
+ * @param {object} context
7
+ * @param {object} helpers
8
+ * @returns {Promise<any>}
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue } = helpers;
12
+
13
+ if (pinId === 'result') {
14
+ const dateLeft = await resolvePinValue(node, 'date_left', new Date());
15
+ const dateRight = await resolvePinValue(node, 'date_right', new Date());
16
+ const op = await resolvePinValue(node, 'operation', 'after');
17
+
18
+ if (dateLeft instanceof Date && !isNaN(dateLeft.getTime()) &&
19
+ dateRight instanceof Date && !isNaN(dateRight.getTime())) {
20
+ switch (op) {
21
+ case 'after': return isAfter(dateLeft, dateRight);
22
+ case 'before': return isBefore(dateLeft, dateRight);
23
+ case 'equal': return isEqual(dateLeft, dateRight);
24
+ default: return false;
25
+ }
26
+ }
27
+ return false;
28
+ }
29
+
30
+ return null;
31
+ }
32
+
33
+ module.exports = {
34
+ evaluate,
35
+ };
@@ -0,0 +1,29 @@
1
+ const { differenceInMilliseconds } = require('date-fns');
2
+
3
+ /**
4
+ * @param {object} node
5
+ * @param {string} pinId
6
+ * @param {object} context
7
+ * @param {object} helpers
8
+ * @returns {Promise<any>}
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue } = helpers;
12
+
13
+ if (pinId === 'diff') {
14
+ const dateLeft = await resolvePinValue(node, 'date_left', new Date());
15
+ const dateRight = await resolvePinValue(node, 'date_right', new Date());
16
+
17
+ if (dateLeft instanceof Date && !isNaN(dateLeft.getTime()) &&
18
+ dateRight instanceof Date && !isNaN(dateRight.getTime())) {
19
+ return differenceInMilliseconds(dateLeft, dateRight);
20
+ }
21
+ return 0;
22
+ }
23
+
24
+ return null;
25
+ }
26
+
27
+ module.exports = {
28
+ evaluate,
29
+ };
@@ -0,0 +1,32 @@
1
+ const { format } = require('date-fns');
2
+
3
+ /**
4
+ * @param {object} node
5
+ * @param {string} pinId
6
+ * @param {object} context
7
+ * @param {object} helpers
8
+ * @returns {Promise<any>}
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue } = helpers;
12
+
13
+ if (pinId === 'formatted') {
14
+ const date = await resolvePinValue(node, 'date', new Date());
15
+ const formatString = await resolvePinValue(node, 'format', 'yyyy-MM-dd HH:mm:ss');
16
+
17
+ if (date instanceof Date && !isNaN(date.getTime())) {
18
+ try {
19
+ return format(date, formatString);
20
+ } catch (error) {
21
+ throw new Error(`Ошибка форматирования: ${error.message}`);
22
+ }
23
+ }
24
+ throw new Error('Ошибка: невалидная дата');
25
+ }
26
+
27
+ return null;
28
+ }
29
+
30
+ module.exports = {
31
+ evaluate,
32
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @param {object} node
3
+ * @param {string} pinId
4
+ * @param {object} context
5
+ * @param {object} helpers
6
+ * @returns {Promise<any>}
7
+ */
8
+ async function evaluate(node, pinId, context, helpers) {
9
+ if (pinId === 'now') {
10
+ return new Date();
11
+ }
12
+
13
+ return null;
14
+ }
15
+
16
+ module.exports = {
17
+ evaluate,
18
+ };
@@ -0,0 +1,37 @@
1
+ const User = require('../../UserService');
2
+
3
+ /**
4
+ * @param {object} node - Экземпляр узла из графа.
5
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
6
+ * @param {object} context - Контекст выполнения графа.
7
+ * @param {object} helpers - Вспомогательные функции движка.
8
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
9
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
10
+ */
11
+ async function evaluate(node, pinId, context, helpers) {
12
+ const { resolvePinValue } = helpers;
13
+
14
+ const userIdentifier = await resolvePinValue(node, 'user', null);
15
+ let isBlacklisted = false;
16
+ let usernameToFind = null;
17
+
18
+ if (typeof userIdentifier === 'string') {
19
+ usernameToFind = userIdentifier;
20
+ } else if (userIdentifier && typeof userIdentifier === 'object' && userIdentifier.username) {
21
+ usernameToFind = userIdentifier.username;
22
+ }
23
+
24
+ if (usernameToFind) {
25
+ const user = await User.getUser(usernameToFind, context.botId);
26
+ if (user) {
27
+ isBlacklisted = user.isBlacklisted;
28
+ }
29
+ }
30
+
31
+ // Этот узел имеет только один выходной пин данных
32
+ return isBlacklisted;
33
+ }
34
+
35
+ module.exports = {
36
+ evaluate,
37
+ };