@litmers/cursorflow-orchestrator 0.1.20 → 0.1.28

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 (224) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/commands/cursorflow-clean.md +19 -0
  3. package/commands/cursorflow-runs.md +59 -0
  4. package/commands/cursorflow-stop.md +55 -0
  5. package/dist/cli/clean.js +171 -0
  6. package/dist/cli/clean.js.map +1 -1
  7. package/dist/cli/index.js +7 -0
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/init.js +1 -1
  10. package/dist/cli/init.js.map +1 -1
  11. package/dist/cli/logs.js +83 -42
  12. package/dist/cli/logs.js.map +1 -1
  13. package/dist/cli/monitor.d.ts +7 -0
  14. package/dist/cli/monitor.js +1007 -189
  15. package/dist/cli/monitor.js.map +1 -1
  16. package/dist/cli/prepare.js +87 -3
  17. package/dist/cli/prepare.js.map +1 -1
  18. package/dist/cli/resume.js +188 -236
  19. package/dist/cli/resume.js.map +1 -1
  20. package/dist/cli/run.js +125 -3
  21. package/dist/cli/run.js.map +1 -1
  22. package/dist/cli/runs.d.ts +5 -0
  23. package/dist/cli/runs.js +214 -0
  24. package/dist/cli/runs.js.map +1 -0
  25. package/dist/cli/setup-commands.js +0 -0
  26. package/dist/cli/signal.js +1 -1
  27. package/dist/cli/signal.js.map +1 -1
  28. package/dist/cli/stop.d.ts +5 -0
  29. package/dist/cli/stop.js +215 -0
  30. package/dist/cli/stop.js.map +1 -0
  31. package/dist/cli/tasks.d.ts +10 -0
  32. package/dist/cli/tasks.js +165 -0
  33. package/dist/cli/tasks.js.map +1 -0
  34. package/dist/core/auto-recovery.d.ts +212 -0
  35. package/dist/core/auto-recovery.js +737 -0
  36. package/dist/core/auto-recovery.js.map +1 -0
  37. package/dist/core/failure-policy.d.ts +156 -0
  38. package/dist/core/failure-policy.js +488 -0
  39. package/dist/core/failure-policy.js.map +1 -0
  40. package/dist/core/orchestrator.d.ts +15 -2
  41. package/dist/core/orchestrator.js +397 -15
  42. package/dist/core/orchestrator.js.map +1 -1
  43. package/dist/core/reviewer.d.ts +2 -0
  44. package/dist/core/reviewer.js +2 -0
  45. package/dist/core/reviewer.js.map +1 -1
  46. package/dist/core/runner.d.ts +33 -10
  47. package/dist/core/runner.js +321 -146
  48. package/dist/core/runner.js.map +1 -1
  49. package/dist/services/logging/buffer.d.ts +67 -0
  50. package/dist/services/logging/buffer.js +309 -0
  51. package/dist/services/logging/buffer.js.map +1 -0
  52. package/dist/services/logging/console.d.ts +89 -0
  53. package/dist/services/logging/console.js +169 -0
  54. package/dist/services/logging/console.js.map +1 -0
  55. package/dist/services/logging/file-writer.d.ts +71 -0
  56. package/dist/services/logging/file-writer.js +516 -0
  57. package/dist/services/logging/file-writer.js.map +1 -0
  58. package/dist/services/logging/formatter.d.ts +39 -0
  59. package/dist/services/logging/formatter.js +227 -0
  60. package/dist/services/logging/formatter.js.map +1 -0
  61. package/dist/services/logging/index.d.ts +11 -0
  62. package/dist/services/logging/index.js +30 -0
  63. package/dist/services/logging/index.js.map +1 -0
  64. package/dist/services/logging/parser.d.ts +31 -0
  65. package/dist/services/logging/parser.js +222 -0
  66. package/dist/services/logging/parser.js.map +1 -0
  67. package/dist/services/process/index.d.ts +59 -0
  68. package/dist/services/process/index.js +257 -0
  69. package/dist/services/process/index.js.map +1 -0
  70. package/dist/types/agent.d.ts +20 -0
  71. package/dist/types/agent.js +6 -0
  72. package/dist/types/agent.js.map +1 -0
  73. package/dist/types/config.d.ts +65 -0
  74. package/dist/types/config.js +6 -0
  75. package/dist/types/config.js.map +1 -0
  76. package/dist/types/events.d.ts +125 -0
  77. package/dist/types/events.js +6 -0
  78. package/dist/types/events.js.map +1 -0
  79. package/dist/types/index.d.ts +12 -0
  80. package/dist/types/index.js +37 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/types/lane.d.ts +43 -0
  83. package/dist/types/lane.js +6 -0
  84. package/dist/types/lane.js.map +1 -0
  85. package/dist/types/logging.d.ts +71 -0
  86. package/dist/types/logging.js +16 -0
  87. package/dist/types/logging.js.map +1 -0
  88. package/dist/types/review.d.ts +17 -0
  89. package/dist/types/review.js +6 -0
  90. package/dist/types/review.js.map +1 -0
  91. package/dist/types/run.d.ts +32 -0
  92. package/dist/types/run.js +6 -0
  93. package/dist/types/run.js.map +1 -0
  94. package/dist/types/task.d.ts +71 -0
  95. package/dist/types/task.js +6 -0
  96. package/dist/types/task.js.map +1 -0
  97. package/dist/ui/components.d.ts +134 -0
  98. package/dist/ui/components.js +389 -0
  99. package/dist/ui/components.js.map +1 -0
  100. package/dist/ui/log-viewer.d.ts +49 -0
  101. package/dist/ui/log-viewer.js +449 -0
  102. package/dist/ui/log-viewer.js.map +1 -0
  103. package/dist/utils/checkpoint.d.ts +87 -0
  104. package/dist/utils/checkpoint.js +317 -0
  105. package/dist/utils/checkpoint.js.map +1 -0
  106. package/dist/utils/config.d.ts +4 -0
  107. package/dist/utils/config.js +11 -2
  108. package/dist/utils/config.js.map +1 -1
  109. package/dist/utils/cursor-agent.js.map +1 -1
  110. package/dist/utils/dependency.d.ts +74 -0
  111. package/dist/utils/dependency.js +420 -0
  112. package/dist/utils/dependency.js.map +1 -0
  113. package/dist/utils/doctor.js +10 -5
  114. package/dist/utils/doctor.js.map +1 -1
  115. package/dist/utils/enhanced-logger.d.ts +10 -33
  116. package/dist/utils/enhanced-logger.js +94 -9
  117. package/dist/utils/enhanced-logger.js.map +1 -1
  118. package/dist/utils/git.d.ts +121 -0
  119. package/dist/utils/git.js +322 -2
  120. package/dist/utils/git.js.map +1 -1
  121. package/dist/utils/health.d.ts +91 -0
  122. package/dist/utils/health.js +556 -0
  123. package/dist/utils/health.js.map +1 -0
  124. package/dist/utils/lock.d.ts +95 -0
  125. package/dist/utils/lock.js +332 -0
  126. package/dist/utils/lock.js.map +1 -0
  127. package/dist/utils/log-buffer.d.ts +17 -0
  128. package/dist/utils/log-buffer.js +14 -0
  129. package/dist/utils/log-buffer.js.map +1 -0
  130. package/dist/utils/log-constants.d.ts +23 -0
  131. package/dist/utils/log-constants.js +28 -0
  132. package/dist/utils/log-constants.js.map +1 -0
  133. package/dist/utils/log-formatter.d.ts +9 -0
  134. package/dist/utils/log-formatter.js +113 -70
  135. package/dist/utils/log-formatter.js.map +1 -1
  136. package/dist/utils/log-service.d.ts +19 -0
  137. package/dist/utils/log-service.js +47 -0
  138. package/dist/utils/log-service.js.map +1 -0
  139. package/dist/utils/logger.d.ts +46 -27
  140. package/dist/utils/logger.js +82 -60
  141. package/dist/utils/logger.js.map +1 -1
  142. package/dist/utils/process-manager.d.ts +21 -0
  143. package/dist/utils/process-manager.js +138 -0
  144. package/dist/utils/process-manager.js.map +1 -0
  145. package/dist/utils/retry.d.ts +121 -0
  146. package/dist/utils/retry.js +374 -0
  147. package/dist/utils/retry.js.map +1 -0
  148. package/dist/utils/run-service.d.ts +88 -0
  149. package/dist/utils/run-service.js +412 -0
  150. package/dist/utils/run-service.js.map +1 -0
  151. package/dist/utils/state.d.ts +58 -2
  152. package/dist/utils/state.js +306 -3
  153. package/dist/utils/state.js.map +1 -1
  154. package/dist/utils/task-service.d.ts +82 -0
  155. package/dist/utils/task-service.js +348 -0
  156. package/dist/utils/task-service.js.map +1 -0
  157. package/dist/utils/types.d.ts +2 -272
  158. package/dist/utils/types.js +16 -0
  159. package/dist/utils/types.js.map +1 -1
  160. package/package.json +38 -23
  161. package/scripts/ai-security-check.js +0 -1
  162. package/scripts/local-security-gate.sh +0 -0
  163. package/scripts/monitor-lanes.sh +94 -0
  164. package/scripts/patches/test-cursor-agent.js +0 -1
  165. package/scripts/release.sh +0 -0
  166. package/scripts/setup-security.sh +0 -0
  167. package/scripts/stream-logs.sh +72 -0
  168. package/scripts/verify-and-fix.sh +0 -0
  169. package/src/cli/clean.ts +180 -0
  170. package/src/cli/index.ts +7 -0
  171. package/src/cli/init.ts +1 -1
  172. package/src/cli/logs.ts +79 -42
  173. package/src/cli/monitor.ts +1815 -899
  174. package/src/cli/prepare.ts +97 -3
  175. package/src/cli/resume.ts +220 -277
  176. package/src/cli/run.ts +154 -3
  177. package/src/cli/runs.ts +212 -0
  178. package/src/cli/setup-commands.ts +0 -0
  179. package/src/cli/signal.ts +1 -1
  180. package/src/cli/stop.ts +209 -0
  181. package/src/cli/tasks.ts +154 -0
  182. package/src/core/auto-recovery.ts +909 -0
  183. package/src/core/failure-policy.ts +592 -0
  184. package/src/core/orchestrator.ts +1136 -675
  185. package/src/core/reviewer.ts +4 -0
  186. package/src/core/runner.ts +1443 -1217
  187. package/src/services/logging/buffer.ts +326 -0
  188. package/src/services/logging/console.ts +193 -0
  189. package/src/services/logging/file-writer.ts +526 -0
  190. package/src/services/logging/formatter.ts +268 -0
  191. package/src/services/logging/index.ts +16 -0
  192. package/src/services/logging/parser.ts +232 -0
  193. package/src/services/process/index.ts +261 -0
  194. package/src/types/agent.ts +24 -0
  195. package/src/types/config.ts +79 -0
  196. package/src/types/events.ts +156 -0
  197. package/src/types/index.ts +29 -0
  198. package/src/types/lane.ts +56 -0
  199. package/src/types/logging.ts +96 -0
  200. package/src/types/review.ts +20 -0
  201. package/src/types/run.ts +37 -0
  202. package/src/types/task.ts +79 -0
  203. package/src/ui/components.ts +430 -0
  204. package/src/ui/log-viewer.ts +485 -0
  205. package/src/utils/checkpoint.ts +374 -0
  206. package/src/utils/config.ts +11 -2
  207. package/src/utils/cursor-agent.ts +1 -1
  208. package/src/utils/dependency.ts +482 -0
  209. package/src/utils/doctor.ts +11 -5
  210. package/src/utils/enhanced-logger.ts +108 -49
  211. package/src/utils/git.ts +871 -499
  212. package/src/utils/health.ts +596 -0
  213. package/src/utils/lock.ts +346 -0
  214. package/src/utils/log-buffer.ts +28 -0
  215. package/src/utils/log-constants.ts +26 -0
  216. package/src/utils/log-formatter.ts +120 -37
  217. package/src/utils/log-service.ts +49 -0
  218. package/src/utils/logger.ts +100 -51
  219. package/src/utils/process-manager.ts +100 -0
  220. package/src/utils/retry.ts +413 -0
  221. package/src/utils/run-service.ts +433 -0
  222. package/src/utils/state.ts +369 -3
  223. package/src/utils/task-service.ts +370 -0
  224. package/src/utils/types.ts +2 -315
@@ -0,0 +1,412 @@
1
+ "use strict";
2
+ /**
3
+ * RunService - Manages CursorFlow run history and active processes
4
+ *
5
+ * Provides:
6
+ * - List all runs (with filtering by status)
7
+ * - Get detailed run information
8
+ * - Stop running processes
9
+ * - Delete run resources
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.RunService = void 0;
46
+ exports.createRunService = createRunService;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const logger = __importStar(require("./logger"));
50
+ class RunService {
51
+ logsDir;
52
+ runsDir;
53
+ constructor(logsDir) {
54
+ this.logsDir = logsDir;
55
+ this.runsDir = path.join(logsDir, 'runs');
56
+ }
57
+ /**
58
+ * List all runs with optional filtering
59
+ */
60
+ listRuns(filter = {}) {
61
+ const { status, limit, taskName } = filter;
62
+ if (!fs.existsSync(this.runsDir)) {
63
+ return [];
64
+ }
65
+ const runDirs = fs.readdirSync(this.runsDir)
66
+ .filter(name => name.startsWith('run-'))
67
+ .sort((a, b) => b.localeCompare(a)); // Most recent first
68
+ let runs = [];
69
+ for (const runId of runDirs) {
70
+ const runInfo = this.getRunInfo(runId);
71
+ if (!runInfo)
72
+ continue;
73
+ // Apply filters
74
+ if (status && runInfo.status !== status)
75
+ continue;
76
+ if (taskName && !runInfo.taskName.toLowerCase().includes(taskName.toLowerCase()))
77
+ continue;
78
+ runs.push(runInfo);
79
+ if (limit && runs.length >= limit)
80
+ break;
81
+ }
82
+ return runs;
83
+ }
84
+ /**
85
+ * Get detailed information about a specific run
86
+ */
87
+ getRunInfo(runId) {
88
+ const runPath = path.join(this.runsDir, runId);
89
+ if (!fs.existsSync(runPath)) {
90
+ return null;
91
+ }
92
+ try {
93
+ // Read orchestrator state
94
+ const statePath = path.join(runPath, 'state.json');
95
+ let taskName = 'Unknown';
96
+ let lanes = [];
97
+ let branches = [];
98
+ let worktrees = [];
99
+ if (fs.existsSync(statePath)) {
100
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
101
+ taskName = state.taskName || this.extractTaskNameFromRunId(runId);
102
+ // Extract lane info from state
103
+ if (state.lanes) {
104
+ for (const [laneName, laneState] of Object.entries(state.lanes)) {
105
+ const ls = laneState;
106
+ lanes.push({
107
+ name: laneName,
108
+ status: ls.status,
109
+ currentTask: ls.currentTaskIndex,
110
+ totalTasks: ls.totalTasks,
111
+ pid: ls.pid,
112
+ pipelineBranch: ls.pipelineBranch || undefined,
113
+ });
114
+ if (ls.pipelineBranch) {
115
+ branches.push(ls.pipelineBranch);
116
+ }
117
+ if (ls.worktreeDir) {
118
+ worktrees.push(ls.worktreeDir);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ // Alternatively, scan lanes directory
124
+ const lanesDir = path.join(runPath, 'lanes');
125
+ if (fs.existsSync(lanesDir) && lanes.length === 0) {
126
+ const laneDirs = fs.readdirSync(lanesDir);
127
+ for (const laneName of laneDirs) {
128
+ const laneStatePath = path.join(lanesDir, laneName, 'state.json');
129
+ if (fs.existsSync(laneStatePath)) {
130
+ try {
131
+ const laneState = JSON.parse(fs.readFileSync(laneStatePath, 'utf-8'));
132
+ lanes.push({
133
+ name: laneName,
134
+ status: laneState.status,
135
+ currentTask: laneState.currentTaskIndex,
136
+ totalTasks: laneState.totalTasks,
137
+ pid: laneState.pid,
138
+ pipelineBranch: laneState.pipelineBranch || undefined,
139
+ });
140
+ if (laneState.pipelineBranch) {
141
+ branches.push(laneState.pipelineBranch);
142
+ }
143
+ if (laneState.worktreeDir) {
144
+ worktrees.push(laneState.worktreeDir);
145
+ }
146
+ }
147
+ catch {
148
+ // Skip invalid state files
149
+ }
150
+ }
151
+ }
152
+ }
153
+ // Calculate run status and timing
154
+ const status = this.calculateRunStatus(lanes);
155
+ const startTime = this.extractTimestampFromRunId(runId);
156
+ const endTime = this.getRunEndTime(runPath, lanes);
157
+ const duration = endTime ? endTime - startTime : Date.now() - startTime;
158
+ return {
159
+ id: runId,
160
+ path: runPath,
161
+ taskName,
162
+ status,
163
+ startTime,
164
+ endTime,
165
+ duration,
166
+ lanes,
167
+ branches: [...new Set(branches)],
168
+ worktrees: [...new Set(worktrees)],
169
+ };
170
+ }
171
+ catch (error) {
172
+ logger.debug(`Failed to read run info for ${runId}: ${error}`);
173
+ return null;
174
+ }
175
+ }
176
+ /**
177
+ * Get currently active (running) runs
178
+ */
179
+ getActiveRuns() {
180
+ return this.listRuns({ status: 'running' });
181
+ }
182
+ /**
183
+ * Calculate overall run status based on lane statuses
184
+ */
185
+ calculateRunStatus(lanes) {
186
+ if (lanes.length === 0)
187
+ return 'pending';
188
+ const statuses = lanes.map(l => l.status);
189
+ // If any lane is running, the run is running
190
+ if (statuses.some(s => s === 'running' || s === 'reviewing')) {
191
+ return 'running';
192
+ }
193
+ // If all lanes are completed, the run is completed
194
+ if (statuses.every(s => s === 'completed')) {
195
+ return 'completed';
196
+ }
197
+ // If any lane failed and none are running, check for partial completion
198
+ if (statuses.some(s => s === 'failed')) {
199
+ const hasCompleted = statuses.some(s => s === 'completed');
200
+ return hasCompleted ? 'partial' : 'failed';
201
+ }
202
+ // If some are pending and some completed
203
+ if (statuses.some(s => s === 'pending' || s === 'waiting')) {
204
+ return statuses.some(s => s === 'completed') ? 'partial' : 'pending';
205
+ }
206
+ return 'pending';
207
+ }
208
+ /**
209
+ * Extract timestamp from run ID (format: run-TIMESTAMP)
210
+ */
211
+ extractTimestampFromRunId(runId) {
212
+ const match = runId.match(/run-(\d+)/);
213
+ return match ? parseInt(match[1], 10) : Date.now();
214
+ }
215
+ /**
216
+ * Extract task name from run ID or directory structure
217
+ */
218
+ extractTaskNameFromRunId(runId) {
219
+ // Try to read from any lane's tasks file reference
220
+ const runPath = path.join(this.runsDir, runId);
221
+ const lanesDir = path.join(runPath, 'lanes');
222
+ if (fs.existsSync(lanesDir)) {
223
+ const laneDirs = fs.readdirSync(lanesDir);
224
+ for (const laneName of laneDirs) {
225
+ const statePath = path.join(lanesDir, laneName, 'state.json');
226
+ if (fs.existsSync(statePath)) {
227
+ try {
228
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
229
+ if (state.tasksFile) {
230
+ const taskDir = path.basename(path.dirname(state.tasksFile));
231
+ // Extract feature name from timestamp_FeatureName format
232
+ const parts = taskDir.split('_');
233
+ if (parts.length >= 2) {
234
+ return parts.slice(1).join('_');
235
+ }
236
+ return taskDir;
237
+ }
238
+ }
239
+ catch {
240
+ // Continue to next lane
241
+ }
242
+ }
243
+ }
244
+ }
245
+ return 'Unknown';
246
+ }
247
+ /**
248
+ * Get run end time from lane states
249
+ */
250
+ getRunEndTime(runPath, lanes) {
251
+ const terminalStatuses = ['completed', 'failed'];
252
+ if (!lanes.every(l => terminalStatuses.includes(l.status))) {
253
+ return undefined; // Still running
254
+ }
255
+ // Find the latest end time from lane states
256
+ const lanesDir = path.join(runPath, 'lanes');
257
+ let latestEndTime = 0;
258
+ if (fs.existsSync(lanesDir)) {
259
+ const laneDirs = fs.readdirSync(lanesDir);
260
+ for (const laneName of laneDirs) {
261
+ const statePath = path.join(lanesDir, laneName, 'state.json');
262
+ if (fs.existsSync(statePath)) {
263
+ try {
264
+ const state = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
265
+ if (state.endTime && state.endTime > latestEndTime) {
266
+ latestEndTime = state.endTime;
267
+ }
268
+ }
269
+ catch {
270
+ // Skip
271
+ }
272
+ }
273
+ }
274
+ }
275
+ return latestEndTime > 0 ? latestEndTime : undefined;
276
+ }
277
+ /**
278
+ * Get resources linked to a run (branches, worktrees)
279
+ */
280
+ getLinkedResources(runId) {
281
+ const runInfo = this.getRunInfo(runId);
282
+ if (!runInfo) {
283
+ return { branches: [], worktrees: [], logSize: 0 };
284
+ }
285
+ // Calculate log size
286
+ let logSize = 0;
287
+ try {
288
+ logSize = this.getDirectorySize(runInfo.path);
289
+ }
290
+ catch {
291
+ // Ignore size calculation errors
292
+ }
293
+ return {
294
+ branches: runInfo.branches,
295
+ worktrees: runInfo.worktrees,
296
+ logSize,
297
+ };
298
+ }
299
+ /**
300
+ * Stop a running workflow
301
+ */
302
+ stopRun(runId) {
303
+ const runInfo = this.getRunInfo(runId);
304
+ if (!runInfo || runInfo.status !== 'running') {
305
+ return false;
306
+ }
307
+ let stopped = false;
308
+ for (const lane of runInfo.lanes) {
309
+ if (lane.pid && lane.status === 'running') {
310
+ try {
311
+ process.kill(lane.pid, 'SIGTERM');
312
+ stopped = true;
313
+ logger.info(`Stopped lane ${lane.name} (PID: ${lane.pid})`, { context: runId });
314
+ }
315
+ catch (error) {
316
+ logger.debug(`Failed to stop lane ${lane.name}: ${error}`);
317
+ }
318
+ }
319
+ }
320
+ return stopped;
321
+ }
322
+ /**
323
+ * Stop all running workflows
324
+ */
325
+ stopAllRuns() {
326
+ const activeRuns = this.getActiveRuns();
327
+ let stoppedCount = 0;
328
+ for (const run of activeRuns) {
329
+ if (this.stopRun(run.id)) {
330
+ stoppedCount++;
331
+ }
332
+ }
333
+ return stoppedCount;
334
+ }
335
+ /**
336
+ * Delete a run and optionally its associated resources
337
+ */
338
+ deleteRun(runId, options = {}) {
339
+ const runInfo = this.getRunInfo(runId);
340
+ if (!runInfo) {
341
+ throw new Error(`Run not found: ${runId}`);
342
+ }
343
+ // Don't delete running runs
344
+ if (runInfo.status === 'running') {
345
+ throw new Error(`Cannot delete running run: ${runId}. Stop it first.`);
346
+ }
347
+ // Delete log directory
348
+ if (fs.existsSync(runInfo.path)) {
349
+ fs.rmSync(runInfo.path, { recursive: true, force: true });
350
+ logger.success(`Deleted run logs: ${runId}`);
351
+ }
352
+ // Note: Branch and worktree deletion should be handled by clean command
353
+ // as it requires git operations
354
+ }
355
+ /**
356
+ * Calculate directory size in bytes
357
+ */
358
+ getDirectorySize(dirPath) {
359
+ let size = 0;
360
+ const files = fs.readdirSync(dirPath);
361
+ for (const file of files) {
362
+ const filePath = path.join(dirPath, file);
363
+ const stat = fs.statSync(filePath);
364
+ if (stat.isDirectory()) {
365
+ size += this.getDirectorySize(filePath);
366
+ }
367
+ else {
368
+ size += stat.size;
369
+ }
370
+ }
371
+ return size;
372
+ }
373
+ /**
374
+ * Format duration for display
375
+ */
376
+ static formatDuration(ms) {
377
+ const seconds = Math.floor(ms / 1000);
378
+ const minutes = Math.floor(seconds / 60);
379
+ const hours = Math.floor(minutes / 60);
380
+ if (hours > 0) {
381
+ return `${hours}h ${minutes % 60}m`;
382
+ }
383
+ else if (minutes > 0) {
384
+ return `${minutes}m ${seconds % 60}s`;
385
+ }
386
+ else {
387
+ return `${seconds}s`;
388
+ }
389
+ }
390
+ /**
391
+ * Format bytes for display
392
+ */
393
+ static formatBytes(bytes) {
394
+ if (bytes < 1024)
395
+ return `${bytes} B`;
396
+ if (bytes < 1024 * 1024)
397
+ return `${(bytes / 1024).toFixed(1)} KB`;
398
+ if (bytes < 1024 * 1024 * 1024)
399
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
400
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
401
+ }
402
+ }
403
+ exports.RunService = RunService;
404
+ /**
405
+ * Create a RunService instance with default paths
406
+ */
407
+ function createRunService(projectRoot) {
408
+ const root = projectRoot || process.cwd();
409
+ const logsDir = path.join(root, '_cursorflow', 'logs');
410
+ return new RunService(logsDir);
411
+ }
412
+ //# sourceMappingURL=run-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-service.js","sourceRoot":"","sources":["../../src/utils/run-service.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoaH,4CAIC;AAtaD,uCAAyB;AACzB,2CAA6B;AAE7B,iDAAmC;AAcnC,MAAa,UAAU;IACb,OAAO,CAAS;IAChB,OAAO,CAAS;IAExB,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,SAAoB,EAAE;QAC7B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;QAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;aACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB;QAE3D,IAAI,IAAI,GAAc,EAAE,CAAC;QAEzB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,gBAAgB;YAChB,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAS;YAClD,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAAE,SAAS;YAE3F,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEnB,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;gBAAE,MAAM;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAAa;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,0BAA0B;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACnD,IAAI,QAAQ,GAAG,SAAS,CAAC;YACzB,IAAI,KAAK,GAAe,EAAE,CAAC;YAC3B,IAAI,QAAQ,GAAa,EAAE,CAAC;YAC5B,IAAI,SAAS,GAAa,EAAE,CAAC;YAE7B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC9D,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBAElE,+BAA+B;gBAC/B,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChE,MAAM,EAAE,GAAG,SAAsB,CAAC;wBAClC,KAAK,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,QAAQ;4BACd,MAAM,EAAE,EAAE,CAAC,MAAM;4BACjB,WAAW,EAAE,EAAE,CAAC,gBAAgB;4BAChC,UAAU,EAAE,EAAE,CAAC,UAAU;4BACzB,GAAG,EAAE,EAAE,CAAC,GAAG;4BACX,cAAc,EAAE,EAAE,CAAC,cAAc,IAAI,SAAS;yBAC/C,CAAC,CAAC;wBAEH,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;4BACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;wBACnC,CAAC;wBACD,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;4BACnB,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;wBACjC,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,sCAAsC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC1C,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;oBAChC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAClE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;wBACjC,IAAI,CAAC;4BACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAc,CAAC;4BACnF,KAAK,CAAC,IAAI,CAAC;gCACT,IAAI,EAAE,QAAQ;gCACd,MAAM,EAAE,SAAS,CAAC,MAAM;gCACxB,WAAW,EAAE,SAAS,CAAC,gBAAgB;gCACvC,UAAU,EAAE,SAAS,CAAC,UAAU;gCAChC,GAAG,EAAE,SAAS,CAAC,GAAG;gCAClB,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,SAAS;6BACtD,CAAC,CAAC;4BAEH,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;gCAC7B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;4BAC1C,CAAC;4BACD,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;gCAC1B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;4BACxC,CAAC;wBACH,CAAC;wBAAC,MAAM,CAAC;4BACP,2BAA2B;wBAC7B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExE,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,OAAO;gBACb,QAAQ;gBACR,MAAM;gBACN,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,KAAK;gBACL,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChC,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;aACnC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,KAAiB;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAE1C,6CAA6C;QAC7C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,mDAAmD;QACnD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,EAAE,CAAC;YAC3C,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,wEAAwE;QACxE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;YAC3D,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7C,CAAC;QAED,yCAAyC;QACzC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;YAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,KAAa;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,KAAa;QAC5C,mDAAmD;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC1C,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;wBAC9D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;4BACpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;4BAC7D,yDAAyD;4BACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BACjC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gCACtB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAClC,CAAC;4BACD,OAAO,OAAO,CAAC;wBACjB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe,EAAE,KAAiB;QACtD,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEjD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,SAAS,CAAC,CAAC,gBAAgB;QACpC,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC1C,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAc,CAAC;wBAC3E,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;4BACnD,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;wBAChC,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,KAAa;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACrD,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAa;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;oBAClC,OAAO,GAAG,IAAI,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,GAAG,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzB,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAa,EAAE,UAA0D,EAAE;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,4BAA4B;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,kBAAkB,CAAC,CAAC;QACzE,CAAC;QAED,uBAAuB;QACvB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,wEAAwE;QACxE,gCAAgC;IAClC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,OAAe;QACtC,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;YACpB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,EAAU;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAEvC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;QACtC,CAAC;aAAM,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,OAAO,GAAG,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa;QAC9B,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,GAAG,KAAK,IAAI,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAClF,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,CAAC;CACF;AA5YD,gCA4YC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,WAAoB;IACnD,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -1,16 +1,72 @@
1
1
  /**
2
2
  * State management utilities for CursorFlow
3
+ *
4
+ * Features:
5
+ * - Atomic writes to prevent corruption
6
+ * - State validation and repair
7
+ * - Versioned state with conflict detection
3
8
  */
4
9
  import { LaneState, ConversationEntry, GitLogEntry, EventEntry, RunnerConfig } from './types';
10
+ import { LockOptions } from './lock';
5
11
  export { LaneState, ConversationEntry, GitLogEntry, EventEntry };
6
12
  /**
7
- * Save state to JSON file
13
+ * Extended state with metadata for versioning
14
+ */
15
+ export interface VersionedState<T> {
16
+ _version: number;
17
+ _updatedAt: number;
18
+ _pid: number;
19
+ data: T;
20
+ }
21
+ /**
22
+ * State validation result
23
+ */
24
+ export interface StateValidationResult {
25
+ valid: boolean;
26
+ issues: string[];
27
+ repaired: boolean;
28
+ repairedState?: LaneState;
29
+ }
30
+ /**
31
+ * Save state to JSON file with atomic write
8
32
  */
9
33
  export declare function saveState(statePath: string, state: any): void;
10
34
  /**
11
- * Load state from JSON file
35
+ * Save state with file lock to prevent race conditions
36
+ */
37
+ export declare function saveStateWithLock(statePath: string, state: any, lockOptions?: LockOptions): void;
38
+ /**
39
+ * Load state from JSON file with corruption recovery
12
40
  */
13
41
  export declare function loadState<T = any>(statePath: string): T | null;
42
+ /**
43
+ * Load state with automatic backup creation
44
+ */
45
+ export declare function loadStateWithBackup<T = any>(statePath: string): T | null;
46
+ /**
47
+ * Update state with optimistic locking
48
+ */
49
+ export declare function updateStateAtomic(statePath: string, updater: (state: LaneState | null) => LaneState): LaneState;
50
+ /**
51
+ * Validate lane state and check for inconsistencies
52
+ */
53
+ export declare function validateLaneState(statePath: string, options?: {
54
+ checkWorktree?: boolean;
55
+ checkBranch?: boolean;
56
+ autoRepair?: boolean;
57
+ }): StateValidationResult;
58
+ /**
59
+ * Repair lane state by resetting inconsistent values
60
+ */
61
+ export declare function repairLaneState(statePath: string): LaneState | null;
62
+ /**
63
+ * Check if state needs recovery (e.g., after crash)
64
+ */
65
+ export declare function stateNeedsRecovery(statePath: string): boolean;
66
+ /**
67
+ * Clean up temp files from incomplete writes
68
+ */
69
+ export declare function cleanupTempFiles(stateDir: string): number;
14
70
  /**
15
71
  * Append to JSONL log file
16
72
  */