@ngocsangairvds/vsaf 4.0.17 → 4.1.1

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 (120) hide show
  1. package/package.json +5 -2
  2. package/packages/cli/dist/commands/doctor.d.ts +1 -0
  3. package/packages/cli/dist/commands/doctor.d.ts.map +1 -1
  4. package/packages/cli/dist/commands/doctor.js +5 -4
  5. package/packages/cli/dist/commands/doctor.js.map +1 -1
  6. package/packages/cli/dist/commands/init.d.ts.map +1 -1
  7. package/packages/cli/dist/commands/init.js +15 -6
  8. package/packages/cli/dist/commands/init.js.map +1 -1
  9. package/packages/cli/dist/commands/list.js +8 -1
  10. package/packages/cli/dist/commands/list.js.map +1 -1
  11. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  12. package/packages/cli/dist/commands/run.js +17 -4
  13. package/packages/cli/dist/commands/run.js.map +1 -1
  14. package/packages/cli/dist/commands/skill.d.ts.map +1 -1
  15. package/packages/cli/dist/commands/skill.js +14 -2
  16. package/packages/cli/dist/commands/skill.js.map +1 -1
  17. package/packages/cli/dist/index.js +8 -2
  18. package/packages/cli/dist/index.js.map +1 -1
  19. package/packages/cli/dist/mcp/server.d.ts +22 -0
  20. package/packages/cli/dist/mcp/server.d.ts.map +1 -1
  21. package/packages/cli/dist/mcp/server.js +311 -20
  22. package/packages/cli/dist/mcp/server.js.map +1 -1
  23. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  24. package/packages/cli/dist/server/routes/runs.js +7 -1
  25. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  26. package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
  27. package/packages/cli/dist/server/routes/workflows.js +3 -0
  28. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  29. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  30. package/packages/cli/dist/server/services/execution-manager.js +68 -41
  31. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  32. package/packages/cli/dist/server/services/sse-manager.d.ts.map +1 -1
  33. package/packages/cli/dist/server/services/sse-manager.js +7 -2
  34. package/packages/cli/dist/server/services/sse-manager.js.map +1 -1
  35. package/packages/core/dist/commands/command-loader.d.ts.map +1 -1
  36. package/packages/core/dist/commands/command-loader.js +3 -0
  37. package/packages/core/dist/commands/command-loader.js.map +1 -1
  38. package/packages/core/dist/engine/condition-evaluator.js +3 -2
  39. package/packages/core/dist/engine/condition-evaluator.js.map +1 -1
  40. package/packages/core/dist/engine/dag-executor.d.ts +28 -1
  41. package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
  42. package/packages/core/dist/engine/dag-executor.js +279 -131
  43. package/packages/core/dist/engine/dag-executor.js.map +1 -1
  44. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  45. package/packages/core/dist/engine/dag-parser.js +2 -0
  46. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  47. package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
  48. package/packages/core/dist/engine/node-runner.js +12 -1
  49. package/packages/core/dist/engine/node-runner.js.map +1 -1
  50. package/packages/core/dist/engine/variable-resolver.d.ts +1 -1
  51. package/packages/core/dist/engine/variable-resolver.d.ts.map +1 -1
  52. package/packages/core/dist/engine/variable-resolver.js +21 -11
  53. package/packages/core/dist/engine/variable-resolver.js.map +1 -1
  54. package/packages/core/dist/index.d.ts +5 -1
  55. package/packages/core/dist/index.d.ts.map +1 -1
  56. package/packages/core/dist/index.js +13 -3
  57. package/packages/core/dist/index.js.map +1 -1
  58. package/packages/core/dist/isolation/artifact-store.d.ts.map +1 -1
  59. package/packages/core/dist/isolation/artifact-store.js +30 -5
  60. package/packages/core/dist/isolation/artifact-store.js.map +1 -1
  61. package/packages/core/dist/isolation/workspace-manager.d.ts +2 -0
  62. package/packages/core/dist/isolation/workspace-manager.d.ts.map +1 -1
  63. package/packages/core/dist/isolation/workspace-manager.js +81 -7
  64. package/packages/core/dist/isolation/workspace-manager.js.map +1 -1
  65. package/packages/core/dist/schema/workflow-schema.d.ts +10 -0
  66. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  67. package/packages/core/dist/schema/workflow-schema.js +5 -3
  68. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  69. package/packages/core/dist/skills/skill-loader.d.ts.map +1 -1
  70. package/packages/core/dist/skills/skill-loader.js +7 -0
  71. package/packages/core/dist/skills/skill-loader.js.map +1 -1
  72. package/packages/core/dist/store/atomic.d.ts +11 -0
  73. package/packages/core/dist/store/atomic.d.ts.map +1 -0
  74. package/packages/core/dist/store/atomic.js +51 -0
  75. package/packages/core/dist/store/atomic.js.map +1 -0
  76. package/packages/core/dist/store/recovery.d.ts +3 -0
  77. package/packages/core/dist/store/recovery.d.ts.map +1 -0
  78. package/packages/core/dist/store/recovery.js +206 -0
  79. package/packages/core/dist/store/recovery.js.map +1 -0
  80. package/packages/core/dist/store/run-lock.d.ts +9 -0
  81. package/packages/core/dist/store/run-lock.d.ts.map +1 -0
  82. package/packages/core/dist/store/run-lock.js +62 -0
  83. package/packages/core/dist/store/run-lock.js.map +1 -0
  84. package/packages/core/dist/store/run-store.d.ts +20 -7
  85. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  86. package/packages/core/dist/store/run-store.js +175 -34
  87. package/packages/core/dist/store/run-store.js.map +1 -1
  88. package/packages/core/dist/store/snapshot.d.ts +4 -0
  89. package/packages/core/dist/store/snapshot.d.ts.map +1 -0
  90. package/packages/core/dist/store/snapshot.js +59 -0
  91. package/packages/core/dist/store/snapshot.js.map +1 -0
  92. package/packages/core/dist/store/types.d.ts +89 -4
  93. package/packages/core/dist/store/types.d.ts.map +1 -1
  94. package/packages/core/dist/store/types.js +14 -0
  95. package/packages/core/dist/store/types.js.map +1 -1
  96. package/packages/core/dist/store/wal.d.ts +39 -0
  97. package/packages/core/dist/store/wal.d.ts.map +1 -0
  98. package/packages/core/dist/store/wal.js +203 -0
  99. package/packages/core/dist/store/wal.js.map +1 -0
  100. package/packages/core/dist/types/dag.d.ts +2 -0
  101. package/packages/core/dist/types/dag.d.ts.map +1 -1
  102. package/packages/core/dist/types/workflow.d.ts +5 -3
  103. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  104. package/packages/web/dist/web/3rdpartylicenses.txt +614 -0
  105. package/packages/web/dist/web/browser/chunk-2QJBTGYU.js +3 -0
  106. package/packages/web/dist/web/browser/chunk-3VYLP4FZ.js +1 -0
  107. package/packages/web/dist/web/browser/chunk-6HRQZQXD.js +1 -0
  108. package/packages/web/dist/web/browser/chunk-7PK6Q4UU.js +1 -0
  109. package/packages/web/dist/web/browser/chunk-O7TQGEFF.js +8 -0
  110. package/packages/web/dist/web/browser/chunk-PWF76NCM.js +1 -0
  111. package/packages/web/dist/web/browser/favicon.ico +0 -0
  112. package/packages/web/dist/web/browser/index.html +13 -0
  113. package/packages/web/dist/web/browser/main-AZU5W3KI.js +1 -0
  114. package/packages/web/dist/web/browser/polyfills-YMBILSHJ.js +2 -0
  115. package/packages/web/dist/web/browser/styles-JBPZVY54.css +1 -0
  116. package/packages/web/dist/web/prerendered-routes.json +3 -0
  117. package/packages/core/dist/store/event-log.d.ts +0 -8
  118. package/packages/core/dist/store/event-log.d.ts.map +0 -1
  119. package/packages/core/dist/store/event-log.js +0 -30
  120. package/packages/core/dist/store/event-log.js.map +0 -1
@@ -8,13 +8,24 @@ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
8
8
  const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
9
9
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
10
10
  const core_1 = require("@vsaf/core");
11
+ const MAX_EXECUTORS = 10;
12
+ const IDLE_TTL_MS = 30 * 60 * 1000; // 30 minutes
11
13
  class VSAFEngine {
12
14
  executors = new Map();
13
15
  workspaces = new Map();
14
16
  runMeta = new Map();
15
17
  runStores = new Map();
16
18
  failedRuns = new Set();
19
+ runLocks = new Map();
20
+ shuttingDown = false;
21
+ constructor() {
22
+ const onShutdown = () => { this.shutdown(); };
23
+ process.on('SIGINT', onShutdown);
24
+ process.on('SIGTERM', onShutdown);
25
+ }
17
26
  async start(params) {
27
+ // Evict stale executors before starting a new run
28
+ this.evict();
18
29
  const config = (0, core_1.loadConfig)(params.projectPath);
19
30
  const workflowPath = (0, path_1.join)(params.projectPath, '.vsaf', 'workflows', `${params.workflow}.yaml`);
20
31
  if (!(0, fs_1.existsSync)(workflowPath)) {
@@ -22,11 +33,20 @@ class VSAFEngine {
22
33
  }
23
34
  const yamlContent = (0, fs_1.readFileSync)(workflowPath, 'utf-8');
24
35
  const graph = (0, core_1.parseWorkflow)(yamlContent);
36
+ const storeDir = (0, path_1.join)(params.projectPath, '.vsaf', 'storage');
37
+ // Initialize RunLock for this storage directory
38
+ if (!this.runLocks.has(storeDir)) {
39
+ this.runLocks.set(storeDir, new core_1.RunLock(storeDir));
40
+ }
41
+ // Prune orphan workspaces before creating new ones
25
42
  const wsManager = new core_1.WorkspaceManager({ exclude: config.isolation.exclude });
43
+ try {
44
+ await wsManager.pruneOrphans(params.projectPath, storeDir);
45
+ }
46
+ catch { /* pruneOrphans is best-effort */ }
26
47
  const ws = await wsManager.create(params.projectPath, params.workflow);
27
- const storeDir = (0, path_1.join)(params.projectPath, '.vsaf', 'storage');
28
48
  const runStore = new core_1.RunStore(storeDir);
29
- const run = runStore.create(params.workflow, params.args, ws.sourcePath, ws.artifactsPath, params.projectPath);
49
+ const run = runStore.create(params.workflow, params.args, ws.sourcePath, ws.artifactsPath, params.projectPath, yamlContent, ws.branchName);
30
50
  const callbacks = {
31
51
  onNodeStart: (nodeId) => {
32
52
  runStore.updateNode(run.runId, nodeId, { status: 'running', startedAt: new Date().toISOString() });
@@ -40,17 +60,31 @@ class VSAFEngine {
40
60
  runStore.updateNode(run.runId, nodeId, { status: 'skipped' });
41
61
  runStore.save(run.runId);
42
62
  },
43
- onNodeFail: (nodeId, error) => {
44
- runStore.updateNode(run.runId, nodeId, { status: 'failed', error });
63
+ onNodeFail: (nodeId, error, retryCount) => {
64
+ runStore.updateNode(run.runId, nodeId, { status: 'failed', error }, { retryCount });
45
65
  runStore.save(run.runId);
46
66
  },
67
+ onNodeReset: (nodeId) => {
68
+ runStore.resetNode(run.runId, nodeId);
69
+ },
47
70
  };
48
71
  const executor = new core_1.DAGExecutor(ws.sourcePath, params.projectPath, graph, callbacks);
49
- this.executors.set(run.runId, executor);
72
+ this.executors.set(run.runId, {
73
+ executor,
74
+ lastAccess: Date.now(),
75
+ status: 'active',
76
+ });
50
77
  this.workspaces.set(run.runId, { manager: wsManager, wsId: ws.id });
51
- this.runMeta.set(run.runId, { workflow: params.workflow, projectPath: params.projectPath });
78
+ this.runMeta.set(run.runId, { workflow: params.workflow, projectPath: params.projectPath, storeDir });
52
79
  this.runStores.set(run.runId, runStore);
53
- const step = await executor.step({ args: params.args, artifactsDir: ws.artifactsPath });
80
+ let step;
81
+ try {
82
+ step = await this.lockedStep(run.runId, { args: params.args, artifactsDir: ws.artifactsPath });
83
+ }
84
+ catch (err) {
85
+ await this.cleanupRun(run.runId);
86
+ throw err;
87
+ }
54
88
  if (step.type === 'done') {
55
89
  await this.finishRun(run.runId);
56
90
  }
@@ -61,16 +95,33 @@ class VSAFEngine {
61
95
  return { runId: run.runId, step };
62
96
  }
63
97
  async next(params) {
64
- const executor = this.executors.get(params.runId);
65
- if (!executor)
98
+ const entry = this.executors.get(params.runId);
99
+ if (!entry)
66
100
  throw new Error(`Run not found: ${params.runId}`);
101
+ entry.lastAccess = Date.now();
67
102
  const runStore = this.runStores.get(params.runId);
68
- const step = await executor.step({
69
- completedResults: params.results.map(r => ({
70
- nodeId: r.nodeId,
71
- output: r.output,
72
- })),
73
- });
103
+ let step;
104
+ try {
105
+ step = await this.lockedStep(params.runId, {
106
+ completedResults: params.results.map(r => {
107
+ let structured = r.structuredOutput;
108
+ if (!structured) {
109
+ try {
110
+ const parsed = JSON.parse(r.output);
111
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
112
+ structured = parsed;
113
+ }
114
+ }
115
+ catch { /* leave undefined */ }
116
+ }
117
+ return { nodeId: r.nodeId, output: r.output, structuredOutput: structured };
118
+ }),
119
+ });
120
+ }
121
+ catch (err) {
122
+ await this.cleanupRun(params.runId);
123
+ throw err;
124
+ }
74
125
  if (step.type === 'done') {
75
126
  await this.finishRun(params.runId);
76
127
  }
@@ -84,10 +135,10 @@ class VSAFEngine {
84
135
  const meta = this.runMeta.get(params.runId);
85
136
  if (!meta)
86
137
  throw new Error(`Run not found: ${params.runId}`);
87
- const hasExecutor = this.executors.has(params.runId);
138
+ const entry = this.executors.get(params.runId);
88
139
  let status;
89
- if (hasExecutor) {
90
- status = 'running';
140
+ if (entry) {
141
+ status = entry.status === 'done' ? 'completed' : 'running';
91
142
  }
92
143
  else if (this.failedRuns.has(params.runId)) {
93
144
  status = 'failed';
@@ -95,12 +146,212 @@ class VSAFEngine {
95
146
  else {
96
147
  status = 'completed';
97
148
  }
149
+ let nodes = entry?.executor.getNodeSummaries();
150
+ // Fallback to RunStore when executor is evicted
151
+ if (!nodes) {
152
+ const runStore = this.runStores.get(params.runId) ?? new core_1.RunStore(meta.storeDir);
153
+ const run = runStore.load(params.runId);
154
+ if (run) {
155
+ nodes = run.nodes;
156
+ if (run.status === 'failed')
157
+ status = 'failed';
158
+ else if (run.status === 'completed')
159
+ status = 'completed';
160
+ }
161
+ }
98
162
  return {
99
163
  runId: params.runId,
100
164
  workflow: meta.workflow,
101
165
  status,
166
+ nodes,
102
167
  };
103
168
  }
169
+ async resume(params) {
170
+ const existingEntry = this.executors.get(params.runId);
171
+ if (existingEntry?.status === 'active') {
172
+ throw new Error(`Run is already active: ${params.runId}`);
173
+ }
174
+ const storeDir = (0, path_1.join)(params.projectPath, '.vsaf', 'storage');
175
+ const runDir = (0, path_1.join)(storeDir, params.runId);
176
+ if (!(0, fs_1.existsSync)(runDir)) {
177
+ throw new Error(`Run directory not found: ${params.runId}`);
178
+ }
179
+ const state = (0, core_1.recoverState)(runDir);
180
+ if (!state) {
181
+ throw new Error(`Cannot recover state for run: ${params.runId}`);
182
+ }
183
+ // Reject resuming terminal runs
184
+ if (state.runStatus === 'completed' || state.runStatus === 'failed') {
185
+ throw new Error(`Cannot resume ${state.runStatus} run: ${params.runId}`);
186
+ }
187
+ // Verify workspace directory still exists
188
+ if (!(0, fs_1.existsSync)(state.workspacePath)) {
189
+ throw new Error(`Workspace directory missing for run ${params.runId}: ${state.workspacePath}`);
190
+ }
191
+ // Parse workflow from recovered YAML
192
+ if (!state.workflowYaml) {
193
+ throw new Error(`No workflow YAML in recovered state for run: ${params.runId}`);
194
+ }
195
+ const graph = (0, core_1.parseWorkflow)(state.workflowYaml);
196
+ // Add unstarted nodes to pending so they are not lost after crash recovery
197
+ for (const nodeId of graph.nodes.keys()) {
198
+ if (!state.completed.has(nodeId) && !state.failed.has(nodeId) && !state.skipped.has(nodeId)) {
199
+ state.pending.add(nodeId);
200
+ }
201
+ }
202
+ // Initialize RunLock
203
+ if (!this.runLocks.has(storeDir)) {
204
+ this.runLocks.set(storeDir, new core_1.RunLock(storeDir));
205
+ }
206
+ const runStore = new core_1.RunStore(storeDir);
207
+ // Load the run into the store's in-memory cache
208
+ runStore.load(params.runId);
209
+ const callbacks = {
210
+ onNodeStart: (nodeId) => {
211
+ runStore.updateNode(params.runId, nodeId, { status: 'running', startedAt: new Date().toISOString() });
212
+ runStore.save(params.runId);
213
+ },
214
+ onNodeComplete: (nodeId, result) => {
215
+ runStore.updateNode(params.runId, nodeId, result);
216
+ runStore.save(params.runId);
217
+ },
218
+ onNodeSkip: (nodeId) => {
219
+ runStore.updateNode(params.runId, nodeId, { status: 'skipped' });
220
+ runStore.save(params.runId);
221
+ },
222
+ onNodeFail: (nodeId, error, retryCount) => {
223
+ runStore.updateNode(params.runId, nodeId, { status: 'failed', error }, { retryCount });
224
+ runStore.save(params.runId);
225
+ },
226
+ onNodeReset: (nodeId) => {
227
+ runStore.resetNode(params.runId, nodeId);
228
+ },
229
+ };
230
+ const executor = core_1.DAGExecutor.fromRecoveredState(state.workspacePath, state.projectPath, graph, callbacks, {
231
+ pending: state.pending,
232
+ completed: state.completed,
233
+ failed: state.failed,
234
+ skipped: state.skipped,
235
+ nodeResults: state.nodeResults,
236
+ retryCounts: state.retryCounts,
237
+ args: state.args,
238
+ artifactsPath: state.artifactsPath,
239
+ });
240
+ this.executors.set(params.runId, {
241
+ executor,
242
+ lastAccess: Date.now(),
243
+ status: 'active',
244
+ });
245
+ this.runMeta.set(params.runId, { workflow: state.workflow, projectPath: state.projectPath, storeDir });
246
+ this.runStores.set(params.runId, runStore);
247
+ // Re-register workspace so finishRun can apply changes and destroy it
248
+ const config = (0, core_1.loadConfig)(params.projectPath);
249
+ const wsManager = new core_1.WorkspaceManager({ exclude: config.isolation.exclude });
250
+ const wsType = (0, fs_1.existsSync)((0, path_1.join)(state.workspacePath, '.git'))
251
+ ? 'worktree'
252
+ : 'ephemeral';
253
+ wsManager.adopt(params.runId, state.workspacePath, state.artifactsPath, state.projectPath, wsType, state.branchName);
254
+ this.workspaces.set(params.runId, { manager: wsManager, wsId: params.runId });
255
+ // Step the resumed executor to get next pending work
256
+ let step;
257
+ try {
258
+ step = await this.lockedStep(params.runId, {});
259
+ }
260
+ catch (err) {
261
+ await this.cleanupRun(params.runId);
262
+ throw err;
263
+ }
264
+ if (step.type === 'done') {
265
+ await this.finishRun(params.runId);
266
+ }
267
+ else if (step.type === 'failed') {
268
+ runStore.fail(params.runId);
269
+ await this.cleanupRun(params.runId);
270
+ }
271
+ return { runId: params.runId, step };
272
+ }
273
+ listRuns(projectPath) {
274
+ const storeDir = (0, path_1.join)(projectPath, '.vsaf', 'storage');
275
+ if (!(0, fs_1.existsSync)(storeDir))
276
+ return [];
277
+ const runStore = new core_1.RunStore(storeDir);
278
+ return runStore.listResumable();
279
+ }
280
+ async lockedStep(runId, input) {
281
+ const entry = this.executors.get(runId);
282
+ if (!entry)
283
+ throw new Error(`Run not found: ${runId}`);
284
+ const meta = this.runMeta.get(runId);
285
+ const lock = meta ? this.runLocks.get(meta.storeDir) : undefined;
286
+ if (lock) {
287
+ const acquired = lock.acquire(runId);
288
+ if (!acquired) {
289
+ throw new Error(`Could not acquire lock for run: ${runId}`);
290
+ }
291
+ }
292
+ try {
293
+ return await entry.executor.step(input);
294
+ }
295
+ finally {
296
+ if (lock) {
297
+ lock.release(runId);
298
+ }
299
+ }
300
+ }
301
+ evict() {
302
+ const now = Date.now();
303
+ // First pass: remove done executors past TTL
304
+ for (const [runId, entry] of this.executors) {
305
+ if (entry.status === 'done' && (now - entry.lastAccess) > IDLE_TTL_MS) {
306
+ this.executors.delete(runId);
307
+ this.workspaces.delete(runId);
308
+ this.runStores.delete(runId);
309
+ // Note: keep runMeta to support status() fallback; note: runMeta is small (3 strings per run)
310
+ this.failedRuns.delete(runId);
311
+ }
312
+ }
313
+ // Second pass: if still over max, remove oldest done entries (never evict active)
314
+ if (this.executors.size > MAX_EXECUTORS) {
315
+ const sorted = [...this.executors.entries()]
316
+ .filter(([, e]) => e.status === 'done')
317
+ .sort((a, b) => a[1].lastAccess - b[1].lastAccess);
318
+ while (this.executors.size > MAX_EXECUTORS && sorted.length > 0) {
319
+ const [runId] = sorted.shift();
320
+ this.executors.delete(runId);
321
+ this.workspaces.delete(runId);
322
+ this.runStores.delete(runId);
323
+ // Note: keep runMeta to support status() fallback; note: runMeta is small (3 strings per run)
324
+ this.failedRuns.delete(runId);
325
+ }
326
+ }
327
+ }
328
+ shutdown() {
329
+ if (this.shuttingDown)
330
+ return;
331
+ this.shuttingDown = true;
332
+ // Release all locks
333
+ for (const [runId, meta] of this.runMeta) {
334
+ const lock = this.runLocks.get(meta.storeDir);
335
+ if (lock) {
336
+ try {
337
+ lock.release(runId);
338
+ }
339
+ catch { /* best-effort */ }
340
+ }
341
+ }
342
+ // Write final snapshots for all active runs
343
+ for (const [runId, entry] of this.executors) {
344
+ if (entry.status === 'active') {
345
+ const runStore = this.runStores.get(runId);
346
+ if (runStore) {
347
+ try {
348
+ runStore.snapshotSync(runId);
349
+ }
350
+ catch { /* best-effort */ }
351
+ }
352
+ }
353
+ }
354
+ }
104
355
  async cleanupRun(runId) {
105
356
  this.failedRuns.add(runId);
106
357
  const wsInfo = this.workspaces.get(runId);
@@ -122,11 +373,19 @@ class VSAFEngine {
122
373
  if (wsInfo) {
123
374
  try {
124
375
  await wsInfo.manager.applyChanges(wsInfo.wsId);
376
+ }
377
+ catch { /* apply is best-effort */ }
378
+ try {
125
379
  await wsInfo.manager.destroy(wsInfo.wsId);
126
380
  }
127
- catch { /* workspace cleanup is best-effort */ }
381
+ catch { /* destroy is best-effort */ }
382
+ }
383
+ // Mark as done rather than deleting, so eviction can clean up later
384
+ const entry = this.executors.get(runId);
385
+ if (entry) {
386
+ entry.status = 'done';
387
+ entry.lastAccess = Date.now();
128
388
  }
129
- this.executors.delete(runId);
130
389
  this.workspaces.delete(runId);
131
390
  this.runStores.delete(runId);
132
391
  }
@@ -164,6 +423,7 @@ async function startMCPServer() {
164
423
  properties: {
165
424
  nodeId: { type: 'string' },
166
425
  output: { type: 'string' },
426
+ structuredOutput: { type: 'object', description: 'Structured output (auto-parsed from JSON if not provided)' },
167
427
  },
168
428
  required: ['nodeId', 'output'],
169
429
  },
@@ -184,6 +444,29 @@ async function startMCPServer() {
184
444
  required: ['runId'],
185
445
  },
186
446
  },
447
+ {
448
+ name: 'vsaf_resume',
449
+ description: 'Resume a crashed or interrupted workflow run from its WAL.',
450
+ inputSchema: {
451
+ type: 'object',
452
+ properties: {
453
+ runId: { type: 'string', description: 'Run ID to resume' },
454
+ projectPath: { type: 'string', description: 'Project root path' },
455
+ },
456
+ required: ['runId', 'projectPath'],
457
+ },
458
+ },
459
+ {
460
+ name: 'vsaf_list_runs',
461
+ description: 'List resumable (non-completed) workflow runs.',
462
+ inputSchema: {
463
+ type: 'object',
464
+ properties: {
465
+ projectPath: { type: 'string', description: 'Project root path' },
466
+ },
467
+ required: ['projectPath'],
468
+ },
469
+ },
187
470
  ],
188
471
  }));
189
472
  server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
@@ -202,6 +485,14 @@ async function startMCPServer() {
202
485
  const result = engine.status(args);
203
486
  return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
204
487
  }
488
+ case 'vsaf_resume': {
489
+ const result = await engine.resume(args);
490
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
491
+ }
492
+ case 'vsaf_list_runs': {
493
+ const result = engine.listRuns(args.projectPath);
494
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
495
+ }
205
496
  default:
206
497
  throw new Error(`Unknown tool: ${request.params.name}`);
207
498
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACxF,OAAO,CAAC,IAAI,CAAC,CAuDf"}
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACxF,OAAO,CAAC,IAAI,CAAC,CA6Df"}
@@ -24,8 +24,14 @@ async function runRoutes(app, opts) {
24
24
  return run;
25
25
  });
26
26
  app.post('/runs', async (request, reply) => {
27
- const { workflow, args } = request.body;
28
27
  try {
28
+ const { workflow, args } = request.body ?? {};
29
+ if (!workflow || typeof workflow !== 'string') {
30
+ return reply.status(400).send({ error: 'Missing required field: workflow' });
31
+ }
32
+ if (workflow.includes('..') || workflow.includes('/') || workflow.includes('\\')) {
33
+ return reply.status(400).send({ error: 'Invalid workflow name' });
34
+ }
29
35
  const { runId } = await opts.executionManager.startRun(workflow, args ?? '');
30
36
  return reply.status(202).send({ runId });
31
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../../../src/server/routes/runs.ts"],"names":[],"mappings":";;AAMA,8BAgEC;AArED,+BAA4B;AAC5B,qCAAsC;AAI/B,KAAK,UAAU,SAAS,CAC7B,GAAoB,EACpB,IAAyF;IAEzF,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE5D,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,eAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAgC,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9E,MAAM,KAAK,GAAG,IAAI,eAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAA+C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvF,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjF,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAC7E,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAgC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrF,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACvB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,YAAY,EAAE,YAAY;SAC3B,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAElC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEvD,sCAAsC;QACtC,MAAM,KAAK,GAAG,IAAI,eAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/server/routes/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDvG"}
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/server/routes/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM/C,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDvG"}
@@ -27,6 +27,9 @@ async function workflowRoutes(app, opts) {
27
27
  });
28
28
  app.get('/workflows/:name', async (request, reply) => {
29
29
  const { name } = request.params;
30
+ if (name.includes('..') || name.includes('/') || name.includes('\\')) {
31
+ return reply.status(400).send({ error: 'Invalid workflow name' });
32
+ }
30
33
  const filePath = (0, path_1.join)(workflowsDir, `${name}.yaml`);
31
34
  if (!(0, fs_1.existsSync)(filePath)) {
32
35
  return reply.status(404).send({ error: `Workflow not found: ${name}` });
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/server/routes/workflows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../../src/server/routes/workflows.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"execution-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/execution-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,UAAU,CAAqB;gBAGpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU;IAGnC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAoE3E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGjC"}
1
+ {"version":3,"file":"execution-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/execution-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,UAAU,CAAqB;gBAGpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU;IAGnC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsF3E,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGjC"}