@litmers/cursorflow-orchestrator 0.1.20 → 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.
Files changed (224) hide show
  1. package/CHANGELOG.md +9 -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 +4 -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 +8 -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 +392 -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 +4 -3
  175. package/src/cli/resume.ts +220 -277
  176. package/src/cli/run.ts +9 -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 +1131 -675
  185. package/src/core/reviewer.ts +4 -0
  186. package/src/core/runner.ts +388 -162
  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 +374 -2
  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 @@
1
+ {"version":3,"file":"failure-policy.js","sourceRoot":"","sources":["../../src/core/failure-policy.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,25 @@
1
1
  /**
2
2
  * Orchestrator - Parallel lane execution with dependency management
3
3
  *
4
- * Adapted from admin-domains-orchestrator.js
4
+ * Features:
5
+ * - Multi-layer stall detection
6
+ * - Cyclic dependency detection
7
+ * - Enhanced recovery strategies
8
+ * - Health checks before start
5
9
  */
6
10
  import { ChildProcess } from 'child_process';
7
11
  import { WebhookConfig, EnhancedLogConfig } from '../utils/types';
8
12
  import { EnhancedLogManager } from '../utils/enhanced-logger';
13
+ import { StallDetectionConfig } from './failure-policy';
14
+ import { AutoRecoveryConfig } from './auto-recovery';
9
15
  export interface LaneInfo {
10
16
  name: string;
11
17
  path: string;
12
18
  dependsOn: string[];
13
19
  startIndex?: number;
20
+ restartCount?: number;
21
+ lastStateUpdate?: number;
22
+ taskStartTime?: number;
14
23
  }
15
24
  export interface SpawnLaneResult {
16
25
  child: ChildProcess;
@@ -20,7 +29,7 @@ export interface SpawnLaneResult {
20
29
  /**
21
30
  * Spawn a lane process
22
31
  */
23
- export declare function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex, pipelineBranch, worktreeDir, enhancedLogConfig, noGit, }: {
32
+ export declare function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex, pipelineBranch, worktreeDir, enhancedLogConfig, noGit, onActivity, }: {
24
33
  laneName: string;
25
34
  tasksFile: string;
26
35
  laneRunDir: string;
@@ -30,6 +39,7 @@ export declare function spawnLane({ laneName, tasksFile, laneRunDir, executor, s
30
39
  worktreeDir?: string;
31
40
  enhancedLogConfig?: Partial<EnhancedLogConfig>;
32
41
  noGit?: boolean;
42
+ onActivity?: () => void;
33
43
  }): SpawnLaneResult;
34
44
  /**
35
45
  * Wait for child process to exit
@@ -55,6 +65,9 @@ export declare function orchestrate(tasksDir: string, options?: {
55
65
  autoResolveDependencies?: boolean;
56
66
  enhancedLogging?: Partial<EnhancedLogConfig>;
57
67
  noGit?: boolean;
68
+ skipPreflight?: boolean;
69
+ stallConfig?: Partial<StallDetectionConfig>;
70
+ autoRecoveryConfig?: Partial<AutoRecoveryConfig>;
58
71
  }): Promise<{
59
72
  lanes: LaneInfo[];
60
73
  exitCodes: Record<string, number>;
@@ -2,7 +2,11 @@
2
2
  /**
3
3
  * Orchestrator - Parallel lane execution with dependency management
4
4
  *
5
- * Adapted from admin-domains-orchestrator.js
5
+ * Features:
6
+ * - Multi-layer stall detection
7
+ * - Cyclic dependency detection
8
+ * - Enhanced recovery strategies
9
+ * - Health checks before start
6
10
  */
7
11
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
12
  if (k2 === undefined) k2 = k;
@@ -56,10 +60,23 @@ const child_process_2 = require("child_process");
56
60
  const path_1 = require("../utils/path");
57
61
  const enhanced_logger_1 = require("../utils/enhanced-logger");
58
62
  const log_formatter_1 = require("../utils/log-formatter");
63
+ const failure_policy_1 = require("./failure-policy");
64
+ const auto_recovery_1 = require("./auto-recovery");
65
+ const dependency_1 = require("../utils/dependency");
66
+ const health_1 = require("../utils/health");
67
+ const checkpoint_1 = require("../utils/checkpoint");
68
+ const lock_1 = require("../utils/lock");
69
+ /** Default stall detection configuration - 1 minute idle timeout for fast recovery */
70
+ const DEFAULT_ORCHESTRATOR_STALL_CONFIG = {
71
+ ...failure_policy_1.DEFAULT_STALL_CONFIG,
72
+ idleTimeoutMs: 60 * 1000, // 1 minute (quick detection for continue signal)
73
+ progressTimeoutMs: 10 * 60 * 1000, // 10 minutes
74
+ maxRestarts: 2,
75
+ };
59
76
  /**
60
77
  * Spawn a lane process
61
78
  */
62
- function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex = 0, pipelineBranch, worktreeDir, enhancedLogConfig, noGit = false, }) {
79
+ function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex = 0, pipelineBranch, worktreeDir, enhancedLogConfig, noGit = false, onActivity, }) {
63
80
  fs.mkdirSync(laneRunDir, { recursive: true });
64
81
  // Use extension-less resolve to handle both .ts (dev) and .js (dist)
65
82
  const runnerPath = require.resolve('./runner');
@@ -91,6 +108,8 @@ function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex = 0,
91
108
  if (logConfig.enabled) {
92
109
  // Create callback for clean console output
93
110
  const onParsedMessage = (msg) => {
111
+ if (onActivity)
112
+ onActivity();
94
113
  const formatted = (0, log_formatter_1.formatMessageForConsole)(msg, {
95
114
  laneLabel: `[${laneName}]`,
96
115
  includeTimestamp: true
@@ -118,12 +137,23 @@ function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex = 0,
118
137
  lineBuffer = lines.pop() || '';
119
138
  for (const line of lines) {
120
139
  const trimmed = line.trim();
121
- // Only print if NOT a noisy line
122
- if (trimmed &&
123
- !trimmed.startsWith('{') &&
124
- !trimmed.startsWith('[') &&
125
- !trimmed.includes('{"type"')) {
126
- process.stdout.write(`${logger.COLORS.gray}[${new Date().toLocaleTimeString('en-US', { hour12: false })}]${logger.COLORS.reset} ${logger.COLORS.magenta}${laneName.padEnd(10)}${logger.COLORS.reset} ${line}\n`);
140
+ // Show if it's a timestamped log line (starts with [YYYY-MM-DD... or [HH:MM:SS])
141
+ // or if it's NOT a noisy JSON line
142
+ const hasTimestamp = /^\[\d{4}-\d{2}-\d{2}T|\^\[\d{2}:\d{2}:\d{2}\]/.test(trimmed);
143
+ const isJson = trimmed.startsWith('{') || trimmed.includes('{"type"');
144
+ if (trimmed && !isJson) {
145
+ if (onActivity)
146
+ onActivity();
147
+ // If line already has timestamp format, just add lane prefix
148
+ if (hasTimestamp) {
149
+ // Insert lane name after first timestamp
150
+ const formatted = trimmed.replace(/^(\[[^\]]+\])/, `$1 ${logger.COLORS.magenta}[${laneName}]${logger.COLORS.reset}`);
151
+ process.stdout.write(formatted + '\n');
152
+ }
153
+ else {
154
+ // Add full prefix: timestamp + lane
155
+ process.stdout.write(`${logger.COLORS.gray}[${new Date().toLocaleTimeString('en-US', { hour12: false })}]${logger.COLORS.reset} ${logger.COLORS.magenta}[${laneName}]${logger.COLORS.reset} ${line}\n`);
156
+ }
127
157
  }
128
158
  }
129
159
  });
@@ -141,11 +171,14 @@ function spawnLane({ laneName, tasksFile, laneRunDir, executor, startIndex = 0,
141
171
  trimmed.startsWith('Switched to a new branch') ||
142
172
  trimmed.startsWith('HEAD is now at') ||
143
173
  trimmed.includes('actual output');
174
+ const ts = new Date().toLocaleTimeString('en-US', { hour12: false });
144
175
  if (isStatus) {
145
- process.stdout.write(`${logger.COLORS.gray}[${new Date().toLocaleTimeString('en-US', { hour12: false })}]${logger.COLORS.reset} ${logger.COLORS.magenta}${laneName.padEnd(10)}${logger.COLORS.reset} ${trimmed}\n`);
176
+ process.stdout.write(`${logger.COLORS.gray}[${ts}]${logger.COLORS.reset} ${logger.COLORS.magenta}[${laneName}]${logger.COLORS.reset} ${trimmed}\n`);
146
177
  }
147
178
  else {
148
- process.stderr.write(`${logger.COLORS.red}[${laneName}] ERROR: ${trimmed}${logger.COLORS.reset}\n`);
179
+ if (onActivity)
180
+ onActivity();
181
+ process.stderr.write(`${logger.COLORS.gray}[${ts}]${logger.COLORS.reset} ${logger.COLORS.magenta}[${laneName}]${logger.COLORS.reset} ${logger.COLORS.red}❌ ERR ${trimmed}${logger.COLORS.reset}\n`);
149
182
  }
150
183
  }
151
184
  }
@@ -266,7 +299,7 @@ async function resolveAllDependencies(blockedLanes, allLanes, laneRunDirs, pipel
266
299
  const worktreeDir = state?.worktreeDir || (0, path_1.safeJoin)(runRoot, 'resolution-worktree');
267
300
  if (!fs.existsSync(worktreeDir)) {
268
301
  logger.info(`Creating resolution worktree at ${worktreeDir}`);
269
- git.createWorktree(worktreeDir, pipelineBranch, { baseBranch: 'main' });
302
+ git.createWorktree(worktreeDir, pipelineBranch, { baseBranch: git.getCurrentBranch() });
270
303
  }
271
304
  // 3. Resolve on pipeline branch
272
305
  logger.info(`Resolving dependencies on ${pipelineBranch}`);
@@ -336,6 +369,50 @@ async function orchestrate(tasksDir, options = {}) {
336
369
  if (lanes.length === 0) {
337
370
  throw new Error(`No lane task files found in ${tasksDir}`);
338
371
  }
372
+ // Run preflight checks
373
+ if (!options.skipPreflight) {
374
+ logger.section('🔍 Preflight Checks');
375
+ const preflight = await (0, health_1.preflightCheck)({
376
+ requireRemote: !options.noGit,
377
+ requireAuth: true,
378
+ });
379
+ if (!preflight.canProceed) {
380
+ (0, health_1.printPreflightReport)(preflight);
381
+ throw new Error('Preflight check failed. Please fix the blockers above.');
382
+ }
383
+ // Auto-repair if there are warnings
384
+ if (preflight.warnings.length > 0) {
385
+ logger.info('Attempting auto-repair...');
386
+ const repair = await (0, health_1.autoRepair)();
387
+ if (repair.repaired.length > 0) {
388
+ for (const r of repair.repaired) {
389
+ logger.success(`✓ ${r}`);
390
+ }
391
+ }
392
+ }
393
+ logger.success('✓ Preflight checks passed');
394
+ }
395
+ // Validate dependencies and detect cycles
396
+ logger.section('📊 Dependency Analysis');
397
+ const depInfos = lanes.map(l => ({
398
+ name: l.name,
399
+ dependsOn: l.dependsOn,
400
+ }));
401
+ const depValidation = (0, dependency_1.validateDependencies)(depInfos);
402
+ if (!depValidation.valid) {
403
+ logger.error('❌ Dependency validation failed:');
404
+ for (const err of depValidation.errors) {
405
+ logger.error(` • ${err}`);
406
+ }
407
+ throw new Error('Invalid dependency configuration');
408
+ }
409
+ if (depValidation.warnings.length > 0) {
410
+ for (const warn of depValidation.warnings) {
411
+ logger.warn(`⚠️ ${warn}`);
412
+ }
413
+ }
414
+ // Print dependency graph
415
+ (0, dependency_1.printDependencyGraph)(depInfos);
339
416
  const config = (0, config_1.loadConfig)();
340
417
  const logsDir = (0, config_1.getLogsDir)(config);
341
418
  const runId = `run-${Date.now()}`;
@@ -344,8 +421,30 @@ async function orchestrate(tasksDir, options = {}) {
344
421
  ? (path.isAbsolute(options.runDir) ? options.runDir : path.resolve(process.cwd(), options.runDir)) // nosemgrep
345
422
  : (0, path_1.safeJoin)(logsDir, 'runs', runId);
346
423
  fs.mkdirSync(runRoot, { recursive: true });
424
+ // Clean stale locks before starting
425
+ try {
426
+ const lockDir = (0, lock_1.getLockDir)(git.getRepoRoot());
427
+ const cleaned = (0, lock_1.cleanStaleLocks)(lockDir);
428
+ if (cleaned > 0) {
429
+ logger.info(`Cleaned ${cleaned} stale lock(s)`);
430
+ }
431
+ }
432
+ catch {
433
+ // Ignore lock cleanup errors
434
+ }
347
435
  const randomSuffix = Math.random().toString(36).substring(2, 7);
348
436
  const pipelineBranch = `cursorflow/run-${Date.now().toString(36)}-${randomSuffix}`;
437
+ // Stall detection configuration
438
+ const stallConfig = {
439
+ ...DEFAULT_ORCHESTRATOR_STALL_CONFIG,
440
+ ...options.stallConfig,
441
+ };
442
+ // Initialize auto-recovery manager
443
+ const autoRecoveryManager = (0, auto_recovery_1.getAutoRecoveryManager)({
444
+ ...auto_recovery_1.DEFAULT_AUTO_RECOVERY_CONFIG,
445
+ idleTimeoutMs: stallConfig.idleTimeoutMs, // Sync with stall config
446
+ ...options.autoRecoveryConfig,
447
+ });
349
448
  // Initialize event system
350
449
  events_1.events.setRunId(runId);
351
450
  if (options.webhooks) {
@@ -366,6 +465,7 @@ async function orchestrate(tasksDir, options = {}) {
366
465
  // Track start index for each lane (initially 0)
367
466
  for (const lane of lanes) {
368
467
  lane.startIndex = 0;
468
+ lane.restartCount = 0;
369
469
  }
370
470
  const laneRunDirs = {};
371
471
  const laneWorktreeDirs = {};
@@ -453,7 +553,14 @@ async function orchestrate(tasksDir, options = {}) {
453
553
  for (const lane of readyToStart) {
454
554
  if (running.size >= maxConcurrent)
455
555
  break;
556
+ const laneStatePath = (0, path_1.safeJoin)(laneRunDirs[lane.name], 'state.json');
557
+ // Validate and repair state before starting
558
+ const validation = (0, state_1.validateLaneState)(laneStatePath, { autoRepair: true });
559
+ if (!validation.valid && !validation.repaired) {
560
+ logger.warn(`[${lane.name}] State validation issues: ${validation.issues.join(', ')}`);
561
+ }
456
562
  logger.info(`Lane started: ${lane.name}${lane.startIndex ? ` (resuming from ${lane.startIndex})` : ''}`);
563
+ let lastOutput = '';
457
564
  const spawnResult = spawnLane({
458
565
  laneName: lane.name,
459
566
  tasksFile: lane.path,
@@ -464,23 +571,277 @@ async function orchestrate(tasksDir, options = {}) {
464
571
  worktreeDir: laneWorktreeDirs[lane.name],
465
572
  enhancedLogConfig: options.enhancedLogging,
466
573
  noGit: options.noGit,
574
+ onActivity: () => {
575
+ const info = running.get(lane.name);
576
+ if (info) {
577
+ info.lastActivity = Date.now();
578
+ }
579
+ }
580
+ });
581
+ // Track last output and bytes received for long operation and stall detection
582
+ if (spawnResult.child.stdout) {
583
+ spawnResult.child.stdout.on('data', (data) => {
584
+ const info = running.get(lane.name);
585
+ if (info) {
586
+ info.lastOutput = data.toString().trim().split('\n').pop() || '';
587
+ info.bytesReceived += data.length;
588
+ // Update auto-recovery manager
589
+ autoRecoveryManager.recordActivity(lane.name, data.length, info.lastOutput);
590
+ }
591
+ });
592
+ }
593
+ const now = Date.now();
594
+ running.set(lane.name, {
595
+ ...spawnResult,
596
+ lastActivity: now,
597
+ lastStateUpdate: now,
598
+ stallPhase: 0,
599
+ taskStartTime: now,
600
+ lastOutput: '',
601
+ statePath: laneStatePath,
602
+ bytesReceived: 0,
603
+ lastBytesCheck: 0,
604
+ continueSignalsSent: 0,
467
605
  });
468
- running.set(lane.name, spawnResult);
606
+ // Register lane with auto-recovery manager
607
+ autoRecoveryManager.registerLane(lane.name);
608
+ // Update lane tracking
609
+ lane.taskStartTime = now;
469
610
  events_1.events.emit('lane.started', {
470
611
  laneName: lane.name,
471
612
  pid: spawnResult.child.pid,
472
613
  logPath: spawnResult.logPath,
473
614
  });
474
615
  }
475
- // 3. Wait for any running lane to finish
616
+ // 3. Wait for any running lane to finish OR check for stalls
476
617
  if (running.size > 0) {
618
+ // Polling timeout for stall detection
619
+ let pollTimeout;
620
+ const pollPromise = new Promise(resolve => {
621
+ pollTimeout = setTimeout(() => resolve({ name: '__poll__', code: 0 }), 10000);
622
+ });
477
623
  const promises = Array.from(running.entries()).map(async ([name, { child }]) => {
478
624
  const code = await waitChild(child);
479
625
  return { name, code };
480
626
  });
481
- const finished = await Promise.race(promises);
627
+ const result = await Promise.race([...promises, pollPromise]);
628
+ if (pollTimeout)
629
+ clearTimeout(pollTimeout);
630
+ if (result.name === '__poll__') {
631
+ // Periodic stall check with multi-layer detection and escalating recovery
632
+ for (const [laneName, info] of running.entries()) {
633
+ const now = Date.now();
634
+ const idleTime = now - info.lastActivity;
635
+ const lane = lanes.find(l => l.name === laneName);
636
+ // Check state file for progress updates
637
+ let progressTime = 0;
638
+ try {
639
+ const stateStat = fs.statSync(info.statePath);
640
+ const stateUpdateTime = stateStat.mtimeMs;
641
+ if (stateUpdateTime > info.lastStateUpdate) {
642
+ info.lastStateUpdate = stateUpdateTime;
643
+ }
644
+ progressTime = now - info.lastStateUpdate;
645
+ }
646
+ catch {
647
+ // State file might not exist yet
648
+ }
649
+ // Calculate bytes received since last check
650
+ const bytesDelta = info.bytesReceived - info.lastBytesCheck;
651
+ info.lastBytesCheck = info.bytesReceived;
652
+ // Use multi-layer stall analysis with enhanced context
653
+ const analysis = (0, failure_policy_1.analyzeStall)({
654
+ stallPhase: info.stallPhase,
655
+ idleTimeMs: idleTime,
656
+ progressTimeMs: progressTime,
657
+ lastOutput: info.lastOutput,
658
+ restartCount: lane.restartCount || 0,
659
+ taskStartTimeMs: info.taskStartTime,
660
+ bytesReceived: bytesDelta, // Bytes since last check
661
+ continueSignalsSent: info.continueSignalsSent,
662
+ }, stallConfig);
663
+ // Only act if action is not NONE
664
+ if (analysis.action !== failure_policy_1.RecoveryAction.NONE) {
665
+ (0, failure_policy_1.logFailure)(laneName, analysis);
666
+ info.logManager?.log('error', analysis.message);
667
+ if (analysis.action === failure_policy_1.RecoveryAction.CONTINUE_SIGNAL) {
668
+ const interventionPath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'intervention.txt');
669
+ try {
670
+ fs.writeFileSync(interventionPath, 'continue');
671
+ info.stallPhase = 1;
672
+ info.lastActivity = now;
673
+ info.continueSignalsSent++;
674
+ logger.info(`[${laneName}] Sent continue signal (#${info.continueSignalsSent})`);
675
+ events_1.events.emit('recovery.continue_signal', {
676
+ laneName,
677
+ idleSeconds: Math.round(idleTime / 1000),
678
+ signalCount: info.continueSignalsSent,
679
+ });
680
+ }
681
+ catch (e) {
682
+ logger.error(`Failed to write intervention file for ${laneName}: ${e}`);
683
+ }
684
+ }
685
+ else if (analysis.action === failure_policy_1.RecoveryAction.STRONGER_PROMPT) {
686
+ const interventionPath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'intervention.txt');
687
+ const strongerPrompt = `[SYSTEM INTERVENTION] You seem to be stuck. Please continue with your current task immediately. If you're waiting for something, explain what you need and proceed with what you can do now. If you've completed the task, summarize your work and finish.`;
688
+ try {
689
+ fs.writeFileSync(interventionPath, strongerPrompt);
690
+ info.stallPhase = 2;
691
+ info.lastActivity = now;
692
+ logger.warn(`[${laneName}] Sent stronger prompt after continue signal failed`);
693
+ events_1.events.emit('recovery.stronger_prompt', { laneName });
694
+ }
695
+ catch (e) {
696
+ logger.error(`Failed to write intervention file for ${laneName}: ${e}`);
697
+ }
698
+ }
699
+ else if (analysis.action === failure_policy_1.RecoveryAction.KILL_AND_RESTART ||
700
+ analysis.action === failure_policy_1.RecoveryAction.RESTART_LANE ||
701
+ analysis.action === failure_policy_1.RecoveryAction.RESTART_LANE_FROM_CHECKPOINT) {
702
+ lane.restartCount = (lane.restartCount || 0) + 1;
703
+ info.stallPhase = 3;
704
+ // Try to get checkpoint info
705
+ const checkpoint = (0, checkpoint_1.getLatestCheckpoint)(laneRunDirs[laneName]);
706
+ if (checkpoint) {
707
+ logger.info(`[${laneName}] Checkpoint available: ${checkpoint.id} (task ${checkpoint.taskIndex})`);
708
+ }
709
+ // Kill the process
710
+ try {
711
+ info.child.kill('SIGKILL');
712
+ }
713
+ catch {
714
+ // Process might already be dead
715
+ }
716
+ logger.warn(`[${laneName}] Killing and restarting lane (restart #${lane.restartCount})`);
717
+ events_1.events.emit('recovery.restart', {
718
+ laneName,
719
+ restartCount: lane.restartCount,
720
+ maxRestarts: stallConfig.maxRestarts,
721
+ });
722
+ }
723
+ else if (analysis.action === failure_policy_1.RecoveryAction.RUN_DOCTOR) {
724
+ info.stallPhase = 4;
725
+ // Run diagnostics
726
+ logger.error(`[${laneName}] Running diagnostics due to persistent failures...`);
727
+ // Import health check dynamically to avoid circular dependency
728
+ const { checkAgentHealth, checkAuthHealth } = await Promise.resolve().then(() => __importStar(require('../utils/health')));
729
+ const [agentHealth, authHealth] = await Promise.all([
730
+ checkAgentHealth(),
731
+ checkAuthHealth(),
732
+ ]);
733
+ const issues = [];
734
+ if (!agentHealth.ok)
735
+ issues.push(`Agent: ${agentHealth.message}`);
736
+ if (!authHealth.ok)
737
+ issues.push(`Auth: ${authHealth.message}`);
738
+ if (issues.length > 0) {
739
+ logger.error(`[${laneName}] Diagnostic issues found:\n ${issues.join('\n ')}`);
740
+ }
741
+ else {
742
+ logger.warn(`[${laneName}] No obvious issues found. The problem may be with the AI model or network.`);
743
+ }
744
+ // Save diagnostic to file
745
+ const diagnosticPath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'diagnostic.json');
746
+ fs.writeFileSync(diagnosticPath, JSON.stringify({
747
+ timestamp: Date.now(),
748
+ agentHealthy: agentHealth.ok,
749
+ authHealthy: authHealth.ok,
750
+ issues,
751
+ analysis,
752
+ }, null, 2));
753
+ // Kill the process
754
+ try {
755
+ info.child.kill('SIGKILL');
756
+ }
757
+ catch {
758
+ // Process might already be dead
759
+ }
760
+ logger.error(`[${laneName}] Aborting lane after diagnostic. Check ${diagnosticPath} for details.`);
761
+ // Save POF for failed recovery
762
+ const recoveryState = autoRecoveryManager.getState(laneName);
763
+ if (recoveryState) {
764
+ try {
765
+ const laneStatePath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'state.json');
766
+ const laneState = (0, state_1.loadState)(laneStatePath);
767
+ const pofDir = (0, path_1.safeJoin)(runRoot, '..', '..', 'pof');
768
+ const diagnosticInfo = {
769
+ timestamp: Date.now(),
770
+ agentHealthy: agentHealth.ok,
771
+ authHealthy: authHealth.ok,
772
+ systemHealthy: true,
773
+ suggestedAction: issues.length > 0 ? 'Fix the issues above and retry' : 'Try with a different model',
774
+ details: issues.join('\n') || 'No obvious issues found',
775
+ };
776
+ const pofEntry = (0, auto_recovery_1.createPOFFromRecoveryState)(runId, runRoot, laneName, recoveryState, laneState, diagnosticInfo);
777
+ (0, auto_recovery_1.savePOF)(runId, pofDir, pofEntry);
778
+ }
779
+ catch (pofError) {
780
+ logger.warn(`[${laneName}] Failed to save POF: ${pofError.message}`);
781
+ }
782
+ }
783
+ events_1.events.emit('recovery.diagnosed', {
784
+ laneName,
785
+ diagnostic: { agentHealthy: agentHealth.ok, authHealthy: authHealth.ok, issues },
786
+ });
787
+ }
788
+ else if (analysis.action === failure_policy_1.RecoveryAction.ABORT_LANE) {
789
+ info.stallPhase = 5;
790
+ try {
791
+ info.child.kill('SIGKILL');
792
+ }
793
+ catch {
794
+ // Process might already be dead
795
+ }
796
+ logger.error(`[${laneName}] Aborting lane due to repeated stalls`);
797
+ // Save POF for failed recovery
798
+ const recoveryState = autoRecoveryManager.getState(laneName);
799
+ if (recoveryState) {
800
+ try {
801
+ const laneStatePath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'state.json');
802
+ const laneState = (0, state_1.loadState)(laneStatePath);
803
+ const pofDir = (0, path_1.safeJoin)(runRoot, '..', '..', 'pof');
804
+ const pofEntry = (0, auto_recovery_1.createPOFFromRecoveryState)(runId, runRoot, laneName, recoveryState, laneState, recoveryState.diagnosticInfo);
805
+ (0, auto_recovery_1.savePOF)(runId, pofDir, pofEntry);
806
+ }
807
+ catch (pofError) {
808
+ logger.warn(`[${laneName}] Failed to save POF: ${pofError.message}`);
809
+ }
810
+ }
811
+ }
812
+ else if (analysis.action === failure_policy_1.RecoveryAction.SEND_GIT_GUIDANCE) {
813
+ // Send guidance message to agent for git issues
814
+ const interventionPath = (0, path_1.safeJoin)(laneRunDirs[laneName], 'intervention.txt');
815
+ // Determine which guidance to send based on the failure type
816
+ let guidance;
817
+ if (analysis.type === failure_policy_1.FailureType.GIT_PUSH_REJECTED) {
818
+ guidance = (0, auto_recovery_1.getGitPushFailureGuidance)();
819
+ }
820
+ else if (analysis.type === failure_policy_1.FailureType.MERGE_CONFLICT) {
821
+ guidance = (0, auto_recovery_1.getMergeConflictGuidance)();
822
+ }
823
+ else {
824
+ guidance = (0, auto_recovery_1.getGitErrorGuidance)(analysis.message);
825
+ }
826
+ try {
827
+ fs.writeFileSync(interventionPath, guidance);
828
+ info.lastActivity = now;
829
+ logger.info(`[${laneName}] Sent git issue guidance to agent`);
830
+ }
831
+ catch (e) {
832
+ logger.error(`[${laneName}] Failed to send guidance: ${e.message}`);
833
+ }
834
+ }
835
+ }
836
+ }
837
+ continue;
838
+ }
839
+ const finished = result;
840
+ const info = running.get(finished.name);
482
841
  running.delete(finished.name);
483
842
  exitCodes[finished.name] = finished.code;
843
+ // Unregister from auto-recovery manager
844
+ autoRecoveryManager.unregisterLane(finished.name);
484
845
  if (finished.code === 0) {
485
846
  completedLanes.add(finished.name);
486
847
  events_1.events.emit('lane.completed', {
@@ -510,11 +871,27 @@ async function orchestrate(tasksDir, options = {}) {
510
871
  }
511
872
  }
512
873
  else {
874
+ // Check if it was a restart request
875
+ if (info.stallPhase === 2) {
876
+ logger.info(`🔄 Lane ${finished.name} is being restarted due to stall...`);
877
+ // Update startIndex from current state to resume from the same task
878
+ const statePath = (0, path_1.safeJoin)(laneRunDirs[finished.name], 'state.json');
879
+ const state = (0, state_1.loadState)(statePath);
880
+ if (state) {
881
+ const lane = lanes.find(l => l.name === finished.name);
882
+ if (lane) {
883
+ lane.startIndex = state.currentTaskIndex;
884
+ }
885
+ }
886
+ // Note: we don't add to failedLanes or completedLanes,
887
+ // so it will be eligible to start again in the next iteration.
888
+ continue;
889
+ }
513
890
  failedLanes.add(finished.name);
514
891
  events_1.events.emit('lane.failed', {
515
892
  laneName: finished.name,
516
893
  exitCode: finished.code,
517
- error: 'Process exited with non-zero code',
894
+ error: info.stallPhase === 3 ? 'Stopped due to repeated stall' : 'Process exited with non-zero code',
518
895
  });
519
896
  }
520
897
  printLaneStatus(lanes, laneRunDirs);