xcomponent-ai 0.2.2 → 0.3.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.
- package/EVENT-ACCUMULATION-GUIDE.md +505 -0
- package/EXTERNAL-API.md +719 -0
- package/LLM-GUIDE.md +575 -0
- package/QUICKSTART.md +1 -1
- package/SCALABILITY.md +455 -0
- package/dist/cli.js +170 -63
- package/dist/cli.js.map +1 -1
- package/dist/component-registry.d.ts +35 -4
- package/dist/component-registry.d.ts.map +1 -1
- package/dist/component-registry.js +194 -9
- package/dist/component-registry.js.map +1 -1
- package/dist/external-broker-api.d.ts +205 -0
- package/dist/external-broker-api.d.ts.map +1 -0
- package/dist/external-broker-api.js +222 -0
- package/dist/external-broker-api.js.map +1 -0
- package/dist/fsm-runtime.d.ts +47 -17
- package/dist/fsm-runtime.d.ts.map +1 -1
- package/dist/fsm-runtime.js +333 -136
- package/dist/fsm-runtime.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/mermaid-generator.d.ts.map +1 -1
- package/dist/mermaid-generator.js +1 -17
- package/dist/mermaid-generator.js.map +1 -1
- package/dist/message-broker.d.ts +116 -0
- package/dist/message-broker.d.ts.map +1 -0
- package/dist/message-broker.js +225 -0
- package/dist/message-broker.js.map +1 -0
- package/dist/types.d.ts +92 -19
- package/dist/types.d.ts.map +1 -1
- package/examples/advanced-patterns-demo.yaml +339 -0
- package/examples/cross-component-demo.yaml +68 -0
- package/examples/distributed-demo/README.md +234 -0
- package/examples/distributed-demo/order.yaml +71 -0
- package/examples/distributed-demo/payment.yaml +60 -0
- package/examples/event-accumulation-demo.yaml +172 -0
- package/examples/explicit-transitions-demo.yaml +236 -0
- package/examples/payment-receiver.yaml +56 -0
- package/package.json +8 -1
- package/public/dashboard.html +647 -110
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* External Broker API
|
|
4
|
+
*
|
|
5
|
+
* Enables external systems to interact with xcomponent-ai via message broker
|
|
6
|
+
* WITHOUT needing HTTP API access. This is useful for:
|
|
7
|
+
* - Microservices communicating via message bus
|
|
8
|
+
* - Event-driven architectures
|
|
9
|
+
* - Language-agnostic integrations (Python, Go, Java can use Redis/RabbitMQ clients)
|
|
10
|
+
* - Real-time subscriptions to FSM events
|
|
11
|
+
*
|
|
12
|
+
* Channels:
|
|
13
|
+
* - `xcomponent:external:commands` - Send events to FSM instances from external systems
|
|
14
|
+
* - `xcomponent:events:state_change` - Subscribe to state transitions
|
|
15
|
+
* - `xcomponent:events:instance_created` - Subscribe to instance creations
|
|
16
|
+
* - `xcomponent:events:instance_disposed` - Subscribe to instance disposals
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.ExternalBrokerAPI = void 0;
|
|
20
|
+
exports.publishExternalCommand = publishExternalCommand;
|
|
21
|
+
exports.subscribeToFSMEvents = subscribeToFSMEvents;
|
|
22
|
+
/**
|
|
23
|
+
* External Broker API
|
|
24
|
+
*
|
|
25
|
+
* Provides message broker-based API for external systems
|
|
26
|
+
*/
|
|
27
|
+
class ExternalBrokerAPI {
|
|
28
|
+
broker;
|
|
29
|
+
registry;
|
|
30
|
+
publishEvents;
|
|
31
|
+
handleCommands;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.broker = config.broker;
|
|
34
|
+
this.registry = config.registry;
|
|
35
|
+
this.publishEvents = config.publishEvents ?? false;
|
|
36
|
+
this.handleCommands = config.handleCommands ?? true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the external API
|
|
40
|
+
* - Subscribe to external commands
|
|
41
|
+
* - Forward FSM events to broker (if enabled)
|
|
42
|
+
*/
|
|
43
|
+
async initialize() {
|
|
44
|
+
// Handle external commands
|
|
45
|
+
if (this.handleCommands) {
|
|
46
|
+
await this.subscribeToExternalCommands();
|
|
47
|
+
}
|
|
48
|
+
// Publish FSM events to broker
|
|
49
|
+
if (this.publishEvents) {
|
|
50
|
+
this.forwardFSMEventsToBroker();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Subscribe to external commands channel
|
|
55
|
+
* External systems can publish commands to control FSM instances
|
|
56
|
+
*/
|
|
57
|
+
async subscribeToExternalCommands() {
|
|
58
|
+
// Subscribe to direct instance commands
|
|
59
|
+
this.broker.subscribe('external:commands', async (message) => {
|
|
60
|
+
try {
|
|
61
|
+
const cmd = message;
|
|
62
|
+
// Validate command
|
|
63
|
+
if (!cmd.componentName || !cmd.instanceId || !cmd.event) {
|
|
64
|
+
throw new Error('Invalid external command format');
|
|
65
|
+
}
|
|
66
|
+
// Send event to instance
|
|
67
|
+
await this.registry.sendEventToComponent(cmd.componentName, cmd.instanceId, cmd.event);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error('[ExternalBrokerAPI] Command error:', error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Subscribe to broadcast commands
|
|
74
|
+
this.broker.subscribe('external:broadcasts', async (message) => {
|
|
75
|
+
try {
|
|
76
|
+
const cmd = message;
|
|
77
|
+
// Validate command
|
|
78
|
+
if (!cmd.componentName || !cmd.machineName || !cmd.currentState || !cmd.event) {
|
|
79
|
+
throw new Error('Invalid external broadcast command format');
|
|
80
|
+
}
|
|
81
|
+
// Broadcast event with optional property filters
|
|
82
|
+
await this.registry.broadcastToComponent(cmd.componentName, cmd.machineName, cmd.event, 'external', cmd.filters, // Pass filters for targeted broadcast
|
|
83
|
+
cmd.currentState);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error('[ExternalBrokerAPI] Broadcast error:', error);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Forward FSM events to message broker for external subscribers
|
|
92
|
+
*/
|
|
93
|
+
forwardFSMEventsToBroker() {
|
|
94
|
+
// State changes
|
|
95
|
+
this.registry.on('state_change', (data) => {
|
|
96
|
+
this.publishEvent('state_change', data);
|
|
97
|
+
});
|
|
98
|
+
// Instance created
|
|
99
|
+
this.registry.on('instance_created', (data) => {
|
|
100
|
+
this.publishEvent('instance_created', data);
|
|
101
|
+
});
|
|
102
|
+
// Instance disposed
|
|
103
|
+
this.registry.on('instance_disposed', (data) => {
|
|
104
|
+
this.publishEvent('instance_disposed', data);
|
|
105
|
+
});
|
|
106
|
+
// Instance errors
|
|
107
|
+
this.registry.on('instance_error', (data) => {
|
|
108
|
+
this.publishEvent('instance_error', data);
|
|
109
|
+
});
|
|
110
|
+
// Cross-component cascades (for monitoring)
|
|
111
|
+
this.registry.on('cross_component_cascade', (data) => {
|
|
112
|
+
this.publishEvent('cross_component_cascade', data);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Publish an FSM event to the broker
|
|
117
|
+
*/
|
|
118
|
+
async publishEvent(type, data) {
|
|
119
|
+
const event = {
|
|
120
|
+
type,
|
|
121
|
+
componentName: data.componentName || 'unknown',
|
|
122
|
+
data,
|
|
123
|
+
timestamp: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
const channel = `xcomponent:events:${type}`;
|
|
126
|
+
try {
|
|
127
|
+
// For in-memory broker, we need to cast the message type
|
|
128
|
+
await this.broker.publish(channel, event);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(`[ExternalBrokerAPI] Failed to publish ${type}:`, error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Cleanup
|
|
136
|
+
*/
|
|
137
|
+
async dispose() {
|
|
138
|
+
if (this.handleCommands) {
|
|
139
|
+
this.broker.unsubscribe('external:commands');
|
|
140
|
+
this.broker.unsubscribe('external:broadcasts');
|
|
141
|
+
}
|
|
142
|
+
this.registry.removeAllListeners();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.ExternalBrokerAPI = ExternalBrokerAPI;
|
|
146
|
+
/**
|
|
147
|
+
* Helper: Publish external command to message broker
|
|
148
|
+
* (For use by external systems)
|
|
149
|
+
*
|
|
150
|
+
* Example (from Node.js):
|
|
151
|
+
* ```typescript
|
|
152
|
+
* import { createClient } from 'redis';
|
|
153
|
+
*
|
|
154
|
+
* const redis = createClient({ url: 'redis://localhost:6379' });
|
|
155
|
+
* await redis.connect();
|
|
156
|
+
*
|
|
157
|
+
* await publishExternalCommand(redis, {
|
|
158
|
+
* componentName: 'OrderComponent',
|
|
159
|
+
* instanceId: 'order-123',
|
|
160
|
+
* event: { type: 'VALIDATE', payload: {} }
|
|
161
|
+
* });
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* Example (from Python):
|
|
165
|
+
* ```python
|
|
166
|
+
* import redis
|
|
167
|
+
* import json
|
|
168
|
+
*
|
|
169
|
+
* r = redis.Redis(host='localhost', port=6379)
|
|
170
|
+
* r.publish('xcomponent:external:commands', json.dumps({
|
|
171
|
+
* 'componentName': 'OrderComponent',
|
|
172
|
+
* 'instanceId': 'order-123',
|
|
173
|
+
* 'event': {'type': 'VALIDATE', 'payload': {}}
|
|
174
|
+
* }))
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
async function publishExternalCommand(redisClient, command) {
|
|
178
|
+
await redisClient.publish('xcomponent:external:commands', JSON.stringify(command));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Helper: Subscribe to FSM events from external systems
|
|
182
|
+
*
|
|
183
|
+
* Example (from Node.js):
|
|
184
|
+
* ```typescript
|
|
185
|
+
* import { createClient } from 'redis';
|
|
186
|
+
*
|
|
187
|
+
* const redis = createClient({ url: 'redis://localhost:6379' });
|
|
188
|
+
* await redis.connect();
|
|
189
|
+
*
|
|
190
|
+
* await subscribeToFSMEvents(redis, 'state_change', (event) => {
|
|
191
|
+
* console.log('State changed:', event);
|
|
192
|
+
* });
|
|
193
|
+
* ```
|
|
194
|
+
*
|
|
195
|
+
* Example (from Python):
|
|
196
|
+
* ```python
|
|
197
|
+
* import redis
|
|
198
|
+
* import json
|
|
199
|
+
*
|
|
200
|
+
* r = redis.Redis(host='localhost', port=6379)
|
|
201
|
+
* pubsub = r.pubsub()
|
|
202
|
+
* pubsub.subscribe('xcomponent:events:state_change')
|
|
203
|
+
*
|
|
204
|
+
* for message in pubsub.listen():
|
|
205
|
+
* if message['type'] == 'message':
|
|
206
|
+
* event = json.loads(message['data'])
|
|
207
|
+
* print('State changed:', event)
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
async function subscribeToFSMEvents(redisClient, eventType, handler) {
|
|
211
|
+
const channel = `xcomponent:events:${eventType}`;
|
|
212
|
+
await redisClient.subscribe(channel, (message) => {
|
|
213
|
+
try {
|
|
214
|
+
const event = JSON.parse(message);
|
|
215
|
+
handler(event);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
console.error(`Failed to parse FSM event from ${channel}:`, error);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=external-broker-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-broker-api.js","sourceRoot":"","sources":["../src/external-broker-api.ts"],"names":[],"mappings":"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"}
|
package/dist/fsm-runtime.d.ts
CHANGED
|
@@ -36,28 +36,44 @@ export declare class FSMRuntime extends EventEmitter {
|
|
|
36
36
|
createInstance(machineName: string, initialContext?: Record<string, any>): string;
|
|
37
37
|
/**
|
|
38
38
|
* Send event to an instance
|
|
39
|
+
*
|
|
40
|
+
* Supports multiple transitions from same state with same event.
|
|
41
|
+
* When multiple transitions exist with guards, uses "first matching guard wins" semantics.
|
|
39
42
|
*/
|
|
40
43
|
sendEvent(instanceId: string, event: FSMEvent): Promise<void>;
|
|
41
44
|
/**
|
|
42
|
-
* Broadcast event to all matching instances
|
|
45
|
+
* Broadcast event to all matching instances
|
|
43
46
|
*
|
|
44
|
-
*
|
|
45
|
-
* -
|
|
46
|
-
* -
|
|
47
|
-
* - Routes event to ALL instances where matching rules pass
|
|
47
|
+
* Two modes:
|
|
48
|
+
* 1. Simple broadcast - send to all instances (any state or specific state)
|
|
49
|
+
* 2. MatchingRules - XComponent-style routing based on event payload
|
|
48
50
|
*
|
|
49
|
-
*
|
|
50
|
-
* // 100 Order instances exist
|
|
51
|
-
* // Event: ExecutionInput { OrderId: 42, Quantity: 500 }
|
|
52
|
-
* // Matching rule: ExecutionInput.OrderId = Order.Id
|
|
53
|
-
* // → Automatically routes to Order instance with Id=42
|
|
51
|
+
* Filtering via matchingRules in YAML, not in code.
|
|
54
52
|
*
|
|
55
53
|
* @param machineName Target state machine name
|
|
56
|
-
* @param currentState Current state filter (only instances in this state)
|
|
57
54
|
* @param event Event to broadcast
|
|
55
|
+
* @param currentState Optional state filter. Omit to broadcast to all states
|
|
58
56
|
* @returns Number of instances that received the event
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // Broadcast to all Orders (any state)
|
|
60
|
+
* await runtime.broadcastEvent('Order', {type: 'ALERT', payload: {}});
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* // Broadcast to Orders in Pending state only
|
|
64
|
+
* await runtime.broadcastEvent('Order', {type: 'TIMEOUT', payload: {}}, 'Pending');
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* // Filtering via matchingRules in YAML:
|
|
68
|
+
* // transitions:
|
|
69
|
+
* // - from: Monitoring
|
|
70
|
+
* // to: Monitoring
|
|
71
|
+
* // event: ORDER_UPDATE
|
|
72
|
+
* // matchingRules:
|
|
73
|
+
* // - eventProperty: payload.customerId
|
|
74
|
+
* // instanceProperty: customerId
|
|
75
|
+
*/
|
|
76
|
+
broadcastEvent(machineName: string, event: FSMEvent, currentState?: string): Promise<number>;
|
|
61
77
|
/**
|
|
62
78
|
* Find instances that match the property matching rules
|
|
63
79
|
*
|
|
@@ -100,10 +116,6 @@ export declare class FSMRuntime extends EventEmitter {
|
|
|
100
116
|
* @returns Matching transition or null
|
|
101
117
|
*/
|
|
102
118
|
private findTransition;
|
|
103
|
-
/**
|
|
104
|
-
* Evaluate guards
|
|
105
|
-
*/
|
|
106
|
-
private evaluateGuards;
|
|
107
119
|
/**
|
|
108
120
|
* Execute transition
|
|
109
121
|
*
|
|
@@ -121,6 +133,13 @@ export declare class FSMRuntime extends EventEmitter {
|
|
|
121
133
|
* use a single timer wheel that manages all timeouts (O(1) timer).
|
|
122
134
|
*/
|
|
123
135
|
private setupTimeouts;
|
|
136
|
+
/**
|
|
137
|
+
* Setup timeout transitions for self-loop
|
|
138
|
+
*
|
|
139
|
+
* Only sets up timeouts that should reset (resetOnTransition !== false).
|
|
140
|
+
* Timeouts with resetOnTransition: false are already running and shouldn't be recreated.
|
|
141
|
+
*/
|
|
142
|
+
private setupTimeoutsForSelfLoop;
|
|
124
143
|
/**
|
|
125
144
|
* Setup auto-transitions (XComponent-style automatic transitions)
|
|
126
145
|
*
|
|
@@ -178,6 +197,13 @@ export declare class FSMRuntime extends EventEmitter {
|
|
|
178
197
|
* Clear timeouts for instance (using timer wheel)
|
|
179
198
|
*/
|
|
180
199
|
private clearTimeouts;
|
|
200
|
+
/**
|
|
201
|
+
* Clear timeouts for self-loop transition
|
|
202
|
+
*
|
|
203
|
+
* Only clears timeouts that should be reset on self-loop (resetOnTransition !== false).
|
|
204
|
+
* Timeouts with resetOnTransition: false continue running.
|
|
205
|
+
*/
|
|
206
|
+
private clearTimeoutsForSelfLoop;
|
|
181
207
|
/**
|
|
182
208
|
* Get instance
|
|
183
209
|
*/
|
|
@@ -242,6 +268,10 @@ export declare class FSMRuntime extends EventEmitter {
|
|
|
242
268
|
* Get component definition
|
|
243
269
|
*/
|
|
244
270
|
getComponent(): Component;
|
|
271
|
+
/**
|
|
272
|
+
* Get component name
|
|
273
|
+
*/
|
|
274
|
+
getComponentName(): string;
|
|
245
275
|
/**
|
|
246
276
|
* Set component registry for cross-component communication
|
|
247
277
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsm-runtime.d.ts","sourceRoot":"","sources":["../src/fsm-runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,SAAS,EAET,UAAU,EACV,QAAQ,EACR,WAAW,
|
|
1
|
+
{"version":3,"file":"fsm-runtime.d.ts","sourceRoot":"","sources":["../src/fsm-runtime.ts"],"names":[],"mappings":"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"}
|