blockmine 1.19.1 → 1.21.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 (72) hide show
  1. package/.claude/settings.local.json +23 -0
  2. package/CHANGELOG.md +23 -0
  3. package/backend/src/core/BotManager.js +34 -4
  4. package/backend/src/core/BotProcess.js +8 -0
  5. package/backend/src/core/BreakLoopSignal.js +8 -0
  6. package/backend/src/core/EventGraphManager.js +5 -0
  7. package/backend/src/core/GraphExecutionEngine.js +37 -629
  8. package/backend/src/core/NodeRegistry.js +146 -2
  9. package/backend/src/core/nodes/action_bot_look_at.js +36 -0
  10. package/backend/src/core/nodes/action_bot_set_variable.js +32 -0
  11. package/backend/src/core/nodes/action_http_request.js +98 -0
  12. package/backend/src/core/nodes/action_send_log.js +23 -0
  13. package/backend/src/core/nodes/action_send_message.js +32 -0
  14. package/backend/src/core/nodes/array_add_element.js +23 -0
  15. package/backend/src/core/nodes/array_contains.js +40 -0
  16. package/backend/src/core/nodes/array_find_index.js +23 -0
  17. package/backend/src/core/nodes/array_get_by_index.js +23 -0
  18. package/backend/src/core/nodes/array_get_random_element.js +32 -0
  19. package/backend/src/core/nodes/array_remove_by_index.js +30 -0
  20. package/backend/src/core/nodes/bot_get_position.js +20 -0
  21. package/backend/src/core/nodes/data_array_literal.js +31 -0
  22. package/backend/src/core/nodes/data_boolean_literal.js +21 -0
  23. package/backend/src/core/nodes/data_cast.js +34 -0
  24. package/backend/src/core/nodes/data_get_argument.js +23 -0
  25. package/backend/src/core/nodes/data_get_bot_look.js +14 -0
  26. package/backend/src/core/nodes/data_get_entity_field.js +18 -0
  27. package/backend/src/core/nodes/data_get_server_players.js +18 -0
  28. package/backend/src/core/nodes/data_get_user_field.js +40 -0
  29. package/backend/src/core/nodes/data_get_variable.js +23 -0
  30. package/backend/src/core/nodes/data_length.js +25 -0
  31. package/backend/src/core/nodes/data_make_object.js +31 -0
  32. package/backend/src/core/nodes/data_number_literal.js +21 -0
  33. package/backend/src/core/nodes/data_string_literal.js +34 -0
  34. package/backend/src/core/nodes/debug_log.js +16 -0
  35. package/backend/src/core/nodes/flow_branch.js +15 -0
  36. package/backend/src/core/nodes/flow_break.js +14 -0
  37. package/backend/src/core/nodes/flow_for_each.js +39 -0
  38. package/backend/src/core/nodes/flow_sequence.js +16 -0
  39. package/backend/src/core/nodes/flow_switch.js +47 -0
  40. package/backend/src/core/nodes/flow_while.js +64 -0
  41. package/backend/src/core/nodes/logic_compare.js +33 -0
  42. package/backend/src/core/nodes/logic_operation.js +35 -0
  43. package/backend/src/core/nodes/math_operation.js +31 -0
  44. package/backend/src/core/nodes/math_random_number.js +43 -0
  45. package/backend/src/core/nodes/object_create.js +40 -0
  46. package/backend/src/core/nodes/object_delete.js +26 -0
  47. package/backend/src/core/nodes/object_get.js +23 -0
  48. package/backend/src/core/nodes/object_has_key.js +30 -0
  49. package/backend/src/core/nodes/object_set.js +27 -0
  50. package/backend/src/core/nodes/string_concat.js +27 -0
  51. package/backend/src/core/nodes/string_contains.js +41 -0
  52. package/backend/src/core/nodes/string_ends_with.js +43 -0
  53. package/backend/src/core/nodes/string_equals.js +36 -0
  54. package/backend/src/core/nodes/string_length.js +36 -0
  55. package/backend/src/core/nodes/string_matches.js +39 -0
  56. package/backend/src/core/nodes/string_split.js +37 -0
  57. package/backend/src/core/nodes/string_starts_with.js +43 -0
  58. package/backend/src/core/nodes/user_check_blacklist.js +37 -0
  59. package/backend/src/core/nodes/user_get_groups.js +36 -0
  60. package/backend/src/core/nodes/user_get_permissions.js +36 -0
  61. package/backend/src/core/nodes/user_set_blacklist.js +37 -0
  62. package/frontend/dist/assets/index-B9GedHEa.js +8352 -0
  63. package/frontend/dist/assets/index-zLiy9MDx.css +1 -0
  64. package/frontend/dist/index.html +2 -2
  65. package/frontend/package.json +1 -0
  66. package/nul +0 -0
  67. package/package.json +1 -1
  68. package/.kiro/steering/product.md +0 -27
  69. package/.kiro/steering/structure.md +0 -89
  70. package/.kiro/steering/tech.md +0 -94
  71. package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
  72. package/frontend/dist/assets/index-DxdxTe6I.js +0 -8352
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const message = await helpers.resolvePinValue(node, 'message', '');
10
+
11
+ // this.botManager - это экземпляр botManager из GraphExecutionEngine
12
+ if (this.botManager?.appendLog && context?.botId) {
13
+ this.botManager.appendLog(context.botId, `[Graph] ${message}`);
14
+ } else {
15
+ console.log(`[Graph Log] ${message}`);
16
+ }
17
+
18
+ await helpers.traverse(node, 'exec');
19
+ }
20
+
21
+ module.exports = {
22
+ execute,
23
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {object} context - Контекст выполнения графа.
4
+ * @param {object} helpers - Вспомогательные функции движка.
5
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с пина.
6
+ * @param {function} helpers.traverse - Функция для перехода к следующему узлу.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const { resolvePinValue, traverse } = helpers;
10
+
11
+ let message = String(await resolvePinValue(node, 'message', ''));
12
+ const chatType = await resolvePinValue(node, 'chat_type', context.typeChat);
13
+ const recipient = await resolvePinValue(node, 'recipient', context.user?.username);
14
+
15
+ // Парсим и заменяем переменные в формате {varName}
16
+ const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
17
+ const matches = [...message.matchAll(variablePattern)];
18
+
19
+ for (const match of matches) {
20
+ const varName = match[1];
21
+ // Для динамических пинов, созданных на фронтенде, значение нужно будет получить, используя resolvePinValue
22
+ const varValue = await resolvePinValue(node, `var_${varName}`, '');
23
+ message = message.replace(match[0], String(varValue));
24
+ }
25
+
26
+ context.bot.sendMessage(chatType, message, recipient);
27
+ await traverse(node, 'exec');
28
+ }
29
+
30
+ module.exports = {
31
+ execute,
32
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'result') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+ return Array.isArray(arr) ? [...arr, element] : [element];
16
+ }
17
+
18
+ return [];
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @param {Map} helpers.memo - Map для хранения мемоизированных значений.
8
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue, memo } = helpers;
12
+
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+
16
+ if (Array.isArray(arr)) {
17
+ const index = arr.indexOf(element);
18
+ memo.set(`${node.id}:index`, index);
19
+
20
+ if (pinId === 'result') {
21
+ return index !== -1;
22
+ } else if (pinId === 'index') {
23
+ return index;
24
+ }
25
+ } else {
26
+ memo.set(`${node.id}:index`, -1);
27
+
28
+ if (pinId === 'result') {
29
+ return false;
30
+ } else if (pinId === 'index') {
31
+ return -1;
32
+ }
33
+ }
34
+
35
+ return null;
36
+ }
37
+
38
+ module.exports = {
39
+ evaluate,
40
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'index') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const element = await resolvePinValue(node, 'element', null);
15
+ return Array.isArray(arr) ? arr.indexOf(element) : -1;
16
+ }
17
+
18
+ return -1;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'element') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const index = await resolvePinValue(node, 'index', -1);
15
+ return (!Array.isArray(arr) || index < 0 || index >= arr.length) ? null : arr[index];
16
+ }
17
+
18
+ return null;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @param {Map} helpers.memo - Map для хранения мемоизированных значений.
8
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
9
+ */
10
+ async function evaluate(node, pinId, context, helpers) {
11
+ const { resolvePinValue, memo } = helpers;
12
+
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ if (!Array.isArray(arr) || arr.length === 0) {
15
+ return pinId === 'index' ? -1 : null;
16
+ }
17
+
18
+ const randomIndex = Math.floor(Math.random() * arr.length);
19
+ memo.set(`${node.id}:index`, randomIndex);
20
+
21
+ if (pinId === 'element') {
22
+ return arr[randomIndex];
23
+ } else if (pinId === 'index') {
24
+ return randomIndex;
25
+ }
26
+
27
+ return null;
28
+ }
29
+
30
+ module.exports = {
31
+ evaluate,
32
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @param {function} helpers.resolvePinValue - Функция для получения значения с входного пина.
7
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
8
+ */
9
+ async function evaluate(node, pinId, context, helpers) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ if (pinId === 'result') {
13
+ const arr = await resolvePinValue(node, 'array', []);
14
+ const index = await resolvePinValue(node, 'index', -1);
15
+
16
+ if (!Array.isArray(arr) || index < 0 || index >= arr.length) {
17
+ return arr || [];
18
+ }
19
+
20
+ const newArr = [...arr];
21
+ newArr.splice(index, 1);
22
+ return newArr;
23
+ }
24
+
25
+ return [];
26
+ }
27
+
28
+ module.exports = {
29
+ evaluate,
30
+ };
@@ -0,0 +1,20 @@
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 === 'position') {
10
+ if (context.bot?.entity?.position) {
11
+ return context.bot.entity.position;
12
+ }
13
+ }
14
+
15
+ return null;
16
+ }
17
+
18
+ module.exports = {
19
+ evaluate,
20
+ };
@@ -0,0 +1,31 @@
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 === 'value') {
13
+ const numPins = node.data?.pinCount || 0;
14
+ const items = [];
15
+
16
+ for (let i = 0; i < numPins; i++) {
17
+ const value = await resolvePinValue(node, `pin_${i}`) ||
18
+ node.data?.[`item_${i}`] ||
19
+ node.data?.[`value_${i}`];
20
+ items.push(value);
21
+ }
22
+
23
+ return items;
24
+ }
25
+
26
+ return [];
27
+ }
28
+
29
+ module.exports = {
30
+ evaluate,
31
+ };
@@ -0,0 +1,21 @@
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 === 'value') {
13
+ return await resolvePinValue(node, 'value', false);
14
+ }
15
+
16
+ return false;
17
+ }
18
+
19
+ module.exports = {
20
+ evaluate,
21
+ };
@@ -0,0 +1,34 @@
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 === 'value') {
13
+ const value = await resolvePinValue(node, 'value');
14
+ const targetType = node.data?.targetType || 'String';
15
+
16
+ switch (targetType) {
17
+ case 'String':
18
+ return String(value ?? '');
19
+ case 'Number':
20
+ const num = Number(value);
21
+ return isNaN(num) ? 0 : num;
22
+ case 'Boolean':
23
+ return ['true', '1', 'yes'].includes(String(value).toLowerCase());
24
+ default:
25
+ return value;
26
+ }
27
+ }
28
+
29
+ return null;
30
+ }
31
+
32
+ module.exports = {
33
+ evaluate,
34
+ };
@@ -0,0 +1,23 @@
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, defaultValue = null) {
9
+ const args = context.args || {};
10
+ const argName = node.data?.argumentName || '';
11
+
12
+ if (pinId === 'value') {
13
+ return args && argName && args[argName] !== undefined ? args[argName] : defaultValue;
14
+ } else if (pinId === 'exists') {
15
+ return args && argName && args[argName] !== undefined;
16
+ }
17
+
18
+ return null;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,14 @@
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
+ return context.botState ? { yaw: context.botState.yaw, pitch: context.botState.pitch } : null;
10
+ }
11
+
12
+ module.exports = {
13
+ evaluate,
14
+ };
@@ -0,0 +1,18 @@
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, defaultValue = null) {
10
+ const { resolvePinValue } = helpers;
11
+
12
+ const entity = await resolvePinValue(node, 'entity');
13
+ return entity ? entity[pinId] : defaultValue;
14
+ }
15
+
16
+ module.exports = {
17
+ evaluate,
18
+ };
@@ -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 === 'players') {
10
+ return context.players || [];
11
+ }
12
+
13
+ return [];
14
+ }
15
+
16
+ module.exports = {
17
+ evaluate,
18
+ };
@@ -0,0 +1,40 @@
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, defaultValue = null) {
12
+ const { resolvePinValue } = helpers;
13
+
14
+ const userIdentifier = await resolvePinValue(node, 'user');
15
+ let userObject = null;
16
+
17
+ if (userIdentifier && typeof userIdentifier === 'object' && userIdentifier.username) {
18
+ userObject = userIdentifier;
19
+ } else if (typeof userIdentifier === 'string' && userIdentifier.length > 0) {
20
+ userObject = await User.getUser(userIdentifier, context.botId);
21
+ }
22
+
23
+ if (userObject) {
24
+ if (pinId === 'username') {
25
+ return userObject.username;
26
+ } else if (pinId === 'groups') {
27
+ return userObject.groups ? userObject.groups.map(g => g.group?.name).filter(Boolean) : [];
28
+ } else if (pinId === 'permissions') {
29
+ return userObject.permissionsSet ? Array.from(userObject.permissionsSet) : [];
30
+ } else if (pinId === 'isBlacklisted') {
31
+ return !!userObject.isBlacklisted;
32
+ }
33
+ }
34
+
35
+ return defaultValue;
36
+ }
37
+
38
+ module.exports = {
39
+ evaluate,
40
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @param {object} node - Экземпляр узла из графа.
3
+ * @param {string} pinId - Идентификатор выходного пина, значение которого нужно вычислить.
4
+ * @param {object} context - Контекст выполнения графа.
5
+ * @param {object} helpers - Вспомогательные функции движка.
6
+ * @returns {Promise<any>} - Вычисленное значение для выходного пина.
7
+ */
8
+ async function evaluate(node, pinId, context, helpers) {
9
+ if (pinId === 'value') {
10
+ const varName = node.data?.variableName || node.data?.selectedVariable || '';
11
+ if (!varName) {
12
+ console.warn('[GraphExecutionEngine] data:get_variable: не указано имя переменной', node.data);
13
+ return null;
14
+ }
15
+ return context.variables.hasOwnProperty(varName) ? context.variables[varName] : null;
16
+ }
17
+
18
+ return null;
19
+ }
20
+
21
+ module.exports = {
22
+ evaluate,
23
+ };
@@ -0,0 +1,25 @@
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 === 'length') {
13
+ const data = await resolvePinValue(node, 'data');
14
+ if (Array.isArray(data) || typeof data === 'string') {
15
+ return data.length;
16
+ }
17
+ return 0;
18
+ }
19
+
20
+ return 0;
21
+ }
22
+
23
+ module.exports = {
24
+ evaluate,
25
+ };
@@ -0,0 +1,31 @@
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 === 'value') {
13
+ const numPins = node.data?.pinCount || 0;
14
+ const obj = {};
15
+
16
+ for (let i = 0; i < numPins; i++) {
17
+ const key = node.data[`key_${i}`];
18
+ if (key) {
19
+ obj[key] = await resolvePinValue(node, `value_${i}`);
20
+ }
21
+ }
22
+
23
+ return obj;
24
+ }
25
+
26
+ return {};
27
+ }
28
+
29
+ module.exports = {
30
+ evaluate,
31
+ };
@@ -0,0 +1,21 @@
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 === 'value') {
13
+ return await resolvePinValue(node, 'value', 0);
14
+ }
15
+
16
+ return 0;
17
+ }
18
+
19
+ module.exports = {
20
+ evaluate,
21
+ };
@@ -0,0 +1,34 @@
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 === 'value') {
13
+ let text = String(node.data?.value || '');
14
+
15
+ // Парсим и заменяем переменные в формате {varName}
16
+ const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
17
+ const matches = [...text.matchAll(variablePattern)];
18
+
19
+ for (const match of matches) {
20
+ const varName = match[1];
21
+ // Получаем значение из динамического пина
22
+ const varValue = await resolvePinValue(node, `var_${varName}`, '');
23
+ text = text.replace(match[0], String(varValue));
24
+ }
25
+
26
+ return text;
27
+ }
28
+
29
+ return '';
30
+ }
31
+
32
+ module.exports = {
33
+ evaluate,
34
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @param {object} node - The node instance from the graph.
3
+ * @param {object} context - The execution context.
4
+ * @param {object} helpers - Execution helpers.
5
+ * @param {function} helpers.resolvePinValue - Function to resolve a pin's value.
6
+ * @param {function} helpers.traverse - Function to continue execution to the next node.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ const value = await helpers.resolvePinValue(node, 'value');
10
+ console.log('[Graph Debug]', value);
11
+ await helpers.traverse(node, 'exec');
12
+ }
13
+
14
+ module.exports = {
15
+ execute,
16
+ };
@@ -0,0 +1,15 @@
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 condition = await helpers.resolvePinValue(node, 'condition', false);
10
+ await helpers.traverse(node, condition ? 'exec_true' : 'exec_false');
11
+ }
12
+
13
+ module.exports = {
14
+ execute,
15
+ };
@@ -0,0 +1,14 @@
1
+ const BreakLoopSignal = require('../BreakLoopSignal');
2
+
3
+ /**
4
+ * @param {object} node - Экземпляр узла из графа.
5
+ * @param {object} context - Контекст выполнения графа.
6
+ * @param {object} helpers - Вспомогательные функции движка.
7
+ */
8
+ async function execute(node, context, helpers) {
9
+ throw new BreakLoopSignal();
10
+ }
11
+
12
+ module.exports = {
13
+ execute,
14
+ };