@litmers/cursorflow-orchestrator 0.1.18 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +25 -7
- package/commands/cursorflow-clean.md +19 -0
- package/commands/cursorflow-runs.md +59 -0
- package/commands/cursorflow-stop.md +55 -0
- package/dist/cli/clean.js +178 -6
- package/dist/cli/clean.js.map +1 -1
- package/dist/cli/index.js +12 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.js +8 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/logs.js +126 -77
- package/dist/cli/logs.js.map +1 -1
- package/dist/cli/monitor.d.ts +7 -0
- package/dist/cli/monitor.js +1021 -202
- package/dist/cli/monitor.js.map +1 -1
- package/dist/cli/prepare.js +39 -21
- package/dist/cli/prepare.js.map +1 -1
- package/dist/cli/resume.js +268 -163
- package/dist/cli/resume.js.map +1 -1
- package/dist/cli/run.js +11 -5
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/runs.d.ts +5 -0
- package/dist/cli/runs.js +214 -0
- package/dist/cli/runs.js.map +1 -0
- package/dist/cli/setup-commands.js +0 -0
- package/dist/cli/signal.js +8 -8
- package/dist/cli/signal.js.map +1 -1
- package/dist/cli/stop.d.ts +5 -0
- package/dist/cli/stop.js +215 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/cli/tasks.d.ts +10 -0
- package/dist/cli/tasks.js +165 -0
- package/dist/cli/tasks.js.map +1 -0
- package/dist/core/auto-recovery.d.ts +212 -0
- package/dist/core/auto-recovery.js +737 -0
- package/dist/core/auto-recovery.js.map +1 -0
- package/dist/core/failure-policy.d.ts +156 -0
- package/dist/core/failure-policy.js +488 -0
- package/dist/core/failure-policy.js.map +1 -0
- package/dist/core/orchestrator.d.ts +16 -2
- package/dist/core/orchestrator.js +439 -105
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/reviewer.d.ts +2 -0
- package/dist/core/reviewer.js +2 -0
- package/dist/core/reviewer.js.map +1 -1
- package/dist/core/runner.d.ts +33 -10
- package/dist/core/runner.js +374 -164
- package/dist/core/runner.js.map +1 -1
- package/dist/services/logging/buffer.d.ts +67 -0
- package/dist/services/logging/buffer.js +309 -0
- package/dist/services/logging/buffer.js.map +1 -0
- package/dist/services/logging/console.d.ts +89 -0
- package/dist/services/logging/console.js +169 -0
- package/dist/services/logging/console.js.map +1 -0
- package/dist/services/logging/file-writer.d.ts +71 -0
- package/dist/services/logging/file-writer.js +516 -0
- package/dist/services/logging/file-writer.js.map +1 -0
- package/dist/services/logging/formatter.d.ts +39 -0
- package/dist/services/logging/formatter.js +227 -0
- package/dist/services/logging/formatter.js.map +1 -0
- package/dist/services/logging/index.d.ts +11 -0
- package/dist/services/logging/index.js +30 -0
- package/dist/services/logging/index.js.map +1 -0
- package/dist/services/logging/parser.d.ts +31 -0
- package/dist/services/logging/parser.js +222 -0
- package/dist/services/logging/parser.js.map +1 -0
- package/dist/services/process/index.d.ts +59 -0
- package/dist/services/process/index.js +257 -0
- package/dist/services/process/index.js.map +1 -0
- package/dist/types/agent.d.ts +20 -0
- package/dist/types/agent.js +6 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/config.d.ts +65 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +125 -0
- package/dist/types/events.js +6 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lane.d.ts +43 -0
- package/dist/types/lane.js +6 -0
- package/dist/types/lane.js.map +1 -0
- package/dist/types/logging.d.ts +71 -0
- package/dist/types/logging.js +16 -0
- package/dist/types/logging.js.map +1 -0
- package/dist/types/review.d.ts +17 -0
- package/dist/types/review.js +6 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/run.d.ts +32 -0
- package/dist/types/run.js +6 -0
- package/dist/types/run.js.map +1 -0
- package/dist/types/task.d.ts +71 -0
- package/dist/types/task.js +6 -0
- package/dist/types/task.js.map +1 -0
- package/dist/ui/components.d.ts +134 -0
- package/dist/ui/components.js +389 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/log-viewer.d.ts +49 -0
- package/dist/ui/log-viewer.js +449 -0
- package/dist/ui/log-viewer.js.map +1 -0
- package/dist/utils/checkpoint.d.ts +87 -0
- package/dist/utils/checkpoint.js +317 -0
- package/dist/utils/checkpoint.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +18 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/cursor-agent.js.map +1 -1
- package/dist/utils/dependency.d.ts +74 -0
- package/dist/utils/dependency.js +420 -0
- package/dist/utils/dependency.js.map +1 -0
- package/dist/utils/doctor.js +17 -11
- package/dist/utils/doctor.js.map +1 -1
- package/dist/utils/enhanced-logger.d.ts +10 -33
- package/dist/utils/enhanced-logger.js +108 -20
- package/dist/utils/enhanced-logger.js.map +1 -1
- package/dist/utils/git.d.ts +121 -0
- package/dist/utils/git.js +484 -11
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/health.d.ts +91 -0
- package/dist/utils/health.js +556 -0
- package/dist/utils/health.js.map +1 -0
- package/dist/utils/lock.d.ts +95 -0
- package/dist/utils/lock.js +332 -0
- package/dist/utils/lock.js.map +1 -0
- package/dist/utils/log-buffer.d.ts +17 -0
- package/dist/utils/log-buffer.js +14 -0
- package/dist/utils/log-buffer.js.map +1 -0
- package/dist/utils/log-constants.d.ts +23 -0
- package/dist/utils/log-constants.js +28 -0
- package/dist/utils/log-constants.js.map +1 -0
- package/dist/utils/log-formatter.d.ts +25 -0
- package/dist/utils/log-formatter.js +237 -0
- package/dist/utils/log-formatter.js.map +1 -0
- package/dist/utils/log-service.d.ts +19 -0
- package/dist/utils/log-service.js +47 -0
- package/dist/utils/log-service.js.map +1 -0
- package/dist/utils/logger.d.ts +46 -27
- package/dist/utils/logger.js +82 -60
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/path.d.ts +19 -0
- package/dist/utils/path.js +77 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/process-manager.d.ts +21 -0
- package/dist/utils/process-manager.js +138 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/retry.d.ts +121 -0
- package/dist/utils/retry.js +374 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/run-service.d.ts +88 -0
- package/dist/utils/run-service.js +412 -0
- package/dist/utils/run-service.js.map +1 -0
- package/dist/utils/state.d.ts +62 -3
- package/dist/utils/state.js +317 -11
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/task-service.d.ts +82 -0
- package/dist/utils/task-service.js +348 -0
- package/dist/utils/task-service.js.map +1 -0
- package/dist/utils/template.d.ts +14 -0
- package/dist/utils/template.js +122 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/types.d.ts +2 -271
- package/dist/utils/types.js +16 -0
- package/dist/utils/types.js.map +1 -1
- package/package.json +38 -23
- package/scripts/ai-security-check.js +0 -1
- package/scripts/local-security-gate.sh +0 -0
- package/scripts/monitor-lanes.sh +94 -0
- package/scripts/patches/test-cursor-agent.js +0 -1
- package/scripts/release.sh +0 -0
- package/scripts/setup-security.sh +0 -0
- package/scripts/stream-logs.sh +72 -0
- package/scripts/verify-and-fix.sh +0 -0
- package/src/cli/clean.ts +187 -6
- package/src/cli/index.ts +12 -1
- package/src/cli/init.ts +8 -7
- package/src/cli/logs.ts +124 -77
- package/src/cli/monitor.ts +1815 -898
- package/src/cli/prepare.ts +41 -21
- package/src/cli/resume.ts +753 -626
- package/src/cli/run.ts +12 -5
- package/src/cli/runs.ts +212 -0
- package/src/cli/setup-commands.ts +0 -0
- package/src/cli/signal.ts +8 -7
- package/src/cli/stop.ts +209 -0
- package/src/cli/tasks.ts +154 -0
- package/src/core/auto-recovery.ts +909 -0
- package/src/core/failure-policy.ts +592 -0
- package/src/core/orchestrator.ts +1131 -704
- package/src/core/reviewer.ts +4 -0
- package/src/core/runner.ts +444 -180
- package/src/services/logging/buffer.ts +326 -0
- package/src/services/logging/console.ts +193 -0
- package/src/services/logging/file-writer.ts +526 -0
- package/src/services/logging/formatter.ts +268 -0
- package/src/services/logging/index.ts +16 -0
- package/src/services/logging/parser.ts +232 -0
- package/src/services/process/index.ts +261 -0
- package/src/types/agent.ts +24 -0
- package/src/types/config.ts +79 -0
- package/src/types/events.ts +156 -0
- package/src/types/index.ts +29 -0
- package/src/types/lane.ts +56 -0
- package/src/types/logging.ts +96 -0
- package/src/types/review.ts +20 -0
- package/src/types/run.ts +37 -0
- package/src/types/task.ts +79 -0
- package/src/ui/components.ts +430 -0
- package/src/ui/log-viewer.ts +485 -0
- package/src/utils/checkpoint.ts +374 -0
- package/src/utils/config.ts +18 -8
- package/src/utils/cursor-agent.ts +1 -1
- package/src/utils/dependency.ts +482 -0
- package/src/utils/doctor.ts +18 -11
- package/src/utils/enhanced-logger.ts +122 -60
- package/src/utils/git.ts +517 -11
- package/src/utils/health.ts +596 -0
- package/src/utils/lock.ts +346 -0
- package/src/utils/log-buffer.ts +28 -0
- package/src/utils/log-constants.ts +26 -0
- package/src/utils/log-formatter.ts +245 -0
- package/src/utils/log-service.ts +49 -0
- package/src/utils/logger.ts +100 -51
- package/src/utils/path.ts +45 -0
- package/src/utils/process-manager.ts +100 -0
- package/src/utils/retry.ts +413 -0
- package/src/utils/run-service.ts +433 -0
- package/src/utils/state.ts +385 -11
- package/src/utils/task-service.ts +370 -0
- package/src/utils/template.ts +92 -0
- package/src/utils/types.ts +2 -314
- package/templates/basic.json +21 -0
|
@@ -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":"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"}
|
package/dist/utils/state.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
*
|
|
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
|
*/
|
|
@@ -22,7 +78,10 @@ export declare function readLog<T = any>(logPath: string): T[];
|
|
|
22
78
|
/**
|
|
23
79
|
* Create initial lane state
|
|
24
80
|
*/
|
|
25
|
-
export declare function createLaneState(laneName: string, config: RunnerConfig
|
|
81
|
+
export declare function createLaneState(laneName: string, config: RunnerConfig, tasksFile?: string, options?: {
|
|
82
|
+
pipelineBranch?: string;
|
|
83
|
+
worktreeDir?: string;
|
|
84
|
+
}): LaneState;
|
|
26
85
|
/**
|
|
27
86
|
* Update lane state
|
|
28
87
|
*/
|