@ngocsangairvds/vsaf 4.0.16 → 4.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.
Files changed (111) hide show
  1. package/package.json +5 -3
  2. package/packages/cli/dist/commands/doctor.js +1 -1
  3. package/packages/cli/dist/commands/doctor.js.map +1 -1
  4. package/packages/cli/dist/commands/init.d.ts.map +1 -1
  5. package/packages/cli/dist/commands/init.js +37 -7
  6. package/packages/cli/dist/commands/init.js.map +1 -1
  7. package/packages/cli/dist/commands/list.js +8 -1
  8. package/packages/cli/dist/commands/list.js.map +1 -1
  9. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  10. package/packages/cli/dist/commands/run.js +17 -4
  11. package/packages/cli/dist/commands/run.js.map +1 -1
  12. package/packages/cli/dist/commands/skill.d.ts.map +1 -1
  13. package/packages/cli/dist/commands/skill.js +14 -2
  14. package/packages/cli/dist/commands/skill.js.map +1 -1
  15. package/packages/cli/dist/mcp/server.d.ts +22 -0
  16. package/packages/cli/dist/mcp/server.d.ts.map +1 -1
  17. package/packages/cli/dist/mcp/server.js +311 -20
  18. package/packages/cli/dist/mcp/server.js.map +1 -1
  19. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  20. package/packages/cli/dist/server/routes/runs.js +7 -1
  21. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  22. package/packages/cli/dist/server/routes/workflows.d.ts.map +1 -1
  23. package/packages/cli/dist/server/routes/workflows.js +3 -0
  24. package/packages/cli/dist/server/routes/workflows.js.map +1 -1
  25. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  26. package/packages/cli/dist/server/services/execution-manager.js +68 -41
  27. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  28. package/packages/cli/dist/server/services/sse-manager.d.ts.map +1 -1
  29. package/packages/cli/dist/server/services/sse-manager.js +7 -2
  30. package/packages/cli/dist/server/services/sse-manager.js.map +1 -1
  31. package/packages/core/dist/commands/command-loader.d.ts.map +1 -1
  32. package/packages/core/dist/commands/command-loader.js +3 -0
  33. package/packages/core/dist/commands/command-loader.js.map +1 -1
  34. package/packages/core/dist/engine/condition-evaluator.js +3 -2
  35. package/packages/core/dist/engine/condition-evaluator.js.map +1 -1
  36. package/packages/core/dist/engine/dag-executor.d.ts +29 -1
  37. package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
  38. package/packages/core/dist/engine/dag-executor.js +279 -130
  39. package/packages/core/dist/engine/dag-executor.js.map +1 -1
  40. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  41. package/packages/core/dist/engine/dag-parser.js +3 -0
  42. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  43. package/packages/core/dist/engine/node-runner.d.ts +1 -0
  44. package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
  45. package/packages/core/dist/engine/node-runner.js +14 -2
  46. package/packages/core/dist/engine/node-runner.js.map +1 -1
  47. package/packages/core/dist/engine/variable-resolver.d.ts +1 -1
  48. package/packages/core/dist/engine/variable-resolver.d.ts.map +1 -1
  49. package/packages/core/dist/engine/variable-resolver.js +21 -11
  50. package/packages/core/dist/engine/variable-resolver.js.map +1 -1
  51. package/packages/core/dist/index.d.ts +5 -1
  52. package/packages/core/dist/index.d.ts.map +1 -1
  53. package/packages/core/dist/index.js +13 -3
  54. package/packages/core/dist/index.js.map +1 -1
  55. package/packages/core/dist/isolation/artifact-store.d.ts.map +1 -1
  56. package/packages/core/dist/isolation/artifact-store.js +30 -5
  57. package/packages/core/dist/isolation/artifact-store.js.map +1 -1
  58. package/packages/core/dist/isolation/workspace-manager.d.ts +2 -0
  59. package/packages/core/dist/isolation/workspace-manager.d.ts.map +1 -1
  60. package/packages/core/dist/isolation/workspace-manager.js +81 -7
  61. package/packages/core/dist/isolation/workspace-manager.js.map +1 -1
  62. package/packages/core/dist/schema/workflow-schema.d.ts +13 -0
  63. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  64. package/packages/core/dist/schema/workflow-schema.js +6 -3
  65. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  66. package/packages/core/dist/skills/skill-loader.d.ts.map +1 -1
  67. package/packages/core/dist/skills/skill-loader.js +7 -0
  68. package/packages/core/dist/skills/skill-loader.js.map +1 -1
  69. package/packages/core/dist/store/atomic.d.ts +11 -0
  70. package/packages/core/dist/store/atomic.d.ts.map +1 -0
  71. package/packages/core/dist/store/atomic.js +51 -0
  72. package/packages/core/dist/store/atomic.js.map +1 -0
  73. package/packages/core/dist/store/recovery.d.ts +3 -0
  74. package/packages/core/dist/store/recovery.d.ts.map +1 -0
  75. package/packages/core/dist/store/recovery.js +206 -0
  76. package/packages/core/dist/store/recovery.js.map +1 -0
  77. package/packages/core/dist/store/run-lock.d.ts +9 -0
  78. package/packages/core/dist/store/run-lock.d.ts.map +1 -0
  79. package/packages/core/dist/store/run-lock.js +62 -0
  80. package/packages/core/dist/store/run-lock.js.map +1 -0
  81. package/packages/core/dist/store/run-store.d.ts +20 -7
  82. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  83. package/packages/core/dist/store/run-store.js +175 -34
  84. package/packages/core/dist/store/run-store.js.map +1 -1
  85. package/packages/core/dist/store/snapshot.d.ts +4 -0
  86. package/packages/core/dist/store/snapshot.d.ts.map +1 -0
  87. package/packages/core/dist/store/snapshot.js +59 -0
  88. package/packages/core/dist/store/snapshot.js.map +1 -0
  89. package/packages/core/dist/store/types.d.ts +89 -4
  90. package/packages/core/dist/store/types.d.ts.map +1 -1
  91. package/packages/core/dist/store/types.js +14 -0
  92. package/packages/core/dist/store/types.js.map +1 -1
  93. package/packages/core/dist/store/wal.d.ts +39 -0
  94. package/packages/core/dist/store/wal.d.ts.map +1 -0
  95. package/packages/core/dist/store/wal.js +203 -0
  96. package/packages/core/dist/store/wal.js.map +1 -0
  97. package/packages/core/dist/types/dag.d.ts +3 -0
  98. package/packages/core/dist/types/dag.d.ts.map +1 -1
  99. package/packages/core/dist/types/workflow.d.ts +6 -3
  100. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  101. package/skills/sdlc/workflows/hotfix-tdd.yaml +3 -0
  102. package/skills/sdlc/workflows/master-sdlc.yaml +10 -0
  103. package/skills/sdlc/workflows/onboarding.yaml +2 -0
  104. package/skills/sdlc/workflows/sdlc-build.yaml +2 -0
  105. package/skills/sdlc/workflows/sdlc-design.yaml +2 -0
  106. package/skills/sdlc/workflows/sdlc-qa.yaml +3 -0
  107. package/skills/sdlc/workflows/sdlc-testcase.yaml +1 -0
  108. package/packages/core/dist/store/event-log.d.ts +0 -8
  109. package/packages/core/dist/store/event-log.d.ts.map +0 -1
  110. package/packages/core/dist/store/event-log.js +0 -30
  111. package/packages/core/dist/store/event-log.js.map +0 -1
@@ -24,51 +24,78 @@ class ExecutionManager {
24
24
  const ws = await wsManager.create(this.projectPath, workflowName);
25
25
  const storeDir = (0, path_1.join)(this.projectPath, '.vsaf', 'storage');
26
26
  const runStore = new core_1.RunStore(storeDir);
27
- const run = runStore.create(workflowName, args, ws.sourcePath, ws.artifactsPath, this.projectPath);
27
+ const run = runStore.create(workflowName, args, ws.sourcePath, ws.artifactsPath, this.projectPath, yamlContent, ws.branchName);
28
28
  this.activeRuns.add(run.runId);
29
- const callbacks = {
30
- onNodeStart: (nodeId) => {
31
- runStore.updateNode(run.runId, nodeId, { status: 'running', startedAt: new Date().toISOString() });
32
- runStore.save(run.runId);
33
- this.sseManager.pushEvent(run.runId, 'node:start', { nodeId, timestamp: new Date().toISOString() });
34
- },
35
- onNodeComplete: (nodeId, result) => {
36
- runStore.updateNode(run.runId, nodeId, result);
37
- runStore.save(run.runId);
38
- this.sseManager.pushEvent(run.runId, 'node:complete', {
39
- nodeId,
40
- durationMs: result.durationMs,
41
- output: result.output?.substring(0, 200),
42
- });
43
- },
44
- onNodeSkip: (nodeId, reason) => {
45
- runStore.updateNode(run.runId, nodeId, { status: 'skipped' });
46
- runStore.save(run.runId);
47
- this.sseManager.pushEvent(run.runId, 'node:skip', { nodeId, reason });
48
- },
49
- onNodeFail: (nodeId, error) => {
50
- runStore.updateNode(run.runId, nodeId, { status: 'failed', error });
51
- runStore.save(run.runId);
52
- this.sseManager.pushEvent(run.runId, 'node:fail', { nodeId, error });
53
- },
54
- };
55
- const executor = new core_1.DAGExecutor(ws.sourcePath, this.projectPath, graph, callbacks);
56
- const step = await executor.step({ args, artifactsDir: ws.artifactsPath });
57
- if (step.type === 'done') {
58
- const diff = await wsManager.diff(ws.id);
59
- if (diff.modified.length > 0 || diff.added.length > 0) {
60
- await wsManager.applyChanges(ws.id);
29
+ try {
30
+ const callbacks = {
31
+ onNodeStart: (nodeId) => {
32
+ runStore.updateNode(run.runId, nodeId, { status: 'running', startedAt: new Date().toISOString() });
33
+ runStore.save(run.runId);
34
+ this.sseManager.pushEvent(run.runId, 'node:start', { nodeId, timestamp: new Date().toISOString() });
35
+ },
36
+ onNodeComplete: (nodeId, result) => {
37
+ runStore.updateNode(run.runId, nodeId, result);
38
+ runStore.save(run.runId);
39
+ this.sseManager.pushEvent(run.runId, 'node:complete', {
40
+ nodeId,
41
+ durationMs: result.durationMs,
42
+ output: result.output?.substring(0, 200),
43
+ });
44
+ },
45
+ onNodeSkip: (nodeId, reason) => {
46
+ runStore.updateNode(run.runId, nodeId, { status: 'skipped' });
47
+ runStore.save(run.runId);
48
+ this.sseManager.pushEvent(run.runId, 'node:skip', { nodeId, reason });
49
+ },
50
+ onNodeFail: (nodeId, error, retryCount) => {
51
+ runStore.updateNode(run.runId, nodeId, { status: 'failed', error }, { retryCount });
52
+ runStore.save(run.runId);
53
+ this.sseManager.pushEvent(run.runId, 'node:fail', { nodeId, error });
54
+ },
55
+ onNodeReset: (nodeId) => {
56
+ runStore.resetNode(run.runId, nodeId);
57
+ },
58
+ };
59
+ const executor = new core_1.DAGExecutor(ws.sourcePath, this.projectPath, graph, callbacks);
60
+ const step = await executor.step({ args, artifactsDir: ws.artifactsPath });
61
+ if (step.type === 'done') {
62
+ const diff = await wsManager.diff(ws.id);
63
+ if (diff.modified.length > 0 || diff.added.length > 0) {
64
+ await wsManager.applyChanges(ws.id);
65
+ }
66
+ runStore.complete(run.runId);
67
+ await wsManager.destroy(ws.id);
68
+ this.sseManager.pushEvent(run.runId, 'run:complete', { success: true });
61
69
  }
62
- runStore.complete(run.runId);
63
- await wsManager.destroy(ws.id);
64
- this.sseManager.pushEvent(run.runId, 'run:complete', { success: true });
70
+ else if (step.type === 'failed') {
71
+ runStore.fail(run.runId);
72
+ await wsManager.destroy(ws.id);
73
+ this.sseManager.pushEvent(run.runId, 'run:complete', { success: false, error: step.error });
74
+ }
75
+ else if (step.type === 'needs_ai') {
76
+ // HTTP server has no next endpoint — AI workflows cannot proceed
77
+ runStore.fail(run.runId);
78
+ await wsManager.destroy(ws.id);
79
+ const error = 'AI node workflows require the MCP server (vsaf mcp-server). HTTP server only supports bash-only workflows.';
80
+ this.sseManager.pushEvent(run.runId, 'run:complete', { success: false, error });
81
+ return { runId: run.runId, step: { type: 'failed', error, results: step.results } };
82
+ }
83
+ return { runId: run.runId, step };
84
+ }
85
+ catch (err) {
86
+ try {
87
+ await wsManager.destroy(ws.id);
88
+ }
89
+ catch { /* best-effort */ }
90
+ try {
91
+ runStore.fail(run.runId);
92
+ }
93
+ catch { /* best-effort */ }
94
+ throw err;
65
95
  }
66
- else if (step.type === 'failed') {
67
- runStore.fail(run.runId);
68
- this.sseManager.pushEvent(run.runId, 'run:complete', { success: false, error: step.error });
96
+ finally {
97
+ this.activeRuns.delete(run.runId);
69
98
  }
70
- this.activeRuns.delete(run.runId);
71
- return { runId: run.runId, step };
72
99
  }
73
100
  isActive(runId) {
74
101
  return this.activeRuns.has(runId);
@@ -1 +1 @@
1
- {"version":3,"file":"execution-manager.js","sourceRoot":"","sources":["../../../src/server/services/execution-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-manager.js","sourceRoot":"","sources":["../../../src/server/services/execution-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sse-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/sse-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAwC;IAEvD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAYnD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAUtD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAY5E,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGtC"}
1
+ {"version":3,"file":"sse-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/sse-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAwC;IAEvD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAYnD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAUtD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgB5E,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGtC"}
@@ -28,8 +28,13 @@ class SseManager {
28
28
  return;
29
29
  const message = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
30
30
  for (const reply of clients) {
31
- if (!reply.raw.writableEnded) {
32
- reply.raw.write(message);
31
+ try {
32
+ if (!reply.raw.writableEnded && !reply.raw.destroyed) {
33
+ reply.raw.write(message);
34
+ }
35
+ }
36
+ catch {
37
+ this.removeClient(runId, reply);
33
38
  }
34
39
  }
35
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sse-manager.js","sourceRoot":"","sources":["../../../src/server/services/sse-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IACb,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEvD,SAAS,CAAC,KAAa,EAAE,KAAmB;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEpC,8BAA8B;QAC9B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,KAAmB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,KAAa,EAAE,IAA6B;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,OAAO,GAAG,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AAxCD,gCAwCC"}
1
+ {"version":3,"file":"sse-manager.js","sourceRoot":"","sources":["../../../src/server/services/sse-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAU;IACb,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEvD,SAAS,CAAC,KAAa,EAAE,KAAmB;QAC1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEpC,8BAA8B;QAC9B,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,KAAmB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,KAAa,EAAE,IAA6B;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,OAAO,GAAG,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;oBACrD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AA5CD,gCA4CC"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-loader.d.ts","sourceRoot":"","sources":["../../src/commands/command-loader.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAsBtE"}
1
+ {"version":3,"file":"command-loader.d.ts","sourceRoot":"","sources":["../../src/commands/command-loader.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAyBtE"}
@@ -10,6 +10,9 @@ const path_1 = require("path");
10
10
  const gray_matter_1 = __importDefault(require("gray-matter"));
11
11
  const skill_loader_js_1 = require("../skills/skill-loader.js");
12
12
  function loadCommand(name, projectPath) {
13
+ if (name.includes('..')) {
14
+ throw new Error(`Invalid command name: "${name}" — path traversal blocked`);
15
+ }
13
16
  const filePath = (0, path_1.join)(projectPath, '.vsaf', 'commands', `${name}.md`);
14
17
  if (!(0, fs_1.existsSync)(filePath)) {
15
18
  throw new Error(`Command not found: "${name}" (expected at ${filePath})`);
@@ -1 +1 @@
1
- {"version":3,"file":"command-loader.js","sourceRoot":"","sources":["../../src/commands/command-loader.ts"],"names":[],"mappings":";;;;;AAcA,kCAsBC;AApCD,+CAA+C;AAC/C,2BAA8C;AAC9C,+BAA4B;AAC5B,8DAAiC;AACjC,+DAAsD;AAUtD,SAAgB,WAAW,CAAC,IAAY,EAAE,WAAmB;IAC3D,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACtE,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,kBAAkB,QAAQ,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,qBAAM,EAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAA,2BAAS,EAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;QACnC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,IAAI;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"command-loader.js","sourceRoot":"","sources":["../../src/commands/command-loader.ts"],"names":[],"mappings":";;;;;AAcA,kCAyBC;AAvCD,+CAA+C;AAC/C,2BAA8C;AAC9C,+BAA4B;AAC5B,8DAAiC;AACjC,+DAAsD;AAUtD,SAAgB,WAAW,CAAC,IAAY,EAAE,WAAmB;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,4BAA4B,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;IACtE,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,kBAAkB,QAAQ,GAAG,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,qBAAM,EAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAA,2BAAS,EAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACxD,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;QACnC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,IAAI;KACL,CAAC;AACJ,CAAC"}
@@ -14,8 +14,9 @@ function evaluateCondition(condition, nodeOutputs) {
14
14
  }
15
15
  function evaluateSingle(expr, nodeOutputs) {
16
16
  const match = expr.match(/^\$([a-zA-Z0-9_-]+)\.output(?:\.([a-zA-Z0-9_]+))?\s*(==|!=)\s*'([^']*)'\s*$/);
17
- if (!match)
18
- return false;
17
+ if (!match) {
18
+ throw new Error(`Invalid condition syntax: "${expr.trim()}". Expected: $node-id.output[.field] == 'value'`);
19
+ }
19
20
  const [, nodeId, field, operator, expected] = match;
20
21
  const node = nodeOutputs[nodeId];
21
22
  if (!node)
@@ -1 +1 @@
1
- {"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/engine/condition-evaluator.ts"],"names":[],"mappings":";;AAMA,8CAcC;AAdD,SAAgB,iBAAiB,CAC/B,SAA6B,EAC7B,WAAuC;IAEvC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,iCAAiC;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAC3B,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,WAAuC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,6EAA6E,CAC9E,CAAC;IAEF,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IACpD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,MAAc,CAAC;IACnB,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"condition-evaluator.js","sourceRoot":"","sources":["../../src/engine/condition-evaluator.ts"],"names":[],"mappings":";;AAMA,8CAcC;AAdD,SAAgB,iBAAiB,CAC/B,SAA6B,EAC7B,WAAuC;IAEvC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,iCAAiC;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAC3B,kCAAkC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,IAAY,EACZ,WAAuC;IAEvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,6EAA6E,CAC9E,CAAC;IAEF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,IAAI,EAAE,iDAAiD,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;IACpD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,MAAc,CAAC;IACnB,IAAI,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -4,13 +4,15 @@ export interface ExecutorCallbacks {
4
4
  onNodeStart: (nodeId: string) => void;
5
5
  onNodeComplete: (nodeId: string, result: NodeResult) => void;
6
6
  onNodeSkip: (nodeId: string, reason: string) => void;
7
- onNodeFail: (nodeId: string, error: string) => void;
7
+ onNodeFail: (nodeId: string, error: string, retryCount?: number) => void;
8
+ onNodeReset?: (nodeId: string) => void;
8
9
  }
9
10
  export interface ExecutorOptions {
10
11
  delayFn?: (ms: number) => Promise<void>;
11
12
  }
12
13
  export interface ResolvedNode {
13
14
  nodeId: string;
15
+ description?: string;
14
16
  prompt: string;
15
17
  skill?: string;
16
18
  model?: string;
@@ -40,6 +42,7 @@ export declare class DAGExecutor {
40
42
  private completed;
41
43
  private failed;
42
44
  private skipped;
45
+ private inFlight;
43
46
  private nodeResults;
44
47
  private runner;
45
48
  private args;
@@ -47,12 +50,37 @@ export declare class DAGExecutor {
47
50
  private initialized;
48
51
  private inputsValidated;
49
52
  private retryCounts;
53
+ private ancestorCache;
50
54
  private readonly delayFn;
55
+ private outputsMapCache;
56
+ private outputsMapDirty;
57
+ private yieldTimestamps;
51
58
  constructor(workspaceCwd: string, projectPath: string, graph: DAGGraph, callbacks: ExecutorCallbacks, options?: ExecutorOptions);
59
+ static fromRecoveredState(workspaceCwd: string, projectPath: string, graph: DAGGraph, callbacks: ExecutorCallbacks, state: {
60
+ pending: Set<string>;
61
+ completed: Set<string>;
62
+ failed: Set<string>;
63
+ skipped: Set<string>;
64
+ nodeResults: Record<string, NodeResult>;
65
+ retryCounts: Map<string, number>;
66
+ args: string;
67
+ artifactsPath: string;
68
+ }, options?: ExecutorOptions): DAGExecutor;
52
69
  step(input?: StepInput): Promise<StepResult>;
53
70
  private findReadyNodes;
54
71
  private resetNode;
72
+ private markOutputsDirty;
55
73
  private buildOutputsMap;
74
+ private getAncestors;
75
+ clearResults(): void;
76
+ getNodeSummaries(): Record<string, {
77
+ status: string;
78
+ durationMs?: number;
79
+ startedAt?: string;
80
+ completedAt?: string;
81
+ outputPreview?: string;
82
+ }>;
83
+ private buildScopedOutputsMap;
56
84
  private buildContext;
57
85
  }
58
86
  //# sourceMappingURL=dag-executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dag-executor.d.ts","sourceRoot":"","sources":["../../src/engine/dag-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7D,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;CACtC;AAED,qBAAa,WAAW;IAepB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAjB5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAGrC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,iBAAiB,EAC7C,OAAO,GAAE,eAAoB;IAOzB,IAAI,CAAC,KAAK,GAAE,SAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAwLtD,OAAO,CAAC,cAAc;IA0CtB,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;CAOrB"}
1
+ {"version":3,"file":"dag-executor.d.ts","sourceRoot":"","sources":["../../src/engine/dag-executor.ts"],"names":[],"mappings":"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"}