@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,272 +1,275 @@
1
- import { NodeBase } from "./Node";
2
- import type { Reference } from "../api";
3
- import { OutputBinding } from "../parameter";
4
- import { NodeCategory, NodeTag } from "./constants";
5
- import { NodeDefinition } from "./NodeDefinition";
6
-
7
- // On Function Call Trigger - fires when a user-defined function is called
8
- export interface OnFunctionCallNode extends NodeBase {
9
- type: "OnFunctionCall";
10
- arguments: Record<string, never>;
11
- }
12
-
13
- // Delay Node - pauses execution for a specified duration
14
- export interface DelayNode extends NodeBase {
15
- type: "Delay";
16
- arguments: {
17
- delayMs: number;
18
- };
19
- }
20
-
21
- // Ticker Trigger - fires repeatedly at a specified interval
22
- export interface TickerNode extends NodeBase {
23
- type: "Ticker";
24
- arguments: {
25
- intervalValue: number | undefined;
26
- intervalUnit: "milliseconds" | "seconds" | "minutes" | "hours";
27
- };
28
- }
29
-
30
- // Alarm Trigger - fires at a scheduled time on selected days
31
- export interface AlarmNode extends NodeBase {
32
- type: "Alarm";
33
- arguments: {
34
- time: string;
35
- days: string[];
36
- };
37
- }
38
-
39
- // On Startup Trigger - fires once when device powers on
40
- export interface OnStartupNode extends NodeBase {
41
- type: "OnStartup";
42
- arguments: Record<string, never>;
43
- }
44
-
45
- // On Pin Edge Trigger - fires when a digital pin transitions
46
- export interface OnPinEdgeNode extends NodeBase {
47
- type: "OnPinEdge";
48
- arguments: {
49
- pinReference: string | undefined;
50
- edge: "rising" | "falling" | "both";
51
- };
52
- }
53
-
54
- // On Serial Receive Trigger - fires when serial data arrives
55
- export interface OnSerialReceiveNode extends NodeBase {
56
- type: "OnSerialReceive";
57
- arguments: {
58
- portReference: string | undefined;
59
- output: OutputBinding;
60
- };
61
- }
62
-
63
- // On Threshold Trigger - fires when a numeric variable crosses a threshold
64
- export interface OnThresholdNode extends NodeBase {
65
- type: "OnThreshold";
66
- arguments: {
67
- variable: Reference | undefined;
68
- threshold: number | undefined;
69
- direction: "rising" | "falling" | "both";
70
- deadband: number | undefined;
71
- output: OutputBinding;
72
- };
73
- }
74
-
75
- export type TriggerNodeType =
76
- | "OnFunctionCall"
77
- | "Delay"
78
- | "Ticker"
79
- | "Alarm"
80
- | "OnStartup"
81
- | "OnPinEdge"
82
- | "OnSerialReceive"
83
- | "OnThreshold";
84
- export type TriggerNode =
85
- | OnFunctionCallNode
86
- | DelayNode
87
- | TickerNode
88
- | AlarmNode
89
- | OnStartupNode
90
- | OnPinEdgeNode
91
- | OnSerialReceiveNode
92
- | OnThresholdNode;
93
-
94
- // Node Definitions
95
-
96
- export const OnFunctionCallNodeDefinition: NodeDefinition = {
97
- type: "OnFunctionCall",
98
- label: "On Function Call",
99
- category: NodeCategory.Trigger,
100
- description: "Fires when this function is invoked by a Function Call node",
101
- parameters: [],
102
- isUnremovable: true, // Cannot be added or removed by user
103
- isSingleton: true,
104
- };
105
-
106
- export const DelayNodeDefinition: NodeDefinition = {
107
- type: "Delay",
108
- label: "Delay",
109
- category: NodeCategory.Trigger,
110
- description:
111
- "Pauses execution for a specified duration and triggers once the delay is complete. During this pause other node chains may run.",
112
- parameters: [
113
- {
114
- id: "delayMs",
115
- label: "Delay (ms)",
116
- description: "Time in milliseconds to pause execution",
117
- type: "int",
118
- default: 1000,
119
- },
120
- ],
121
- };
122
-
123
- export const TickerNodeDefinition: NodeDefinition = {
124
- type: "Ticker",
125
- label: "Ticker",
126
- category: NodeCategory.Trigger,
127
- description: "Fires repeatedly at a specified interval",
128
- parameters: [
129
- {
130
- id: "intervalValue",
131
- label: "Interval",
132
- description: "How many units between ticks",
133
- type: "int",
134
- default: 1,
135
- },
136
- {
137
- id: "intervalUnit",
138
- label: "Unit",
139
- description: "Time unit for the interval",
140
- type: "selection",
141
- options: [
142
- { value: "milliseconds", label: "Milliseconds" },
143
- { value: "seconds", label: "Seconds" },
144
- { value: "minutes", label: "Minutes" },
145
- { value: "hours", label: "Hours" },
146
- ],
147
- default: "seconds",
148
- },
149
- ],
150
- };
151
-
152
- export const AlarmNodeDefinition: NodeDefinition = {
153
- type: "Alarm",
154
- label: "Alarm",
155
- category: NodeCategory.Trigger,
156
- description: "Fires at a scheduled time on selected days of the week",
157
- parameters: [
158
- {
159
- id: "time",
160
- label: "Time",
161
- description: "Time of day to fire (24h format)",
162
- type: "time",
163
- default: "12:00",
164
- },
165
- {
166
- id: "days",
167
- label: "Days",
168
- description: "Days of the week to fire on (empty = every day)",
169
- type: "weekdays",
170
- default: [],
171
- },
172
- ],
173
- };
174
-
175
- export const OnStartupNodeDefinition: NodeDefinition = {
176
- type: "OnStartup",
177
- label: "On Startup",
178
- category: NodeCategory.Trigger,
179
- description: "Fires once when the device powers on",
180
- parameters: [],
181
- isSingleton: true,
182
- };
183
-
184
- export const OnPinEdgeNodeDefinition: NodeDefinition = {
185
- type: "OnPinEdge",
186
- label: "On Pin Edge",
187
- category: NodeCategory.Trigger,
188
- tags: [NodeTag.Pin],
189
- description: "Fires when a digital pin transitions",
190
- parameters: [
191
- {
192
- id: "pinReference",
193
- label: "Pin",
194
- description: "Digital pin to watch",
195
- type: "channelSelect",
196
- channelType: ["GPIOIN"],
197
- },
198
- {
199
- id: "edge",
200
- label: "Edge",
201
- description: "Edge transition that fires the trigger",
202
- type: "selection",
203
- options: [
204
- { value: "rising", label: "Rising" },
205
- { value: "falling", label: "Falling" },
206
- { value: "both", label: "Both" },
207
- ],
208
- default: "both",
209
- },
210
- ],
211
- };
212
-
213
- export const OnSerialReceiveNodeDefinition: NodeDefinition = {
214
- type: "OnSerialReceive",
215
- label: "On Serial Receive",
216
- category: NodeCategory.Trigger,
217
- tags: [NodeTag.Serial],
218
- description: "Fires when serial data arrives",
219
- outputs: [{ id: "output", label: "Serial Data", type: "static", dataType: "string" }],
220
- parameters: [
221
- {
222
- id: "portReference",
223
- label: "Port",
224
- description: "Serial port to listen on",
225
- type: "channelSelect",
226
- channelType: ["UART"],
227
- },
228
- ],
229
- };
230
-
231
- export const OnThresholdNodeDefinition: NodeDefinition = {
232
- type: "OnThreshold",
233
- label: "On Threshold",
234
- category: NodeCategory.Trigger,
235
- description: "Fires when a numeric variable crosses a threshold",
236
- outputs: [{ id: "output", label: "Triggering Value", type: "static", dataType: "float" }],
237
- parameters: [
238
- {
239
- id: "variable",
240
- label: "Variable",
241
- description: "Numeric variable to watch for threshold crossings",
242
- type: "variableSelect",
243
- },
244
- {
245
- id: "threshold",
246
- label: "Threshold",
247
- description: "Value the variable crosses to fire the trigger",
248
- type: "float",
249
- default: 0,
250
- },
251
- {
252
- id: "direction",
253
- label: "Direction",
254
- description: "Crossing direction to fire on",
255
- type: "selection",
256
- options: [
257
- { value: "rising", label: "Rising" },
258
- { value: "falling", label: "Falling" },
259
- { value: "both", label: "Both" },
260
- ],
261
- default: "both",
262
- },
263
- {
264
- id: "deadband",
265
- label: "Deadband",
266
- description: "Hysteresis band width around threshold (0 disables)",
267
- type: "float",
268
- default: 0,
269
- optional: true,
270
- },
271
- ],
272
- };
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import { NodeBase } from "./Node";
5
+ import type { Reference } from "../api";
6
+ import { OutputBinding } from "../parameter";
7
+ import { NodeCategory, NodeTag } from "./constants";
8
+ import { NodeDefinition } from "./NodeDefinition";
9
+
10
+ // On Function Call Trigger - fires when a user-defined function is called
11
+ export interface OnFunctionCallNode extends NodeBase {
12
+ type: "OnFunctionCall";
13
+ arguments: Record<string, never>;
14
+ }
15
+
16
+ // Delay Node - pauses execution for a specified duration
17
+ export interface DelayNode extends NodeBase {
18
+ type: "Delay";
19
+ arguments: {
20
+ delayMs: number;
21
+ };
22
+ }
23
+
24
+ // Ticker Trigger - fires repeatedly at a specified interval
25
+ export interface TickerNode extends NodeBase {
26
+ type: "Ticker";
27
+ arguments: {
28
+ intervalValue: number | undefined;
29
+ intervalUnit: "milliseconds" | "seconds" | "minutes" | "hours";
30
+ };
31
+ }
32
+
33
+ // Alarm Trigger - fires at a scheduled time on selected days
34
+ export interface AlarmNode extends NodeBase {
35
+ type: "Alarm";
36
+ arguments: {
37
+ time: string;
38
+ days: string[];
39
+ };
40
+ }
41
+
42
+ // On Startup Trigger - fires once when device powers on
43
+ export interface OnStartupNode extends NodeBase {
44
+ type: "OnStartup";
45
+ arguments: Record<string, never>;
46
+ }
47
+
48
+ // On Pin Edge Trigger - fires when a digital pin transitions
49
+ export interface OnPinEdgeNode extends NodeBase {
50
+ type: "OnPinEdge";
51
+ arguments: {
52
+ pinReference: string | undefined;
53
+ edge: "rising" | "falling" | "both";
54
+ };
55
+ }
56
+
57
+ // On Serial Receive Trigger - fires when serial data arrives
58
+ export interface OnSerialReceiveNode extends NodeBase {
59
+ type: "OnSerialReceive";
60
+ arguments: {
61
+ portReference: string | undefined;
62
+ output: OutputBinding;
63
+ };
64
+ }
65
+
66
+ // On Threshold Trigger - fires when a numeric variable crosses a threshold
67
+ export interface OnThresholdNode extends NodeBase {
68
+ type: "OnThreshold";
69
+ arguments: {
70
+ variable: Reference | undefined;
71
+ threshold: number | undefined;
72
+ direction: "rising" | "falling" | "both";
73
+ deadband: number | undefined;
74
+ output: OutputBinding;
75
+ };
76
+ }
77
+
78
+ export type TriggerNodeType =
79
+ | "OnFunctionCall"
80
+ | "Delay"
81
+ | "Ticker"
82
+ | "Alarm"
83
+ | "OnStartup"
84
+ | "OnPinEdge"
85
+ | "OnSerialReceive"
86
+ | "OnThreshold";
87
+ export type TriggerNode =
88
+ | OnFunctionCallNode
89
+ | DelayNode
90
+ | TickerNode
91
+ | AlarmNode
92
+ | OnStartupNode
93
+ | OnPinEdgeNode
94
+ | OnSerialReceiveNode
95
+ | OnThresholdNode;
96
+
97
+ // Node Definitions
98
+
99
+ export const OnFunctionCallNodeDefinition: NodeDefinition = {
100
+ type: "OnFunctionCall",
101
+ label: "On Function Call",
102
+ category: NodeCategory.Trigger,
103
+ description: "Fires when this function is invoked by a Function Call node",
104
+ parameters: [],
105
+ isUnremovable: true, // Cannot be added or removed by user
106
+ isSingleton: true,
107
+ };
108
+
109
+ export const DelayNodeDefinition: NodeDefinition = {
110
+ type: "Delay",
111
+ label: "Delay",
112
+ category: NodeCategory.Trigger,
113
+ description:
114
+ "Pauses execution for a specified duration and triggers once the delay is complete. During this pause other node chains may run.",
115
+ parameters: [
116
+ {
117
+ id: "delayMs",
118
+ label: "Delay (ms)",
119
+ description: "Time in milliseconds to pause execution",
120
+ type: "int",
121
+ default: 1000,
122
+ },
123
+ ],
124
+ };
125
+
126
+ export const TickerNodeDefinition: NodeDefinition = {
127
+ type: "Ticker",
128
+ label: "Ticker",
129
+ category: NodeCategory.Trigger,
130
+ description: "Fires repeatedly at a specified interval",
131
+ parameters: [
132
+ {
133
+ id: "intervalValue",
134
+ label: "Interval",
135
+ description: "How many units between ticks",
136
+ type: "int",
137
+ default: 1,
138
+ },
139
+ {
140
+ id: "intervalUnit",
141
+ label: "Unit",
142
+ description: "Time unit for the interval",
143
+ type: "selection",
144
+ options: [
145
+ { value: "milliseconds", label: "Milliseconds" },
146
+ { value: "seconds", label: "Seconds" },
147
+ { value: "minutes", label: "Minutes" },
148
+ { value: "hours", label: "Hours" },
149
+ ],
150
+ default: "seconds",
151
+ },
152
+ ],
153
+ };
154
+
155
+ export const AlarmNodeDefinition: NodeDefinition = {
156
+ type: "Alarm",
157
+ label: "Alarm",
158
+ category: NodeCategory.Trigger,
159
+ description: "Fires at a scheduled time on selected days of the week",
160
+ parameters: [
161
+ {
162
+ id: "time",
163
+ label: "Time",
164
+ description: "Time of day to fire (24h format)",
165
+ type: "time",
166
+ default: "12:00",
167
+ },
168
+ {
169
+ id: "days",
170
+ label: "Days",
171
+ description: "Days of the week to fire on (empty = every day)",
172
+ type: "weekdays",
173
+ default: [],
174
+ },
175
+ ],
176
+ };
177
+
178
+ export const OnStartupNodeDefinition: NodeDefinition = {
179
+ type: "OnStartup",
180
+ label: "On Startup",
181
+ category: NodeCategory.Trigger,
182
+ description: "Fires once when the device powers on",
183
+ parameters: [],
184
+ isSingleton: true,
185
+ };
186
+
187
+ export const OnPinEdgeNodeDefinition: NodeDefinition = {
188
+ type: "OnPinEdge",
189
+ label: "On Pin Edge",
190
+ category: NodeCategory.Trigger,
191
+ tags: [NodeTag.Pin],
192
+ description: "Fires when a digital pin transitions",
193
+ parameters: [
194
+ {
195
+ id: "pinReference",
196
+ label: "Pin",
197
+ description: "Digital pin to watch",
198
+ type: "channelSelect",
199
+ channelType: ["GPIOIN"],
200
+ },
201
+ {
202
+ id: "edge",
203
+ label: "Edge",
204
+ description: "Edge transition that fires the trigger",
205
+ type: "selection",
206
+ options: [
207
+ { value: "rising", label: "Rising" },
208
+ { value: "falling", label: "Falling" },
209
+ { value: "both", label: "Both" },
210
+ ],
211
+ default: "both",
212
+ },
213
+ ],
214
+ };
215
+
216
+ export const OnSerialReceiveNodeDefinition: NodeDefinition = {
217
+ type: "OnSerialReceive",
218
+ label: "On Serial Receive",
219
+ category: NodeCategory.Trigger,
220
+ tags: [NodeTag.Serial],
221
+ description: "Fires when serial data arrives",
222
+ outputs: [{ id: "output", label: "Serial Data", type: "static", dataType: "string" }],
223
+ parameters: [
224
+ {
225
+ id: "portReference",
226
+ label: "Port",
227
+ description: "Serial port to listen on",
228
+ type: "channelSelect",
229
+ channelType: ["UART"],
230
+ },
231
+ ],
232
+ };
233
+
234
+ export const OnThresholdNodeDefinition: NodeDefinition = {
235
+ type: "OnThreshold",
236
+ label: "On Threshold",
237
+ category: NodeCategory.Trigger,
238
+ description: "Fires when a numeric variable crosses a threshold",
239
+ outputs: [{ id: "output", label: "Triggering Value", type: "static", dataType: "float" }],
240
+ parameters: [
241
+ {
242
+ id: "variable",
243
+ label: "Variable",
244
+ description: "Numeric variable to watch for threshold crossings",
245
+ type: "variableSelect",
246
+ },
247
+ {
248
+ id: "threshold",
249
+ label: "Threshold",
250
+ description: "Value the variable crosses to fire the trigger",
251
+ type: "float",
252
+ default: 0,
253
+ },
254
+ {
255
+ id: "direction",
256
+ label: "Direction",
257
+ description: "Crossing direction to fire on",
258
+ type: "selection",
259
+ options: [
260
+ { value: "rising", label: "Rising" },
261
+ { value: "falling", label: "Falling" },
262
+ { value: "both", label: "Both" },
263
+ ],
264
+ default: "both",
265
+ },
266
+ {
267
+ id: "deadband",
268
+ label: "Deadband",
269
+ description: "Hysteresis band width around threshold (0 disables)",
270
+ type: "float",
271
+ default: 0,
272
+ optional: true,
273
+ },
274
+ ],
275
+ };
@@ -1,16 +1,19 @@
1
- export enum NodeCategory {
2
- Input = "Input",
3
- Output = "Output",
4
- Logic = "Logic",
5
- Data = "Data",
6
- Trigger = "Trigger",
7
- Tool = "Tool",
8
- AI = "AI",
9
- Function = "Function",
10
- }
11
-
12
- export enum NodeTag {
13
- Network = "Network",
14
- Pin = "Pin",
15
- Serial = "Serial",
16
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ export enum NodeCategory {
5
+ Input = "Input",
6
+ Output = "Output",
7
+ Logic = "Logic",
8
+ Data = "Data",
9
+ Trigger = "Trigger",
10
+ Tool = "Tool",
11
+ AI = "AI",
12
+ Function = "Function",
13
+ }
14
+
15
+ export enum NodeTag {
16
+ Network = "Network",
17
+ Pin = "Pin",
18
+ Serial = "Serial",
19
+ }
package/src/node/index.ts CHANGED
@@ -1,26 +1,29 @@
1
- // Base domain node types
2
- export type {
3
- NodeOutput,
4
- NodeType,
5
- NodeData,
6
- Node,
7
- NodeBase,
8
- } from "./Node";
9
-
10
- // Constants & registry
11
- export { NodeCategory, NodeTag } from "./constants";
12
- export { NodeRegistry } from "./NodeRegistry";
13
- export type { NodeDefinition, Port, PortDefinitions } from "./NodeDefinition";
14
- export type { OutputParameter, StaticOutput, OutputList, OutputBinding, OutputDeclaration } from "../parameter";
15
-
16
- // NodeMethods read helpers over a NodeData
17
- export { getPorts, getArguments, getNodeOutput, getNodeAvailableOutput, getOutputBinding, getInput, isNodeUsedAsTool } from "./methods";
18
- export type { ExternalInput } from "./methods";
19
-
20
- // FunctionCall special node whose definition is built from FunctionInfo
21
- export type { FunctionCallNode, FunctionCallNodeType, FunctionNodeDefinition } from "./FunctionNode";
22
- export { buildFunctionNodeDef } from "./FunctionNode";
23
-
24
- // Serialization domain Node <-> api
25
- export { serialize, deserialize } from "./serialization";
26
- export type { ApiNode } from "./serialization";
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ // Base domain node types
5
+ export type {
6
+ NodeOutput,
7
+ NodeType,
8
+ NodeData,
9
+ Node,
10
+ NodeBase,
11
+ } from "./Node";
12
+
13
+ // Constants & registry
14
+ export { NodeCategory, NodeTag } from "./constants";
15
+ export { NodeRegistry } from "./NodeRegistry";
16
+ export type { NodeDefinition, Port, PortDefinitions } from "./NodeDefinition";
17
+ export type { OutputParameter, StaticOutput, OutputList, OutputBinding, OutputDeclaration } from "../parameter";
18
+
19
+ // NodeMethods — read helpers over a NodeData
20
+ export { getPorts, getArguments, getNodeOutput, getNodeAvailableOutput, getOutputBinding, getInput, isNodeUsedAsTool } from "./methods";
21
+ export type { ExternalInput } from "./methods";
22
+
23
+ // FunctionCall — special node whose definition is built from FunctionInfo
24
+ export type { FunctionCallNode, FunctionCallNodeType, FunctionNodeDefinition } from "./FunctionNode";
25
+ export { buildFunctionNodeDef } from "./FunctionNode";
26
+
27
+ // Serialization — domain Node <-> api
28
+ export { serialize, deserialize } from "./serialization";
29
+ export type { ApiNode } from "./serialization";