flowfram-runtime 1.0.2

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.
package/README.md ADDED
@@ -0,0 +1,151 @@
1
+ # flowfram-runtime
2
+
3
+ Distributed runtime execution engine for FlowFRAM simulations.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Global installation (recommended for CLI usage)
9
+ npm install -g flowfram-runtime
10
+
11
+ # Or with yarn
12
+ yarn global add flowfram-runtime
13
+
14
+ # Or with pnpm
15
+ pnpm add -g flowfram-runtime
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ### CLI
21
+
22
+ ```bash
23
+ # Start with default settings (port 3001)
24
+ flowfram-runtime
25
+
26
+ # Start on custom port
27
+ flowfram-runtime --port 8080
28
+
29
+ # Show help
30
+ flowfram-runtime --help
31
+
32
+ # Show version
33
+ flowfram-runtime --version
34
+ ```
35
+
36
+ ### Environment Variables
37
+
38
+ ```bash
39
+ PORT=3001 # Server port
40
+ HOST=0.0.0.0 # Server host
41
+ LOG_LEVEL=info # Logging level (debug, info, warn, error)
42
+ RUNTIME_DATA_DIR=./data # Directory for persisted flows
43
+ ```
44
+
45
+ ## Features
46
+
47
+ - REST API for flow deployment, stop, and inject operations
48
+ - Batch execution mode for programmatic experiment validation
49
+ - Server-Sent Events (SSE) for real-time event streaming
50
+ - 35+ node types implemented
51
+ - MQTT In/Out with external broker support
52
+ - HTTP Request node
53
+ - Database nodes: PostgreSQL, MySQL, MSSQL
54
+ - State persistence (survives restarts)
55
+ - Multi-tenant isolation
56
+ - Automatic flow restoration on startup
57
+
58
+ ## Docker
59
+
60
+ ```bash
61
+ # Build and run with Docker Compose
62
+ docker-compose up -d
63
+
64
+ # With MQTT broker (optional)
65
+ docker-compose --profile mqtt up -d
66
+
67
+ # View logs
68
+ docker-compose logs -f runtime-service
69
+
70
+ # Stop
71
+ docker-compose down
72
+ ```
73
+
74
+ ### Docker Build Only
75
+
76
+ ```bash
77
+ # Build image
78
+ docker build -t flowfram-runtime .
79
+
80
+ # Run container
81
+ docker run -d -p 3001:3001 --name flowfram-runtime flowfram-runtime
82
+ ```
83
+
84
+ ## API Endpoints
85
+
86
+ | Method | Endpoint | Description |
87
+ |--------|----------|-------------|
88
+ | POST | `/deploy` | Deploy a flow |
89
+ | POST | `/stop` | Stop a running flow |
90
+ | POST | `/flows/:flowId/stop` | Stop a specific flow |
91
+ | POST | `/inject` | Execute an inject node |
92
+ | POST | `/batch-run` | Execute N iterations (for experiments) |
93
+ | POST | `/config` | Update runtime configuration |
94
+ | POST | `/context/clear` | Clear runtime context |
95
+ | POST | `/setInstantiation` | Set instantiation mode |
96
+ | GET | `/status` | Get runtime status |
97
+ | GET | `/flows` | List deployed flows |
98
+ | GET | `/events?flowId=xxx` | SSE event stream |
99
+ | GET | `/health` | Health check |
100
+
101
+ ## Configuration
102
+
103
+ Environment variables:
104
+
105
+ | Variable | Default | Description |
106
+ |----------|---------|-------------|
107
+ | `PORT` | `3001` | Server port |
108
+ | `RUNTIME_DATA_DIR` | `./data` | Directory for persisted flows |
109
+
110
+ ## Supported Nodes
111
+
112
+ | Category | Nodes |
113
+ |----------|-------|
114
+ | **Core** | inject, debug, function, change, switch, template, delay |
115
+ | **Network** | http-request, mqtt-in, mqtt-out |
116
+ | **Database** | postgresql, mysql, mssql |
117
+ | **Parser** | json, csv, csv-parse, xml, html |
118
+ | **Sequence** | split, join, sort, batch |
119
+ | **Function** | range, rbe, trigger |
120
+ | **Control** | catch, status, complete |
121
+ | **FRAM** | resonance, resonance-indicator, coupling-matrix |
122
+ | **Output** | chart-output, table-output |
123
+ | **Visual** | comment |
124
+
125
+ ## Architecture
126
+
127
+ ```
128
+ ┌─────────────────────────────────────────────────────────┐
129
+ │ Runtime Service (Port 3001) │
130
+ │ ┌───────────────────────────────────────────────────┐ │
131
+ │ │ Express REST API │ │
132
+ │ │ - POST /deploy, /stop, /inject, /batch-run │ │
133
+ │ │ - GET /status, /flows, /events, /health │ │
134
+ │ └───────────────────────────────────────────────────┘ │
135
+ │ ┌───────────────────────────────────────────────────┐ │
136
+ │ │ ServerFlowRuntime │ │
137
+ │ │ - Node execution engine (35+ types) │ │
138
+ │ │ - Message routing │ │
139
+ │ │ - Context management │ │
140
+ │ └───────────────────────────────────────────────────┘ │
141
+ │ ┌───────────────────────────────────────────────────┐ │
142
+ │ │ Persistence Layer │ │
143
+ │ │ - Saves deployed flows to disk │ │
144
+ │ │ - Restores flows on startup │ │
145
+ │ └───────────────────────────────────────────────────┘ │
146
+ └─────────────────────────────────────────────────────────┘
147
+ ```
148
+
149
+ ## License
150
+
151
+ MIT
@@ -0,0 +1,303 @@
1
+ /**
2
+ * ServerFlowRuntime - Simplified version for Runtime Service
3
+ *
4
+ * This is a standalone version that can run in a Docker container.
5
+ * It includes all node execution logic inline.
6
+ */
7
+ import { EventEmitter } from "events";
8
+ interface FlowNode {
9
+ id: string;
10
+ type: string;
11
+ name?: string;
12
+ wires?: string[][];
13
+ x?: number;
14
+ y?: number;
15
+ z?: string;
16
+ [key: string]: any;
17
+ }
18
+ interface FlowDefinition {
19
+ id: string;
20
+ name?: string;
21
+ nodes: FlowNode[];
22
+ edges?: any[];
23
+ }
24
+ interface DeployResult {
25
+ status: "success" | "partial" | "failed";
26
+ nodesDeployed: number;
27
+ flowsDeployed: number;
28
+ errors?: string[];
29
+ }
30
+ interface StopResult {
31
+ success: boolean;
32
+ error?: string;
33
+ timestamp?: number;
34
+ }
35
+ interface RuntimeStatus {
36
+ status: "idle" | "running" | "stopped" | "error";
37
+ flows?: {
38
+ total: number;
39
+ };
40
+ nodes?: {
41
+ total: number;
42
+ };
43
+ uptime?: number;
44
+ startTime?: number;
45
+ metrics?: {
46
+ mqttConnections: number;
47
+ activeTimers: number;
48
+ activeIntervals: number;
49
+ joinGroups: number;
50
+ batchGroups: number;
51
+ };
52
+ }
53
+ export declare class ServerFlowRuntime extends EventEmitter {
54
+ private tenantSlug;
55
+ private tenantId;
56
+ private flows;
57
+ private nodes;
58
+ private status;
59
+ private startTime;
60
+ private activeTimers;
61
+ private activeIntervals;
62
+ private flowContext;
63
+ private globalContext;
64
+ private nodeContext;
65
+ private mqttClients;
66
+ private mqttSubscriptions;
67
+ private joinGroups;
68
+ private batchGroups;
69
+ private rbeState;
70
+ private triggerState;
71
+ private linkNodes;
72
+ private edgeDataMap;
73
+ private framTopology;
74
+ private currentIteration;
75
+ private executionContext;
76
+ private pendingMessages;
77
+ private flowCycleId;
78
+ private erroredFlows;
79
+ private fastMode;
80
+ private fastModeMetadataSnapshots;
81
+ private fastModeMessageFlowData;
82
+ private fastModeOutputData;
83
+ private runningStats;
84
+ private suppressFunctionLogs;
85
+ private maxHops;
86
+ constructor(tenantSlug: string, tenantId: string);
87
+ /**
88
+ * Set the current simulation iteration for SSE message tagging
89
+ * Also stores in flow context so variables can access via flow.get('sim_iteration')
90
+ */
91
+ setCurrentIteration(iteration: number): void;
92
+ /**
93
+ * Get the current simulation iteration
94
+ */
95
+ getCurrentIteration(): number;
96
+ /**
97
+ * Set the execution context (floweditor, instantiator, scenario-compare, etc.)
98
+ */
99
+ setExecutionContext(context: string): void;
100
+ /**
101
+ * Set maximum message hops for cycle protection
102
+ */
103
+ setMaxHops(maxHops: number): void;
104
+ /**
105
+ * Get the current maximum hops setting
106
+ */
107
+ getMaxHops(): number;
108
+ /**
109
+ * Enable/disable fast mode - suppresses debug SSE events for better performance
110
+ * Always clears accumulators and running stats for a fresh batch
111
+ */
112
+ setFastMode(enabled: boolean): void;
113
+ /**
114
+ * Get accumulated metadata snapshots from fast mode execution
115
+ * Returns the array and clears it
116
+ */
117
+ getAndClearFastModeMetadata(): any[];
118
+ /**
119
+ * Get accumulated message flow data from fast mode execution
120
+ * Returns the array and clears it
121
+ */
122
+ getAndClearFastModeMessageFlow(): any[];
123
+ /**
124
+ * Get accumulated output data (chart-output/table-output) from fast mode execution
125
+ * Returns the array and clears it
126
+ */
127
+ getAndClearFastModeOutputData(): any[];
128
+ /**
129
+ * Update running statistics for a single observation using Welford's online algorithm.
130
+ * O(1) per observation for mean/variance, O(n) memory for values (needed for percentiles).
131
+ */
132
+ private updateRunningStats;
133
+ /**
134
+ * Get computed running statistics and clear them.
135
+ * Returns per-function, per-variable descriptive statistics including percentiles and histogram.
136
+ */
137
+ getAndClearRunningStats(): Record<string, Record<string, {
138
+ count: number;
139
+ mean: number;
140
+ variance: number;
141
+ std: number;
142
+ min: number;
143
+ max: number;
144
+ sum: number;
145
+ p5: number;
146
+ p25: number;
147
+ p50: number;
148
+ p75: number;
149
+ p95: number;
150
+ histogram: Array<{
151
+ min: number;
152
+ max: number;
153
+ count: number;
154
+ percentage: number;
155
+ }>;
156
+ values: number[];
157
+ }>>;
158
+ /**
159
+ * Enable/disable function node console output on the server terminal.
160
+ * When suppressed, debug.log() and console.log from user function code
161
+ * are silenced on the server — SSE events are still emitted to the UI.
162
+ */
163
+ setSuppressFunctionLogs(suppress: boolean): void;
164
+ /**
165
+ * Check if function logs are suppressed
166
+ */
167
+ isFunctionLogsSuppressed(): boolean;
168
+ /**
169
+ * Get the execution context
170
+ */
171
+ getExecutionContext(): string;
172
+ /**
173
+ * Check if any flow has encountered a critical error
174
+ */
175
+ hasError(): boolean;
176
+ /**
177
+ * Get the error message if any flow has encountered an error
178
+ */
179
+ getError(): string | null;
180
+ /**
181
+ * Start a new flow cycle with tracking
182
+ * Returns a cycle ID that can be used to wait for completion
183
+ */
184
+ startFlowCycle(): string;
185
+ /**
186
+ * Get current pending message count
187
+ */
188
+ getPendingMessageCount(): number;
189
+ /**
190
+ * Check if flow cycle is complete (no pending messages)
191
+ */
192
+ isFlowCycleComplete(): boolean;
193
+ /**
194
+ * Wait for all pending messages to complete
195
+ * Used by batch-run to ensure async operations (HTTP, MQTT, CSV) finish before next iteration
196
+ * @param timeoutMs Maximum time to wait (default 30 seconds)
197
+ * @param pollIntervalMs How often to check (default 100ms)
198
+ */
199
+ waitForPendingMessages(timeoutMs?: number, pollIntervalMs?: number): Promise<boolean>;
200
+ /**
201
+ * Increment pending message count
202
+ */
203
+ private incrementPending;
204
+ /**
205
+ * Decrement pending message count and emit completion if done
206
+ */
207
+ private decrementPending;
208
+ deploy(flowDefinitions: FlowDefinition[]): Promise<DeployResult>;
209
+ private initializeMqttNodes;
210
+ /**
211
+ * Execute an inject node by ID
212
+ */
213
+ injectNode(nodeId: string): Promise<void>;
214
+ stop(flowId?: string): Promise<StopResult>;
215
+ start(flowId?: string): Promise<{
216
+ success: boolean;
217
+ error?: string;
218
+ }>;
219
+ getStatus(): Promise<RuntimeStatus>;
220
+ /**
221
+ * Clear all flow context variables and stateful node data
222
+ * Used before starting a new simulation to reset self-referential variables,
223
+ * join node pending messages, batch groups, etc.
224
+ */
225
+ clearFlowContext(): string[];
226
+ /**
227
+ * Set a flow context value directly
228
+ * Used by multi-cycle controllers to store instantiation tracking info
229
+ */
230
+ setFlowContextValue(key: string, value: any): void;
231
+ /**
232
+ * Get a flow context value directly
233
+ */
234
+ getFlowContextValue(key: string): any;
235
+ /**
236
+ * Check if a node has any input connections (wires pointing TO it)
237
+ * Used to determine if observer nodes should be auto-triggered
238
+ */
239
+ private nodeHasInputConnection;
240
+ /**
241
+ * Trigger observer nodes (coupling-matrix, resonance-indicator) that don't have input wires
242
+ * Called at the end of each iteration to auto-compute visualization data
243
+ * This method is safe to call - it only affects nodes without input connections
244
+ */
245
+ triggerObserverNodes(): Promise<void>;
246
+ /**
247
+ * Emit system entropy data (always, regardless of node presence)
248
+ * This ensures the Entropy tab in the UI is always populated after simulation
249
+ */
250
+ private emitSystemEntropyData;
251
+ executeNode(nodeId: string, inputMessage: any): Promise<void>;
252
+ private executeNodeByType;
253
+ private executeInject;
254
+ private executeDebug;
255
+ private executeFunction;
256
+ private executeChange;
257
+ private executeSwitch;
258
+ private executeTemplate;
259
+ private executeDelay;
260
+ private executeHttpRequest;
261
+ private executeDatabase;
262
+ private getDefaultPort;
263
+ private executePostgreSQL;
264
+ private executeMySQL;
265
+ private executeMSSQL;
266
+ private executeMqttIn;
267
+ private executeMqttOut;
268
+ private topicMatches;
269
+ private executeJson;
270
+ private executeCsv;
271
+ private executeXml;
272
+ private executeHtml;
273
+ private executeSplit;
274
+ private executeJoin;
275
+ private executeSort;
276
+ private executeBatch;
277
+ private executeRange;
278
+ private executeRbe;
279
+ private executeTrigger;
280
+ private executeLinkIn;
281
+ private executeLinkOut;
282
+ private getProperty;
283
+ private setProperty;
284
+ private deleteProperty;
285
+ private evaluateValue;
286
+ /**
287
+ * Execute coupling-matrix node: compute coupling strength between FRAM functions
288
+ * from accumulated message-flow history and emit coupling-data SSE event
289
+ */
290
+ private executeCouplingMatrix;
291
+ /**
292
+ * Execute resonance-indicator node: compute functional resonance index
293
+ * from accumulated message-flow history using ENTROPY-BASED metrics
294
+ * Based on theoretical framework from docs/research/entropy-based-fram-analysis.md
295
+ *
296
+ * The Resonance Entropy Index (REI) formula:
297
+ * REI = α·Ĥ_activity + β·Ĥ_coupling + γ·Ĥ_aspect + δ·(1 - Ĥ_temporal)
298
+ */
299
+ private executeResonanceIndicator;
300
+ private emitRuntimeEvent;
301
+ }
302
+ export {};
303
+ //# sourceMappingURL=ServerFlowRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerFlowRuntime.d.ts","sourceRoot":"","sources":["../src/ServerFlowRuntime.ts"],"names":[],"mappings":"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"}