steroids-api 0.2.7

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 (328) hide show
  1. package/dist/API/src/index.d.ts +10 -0
  2. package/dist/API/src/index.d.ts.map +1 -0
  3. package/dist/API/src/index.js +130 -0
  4. package/dist/API/src/index.js.map +1 -0
  5. package/dist/API/src/routes/activity.d.ts +7 -0
  6. package/dist/API/src/routes/activity.d.ts.map +1 -0
  7. package/dist/API/src/routes/activity.js +252 -0
  8. package/dist/API/src/routes/activity.js.map +1 -0
  9. package/dist/API/src/routes/config.d.ts +7 -0
  10. package/dist/API/src/routes/config.d.ts.map +1 -0
  11. package/dist/API/src/routes/config.js +521 -0
  12. package/dist/API/src/routes/config.js.map +1 -0
  13. package/dist/API/src/routes/health.d.ts +7 -0
  14. package/dist/API/src/routes/health.d.ts.map +1 -0
  15. package/dist/API/src/routes/health.js +172 -0
  16. package/dist/API/src/routes/health.js.map +1 -0
  17. package/dist/API/src/routes/incidents.d.ts +7 -0
  18. package/dist/API/src/routes/incidents.d.ts.map +1 -0
  19. package/dist/API/src/routes/incidents.js +117 -0
  20. package/dist/API/src/routes/incidents.js.map +1 -0
  21. package/dist/API/src/routes/projects.d.ts +7 -0
  22. package/dist/API/src/routes/projects.d.ts.map +1 -0
  23. package/dist/API/src/routes/projects.js +398 -0
  24. package/dist/API/src/routes/projects.js.map +1 -0
  25. package/dist/API/src/routes/runners.d.ts +7 -0
  26. package/dist/API/src/routes/runners.d.ts.map +1 -0
  27. package/dist/API/src/routes/runners.js +242 -0
  28. package/dist/API/src/routes/runners.js.map +1 -0
  29. package/dist/API/src/routes/tasks.d.ts +7 -0
  30. package/dist/API/src/routes/tasks.d.ts.map +1 -0
  31. package/dist/API/src/routes/tasks.js +1007 -0
  32. package/dist/API/src/routes/tasks.js.map +1 -0
  33. package/dist/API/src/utils/validation.d.ts +22 -0
  34. package/dist/API/src/utils/validation.d.ts.map +1 -0
  35. package/dist/API/src/utils/validation.js +50 -0
  36. package/dist/API/src/utils/validation.js.map +1 -0
  37. package/dist/index.d.ts +10 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +184 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/routes/activity.d.ts +7 -0
  42. package/dist/routes/activity.d.ts.map +1 -0
  43. package/dist/routes/activity.js +252 -0
  44. package/dist/routes/activity.js.map +1 -0
  45. package/dist/routes/config.d.ts +7 -0
  46. package/dist/routes/config.d.ts.map +1 -0
  47. package/dist/routes/config.js +647 -0
  48. package/dist/routes/config.js.map +1 -0
  49. package/dist/routes/credit-alerts.d.ts +2 -0
  50. package/dist/routes/credit-alerts.d.ts.map +1 -0
  51. package/dist/routes/credit-alerts.js +97 -0
  52. package/dist/routes/credit-alerts.js.map +1 -0
  53. package/dist/routes/health.d.ts +7 -0
  54. package/dist/routes/health.d.ts.map +1 -0
  55. package/dist/routes/health.js +200 -0
  56. package/dist/routes/health.js.map +1 -0
  57. package/dist/routes/incidents.d.ts +7 -0
  58. package/dist/routes/incidents.d.ts.map +1 -0
  59. package/dist/routes/incidents.js +117 -0
  60. package/dist/routes/incidents.js.map +1 -0
  61. package/dist/routes/projects.d.ts +7 -0
  62. package/dist/routes/projects.d.ts.map +1 -0
  63. package/dist/routes/projects.js +643 -0
  64. package/dist/routes/projects.js.map +1 -0
  65. package/dist/routes/runners.d.ts +7 -0
  66. package/dist/routes/runners.d.ts.map +1 -0
  67. package/dist/routes/runners.js +299 -0
  68. package/dist/routes/runners.js.map +1 -0
  69. package/dist/routes/skills.d.ts +3 -0
  70. package/dist/routes/skills.d.ts.map +1 -0
  71. package/dist/routes/skills.js +109 -0
  72. package/dist/routes/skills.js.map +1 -0
  73. package/dist/routes/storage.d.ts +7 -0
  74. package/dist/routes/storage.d.ts.map +1 -0
  75. package/dist/routes/storage.js +93 -0
  76. package/dist/routes/storage.js.map +1 -0
  77. package/dist/routes/tasks.d.ts +7 -0
  78. package/dist/routes/tasks.d.ts.map +1 -0
  79. package/dist/routes/tasks.js +1145 -0
  80. package/dist/routes/tasks.js.map +1 -0
  81. package/dist/src/cleanup/invocation-logs.d.ts +30 -0
  82. package/dist/src/cleanup/invocation-logs.d.ts.map +1 -0
  83. package/dist/src/cleanup/invocation-logs.js +66 -0
  84. package/dist/src/cleanup/invocation-logs.js.map +1 -0
  85. package/dist/src/commands/loop-phases.d.ts +11 -0
  86. package/dist/src/commands/loop-phases.d.ts.map +1 -0
  87. package/dist/src/commands/loop-phases.js +304 -0
  88. package/dist/src/commands/loop-phases.js.map +1 -0
  89. package/dist/src/config/loader.d.ts +160 -0
  90. package/dist/src/config/loader.d.ts.map +1 -0
  91. package/dist/src/config/loader.js +276 -0
  92. package/dist/src/config/loader.js.map +1 -0
  93. package/dist/src/database/connection.d.ts +35 -0
  94. package/dist/src/database/connection.d.ts.map +1 -0
  95. package/dist/src/database/connection.js +197 -0
  96. package/dist/src/database/connection.js.map +1 -0
  97. package/dist/src/database/queries.d.ts +220 -0
  98. package/dist/src/database/queries.d.ts.map +1 -0
  99. package/dist/src/database/queries.js +589 -0
  100. package/dist/src/database/queries.js.map +1 -0
  101. package/dist/src/database/schema.d.ts +8 -0
  102. package/dist/src/database/schema.d.ts.map +1 -0
  103. package/dist/src/database/schema.js +184 -0
  104. package/dist/src/database/schema.js.map +1 -0
  105. package/dist/src/git/push.d.ts +26 -0
  106. package/dist/src/git/push.d.ts.map +1 -0
  107. package/dist/src/git/push.js +91 -0
  108. package/dist/src/git/push.js.map +1 -0
  109. package/dist/src/git/status.d.ts +83 -0
  110. package/dist/src/git/status.d.ts.map +1 -0
  111. package/dist/src/git/status.js +315 -0
  112. package/dist/src/git/status.js.map +1 -0
  113. package/dist/src/health/stuck-task-detector.d.ts +131 -0
  114. package/dist/src/health/stuck-task-detector.d.ts.map +1 -0
  115. package/dist/src/health/stuck-task-detector.js +233 -0
  116. package/dist/src/health/stuck-task-detector.js.map +1 -0
  117. package/dist/src/health/stuck-task-recovery.d.ts +45 -0
  118. package/dist/src/health/stuck-task-recovery.d.ts.map +1 -0
  119. package/dist/src/health/stuck-task-recovery.js +309 -0
  120. package/dist/src/health/stuck-task-recovery.js.map +1 -0
  121. package/dist/src/index.d.ts +10 -0
  122. package/dist/src/index.d.ts.map +1 -0
  123. package/dist/src/index.js +130 -0
  124. package/dist/src/index.js.map +1 -0
  125. package/dist/src/locking/queries.d.ts +116 -0
  126. package/dist/src/locking/queries.d.ts.map +1 -0
  127. package/dist/src/locking/queries.js +232 -0
  128. package/dist/src/locking/queries.js.map +1 -0
  129. package/dist/src/locking/section-lock.d.ts +74 -0
  130. package/dist/src/locking/section-lock.d.ts.map +1 -0
  131. package/dist/src/locking/section-lock.js +196 -0
  132. package/dist/src/locking/section-lock.js.map +1 -0
  133. package/dist/src/locking/task-lock.d.ts +92 -0
  134. package/dist/src/locking/task-lock.d.ts.map +1 -0
  135. package/dist/src/locking/task-lock.js +233 -0
  136. package/dist/src/locking/task-lock.js.map +1 -0
  137. package/dist/src/migrations/index.d.ts +7 -0
  138. package/dist/src/migrations/index.d.ts.map +1 -0
  139. package/dist/src/migrations/index.js +9 -0
  140. package/dist/src/migrations/index.js.map +1 -0
  141. package/dist/src/migrations/manifest.d.ts +92 -0
  142. package/dist/src/migrations/manifest.d.ts.map +1 -0
  143. package/dist/src/migrations/manifest.js +255 -0
  144. package/dist/src/migrations/manifest.js.map +1 -0
  145. package/dist/src/migrations/runner.d.ts +84 -0
  146. package/dist/src/migrations/runner.d.ts.map +1 -0
  147. package/dist/src/migrations/runner.js +338 -0
  148. package/dist/src/migrations/runner.js.map +1 -0
  149. package/dist/src/orchestrator/coder.d.ts +32 -0
  150. package/dist/src/orchestrator/coder.d.ts.map +1 -0
  151. package/dist/src/orchestrator/coder.js +170 -0
  152. package/dist/src/orchestrator/coder.js.map +1 -0
  153. package/dist/src/orchestrator/coordinator.d.ts +28 -0
  154. package/dist/src/orchestrator/coordinator.d.ts.map +1 -0
  155. package/dist/src/orchestrator/coordinator.js +252 -0
  156. package/dist/src/orchestrator/coordinator.js.map +1 -0
  157. package/dist/src/orchestrator/fallback-handler.d.ts +24 -0
  158. package/dist/src/orchestrator/fallback-handler.d.ts.map +1 -0
  159. package/dist/src/orchestrator/fallback-handler.js +280 -0
  160. package/dist/src/orchestrator/fallback-handler.js.map +1 -0
  161. package/dist/src/orchestrator/invoke.d.ts +14 -0
  162. package/dist/src/orchestrator/invoke.d.ts.map +1 -0
  163. package/dist/src/orchestrator/invoke.js +76 -0
  164. package/dist/src/orchestrator/invoke.js.map +1 -0
  165. package/dist/src/orchestrator/post-coder.d.ts +10 -0
  166. package/dist/src/orchestrator/post-coder.d.ts.map +1 -0
  167. package/dist/src/orchestrator/post-coder.js +198 -0
  168. package/dist/src/orchestrator/post-coder.js.map +1 -0
  169. package/dist/src/orchestrator/post-reviewer.d.ts +10 -0
  170. package/dist/src/orchestrator/post-reviewer.d.ts.map +1 -0
  171. package/dist/src/orchestrator/post-reviewer.js +199 -0
  172. package/dist/src/orchestrator/post-reviewer.js.map +1 -0
  173. package/dist/src/orchestrator/reviewer.d.ts +35 -0
  174. package/dist/src/orchestrator/reviewer.d.ts.map +1 -0
  175. package/dist/src/orchestrator/reviewer.js +237 -0
  176. package/dist/src/orchestrator/reviewer.js.map +1 -0
  177. package/dist/src/orchestrator/schemas.d.ts +10 -0
  178. package/dist/src/orchestrator/schemas.d.ts.map +1 -0
  179. package/dist/src/orchestrator/schemas.js +81 -0
  180. package/dist/src/orchestrator/schemas.js.map +1 -0
  181. package/dist/src/orchestrator/task-selector.d.ts +102 -0
  182. package/dist/src/orchestrator/task-selector.d.ts.map +1 -0
  183. package/dist/src/orchestrator/task-selector.js +326 -0
  184. package/dist/src/orchestrator/task-selector.js.map +1 -0
  185. package/dist/src/orchestrator/types.d.ts +74 -0
  186. package/dist/src/orchestrator/types.d.ts.map +1 -0
  187. package/dist/src/orchestrator/types.js +5 -0
  188. package/dist/src/orchestrator/types.js.map +1 -0
  189. package/dist/src/prompts/coder.d.ts +36 -0
  190. package/dist/src/prompts/coder.d.ts.map +1 -0
  191. package/dist/src/prompts/coder.js +303 -0
  192. package/dist/src/prompts/coder.js.map +1 -0
  193. package/dist/src/prompts/prompt-helpers.d.ts +51 -0
  194. package/dist/src/prompts/prompt-helpers.d.ts.map +1 -0
  195. package/dist/src/prompts/prompt-helpers.js +299 -0
  196. package/dist/src/prompts/prompt-helpers.js.map +1 -0
  197. package/dist/src/prompts/reviewer.d.ts +40 -0
  198. package/dist/src/prompts/reviewer.d.ts.map +1 -0
  199. package/dist/src/prompts/reviewer.js +416 -0
  200. package/dist/src/prompts/reviewer.js.map +1 -0
  201. package/dist/src/providers/claude.d.ts +53 -0
  202. package/dist/src/providers/claude.d.ts.map +1 -0
  203. package/dist/src/providers/claude.js +227 -0
  204. package/dist/src/providers/claude.js.map +1 -0
  205. package/dist/src/providers/codex.d.ts +53 -0
  206. package/dist/src/providers/codex.d.ts.map +1 -0
  207. package/dist/src/providers/codex.js +253 -0
  208. package/dist/src/providers/codex.js.map +1 -0
  209. package/dist/src/providers/gemini.d.ts +58 -0
  210. package/dist/src/providers/gemini.d.ts.map +1 -0
  211. package/dist/src/providers/gemini.js +240 -0
  212. package/dist/src/providers/gemini.js.map +1 -0
  213. package/dist/src/providers/interface.d.ts +185 -0
  214. package/dist/src/providers/interface.d.ts.map +1 -0
  215. package/dist/src/providers/interface.js +92 -0
  216. package/dist/src/providers/interface.js.map +1 -0
  217. package/dist/src/providers/invocation-logger.d.ts +97 -0
  218. package/dist/src/providers/invocation-logger.d.ts.map +1 -0
  219. package/dist/src/providers/invocation-logger.js +378 -0
  220. package/dist/src/providers/invocation-logger.js.map +1 -0
  221. package/dist/src/providers/openai.d.ts +53 -0
  222. package/dist/src/providers/openai.d.ts.map +1 -0
  223. package/dist/src/providers/openai.js +230 -0
  224. package/dist/src/providers/openai.js.map +1 -0
  225. package/dist/src/providers/registry.d.ts +100 -0
  226. package/dist/src/providers/registry.d.ts.map +1 -0
  227. package/dist/src/providers/registry.js +170 -0
  228. package/dist/src/providers/registry.js.map +1 -0
  229. package/dist/src/routes/activity.d.ts +7 -0
  230. package/dist/src/routes/activity.d.ts.map +1 -0
  231. package/dist/src/routes/activity.js +252 -0
  232. package/dist/src/routes/activity.js.map +1 -0
  233. package/dist/src/routes/config.d.ts +7 -0
  234. package/dist/src/routes/config.d.ts.map +1 -0
  235. package/dist/src/routes/config.js +521 -0
  236. package/dist/src/routes/config.js.map +1 -0
  237. package/dist/src/routes/health.d.ts +7 -0
  238. package/dist/src/routes/health.d.ts.map +1 -0
  239. package/dist/src/routes/health.js +172 -0
  240. package/dist/src/routes/health.js.map +1 -0
  241. package/dist/src/routes/incidents.d.ts +7 -0
  242. package/dist/src/routes/incidents.d.ts.map +1 -0
  243. package/dist/src/routes/incidents.js +117 -0
  244. package/dist/src/routes/incidents.js.map +1 -0
  245. package/dist/src/routes/projects.d.ts +7 -0
  246. package/dist/src/routes/projects.d.ts.map +1 -0
  247. package/dist/src/routes/projects.js +398 -0
  248. package/dist/src/routes/projects.js.map +1 -0
  249. package/dist/src/routes/runners.d.ts +7 -0
  250. package/dist/src/routes/runners.d.ts.map +1 -0
  251. package/dist/src/routes/runners.js +242 -0
  252. package/dist/src/routes/runners.js.map +1 -0
  253. package/dist/src/routes/tasks.d.ts +7 -0
  254. package/dist/src/routes/tasks.d.ts.map +1 -0
  255. package/dist/src/routes/tasks.js +1007 -0
  256. package/dist/src/routes/tasks.js.map +1 -0
  257. package/dist/src/runners/activity-log.d.ts +65 -0
  258. package/dist/src/runners/activity-log.d.ts.map +1 -0
  259. package/dist/src/runners/activity-log.js +140 -0
  260. package/dist/src/runners/activity-log.js.map +1 -0
  261. package/dist/src/runners/cron.d.ts +30 -0
  262. package/dist/src/runners/cron.d.ts.map +1 -0
  263. package/dist/src/runners/cron.js +333 -0
  264. package/dist/src/runners/cron.js.map +1 -0
  265. package/dist/src/runners/daemon.d.ts +71 -0
  266. package/dist/src/runners/daemon.d.ts.map +1 -0
  267. package/dist/src/runners/daemon.js +233 -0
  268. package/dist/src/runners/daemon.js.map +1 -0
  269. package/dist/src/runners/global-db.d.ts +31 -0
  270. package/dist/src/runners/global-db.d.ts.map +1 -0
  271. package/dist/src/runners/global-db.js +220 -0
  272. package/dist/src/runners/global-db.js.map +1 -0
  273. package/dist/src/runners/hang-detector.d.ts +38 -0
  274. package/dist/src/runners/hang-detector.d.ts.map +1 -0
  275. package/dist/src/runners/hang-detector.js +130 -0
  276. package/dist/src/runners/hang-detector.js.map +1 -0
  277. package/dist/src/runners/heartbeat.d.ts +39 -0
  278. package/dist/src/runners/heartbeat.d.ts.map +1 -0
  279. package/dist/src/runners/heartbeat.js +71 -0
  280. package/dist/src/runners/heartbeat.js.map +1 -0
  281. package/dist/src/runners/lock.d.ts +47 -0
  282. package/dist/src/runners/lock.d.ts.map +1 -0
  283. package/dist/src/runners/lock.js +140 -0
  284. package/dist/src/runners/lock.js.map +1 -0
  285. package/dist/src/runners/orchestrator-loop.d.ts +20 -0
  286. package/dist/src/runners/orchestrator-loop.d.ts.map +1 -0
  287. package/dist/src/runners/orchestrator-loop.js +208 -0
  288. package/dist/src/runners/orchestrator-loop.js.map +1 -0
  289. package/dist/src/runners/projects.d.ts +96 -0
  290. package/dist/src/runners/projects.d.ts.map +1 -0
  291. package/dist/src/runners/projects.js +243 -0
  292. package/dist/src/runners/projects.js.map +1 -0
  293. package/dist/src/runners/wakeup.d.ts +37 -0
  294. package/dist/src/runners/wakeup.d.ts.map +1 -0
  295. package/dist/src/runners/wakeup.js +355 -0
  296. package/dist/src/runners/wakeup.js.map +1 -0
  297. package/dist/src/utils/validation.d.ts +22 -0
  298. package/dist/src/utils/validation.d.ts.map +1 -0
  299. package/dist/src/utils/validation.js +50 -0
  300. package/dist/src/utils/validation.js.map +1 -0
  301. package/dist/utils/sqlite.d.ts +17 -0
  302. package/dist/utils/sqlite.d.ts.map +1 -0
  303. package/dist/utils/sqlite.js +27 -0
  304. package/dist/utils/sqlite.js.map +1 -0
  305. package/dist/utils/storage-cache.d.ts +33 -0
  306. package/dist/utils/storage-cache.d.ts.map +1 -0
  307. package/dist/utils/storage-cache.js +81 -0
  308. package/dist/utils/storage-cache.js.map +1 -0
  309. package/dist/utils/validation.d.ts +22 -0
  310. package/dist/utils/validation.d.ts.map +1 -0
  311. package/dist/utils/validation.js +51 -0
  312. package/dist/utils/validation.js.map +1 -0
  313. package/package.json +39 -0
  314. package/src/index.ts +199 -0
  315. package/src/routes/activity.ts +302 -0
  316. package/src/routes/config.ts +723 -0
  317. package/src/routes/credit-alerts.ts +73 -0
  318. package/src/routes/health.ts +219 -0
  319. package/src/routes/incidents.ts +131 -0
  320. package/src/routes/projects.ts +854 -0
  321. package/src/routes/runners.ts +357 -0
  322. package/src/routes/skills.ts +127 -0
  323. package/src/routes/storage.ts +108 -0
  324. package/src/routes/tasks.ts +1372 -0
  325. package/src/utils/sqlite.ts +36 -0
  326. package/src/utils/storage-cache.ts +107 -0
  327. package/src/utils/validation.ts +61 -0
  328. package/tsconfig.json +20 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Orchestrator loop - core task processing logic
3
+ * Used by both the daemon and the loop command
4
+ */
5
+ import { openDatabase, getDbPath } from '../database/connection.js';
6
+ import { autoMigrate } from '../migrations/index.js';
7
+ import { getTask, getSection } from '../database/queries.js';
8
+ import { selectNextTask, selectTaskBatch, markTaskInProgress, getTaskCounts, } from '../orchestrator/task-selector.js';
9
+ import { invokeCoderBatch } from '../orchestrator/coder.js';
10
+ import { loadConfig } from '../config/loader.js';
11
+ import { invokeReviewerBatch } from '../orchestrator/reviewer.js';
12
+ import { logActivity } from './activity-log.js';
13
+ import { getRegisteredProject } from './projects.js';
14
+ import { execSync } from 'node:child_process';
15
+ import { runCoderPhase, runReviewerPhase } from '../commands/loop-phases.js';
16
+ function sleep(ms) {
17
+ return new Promise((resolve) => setTimeout(resolve, ms));
18
+ }
19
+ /**
20
+ * Run the orchestrator loop
21
+ * Processes tasks until all are complete or shouldStop returns true
22
+ */
23
+ export async function runOrchestratorLoop(options) {
24
+ const { projectPath, once = false, shouldStop, sectionId } = options;
25
+ const { db, close } = openDatabase(projectPath);
26
+ // Auto-migrate database if needed
27
+ const dbPath = getDbPath(projectPath);
28
+ const migrationResult = autoMigrate(db, dbPath);
29
+ if (migrationResult.applied) {
30
+ console.log(`Applied ${migrationResult.migrations.length} migration(s): ${migrationResult.migrations.join(', ')}`);
31
+ }
32
+ else if (migrationResult.error) {
33
+ console.error(`Migration error: ${migrationResult.error}`);
34
+ close();
35
+ throw new Error(`Database migration failed: ${migrationResult.error}`);
36
+ }
37
+ // Load batch mode config
38
+ const config = loadConfig(projectPath);
39
+ const batchMode = config.sections?.batchMode ?? false;
40
+ const maxBatchSize = config.sections?.maxBatchSize ?? 10;
41
+ try {
42
+ let iteration = 0;
43
+ while (true) {
44
+ // Check if we should stop
45
+ if (shouldStop?.()) {
46
+ console.log('\nLoop stopped by signal');
47
+ break;
48
+ }
49
+ // Check if project has been disabled
50
+ const registeredProject = getRegisteredProject(projectPath);
51
+ if (registeredProject && !registeredProject.enabled) {
52
+ console.log('\nProject has been disabled. Stopping loop.');
53
+ break;
54
+ }
55
+ iteration++;
56
+ console.log(`\n─── Iteration ${iteration} ───\n`);
57
+ options.onIteration?.(iteration);
58
+ // Batch mode: process multiple pending tasks at once
59
+ // Only active when not focusing on a specific section and batch mode is enabled
60
+ if (batchMode && !sectionId) {
61
+ const batch = selectTaskBatch(db, maxBatchSize);
62
+ if (batch && batch.tasks.length > 0) {
63
+ console.log(`[BATCH MODE] Section "${batch.sectionName}" - ${batch.tasks.length} tasks`);
64
+ // Mark all tasks as in_progress
65
+ for (const task of batch.tasks) {
66
+ markTaskInProgress(db, task.id);
67
+ options.onTaskStart?.(task.id, 'batch');
68
+ }
69
+ // Invoke batch coder
70
+ console.log('\n>>> Invoking BATCH CODER...\n');
71
+ await invokeCoderBatch(batch.tasks, batch.sectionName, projectPath);
72
+ // Check which tasks are now in review status
73
+ const tasksInReview = batch.tasks
74
+ .map(t => getTask(db, t.id))
75
+ .filter((t) => t !== null && t.status === 'review');
76
+ if (tasksInReview.length > 0) {
77
+ console.log(`\n[BATCH MODE] ${tasksInReview.length} tasks ready for batch review\n`);
78
+ // Invoke batch reviewer
79
+ console.log('\n>>> Invoking BATCH REVIEWER...\n');
80
+ await invokeReviewerBatch(tasksInReview, batch.sectionName, projectPath);
81
+ // Handle results for each reviewed task
82
+ for (const task of tasksInReview) {
83
+ const updatedTask = getTask(db, task.id);
84
+ if (!updatedTask)
85
+ continue;
86
+ const section = task.section_id ? getSection(db, task.section_id) : null;
87
+ const sectionName = section?.name ?? null;
88
+ if (updatedTask.status === 'completed' && options.runnerId) {
89
+ // Get commit message for activity log
90
+ let commitMessage = null;
91
+ try {
92
+ commitMessage = execSync('git log -1 --format=%B', {
93
+ cwd: projectPath,
94
+ encoding: 'utf-8',
95
+ }).trim();
96
+ }
97
+ catch {
98
+ // Ignore error
99
+ }
100
+ logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'completed', commitMessage);
101
+ }
102
+ else if (updatedTask.status === 'failed' && options.runnerId) {
103
+ logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'failed');
104
+ }
105
+ else if (updatedTask.status === 'disputed' && options.runnerId) {
106
+ logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'disputed');
107
+ }
108
+ else if (updatedTask.status === 'skipped' && options.runnerId) {
109
+ logActivity(projectPath, options.runnerId, task.id, task.title, sectionName, 'skipped');
110
+ }
111
+ }
112
+ // Push changes after batch review if any tasks were approved
113
+ const approvedTasks = tasksInReview.filter(t => {
114
+ const updated = getTask(db, t.id);
115
+ return updated?.status === 'completed';
116
+ });
117
+ if (approvedTasks.length > 0) {
118
+ try {
119
+ console.log('Pushing batch changes to git...');
120
+ execSync('git push', { cwd: projectPath, stdio: 'inherit' });
121
+ console.log(`Pushed ${approvedTasks.length} approved task(s)`);
122
+ }
123
+ catch (error) {
124
+ console.warn('Failed to push:', error);
125
+ }
126
+ }
127
+ }
128
+ // Notify completion for each task
129
+ for (const task of batch.tasks) {
130
+ options.onTaskComplete?.(task.id);
131
+ }
132
+ if (once) {
133
+ console.log('\n[--once] Stopping after one batch');
134
+ break;
135
+ }
136
+ await sleep(1000);
137
+ continue;
138
+ }
139
+ }
140
+ // Select next task
141
+ const selected = selectNextTask(db, sectionId);
142
+ if (!selected) {
143
+ console.log('');
144
+ console.log('╔════════════════════════════════════════════════════════════╗');
145
+ console.log('║ ALL TASKS COMPLETE ║');
146
+ console.log('╚════════════════════════════════════════════════════════════╝');
147
+ console.log('');
148
+ break;
149
+ }
150
+ const { task, action } = selected;
151
+ console.log(`Task: ${task.title}`);
152
+ console.log(`Action: ${action}`);
153
+ console.log(`Status: ${task.status}`);
154
+ options.onTaskStart?.(task.id, action);
155
+ if (action === 'start') {
156
+ markTaskInProgress(db, task.id);
157
+ await runCoderPhase(db, task, projectPath, 'start', false);
158
+ }
159
+ else if (action === 'resume') {
160
+ await runCoderPhase(db, task, projectPath, 'resume', false);
161
+ }
162
+ else if (action === 'review') {
163
+ await runReviewerPhase(db, task, projectPath, false);
164
+ }
165
+ // Log activity if task reached terminal status
166
+ if (options.runnerId) {
167
+ const updatedTask = getTask(db, task.id);
168
+ if (updatedTask && ['completed', 'failed', 'disputed', 'skipped'].includes(updatedTask.status)) {
169
+ const section = updatedTask.section_id ? getSection(db, updatedTask.section_id) : null;
170
+ const sectionName = section?.name ?? null;
171
+ // Get commit message for completed tasks
172
+ let commitMessage = null;
173
+ if (updatedTask.status === 'completed') {
174
+ try {
175
+ commitMessage = execSync('git log -1 --format=%B', {
176
+ cwd: projectPath,
177
+ encoding: 'utf-8',
178
+ }).trim();
179
+ }
180
+ catch {
181
+ // Ignore error
182
+ }
183
+ }
184
+ logActivity(projectPath, options.runnerId, updatedTask.id, updatedTask.title, sectionName, updatedTask.status, commitMessage);
185
+ }
186
+ }
187
+ options.onTaskComplete?.(task.id);
188
+ if (once) {
189
+ console.log('\n[--once] Stopping after one iteration');
190
+ break;
191
+ }
192
+ // Brief pause between iterations
193
+ await sleep(1000);
194
+ }
195
+ // Final status
196
+ const finalCounts = getTaskCounts(db, sectionId);
197
+ console.log('\nFinal Status:');
198
+ console.log(` Completed: ${finalCounts.completed}`);
199
+ console.log(` Failed: ${finalCounts.failed}`);
200
+ console.log(` Disputed: ${finalCounts.disputed}`);
201
+ }
202
+ finally {
203
+ close();
204
+ }
205
+ }
206
+ // Note: runCoderPhase and runReviewerPhase are now imported from ../commands/loop-phases.js
207
+ // They implement the orchestrator-driven architecture where the orchestrator makes all status decisions
208
+ //# sourceMappingURL=orchestrator-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-loop.js","sourceRoot":"","sources":["../../../../src/runners/orchestrator-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Global project registry management
3
+ * Tracks all registered steroids projects across the system
4
+ */
5
+ export interface RegisteredProject {
6
+ path: string;
7
+ name: string | null;
8
+ registered_at: string;
9
+ last_seen_at: string;
10
+ enabled: boolean;
11
+ pending_count?: number;
12
+ in_progress_count?: number;
13
+ review_count?: number;
14
+ completed_count?: number;
15
+ stats_updated_at?: string | null;
16
+ }
17
+ /**
18
+ * Register a project in the global registry
19
+ * Idempotent - updates last_seen_at if project already exists
20
+ *
21
+ * @param path - Absolute path to project directory
22
+ * @param name - Optional project name
23
+ */
24
+ export declare function registerProject(path: string, name?: string): void;
25
+ /**
26
+ * Get all registered projects (enabled only by default)
27
+ *
28
+ * @param includeDisabled - If true, includes disabled projects
29
+ * @returns Array of registered projects
30
+ */
31
+ export declare function getRegisteredProjects(includeDisabled?: boolean): RegisteredProject[];
32
+ /**
33
+ * Get a single registered project by path
34
+ *
35
+ * @param path - Project path to look up
36
+ * @returns Project if found, null otherwise
37
+ */
38
+ export declare function getRegisteredProject(path: string): RegisteredProject | null;
39
+ /**
40
+ * Unregister a project from the global registry
41
+ * Removes it completely from the database
42
+ *
43
+ * @param path - Project path to unregister
44
+ */
45
+ export declare function unregisterProject(path: string): void;
46
+ /**
47
+ * Disable a project (skip in wakeup, but keep in registry)
48
+ *
49
+ * @param path - Project path to disable
50
+ */
51
+ export declare function disableProject(path: string): void;
52
+ /**
53
+ * Enable a project (include in wakeup)
54
+ *
55
+ * @param path - Project path to enable
56
+ */
57
+ export declare function enableProject(path: string): void;
58
+ /**
59
+ * Remove projects that no longer exist on disk
60
+ * Returns the number of projects removed
61
+ *
62
+ * @returns Number of projects pruned
63
+ */
64
+ export declare function pruneProjects(): number;
65
+ /**
66
+ * Update last_seen_at timestamp for a project
67
+ * Used by runners to track when project was last active
68
+ *
69
+ * @param path - Project path to update
70
+ */
71
+ export declare function updateProjectLastSeen(path: string): void;
72
+ /**
73
+ * Check if a project is registered
74
+ *
75
+ * @param path - Project path to check
76
+ * @returns True if project is registered
77
+ */
78
+ export declare function isProjectRegistered(path: string): boolean;
79
+ /**
80
+ * Task count statistics for a project
81
+ */
82
+ export interface ProjectStats {
83
+ pending: number;
84
+ in_progress: number;
85
+ review: number;
86
+ completed: number;
87
+ }
88
+ /**
89
+ * Update project stats in global database
90
+ * Called by runner heartbeat to cache stats for API/WebUI access
91
+ *
92
+ * @param path - Project path
93
+ * @param stats - Task counts by status
94
+ */
95
+ export declare function updateProjectStats(path: string, stats: ProjectStats): void;
96
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../../src/runners/projects.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAmBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAejE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,UAAQ,GAAG,iBAAiB,EAAE,CAoClF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAuC3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAShD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAsBtC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAazD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuB1E"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Global project registry management
3
+ * Tracks all registered steroids projects across the system
4
+ */
5
+ import { existsSync, realpathSync } from 'node:fs';
6
+ import { join, resolve } from 'node:path';
7
+ import { openGlobalDatabase } from './global-db.js';
8
+ /**
9
+ * Normalize a project path to its canonical form
10
+ * - Resolves symlinks
11
+ * - Removes trailing slashes
12
+ * - Returns absolute path
13
+ */
14
+ function normalizePath(p) {
15
+ try {
16
+ const resolved = resolve(p);
17
+ const realPath = realpathSync(resolved);
18
+ return realPath.replace(/\/+$/, '');
19
+ }
20
+ catch (error) {
21
+ // If path doesn't exist or can't be resolved, just clean up the input
22
+ return resolve(p).replace(/\/+$/, '');
23
+ }
24
+ }
25
+ /**
26
+ * Register a project in the global registry
27
+ * Idempotent - updates last_seen_at if project already exists
28
+ *
29
+ * @param path - Absolute path to project directory
30
+ * @param name - Optional project name
31
+ */
32
+ export function registerProject(path, name) {
33
+ const normalizedPath = normalizePath(path);
34
+ const { db, close } = openGlobalDatabase();
35
+ try {
36
+ db.prepare(`
37
+ INSERT INTO projects (path, name, registered_at, last_seen_at, enabled)
38
+ VALUES (?, ?, datetime('now'), datetime('now'), 1)
39
+ ON CONFLICT(path) DO UPDATE SET
40
+ name = COALESCE(excluded.name, name),
41
+ last_seen_at = datetime('now')
42
+ `).run(normalizedPath, name ?? null);
43
+ }
44
+ finally {
45
+ close();
46
+ }
47
+ }
48
+ /**
49
+ * Get all registered projects (enabled only by default)
50
+ *
51
+ * @param includeDisabled - If true, includes disabled projects
52
+ * @returns Array of registered projects
53
+ */
54
+ export function getRegisteredProjects(includeDisabled = false) {
55
+ const { db, close } = openGlobalDatabase();
56
+ try {
57
+ const query = includeDisabled
58
+ ? 'SELECT * FROM projects'
59
+ : 'SELECT * FROM projects WHERE enabled = 1';
60
+ const rows = db.prepare(query).all();
61
+ return rows.map((row) => ({
62
+ path: row.path,
63
+ name: row.name,
64
+ registered_at: row.registered_at,
65
+ last_seen_at: row.last_seen_at,
66
+ enabled: row.enabled === 1,
67
+ pending_count: row.pending_count,
68
+ in_progress_count: row.in_progress_count,
69
+ review_count: row.review_count,
70
+ completed_count: row.completed_count,
71
+ stats_updated_at: row.stats_updated_at,
72
+ }));
73
+ }
74
+ finally {
75
+ close();
76
+ }
77
+ }
78
+ /**
79
+ * Get a single registered project by path
80
+ *
81
+ * @param path - Project path to look up
82
+ * @returns Project if found, null otherwise
83
+ */
84
+ export function getRegisteredProject(path) {
85
+ const normalizedPath = normalizePath(path);
86
+ const { db, close } = openGlobalDatabase();
87
+ try {
88
+ const row = db
89
+ .prepare('SELECT * FROM projects WHERE path = ?')
90
+ .get(normalizedPath);
91
+ if (!row) {
92
+ return null;
93
+ }
94
+ return {
95
+ path: row.path,
96
+ name: row.name,
97
+ registered_at: row.registered_at,
98
+ last_seen_at: row.last_seen_at,
99
+ enabled: row.enabled === 1,
100
+ pending_count: row.pending_count,
101
+ in_progress_count: row.in_progress_count,
102
+ review_count: row.review_count,
103
+ completed_count: row.completed_count,
104
+ stats_updated_at: row.stats_updated_at,
105
+ };
106
+ }
107
+ finally {
108
+ close();
109
+ }
110
+ }
111
+ /**
112
+ * Unregister a project from the global registry
113
+ * Removes it completely from the database
114
+ *
115
+ * @param path - Project path to unregister
116
+ */
117
+ export function unregisterProject(path) {
118
+ const normalizedPath = normalizePath(path);
119
+ const { db, close } = openGlobalDatabase();
120
+ try {
121
+ db.prepare('DELETE FROM projects WHERE path = ?').run(normalizedPath);
122
+ }
123
+ finally {
124
+ close();
125
+ }
126
+ }
127
+ /**
128
+ * Disable a project (skip in wakeup, but keep in registry)
129
+ *
130
+ * @param path - Project path to disable
131
+ */
132
+ export function disableProject(path) {
133
+ const normalizedPath = normalizePath(path);
134
+ const { db, close } = openGlobalDatabase();
135
+ try {
136
+ db.prepare('UPDATE projects SET enabled = 0 WHERE path = ?').run(normalizedPath);
137
+ }
138
+ finally {
139
+ close();
140
+ }
141
+ }
142
+ /**
143
+ * Enable a project (include in wakeup)
144
+ *
145
+ * @param path - Project path to enable
146
+ */
147
+ export function enableProject(path) {
148
+ const normalizedPath = normalizePath(path);
149
+ const { db, close } = openGlobalDatabase();
150
+ try {
151
+ db.prepare('UPDATE projects SET enabled = 1 WHERE path = ?').run(normalizedPath);
152
+ }
153
+ finally {
154
+ close();
155
+ }
156
+ }
157
+ /**
158
+ * Remove projects that no longer exist on disk
159
+ * Returns the number of projects removed
160
+ *
161
+ * @returns Number of projects pruned
162
+ */
163
+ export function pruneProjects() {
164
+ const { db, close } = openGlobalDatabase();
165
+ try {
166
+ const projects = db.prepare('SELECT path FROM projects').all();
167
+ let removed = 0;
168
+ for (const project of projects) {
169
+ const steroidsDir = join(project.path, '.steroids');
170
+ const steroidsDb = join(steroidsDir, 'steroids.db');
171
+ // Remove if project directory or .steroids directory doesn't exist
172
+ if (!existsSync(project.path) || !existsSync(steroidsDir) || !existsSync(steroidsDb)) {
173
+ db.prepare('DELETE FROM projects WHERE path = ?').run(project.path);
174
+ removed++;
175
+ }
176
+ }
177
+ return removed;
178
+ }
179
+ finally {
180
+ close();
181
+ }
182
+ }
183
+ /**
184
+ * Update last_seen_at timestamp for a project
185
+ * Used by runners to track when project was last active
186
+ *
187
+ * @param path - Project path to update
188
+ */
189
+ export function updateProjectLastSeen(path) {
190
+ const normalizedPath = normalizePath(path);
191
+ const { db, close } = openGlobalDatabase();
192
+ try {
193
+ db.prepare("UPDATE projects SET last_seen_at = datetime('now') WHERE path = ?").run(normalizedPath);
194
+ }
195
+ finally {
196
+ close();
197
+ }
198
+ }
199
+ /**
200
+ * Check if a project is registered
201
+ *
202
+ * @param path - Project path to check
203
+ * @returns True if project is registered
204
+ */
205
+ export function isProjectRegistered(path) {
206
+ const normalizedPath = normalizePath(path);
207
+ const { db, close } = openGlobalDatabase();
208
+ try {
209
+ const row = db
210
+ .prepare('SELECT 1 FROM projects WHERE path = ?')
211
+ .get(normalizedPath);
212
+ return row !== undefined;
213
+ }
214
+ finally {
215
+ close();
216
+ }
217
+ }
218
+ /**
219
+ * Update project stats in global database
220
+ * Called by runner heartbeat to cache stats for API/WebUI access
221
+ *
222
+ * @param path - Project path
223
+ * @param stats - Task counts by status
224
+ */
225
+ export function updateProjectStats(path, stats) {
226
+ const normalizedPath = normalizePath(path);
227
+ const { db, close } = openGlobalDatabase();
228
+ try {
229
+ db.prepare(`
230
+ UPDATE projects SET
231
+ pending_count = ?,
232
+ in_progress_count = ?,
233
+ review_count = ?,
234
+ completed_count = ?,
235
+ stats_updated_at = datetime('now')
236
+ WHERE path = ?
237
+ `).run(stats.pending, stats.in_progress, stats.review, stats.completed, normalizedPath);
238
+ }
239
+ finally {
240
+ close();
241
+ }
242
+ }
243
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../../src/runners/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Cron wake-up command for restarting stale/dead runners
3
+ */
4
+ export interface WakeupOptions {
5
+ quiet?: boolean;
6
+ dryRun?: boolean;
7
+ }
8
+ export interface WakeupResult {
9
+ action: 'none' | 'started' | 'restarted' | 'cleaned' | 'would_start';
10
+ reason: string;
11
+ runnerId?: string;
12
+ pid?: number;
13
+ staleRunners?: number;
14
+ pendingTasks?: number;
15
+ projectPath?: string;
16
+ recoveredActions?: number;
17
+ skippedRecoveryDueToSafetyLimit?: boolean;
18
+ deletedInvocationLogs?: number;
19
+ }
20
+ /**
21
+ * Check if there's an active runner for a specific project
22
+ * Exported for use in daemon startup checks
23
+ */
24
+ export declare function hasActiveRunnerForProject(projectPath: string): boolean;
25
+ /**
26
+ * Get the last wakeup invocation time
27
+ */
28
+ export declare function getLastWakeupTime(): string | null;
29
+ export declare function wakeup(options?: WakeupOptions): Promise<WakeupResult[]>;
30
+ /**
31
+ * Check if wake-up is needed without taking action
32
+ */
33
+ export declare function checkWakeupNeeded(): Promise<{
34
+ needed: boolean;
35
+ reason: string;
36
+ }>;
37
+ //# sourceMappingURL=wakeup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wakeup.d.ts","sourceRoot":"","sources":["../../../../src/runners/wakeup.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AA8BD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBtE;AA2DD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAUjD;AAED,wBAAsB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwMjF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAyCD"}