@foresthubai/workflow-core 0.4.3 → 0.4.5

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 (298) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +14 -14
  3. package/README.md +63 -63
  4. package/dist/api/deployment.d.ts +74 -0
  5. package/dist/api/deployment.d.ts.map +1 -0
  6. package/dist/api/deployment.js +6 -0
  7. package/dist/api/deployment.js.map +1 -0
  8. package/dist/api/engine.d.ts +744 -0
  9. package/dist/api/engine.d.ts.map +1 -0
  10. package/dist/api/engine.js +6 -0
  11. package/dist/api/engine.js.map +1 -0
  12. package/dist/api/index.d.ts +4 -0
  13. package/dist/api/index.d.ts.map +1 -1
  14. package/dist/api/index.js +2 -0
  15. package/dist/api/index.js.map +1 -1
  16. package/dist/api/workflow.d.ts +25 -9
  17. package/dist/api/workflow.d.ts.map +1 -1
  18. package/dist/channel/Channel.d.ts +1 -1
  19. package/dist/channel/Channel.d.ts.map +1 -1
  20. package/dist/channel/Channel.js +3 -1
  21. package/dist/channel/Channel.js.map +1 -1
  22. package/dist/channel/ChannelDefinition.d.ts.map +1 -1
  23. package/dist/channel/ChannelDefinition.js +24 -0
  24. package/dist/channel/ChannelDefinition.js.map +1 -1
  25. package/dist/channel/index.d.ts.map +1 -1
  26. package/dist/channel/index.js +2 -0
  27. package/dist/channel/index.js.map +1 -1
  28. package/dist/channel/serialization.d.ts.map +1 -1
  29. package/dist/channel/serialization.js +8 -0
  30. package/dist/channel/serialization.js.map +1 -1
  31. package/dist/deploy/index.d.ts +5 -1
  32. package/dist/deploy/index.d.ts.map +1 -1
  33. package/dist/deploy/index.js +4 -1
  34. package/dist/deploy/index.js.map +1 -1
  35. package/dist/deploy/inputs.d.ts +26 -0
  36. package/dist/deploy/inputs.d.ts.map +1 -0
  37. package/dist/deploy/inputs.js +4 -0
  38. package/dist/deploy/inputs.js.map +1 -0
  39. package/dist/deploy/requirements.d.ts +24 -0
  40. package/dist/deploy/requirements.d.ts.map +1 -1
  41. package/dist/deploy/requirements.js +63 -0
  42. package/dist/deploy/requirements.js.map +1 -1
  43. package/dist/deploy/spec.d.ts +27 -0
  44. package/dist/deploy/spec.d.ts.map +1 -0
  45. package/dist/deploy/spec.js +352 -0
  46. package/dist/deploy/spec.js.map +1 -0
  47. package/dist/diagnostics/__fixtures__/diagnosticFixtures.d.ts.map +1 -1
  48. package/dist/diagnostics/__fixtures__/diagnosticFixtures.js +2 -0
  49. package/dist/diagnostics/__fixtures__/diagnosticFixtures.js.map +1 -1
  50. package/dist/diagnostics/diagnostics.d.ts.map +1 -1
  51. package/dist/diagnostics/diagnostics.js +2 -0
  52. package/dist/diagnostics/diagnostics.js.map +1 -1
  53. package/dist/diagnostics/index.d.ts.map +1 -1
  54. package/dist/diagnostics/index.js +2 -0
  55. package/dist/diagnostics/index.js.map +1 -1
  56. package/dist/edge/Edge.d.ts.map +1 -1
  57. package/dist/edge/Edge.js +2 -0
  58. package/dist/edge/Edge.js.map +1 -1
  59. package/dist/edge/EdgeDefinition.d.ts.map +1 -1
  60. package/dist/edge/EdgeDefinition.js +2 -0
  61. package/dist/edge/EdgeDefinition.js.map +1 -1
  62. package/dist/edge/EdgeType.d.ts.map +1 -1
  63. package/dist/edge/EdgeType.js +2 -0
  64. package/dist/edge/EdgeType.js.map +1 -1
  65. package/dist/edge/index.d.ts.map +1 -1
  66. package/dist/edge/index.js +2 -2
  67. package/dist/edge/index.js.map +1 -1
  68. package/dist/edge/serialization.d.ts.map +1 -1
  69. package/dist/edge/serialization.js +2 -0
  70. package/dist/edge/serialization.js.map +1 -1
  71. package/dist/expression/index.d.ts.map +1 -1
  72. package/dist/expression/index.js +2 -0
  73. package/dist/expression/index.js.map +1 -1
  74. package/dist/expression/parser.d.ts.map +1 -1
  75. package/dist/expression/parser.js +2 -0
  76. package/dist/expression/parser.js.map +1 -1
  77. package/dist/expression/types.d.ts.map +1 -1
  78. package/dist/expression/types.js +2 -0
  79. package/dist/expression/types.js.map +1 -1
  80. package/dist/function/FunctionDeclaration.d.ts.map +1 -1
  81. package/dist/function/FunctionDeclaration.js +2 -0
  82. package/dist/function/FunctionDeclaration.js.map +1 -1
  83. package/dist/function/index.d.ts.map +1 -1
  84. package/dist/function/index.js +2 -0
  85. package/dist/function/index.js.map +1 -1
  86. package/dist/function/serialization.d.ts.map +1 -1
  87. package/dist/function/serialization.js +2 -0
  88. package/dist/function/serialization.js.map +1 -1
  89. package/dist/id/index.d.ts.map +1 -1
  90. package/dist/id/index.js +2 -0
  91. package/dist/id/index.js.map +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/memory/Memory.d.ts.map +1 -1
  96. package/dist/memory/Memory.js +2 -0
  97. package/dist/memory/Memory.js.map +1 -1
  98. package/dist/memory/MemoryDefinition.d.ts.map +1 -1
  99. package/dist/memory/MemoryDefinition.js +2 -0
  100. package/dist/memory/MemoryDefinition.js.map +1 -1
  101. package/dist/memory/MemoryFileDefinition.d.ts.map +1 -1
  102. package/dist/memory/MemoryFileDefinition.js +2 -0
  103. package/dist/memory/MemoryFileDefinition.js.map +1 -1
  104. package/dist/memory/MemoryRegistry.d.ts.map +1 -1
  105. package/dist/memory/MemoryRegistry.js +2 -0
  106. package/dist/memory/MemoryRegistry.js.map +1 -1
  107. package/dist/memory/VectorDatabaseDefinition.d.ts.map +1 -1
  108. package/dist/memory/VectorDatabaseDefinition.js +2 -0
  109. package/dist/memory/VectorDatabaseDefinition.js.map +1 -1
  110. package/dist/memory/index.d.ts.map +1 -1
  111. package/dist/memory/index.js +2 -0
  112. package/dist/memory/index.js.map +1 -1
  113. package/dist/memory/serialization.d.ts.map +1 -1
  114. package/dist/memory/serialization.js +2 -0
  115. package/dist/memory/serialization.js.map +1 -1
  116. package/dist/migration/index.d.ts.map +1 -1
  117. package/dist/migration/index.js +2 -0
  118. package/dist/migration/index.js.map +1 -1
  119. package/dist/migration/migrate.d.ts.map +1 -1
  120. package/dist/migration/migrate.js +2 -0
  121. package/dist/migration/migrate.js.map +1 -1
  122. package/dist/migration/migrations.d.ts.map +1 -1
  123. package/dist/migration/migrations.js +2 -0
  124. package/dist/migration/migrations.js.map +1 -1
  125. package/dist/migration/version.d.ts.map +1 -1
  126. package/dist/migration/version.js +2 -0
  127. package/dist/migration/version.js.map +1 -1
  128. package/dist/model/LLMModelDefinition.d.ts.map +1 -1
  129. package/dist/model/LLMModelDefinition.js +2 -0
  130. package/dist/model/LLMModelDefinition.js.map +1 -1
  131. package/dist/model/Model.d.ts.map +1 -1
  132. package/dist/model/Model.js +2 -13
  133. package/dist/model/Model.js.map +1 -1
  134. package/dist/model/ModelDefinition.d.ts.map +1 -1
  135. package/dist/model/ModelDefinition.js +2 -0
  136. package/dist/model/ModelDefinition.js.map +1 -1
  137. package/dist/model/ModelRegistry.d.ts.map +1 -1
  138. package/dist/model/ModelRegistry.js +2 -0
  139. package/dist/model/ModelRegistry.js.map +1 -1
  140. package/dist/model/index.d.ts.map +1 -1
  141. package/dist/model/index.js +2 -0
  142. package/dist/model/index.js.map +1 -1
  143. package/dist/model/serialization.d.ts.map +1 -1
  144. package/dist/model/serialization.js +2 -0
  145. package/dist/model/serialization.js.map +1 -1
  146. package/dist/node/AgentNode.d.ts.map +1 -1
  147. package/dist/node/AgentNode.js +2 -0
  148. package/dist/node/AgentNode.js.map +1 -1
  149. package/dist/node/DataNode.d.ts.map +1 -1
  150. package/dist/node/DataNode.js +2 -0
  151. package/dist/node/DataNode.js.map +1 -1
  152. package/dist/node/FunctionNode.d.ts.map +1 -1
  153. package/dist/node/FunctionNode.js +2 -0
  154. package/dist/node/FunctionNode.js.map +1 -1
  155. package/dist/node/InputNode.d.ts.map +1 -1
  156. package/dist/node/InputNode.js +2 -0
  157. package/dist/node/InputNode.js.map +1 -1
  158. package/dist/node/LogicNode.d.ts.map +1 -1
  159. package/dist/node/LogicNode.js +2 -0
  160. package/dist/node/LogicNode.js.map +1 -1
  161. package/dist/node/MqttNode.d.ts.map +1 -1
  162. package/dist/node/MqttNode.js +2 -0
  163. package/dist/node/MqttNode.js.map +1 -1
  164. package/dist/node/Node.d.ts.map +1 -1
  165. package/dist/node/Node.js +2 -7
  166. package/dist/node/Node.js.map +1 -1
  167. package/dist/node/NodeDefinition.d.ts.map +1 -1
  168. package/dist/node/NodeDefinition.js +2 -0
  169. package/dist/node/NodeDefinition.js.map +1 -1
  170. package/dist/node/NodeRegistry.d.ts.map +1 -1
  171. package/dist/node/NodeRegistry.js +2 -0
  172. package/dist/node/NodeRegistry.js.map +1 -1
  173. package/dist/node/OutputNode.d.ts.map +1 -1
  174. package/dist/node/OutputNode.js +4 -2
  175. package/dist/node/OutputNode.js.map +1 -1
  176. package/dist/node/ToolNode.d.ts.map +1 -1
  177. package/dist/node/ToolNode.js +2 -0
  178. package/dist/node/ToolNode.js.map +1 -1
  179. package/dist/node/TriggerNode.d.ts.map +1 -1
  180. package/dist/node/TriggerNode.js +2 -0
  181. package/dist/node/TriggerNode.js.map +1 -1
  182. package/dist/node/constants.d.ts.map +1 -1
  183. package/dist/node/constants.js +2 -0
  184. package/dist/node/constants.js.map +1 -1
  185. package/dist/node/index.d.ts.map +1 -1
  186. package/dist/node/index.js +2 -0
  187. package/dist/node/index.js.map +1 -1
  188. package/dist/node/methods.d.ts.map +1 -1
  189. package/dist/node/methods.js +2 -0
  190. package/dist/node/methods.js.map +1 -1
  191. package/dist/node/serialization.d.ts.map +1 -1
  192. package/dist/node/serialization.js +33 -13
  193. package/dist/node/serialization.js.map +1 -1
  194. package/dist/parameter/OutputParameter.d.ts.map +1 -1
  195. package/dist/parameter/OutputParameter.js +2 -0
  196. package/dist/parameter/OutputParameter.js.map +1 -1
  197. package/dist/parameter/Parameter.d.ts.map +1 -1
  198. package/dist/parameter/Parameter.js +2 -0
  199. package/dist/parameter/Parameter.js.map +1 -1
  200. package/dist/parameter/index.d.ts.map +1 -1
  201. package/dist/parameter/index.js +2 -0
  202. package/dist/parameter/index.js.map +1 -1
  203. package/dist/variable/Variable.d.ts.map +1 -1
  204. package/dist/variable/Variable.js +2 -0
  205. package/dist/variable/Variable.js.map +1 -1
  206. package/dist/variable/index.d.ts.map +1 -1
  207. package/dist/variable/index.js +2 -3
  208. package/dist/variable/index.js.map +1 -1
  209. package/dist/variable/operations.d.ts.map +1 -1
  210. package/dist/variable/operations.js +2 -0
  211. package/dist/variable/operations.js.map +1 -1
  212. package/dist/workflow/Workflow.d.ts.map +1 -1
  213. package/dist/workflow/Workflow.js +2 -0
  214. package/dist/workflow/Workflow.js.map +1 -1
  215. package/dist/workflow/index.d.ts.map +1 -1
  216. package/dist/workflow/index.js +2 -0
  217. package/dist/workflow/index.js.map +1 -1
  218. package/dist/workflow/serialization.d.ts.map +1 -1
  219. package/dist/workflow/serialization.js +2 -4
  220. package/dist/workflow/serialization.js.map +1 -1
  221. package/package.json +2 -2
  222. package/src/api/deployment.ts +74 -0
  223. package/src/api/engine.ts +744 -0
  224. package/src/api/index.ts +29 -11
  225. package/src/api/workflow.ts +25 -9
  226. package/src/channel/Channel.ts +14 -11
  227. package/src/channel/ChannelDefinition.ts +101 -76
  228. package/src/channel/index.ts +9 -6
  229. package/src/channel/serialization.ts +77 -68
  230. package/src/deploy/index.ts +17 -1
  231. package/src/deploy/inputs.ts +44 -0
  232. package/src/deploy/requirements.test.ts +64 -61
  233. package/src/deploy/requirements.ts +159 -41
  234. package/src/deploy/spec.test.ts +227 -0
  235. package/src/deploy/spec.ts +397 -0
  236. package/src/diagnostics/__fixtures__/diagnosticFixtures.ts +161 -158
  237. package/src/diagnostics/diagnostics.test.ts +881 -878
  238. package/src/diagnostics/diagnostics.ts +939 -936
  239. package/src/diagnostics/index.ts +14 -11
  240. package/src/edge/Edge.ts +26 -23
  241. package/src/edge/EdgeDefinition.ts +48 -45
  242. package/src/edge/EdgeType.ts +22 -19
  243. package/src/edge/index.ts +11 -8
  244. package/src/edge/serialization.ts +86 -83
  245. package/src/expression/index.ts +7 -4
  246. package/src/expression/parser.ts +365 -362
  247. package/src/expression/types.ts +33 -30
  248. package/src/function/FunctionDeclaration.ts +57 -54
  249. package/src/function/index.ts +6 -3
  250. package/src/function/serialization.ts +43 -40
  251. package/src/globals.d.ts +12 -9
  252. package/src/id/index.ts +11 -8
  253. package/src/index.ts +25 -22
  254. package/src/memory/Memory.ts +18 -15
  255. package/src/memory/MemoryDefinition.ts +19 -16
  256. package/src/memory/MemoryFileDefinition.ts +40 -37
  257. package/src/memory/MemoryRegistry.ts +38 -35
  258. package/src/memory/VectorDatabaseDefinition.ts +24 -21
  259. package/src/memory/index.ts +11 -8
  260. package/src/memory/serialization.ts +50 -47
  261. package/src/migration/index.ts +7 -4
  262. package/src/migration/migrate.test.ts +47 -44
  263. package/src/migration/migrate.ts +61 -58
  264. package/src/migration/migrations.ts +27 -24
  265. package/src/migration/version.ts +12 -9
  266. package/src/model/LLMModelDefinition.ts +15 -12
  267. package/src/model/Model.ts +42 -39
  268. package/src/model/ModelDefinition.ts +18 -15
  269. package/src/model/ModelRegistry.ts +36 -33
  270. package/src/model/index.ts +10 -7
  271. package/src/model/serialization.ts +33 -30
  272. package/src/node/AgentNode.ts +85 -82
  273. package/src/node/DataNode.ts +44 -41
  274. package/src/node/FunctionNode.ts +79 -76
  275. package/src/node/InputNode.ts +188 -185
  276. package/src/node/LogicNode.ts +36 -33
  277. package/src/node/MqttNode.ts +130 -127
  278. package/src/node/Node.ts +64 -61
  279. package/src/node/NodeDefinition.ts +40 -37
  280. package/src/node/NodeRegistry.ts +88 -85
  281. package/src/node/OutputNode.ts +90 -87
  282. package/src/node/ToolNode.ts +35 -32
  283. package/src/node/TriggerNode.ts +275 -272
  284. package/src/node/constants.ts +19 -16
  285. package/src/node/index.ts +29 -26
  286. package/src/node/methods.ts +281 -278
  287. package/src/node/serialization.test.ts +51 -0
  288. package/src/node/serialization.ts +565 -544
  289. package/src/parameter/OutputParameter.ts +71 -68
  290. package/src/parameter/Parameter.ts +246 -243
  291. package/src/parameter/index.ts +36 -33
  292. package/src/variable/Variable.ts +13 -10
  293. package/src/variable/index.ts +19 -16
  294. package/src/variable/operations.ts +109 -106
  295. package/src/workflow/Workflow.ts +44 -41
  296. package/src/workflow/index.ts +6 -3
  297. package/src/workflow/serialization.test.ts +243 -240
  298. package/src/workflow/serialization.ts +245 -242
@@ -1,127 +1,130 @@
1
- import { NodeBase } from "./Node";
2
- import type { Expression } from "../api";
3
- import { OutputBinding } from "../parameter";
4
- import { NodeCategory, NodeTag } from "./constants";
5
- import { NodeDefinition } from "./NodeDefinition";
6
-
7
- // MQTT Publish - publishes a single value to an MQTT topic
8
- export interface MqttPublishNode extends NodeBase {
9
- type: "MqttPublish";
10
- arguments: {
11
- channelReference: string;
12
- dataType: "int" | "float" | "bool" | "string";
13
- value: Expression;
14
- qos: "0" | "1" | "2";
15
- retain: boolean;
16
- };
17
- }
18
-
19
- // On MQTT Message - fires when a message is received on a subscribed topic
20
- export interface OnMqttMessageNode extends NodeBase {
21
- type: "OnMqttMessage";
22
- arguments: {
23
- channelReference: string;
24
- dataType: "int" | "float" | "bool" | "string";
25
- output: OutputBinding;
26
- };
27
- }
28
-
29
- export type MqttNodeType = "MqttPublish" | "OnMqttMessage";
30
- export type MqttNode = MqttPublishNode | OnMqttMessageNode;
31
-
32
- // Node Definitions
33
-
34
- export const MqttPublishNodeDefinition: NodeDefinition = {
35
- type: "MqttPublish",
36
- label: "MQTT Publish",
37
- category: NodeCategory.Output,
38
- tags: [NodeTag.Network],
39
- description: "Publish a value to an MQTT topic",
40
- parameters: [
41
- {
42
- id: "channelReference",
43
- label: "Channel",
44
- description: "MQTT channel to publish through",
45
- type: "channelSelect",
46
- channelType: ["MQTT"],
47
- },
48
- {
49
- id: "dataType",
50
- label: "Data Type",
51
- description: "Data type of the value to publish",
52
- type: "selection",
53
- options: [
54
- { value: "int", label: "Integer" },
55
- { value: "float", label: "Float" },
56
- { value: "bool", label: "Boolean" },
57
- { value: "string", label: "String" },
58
- ],
59
- default: "string",
60
- },
61
- {
62
- id: "value",
63
- label: "Value",
64
- description: "Value to publish",
65
- type: "expression",
66
- expressionType: (args) => (args as MqttPublishNode["arguments"]).dataType,
67
- default: { expression: "", references: [], dataType: "string" },
68
- },
69
- {
70
- id: "qos",
71
- label: "QoS",
72
- description: "Quality of Service level",
73
- type: "selection",
74
- options: [
75
- { value: "0", label: "0 - At most once" },
76
- { value: "1", label: "1 - At least once" },
77
- { value: "2", label: "2 - Exactly once" },
78
- ],
79
- default: "0",
80
- },
81
- {
82
- id: "retain",
83
- label: "Retain",
84
- description: "Whether the broker should retain the message",
85
- type: "bool",
86
- default: false,
87
- },
88
- ],
89
- };
90
-
91
- export const OnMqttMessageNodeDefinition: NodeDefinition = {
92
- type: "OnMqttMessage",
93
- label: "On MQTT Message",
94
- category: NodeCategory.Trigger,
95
- tags: [NodeTag.Network],
96
- description: "Fires when a message is received on a subscribed MQTT topic",
97
- outputs: [
98
- {
99
- id: "output",
100
- label: "Message Value",
101
- type: "static",
102
- dataType: (args) => (args as OnMqttMessageNode["arguments"]).dataType,
103
- },
104
- ],
105
- parameters: [
106
- {
107
- id: "channelReference",
108
- label: "Channel",
109
- description: "MQTT channel to subscribe through",
110
- type: "channelSelect",
111
- channelType: ["MQTT"],
112
- },
113
- {
114
- id: "dataType",
115
- label: "Data Type",
116
- description: "Expected data type of the received message value",
117
- type: "selection",
118
- options: [
119
- { value: "int", label: "Integer" },
120
- { value: "float", label: "Float" },
121
- { value: "bool", label: "Boolean" },
122
- { value: "string", label: "String" },
123
- ],
124
- default: "string",
125
- },
126
- ],
127
- };
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import { NodeBase } from "./Node";
5
+ import type { Expression } from "../api";
6
+ import { OutputBinding } from "../parameter";
7
+ import { NodeCategory, NodeTag } from "./constants";
8
+ import { NodeDefinition } from "./NodeDefinition";
9
+
10
+ // MQTT Publish - publishes a single value to an MQTT topic
11
+ export interface MqttPublishNode extends NodeBase {
12
+ type: "MqttPublish";
13
+ arguments: {
14
+ channelReference: string;
15
+ dataType: "int" | "float" | "bool" | "string";
16
+ value: Expression;
17
+ qos: "0" | "1" | "2";
18
+ retain: boolean;
19
+ };
20
+ }
21
+
22
+ // On MQTT Message - fires when a message is received on a subscribed topic
23
+ export interface OnMqttMessageNode extends NodeBase {
24
+ type: "OnMqttMessage";
25
+ arguments: {
26
+ channelReference: string;
27
+ dataType: "int" | "float" | "bool" | "string";
28
+ output: OutputBinding;
29
+ };
30
+ }
31
+
32
+ export type MqttNodeType = "MqttPublish" | "OnMqttMessage";
33
+ export type MqttNode = MqttPublishNode | OnMqttMessageNode;
34
+
35
+ // Node Definitions
36
+
37
+ export const MqttPublishNodeDefinition: NodeDefinition = {
38
+ type: "MqttPublish",
39
+ label: "MQTT Publish",
40
+ category: NodeCategory.Output,
41
+ tags: [NodeTag.Network],
42
+ description: "Publish a value to an MQTT topic",
43
+ parameters: [
44
+ {
45
+ id: "channelReference",
46
+ label: "Channel",
47
+ description: "MQTT channel to publish through",
48
+ type: "channelSelect",
49
+ channelType: ["MQTT"],
50
+ },
51
+ {
52
+ id: "dataType",
53
+ label: "Data Type",
54
+ description: "Data type of the value to publish",
55
+ type: "selection",
56
+ options: [
57
+ { value: "int", label: "Integer" },
58
+ { value: "float", label: "Float" },
59
+ { value: "bool", label: "Boolean" },
60
+ { value: "string", label: "String" },
61
+ ],
62
+ default: "string",
63
+ },
64
+ {
65
+ id: "value",
66
+ label: "Value",
67
+ description: "Value to publish",
68
+ type: "expression",
69
+ expressionType: (args) => (args as MqttPublishNode["arguments"]).dataType,
70
+ default: { expression: "", references: [], dataType: "string" },
71
+ },
72
+ {
73
+ id: "qos",
74
+ label: "QoS",
75
+ description: "Quality of Service level",
76
+ type: "selection",
77
+ options: [
78
+ { value: "0", label: "0 - At most once" },
79
+ { value: "1", label: "1 - At least once" },
80
+ { value: "2", label: "2 - Exactly once" },
81
+ ],
82
+ default: "0",
83
+ },
84
+ {
85
+ id: "retain",
86
+ label: "Retain",
87
+ description: "Whether the broker should retain the message",
88
+ type: "bool",
89
+ default: false,
90
+ },
91
+ ],
92
+ };
93
+
94
+ export const OnMqttMessageNodeDefinition: NodeDefinition = {
95
+ type: "OnMqttMessage",
96
+ label: "On MQTT Message",
97
+ category: NodeCategory.Trigger,
98
+ tags: [NodeTag.Network],
99
+ description: "Fires when a message is received on a subscribed MQTT topic",
100
+ outputs: [
101
+ {
102
+ id: "output",
103
+ label: "Message Value",
104
+ type: "static",
105
+ dataType: (args) => (args as OnMqttMessageNode["arguments"]).dataType,
106
+ },
107
+ ],
108
+ parameters: [
109
+ {
110
+ id: "channelReference",
111
+ label: "Channel",
112
+ description: "MQTT channel to subscribe through",
113
+ type: "channelSelect",
114
+ channelType: ["MQTT"],
115
+ },
116
+ {
117
+ id: "dataType",
118
+ label: "Data Type",
119
+ description: "Expected data type of the received message value",
120
+ type: "selection",
121
+ options: [
122
+ { value: "int", label: "Integer" },
123
+ { value: "float", label: "Float" },
124
+ { value: "bool", label: "Boolean" },
125
+ { value: "string", label: "String" },
126
+ ],
127
+ default: "string",
128
+ },
129
+ ],
130
+ };
package/src/node/Node.ts CHANGED
@@ -1,61 +1,64 @@
1
- // Domain Node — the base shape every node variant builds on. NodeBase is the
2
- // generic, untyped-parameters shape used wherever a node is handled generically
3
- // (e.g. React Flow nodes); NodeData is the discriminated union over the
4
- // per-variant interfaces (InputNode, AgentNode, …) for strongly-typed work.
5
- // Mirrors how channel/memory/model keep their base shape in a same-named file and
6
- // leave index.ts as a pure barrel. The per-variant interfaces import NodeBase
7
- // from here directly, not via the barrel.
8
-
9
- import type { DataType } from "../api";
10
- import { InputNode, InputNodeType } from "./InputNode";
11
- import { OutputNode, OutputNodeType } from "./OutputNode";
12
- import { AgentNode, AgentNodeType } from "./AgentNode";
13
- import { LogicNode, LogicNodeType } from "./LogicNode";
14
- import { DataNode, DataNodeType } from "./DataNode";
15
- import { TriggerNode, TriggerNodeType } from "./TriggerNode";
16
- import { ToolNode, ToolNodeType } from "./ToolNode";
17
- import { FunctionCallNode, FunctionCallNodeType } from "./FunctionNode";
18
- import { MqttNode, MqttNodeType } from "./MqttNode";
19
-
20
- export type NodeOutput = { name: string; dataType: DataType };
21
- export type NodeType =
22
- | InputNodeType
23
- | OutputNodeType
24
- | AgentNodeType
25
- | LogicNodeType
26
- | DataNodeType
27
- | TriggerNodeType
28
- | ToolNodeType
29
- | FunctionCallNodeType
30
- | MqttNodeType;
31
-
32
- /**
33
- * NodeData represents the runtime data for a node in the workflow builder.
34
- * It is a union type of all specific node types, each with their own typed parameters.
35
- * Use this type when you need strong typing for a specific node.
36
- */
37
- export type NodeData = InputNode | OutputNode | AgentNode | LogicNode | DataNode | TriggerNode | ToolNode | FunctionCallNode | MqttNode;
38
-
39
- /**
40
- * Full domain node entity held on a {@link Canvas}: the {@link NodeData}
41
- * payload plus its canvas layout position, flattened. id/type/arguments/label
42
- * come from NodeData; only `position` is added. The editor projects this into
43
- * a React Flow node (adding the display type) at its store boundary.
44
- */
45
- export type Node = NodeData & { position: { x: number; y: number } };
46
-
47
- /**
48
- * NodeBase is a generic interface for all node instances.
49
- * It uses an untyped parameters record to allow generic parameter handling (e.g., in React Flow nodes).
50
- * Narrow to NodeData for specific node operations that require typed parameters.
51
- *
52
- * Per-output bindings (emit/assign/discard) live as flat entries inside `arguments`,
53
- * keyed by the output id same namespace as parameter values. List output entries
54
- * (e.g. AgentNode's `outputDeclarations`) bundle their binding alongside their variable
55
- * declaration as OutputDeclaration[].
56
- */
57
- export interface NodeBase extends Record<string, unknown> {
58
- id: string; // Same as the React Flow node ID
59
- type: NodeType; // Node discriminator
60
- label?: string; // User-editable display label (falls back to nodeDefinition.label)
61
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ // Domain Node the base shape every node variant builds on. NodeBase is the
5
+ // generic, untyped-parameters shape used wherever a node is handled generically
6
+ // (e.g. React Flow nodes); NodeData is the discriminated union over the
7
+ // per-variant interfaces (InputNode, AgentNode, …) for strongly-typed work.
8
+ // Mirrors how channel/memory/model keep their base shape in a same-named file and
9
+ // leave index.ts as a pure barrel. The per-variant interfaces import NodeBase
10
+ // from here directly, not via the barrel.
11
+
12
+ import type { DataType } from "../api";
13
+ import { InputNode, InputNodeType } from "./InputNode";
14
+ import { OutputNode, OutputNodeType } from "./OutputNode";
15
+ import { AgentNode, AgentNodeType } from "./AgentNode";
16
+ import { LogicNode, LogicNodeType } from "./LogicNode";
17
+ import { DataNode, DataNodeType } from "./DataNode";
18
+ import { TriggerNode, TriggerNodeType } from "./TriggerNode";
19
+ import { ToolNode, ToolNodeType } from "./ToolNode";
20
+ import { FunctionCallNode, FunctionCallNodeType } from "./FunctionNode";
21
+ import { MqttNode, MqttNodeType } from "./MqttNode";
22
+
23
+ export type NodeOutput = { name: string; dataType: DataType };
24
+ export type NodeType =
25
+ | InputNodeType
26
+ | OutputNodeType
27
+ | AgentNodeType
28
+ | LogicNodeType
29
+ | DataNodeType
30
+ | TriggerNodeType
31
+ | ToolNodeType
32
+ | FunctionCallNodeType
33
+ | MqttNodeType;
34
+
35
+ /**
36
+ * NodeData represents the runtime data for a node in the workflow builder.
37
+ * It is a union type of all specific node types, each with their own typed parameters.
38
+ * Use this type when you need strong typing for a specific node.
39
+ */
40
+ export type NodeData = InputNode | OutputNode | AgentNode | LogicNode | DataNode | TriggerNode | ToolNode | FunctionCallNode | MqttNode;
41
+
42
+ /**
43
+ * Full domain node entity held on a {@link Canvas}: the {@link NodeData}
44
+ * payload plus its canvas layout position, flattened. id/type/arguments/label
45
+ * come from NodeData; only `position` is added. The editor projects this into
46
+ * a React Flow node (adding the display type) at its store boundary.
47
+ */
48
+ export type Node = NodeData & { position: { x: number; y: number } };
49
+
50
+ /**
51
+ * NodeBase is a generic interface for all node instances.
52
+ * It uses an untyped parameters record to allow generic parameter handling (e.g., in React Flow nodes).
53
+ * Narrow to NodeData for specific node operations that require typed parameters.
54
+ *
55
+ * Per-output bindings (emit/assign/discard) live as flat entries inside `arguments`,
56
+ * keyed by the output id — same namespace as parameter values. List output entries
57
+ * (e.g. AgentNode's `outputDeclarations`) bundle their binding alongside their variable
58
+ * declaration as OutputDeclaration[].
59
+ */
60
+ export interface NodeBase extends Record<string, unknown> {
61
+ id: string; // Same as the React Flow node ID
62
+ type: NodeType; // Node discriminator
63
+ label?: string; // User-editable display label (falls back to nodeDefinition.label)
64
+ }
@@ -1,37 +1,40 @@
1
- import { NodeType } from "./Node";
2
- import { NodeCategory, NodeTag } from "./constants";
3
- import { OutputParameter, Parameter } from "../parameter";
4
-
5
- /**
6
- * NodeDefinition describes static class-level node metadata.
7
- * Methods (getPorts) are optional and take no arguments for static port definitions.
8
- * Instance-dependent behavior lives in NodeBehavior.ts instead.
9
- */
10
- export interface NodeDefinition {
11
- type: NodeType; // Node discriminator
12
- label: string; // Human-readable, displayed name
13
- category: NodeCategory; // Category for grouping (e.g., 'Input', 'Output', 'Logic')
14
- description: string; // Description of what the node does
15
- parameters: Parameter[]; // Parameter definitions for the node.
16
- outputs?: OutputParameter[]; // Declarative output definitions — consumed by getNodeAvailableOutput() to compute a node's outputs
17
- tags?: NodeTag[]; // Cross-cutting subsystem labels (Network, Pin, Serial, ...)
18
- isUnremovable?: boolean; // Whether the node cannot be added or removed by a user
19
- isSingleton?: boolean; // Whether only one instance of this node can exist in a canvas
20
- canBranch?: boolean; // Whether the control output port may fan out to multiple branches (tool output ports are always multi-target)
21
- }
22
-
23
- // =============================================================================
24
- // PORT DEFINITIONS
25
- // =============================================================================
26
-
27
- // Port represents a connectable port of a node
28
- export interface Port {
29
- id: string;
30
- type: "control" | "tool";
31
- label?: string;
32
- }
33
-
34
- export interface PortDefinitions {
35
- input: Port[];
36
- output: Port[];
37
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import { NodeType } from "./Node";
5
+ import { NodeCategory, NodeTag } from "./constants";
6
+ import { OutputParameter, Parameter } from "../parameter";
7
+
8
+ /**
9
+ * NodeDefinition describes static class-level node metadata.
10
+ * Methods (getPorts) are optional and take no arguments for static port definitions.
11
+ * Instance-dependent behavior lives in NodeBehavior.ts instead.
12
+ */
13
+ export interface NodeDefinition {
14
+ type: NodeType; // Node discriminator
15
+ label: string; // Human-readable, displayed name
16
+ category: NodeCategory; // Category for grouping (e.g., 'Input', 'Output', 'Logic')
17
+ description: string; // Description of what the node does
18
+ parameters: Parameter[]; // Parameter definitions for the node.
19
+ outputs?: OutputParameter[]; // Declarative output definitions consumed by getNodeAvailableOutput() to compute a node's outputs
20
+ tags?: NodeTag[]; // Cross-cutting subsystem labels (Network, Pin, Serial, ...)
21
+ isUnremovable?: boolean; // Whether the node cannot be added or removed by a user
22
+ isSingleton?: boolean; // Whether only one instance of this node can exist in a canvas
23
+ canBranch?: boolean; // Whether the control output port may fan out to multiple branches (tool output ports are always multi-target)
24
+ }
25
+
26
+ // =============================================================================
27
+ // PORT DEFINITIONS
28
+ // =============================================================================
29
+
30
+ // Port represents a connectable port of a node
31
+ export interface Port {
32
+ id: string;
33
+ type: "control" | "tool";
34
+ label?: string;
35
+ }
36
+
37
+ export interface PortDefinitions {
38
+ input: Port[];
39
+ output: Port[];
40
+ }