@vscxml/mcp 0.1.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/README.md +252 -0
- package/dist/bin/scxml-mcp.d.ts +2 -0
- package/dist/bin/scxml-mcp.js +51 -0
- package/dist/bin/scxml-mcp.js.map +1 -0
- package/dist/bridges/editor-bridge.d.ts +135 -0
- package/dist/bridges/editor-bridge.js +285 -0
- package/dist/bridges/editor-bridge.js.map +1 -0
- package/dist/bridges/generator-bridge.d.ts +72 -0
- package/dist/bridges/generator-bridge.js +190 -0
- package/dist/bridges/generator-bridge.js.map +1 -0
- package/dist/bridges/simulator-bridge.d.ts +89 -0
- package/dist/bridges/simulator-bridge.js +451 -0
- package/dist/bridges/simulator-bridge.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/process-manager.d.ts +42 -0
- package/dist/process-manager.js +211 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +721 -0
- package/dist/server.js.map +1 -0
- package/dist/trace-buffer.d.ts +22 -0
- package/dist/trace-buffer.js +36 -0
- package/dist/trace-buffer.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
- package/server.json +78 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
/**
|
|
3
|
+
* Response types the simulator sends for each command action.
|
|
4
|
+
* The server does NOT echo commandId, so we match by response type.
|
|
5
|
+
*/
|
|
6
|
+
const RESPONSE_TYPES = {
|
|
7
|
+
load_scxml: ['session_created'],
|
|
8
|
+
start: ['success'],
|
|
9
|
+
stop: ['success'],
|
|
10
|
+
reset: ['session_created'],
|
|
11
|
+
pause: ['success'],
|
|
12
|
+
resume: ['success'],
|
|
13
|
+
step: ['success'],
|
|
14
|
+
send_event: ['success'],
|
|
15
|
+
set_variable: ['success'],
|
|
16
|
+
get_state: ['state'],
|
|
17
|
+
get_scxml: ['scxml_content'],
|
|
18
|
+
get_history: ['history'],
|
|
19
|
+
clear_history: ['success'],
|
|
20
|
+
add_breakpoint: ['success'],
|
|
21
|
+
remove_breakpoint: ['success'],
|
|
22
|
+
list_traces: ['trace_list'],
|
|
23
|
+
save_trace: ['trace_saved'],
|
|
24
|
+
delete_trace: ['trace_deleted'],
|
|
25
|
+
load_trace: ['trace_loaded'],
|
|
26
|
+
play_trace: ['trace_playback_started'],
|
|
27
|
+
step_trace: ['trace_stepped'],
|
|
28
|
+
pause_trace: ['trace_paused'],
|
|
29
|
+
trace_status: ['trace_status'],
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* WebSocket bridge to the VSCXML-Simulator.
|
|
33
|
+
* Uses response-type matching (the server does not echo commandId).
|
|
34
|
+
* Buffers broadcast events (state_update, transition_fired, etc.) into a trace.
|
|
35
|
+
*/
|
|
36
|
+
export class SimulatorBridge {
|
|
37
|
+
ws = null;
|
|
38
|
+
url;
|
|
39
|
+
pendingResolve = null;
|
|
40
|
+
traceBuffer = [];
|
|
41
|
+
sessionId = null;
|
|
42
|
+
connected = false;
|
|
43
|
+
reconnectTimer = null;
|
|
44
|
+
activeStates = [];
|
|
45
|
+
variables = {};
|
|
46
|
+
enabledEvents = [];
|
|
47
|
+
finished = false;
|
|
48
|
+
mode = 'PAUSED';
|
|
49
|
+
constructor(url) {
|
|
50
|
+
this.url = url || `ws://localhost:${48621}`;
|
|
51
|
+
}
|
|
52
|
+
setUrl(url) {
|
|
53
|
+
this.url = url;
|
|
54
|
+
}
|
|
55
|
+
isConnected() {
|
|
56
|
+
return this.connected;
|
|
57
|
+
}
|
|
58
|
+
getSessionId() {
|
|
59
|
+
return this.sessionId;
|
|
60
|
+
}
|
|
61
|
+
/** Connect to the simulator WebSocket */
|
|
62
|
+
async connect() {
|
|
63
|
+
if (this.connected)
|
|
64
|
+
return;
|
|
65
|
+
return new Promise((resolve, reject) => {
|
|
66
|
+
try {
|
|
67
|
+
this.ws = new WebSocket(this.url);
|
|
68
|
+
const timeout = setTimeout(() => {
|
|
69
|
+
reject(new Error(`Connection timeout to simulator at ${this.url}`));
|
|
70
|
+
this.ws?.close();
|
|
71
|
+
}, 5000);
|
|
72
|
+
this.ws.on('open', () => {
|
|
73
|
+
clearTimeout(timeout);
|
|
74
|
+
this.connected = true;
|
|
75
|
+
resolve();
|
|
76
|
+
});
|
|
77
|
+
this.ws.on('message', (data) => {
|
|
78
|
+
this.handleMessage(data.toString());
|
|
79
|
+
});
|
|
80
|
+
this.ws.on('close', () => {
|
|
81
|
+
this.connected = false;
|
|
82
|
+
this.ws = null;
|
|
83
|
+
if (this.pendingResolve) {
|
|
84
|
+
clearTimeout(this.pendingResolve.timer);
|
|
85
|
+
this.pendingResolve.reject(new Error('Connection closed'));
|
|
86
|
+
this.pendingResolve = null;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
this.ws.on('error', (err) => {
|
|
90
|
+
clearTimeout(timeout);
|
|
91
|
+
if (!this.connected) {
|
|
92
|
+
reject(err);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
reject(err);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
disconnect() {
|
|
102
|
+
if (this.reconnectTimer) {
|
|
103
|
+
clearTimeout(this.reconnectTimer);
|
|
104
|
+
this.reconnectTimer = null;
|
|
105
|
+
}
|
|
106
|
+
if (this.ws) {
|
|
107
|
+
this.ws.close();
|
|
108
|
+
this.ws = null;
|
|
109
|
+
}
|
|
110
|
+
this.connected = false;
|
|
111
|
+
}
|
|
112
|
+
async isAvailable() {
|
|
113
|
+
try {
|
|
114
|
+
await this.connect();
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Load SCXML and return session info */
|
|
122
|
+
async loadScxml(scxml) {
|
|
123
|
+
const response = await this.sendCommand('load_scxml', { scxml });
|
|
124
|
+
if (response.sessionId) {
|
|
125
|
+
this.sessionId = response.sessionId;
|
|
126
|
+
}
|
|
127
|
+
this.traceBuffer = [];
|
|
128
|
+
return this.getCurrentState();
|
|
129
|
+
}
|
|
130
|
+
/** Start the state machine */
|
|
131
|
+
async start() {
|
|
132
|
+
await this.sendCommand('start', { sessionId: this.sessionId });
|
|
133
|
+
await this.waitForSettle();
|
|
134
|
+
return this.getCurrentState();
|
|
135
|
+
}
|
|
136
|
+
/** Send an event and return trace + state */
|
|
137
|
+
async sendEvent(eventName, eventData) {
|
|
138
|
+
const preTrace = this.drainTrace();
|
|
139
|
+
const event = { name: eventName };
|
|
140
|
+
if (eventData !== undefined) {
|
|
141
|
+
event.data = eventData;
|
|
142
|
+
}
|
|
143
|
+
await this.sendCommand('send_event', {
|
|
144
|
+
sessionId: this.sessionId,
|
|
145
|
+
event,
|
|
146
|
+
});
|
|
147
|
+
await this.waitForSettle();
|
|
148
|
+
const trace = this.drainTrace();
|
|
149
|
+
return { trace: [...preTrace, ...trace], state: this.getCurrentState() };
|
|
150
|
+
}
|
|
151
|
+
/** Get current state without sending an event */
|
|
152
|
+
async getState() {
|
|
153
|
+
const response = await this.sendCommand('get_state', {
|
|
154
|
+
sessionId: this.sessionId,
|
|
155
|
+
});
|
|
156
|
+
if (response.activeStates)
|
|
157
|
+
this.activeStates = response.activeStates;
|
|
158
|
+
if (response.variables)
|
|
159
|
+
this.variables = response.variables;
|
|
160
|
+
if (response.enabledEvents)
|
|
161
|
+
this.enabledEvents = response.enabledEvents;
|
|
162
|
+
if (response.finished !== undefined)
|
|
163
|
+
this.finished = response.finished;
|
|
164
|
+
if (response.mode)
|
|
165
|
+
this.mode = response.mode;
|
|
166
|
+
return {
|
|
167
|
+
...this.getCurrentState(),
|
|
168
|
+
mode: this.mode,
|
|
169
|
+
history: [...this.traceBuffer],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/** Reset the simulation */
|
|
173
|
+
async reset() {
|
|
174
|
+
const response = await this.sendCommand('reset', {
|
|
175
|
+
sessionId: this.sessionId,
|
|
176
|
+
});
|
|
177
|
+
this.traceBuffer = [];
|
|
178
|
+
if (response.sessionId) {
|
|
179
|
+
this.sessionId = response.sessionId;
|
|
180
|
+
}
|
|
181
|
+
// Fetch state after reset
|
|
182
|
+
const stateResp = await this.sendCommand('get_state', {
|
|
183
|
+
sessionId: this.sessionId,
|
|
184
|
+
});
|
|
185
|
+
if (stateResp.activeStates)
|
|
186
|
+
this.activeStates = stateResp.activeStates;
|
|
187
|
+
if (stateResp.variables)
|
|
188
|
+
this.variables = stateResp.variables;
|
|
189
|
+
if (stateResp.enabledEvents)
|
|
190
|
+
this.enabledEvents = stateResp.enabledEvents;
|
|
191
|
+
return this.getCurrentState();
|
|
192
|
+
}
|
|
193
|
+
/** Get current SCXML content */
|
|
194
|
+
async getScxml() {
|
|
195
|
+
const response = await this.sendCommand('get_scxml', {
|
|
196
|
+
sessionId: this.sessionId,
|
|
197
|
+
});
|
|
198
|
+
return response.scxml;
|
|
199
|
+
}
|
|
200
|
+
// --- Trace management methods ---
|
|
201
|
+
/** List embedded traces in the current SCXML document */
|
|
202
|
+
async listTraces() {
|
|
203
|
+
const response = await this.sendCommand('list_traces', {
|
|
204
|
+
sessionId: this.sessionId,
|
|
205
|
+
});
|
|
206
|
+
return response.traces || [];
|
|
207
|
+
}
|
|
208
|
+
/** Save/embed a trace into the SCXML document */
|
|
209
|
+
async saveTrace(name, options) {
|
|
210
|
+
const params = {
|
|
211
|
+
sessionId: this.sessionId,
|
|
212
|
+
name,
|
|
213
|
+
};
|
|
214
|
+
if (options?.description)
|
|
215
|
+
params.description = options.description;
|
|
216
|
+
if (options?.content)
|
|
217
|
+
params.content = options.content;
|
|
218
|
+
const response = await this.sendCommand('save_trace', params);
|
|
219
|
+
return {
|
|
220
|
+
entryCount: response.entryCount,
|
|
221
|
+
scxml: response.scxml,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/** Delete an embedded trace by name */
|
|
225
|
+
async deleteTrace(name) {
|
|
226
|
+
const response = await this.sendCommand('delete_trace', {
|
|
227
|
+
sessionId: this.sessionId,
|
|
228
|
+
name,
|
|
229
|
+
});
|
|
230
|
+
return { scxml: response.scxml };
|
|
231
|
+
}
|
|
232
|
+
/** Load an embedded trace by name (returns parsed entries) */
|
|
233
|
+
async loadTrace(name) {
|
|
234
|
+
const response = await this.sendCommand('load_trace', {
|
|
235
|
+
sessionId: this.sessionId,
|
|
236
|
+
name,
|
|
237
|
+
});
|
|
238
|
+
return {
|
|
239
|
+
entries: response.entries || [],
|
|
240
|
+
entryCount: response.entryCount,
|
|
241
|
+
description: response.description,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// --- Trace playback methods ---
|
|
245
|
+
/** Start playing an embedded trace by name */
|
|
246
|
+
async playTrace(name, speed) {
|
|
247
|
+
const params = {
|
|
248
|
+
sessionId: this.sessionId,
|
|
249
|
+
name,
|
|
250
|
+
};
|
|
251
|
+
if (speed !== undefined)
|
|
252
|
+
params.speed = speed;
|
|
253
|
+
const response = await this.sendCommand('play_trace', params);
|
|
254
|
+
return { entryCount: response.entryCount };
|
|
255
|
+
}
|
|
256
|
+
/** Step forward/backward in trace playback */
|
|
257
|
+
async stepTrace(delta) {
|
|
258
|
+
const response = await this.sendCommand('step_trace', {
|
|
259
|
+
sessionId: this.sessionId,
|
|
260
|
+
delta,
|
|
261
|
+
});
|
|
262
|
+
return {
|
|
263
|
+
index: response.index,
|
|
264
|
+
total: response.total,
|
|
265
|
+
entry: response.entry,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/** Pause trace playback */
|
|
269
|
+
async pauseTrace() {
|
|
270
|
+
const response = await this.sendCommand('pause_trace', {
|
|
271
|
+
sessionId: this.sessionId,
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
index: response.index,
|
|
275
|
+
total: response.total,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/** Get trace playback status */
|
|
279
|
+
async getTraceStatus() {
|
|
280
|
+
const response = await this.sendCommand('trace_status', {
|
|
281
|
+
sessionId: this.sessionId,
|
|
282
|
+
});
|
|
283
|
+
return response;
|
|
284
|
+
}
|
|
285
|
+
/** Set a variable value during simulation */
|
|
286
|
+
async setVariable(name, value) {
|
|
287
|
+
await this.sendCommand('set_variable', {
|
|
288
|
+
sessionId: this.sessionId,
|
|
289
|
+
name,
|
|
290
|
+
value,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// --- Private methods ---
|
|
294
|
+
getCurrentState() {
|
|
295
|
+
return {
|
|
296
|
+
sessionId: this.sessionId || '',
|
|
297
|
+
activeStates: [...this.activeStates],
|
|
298
|
+
variables: { ...this.variables },
|
|
299
|
+
enabledEvents: [...this.enabledEvents],
|
|
300
|
+
finished: this.finished,
|
|
301
|
+
mode: this.mode,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
drainTrace() {
|
|
305
|
+
const trace = [...this.traceBuffer];
|
|
306
|
+
this.traceBuffer = [];
|
|
307
|
+
return trace;
|
|
308
|
+
}
|
|
309
|
+
async waitForSettle(timeoutMs = 2000) {
|
|
310
|
+
return new Promise((resolve) => {
|
|
311
|
+
let lastEventTime = Date.now();
|
|
312
|
+
let lastSeenLen = this.traceBuffer.length;
|
|
313
|
+
const startTime = Date.now();
|
|
314
|
+
const check = () => {
|
|
315
|
+
const now = Date.now();
|
|
316
|
+
const currentLen = this.traceBuffer.length;
|
|
317
|
+
const newEvents = currentLen > lastSeenLen;
|
|
318
|
+
if (this.finished) {
|
|
319
|
+
resolve();
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (newEvents) {
|
|
323
|
+
lastEventTime = now;
|
|
324
|
+
lastSeenLen = currentLen;
|
|
325
|
+
}
|
|
326
|
+
if (now - lastEventTime >= 50) {
|
|
327
|
+
resolve();
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (now - startTime >= timeoutMs) {
|
|
331
|
+
resolve();
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
setTimeout(check, 10);
|
|
335
|
+
};
|
|
336
|
+
setTimeout(check, 50);
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
handleMessage(data) {
|
|
340
|
+
let msg;
|
|
341
|
+
try {
|
|
342
|
+
msg = JSON.parse(data);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const type = msg.type;
|
|
348
|
+
// Check if this message resolves a pending command
|
|
349
|
+
if (this.pendingResolve) {
|
|
350
|
+
if (type === 'error') {
|
|
351
|
+
// Errors always resolve pending commands
|
|
352
|
+
clearTimeout(this.pendingResolve.timer);
|
|
353
|
+
const pending = this.pendingResolve;
|
|
354
|
+
this.pendingResolve = null;
|
|
355
|
+
pending.reject(new Error(msg.message || msg.error || 'Unknown error'));
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (this.pendingResolve.expectedTypes.includes(type)) {
|
|
359
|
+
clearTimeout(this.pendingResolve.timer);
|
|
360
|
+
const pending = this.pendingResolve;
|
|
361
|
+
this.pendingResolve = null;
|
|
362
|
+
pending.resolve(msg);
|
|
363
|
+
// Fall through to also process as broadcast event
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Buffer broadcast events
|
|
367
|
+
switch (type) {
|
|
368
|
+
case 'state_update': {
|
|
369
|
+
const eventType = msg.eventType;
|
|
370
|
+
const stateId = msg.stateId;
|
|
371
|
+
this.traceBuffer.push({
|
|
372
|
+
type: eventType === 'enter' ? 'state_enter' : 'state_exit',
|
|
373
|
+
state: stateId,
|
|
374
|
+
});
|
|
375
|
+
if (msg.activeStates)
|
|
376
|
+
this.activeStates = msg.activeStates;
|
|
377
|
+
if (msg.variables)
|
|
378
|
+
this.variables = msg.variables;
|
|
379
|
+
if (msg.enabledEvents)
|
|
380
|
+
this.enabledEvents = msg.enabledEvents;
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
case 'transition_fired':
|
|
384
|
+
this.traceBuffer.push({
|
|
385
|
+
type: 'transition',
|
|
386
|
+
from: msg.from,
|
|
387
|
+
to: msg.to,
|
|
388
|
+
event: msg.event,
|
|
389
|
+
});
|
|
390
|
+
if (msg.activeStates)
|
|
391
|
+
this.activeStates = msg.activeStates;
|
|
392
|
+
break;
|
|
393
|
+
case 'variable_changed':
|
|
394
|
+
this.traceBuffer.push({
|
|
395
|
+
type: 'variable_changed',
|
|
396
|
+
name: msg.name,
|
|
397
|
+
oldValue: msg.oldValue,
|
|
398
|
+
newValue: msg.newValue,
|
|
399
|
+
});
|
|
400
|
+
break;
|
|
401
|
+
case 'started':
|
|
402
|
+
this.traceBuffer.push({ type: 'started' });
|
|
403
|
+
if (msg.activeStates)
|
|
404
|
+
this.activeStates = msg.activeStates;
|
|
405
|
+
this.finished = false;
|
|
406
|
+
break;
|
|
407
|
+
case 'finished':
|
|
408
|
+
this.traceBuffer.push({ type: 'finished' });
|
|
409
|
+
this.finished = true;
|
|
410
|
+
break;
|
|
411
|
+
case 'log':
|
|
412
|
+
this.traceBuffer.push({
|
|
413
|
+
type: 'log',
|
|
414
|
+
message: `${msg.label || ''}: ${msg.message || ''}`.trim(),
|
|
415
|
+
});
|
|
416
|
+
break;
|
|
417
|
+
case 'session_info':
|
|
418
|
+
// Auto-association welcome message
|
|
419
|
+
if (msg.sessionId)
|
|
420
|
+
this.sessionId = msg.sessionId;
|
|
421
|
+
break;
|
|
422
|
+
case 'session_created':
|
|
423
|
+
if (msg.sessionId)
|
|
424
|
+
this.sessionId = msg.sessionId;
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
sendCommand(action, params = {}, timeoutMs = 10000) {
|
|
429
|
+
return new Promise((resolve, reject) => {
|
|
430
|
+
if (!this.ws || !this.connected) {
|
|
431
|
+
reject(new Error('Not connected to simulator'));
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
const expectedTypes = RESPONSE_TYPES[action] || ['success'];
|
|
435
|
+
const message = JSON.stringify({
|
|
436
|
+
type: 'command',
|
|
437
|
+
action,
|
|
438
|
+
...params,
|
|
439
|
+
});
|
|
440
|
+
const timer = setTimeout(() => {
|
|
441
|
+
if (this.pendingResolve) {
|
|
442
|
+
this.pendingResolve = null;
|
|
443
|
+
}
|
|
444
|
+
reject(new Error(`Command '${action}' timed out after ${timeoutMs}ms`));
|
|
445
|
+
}, timeoutMs);
|
|
446
|
+
this.pendingResolve = { expectedTypes, resolve, reject, timer };
|
|
447
|
+
this.ws.send(message);
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=simulator-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator-bridge.js","sourceRoot":"","sources":["../../src/bridges/simulator-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpConfig } from './types.js';
|
|
2
|
+
export { createServer } from './server.js';
|
|
3
|
+
export type { McpConfig } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Start the MCP server with stdio transport.
|
|
6
|
+
* This is the main entry point when running as an MCP server.
|
|
7
|
+
*/
|
|
8
|
+
export declare function startStdio(config?: McpConfig): Promise<void>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import { createServer } from './server.js';
|
|
3
|
+
import { ProcessManager } from './process-manager.js';
|
|
4
|
+
export { createServer } from './server.js';
|
|
5
|
+
/**
|
|
6
|
+
* Start the MCP server with stdio transport.
|
|
7
|
+
* This is the main entry point when running as an MCP server.
|
|
8
|
+
*/
|
|
9
|
+
export async function startStdio(config = {}) {
|
|
10
|
+
const processManager = new ProcessManager();
|
|
11
|
+
// Auto-discover backends
|
|
12
|
+
const genUrl = await processManager.ensureGenerator(config.generatorUrl);
|
|
13
|
+
if (genUrl) {
|
|
14
|
+
config.generatorUrl = genUrl;
|
|
15
|
+
console.error(`[MCP] Generator: ${genUrl}`);
|
|
16
|
+
}
|
|
17
|
+
const simUrl = await processManager.ensureSimulator(config.simulatorUrl);
|
|
18
|
+
if (simUrl) {
|
|
19
|
+
config.simulatorUrl = simUrl;
|
|
20
|
+
console.error(`[MCP] Simulator: ${simUrl}`);
|
|
21
|
+
}
|
|
22
|
+
const server = createServer(config);
|
|
23
|
+
const transport = new StdioServerTransport();
|
|
24
|
+
// Cleanup on exit
|
|
25
|
+
process.on('SIGINT', () => { processManager.shutdown(); process.exit(0); });
|
|
26
|
+
process.on('SIGTERM', () => { processManager.shutdown(); process.exit(0); });
|
|
27
|
+
await server.connect(transport);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAoB,EAAE;IACrD,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAE5C,yBAAyB;IACzB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ChildProcess } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Discovers and optionally auto-spawns VSCXML backend processes.
|
|
4
|
+
*
|
|
5
|
+
* Discovery order for each backend:
|
|
6
|
+
* 1. Environment variable (VSCXML_GENERATOR_URL, etc.)
|
|
7
|
+
* 2. MCP config args (--generator, --simulator)
|
|
8
|
+
* 3. Default ports (probe localhost)
|
|
9
|
+
* 4. Auto-spawn from known install paths
|
|
10
|
+
*/
|
|
11
|
+
export declare class ProcessManager {
|
|
12
|
+
private children;
|
|
13
|
+
/** Discover the generator URL */
|
|
14
|
+
discoverGenerator(configUrl?: string): Promise<string | null>;
|
|
15
|
+
/** Discover the simulator URL */
|
|
16
|
+
discoverSimulator(configUrl?: string): Promise<string | null>;
|
|
17
|
+
/** Discover the editor URL */
|
|
18
|
+
discoverEditor(configUrl?: string): Promise<string | null>;
|
|
19
|
+
/** Get known install paths for the generator CLI */
|
|
20
|
+
getGeneratorPaths(): string[];
|
|
21
|
+
/** Get known install paths for the simulator */
|
|
22
|
+
getSimulatorPaths(): string[];
|
|
23
|
+
/** Spawn a generator process */
|
|
24
|
+
spawnGenerator(execPath: string, port?: number): ChildProcess;
|
|
25
|
+
/** Spawn a simulator process */
|
|
26
|
+
spawnSimulator(execPath: string, wsPort?: number, restPort?: number): ChildProcess;
|
|
27
|
+
/** Shut down all spawned child processes */
|
|
28
|
+
shutdown(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Auto-discover and optionally spawn the generator backend.
|
|
31
|
+
* Returns the URL if available, null if not.
|
|
32
|
+
*/
|
|
33
|
+
ensureGenerator(configUrl?: string): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Auto-discover and optionally spawn the simulator backend.
|
|
36
|
+
*/
|
|
37
|
+
ensureSimulator(configUrl?: string): Promise<string | null>;
|
|
38
|
+
private waitForHealth;
|
|
39
|
+
private waitForWs;
|
|
40
|
+
private probeHttp;
|
|
41
|
+
private probeWs;
|
|
42
|
+
}
|