@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.
Files changed (234) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -7
  3. package/commands/cursorflow-clean.md +19 -0
  4. package/commands/cursorflow-runs.md +59 -0
  5. package/commands/cursorflow-stop.md +55 -0
  6. package/dist/cli/clean.js +178 -6
  7. package/dist/cli/clean.js.map +1 -1
  8. package/dist/cli/index.js +12 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli/init.js +8 -7
  11. package/dist/cli/init.js.map +1 -1
  12. package/dist/cli/logs.js +126 -77
  13. package/dist/cli/logs.js.map +1 -1
  14. package/dist/cli/monitor.d.ts +7 -0
  15. package/dist/cli/monitor.js +1021 -202
  16. package/dist/cli/monitor.js.map +1 -1
  17. package/dist/cli/prepare.js +39 -21
  18. package/dist/cli/prepare.js.map +1 -1
  19. package/dist/cli/resume.js +268 -163
  20. package/dist/cli/resume.js.map +1 -1
  21. package/dist/cli/run.js +11 -5
  22. package/dist/cli/run.js.map +1 -1
  23. package/dist/cli/runs.d.ts +5 -0
  24. package/dist/cli/runs.js +214 -0
  25. package/dist/cli/runs.js.map +1 -0
  26. package/dist/cli/setup-commands.js +0 -0
  27. package/dist/cli/signal.js +8 -8
  28. package/dist/cli/signal.js.map +1 -1
  29. package/dist/cli/stop.d.ts +5 -0
  30. package/dist/cli/stop.js +215 -0
  31. package/dist/cli/stop.js.map +1 -0
  32. package/dist/cli/tasks.d.ts +10 -0
  33. package/dist/cli/tasks.js +165 -0
  34. package/dist/cli/tasks.js.map +1 -0
  35. package/dist/core/auto-recovery.d.ts +212 -0
  36. package/dist/core/auto-recovery.js +737 -0
  37. package/dist/core/auto-recovery.js.map +1 -0
  38. package/dist/core/failure-policy.d.ts +156 -0
  39. package/dist/core/failure-policy.js +488 -0
  40. package/dist/core/failure-policy.js.map +1 -0
  41. package/dist/core/orchestrator.d.ts +16 -2
  42. package/dist/core/orchestrator.js +439 -105
  43. package/dist/core/orchestrator.js.map +1 -1
  44. package/dist/core/reviewer.d.ts +2 -0
  45. package/dist/core/reviewer.js +2 -0
  46. package/dist/core/reviewer.js.map +1 -1
  47. package/dist/core/runner.d.ts +33 -10
  48. package/dist/core/runner.js +374 -164
  49. package/dist/core/runner.js.map +1 -1
  50. package/dist/services/logging/buffer.d.ts +67 -0
  51. package/dist/services/logging/buffer.js +309 -0
  52. package/dist/services/logging/buffer.js.map +1 -0
  53. package/dist/services/logging/console.d.ts +89 -0
  54. package/dist/services/logging/console.js +169 -0
  55. package/dist/services/logging/console.js.map +1 -0
  56. package/dist/services/logging/file-writer.d.ts +71 -0
  57. package/dist/services/logging/file-writer.js +516 -0
  58. package/dist/services/logging/file-writer.js.map +1 -0
  59. package/dist/services/logging/formatter.d.ts +39 -0
  60. package/dist/services/logging/formatter.js +227 -0
  61. package/dist/services/logging/formatter.js.map +1 -0
  62. package/dist/services/logging/index.d.ts +11 -0
  63. package/dist/services/logging/index.js +30 -0
  64. package/dist/services/logging/index.js.map +1 -0
  65. package/dist/services/logging/parser.d.ts +31 -0
  66. package/dist/services/logging/parser.js +222 -0
  67. package/dist/services/logging/parser.js.map +1 -0
  68. package/dist/services/process/index.d.ts +59 -0
  69. package/dist/services/process/index.js +257 -0
  70. package/dist/services/process/index.js.map +1 -0
  71. package/dist/types/agent.d.ts +20 -0
  72. package/dist/types/agent.js +6 -0
  73. package/dist/types/agent.js.map +1 -0
  74. package/dist/types/config.d.ts +65 -0
  75. package/dist/types/config.js +6 -0
  76. package/dist/types/config.js.map +1 -0
  77. package/dist/types/events.d.ts +125 -0
  78. package/dist/types/events.js +6 -0
  79. package/dist/types/events.js.map +1 -0
  80. package/dist/types/index.d.ts +12 -0
  81. package/dist/types/index.js +37 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/types/lane.d.ts +43 -0
  84. package/dist/types/lane.js +6 -0
  85. package/dist/types/lane.js.map +1 -0
  86. package/dist/types/logging.d.ts +71 -0
  87. package/dist/types/logging.js +16 -0
  88. package/dist/types/logging.js.map +1 -0
  89. package/dist/types/review.d.ts +17 -0
  90. package/dist/types/review.js +6 -0
  91. package/dist/types/review.js.map +1 -0
  92. package/dist/types/run.d.ts +32 -0
  93. package/dist/types/run.js +6 -0
  94. package/dist/types/run.js.map +1 -0
  95. package/dist/types/task.d.ts +71 -0
  96. package/dist/types/task.js +6 -0
  97. package/dist/types/task.js.map +1 -0
  98. package/dist/ui/components.d.ts +134 -0
  99. package/dist/ui/components.js +389 -0
  100. package/dist/ui/components.js.map +1 -0
  101. package/dist/ui/log-viewer.d.ts +49 -0
  102. package/dist/ui/log-viewer.js +449 -0
  103. package/dist/ui/log-viewer.js.map +1 -0
  104. package/dist/utils/checkpoint.d.ts +87 -0
  105. package/dist/utils/checkpoint.js +317 -0
  106. package/dist/utils/checkpoint.js.map +1 -0
  107. package/dist/utils/config.d.ts +4 -0
  108. package/dist/utils/config.js +18 -8
  109. package/dist/utils/config.js.map +1 -1
  110. package/dist/utils/cursor-agent.js.map +1 -1
  111. package/dist/utils/dependency.d.ts +74 -0
  112. package/dist/utils/dependency.js +420 -0
  113. package/dist/utils/dependency.js.map +1 -0
  114. package/dist/utils/doctor.js +17 -11
  115. package/dist/utils/doctor.js.map +1 -1
  116. package/dist/utils/enhanced-logger.d.ts +10 -33
  117. package/dist/utils/enhanced-logger.js +108 -20
  118. package/dist/utils/enhanced-logger.js.map +1 -1
  119. package/dist/utils/git.d.ts +121 -0
  120. package/dist/utils/git.js +484 -11
  121. package/dist/utils/git.js.map +1 -1
  122. package/dist/utils/health.d.ts +91 -0
  123. package/dist/utils/health.js +556 -0
  124. package/dist/utils/health.js.map +1 -0
  125. package/dist/utils/lock.d.ts +95 -0
  126. package/dist/utils/lock.js +332 -0
  127. package/dist/utils/lock.js.map +1 -0
  128. package/dist/utils/log-buffer.d.ts +17 -0
  129. package/dist/utils/log-buffer.js +14 -0
  130. package/dist/utils/log-buffer.js.map +1 -0
  131. package/dist/utils/log-constants.d.ts +23 -0
  132. package/dist/utils/log-constants.js +28 -0
  133. package/dist/utils/log-constants.js.map +1 -0
  134. package/dist/utils/log-formatter.d.ts +25 -0
  135. package/dist/utils/log-formatter.js +237 -0
  136. package/dist/utils/log-formatter.js.map +1 -0
  137. package/dist/utils/log-service.d.ts +19 -0
  138. package/dist/utils/log-service.js +47 -0
  139. package/dist/utils/log-service.js.map +1 -0
  140. package/dist/utils/logger.d.ts +46 -27
  141. package/dist/utils/logger.js +82 -60
  142. package/dist/utils/logger.js.map +1 -1
  143. package/dist/utils/path.d.ts +19 -0
  144. package/dist/utils/path.js +77 -0
  145. package/dist/utils/path.js.map +1 -0
  146. package/dist/utils/process-manager.d.ts +21 -0
  147. package/dist/utils/process-manager.js +138 -0
  148. package/dist/utils/process-manager.js.map +1 -0
  149. package/dist/utils/retry.d.ts +121 -0
  150. package/dist/utils/retry.js +374 -0
  151. package/dist/utils/retry.js.map +1 -0
  152. package/dist/utils/run-service.d.ts +88 -0
  153. package/dist/utils/run-service.js +412 -0
  154. package/dist/utils/run-service.js.map +1 -0
  155. package/dist/utils/state.d.ts +62 -3
  156. package/dist/utils/state.js +317 -11
  157. package/dist/utils/state.js.map +1 -1
  158. package/dist/utils/task-service.d.ts +82 -0
  159. package/dist/utils/task-service.js +348 -0
  160. package/dist/utils/task-service.js.map +1 -0
  161. package/dist/utils/template.d.ts +14 -0
  162. package/dist/utils/template.js +122 -0
  163. package/dist/utils/template.js.map +1 -0
  164. package/dist/utils/types.d.ts +2 -271
  165. package/dist/utils/types.js +16 -0
  166. package/dist/utils/types.js.map +1 -1
  167. package/package.json +38 -23
  168. package/scripts/ai-security-check.js +0 -1
  169. package/scripts/local-security-gate.sh +0 -0
  170. package/scripts/monitor-lanes.sh +94 -0
  171. package/scripts/patches/test-cursor-agent.js +0 -1
  172. package/scripts/release.sh +0 -0
  173. package/scripts/setup-security.sh +0 -0
  174. package/scripts/stream-logs.sh +72 -0
  175. package/scripts/verify-and-fix.sh +0 -0
  176. package/src/cli/clean.ts +187 -6
  177. package/src/cli/index.ts +12 -1
  178. package/src/cli/init.ts +8 -7
  179. package/src/cli/logs.ts +124 -77
  180. package/src/cli/monitor.ts +1815 -898
  181. package/src/cli/prepare.ts +41 -21
  182. package/src/cli/resume.ts +753 -626
  183. package/src/cli/run.ts +12 -5
  184. package/src/cli/runs.ts +212 -0
  185. package/src/cli/setup-commands.ts +0 -0
  186. package/src/cli/signal.ts +8 -7
  187. package/src/cli/stop.ts +209 -0
  188. package/src/cli/tasks.ts +154 -0
  189. package/src/core/auto-recovery.ts +909 -0
  190. package/src/core/failure-policy.ts +592 -0
  191. package/src/core/orchestrator.ts +1131 -704
  192. package/src/core/reviewer.ts +4 -0
  193. package/src/core/runner.ts +444 -180
  194. package/src/services/logging/buffer.ts +326 -0
  195. package/src/services/logging/console.ts +193 -0
  196. package/src/services/logging/file-writer.ts +526 -0
  197. package/src/services/logging/formatter.ts +268 -0
  198. package/src/services/logging/index.ts +16 -0
  199. package/src/services/logging/parser.ts +232 -0
  200. package/src/services/process/index.ts +261 -0
  201. package/src/types/agent.ts +24 -0
  202. package/src/types/config.ts +79 -0
  203. package/src/types/events.ts +156 -0
  204. package/src/types/index.ts +29 -0
  205. package/src/types/lane.ts +56 -0
  206. package/src/types/logging.ts +96 -0
  207. package/src/types/review.ts +20 -0
  208. package/src/types/run.ts +37 -0
  209. package/src/types/task.ts +79 -0
  210. package/src/ui/components.ts +430 -0
  211. package/src/ui/log-viewer.ts +485 -0
  212. package/src/utils/checkpoint.ts +374 -0
  213. package/src/utils/config.ts +18 -8
  214. package/src/utils/cursor-agent.ts +1 -1
  215. package/src/utils/dependency.ts +482 -0
  216. package/src/utils/doctor.ts +18 -11
  217. package/src/utils/enhanced-logger.ts +122 -60
  218. package/src/utils/git.ts +517 -11
  219. package/src/utils/health.ts +596 -0
  220. package/src/utils/lock.ts +346 -0
  221. package/src/utils/log-buffer.ts +28 -0
  222. package/src/utils/log-constants.ts +26 -0
  223. package/src/utils/log-formatter.ts +245 -0
  224. package/src/utils/log-service.ts +49 -0
  225. package/src/utils/logger.ts +100 -51
  226. package/src/utils/path.ts +45 -0
  227. package/src/utils/process-manager.ts +100 -0
  228. package/src/utils/retry.ts +413 -0
  229. package/src/utils/run-service.ts +433 -0
  230. package/src/utils/state.ts +385 -11
  231. package/src/utils/task-service.ts +370 -0
  232. package/src/utils/template.ts +92 -0
  233. package/src/utils/types.ts +2 -314
  234. package/templates/basic.json +21 -0
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow stop command - Stop running workflows or specific lanes
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ const readline = __importStar(require("readline"));
39
+ const logger = __importStar(require("../utils/logger"));
40
+ const config_1 = require("../utils/config");
41
+ const run_service_1 = require("../utils/run-service");
42
+ const process_manager_1 = require("../utils/process-manager");
43
+ const path_1 = require("../utils/path");
44
+ function printHelp() {
45
+ console.log(`
46
+ Usage: cursorflow stop [run-id] [options]
47
+
48
+ Stop running workflows or specific lanes.
49
+
50
+ Options:
51
+ [run-id] Stop a specific run
52
+ --lane <name> Stop only a specific lane
53
+ --force Use SIGKILL instead of SIGTERM
54
+ --yes, -y Skip confirmation prompt
55
+ --help, -h Show help
56
+
57
+ Examples:
58
+ cursorflow stop # Stop all running workflows
59
+ cursorflow stop run-123 # Stop run-123
60
+ cursorflow stop --lane api # Stop only the 'api' lane in the latest run
61
+ cursorflow stop --force # Force stop all workflows
62
+ `);
63
+ }
64
+ function parseArgs(args) {
65
+ const laneIdx = args.indexOf('--lane');
66
+ // Find run ID (first non-option argument)
67
+ const runId = args.find((arg, i) => {
68
+ if (arg.startsWith('--') || arg.startsWith('-'))
69
+ return false;
70
+ // Skip values for options
71
+ const prevArg = args[i - 1];
72
+ if (prevArg && ['--lane'].includes(prevArg)) {
73
+ return false;
74
+ }
75
+ return true;
76
+ });
77
+ return {
78
+ runId,
79
+ lane: laneIdx >= 0 ? args[laneIdx + 1] : undefined,
80
+ force: args.includes('--force'),
81
+ yes: args.includes('--yes') || args.includes('-y'),
82
+ help: args.includes('--help') || args.includes('-h'),
83
+ };
84
+ }
85
+ /**
86
+ * Prompt user for confirmation
87
+ */
88
+ async function confirm(message) {
89
+ const rl = readline.createInterface({
90
+ input: process.stdin,
91
+ output: process.stdout,
92
+ });
93
+ return new Promise((resolve) => {
94
+ rl.question(`${message} [y/N]: `, (answer) => {
95
+ rl.close();
96
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
97
+ });
98
+ });
99
+ }
100
+ async function stop(args) {
101
+ const options = parseArgs(args);
102
+ if (options.help) {
103
+ printHelp();
104
+ return;
105
+ }
106
+ const config = (0, config_1.loadConfig)();
107
+ const logsDir = (0, config_1.getLogsDir)(config);
108
+ const runsDir = (0, path_1.safeJoin)(logsDir, 'runs');
109
+ const runService = new run_service_1.RunService(runsDir);
110
+ const signal = options.force ? 'SIGKILL' : 'SIGTERM';
111
+ // Case 1: Stop specific lane in specific run (or latest if runId not provided)
112
+ if (options.lane) {
113
+ let runId = options.runId;
114
+ if (!runId) {
115
+ const activeRuns = runService.getActiveRuns();
116
+ if (activeRuns.length === 0) {
117
+ logger.info('No active runs found.');
118
+ return;
119
+ }
120
+ runId = activeRuns[0].id;
121
+ }
122
+ const run = runService.getRunInfo(runId);
123
+ if (!run) {
124
+ throw new Error(`Run not found: ${runId}`);
125
+ }
126
+ const lane = run.lanes.find(l => l.name === options.lane);
127
+ if (!lane) {
128
+ throw new Error(`Lane '${options.lane}' not found in run '${runId}'`);
129
+ }
130
+ if (!lane.pid) {
131
+ logger.info(`Lane '${options.lane}' is not currently running (no PID).`);
132
+ return;
133
+ }
134
+ if (!options.yes) {
135
+ const ok = await confirm(`⚠️ Stop lane '${options.lane}' in run '${runId}'?`);
136
+ if (!ok)
137
+ return;
138
+ }
139
+ logger.info(`🛑 Stopping lane '${options.lane}' (PID ${lane.pid})...`);
140
+ if (process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
141
+ logger.success(`✓ lane '${options.lane}' stopped.`);
142
+ }
143
+ else {
144
+ logger.error(`Failed to stop lane '${options.lane}'.`);
145
+ }
146
+ return;
147
+ }
148
+ // Case 2: Stop specific run
149
+ if (options.runId) {
150
+ const run = runService.getRunInfo(options.runId);
151
+ if (!run) {
152
+ throw new Error(`Run not found: ${options.runId}`);
153
+ }
154
+ if (run.status !== 'running') {
155
+ logger.info(`Run '${options.runId}' is not currently running (Status: ${run.status}).`);
156
+ return;
157
+ }
158
+ if (!options.yes) {
159
+ const ok = await confirm(`⚠️ Stop run '${options.runId}' (${run.taskName})?`);
160
+ if (!ok)
161
+ return;
162
+ }
163
+ logger.info(`🛑 Stopping run '${options.runId}'...`);
164
+ let stoppedCount = 0;
165
+ for (const lane of run.lanes) {
166
+ if (lane.pid && process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
167
+ logger.info(` ✓ lane '${lane.name}' (PID ${lane.pid}) stopped`);
168
+ stoppedCount++;
169
+ }
170
+ }
171
+ if (stoppedCount > 0) {
172
+ logger.success(`✅ Run '${options.runId}' stopped.`);
173
+ }
174
+ else {
175
+ logger.info('No active lanes were stopped.');
176
+ }
177
+ return;
178
+ }
179
+ // Case 3: Stop all running workflows
180
+ const activeRuns = runService.getActiveRuns();
181
+ if (activeRuns.length === 0) {
182
+ logger.info('No active runs found.');
183
+ return;
184
+ }
185
+ if (!options.yes) {
186
+ console.log('\n⚠️ Stop all running workflows?\n');
187
+ console.log('Currently running:');
188
+ for (const run of activeRuns) {
189
+ const activeLanes = run.lanes.filter(l => l.pid).length;
190
+ console.log(` - ${run.id} (${run.taskName}): ${activeLanes} lanes active`);
191
+ }
192
+ console.log('');
193
+ const ok = await confirm('Continue?');
194
+ if (!ok)
195
+ return;
196
+ }
197
+ logger.info('🛑 Stopping all workflows...');
198
+ let totalStopped = 0;
199
+ for (const run of activeRuns) {
200
+ for (const lane of run.lanes) {
201
+ if (lane.pid && process_manager_1.ProcessManager.killProcess(lane.pid, signal)) {
202
+ logger.info(` ✓ lane '${lane.name}' (PID ${lane.pid}) stopped`);
203
+ totalStopped++;
204
+ }
205
+ }
206
+ }
207
+ if (totalStopped > 0) {
208
+ logger.success(`\n✅ All workflows stopped (${totalStopped} lanes).`);
209
+ }
210
+ else {
211
+ logger.info('\nNo active lanes were stopped.');
212
+ }
213
+ }
214
+ module.exports = stop;
215
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/cli/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CursorFlow tasks command
3
+ *
4
+ * Usage:
5
+ * cursorflow tasks # List all tasks
6
+ * cursorflow tasks --validate # List all tasks with validation
7
+ * cursorflow tasks <name> # Show detailed task info
8
+ */
9
+ declare function tasks(args: string[]): Promise<void>;
10
+ export = tasks;
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * CursorFlow tasks command
4
+ *
5
+ * Usage:
6
+ * cursorflow tasks # List all tasks
7
+ * cursorflow tasks --validate # List all tasks with validation
8
+ * cursorflow tasks <name> # Show detailed task info
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ const logger = __importStar(require("../utils/logger"));
44
+ const task_service_1 = require("../utils/task-service");
45
+ const config_1 = require("../utils/config");
46
+ const COLORS = logger.COLORS;
47
+ function printHelp() {
48
+ console.log(`
49
+ Usage: cursorflow tasks [options] [task-name]
50
+
51
+ Manage and view prepared tasks in _cursorflow/tasks/.
52
+
53
+ Options:
54
+ --validate Run validation on all tasks before listing
55
+ --help, -h Show help
56
+
57
+ Examples:
58
+ cursorflow tasks
59
+ cursorflow tasks --validate
60
+ cursorflow tasks 2412221530_AuthSystem
61
+ `);
62
+ }
63
+ function parseArgs(args) {
64
+ const options = {
65
+ validate: args.includes('--validate'),
66
+ taskName: null,
67
+ };
68
+ const nameArg = args.find(arg => !arg.startsWith('-'));
69
+ if (nameArg) {
70
+ options.taskName = nameArg;
71
+ }
72
+ if (args.includes('--help') || args.includes('-h')) {
73
+ printHelp();
74
+ process.exit(0);
75
+ }
76
+ return options;
77
+ }
78
+ function formatDate(date) {
79
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
80
+ return `${months[date.getMonth()]} ${date.getDate()}`;
81
+ }
82
+ function getStatusLabel(info) {
83
+ const status = info.validationStatus;
84
+ const icon = status === 'valid' ? '✅' : status === 'warnings' ? '⚠️' : status === 'errors' ? '❌' : '❓';
85
+ if (status === 'valid')
86
+ return `${icon} Valid`;
87
+ if (status === 'warnings')
88
+ return `${icon} Warnings`;
89
+ if (status === 'errors')
90
+ return `${icon} Errors`;
91
+ return `${icon} Unknown`;
92
+ }
93
+ function printTasksList(tasks) {
94
+ if (tasks.length === 0) {
95
+ logger.info('No tasks found in _cursorflow/tasks/');
96
+ return;
97
+ }
98
+ console.log(`${COLORS.bold}Prepared Tasks:${COLORS.reset}`);
99
+ for (let i = 0; i < tasks.length; i++) {
100
+ const task = tasks[i];
101
+ const prefix = i === 0 ? ' ▶' : ' ';
102
+ const name = task.name.padEnd(30);
103
+ const lanes = `${task.lanes.length} lane${task.lanes.length > 1 ? 's' : ''}`.padEnd(10);
104
+ const status = getStatusLabel(task).padEnd(14);
105
+ const date = formatDate(task.timestamp);
106
+ let color = COLORS.reset;
107
+ if (task.validationStatus === 'errors')
108
+ color = COLORS.red;
109
+ else if (task.validationStatus === 'warnings')
110
+ color = COLORS.yellow;
111
+ else if (task.validationStatus === 'valid')
112
+ color = COLORS.green;
113
+ console.log(`${color}${prefix} ${name} ${lanes} ${status} ${date}${COLORS.reset}`);
114
+ }
115
+ }
116
+ function printTaskDetail(info) {
117
+ console.log(`${COLORS.bold}Task: ${info.name}${COLORS.reset}`);
118
+ console.log(`${COLORS.cyan}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${COLORS.reset}`);
119
+ if (info.lanes.length === 0) {
120
+ console.log('No lanes defined.');
121
+ }
122
+ else {
123
+ console.log(`${COLORS.bold}Lanes:${COLORS.reset}`);
124
+ for (const lane of info.lanes) {
125
+ const fileName = lane.fileName.padEnd(18);
126
+ const preset = `[${lane.preset}]`.padEnd(10);
127
+ const flow = lane.taskFlow;
128
+ const depends = lane.dependsOn.length > 0 ? ` ${COLORS.gray}(depends: ${lane.dependsOn.join(', ')})${COLORS.reset}` : '';
129
+ console.log(` ${fileName} ${COLORS.blue}${preset}${COLORS.reset} ${flow}${depends}`);
130
+ }
131
+ }
132
+ }
133
+ async function tasks(args) {
134
+ const options = parseArgs(args);
135
+ const projectRoot = (0, config_1.findProjectRoot)();
136
+ const config = (0, config_1.loadConfig)(projectRoot);
137
+ const tasksDir = (0, config_1.getTasksDir)(config);
138
+ const taskService = new task_service_1.TaskService(tasksDir);
139
+ if (options.taskName) {
140
+ const info = taskService.getTaskDirInfo(options.taskName);
141
+ if (!info) {
142
+ logger.error(`Task not found: ${options.taskName}`);
143
+ process.exit(1);
144
+ }
145
+ // Always validate for detail view to have report
146
+ taskService.validateTaskDir(options.taskName);
147
+ const updatedInfo = taskService.getTaskDirInfo(options.taskName);
148
+ printTaskDetail(updatedInfo);
149
+ }
150
+ else {
151
+ let taskList = taskService.listTaskDirs();
152
+ if (options.validate) {
153
+ const spinner = logger.createSpinner('Validating tasks...');
154
+ spinner.start();
155
+ for (const task of taskList) {
156
+ taskService.validateTaskDir(task.name);
157
+ }
158
+ spinner.succeed('Validation complete');
159
+ taskList = taskService.listTaskDirs();
160
+ }
161
+ printTasksList(taskList);
162
+ }
163
+ }
164
+ module.exports = tasks;
165
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/cli/tasks.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wDAA0C;AAC1C,wDAAmF;AACnF,4CAA2E;AAE3E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAO7B,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;GAaX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAoB;QAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QACrC,QAAQ,EAAE,IAAI;KACf,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACpG,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEvG,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,GAAG,IAAI,QAAQ,CAAC;IAC/C,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,GAAG,IAAI,WAAW,CAAC;IACrD,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,SAAS,CAAC;IAEjD,OAAO,GAAG,IAAI,UAAU,CAAC;AAC3B,CAAC;AAED,SAAS,cAAc,CAAC,KAAoB;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,kBAAkB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAExC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ;YAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;aACtD,IAAI,IAAI,CAAC,gBAAgB,KAAK,UAAU;YAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;aAChE,IAAI,IAAI,CAAC,gBAAgB,KAAK,OAAO;YAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,+CAA+C,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzH,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;AAEH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAc;IACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAA,wBAAe,GAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,0BAAW,CAAC,QAAQ,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,iDAAiD;QACjD,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAE,CAAC;QAElE,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,IAAI,QAAQ,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;QAE1C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;YAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACvC,QAAQ,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC;QACxC,CAAC;QAED,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,iBAAS,KAAK,CAAC"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Auto-Recovery Module
3
+ *
4
+ * Automatic recovery strategies for common orchestration failures:
5
+ * - Agent idle/no response detection with escalating interventions
6
+ * - Guidance messages for git conflicts and push failures
7
+ * - Process health monitoring with restart capabilities
8
+ * - Doctor integration for persistent failures
9
+ * - POF (Post-mortem of Failure) saving for failed recoveries
10
+ */
11
+ import { ChildProcess } from 'child_process';
12
+ import { LaneState } from '../utils/types';
13
+ /** Recovery stages for escalating interventions */
14
+ export declare enum RecoveryStage {
15
+ /** Normal operation - monitoring */
16
+ NORMAL = 0,
17
+ /** First intervention - send continue signal */
18
+ CONTINUE_SIGNAL = 1,
19
+ /** Second intervention - send stronger prompt */
20
+ STRONGER_PROMPT = 2,
21
+ /** Third intervention - kill and restart process */
22
+ RESTART_PROCESS = 3,
23
+ /** Final stage - run doctor and report */
24
+ DIAGNOSE = 4,
25
+ /** No more recovery possible */
26
+ ABORT = 5
27
+ }
28
+ /** Configuration for auto-recovery behavior */
29
+ export interface AutoRecoveryConfig {
30
+ /** Time without activity before sending continue signal (default: 1 minute) */
31
+ idleTimeoutMs: number;
32
+ /** Time to wait after continue signal before escalating (default: 1 minute) */
33
+ continueGraceMs: number;
34
+ /** Time to wait after stronger prompt before escalating (default: 1 minute) */
35
+ strongerPromptGraceMs: number;
36
+ /** Maximum number of restarts before aborting (default: 2) */
37
+ maxRestarts: number;
38
+ /** Whether to run doctor on persistent failures (default: true) */
39
+ runDoctorOnFailure: boolean;
40
+ /** Patterns indicating long-running operations (won't trigger idle) */
41
+ longOperationPatterns: RegExp[];
42
+ /** Grace period for long operations (default: 10 minutes) */
43
+ longOperationGraceMs: number;
44
+ /** Enable verbose logging */
45
+ verbose: boolean;
46
+ }
47
+ /** Default auto-recovery configuration */
48
+ export declare const DEFAULT_AUTO_RECOVERY_CONFIG: AutoRecoveryConfig;
49
+ /** State tracking for a single lane's recovery */
50
+ export interface LaneRecoveryState {
51
+ laneName: string;
52
+ stage: RecoveryStage;
53
+ lastActivityTime: number;
54
+ lastBytesReceived: number;
55
+ totalBytesReceived: number;
56
+ lastOutput: string;
57
+ restartCount: number;
58
+ continueSignalsSent: number;
59
+ lastStageChangeTime: number;
60
+ diagnosticInfo?: DiagnosticInfo;
61
+ isLongOperation: boolean;
62
+ failureHistory: FailureRecord[];
63
+ }
64
+ /** Diagnostic information from doctor */
65
+ export interface DiagnosticInfo {
66
+ timestamp: number;
67
+ agentHealthy: boolean;
68
+ authHealthy: boolean;
69
+ systemHealthy: boolean;
70
+ suggestedAction: string;
71
+ details: string;
72
+ }
73
+ /** Recovery action result */
74
+ export interface RecoveryActionResult {
75
+ success: boolean;
76
+ action: string;
77
+ message: string;
78
+ shouldContinue: boolean;
79
+ nextStage?: RecoveryStage;
80
+ diagnostic?: DiagnosticInfo;
81
+ }
82
+ /** Record of a failure for POF */
83
+ export interface FailureRecord {
84
+ timestamp: number;
85
+ stage: RecoveryStage;
86
+ action: string;
87
+ message: string;
88
+ idleTimeMs: number;
89
+ bytesReceived: number;
90
+ lastOutput: string;
91
+ }
92
+ /** POF (Post-mortem of Failure) entry */
93
+ export interface POFEntry {
94
+ title: string;
95
+ runId: string;
96
+ failureTime: string;
97
+ detectedAt: string;
98
+ summary: string;
99
+ rootCause: {
100
+ type: string;
101
+ description: string;
102
+ symptoms: string[];
103
+ };
104
+ affectedLanes: Array<{
105
+ name: string;
106
+ status: string;
107
+ task: string;
108
+ taskIndex: number;
109
+ pid?: number;
110
+ reason: string;
111
+ recoveryAttempts: FailureRecord[];
112
+ }>;
113
+ possibleCauses: string[];
114
+ recovery: {
115
+ command: string;
116
+ description: string;
117
+ alternativeCommand?: string;
118
+ alternativeDescription?: string;
119
+ };
120
+ previousFailures?: POFEntry[];
121
+ }
122
+ /** Generate guidance message for git push failure */
123
+ export declare function getGitPushFailureGuidance(): string;
124
+ /** Generate guidance message for merge conflict */
125
+ export declare function getMergeConflictGuidance(): string;
126
+ /** Generate guidance message for general git error */
127
+ export declare function getGitErrorGuidance(errorMessage: string): string;
128
+ /**
129
+ * Manages recovery state for all lanes
130
+ */
131
+ export declare class AutoRecoveryManager {
132
+ private config;
133
+ private laneStates;
134
+ private eventHandlers;
135
+ constructor(config?: Partial<AutoRecoveryConfig>);
136
+ /**
137
+ * Register a lane for recovery monitoring
138
+ */
139
+ registerLane(laneName: string): void;
140
+ /**
141
+ * Unregister a lane from recovery monitoring
142
+ */
143
+ unregisterLane(laneName: string): void;
144
+ /**
145
+ * Record activity for a lane
146
+ */
147
+ recordActivity(laneName: string, bytesReceived?: number, output?: string): void;
148
+ /**
149
+ * Get current recovery state for a lane
150
+ */
151
+ getState(laneName: string): LaneRecoveryState | undefined;
152
+ /**
153
+ * Check if a lane needs recovery intervention
154
+ */
155
+ needsIntervention(laneName: string): boolean;
156
+ /**
157
+ * Get the next recovery action for a lane
158
+ */
159
+ getRecoveryAction(laneName: string, laneRunDir: string, child?: ChildProcess): Promise<RecoveryActionResult>;
160
+ /**
161
+ * Send a continue signal to the lane
162
+ */
163
+ private sendContinueSignal;
164
+ /**
165
+ * Send a stronger prompt to nudge the agent
166
+ */
167
+ private sendStrongerPrompt;
168
+ /**
169
+ * Request process restart
170
+ */
171
+ private requestRestart;
172
+ /**
173
+ * Run diagnostic checks
174
+ */
175
+ private runDiagnosis;
176
+ /**
177
+ * Get failure history for a lane
178
+ */
179
+ getFailureHistory(laneName: string): FailureRecord[];
180
+ /**
181
+ * Get configuration
182
+ */
183
+ getConfig(): AutoRecoveryConfig;
184
+ /**
185
+ * Update configuration
186
+ */
187
+ updateConfig(config: Partial<AutoRecoveryConfig>): void;
188
+ }
189
+ /**
190
+ * Save a POF entry to the pof directory
191
+ */
192
+ export declare function savePOF(runId: string, pofDir: string, entry: POFEntry): string;
193
+ /**
194
+ * Create a POF entry from recovery state
195
+ */
196
+ export declare function createPOFFromRecoveryState(runId: string, runDir: string, laneName: string, state: LaneRecoveryState, laneState: LaneState | null, diagnostic?: DiagnosticInfo): POFEntry;
197
+ /**
198
+ * Load existing POF entries for a run
199
+ */
200
+ export declare function loadPOF(pofDir: string, runId: string): POFEntry | null;
201
+ /**
202
+ * List all POF files in a directory
203
+ */
204
+ export declare function listPOFs(pofDir: string): string[];
205
+ /**
206
+ * Get or create the default auto-recovery manager
207
+ */
208
+ export declare function getAutoRecoveryManager(config?: Partial<AutoRecoveryConfig>): AutoRecoveryManager;
209
+ /**
210
+ * Reset the default manager (for testing)
211
+ */
212
+ export declare function resetAutoRecoveryManager(): void;