blockmine 1.21.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (492) hide show
  1. package/.claude/agents/README.md +469 -0
  2. package/.claude/agents/auth-route-debugger.md +118 -0
  3. package/.claude/agents/auth-route-tester.md +93 -0
  4. package/.claude/agents/auto-error-resolver.md +97 -0
  5. package/.claude/agents/build-optimizer.md +236 -0
  6. package/.claude/agents/code-architecture-reviewer.md +83 -0
  7. package/.claude/agents/code-refactor-master.md +94 -0
  8. package/.claude/agents/cost-optimizer.md +134 -0
  9. package/.claude/agents/deployment-orchestrator.md +113 -0
  10. package/.claude/agents/documentation-architect.md +82 -0
  11. package/.claude/agents/frontend-error-fixer.md +77 -0
  12. package/.claude/agents/iac-code-generator.md +71 -0
  13. package/.claude/agents/incident-responder.md +346 -0
  14. package/.claude/agents/infrastructure-architect.md +31 -0
  15. package/.claude/agents/kubernetes-specialist.md +56 -0
  16. package/.claude/agents/migration-planner.md +181 -0
  17. package/.claude/agents/network-architect.md +196 -0
  18. package/.claude/agents/plan-reviewer.md +52 -0
  19. package/.claude/agents/refactor-planner.md +63 -0
  20. package/.claude/agents/security-scanner.md +102 -0
  21. package/.claude/agents/web-research-specialist.md +78 -0
  22. package/.claude/commands/cost-analysis.md +315 -0
  23. package/.claude/commands/dev-docs-update.md +55 -0
  24. package/.claude/commands/dev-docs.md +51 -0
  25. package/.claude/commands/incident-debug.md +247 -0
  26. package/.claude/commands/infra-plan.md +81 -0
  27. package/.claude/commands/migration-plan.md +478 -0
  28. package/.claude/commands/route-research-for-testing.md +37 -0
  29. package/.claude/commands/security-review.md +66 -0
  30. package/.claude/hooks/CONFIG.md +448 -0
  31. package/.claude/hooks/README.md +163 -0
  32. package/.claude/hooks/SKILL_ACTIVATION_COMPLETE.md +226 -0
  33. package/.claude/hooks/WINDOWS_HOOKS_README.md +151 -0
  34. package/.claude/hooks/add-skill-activation-banners.ts +132 -0
  35. package/.claude/hooks/comprehensive-skill-test.ts +1315 -0
  36. package/.claude/hooks/error-handling-reminder.sh +12 -0
  37. package/.claude/hooks/error-handling-reminder.ts +222 -0
  38. package/.claude/hooks/k8s-manifest-validator.sh +56 -0
  39. package/.claude/hooks/package-lock.json +556 -0
  40. package/.claude/hooks/package.json +16 -0
  41. package/.claude/hooks/post-tool-use-tracker.ps1 +174 -0
  42. package/.claude/hooks/post-tool-use-tracker.sh +183 -0
  43. package/.claude/hooks/security-policy-check.sh +247 -0
  44. package/.claude/hooks/skill-activation-prompt.ps1 +10 -0
  45. package/.claude/hooks/skill-activation-prompt.sh +10 -0
  46. package/.claude/hooks/skill-activation-prompt.ts +141 -0
  47. package/.claude/hooks/stop-build-check-enhanced.sh +130 -0
  48. package/.claude/hooks/terraform-validator.sh +53 -0
  49. package/.claude/hooks/test-input.json +7 -0
  50. package/.claude/hooks/test-skill-activation.ts +427 -0
  51. package/.claude/hooks/trigger-build-resolver.sh +79 -0
  52. package/.claude/hooks/tsc-check.sh +173 -0
  53. package/.claude/hooks/tsconfig.json +19 -0
  54. package/.claude/settings.json +59 -0
  55. package/.claude/settings.local.json +36 -14
  56. package/.claude/skills/README.md +507 -0
  57. package/.claude/skills/api-engineering/SKILL.md +63 -0
  58. package/.claude/skills/api-engineering/resources/api-versioning.md +88 -0
  59. package/.claude/skills/api-engineering/resources/graphql-patterns.md +106 -0
  60. package/.claude/skills/api-engineering/resources/rate-limiting.md +118 -0
  61. package/.claude/skills/api-engineering/resources/rest-api-design.md +105 -0
  62. package/.claude/skills/backend-dev-guidelines/SKILL.md +306 -0
  63. package/.claude/skills/backend-dev-guidelines/resources/architecture-overview.md +451 -0
  64. package/.claude/skills/backend-dev-guidelines/resources/async-and-errors.md +307 -0
  65. package/.claude/skills/backend-dev-guidelines/resources/complete-examples.md +638 -0
  66. package/.claude/skills/backend-dev-guidelines/resources/configuration.md +275 -0
  67. package/.claude/skills/backend-dev-guidelines/resources/database-patterns.md +224 -0
  68. package/.claude/skills/backend-dev-guidelines/resources/middleware-guide.md +213 -0
  69. package/.claude/skills/backend-dev-guidelines/resources/routing-and-controllers.md +756 -0
  70. package/.claude/skills/backend-dev-guidelines/resources/sentry-and-monitoring.md +336 -0
  71. package/.claude/skills/backend-dev-guidelines/resources/services-and-repositories.md +789 -0
  72. package/.claude/skills/backend-dev-guidelines/resources/testing-guide.md +235 -0
  73. package/.claude/skills/backend-dev-guidelines/resources/validation-patterns.md +754 -0
  74. package/.claude/skills/budget-and-cost-management/SKILL.md +850 -0
  75. package/.claude/skills/build-engineering/SKILL.md +431 -0
  76. package/.claude/skills/build-engineering/resources/artifact-repositories.md +72 -0
  77. package/.claude/skills/build-engineering/resources/build-caching.md +96 -0
  78. package/.claude/skills/build-engineering/resources/build-pipelines.md +105 -0
  79. package/.claude/skills/build-engineering/resources/build-security.md +95 -0
  80. package/.claude/skills/build-engineering/resources/build-systems.md +389 -0
  81. package/.claude/skills/build-engineering/resources/compilation-optimization.md +201 -0
  82. package/.claude/skills/build-engineering/resources/dependency-management.md +73 -0
  83. package/.claude/skills/build-engineering/resources/monorepo-builds.md +110 -0
  84. package/.claude/skills/build-engineering/resources/performance-optimization.md +113 -0
  85. package/.claude/skills/build-engineering/resources/reproducible-builds.md +82 -0
  86. package/.claude/skills/cloud-engineering/SKILL.md +675 -0
  87. package/.claude/skills/cloud-engineering/resources/aws-patterns.md +742 -0
  88. package/.claude/skills/cloud-engineering/resources/azure-patterns.md +714 -0
  89. package/.claude/skills/cloud-engineering/resources/cleared-cloud-environments.md +987 -0
  90. package/.claude/skills/cloud-engineering/resources/cloud-cost-optimization.md +757 -0
  91. package/.claude/skills/cloud-engineering/resources/cloud-networking.md +1058 -0
  92. package/.claude/skills/cloud-engineering/resources/cloud-security-tools.md +1530 -0
  93. package/.claude/skills/cloud-engineering/resources/cloud-security.md +990 -0
  94. package/.claude/skills/cloud-engineering/resources/gcp-patterns.md +758 -0
  95. package/.claude/skills/cloud-engineering/resources/migration-strategies.md +820 -0
  96. package/.claude/skills/cloud-engineering/resources/multi-cloud-strategies.md +670 -0
  97. package/.claude/skills/cloud-engineering/resources/oci-patterns.md +1198 -0
  98. package/.claude/skills/cloud-engineering/resources/serverless-patterns.md +795 -0
  99. package/.claude/skills/cloud-engineering/resources/well-architected-frameworks.md +966 -0
  100. package/.claude/skills/cybersecurity/SKILL.md +409 -0
  101. package/.claude/skills/cybersecurity/resources/security-architecture.md +266 -0
  102. package/.claude/skills/database-engineering/SKILL.md +61 -0
  103. package/.claude/skills/database-engineering/resources/backup-and-recovery.md +72 -0
  104. package/.claude/skills/database-engineering/resources/database-replication.md +63 -0
  105. package/.claude/skills/database-engineering/resources/postgresql-fundamentals.md +70 -0
  106. package/.claude/skills/database-engineering/resources/query-optimization.md +68 -0
  107. package/.claude/skills/devsecops/SKILL.md +374 -0
  108. package/.claude/skills/devsecops/resources/ci-cd-security.md +204 -0
  109. package/.claude/skills/devsecops/resources/compliance-automation.md +530 -0
  110. package/.claude/skills/devsecops/resources/compliance-frameworks.md +2322 -0
  111. package/.claude/skills/devsecops/resources/container-security.md +915 -0
  112. package/.claude/skills/devsecops/resources/cspm-integration.md +1440 -0
  113. package/.claude/skills/devsecops/resources/policy-enforcement.md +619 -0
  114. package/.claude/skills/devsecops/resources/secrets-management.md +755 -0
  115. package/.claude/skills/devsecops/resources/security-monitoring.md +146 -0
  116. package/.claude/skills/devsecops/resources/security-scanning.md +887 -0
  117. package/.claude/skills/devsecops/resources/security-testing.md +203 -0
  118. package/.claude/skills/devsecops/resources/supply-chain-security.md +518 -0
  119. package/.claude/skills/devsecops/resources/vulnerability-management.md +481 -0
  120. package/.claude/skills/devsecops/resources/zero-trust-architecture.md +177 -0
  121. package/.claude/skills/documentation-as-code/SKILL.md +323 -0
  122. package/.claude/skills/documentation-as-code/resources/api-documentation.md +90 -0
  123. package/.claude/skills/documentation-as-code/resources/changelog-management.md +79 -0
  124. package/.claude/skills/documentation-as-code/resources/diagram-generation.md +44 -0
  125. package/.claude/skills/documentation-as-code/resources/docs-as-code-workflow.md +99 -0
  126. package/.claude/skills/documentation-as-code/resources/documentation-automation.md +68 -0
  127. package/.claude/skills/documentation-as-code/resources/documentation-sites.md +79 -0
  128. package/.claude/skills/documentation-as-code/resources/markdown-best-practices.md +162 -0
  129. package/.claude/skills/documentation-as-code/resources/openapi-specification.md +77 -0
  130. package/.claude/skills/documentation-as-code/resources/readme-engineering.md +60 -0
  131. package/.claude/skills/documentation-as-code/resources/technical-writing-guide.md +202 -0
  132. package/.claude/skills/engineering-management/SKILL.md +356 -0
  133. package/.claude/skills/engineering-management/resources/career-ladders.md +609 -0
  134. package/.claude/skills/engineering-management/resources/hiring-and-assessment.md +555 -0
  135. package/.claude/skills/engineering-management/resources/one-on-one-guides.md +609 -0
  136. package/.claude/skills/engineering-management/resources/resource-planning.md +557 -0
  137. package/.claude/skills/engineering-management/resources/team-organization-patterns.md +491 -0
  138. package/.claude/skills/engineering-management/resources/technical-interviews.md +474 -0
  139. package/.claude/skills/engineering-operations-management/SKILL.md +817 -0
  140. package/.claude/skills/error-tracking/SKILL.md +379 -0
  141. package/.claude/skills/frontend-dev-guidelines/SKILL.md +403 -0
  142. package/.claude/skills/frontend-dev-guidelines/resources/common-patterns.md +331 -0
  143. package/.claude/skills/frontend-dev-guidelines/resources/complete-examples.md +872 -0
  144. package/.claude/skills/frontend-dev-guidelines/resources/component-patterns.md +502 -0
  145. package/.claude/skills/frontend-dev-guidelines/resources/data-fetching.md +767 -0
  146. package/.claude/skills/frontend-dev-guidelines/resources/file-organization.md +502 -0
  147. package/.claude/skills/frontend-dev-guidelines/resources/loading-and-error-states.md +501 -0
  148. package/.claude/skills/frontend-dev-guidelines/resources/performance.md +406 -0
  149. package/.claude/skills/frontend-dev-guidelines/resources/routing-guide.md +364 -0
  150. package/.claude/skills/frontend-dev-guidelines/resources/styling-guide.md +428 -0
  151. package/.claude/skills/frontend-dev-guidelines/resources/typescript-standards.md +418 -0
  152. package/.claude/skills/general-it-engineering/SKILL.md +393 -0
  153. package/.claude/skills/general-it-engineering/resources/asset-management.md +712 -0
  154. package/.claude/skills/general-it-engineering/resources/automation-orchestration.md +817 -0
  155. package/.claude/skills/general-it-engineering/resources/business-continuity.md +786 -0
  156. package/.claude/skills/general-it-engineering/resources/change-management.md +715 -0
  157. package/.claude/skills/general-it-engineering/resources/enterprise-monitoring.md +729 -0
  158. package/.claude/skills/general-it-engineering/resources/help-desk-operations.md +738 -0
  159. package/.claude/skills/general-it-engineering/resources/incident-service-management.md +834 -0
  160. package/.claude/skills/general-it-engineering/resources/it-governance.md +753 -0
  161. package/.claude/skills/general-it-engineering/resources/itil-framework.md +503 -0
  162. package/.claude/skills/general-it-engineering/resources/service-management.md +669 -0
  163. package/.claude/skills/infrastructure-architecture/SKILL.md +328 -0
  164. package/.claude/skills/infrastructure-architecture/resources/architecture-decision-records.md +505 -0
  165. package/.claude/skills/infrastructure-architecture/resources/architecture-patterns.md +528 -0
  166. package/.claude/skills/infrastructure-architecture/resources/capacity-planning.md +453 -0
  167. package/.claude/skills/infrastructure-architecture/resources/cleared-environment-architecture.md +773 -0
  168. package/.claude/skills/infrastructure-architecture/resources/cost-architecture.md +499 -0
  169. package/.claude/skills/infrastructure-architecture/resources/data-architecture.md +501 -0
  170. package/.claude/skills/infrastructure-architecture/resources/disaster-recovery.md +535 -0
  171. package/.claude/skills/infrastructure-architecture/resources/migration-architecture.md +512 -0
  172. package/.claude/skills/infrastructure-architecture/resources/multi-region-design.md +608 -0
  173. package/.claude/skills/infrastructure-architecture/resources/reference-architectures.md +562 -0
  174. package/.claude/skills/infrastructure-architecture/resources/security-architecture.md +538 -0
  175. package/.claude/skills/infrastructure-architecture/resources/system-design-principles.md +489 -0
  176. package/.claude/skills/infrastructure-architecture/resources/workload-classification.md +1000 -0
  177. package/.claude/skills/infrastructure-strategy/SKILL.md +924 -0
  178. package/.claude/skills/network-engineering/SKILL.md +385 -0
  179. package/.claude/skills/network-engineering/resources/dns-management.md +738 -0
  180. package/.claude/skills/network-engineering/resources/load-balancing.md +820 -0
  181. package/.claude/skills/network-engineering/resources/network-architecture.md +546 -0
  182. package/.claude/skills/network-engineering/resources/network-security.md +921 -0
  183. package/.claude/skills/network-engineering/resources/network-troubleshooting.md +749 -0
  184. package/.claude/skills/network-engineering/resources/routing-switching.md +373 -0
  185. package/.claude/skills/network-engineering/resources/sdn-networking.md +695 -0
  186. package/.claude/skills/network-engineering/resources/service-mesh-networking.md +777 -0
  187. package/.claude/skills/network-engineering/resources/tcp-ip-protocols.md +444 -0
  188. package/.claude/skills/network-engineering/resources/vpn-connectivity.md +672 -0
  189. package/.claude/skills/observability-engineering/SKILL.md +101 -0
  190. package/.claude/skills/observability-engineering/resources/apm-tools.md +97 -0
  191. package/.claude/skills/observability-engineering/resources/correlation-strategies.md +87 -0
  192. package/.claude/skills/observability-engineering/resources/distributed-tracing.md +98 -0
  193. package/.claude/skills/observability-engineering/resources/logs-aggregation.md +118 -0
  194. package/.claude/skills/observability-engineering/resources/observability-cost-optimization.md +141 -0
  195. package/.claude/skills/observability-engineering/resources/opentelemetry.md +110 -0
  196. package/.claude/skills/platform-engineering/SKILL.md +555 -0
  197. package/.claude/skills/platform-engineering/resources/architecture-overview.md +600 -0
  198. package/.claude/skills/platform-engineering/resources/container-orchestration.md +916 -0
  199. package/.claude/skills/platform-engineering/resources/cost-optimization.md +634 -0
  200. package/.claude/skills/platform-engineering/resources/developer-platforms.md +670 -0
  201. package/.claude/skills/platform-engineering/resources/gitops-automation.md +650 -0
  202. package/.claude/skills/platform-engineering/resources/infrastructure-as-code.md +778 -0
  203. package/.claude/skills/platform-engineering/resources/infrastructure-standards.md +708 -0
  204. package/.claude/skills/platform-engineering/resources/multi-tenancy.md +602 -0
  205. package/.claude/skills/platform-engineering/resources/platform-security.md +711 -0
  206. package/.claude/skills/platform-engineering/resources/resource-management.md +592 -0
  207. package/.claude/skills/platform-engineering/resources/service-mesh.md +628 -0
  208. package/.claude/skills/release-engineering/SKILL.md +393 -0
  209. package/.claude/skills/release-engineering/resources/artifact-management.md +108 -0
  210. package/.claude/skills/release-engineering/resources/build-optimization.md +84 -0
  211. package/.claude/skills/release-engineering/resources/ci-cd-pipelines.md +411 -0
  212. package/.claude/skills/release-engineering/resources/deployment-strategies.md +197 -0
  213. package/.claude/skills/release-engineering/resources/pipeline-security.md +62 -0
  214. package/.claude/skills/release-engineering/resources/progressive-delivery.md +83 -0
  215. package/.claude/skills/release-engineering/resources/release-automation.md +68 -0
  216. package/.claude/skills/release-engineering/resources/release-orchestration.md +77 -0
  217. package/.claude/skills/release-engineering/resources/rollback-strategies.md +66 -0
  218. package/.claude/skills/release-engineering/resources/versioning-strategies.md +59 -0
  219. package/.claude/skills/route-tester/SKILL.md +392 -0
  220. package/.claude/skills/skill-developer/ADVANCED.md +197 -0
  221. package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
  222. package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
  223. package/.claude/skills/skill-developer/SKILL.md +430 -0
  224. package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
  225. package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
  226. package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
  227. package/.claude/skills/skill-rules.json +2940 -0
  228. package/.claude/skills/sre/SKILL.md +464 -0
  229. package/.claude/skills/sre/resources/alerting-best-practices.md +282 -0
  230. package/.claude/skills/sre/resources/capacity-planning.md +226 -0
  231. package/.claude/skills/sre/resources/chaos-engineering.md +193 -0
  232. package/.claude/skills/sre/resources/disaster-recovery.md +232 -0
  233. package/.claude/skills/sre/resources/incident-management.md +436 -0
  234. package/.claude/skills/sre/resources/observability-stack.md +240 -0
  235. package/.claude/skills/sre/resources/on-call-runbooks.md +167 -0
  236. package/.claude/skills/sre/resources/performance-optimization.md +108 -0
  237. package/.claude/skills/sre/resources/reliability-patterns.md +183 -0
  238. package/.claude/skills/sre/resources/slo-sli-sla.md +464 -0
  239. package/.claude/skills/sre/resources/toil-reduction.md +145 -0
  240. package/.claude/skills/systems-engineering/SKILL.md +648 -0
  241. package/.claude/skills/systems-engineering/resources/automation-patterns.md +771 -0
  242. package/.claude/skills/systems-engineering/resources/configuration-management.md +998 -0
  243. package/.claude/skills/systems-engineering/resources/linux-administration.md +672 -0
  244. package/.claude/skills/systems-engineering/resources/networking-fundamentals.md +982 -0
  245. package/.claude/skills/systems-engineering/resources/performance-tuning.md +871 -0
  246. package/.claude/skills/systems-engineering/resources/powershell-scripting.md +482 -0
  247. package/.claude/skills/systems-engineering/resources/security-hardening.md +739 -0
  248. package/.claude/skills/systems-engineering/resources/shell-scripting.md +915 -0
  249. package/.claude/skills/systems-engineering/resources/storage-management.md +628 -0
  250. package/.claude/skills/systems-engineering/resources/system-monitoring.md +787 -0
  251. package/.claude/skills/systems-engineering/resources/troubleshooting-guide.md +753 -0
  252. package/.claude/skills/systems-engineering/resources/windows-administration.md +738 -0
  253. package/.claude/skills/technical-leadership/SKILL.md +728 -0
  254. package/CHANGELOG.md +102 -42
  255. package/CLAUDE.md +284 -0
  256. package/README.md +315 -71
  257. package/backend/docs/SECRETS_DOCUMENTATION.md +327 -0
  258. package/backend/jest.config.js +59 -0
  259. package/backend/package-lock.json +6801 -0
  260. package/backend/package.json +24 -4
  261. package/backend/prisma/migrations/20251026104609_add_websocket_api/migration.sql +33 -0
  262. package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -0
  263. package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -0
  264. package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -0
  265. package/backend/prisma/migrations/migration_lock.toml +2 -2
  266. package/backend/prisma/schema.prisma +103 -1
  267. package/backend/src/__tests__/core/DependencyService.test.js +336 -0
  268. package/backend/src/__tests__/core/UserService.test.js +875 -0
  269. package/backend/src/__tests__/repositories/BaseRepository.test.js +146 -0
  270. package/backend/src/__tests__/repositories/BotRepository.test.js +118 -0
  271. package/backend/src/__tests__/repositories/CommandRepository.test.js +132 -0
  272. package/backend/src/__tests__/repositories/EventGraphRepository.test.js +93 -0
  273. package/backend/src/__tests__/repositories/GroupRepository.test.js +155 -0
  274. package/backend/src/__tests__/repositories/PermissionRepository.test.js +130 -0
  275. package/backend/src/__tests__/repositories/PluginRepository.test.js +107 -0
  276. package/backend/src/__tests__/repositories/ServerRepository.test.js +80 -0
  277. package/backend/src/__tests__/repositories/UserRepository.test.js +128 -0
  278. package/backend/src/__tests__/secretsFilter.test.js +425 -0
  279. package/backend/src/__tests__/services/BotLifecycleService.test.js +416 -0
  280. package/backend/src/__tests__/services/BotProcessManager.test.js +285 -0
  281. package/backend/src/__tests__/services/CacheManager.test.js +125 -0
  282. package/backend/src/__tests__/services/CommandExecutionService.test.js +460 -0
  283. package/backend/src/__tests__/services/ResourceMonitorService.test.js +207 -0
  284. package/backend/src/__tests__/services/TelemetryService.test.js +291 -0
  285. package/backend/src/__tests__/setup.js +25 -0
  286. package/backend/src/ai/plugin-assistant-system-prompt.md +788 -0
  287. package/backend/src/api/middleware/auth.js +27 -0
  288. package/backend/src/api/middleware/botAccess.js +7 -3
  289. package/backend/src/api/middleware/panelApiAuth.js +135 -0
  290. package/backend/src/api/routes/aiAssistant.js +995 -0
  291. package/backend/src/api/routes/apiKeys.js +181 -0
  292. package/backend/src/api/routes/auth.js +669 -633
  293. package/backend/src/api/routes/botCommands.js +107 -0
  294. package/backend/src/api/routes/botGroups.js +165 -0
  295. package/backend/src/api/routes/botHistory.js +108 -0
  296. package/backend/src/api/routes/botPermissions.js +99 -0
  297. package/backend/src/api/routes/botStatus.js +36 -0
  298. package/backend/src/api/routes/botUsers.js +162 -0
  299. package/backend/src/api/routes/bots.js +2451 -2360
  300. package/backend/src/api/routes/eventGraphs.js +4 -1
  301. package/backend/src/api/routes/logs.js +13 -3
  302. package/backend/src/api/routes/panel.js +66 -66
  303. package/backend/src/api/routes/panelApiKeys.js +179 -0
  304. package/backend/src/api/routes/pluginIde.js +1715 -135
  305. package/backend/src/api/routes/plugins.js +376 -218
  306. package/backend/src/api/routes/proxies.js +130 -0
  307. package/backend/src/api/routes/search.js +4 -0
  308. package/backend/src/api/routes/servers.js +20 -3
  309. package/backend/src/api/routes/settings.js +5 -0
  310. package/backend/src/api/routes/system.js +174 -0
  311. package/backend/src/api/routes/traces.js +131 -0
  312. package/backend/src/config/debug.config.js +36 -0
  313. package/backend/src/container.js +82 -0
  314. package/backend/src/core/BotHistoryStore.js +180 -0
  315. package/backend/src/core/BotManager.js +149 -868
  316. package/backend/src/core/BotManager.old.js +1093 -0
  317. package/backend/src/core/BotProcess.js +850 -191
  318. package/backend/src/core/EventGraphManager.js +194 -198
  319. package/backend/src/core/GraphExecutionEngine.js +709 -57
  320. package/backend/src/core/MessageQueue.js +39 -12
  321. package/backend/src/core/NodeRegistry.js +37 -1134
  322. package/backend/src/core/PluginLoader.js +99 -5
  323. package/backend/src/core/PluginManager.js +126 -15
  324. package/backend/src/core/PrismaService.js +32 -0
  325. package/backend/src/core/TaskScheduler.js +1 -1
  326. package/backend/src/core/UserService.js +3 -3
  327. package/backend/src/core/__tests__/PrismaService.test.js +24 -0
  328. package/backend/src/core/commands/README.md +305 -0
  329. package/backend/src/core/commands/dev.js +13 -7
  330. package/backend/src/core/commands/ping.js +10 -4
  331. package/backend/src/core/commands/whois.js +63 -0
  332. package/backend/src/core/config/validation.js +27 -0
  333. package/backend/src/core/constants/graphTypes.js +21 -0
  334. package/backend/src/core/node-registries/actions.js +202 -0
  335. package/backend/src/core/node-registries/arrays.js +155 -0
  336. package/backend/src/core/node-registries/bot.js +23 -0
  337. package/backend/src/core/node-registries/data.js +290 -0
  338. package/backend/src/core/node-registries/debug.js +26 -0
  339. package/backend/src/core/node-registries/events.js +201 -0
  340. package/backend/src/core/node-registries/flow.js +139 -0
  341. package/backend/src/core/node-registries/logic.js +62 -0
  342. package/backend/src/core/node-registries/math.js +42 -0
  343. package/backend/src/core/node-registries/objects.js +98 -0
  344. package/backend/src/core/node-registries/strings.js +187 -0
  345. package/backend/src/core/node-registries/time.js +113 -0
  346. package/backend/src/core/node-registries/type.js +25 -0
  347. package/backend/src/core/node-registries/users.js +79 -0
  348. package/backend/src/core/nodes/{action_bot_look_at.js → actions/bot_look_at.js} +36 -36
  349. package/backend/src/core/nodes/{action_bot_set_variable.js → actions/bot_set_variable.js} +32 -32
  350. package/backend/src/core/nodes/actions/create_command.js +189 -0
  351. package/backend/src/core/nodes/actions/delete_command.js +92 -0
  352. package/backend/src/core/nodes/{action_send_log.js → actions/send_log.js} +28 -23
  353. package/backend/src/core/nodes/{action_send_message.js → actions/send_message.js} +32 -32
  354. package/backend/src/core/nodes/actions/send_websocket_response.js +33 -0
  355. package/backend/src/core/nodes/actions/update_command.js +133 -0
  356. package/backend/src/core/nodes/arrays/get_next.js +35 -0
  357. package/backend/src/core/nodes/arrays/join.js +28 -0
  358. package/backend/src/core/nodes/{data_cast.js → data/cast.js} +10 -1
  359. package/backend/src/core/nodes/data/datetime_literal.js +27 -0
  360. package/backend/src/core/nodes/data/entity_info.js +69 -0
  361. package/backend/src/core/nodes/data/get_nearby_entities.js +32 -0
  362. package/backend/src/core/nodes/data/get_nearby_players.js +64 -0
  363. package/backend/src/core/nodes/{data_get_user_field.js → data/get_user_field.js} +1 -1
  364. package/backend/src/core/nodes/data/type_check.js +53 -0
  365. package/backend/src/core/nodes/{debug_log.js → debug/log.js} +16 -16
  366. package/backend/src/core/nodes/{flow_branch.js → flow/branch.js} +15 -15
  367. package/backend/src/core/nodes/{flow_break.js → flow/break.js} +14 -14
  368. package/backend/src/core/nodes/flow/delay.js +43 -0
  369. package/backend/src/core/nodes/{flow_for_each.js → flow/for_each.js} +39 -39
  370. package/backend/src/core/nodes/{flow_sequence.js → flow/sequence.js} +16 -16
  371. package/backend/src/core/nodes/{flow_switch.js → flow/switch.js} +47 -47
  372. package/backend/src/core/nodes/{flow_while.js → flow/while.js} +1 -1
  373. package/backend/src/core/nodes/logic/__tests__/compare.test.js +83 -0
  374. package/backend/src/core/nodes/logic/not.js +22 -0
  375. package/backend/src/core/nodes/math/__tests__/operation.test.js +65 -0
  376. package/backend/src/core/nodes/strings/__tests__/concat.test.js +89 -0
  377. package/backend/src/core/nodes/{string_starts_with.js → strings/starts_with.js} +1 -1
  378. package/backend/src/core/nodes/strings/to_lower.js +22 -0
  379. package/backend/src/core/nodes/strings/to_upper.js +22 -0
  380. package/backend/src/core/nodes/time/__tests__/now.test.js +24 -0
  381. package/backend/src/core/nodes/time/add.js +33 -0
  382. package/backend/src/core/nodes/time/compare.js +35 -0
  383. package/backend/src/core/nodes/time/diff.js +29 -0
  384. package/backend/src/core/nodes/time/format.js +32 -0
  385. package/backend/src/core/nodes/time/now.js +18 -0
  386. package/backend/src/core/nodes/type/to_string.js +32 -0
  387. package/backend/src/core/nodes/{user_check_blacklist.js → users/check_blacklist.js} +37 -37
  388. package/backend/src/core/nodes/{user_get_groups.js → users/get_groups.js} +36 -36
  389. package/backend/src/core/nodes/{user_get_permissions.js → users/get_permissions.js} +36 -36
  390. package/backend/src/core/nodes/{user_set_blacklist.js → users/set_blacklist.js} +37 -37
  391. package/backend/src/core/services/BotLifecycleService.js +835 -0
  392. package/backend/src/core/services/BotProcessManager.js +163 -0
  393. package/backend/src/core/services/CacheManager.js +111 -0
  394. package/backend/src/core/services/CommandExecutionService.js +430 -0
  395. package/backend/src/core/services/DebugSessionManager.js +347 -0
  396. package/backend/src/core/services/GraphCollaborationManager.js +501 -0
  397. package/backend/src/core/services/MinecraftBotManager.js +259 -0
  398. package/backend/src/core/services/MinecraftViewerService.js +216 -0
  399. package/backend/src/core/services/ResourceMonitorService.js +90 -0
  400. package/backend/src/core/services/TelemetryService.js +124 -0
  401. package/backend/src/core/services/TraceCollectorService.js +545 -0
  402. package/backend/src/core/services/ValidationService.js +132 -0
  403. package/backend/src/core/services/__tests__/ValidationService.test.js +148 -0
  404. package/backend/src/core/services.js +20 -5
  405. package/backend/src/core/system/CommandContext.js +84 -0
  406. package/backend/src/core/system/RuntimeCommandRegistry.js +116 -0
  407. package/backend/src/core/system/Transport.js +74 -0
  408. package/backend/src/core/utils/__tests__/jsonParser.test.js +44 -0
  409. package/backend/src/core/utils/jsonParser.js +18 -0
  410. package/backend/src/core/utils/secretsFilter.js +262 -0
  411. package/backend/src/core/utils/variableParser.js +89 -0
  412. package/backend/src/core/validation/__tests__/nodeSchemas.test.js +175 -0
  413. package/backend/src/core/validation/nodeSchemas.js +112 -0
  414. package/backend/src/lib/prisma.js +2 -4
  415. package/backend/src/real-time/botApi/handlers/commandHandlers.js +28 -0
  416. package/backend/src/real-time/botApi/handlers/graphHandlers.js +99 -0
  417. package/backend/src/real-time/botApi/handlers/graphWebSocketHandlers.js +147 -0
  418. package/backend/src/real-time/botApi/handlers/index.js +43 -0
  419. package/backend/src/real-time/botApi/handlers/messageHandlers.js +66 -0
  420. package/backend/src/real-time/botApi/handlers/statusHandlers.js +17 -0
  421. package/backend/src/real-time/botApi/handlers/userHandlers.js +141 -0
  422. package/backend/src/real-time/botApi/index.js +40 -0
  423. package/backend/src/real-time/botApi/middleware.js +79 -0
  424. package/backend/src/real-time/botApi/utils.js +65 -0
  425. package/backend/src/real-time/panelNamespace.js +387 -0
  426. package/backend/src/real-time/presence.js +7 -2
  427. package/backend/src/real-time/socketHandler.js +400 -5
  428. package/backend/src/repositories/BaseRepository.js +43 -0
  429. package/backend/src/repositories/BotRepository.js +42 -0
  430. package/backend/src/repositories/CommandRepository.js +53 -0
  431. package/backend/src/repositories/EventGraphRepository.js +40 -0
  432. package/backend/src/repositories/GroupRepository.js +69 -0
  433. package/backend/src/repositories/PermissionRepository.js +48 -0
  434. package/backend/src/repositories/PluginRepository.js +42 -0
  435. package/backend/src/repositories/ServerRepository.js +27 -0
  436. package/backend/src/repositories/UserRepository.js +48 -0
  437. package/backend/src/server.js +21 -0
  438. package/backend/src/test-refactor.js +85 -0
  439. package/frontend/dist/assets/index-B1serztM.js +11210 -0
  440. package/frontend/dist/assets/index-t6K1u4OV.css +32 -0
  441. package/frontend/dist/index.html +2 -2
  442. package/frontend/package-lock.json +9437 -0
  443. package/frontend/package.json +8 -5
  444. package/package.json +3 -2
  445. package/screen/console.png +0 -0
  446. package/screen/dashboard.png +0 -0
  447. package/screen/graph_collabe.png +0 -0
  448. package/screen/graph_live_debug.png +0 -0
  449. package/screen/management_command.png +0 -0
  450. package/screen/node_debug_trace.png +0 -0
  451. package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
  452. package/screen/websocket.png +0 -0
  453. package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
  454. package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
  455. package/frontend/dist/assets/index-B9GedHEa.js +0 -8352
  456. package/frontend/dist/assets/index-zLiy9MDx.css +0 -1
  457. package/nul +0 -0
  458. /package/backend/src/core/nodes/{action_http_request.js → actions/http_request.js} +0 -0
  459. /package/backend/src/core/nodes/{array_add_element.js → arrays/add_element.js} +0 -0
  460. /package/backend/src/core/nodes/{array_contains.js → arrays/contains.js} +0 -0
  461. /package/backend/src/core/nodes/{array_find_index.js → arrays/find_index.js} +0 -0
  462. /package/backend/src/core/nodes/{array_get_by_index.js → arrays/get_by_index.js} +0 -0
  463. /package/backend/src/core/nodes/{array_get_random_element.js → arrays/get_random_element.js} +0 -0
  464. /package/backend/src/core/nodes/{array_remove_by_index.js → arrays/remove_by_index.js} +0 -0
  465. /package/backend/src/core/nodes/{bot_get_position.js → bot/get_position.js} +0 -0
  466. /package/backend/src/core/nodes/{data_array_literal.js → data/array_literal.js} +0 -0
  467. /package/backend/src/core/nodes/{data_boolean_literal.js → data/boolean_literal.js} +0 -0
  468. /package/backend/src/core/nodes/{data_get_argument.js → data/get_argument.js} +0 -0
  469. /package/backend/src/core/nodes/{data_get_bot_look.js → data/get_bot_look.js} +0 -0
  470. /package/backend/src/core/nodes/{data_get_entity_field.js → data/get_entity_field.js} +0 -0
  471. /package/backend/src/core/nodes/{data_get_server_players.js → data/get_server_players.js} +0 -0
  472. /package/backend/src/core/nodes/{data_get_variable.js → data/get_variable.js} +0 -0
  473. /package/backend/src/core/nodes/{data_length.js → data/length.js} +0 -0
  474. /package/backend/src/core/nodes/{data_make_object.js → data/make_object.js} +0 -0
  475. /package/backend/src/core/nodes/{data_number_literal.js → data/number_literal.js} +0 -0
  476. /package/backend/src/core/nodes/{data_string_literal.js → data/string_literal.js} +0 -0
  477. /package/backend/src/core/nodes/{logic_compare.js → logic/compare.js} +0 -0
  478. /package/backend/src/core/nodes/{logic_operation.js → logic/operation.js} +0 -0
  479. /package/backend/src/core/nodes/{math_operation.js → math/operation.js} +0 -0
  480. /package/backend/src/core/nodes/{math_random_number.js → math/random_number.js} +0 -0
  481. /package/backend/src/core/nodes/{object_create.js → objects/create.js} +0 -0
  482. /package/backend/src/core/nodes/{object_delete.js → objects/delete.js} +0 -0
  483. /package/backend/src/core/nodes/{object_get.js → objects/get.js} +0 -0
  484. /package/backend/src/core/nodes/{object_has_key.js → objects/has_key.js} +0 -0
  485. /package/backend/src/core/nodes/{object_set.js → objects/set.js} +0 -0
  486. /package/backend/src/core/nodes/{string_concat.js → strings/concat.js} +0 -0
  487. /package/backend/src/core/nodes/{string_contains.js → strings/contains.js} +0 -0
  488. /package/backend/src/core/nodes/{string_ends_with.js → strings/ends_with.js} +0 -0
  489. /package/backend/src/core/nodes/{string_equals.js → strings/equals.js} +0 -0
  490. /package/backend/src/core/nodes/{string_length.js → strings/length.js} +0 -0
  491. /package/backend/src/core/nodes/{string_matches.js → strings/matches.js} +0 -0
  492. /package/backend/src/core/nodes/{string_split.js → strings/split.js} +0 -0
@@ -0,0 +1,83 @@
1
+ describe('logic:compare node', () => {
2
+ const logicCompare = require('../compare');
3
+
4
+ const mockHelpers = (aValue, bValue) => ({
5
+ resolvePinValue: jest.fn(async (node, pinId) => {
6
+ if (pinId === 'a') return aValue;
7
+ if (pinId === 'b') return bValue;
8
+ return null;
9
+ }),
10
+ });
11
+
12
+ it('should compare greater than', async () => {
13
+ const node = { id: 'test', data: { operation: '>' } };
14
+ const helpers = mockHelpers(10, 5);
15
+
16
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
17
+
18
+ expect(result).toBe(true);
19
+ });
20
+
21
+ it('should compare less than', async () => {
22
+ const node = { id: 'test', data: { operation: '<' } };
23
+ const helpers = mockHelpers(5, 10);
24
+
25
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
26
+
27
+ expect(result).toBe(true);
28
+ });
29
+
30
+ it('should compare equals', async () => {
31
+ const node = { id: 'test', data: { operation: '==' } };
32
+ const helpers = mockHelpers(10, 10);
33
+
34
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
35
+
36
+ expect(result).toBe(true);
37
+ });
38
+
39
+ it('should compare not equals', async () => {
40
+ const node = { id: 'test', data: { operation: '!=' } };
41
+ const helpers = mockHelpers(10, 5);
42
+
43
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
44
+
45
+ expect(result).toBe(true);
46
+ });
47
+
48
+ it('should compare greater or equal', async () => {
49
+ const node = { id: 'test', data: { operation: '>=' } };
50
+ const helpers = mockHelpers(10, 10);
51
+
52
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
53
+
54
+ expect(result).toBe(true);
55
+ });
56
+
57
+ it('should compare less or equal', async () => {
58
+ const node = { id: 'test', data: { operation: '<=' } };
59
+ const helpers = mockHelpers(5, 10);
60
+
61
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
62
+
63
+ expect(result).toBe(true);
64
+ });
65
+
66
+ it('should handle string comparison', async () => {
67
+ const node = { id: 'test', data: { operation: '<' } };
68
+ const helpers = mockHelpers('apple', 'banana');
69
+
70
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
71
+
72
+ expect(result).toBe(true);
73
+ });
74
+
75
+ it('should default to equals if no operation specified', async () => {
76
+ const node = { id: 'test', data: {} };
77
+ const helpers = mockHelpers(5, 5);
78
+
79
+ const result = await logicCompare.evaluate(node, 'result', {}, helpers);
80
+
81
+ expect(result).toBe(true);
82
+ });
83
+ });
@@ -0,0 +1,22 @@
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 value = await resolvePinValue(node, 'value', false);
14
+ return !value;
15
+ }
16
+
17
+ return false;
18
+ }
19
+
20
+ module.exports = {
21
+ evaluate,
22
+ };
@@ -0,0 +1,65 @@
1
+ describe('math:operation node', () => {
2
+ const mathOperation = require('../operation');
3
+
4
+ const mockHelpers = (aValue, bValue) => ({
5
+ resolvePinValue: jest.fn(async (node, pinId, defaultValue) => {
6
+ if (pinId === 'a') return aValue;
7
+ if (pinId === 'b') return bValue;
8
+ return defaultValue;
9
+ }),
10
+ });
11
+
12
+ it('should add two numbers', async () => {
13
+ const node = { id: 'test', data: { operation: '+' } };
14
+ const helpers = mockHelpers(5, 3);
15
+
16
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
17
+
18
+ expect(result).toBe(8);
19
+ });
20
+
21
+ it('should subtract two numbers', async () => {
22
+ const node = { id: 'test', data: { operation: '-' } };
23
+ const helpers = mockHelpers(10, 3);
24
+
25
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
26
+
27
+ expect(result).toBe(7);
28
+ });
29
+
30
+ it('should multiply two numbers', async () => {
31
+ const node = { id: 'test', data: { operation: '*' } };
32
+ const helpers = mockHelpers(4, 5);
33
+
34
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
35
+
36
+ expect(result).toBe(20);
37
+ });
38
+
39
+ it('should divide two numbers', async () => {
40
+ const node = { id: 'test', data: { operation: '/' } };
41
+ const helpers = mockHelpers(20, 4);
42
+
43
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
44
+
45
+ expect(result).toBe(5);
46
+ });
47
+
48
+ it('should handle division by zero', async () => {
49
+ const node = { id: 'test', data: { operation: '/' } };
50
+ const helpers = mockHelpers(10, 0);
51
+
52
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
53
+
54
+ expect(result).toBe(0);
55
+ });
56
+
57
+ it('should default to addition if operation not specified', async () => {
58
+ const node = { id: 'test', data: {} };
59
+ const helpers = mockHelpers(5, 3);
60
+
61
+ const result = await mathOperation.evaluate(node, 'result', {}, helpers);
62
+
63
+ expect(result).toBe(8);
64
+ });
65
+ });
@@ -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
+ });
@@ -23,7 +23,7 @@ async function evaluate(node, pinId, context, helpers) {
23
23
  const { resolvePinValue } = helpers;
24
24
 
25
25
  if (pinId === 'result') {
26
- const str = String(await resolvePinValue(node, 'string', ''));
26
+ const str = String(await resolvePinValue(node, 'text', ''));
27
27
  const prefix = String(await resolvePinValue(node, 'prefix', ''));
28
28
  const caseSensitive = await resolvePinValue(node, 'case_sensitive', false);
29
29
 
@@ -0,0 +1,22 @@
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 text = String(await resolvePinValue(node, 'text', ''));
14
+ return text.toLowerCase();
15
+ }
16
+
17
+ return '';
18
+ }
19
+
20
+ module.exports = {
21
+ evaluate,
22
+ };
@@ -0,0 +1,22 @@
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 text = String(await resolvePinValue(node, 'text', ''));
14
+ return text.toUpperCase();
15
+ }
16
+
17
+ return '';
18
+ }
19
+
20
+ module.exports = {
21
+ evaluate,
22
+ };
@@ -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,32 @@
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 value = await resolvePinValue(node, 'value', '');
14
+
15
+ // Преобразуем в строку
16
+ if (value === null || value === undefined) {
17
+ return '';
18
+ }
19
+
20
+ if (typeof value === 'object') {
21
+ return JSON.stringify(value);
22
+ }
23
+
24
+ return String(value);
25
+ }
26
+
27
+ return '';
28
+ }
29
+
30
+ module.exports = {
31
+ evaluate,
32
+ };
@@ -1,37 +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
- };
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
+ };