@ngocsangairvds/vsaf 5.1.18 → 5.2.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 (134) hide show
  1. package/README.md +55 -1
  2. package/package.json +1 -1
  3. package/packages/cli/dist/commands/abandon.d.ts +6 -0
  4. package/packages/cli/dist/commands/abandon.d.ts.map +1 -0
  5. package/packages/cli/dist/commands/abandon.js +42 -0
  6. package/packages/cli/dist/commands/abandon.js.map +1 -0
  7. package/packages/cli/dist/commands/ai.d.ts +21 -0
  8. package/packages/cli/dist/commands/ai.d.ts.map +1 -0
  9. package/packages/cli/dist/commands/ai.js +76 -0
  10. package/packages/cli/dist/commands/ai.js.map +1 -0
  11. package/packages/cli/dist/commands/approve.d.ts +19 -0
  12. package/packages/cli/dist/commands/approve.d.ts.map +1 -0
  13. package/packages/cli/dist/commands/approve.js +115 -0
  14. package/packages/cli/dist/commands/approve.js.map +1 -0
  15. package/packages/cli/dist/commands/chat.d.ts +41 -0
  16. package/packages/cli/dist/commands/chat.d.ts.map +1 -0
  17. package/packages/cli/dist/commands/chat.js +129 -0
  18. package/packages/cli/dist/commands/chat.js.map +1 -0
  19. package/packages/cli/dist/commands/isolation.d.ts +20 -0
  20. package/packages/cli/dist/commands/isolation.d.ts.map +1 -0
  21. package/packages/cli/dist/commands/isolation.js +104 -0
  22. package/packages/cli/dist/commands/isolation.js.map +1 -0
  23. package/packages/cli/dist/commands/run.d.ts +36 -1
  24. package/packages/cli/dist/commands/run.d.ts.map +1 -1
  25. package/packages/cli/dist/commands/run.js +161 -15
  26. package/packages/cli/dist/commands/run.js.map +1 -1
  27. package/packages/cli/dist/commands/telemetry.d.ts +10 -0
  28. package/packages/cli/dist/commands/telemetry.d.ts.map +1 -0
  29. package/packages/cli/dist/commands/telemetry.js +51 -0
  30. package/packages/cli/dist/commands/telemetry.js.map +1 -0
  31. package/packages/cli/dist/commands/validate.d.ts +12 -0
  32. package/packages/cli/dist/commands/validate.d.ts.map +1 -0
  33. package/packages/cli/dist/commands/validate.js +83 -0
  34. package/packages/cli/dist/commands/validate.js.map +1 -0
  35. package/packages/cli/dist/commands/workflow.d.ts +29 -0
  36. package/packages/cli/dist/commands/workflow.d.ts.map +1 -0
  37. package/packages/cli/dist/commands/workflow.js +147 -0
  38. package/packages/cli/dist/commands/workflow.js.map +1 -0
  39. package/packages/cli/dist/index.js +253 -6
  40. package/packages/cli/dist/index.js.map +1 -1
  41. package/packages/cli/dist/mcp/server.d.ts +9 -0
  42. package/packages/cli/dist/mcp/server.d.ts.map +1 -1
  43. package/packages/cli/dist/mcp/server.js +38 -2
  44. package/packages/cli/dist/mcp/server.js.map +1 -1
  45. package/packages/cli/dist/server/app.d.ts.map +1 -1
  46. package/packages/cli/dist/server/app.js +2 -0
  47. package/packages/cli/dist/server/app.js.map +1 -1
  48. package/packages/cli/dist/server/routes/conversations.d.ts +6 -0
  49. package/packages/cli/dist/server/routes/conversations.d.ts.map +1 -0
  50. package/packages/cli/dist/server/routes/conversations.js +145 -0
  51. package/packages/cli/dist/server/routes/conversations.js.map +1 -0
  52. package/packages/cli/dist/server/routes/runs.d.ts.map +1 -1
  53. package/packages/cli/dist/server/routes/runs.js +15 -3
  54. package/packages/cli/dist/server/routes/runs.js.map +1 -1
  55. package/packages/cli/dist/server/services/execution-manager.d.ts +25 -0
  56. package/packages/cli/dist/server/services/execution-manager.d.ts.map +1 -1
  57. package/packages/cli/dist/server/services/execution-manager.js +255 -95
  58. package/packages/cli/dist/server/services/execution-manager.js.map +1 -1
  59. package/packages/core/dist/config/ai-config.d.ts +24 -0
  60. package/packages/core/dist/config/ai-config.d.ts.map +1 -0
  61. package/packages/core/dist/config/ai-config.js +170 -0
  62. package/packages/core/dist/config/ai-config.js.map +1 -0
  63. package/packages/core/dist/engine/dag-executor.d.ts +18 -0
  64. package/packages/core/dist/engine/dag-executor.d.ts.map +1 -1
  65. package/packages/core/dist/engine/dag-executor.js +181 -8
  66. package/packages/core/dist/engine/dag-executor.js.map +1 -1
  67. package/packages/core/dist/engine/dag-parser.d.ts.map +1 -1
  68. package/packages/core/dist/engine/dag-parser.js +32 -1
  69. package/packages/core/dist/engine/dag-parser.js.map +1 -1
  70. package/packages/core/dist/engine/loop-signal.d.ts +7 -0
  71. package/packages/core/dist/engine/loop-signal.d.ts.map +1 -0
  72. package/packages/core/dist/engine/loop-signal.js +21 -0
  73. package/packages/core/dist/engine/loop-signal.js.map +1 -0
  74. package/packages/core/dist/engine/node-runner.d.ts +4 -1
  75. package/packages/core/dist/engine/node-runner.d.ts.map +1 -1
  76. package/packages/core/dist/engine/node-runner.js +14 -6
  77. package/packages/core/dist/engine/node-runner.js.map +1 -1
  78. package/packages/core/dist/index.d.ts +5 -2
  79. package/packages/core/dist/index.d.ts.map +1 -1
  80. package/packages/core/dist/index.js +25 -1
  81. package/packages/core/dist/index.js.map +1 -1
  82. package/packages/core/dist/runtime/executor.d.ts +1 -1
  83. package/packages/core/dist/runtime/executor.d.ts.map +1 -1
  84. package/packages/core/dist/runtime/executor.js +12 -8
  85. package/packages/core/dist/runtime/executor.js.map +1 -1
  86. package/packages/core/dist/schema/workflow-schema.d.ts +94 -14
  87. package/packages/core/dist/schema/workflow-schema.d.ts.map +1 -1
  88. package/packages/core/dist/schema/workflow-schema.js +38 -6
  89. package/packages/core/dist/schema/workflow-schema.js.map +1 -1
  90. package/packages/core/dist/store/recovery.d.ts.map +1 -1
  91. package/packages/core/dist/store/recovery.js +7 -0
  92. package/packages/core/dist/store/recovery.js.map +1 -1
  93. package/packages/core/dist/store/run-store.d.ts +5 -3
  94. package/packages/core/dist/store/run-store.d.ts.map +1 -1
  95. package/packages/core/dist/store/run-store.js +12 -4
  96. package/packages/core/dist/store/run-store.js.map +1 -1
  97. package/packages/core/dist/store/sqlite-schema.d.ts +1 -1
  98. package/packages/core/dist/store/sqlite-schema.d.ts.map +1 -1
  99. package/packages/core/dist/store/sqlite-schema.js +20 -0
  100. package/packages/core/dist/store/sqlite-schema.js.map +1 -1
  101. package/packages/core/dist/store/sqlite-workflow-store.d.ts +26 -0
  102. package/packages/core/dist/store/sqlite-workflow-store.d.ts.map +1 -1
  103. package/packages/core/dist/store/sqlite-workflow-store.js +106 -0
  104. package/packages/core/dist/store/sqlite-workflow-store.js.map +1 -1
  105. package/packages/core/dist/store/types.d.ts +15 -0
  106. package/packages/core/dist/store/types.d.ts.map +1 -1
  107. package/packages/core/dist/store/types.js.map +1 -1
  108. package/packages/core/dist/telemetry/telemetry.d.ts +31 -0
  109. package/packages/core/dist/telemetry/telemetry.d.ts.map +1 -0
  110. package/packages/core/dist/telemetry/telemetry.js +177 -0
  111. package/packages/core/dist/telemetry/telemetry.js.map +1 -0
  112. package/packages/core/dist/types/dag.d.ts +16 -0
  113. package/packages/core/dist/types/dag.d.ts.map +1 -1
  114. package/packages/core/dist/types/workflow.d.ts +18 -1
  115. package/packages/core/dist/types/workflow.d.ts.map +1 -1
  116. package/packages/web/dist/web/browser/chunk-2JHYGCCN.js +1 -0
  117. package/packages/web/dist/web/browser/chunk-BMQT4ZPK.js +1 -0
  118. package/packages/web/dist/web/browser/chunk-GWHJRWJM.js +1 -0
  119. package/packages/web/dist/web/browser/chunk-OZ6BRCXC.js +1 -0
  120. package/packages/web/dist/web/browser/chunk-Q7N6DAKT.js +1 -0
  121. package/packages/web/dist/web/browser/chunk-SEBU2SK7.js +1 -0
  122. package/packages/web/dist/web/browser/chunk-SOS4TH5D.js +4 -0
  123. package/packages/web/dist/web/browser/chunk-WSAVMPNK.js +5 -0
  124. package/packages/web/dist/web/browser/index.html +1 -1
  125. package/packages/web/dist/web/browser/main-UPZIVGM6.js +1 -0
  126. package/packages/web/dist/web/browser/chunk-5WD7R336.js +0 -1
  127. package/packages/web/dist/web/browser/chunk-FXYDTGOX.js +0 -1
  128. package/packages/web/dist/web/browser/chunk-K4DHLOOA.js +0 -1
  129. package/packages/web/dist/web/browser/chunk-V2CDNNWN.js +0 -1
  130. package/packages/web/dist/web/browser/chunk-WJT4QH2P.js +0 -4
  131. package/packages/web/dist/web/browser/chunk-WMJLW2L6.js +0 -5
  132. package/packages/web/dist/web/browser/chunk-XHOL7AER.js +0 -1
  133. package/packages/web/dist/web/browser/chunk-YBYFKZWR.js +0 -1
  134. package/packages/web/dist/web/browser/main-SYHKSBNJ.js +0 -1
@@ -61,132 +61,292 @@ class ExecutionManager {
61
61
  ? runStore.load(runId)
62
62
  : runStore.create(workflowId, args, ws.sourcePath, ws.artifactsPath, this.projectPath, yamlContent, ws.branchName, runId);
63
63
  this.activeRuns.add(run.runId);
64
+ const sqliteStore = core_1.SqliteWorkflowStore.openProject(this.projectPath);
65
+ const conversationId = run.runId;
66
+ const existing = await sqliteStore.getWorkflowRun(run.runId);
67
+ if (!existing) {
68
+ await sqliteStore.createWorkflowRun({
69
+ id: run.runId,
70
+ workflow_name: workflowId,
71
+ conversation_id: conversationId,
72
+ user_message: args,
73
+ working_path: ws.sourcePath,
74
+ artifact_path: ws.artifactsPath,
75
+ branch_name: ws.branchName,
76
+ });
77
+ }
64
78
  try {
65
- const callbacks = {
66
- onNodeStart: (nodeId) => {
67
- const node = graph.nodes.get(nodeId);
68
- const resolved = node && (node.type === 'prompt' || node.type === 'command')
69
- ? (0, run_js_1.resolveNodeProvider)(graph, node, overrides)
70
- : undefined;
71
- runStore.updateNode(run.runId, nodeId, {
72
- status: 'running',
73
- startedAt: new Date().toISOString(),
74
- provider: resolved?.provider,
75
- model: resolved?.model,
76
- });
77
- runStore.save(run.runId);
78
- this.sseManager.pushEvent(run.runId, 'node:start', {
79
- nodeId,
80
- provider: resolved?.provider,
81
- model: resolved?.model,
82
- timestamp: new Date().toISOString(),
83
- });
84
- },
85
- onNodeComplete: (nodeId, result) => {
86
- runStore.updateNode(run.runId, nodeId, result);
87
- runStore.save(run.runId);
88
- this.sseManager.pushEvent(run.runId, 'node:complete', {
89
- nodeId,
90
- durationMs: result.durationMs,
91
- output: result.output?.substring(0, 200),
92
- });
93
- },
94
- onNodeSkip: (nodeId, reason) => {
95
- runStore.updateNode(run.runId, nodeId, { status: 'skipped' });
96
- runStore.save(run.runId);
97
- this.sseManager.pushEvent(run.runId, 'node:skip', { nodeId, reason });
98
- },
99
- onNodeFail: (nodeId, error, retryCount) => {
100
- runStore.updateNode(run.runId, nodeId, { status: 'failed', error }, { retryCount });
101
- runStore.save(run.runId);
102
- this.sseManager.pushEvent(run.runId, 'node:fail', { nodeId, error });
103
- },
104
- onNodeReset: (nodeId) => {
105
- runStore.resetNode(run.runId, nodeId);
106
- },
107
- };
79
+ const callbacks = this.buildCallbacks(run.runId, graph, runStore, overrides);
108
80
  const executor = new core_1.DAGExecutor(ws.sourcePath, this.projectPath, graph, callbacks);
109
- const registry = (0, run_js_1.buildProviderRegistry)();
110
- let step = await executor.step({ args, artifactsDir: ws.artifactsPath });
111
- // Drive AI nodes through the provider registry (same engine path as the
112
- // CLI) so the web console can orchestrate full workflows, not just bash.
113
- while (step.type === 'needs_ai' && step.nodes) {
114
- const current = runStore.load(run.runId);
115
- if (current?.status === 'cancelled')
116
- break;
117
- let completedResults;
81
+ let step = await this.driveAiNodes(run.runId, executor, graph, runStore, ws.sourcePath, { args, artifactsDir: ws.artifactsPath }, overrides);
82
+ step = await this.settleRun(run.runId, step, runStore, wsManager, ws.id, requiresWorkspace);
83
+ return { runId: run.runId, step };
84
+ }
85
+ catch (err) {
86
+ if (requiresWorkspace) {
118
87
  try {
119
- completedResults = await (0, run_js_1.executeAINodes)(step.nodes, graph, registry, ws.sourcePath, overrides ?? {}, {
120
- onProviderChange: (nodeId, provider, model) => {
121
- runStore.updateNode(run.runId, nodeId, { status: 'running', provider, model });
122
- runStore.save(run.runId);
123
- },
124
- });
88
+ await wsManager.destroy(ws.id);
125
89
  }
126
- catch (err) {
127
- step = { type: 'failed', error: err.message, results: step.results };
128
- break;
90
+ catch { /* best-effort */ }
91
+ }
92
+ try {
93
+ runStore.fail(run.runId);
94
+ }
95
+ catch { /* best-effort */ }
96
+ try {
97
+ await sqliteStore.failWorkflowRun(run.runId, err.message);
98
+ }
99
+ catch { /* best-effort */ }
100
+ throw err;
101
+ }
102
+ finally {
103
+ this.activeRuns.delete(run.runId);
104
+ sqliteStore.close();
105
+ }
106
+ }
107
+ enqueueResume(runId, opts = {}) {
108
+ setTimeout(() => {
109
+ void this.resumeRun(runId, opts).catch((error) => {
110
+ const store = new core_1.RunStore((0, path_1.join)(this.projectPath, '.vsaf', 'storage'));
111
+ try {
112
+ store.load(runId);
113
+ store.fail(runId);
129
114
  }
130
- step = await executor.step({ completedResults });
115
+ catch { /* already terminal */ }
116
+ this.sseManager.pushEvent(runId, 'run:complete', {
117
+ success: false,
118
+ error: error instanceof Error ? error.message : String(error),
119
+ });
120
+ });
121
+ }, 0);
122
+ return { runId, accepted: true, status: 'queued' };
123
+ }
124
+ /**
125
+ * Resume a paused/failed run in place from its WAL. Approval answers resume
126
+ * the DAG at the paused approval node; loop feedback is injected into the
127
+ * next iteration of a paused interactive until-loop.
128
+ */
129
+ async resumeRun(runId, opts = {}) {
130
+ const config = (0, core_1.loadConfig)(this.projectPath);
131
+ const storeDir = (0, path_1.join)(this.projectPath, '.vsaf', 'storage');
132
+ const runDir = (0, path_1.join)(storeDir, runId);
133
+ if (!(0, fs_1.existsSync)(runDir))
134
+ throw new Error(`Run directory not found: ${runId}`);
135
+ const state = (0, core_1.recoverState)(runDir);
136
+ if (!state)
137
+ throw new Error(`Cannot recover state for run: ${runId}`);
138
+ if (state.runStatus === 'completed')
139
+ throw new Error(`Cannot resume completed run: ${runId}`);
140
+ if (!state.workflowYaml)
141
+ throw new Error(`Run ${runId} has no workflow snapshot — cannot resume`);
142
+ if (!(0, fs_1.existsSync)(state.workspacePath)) {
143
+ throw new Error(`Workspace directory missing for run ${runId}: ${state.workspacePath}`);
144
+ }
145
+ const graph = (0, core_1.parseWorkflow)(state.workflowYaml);
146
+ const pauseMeta = state.pauseMetadata;
147
+ const initialInput = this.buildResumeInput(graph, state.pending, pauseMeta, opts);
148
+ (0, core_1.prepareStateForRetry)(state, graph.nodes.keys());
149
+ const runStore = new core_1.RunStore(storeDir);
150
+ runStore.load(runId);
151
+ runStore.resume(runId, { message: opts.message });
152
+ const requiresWorkspace = [...graph.nodes.values()].some(node => node.workspace);
153
+ const wsManager = new core_1.WorkspaceManager({ exclude: config.isolation.exclude });
154
+ const wsType = (0, fs_1.existsSync)((0, path_1.join)(state.workspacePath, '.git')) ? 'worktree' : 'ephemeral';
155
+ wsManager.adopt(runId, state.workspacePath, state.artifactsPath, this.projectPath, wsType, state.branchName);
156
+ this.activeRuns.add(runId);
157
+ try {
158
+ const callbacks = this.buildCallbacks(runId, graph, runStore, undefined);
159
+ const executor = core_1.DAGExecutor.fromRecoveredState(state.workspacePath, this.projectPath, graph, callbacks, {
160
+ pending: state.pending,
161
+ completed: state.completed,
162
+ failed: state.failed,
163
+ skipped: state.skipped,
164
+ nodeResults: state.nodeResults,
165
+ retryCounts: state.retryCounts,
166
+ args: state.args,
167
+ artifactsPath: state.artifactsPath,
168
+ });
169
+ let step = await this.driveAiNodes(runId, executor, graph, runStore, state.workspacePath, initialInput, undefined);
170
+ step = await this.settleRun(runId, step, runStore, wsManager, runId, requiresWorkspace);
171
+ return { runId, step };
172
+ }
173
+ catch (err) {
174
+ try {
175
+ runStore.fail(runId);
176
+ }
177
+ catch { /* best-effort */ }
178
+ throw err;
179
+ }
180
+ finally {
181
+ this.activeRuns.delete(runId);
182
+ }
183
+ }
184
+ /** Map resume options onto the executor step input for the paused node. */
185
+ buildResumeInput(graph, pendingBeforeRetry, pauseMeta, opts) {
186
+ if (opts.approval) {
187
+ // Prefer the persisted pause metadata; fall back to the paused (started
188
+ // but unfinished) approval node for runs recorded before metadata existed
189
+ const nodeId = pauseMeta?.type === 'approval'
190
+ ? pauseMeta.nodeId
191
+ : [...graph.nodes.values()].find(n => n.type === 'approval' && pendingBeforeRetry.has(n.id))?.id;
192
+ if (!nodeId)
193
+ throw new Error('Run is not paused at an approval node');
194
+ const captureResponse = graph.nodes.get(nodeId)?.approval?.capture_response ?? false;
195
+ return {
196
+ approvalNodeId: nodeId,
197
+ approved: opts.approval.approved,
198
+ approvalResponse: captureResponse ? opts.approval.response : undefined,
199
+ };
200
+ }
201
+ if (pauseMeta?.type === 'interactive_loop') {
202
+ return {
203
+ loopNodeId: pauseMeta.nodeId,
204
+ loopIteration: pauseMeta.iteration,
205
+ loopFeedback: opts.message,
206
+ };
207
+ }
208
+ return {};
209
+ }
210
+ buildCallbacks(runId, graph, runStore, overrides) {
211
+ return {
212
+ onNodeStart: (nodeId) => {
213
+ const node = graph.nodes.get(nodeId);
214
+ const resolved = node && (node.type === 'prompt' || node.type === 'command')
215
+ ? (0, run_js_1.resolveNodeProvider)(graph, node, overrides)
216
+ : undefined;
217
+ runStore.updateNode(runId, nodeId, {
218
+ status: 'running',
219
+ startedAt: new Date().toISOString(),
220
+ provider: resolved?.provider,
221
+ model: resolved?.model,
222
+ });
223
+ runStore.save(runId);
224
+ this.sseManager.pushEvent(runId, 'node:start', {
225
+ nodeId,
226
+ provider: resolved?.provider,
227
+ model: resolved?.model,
228
+ timestamp: new Date().toISOString(),
229
+ });
230
+ },
231
+ onNodeComplete: (nodeId, result) => {
232
+ runStore.updateNode(runId, nodeId, result);
233
+ runStore.save(runId);
234
+ this.sseManager.pushEvent(runId, 'node:complete', {
235
+ nodeId,
236
+ durationMs: result.durationMs,
237
+ output: result.output?.substring(0, 200),
238
+ });
239
+ },
240
+ onNodeSkip: (nodeId, reason) => {
241
+ runStore.updateNode(runId, nodeId, { status: 'skipped' });
242
+ runStore.save(runId);
243
+ this.sseManager.pushEvent(runId, 'node:skip', { nodeId, reason });
244
+ },
245
+ onNodeFail: (nodeId, error, retryCount) => {
246
+ runStore.updateNode(runId, nodeId, { status: 'failed', error }, { retryCount });
247
+ runStore.save(runId);
248
+ this.sseManager.pushEvent(runId, 'node:fail', { nodeId, error });
249
+ },
250
+ onNodeReset: (nodeId) => {
251
+ runStore.resetNode(runId, nodeId);
252
+ },
253
+ };
254
+ }
255
+ /**
256
+ * Drive AI nodes through the provider registry (same engine path as the
257
+ * CLI) so the web console can orchestrate full workflows, not just bash.
258
+ */
259
+ async driveAiNodes(runId, executor, graph, runStore, workspaceCwd, initialInput, overrides) {
260
+ const registry = (0, run_js_1.buildProviderRegistry)();
261
+ let step = await executor.step(initialInput);
262
+ while (step.type === 'needs_ai' && step.nodes) {
263
+ const current = runStore.load(runId);
264
+ if (current?.status === 'cancelled')
265
+ break;
266
+ let completedResults;
267
+ try {
268
+ completedResults = await (0, run_js_1.executeAINodes)(step.nodes, graph, registry, workspaceCwd, overrides ?? {}, {
269
+ onProviderChange: (nodeId, provider, model) => {
270
+ runStore.updateNode(runId, nodeId, { status: 'running', provider, model });
271
+ runStore.save(runId);
272
+ },
273
+ });
274
+ }
275
+ catch (err) {
276
+ return { type: 'failed', error: err.message, results: step.results };
131
277
  }
132
- const latest = runStore.load(run.runId);
133
- const wasCancelled = latest?.status === 'cancelled';
278
+ step = await executor.step({ completedResults });
279
+ }
280
+ return step;
281
+ }
282
+ async settleRun(runId, step, runStore, wsManager, wsId, requiresWorkspace) {
283
+ const latest = runStore.load(runId);
284
+ const wasCancelled = latest?.status === 'cancelled';
285
+ // Conversation mirror (phase-2): run status + gate messages also land in
286
+ // the SQLite conversation thread so `vsaf chat` and the web sidebar see them.
287
+ const sqliteStore = core_1.SqliteWorkflowStore.openProject(this.projectPath);
288
+ try {
134
289
  if (wasCancelled) {
135
290
  if (requiresWorkspace)
136
- await wsManager.destroy(ws.id);
137
- this.sseManager.pushEvent(run.runId, 'run:cancel', { success: false });
291
+ await wsManager.destroy(wsId);
292
+ await sqliteStore.updateWorkflowRun(runId, { status: 'cancelled' });
293
+ this.sseManager.pushEvent(runId, 'run:cancel', { success: false });
138
294
  }
139
295
  else if (step.type === 'done') {
140
296
  if (requiresWorkspace) {
141
- const diff = await wsManager.diff(ws.id);
297
+ const diff = await wsManager.diff(wsId);
142
298
  if (diff.modified.length > 0 || diff.added.length > 0) {
143
- await wsManager.applyChanges(ws.id);
299
+ await wsManager.applyChanges(wsId);
144
300
  }
145
- await wsManager.destroy(ws.id);
301
+ await wsManager.destroy(wsId);
146
302
  }
147
- runStore.complete(run.runId);
148
- this.sseManager.pushEvent(run.runId, 'run:complete', { success: true });
303
+ runStore.complete(runId);
304
+ await sqliteStore.completeWorkflowRun(runId);
305
+ this.sseManager.pushEvent(runId, 'run:complete', { success: true });
149
306
  }
150
307
  else if (step.type === 'failed') {
151
- runStore.fail(run.runId);
308
+ runStore.fail(runId);
309
+ await sqliteStore.failWorkflowRun(runId, step.error ?? 'failed');
152
310
  if (requiresWorkspace)
153
- await wsManager.destroy(ws.id);
154
- this.sseManager.pushEvent(run.runId, 'run:complete', { success: false, error: step.error });
311
+ await wsManager.destroy(wsId);
312
+ this.sseManager.pushEvent(runId, 'run:complete', { success: false, error: step.error });
155
313
  }
156
314
  else if (step.type === 'needs_ai') {
157
315
  // Defensive: the AI loop above should have consumed this step
158
- runStore.fail(run.runId);
316
+ runStore.fail(runId);
159
317
  if (requiresWorkspace)
160
- await wsManager.destroy(ws.id);
318
+ await wsManager.destroy(wsId);
161
319
  const error = 'AI step returned no executable nodes';
162
- this.sseManager.pushEvent(run.runId, 'run:complete', { success: false, error });
163
- return { runId: run.runId, step: { type: 'failed', error, results: step.results } };
320
+ this.sseManager.pushEvent(runId, 'run:complete', { success: false, error });
321
+ return { type: 'failed', error, results: step.results };
164
322
  }
165
323
  else if (step.type === 'needs_approval') {
166
- runStore.pause(run.runId);
167
- this.sseManager.pushEvent(run.runId, 'run:pause', {
324
+ runStore.pause(runId, {
325
+ type: step.approvalMetadata?.type ?? 'approval',
326
+ nodeId: step.approvalMetadata?.nodeId ?? step.approvalNodeId ?? '',
327
+ iteration: step.approvalMetadata?.iteration,
328
+ message: step.approvalMessage,
329
+ });
330
+ await sqliteStore.addMessage(runId, 'assistant', step.approvalMessage ?? 'Approval required', {
331
+ category: 'gate',
332
+ runId,
333
+ nodeId: step.approvalNodeId,
334
+ });
335
+ await sqliteStore.updateWorkflowRun(runId, {
336
+ status: 'paused',
337
+ metadata: { approval: { ...step.approvalMetadata, message: step.approvalMessage } },
338
+ });
339
+ this.sseManager.pushEvent(runId, 'run:pause', {
168
340
  approvalNodeId: step.approvalNodeId,
169
341
  approvalMessage: step.approvalMessage,
342
+ metadata: step.approvalMetadata,
170
343
  });
171
344
  }
172
- return { runId: run.runId, step };
173
- }
174
- catch (err) {
175
- if (requiresWorkspace) {
176
- try {
177
- await wsManager.destroy(ws.id);
178
- }
179
- catch { /* best-effort */ }
180
- }
181
- try {
182
- runStore.fail(run.runId);
183
- }
184
- catch { /* best-effort */ }
185
- throw err;
186
345
  }
187
346
  finally {
188
- this.activeRuns.delete(run.runId);
347
+ sqliteStore.close();
189
348
  }
349
+ return step;
190
350
  }
191
351
  isActive(runId) {
192
352
  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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"}
@@ -0,0 +1,24 @@
1
+ export declare const TIER_NAMES: readonly ["small", "medium", "large"];
2
+ export type TierName = (typeof TIER_NAMES)[number];
3
+ export interface ModelPreset {
4
+ provider: string;
5
+ model: string;
6
+ }
7
+ export interface AiConfig {
8
+ tiers: Partial<Record<TierName, ModelPreset>>;
9
+ aliases: Record<string, ModelPreset>;
10
+ }
11
+ export declare function vsafHome(): string;
12
+ export declare function isTierName(value: string): value is TierName;
13
+ export declare function loadAiConfig(homeDir?: string): AiConfig;
14
+ export declare function setTier(tier: TierName, preset: ModelPreset, homeDir?: string): void;
15
+ export declare function unsetTier(tier: TierName, homeDir?: string): boolean;
16
+ export declare function setAlias(name: string, preset: ModelPreset, homeDir?: string): void;
17
+ export declare function unsetAlias(name: string, homeDir?: string): boolean;
18
+ /**
19
+ * Resolve a node's `model:` reference through tiers and aliases.
20
+ * Returns undefined for literal model names (pass-through), a concrete
21
+ * provider+model for tiers/aliases, and throws for unresolvable refs.
22
+ */
23
+ export declare function resolveModelRef(ref: string, currentProvider: string, config: AiConfig): ModelPreset | undefined;
24
+ //# sourceMappingURL=ai-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../src/config/ai-config.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,UAAU,uCAAwC,CAAC;AAChE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACtC;AAaD,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAkBD,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAmB,GAAG,QAAQ,CAmBnE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,MAAmB,GAAG,IAAI,CAQ/F;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,MAAmB,GAAG,OAAO,CAO/E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,MAAmB,GAAG,IAAI,CAQ9F;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAAmB,GAAG,OAAO,CAO9E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CA4B/G"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TIER_NAMES = void 0;
7
+ exports.vsafHome = vsafHome;
8
+ exports.isTierName = isTierName;
9
+ exports.loadAiConfig = loadAiConfig;
10
+ exports.setTier = setTier;
11
+ exports.unsetTier = unsetTier;
12
+ exports.setAlias = setAlias;
13
+ exports.unsetAlias = unsetAlias;
14
+ exports.resolveModelRef = resolveModelRef;
15
+ // packages/core/src/config/ai-config.ts
16
+ //
17
+ // Global AI tier/alias configuration, persisted in ~/.vsaf/config.yaml.
18
+ // Workflow nodes may reference `model: small|medium|large` (tiers) or
19
+ // `model: @name` (aliases); both resolve to a concrete provider+model here.
20
+ const fs_1 = require("fs");
21
+ const os_1 = require("os");
22
+ const path_1 = require("path");
23
+ const js_yaml_1 = __importDefault(require("js-yaml"));
24
+ exports.TIER_NAMES = ['small', 'medium', 'large'];
25
+ // When a tier has no preset, walk siblings before giving up.
26
+ const TIER_FALLBACK = {
27
+ small: ['small', 'medium', 'large'],
28
+ medium: ['medium', 'large', 'small'],
29
+ large: ['large', 'medium', 'small'],
30
+ };
31
+ const BUILT_IN_TIERS = {
32
+ claude: { small: 'haiku', medium: 'sonnet', large: 'opus' },
33
+ };
34
+ function vsafHome() {
35
+ return process.env.VSAF_HOME || (0, path_1.join)((0, os_1.homedir)(), '.vsaf');
36
+ }
37
+ function isTierName(value) {
38
+ return exports.TIER_NAMES.includes(value);
39
+ }
40
+ function globalConfigPath(homeDir) {
41
+ return (0, path_1.join)(homeDir, 'config.yaml');
42
+ }
43
+ function readRawConfig(homeDir) {
44
+ const path = globalConfigPath(homeDir);
45
+ if (!(0, fs_1.existsSync)(path))
46
+ return {};
47
+ const parsed = js_yaml_1.default.load((0, fs_1.readFileSync)(path, 'utf-8'));
48
+ return isRecord(parsed) ? parsed : {};
49
+ }
50
+ function writeRawConfig(homeDir, raw) {
51
+ (0, fs_1.mkdirSync)(homeDir, { recursive: true });
52
+ (0, fs_1.writeFileSync)(globalConfigPath(homeDir), js_yaml_1.default.dump(raw), 'utf-8');
53
+ }
54
+ function loadAiConfig(homeDir = vsafHome()) {
55
+ const raw = readRawConfig(homeDir);
56
+ const tiers = {};
57
+ if (isRecord(raw.tiers)) {
58
+ for (const [name, entry] of Object.entries(raw.tiers)) {
59
+ if (isTierName(name) && isModelPreset(entry)) {
60
+ tiers[name] = { provider: entry.provider, model: entry.model };
61
+ }
62
+ }
63
+ }
64
+ const aliases = {};
65
+ if (isRecord(raw.aliases)) {
66
+ for (const [name, entry] of Object.entries(raw.aliases)) {
67
+ if (name.startsWith('@') && isModelPreset(entry)) {
68
+ aliases[name] = { provider: entry.provider, model: entry.model };
69
+ }
70
+ }
71
+ }
72
+ return { tiers, aliases };
73
+ }
74
+ function setTier(tier, preset, homeDir = vsafHome()) {
75
+ assertTierName(tier);
76
+ assertPreset(preset);
77
+ const raw = readRawConfig(homeDir);
78
+ const tiers = isRecord(raw.tiers) ? raw.tiers : {};
79
+ tiers[tier] = { provider: preset.provider, model: preset.model };
80
+ raw.tiers = tiers;
81
+ writeRawConfig(homeDir, raw);
82
+ }
83
+ function unsetTier(tier, homeDir = vsafHome()) {
84
+ assertTierName(tier);
85
+ const raw = readRawConfig(homeDir);
86
+ if (!isRecord(raw.tiers) || !(tier in raw.tiers))
87
+ return false;
88
+ delete raw.tiers[tier];
89
+ writeRawConfig(homeDir, raw);
90
+ return true;
91
+ }
92
+ function setAlias(name, preset, homeDir = vsafHome()) {
93
+ assertAliasName(name);
94
+ assertPreset(preset);
95
+ const raw = readRawConfig(homeDir);
96
+ const aliases = isRecord(raw.aliases) ? raw.aliases : {};
97
+ aliases[name] = { provider: preset.provider, model: preset.model };
98
+ raw.aliases = aliases;
99
+ writeRawConfig(homeDir, raw);
100
+ }
101
+ function unsetAlias(name, homeDir = vsafHome()) {
102
+ assertAliasName(name);
103
+ const raw = readRawConfig(homeDir);
104
+ if (!isRecord(raw.aliases) || !(name in raw.aliases))
105
+ return false;
106
+ delete raw.aliases[name];
107
+ writeRawConfig(homeDir, raw);
108
+ return true;
109
+ }
110
+ /**
111
+ * Resolve a node's `model:` reference through tiers and aliases.
112
+ * Returns undefined for literal model names (pass-through), a concrete
113
+ * provider+model for tiers/aliases, and throws for unresolvable refs.
114
+ */
115
+ function resolveModelRef(ref, currentProvider, config) {
116
+ if (isTierName(ref)) {
117
+ for (const tier of TIER_FALLBACK[ref]) {
118
+ const preset = config.tiers[tier];
119
+ if (preset)
120
+ return { ...preset };
121
+ }
122
+ const builtIn = BUILT_IN_TIERS[currentProvider];
123
+ if (builtIn) {
124
+ for (const tier of TIER_FALLBACK[ref]) {
125
+ const model = builtIn[tier];
126
+ if (model)
127
+ return { provider: currentProvider, model };
128
+ }
129
+ }
130
+ throw new Error(`Tier '${ref}' has no configured preset and no built-in default for provider '${currentProvider}'. `
131
+ + `Set one with: vsaf ai tier set ${ref} <provider> <model>`);
132
+ }
133
+ if (ref.startsWith('@')) {
134
+ const preset = config.aliases[ref];
135
+ if (preset)
136
+ return { ...preset };
137
+ const defined = Object.keys(config.aliases);
138
+ throw new Error(`Unknown alias '${ref}'. ${defined.length > 0 ? `Defined aliases: ${defined.join(', ')}.` : 'No aliases defined.'} `
139
+ + `Set one with: vsaf ai alias set ${ref} <provider> <model>`);
140
+ }
141
+ return undefined;
142
+ }
143
+ function assertTierName(tier) {
144
+ if (!isTierName(tier)) {
145
+ throw new Error(`Invalid tier '${tier}'. Valid tiers: ${exports.TIER_NAMES.join(', ')}`);
146
+ }
147
+ }
148
+ function assertAliasName(name) {
149
+ if (!name.startsWith('@')) {
150
+ throw new Error(`Alias name must start with @ (got '${name}')`);
151
+ }
152
+ if (isTierName(name.slice(1))) {
153
+ throw new Error(`Alias name '${name}' shadows a reserved tier name (${exports.TIER_NAMES.join(', ')})`);
154
+ }
155
+ }
156
+ function assertPreset(preset) {
157
+ if (!preset.provider?.trim())
158
+ throw new Error('Provider must be a non-empty string');
159
+ if (!preset.model?.trim())
160
+ throw new Error('Model must be a non-empty string');
161
+ }
162
+ function isModelPreset(value) {
163
+ return isRecord(value)
164
+ && typeof value.provider === 'string' && value.provider.trim().length > 0
165
+ && typeof value.model === 'string' && value.model.trim().length > 0;
166
+ }
167
+ function isRecord(value) {
168
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
169
+ }
170
+ //# sourceMappingURL=ai-config.js.map