steroids-cli 0.4.47

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 (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +640 -0
  3. package/dist/cli/colors.d.ts +110 -0
  4. package/dist/cli/colors.d.ts.map +1 -0
  5. package/dist/cli/colors.js +228 -0
  6. package/dist/cli/colors.js.map +1 -0
  7. package/dist/cli/env.d.ts +159 -0
  8. package/dist/cli/env.d.ts.map +1 -0
  9. package/dist/cli/env.js +227 -0
  10. package/dist/cli/env.js.map +1 -0
  11. package/dist/cli/errors.d.ts +166 -0
  12. package/dist/cli/errors.d.ts.map +1 -0
  13. package/dist/cli/errors.js +244 -0
  14. package/dist/cli/errors.js.map +1 -0
  15. package/dist/cli/flags.d.ts +75 -0
  16. package/dist/cli/flags.d.ts.map +1 -0
  17. package/dist/cli/flags.js +232 -0
  18. package/dist/cli/flags.js.map +1 -0
  19. package/dist/cli/help.d.ts +97 -0
  20. package/dist/cli/help.d.ts.map +1 -0
  21. package/dist/cli/help.js +275 -0
  22. package/dist/cli/help.js.map +1 -0
  23. package/dist/cli/index.d.ts +13 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +29 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/interactive.d.ts +58 -0
  28. package/dist/cli/interactive.d.ts.map +1 -0
  29. package/dist/cli/interactive.js +127 -0
  30. package/dist/cli/interactive.js.map +1 -0
  31. package/dist/cli/output.d.ts +116 -0
  32. package/dist/cli/output.d.ts.map +1 -0
  33. package/dist/cli/output.js +178 -0
  34. package/dist/cli/output.js.map +1 -0
  35. package/dist/commands/about.d.ts +7 -0
  36. package/dist/commands/about.d.ts.map +1 -0
  37. package/dist/commands/about.js +259 -0
  38. package/dist/commands/about.js.map +1 -0
  39. package/dist/commands/ai.d.ts +6 -0
  40. package/dist/commands/ai.d.ts.map +1 -0
  41. package/dist/commands/ai.js +382 -0
  42. package/dist/commands/ai.js.map +1 -0
  43. package/dist/commands/backup.d.ts +3 -0
  44. package/dist/commands/backup.d.ts.map +1 -0
  45. package/dist/commands/backup.js +528 -0
  46. package/dist/commands/backup.js.map +1 -0
  47. package/dist/commands/completion.d.ts +3 -0
  48. package/dist/commands/completion.d.ts.map +1 -0
  49. package/dist/commands/completion.js +405 -0
  50. package/dist/commands/completion.js.map +1 -0
  51. package/dist/commands/config.d.ts +3 -0
  52. package/dist/commands/config.d.ts.map +1 -0
  53. package/dist/commands/config.js +665 -0
  54. package/dist/commands/config.js.map +1 -0
  55. package/dist/commands/disputes.d.ts +3 -0
  56. package/dist/commands/disputes.d.ts.map +1 -0
  57. package/dist/commands/disputes.js +499 -0
  58. package/dist/commands/disputes.js.map +1 -0
  59. package/dist/commands/gc.d.ts +3 -0
  60. package/dist/commands/gc.d.ts.map +1 -0
  61. package/dist/commands/gc.js +300 -0
  62. package/dist/commands/gc.js.map +1 -0
  63. package/dist/commands/git.d.ts +3 -0
  64. package/dist/commands/git.d.ts.map +1 -0
  65. package/dist/commands/git.js +458 -0
  66. package/dist/commands/git.js.map +1 -0
  67. package/dist/commands/health.d.ts +3 -0
  68. package/dist/commands/health.d.ts.map +1 -0
  69. package/dist/commands/health.js +604 -0
  70. package/dist/commands/health.js.map +1 -0
  71. package/dist/commands/hooks.d.ts +6 -0
  72. package/dist/commands/hooks.d.ts.map +1 -0
  73. package/dist/commands/hooks.js +529 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/init.d.ts +6 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +200 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/llm.d.ts +7 -0
  80. package/dist/commands/llm.d.ts.map +1 -0
  81. package/dist/commands/llm.js +285 -0
  82. package/dist/commands/llm.js.map +1 -0
  83. package/dist/commands/locks.d.ts +3 -0
  84. package/dist/commands/locks.d.ts.map +1 -0
  85. package/dist/commands/locks.js +431 -0
  86. package/dist/commands/locks.js.map +1 -0
  87. package/dist/commands/logs.d.ts +3 -0
  88. package/dist/commands/logs.d.ts.map +1 -0
  89. package/dist/commands/logs.js +487 -0
  90. package/dist/commands/logs.js.map +1 -0
  91. package/dist/commands/loop-phases.d.ts +11 -0
  92. package/dist/commands/loop-phases.d.ts.map +1 -0
  93. package/dist/commands/loop-phases.js +204 -0
  94. package/dist/commands/loop-phases.js.map +1 -0
  95. package/dist/commands/loop.d.ts +3 -0
  96. package/dist/commands/loop.d.ts.map +1 -0
  97. package/dist/commands/loop.js +396 -0
  98. package/dist/commands/loop.js.map +1 -0
  99. package/dist/commands/projects.d.ts +6 -0
  100. package/dist/commands/projects.d.ts.map +1 -0
  101. package/dist/commands/projects.js +362 -0
  102. package/dist/commands/projects.js.map +1 -0
  103. package/dist/commands/purge.d.ts +3 -0
  104. package/dist/commands/purge.d.ts.map +1 -0
  105. package/dist/commands/purge.js +516 -0
  106. package/dist/commands/purge.js.map +1 -0
  107. package/dist/commands/runners.d.ts +3 -0
  108. package/dist/commands/runners.d.ts.map +1 -0
  109. package/dist/commands/runners.js +1076 -0
  110. package/dist/commands/runners.js.map +1 -0
  111. package/dist/commands/scan.d.ts +3 -0
  112. package/dist/commands/scan.d.ts.map +1 -0
  113. package/dist/commands/scan.js +291 -0
  114. package/dist/commands/scan.js.map +1 -0
  115. package/dist/commands/sections-commands.d.ts +9 -0
  116. package/dist/commands/sections-commands.d.ts.map +1 -0
  117. package/dist/commands/sections-commands.js +282 -0
  118. package/dist/commands/sections-commands.js.map +1 -0
  119. package/dist/commands/sections-graph.d.ts +25 -0
  120. package/dist/commands/sections-graph.d.ts.map +1 -0
  121. package/dist/commands/sections-graph.js +180 -0
  122. package/dist/commands/sections-graph.js.map +1 -0
  123. package/dist/commands/sections.d.ts +3 -0
  124. package/dist/commands/sections.d.ts.map +1 -0
  125. package/dist/commands/sections.js +376 -0
  126. package/dist/commands/sections.js.map +1 -0
  127. package/dist/commands/stats.d.ts +6 -0
  128. package/dist/commands/stats.d.ts.map +1 -0
  129. package/dist/commands/stats.js +324 -0
  130. package/dist/commands/stats.js.map +1 -0
  131. package/dist/commands/tasks.d.ts +3 -0
  132. package/dist/commands/tasks.d.ts.map +1 -0
  133. package/dist/commands/tasks.js +1115 -0
  134. package/dist/commands/tasks.js.map +1 -0
  135. package/dist/commands/web.d.ts +7 -0
  136. package/dist/commands/web.d.ts.map +1 -0
  137. package/dist/commands/web.js +204 -0
  138. package/dist/commands/web.js.map +1 -0
  139. package/dist/config/ai-setup.d.ts +27 -0
  140. package/dist/config/ai-setup.d.ts.map +1 -0
  141. package/dist/config/ai-setup.js +432 -0
  142. package/dist/config/ai-setup.js.map +1 -0
  143. package/dist/config/browser.d.ts +9 -0
  144. package/dist/config/browser.d.ts.map +1 -0
  145. package/dist/config/browser.js +200 -0
  146. package/dist/config/browser.js.map +1 -0
  147. package/dist/config/json-schema.d.ts +28 -0
  148. package/dist/config/json-schema.d.ts.map +1 -0
  149. package/dist/config/json-schema.js +84 -0
  150. package/dist/config/json-schema.js.map +1 -0
  151. package/dist/config/loader.d.ts +152 -0
  152. package/dist/config/loader.d.ts.map +1 -0
  153. package/dist/config/loader.js +270 -0
  154. package/dist/config/loader.js.map +1 -0
  155. package/dist/config/schema.d.ts +34 -0
  156. package/dist/config/schema.d.ts.map +1 -0
  157. package/dist/config/schema.js +437 -0
  158. package/dist/config/schema.js.map +1 -0
  159. package/dist/config/validator.d.ts +32 -0
  160. package/dist/config/validator.d.ts.map +1 -0
  161. package/dist/config/validator.js +187 -0
  162. package/dist/config/validator.js.map +1 -0
  163. package/dist/database/connection.d.ts +35 -0
  164. package/dist/database/connection.d.ts.map +1 -0
  165. package/dist/database/connection.js +208 -0
  166. package/dist/database/connection.js.map +1 -0
  167. package/dist/database/queries.d.ts +218 -0
  168. package/dist/database/queries.d.ts.map +1 -0
  169. package/dist/database/queries.js +613 -0
  170. package/dist/database/queries.js.map +1 -0
  171. package/dist/database/schema.d.ts +8 -0
  172. package/dist/database/schema.d.ts.map +1 -0
  173. package/dist/database/schema.js +160 -0
  174. package/dist/database/schema.js.map +1 -0
  175. package/dist/disputes/behavior.d.ts +106 -0
  176. package/dist/disputes/behavior.d.ts.map +1 -0
  177. package/dist/disputes/behavior.js +150 -0
  178. package/dist/disputes/behavior.js.map +1 -0
  179. package/dist/disputes/create.d.ts +59 -0
  180. package/dist/disputes/create.d.ts.map +1 -0
  181. package/dist/disputes/create.js +222 -0
  182. package/dist/disputes/create.js.map +1 -0
  183. package/dist/disputes/index.d.ts +21 -0
  184. package/dist/disputes/index.d.ts.map +1 -0
  185. package/dist/disputes/index.js +76 -0
  186. package/dist/disputes/index.js.map +1 -0
  187. package/dist/disputes/markdown.d.ts +41 -0
  188. package/dist/disputes/markdown.d.ts.map +1 -0
  189. package/dist/disputes/markdown.js +261 -0
  190. package/dist/disputes/markdown.js.map +1 -0
  191. package/dist/disputes/queries.d.ts +83 -0
  192. package/dist/disputes/queries.d.ts.map +1 -0
  193. package/dist/disputes/queries.js +180 -0
  194. package/dist/disputes/queries.js.map +1 -0
  195. package/dist/disputes/resolve.d.ts +57 -0
  196. package/dist/disputes/resolve.d.ts.map +1 -0
  197. package/dist/disputes/resolve.js +171 -0
  198. package/dist/disputes/resolve.js.map +1 -0
  199. package/dist/disputes/stale.d.ts +98 -0
  200. package/dist/disputes/stale.d.ts.map +1 -0
  201. package/dist/disputes/stale.js +205 -0
  202. package/dist/disputes/stale.js.map +1 -0
  203. package/dist/disputes/types.d.ts +92 -0
  204. package/dist/disputes/types.d.ts.map +1 -0
  205. package/dist/disputes/types.js +100 -0
  206. package/dist/disputes/types.js.map +1 -0
  207. package/dist/git/push.d.ts +26 -0
  208. package/dist/git/push.d.ts.map +1 -0
  209. package/dist/git/push.js +97 -0
  210. package/dist/git/push.js.map +1 -0
  211. package/dist/git/status.d.ts +61 -0
  212. package/dist/git/status.d.ts.map +1 -0
  213. package/dist/git/status.js +251 -0
  214. package/dist/git/status.js.map +1 -0
  215. package/dist/hooks/events.d.ts +72 -0
  216. package/dist/hooks/events.d.ts.map +1 -0
  217. package/dist/hooks/events.js +120 -0
  218. package/dist/hooks/events.js.map +1 -0
  219. package/dist/hooks/index.d.ts +19 -0
  220. package/dist/hooks/index.d.ts.map +1 -0
  221. package/dist/hooks/index.js +48 -0
  222. package/dist/hooks/index.js.map +1 -0
  223. package/dist/hooks/integration.d.ts +69 -0
  224. package/dist/hooks/integration.d.ts.map +1 -0
  225. package/dist/hooks/integration.js +179 -0
  226. package/dist/hooks/integration.js.map +1 -0
  227. package/dist/hooks/merge.d.ts +115 -0
  228. package/dist/hooks/merge.d.ts.map +1 -0
  229. package/dist/hooks/merge.js +161 -0
  230. package/dist/hooks/merge.js.map +1 -0
  231. package/dist/hooks/orchestrator.d.ts +115 -0
  232. package/dist/hooks/orchestrator.d.ts.map +1 -0
  233. package/dist/hooks/orchestrator.js +226 -0
  234. package/dist/hooks/orchestrator.js.map +1 -0
  235. package/dist/hooks/payload.d.ts +294 -0
  236. package/dist/hooks/payload.d.ts.map +1 -0
  237. package/dist/hooks/payload.js +267 -0
  238. package/dist/hooks/payload.js.map +1 -0
  239. package/dist/hooks/script-runner.d.ts +63 -0
  240. package/dist/hooks/script-runner.d.ts.map +1 -0
  241. package/dist/hooks/script-runner.js +221 -0
  242. package/dist/hooks/script-runner.js.map +1 -0
  243. package/dist/hooks/templates.d.ts +104 -0
  244. package/dist/hooks/templates.d.ts.map +1 -0
  245. package/dist/hooks/templates.js +327 -0
  246. package/dist/hooks/templates.js.map +1 -0
  247. package/dist/hooks/webhook-runner.d.ts +69 -0
  248. package/dist/hooks/webhook-runner.d.ts.map +1 -0
  249. package/dist/hooks/webhook-runner.js +208 -0
  250. package/dist/hooks/webhook-runner.js.map +1 -0
  251. package/dist/index.d.ts +7 -0
  252. package/dist/index.d.ts.map +1 -0
  253. package/dist/index.js +281 -0
  254. package/dist/index.js.map +1 -0
  255. package/dist/locking/cleanup.d.ts +70 -0
  256. package/dist/locking/cleanup.d.ts.map +1 -0
  257. package/dist/locking/cleanup.js +157 -0
  258. package/dist/locking/cleanup.js.map +1 -0
  259. package/dist/locking/queries.d.ts +116 -0
  260. package/dist/locking/queries.d.ts.map +1 -0
  261. package/dist/locking/queries.js +255 -0
  262. package/dist/locking/queries.js.map +1 -0
  263. package/dist/locking/section-lock.d.ts +74 -0
  264. package/dist/locking/section-lock.d.ts.map +1 -0
  265. package/dist/locking/section-lock.js +207 -0
  266. package/dist/locking/section-lock.js.map +1 -0
  267. package/dist/locking/task-lock.d.ts +92 -0
  268. package/dist/locking/task-lock.d.ts.map +1 -0
  269. package/dist/locking/task-lock.js +246 -0
  270. package/dist/locking/task-lock.js.map +1 -0
  271. package/dist/migrations/index.d.ts +7 -0
  272. package/dist/migrations/index.d.ts.map +1 -0
  273. package/dist/migrations/index.js +37 -0
  274. package/dist/migrations/index.js.map +1 -0
  275. package/dist/migrations/manifest.d.ts +92 -0
  276. package/dist/migrations/manifest.d.ts.map +1 -0
  277. package/dist/migrations/manifest.js +270 -0
  278. package/dist/migrations/manifest.js.map +1 -0
  279. package/dist/migrations/runner.d.ts +84 -0
  280. package/dist/migrations/runner.d.ts.map +1 -0
  281. package/dist/migrations/runner.js +351 -0
  282. package/dist/migrations/runner.js.map +1 -0
  283. package/dist/orchestrator/coder.d.ts +32 -0
  284. package/dist/orchestrator/coder.d.ts.map +1 -0
  285. package/dist/orchestrator/coder.js +174 -0
  286. package/dist/orchestrator/coder.js.map +1 -0
  287. package/dist/orchestrator/coordinator.d.ts +28 -0
  288. package/dist/orchestrator/coordinator.d.ts.map +1 -0
  289. package/dist/orchestrator/coordinator.js +256 -0
  290. package/dist/orchestrator/coordinator.js.map +1 -0
  291. package/dist/orchestrator/reviewer.d.ts +35 -0
  292. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  293. package/dist/orchestrator/reviewer.js +241 -0
  294. package/dist/orchestrator/reviewer.js.map +1 -0
  295. package/dist/orchestrator/task-selector.d.ts +102 -0
  296. package/dist/orchestrator/task-selector.d.ts.map +1 -0
  297. package/dist/orchestrator/task-selector.js +341 -0
  298. package/dist/orchestrator/task-selector.js.map +1 -0
  299. package/dist/prompts/coder.d.ts +36 -0
  300. package/dist/prompts/coder.d.ts.map +1 -0
  301. package/dist/prompts/coder.js +315 -0
  302. package/dist/prompts/coder.js.map +1 -0
  303. package/dist/prompts/prompt-helpers.d.ts +51 -0
  304. package/dist/prompts/prompt-helpers.d.ts.map +1 -0
  305. package/dist/prompts/prompt-helpers.js +312 -0
  306. package/dist/prompts/prompt-helpers.js.map +1 -0
  307. package/dist/prompts/reviewer.d.ts +40 -0
  308. package/dist/prompts/reviewer.d.ts.map +1 -0
  309. package/dist/prompts/reviewer.js +438 -0
  310. package/dist/prompts/reviewer.js.map +1 -0
  311. package/dist/providers/api-models.d.ts +65 -0
  312. package/dist/providers/api-models.d.ts.map +1 -0
  313. package/dist/providers/api-models.js +323 -0
  314. package/dist/providers/api-models.js.map +1 -0
  315. package/dist/providers/claude.d.ts +53 -0
  316. package/dist/providers/claude.d.ts.map +1 -0
  317. package/dist/providers/claude.js +229 -0
  318. package/dist/providers/claude.js.map +1 -0
  319. package/dist/providers/codex.d.ts +53 -0
  320. package/dist/providers/codex.d.ts.map +1 -0
  321. package/dist/providers/codex.js +214 -0
  322. package/dist/providers/codex.js.map +1 -0
  323. package/dist/providers/gemini.d.ts +58 -0
  324. package/dist/providers/gemini.d.ts.map +1 -0
  325. package/dist/providers/gemini.js +242 -0
  326. package/dist/providers/gemini.js.map +1 -0
  327. package/dist/providers/index.d.ts +13 -0
  328. package/dist/providers/index.d.ts.map +1 -0
  329. package/dist/providers/index.js +49 -0
  330. package/dist/providers/index.js.map +1 -0
  331. package/dist/providers/interface.d.ts +173 -0
  332. package/dist/providers/interface.d.ts.map +1 -0
  333. package/dist/providers/interface.js +96 -0
  334. package/dist/providers/interface.js.map +1 -0
  335. package/dist/providers/invocation-logger.d.ts +114 -0
  336. package/dist/providers/invocation-logger.d.ts.map +1 -0
  337. package/dist/providers/invocation-logger.js +298 -0
  338. package/dist/providers/invocation-logger.js.map +1 -0
  339. package/dist/providers/openai.d.ts +53 -0
  340. package/dist/providers/openai.d.ts.map +1 -0
  341. package/dist/providers/openai.js +232 -0
  342. package/dist/providers/openai.js.map +1 -0
  343. package/dist/providers/registry.d.ts +100 -0
  344. package/dist/providers/registry.d.ts.map +1 -0
  345. package/dist/providers/registry.js +178 -0
  346. package/dist/providers/registry.js.map +1 -0
  347. package/dist/runners/activity-log.d.ts +65 -0
  348. package/dist/runners/activity-log.d.ts.map +1 -0
  349. package/dist/runners/activity-log.js +148 -0
  350. package/dist/runners/activity-log.js.map +1 -0
  351. package/dist/runners/cron.d.ts +26 -0
  352. package/dist/runners/cron.d.ts.map +1 -0
  353. package/dist/runners/cron.js +176 -0
  354. package/dist/runners/cron.js.map +1 -0
  355. package/dist/runners/daemon.d.ts +71 -0
  356. package/dist/runners/daemon.d.ts.map +1 -0
  357. package/dist/runners/daemon.js +245 -0
  358. package/dist/runners/daemon.js.map +1 -0
  359. package/dist/runners/global-db.d.ts +31 -0
  360. package/dist/runners/global-db.d.ts.map +1 -0
  361. package/dist/runners/global-db.js +230 -0
  362. package/dist/runners/global-db.js.map +1 -0
  363. package/dist/runners/hang-detector.d.ts +38 -0
  364. package/dist/runners/hang-detector.d.ts.map +1 -0
  365. package/dist/runners/hang-detector.js +136 -0
  366. package/dist/runners/hang-detector.js.map +1 -0
  367. package/dist/runners/heartbeat.d.ts +39 -0
  368. package/dist/runners/heartbeat.d.ts.map +1 -0
  369. package/dist/runners/heartbeat.js +79 -0
  370. package/dist/runners/heartbeat.js.map +1 -0
  371. package/dist/runners/lock.d.ts +47 -0
  372. package/dist/runners/lock.d.ts.map +1 -0
  373. package/dist/runners/lock.js +150 -0
  374. package/dist/runners/lock.js.map +1 -0
  375. package/dist/runners/orchestrator-loop.d.ts +20 -0
  376. package/dist/runners/orchestrator-loop.d.ts.map +1 -0
  377. package/dist/runners/orchestrator-loop.js +285 -0
  378. package/dist/runners/orchestrator-loop.js.map +1 -0
  379. package/dist/runners/projects.d.ts +96 -0
  380. package/dist/runners/projects.d.ts.map +1 -0
  381. package/dist/runners/projects.js +255 -0
  382. package/dist/runners/projects.js.map +1 -0
  383. package/dist/runners/wakeup.d.ts +34 -0
  384. package/dist/runners/wakeup.d.ts.map +1 -0
  385. package/dist/runners/wakeup.js +291 -0
  386. package/dist/runners/wakeup.js.map +1 -0
  387. package/migrations/001_initial_schema.sql +106 -0
  388. package/migrations/002_add_commit_sha.sql +12 -0
  389. package/migrations/003_add_section_priority.sql +13 -0
  390. package/migrations/004_add_section_dependencies.sql +18 -0
  391. package/migrations/005_add_audit_actor_model.sql +10 -0
  392. package/migrations/006_add_task_invocations.sql +33 -0
  393. package/migrations/007_add_file_anchor.sql +14 -0
  394. package/migrations/manifest.json +62 -0
  395. package/package.json +49 -0
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ /**
3
+ * Reviewer invocation
4
+ * Uses AI provider system for flexible LLM support
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.invokeReviewer = invokeReviewer;
8
+ exports.invokeReviewerBatch = invokeReviewerBatch;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_os_1 = require("node:os");
11
+ const node_path_1 = require("node:path");
12
+ const queries_js_1 = require("../database/queries.js");
13
+ const connection_js_1 = require("../database/connection.js");
14
+ const reviewer_js_1 = require("../prompts/reviewer.js");
15
+ const status_js_1 = require("../git/status.js");
16
+ const loader_js_1 = require("../config/loader.js");
17
+ const registry_js_1 = require("../providers/registry.js");
18
+ const invocation_logger_js_1 = require("../providers/invocation-logger.js");
19
+ /**
20
+ * Write prompt to temp file
21
+ */
22
+ function writePromptToTempFile(prompt) {
23
+ const tempPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-reviewer-${Date.now()}.txt`);
24
+ (0, node_fs_1.writeFileSync)(tempPath, prompt, 'utf-8');
25
+ return tempPath;
26
+ }
27
+ /**
28
+ * Parse reviewer output for decision
29
+ */
30
+ function parseReviewerDecision(output) {
31
+ const upperOutput = output.toUpperCase();
32
+ // Look for explicit decision markers
33
+ if (upperOutput.includes('DECISION: APPROVE') || upperOutput.includes('**APPROVE**') || /\bAPPROVE\b/.test(upperOutput)) {
34
+ // Extract notes if present
35
+ const notesMatch = output.match(/(?:notes?|feedback|comments?):\s*["']?([^"'\n]+)/i);
36
+ return { decision: 'approve', notes: notesMatch?.[1]?.trim() };
37
+ }
38
+ if (upperOutput.includes('DECISION: REJECT') || upperOutput.includes('**REJECT**') || /\bREJECT\b/.test(upperOutput)) {
39
+ // Extract rejection notes
40
+ const notesMatch = output.match(/(?:notes?|reason|feedback|issues?):\s*["']?([^"'\n]+)/i);
41
+ return { decision: 'reject', notes: notesMatch?.[1]?.trim() || 'See reviewer output for details' };
42
+ }
43
+ if (upperOutput.includes('DECISION: DISPUTE') || upperOutput.includes('**DISPUTE**') || /\bDISPUTE\b/.test(upperOutput)) {
44
+ const notesMatch = output.match(/(?:reason|notes?):\s*["']?([^"'\n]+)/i);
45
+ return { decision: 'dispute', notes: notesMatch?.[1]?.trim() };
46
+ }
47
+ return {};
48
+ }
49
+ /**
50
+ * Invoke AI provider with prompt
51
+ * Uses configuration to determine which provider to use
52
+ */
53
+ async function invokeProvider(promptFile, timeoutMs = 600_000, // 10 minutes default for reviewer
54
+ taskId, projectPath) {
55
+ // Load configuration to get reviewer provider settings
56
+ // Project config overrides global config
57
+ const config = (0, loader_js_1.loadConfig)(projectPath);
58
+ const reviewerConfig = config.ai?.reviewer;
59
+ if (!reviewerConfig?.provider || !reviewerConfig?.model) {
60
+ throw new Error('Reviewer AI provider not configured. Run "steroids config ai reviewer" to configure.');
61
+ }
62
+ // Get the provider from registry
63
+ const registry = (0, registry_js_1.getProviderRegistry)();
64
+ const provider = registry.get(reviewerConfig.provider);
65
+ // Check if provider is available
66
+ if (!(await provider.isAvailable())) {
67
+ throw new Error(`Provider '${reviewerConfig.provider}' is not available. ` +
68
+ `Ensure the CLI is installed and in PATH.`);
69
+ }
70
+ // Read prompt content
71
+ const promptContent = (0, node_fs_1.readFileSync)(promptFile, 'utf-8');
72
+ // Invoke the provider
73
+ const result = await provider.invoke(promptContent, {
74
+ model: reviewerConfig.model,
75
+ timeout: timeoutMs,
76
+ cwd: process.cwd(),
77
+ promptFile,
78
+ role: 'reviewer',
79
+ streamOutput: true,
80
+ });
81
+ // Log the invocation (to both file and database)
82
+ (0, invocation_logger_js_1.logInvocation)(promptContent, result, {
83
+ role: 'reviewer',
84
+ provider: reviewerConfig.provider,
85
+ model: reviewerConfig.model,
86
+ taskId,
87
+ projectPath,
88
+ });
89
+ // Parse the decision from output
90
+ const { decision, notes } = parseReviewerDecision(result.stdout);
91
+ return {
92
+ success: result.success,
93
+ exitCode: result.exitCode,
94
+ stdout: result.stdout,
95
+ stderr: result.stderr,
96
+ duration: result.duration,
97
+ timedOut: result.timedOut,
98
+ decision,
99
+ notes,
100
+ };
101
+ }
102
+ /**
103
+ * Invoke reviewer for a task
104
+ * @param coordinatorGuidance Optional guidance from coordinator after repeated rejections
105
+ * @param coordinatorDecision Optional decision type from coordinator
106
+ */
107
+ async function invokeReviewer(task, projectPath, coordinatorGuidance, coordinatorDecision) {
108
+ // Load config to show provider/model being used
109
+ const config = (0, loader_js_1.loadConfig)(projectPath);
110
+ const reviewerConfig = config.ai?.reviewer;
111
+ console.log(`\n${'='.repeat(60)}`);
112
+ console.log(`REVIEWER: ${task.title}`);
113
+ console.log(`Task ID: ${task.id}`);
114
+ console.log(`Rejection count: ${task.rejection_count}/15`);
115
+ console.log(`Provider: ${reviewerConfig?.provider ?? 'not configured'}`);
116
+ console.log(`Model: ${reviewerConfig?.model ?? 'not configured'}`);
117
+ console.log(`${'='.repeat(60)}\n`);
118
+ // Try to find the specific commit for this task
119
+ let gitDiff;
120
+ let modifiedFiles;
121
+ const commitHash = (0, status_js_1.findTaskCommit)(projectPath, task.title);
122
+ if (commitHash) {
123
+ console.log(`Found task commit: ${commitHash}`);
124
+ gitDiff = (0, status_js_1.getCommitDiff)(projectPath, commitHash);
125
+ modifiedFiles = (0, status_js_1.getCommitFiles)(projectPath, commitHash);
126
+ }
127
+ else {
128
+ // Fallback to HEAD~1 if no matching commit found
129
+ console.log('No matching commit found, using HEAD~1 diff');
130
+ gitDiff = (0, status_js_1.getGitDiff)(projectPath, 'HEAD~1');
131
+ modifiedFiles = (0, status_js_1.getModifiedFiles)(projectPath);
132
+ }
133
+ // Fetch other tasks in the same section for context
134
+ let sectionTasks = [];
135
+ let rejectionHistory = [];
136
+ let submissionNotes = null;
137
+ try {
138
+ const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
139
+ // Get section tasks
140
+ if (task.section_id) {
141
+ const allSectionTasks = (0, queries_js_1.listTasks)(db, { sectionId: task.section_id });
142
+ sectionTasks = allSectionTasks.map(t => ({
143
+ id: t.id,
144
+ title: t.title,
145
+ status: t.status,
146
+ }));
147
+ }
148
+ // Get rejection history - ALWAYS fetch this so reviewer can see past attempts
149
+ rejectionHistory = (0, queries_js_1.getTaskRejections)(db, task.id);
150
+ if (rejectionHistory.length > 0) {
151
+ console.log(`Found ${rejectionHistory.length} previous rejection(s) for this task`);
152
+ }
153
+ // Get coder's submission notes (if any)
154
+ submissionNotes = (0, queries_js_1.getLatestSubmissionNotes)(db, task.id);
155
+ if (submissionNotes) {
156
+ console.log(`Coder included notes with submission`);
157
+ }
158
+ close();
159
+ }
160
+ catch (error) {
161
+ console.warn('Could not fetch task context:', error);
162
+ }
163
+ // Reuse config loaded earlier, get reviewer model
164
+ const reviewerModel = reviewerConfig?.model || 'unknown';
165
+ const context = {
166
+ task,
167
+ projectPath,
168
+ reviewerModel,
169
+ gitDiff,
170
+ modifiedFiles,
171
+ sectionTasks,
172
+ rejectionHistory,
173
+ submissionNotes,
174
+ config,
175
+ coordinatorGuidance,
176
+ coordinatorDecision,
177
+ };
178
+ const prompt = (0, reviewer_js_1.generateReviewerPrompt)(context);
179
+ // Write prompt to temp file
180
+ const promptFile = writePromptToTempFile(prompt);
181
+ try {
182
+ const result = await invokeProvider(promptFile, 600_000, task.id, projectPath);
183
+ console.log(`\n${'='.repeat(60)}`);
184
+ console.log(`REVIEWER COMPLETED`);
185
+ console.log(`Exit code: ${result.exitCode}`);
186
+ console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
187
+ console.log(`${'='.repeat(60)}\n`);
188
+ return result;
189
+ }
190
+ finally {
191
+ // Clean up temp file
192
+ if ((0, node_fs_1.existsSync)(promptFile)) {
193
+ (0, node_fs_1.unlinkSync)(promptFile);
194
+ }
195
+ }
196
+ }
197
+ /**
198
+ * Invoke reviewer for a batch of tasks
199
+ */
200
+ async function invokeReviewerBatch(tasks, sectionName, projectPath) {
201
+ // Load config for quality settings and to show provider/model being used
202
+ const config = (0, loader_js_1.loadConfig)(projectPath);
203
+ const reviewerConfig = config.ai?.reviewer;
204
+ console.log(`\n${'='.repeat(60)}`);
205
+ console.log(`BATCH REVIEWER: Section "${sectionName}"`);
206
+ console.log(`Tasks: ${tasks.length}`);
207
+ tasks.forEach((t, i) => console.log(` ${i + 1}. ${t.title} (${t.id})`));
208
+ console.log(`Provider: ${reviewerConfig?.provider ?? 'not configured'}`);
209
+ console.log(`Model: ${reviewerConfig?.model ?? 'not configured'}`);
210
+ console.log(`${'='.repeat(60)}\n`);
211
+ // Get combined git diff for all tasks (compare against base before batch started)
212
+ // We look for the earliest task's commit and diff from there
213
+ const gitDiff = (0, status_js_1.getGitDiff)(projectPath, 'HEAD~' + tasks.length);
214
+ const modifiedFiles = (0, status_js_1.getModifiedFiles)(projectPath);
215
+ const context = {
216
+ tasks,
217
+ projectPath,
218
+ sectionName,
219
+ gitDiff,
220
+ modifiedFiles,
221
+ config,
222
+ };
223
+ const prompt = (0, reviewer_js_1.generateBatchReviewerPrompt)(context);
224
+ const promptFile = writePromptToTempFile(prompt);
225
+ try {
226
+ // Longer timeout for batch: base 20 minutes + 3 minutes per task
227
+ const timeoutMs = 20 * 60 * 1000 + tasks.length * 3 * 60 * 1000;
228
+ const result = await invokeProvider(promptFile, timeoutMs, undefined, projectPath);
229
+ console.log(`\n${'='.repeat(60)}`);
230
+ console.log(`BATCH REVIEWER COMPLETED`);
231
+ console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
232
+ console.log(`${'='.repeat(60)}\n`);
233
+ return { ...result, taskCount: tasks.length };
234
+ }
235
+ finally {
236
+ if ((0, node_fs_1.existsSync)(promptFile)) {
237
+ (0, node_fs_1.unlinkSync)(promptFile);
238
+ }
239
+ }
240
+ }
241
+ //# sourceMappingURL=reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Task selection algorithm with locking integration
3
+ * Following ORCHESTRATOR.md specification
4
+ */
5
+ import type Database from 'better-sqlite3';
6
+ import type { Task } from '../database/queries.js';
7
+ import { isTaskLocked, type LockAcquisitionResult, type LockReleaseResult, type HeartbeatHandle } from '../locking/task-lock.js';
8
+ import { acquireSectionLock, releaseSectionLock, isSectionLocked } from '../locking/section-lock.js';
9
+ export interface SelectedTask {
10
+ task: Task;
11
+ action: 'review' | 'resume' | 'start';
12
+ rejectionNotes?: string;
13
+ }
14
+ export interface SelectedTaskWithLock extends SelectedTask {
15
+ lockResult: LockAcquisitionResult;
16
+ heartbeat?: HeartbeatHandle;
17
+ }
18
+ export interface TaskSelectionOptions {
19
+ runnerId: string;
20
+ timeoutMinutes?: number;
21
+ noWait?: boolean;
22
+ waitTimeoutMs?: number;
23
+ pollIntervalMs?: number;
24
+ sectionId?: string;
25
+ }
26
+ /**
27
+ * Select the next task to work on
28
+ *
29
+ * Priority order:
30
+ * 1. Tasks in 'review' status (complete review loop first)
31
+ * 2. Tasks in 'in_progress' status (resume incomplete work)
32
+ * 3. Tasks in 'pending' status (start new work)
33
+ *
34
+ * Within each priority, tasks are ordered by:
35
+ * - Section position (lower first)
36
+ * - Creation time (older first)
37
+ */
38
+ export declare function selectNextTask(db: Database.Database, sectionId?: string): SelectedTask | null;
39
+ /**
40
+ * Batch of tasks from a single section
41
+ */
42
+ export interface TaskBatch {
43
+ tasks: Task[];
44
+ sectionId: string;
45
+ sectionName: string;
46
+ }
47
+ /**
48
+ * Select a batch of pending tasks from the first available section
49
+ * Used when batch mode is enabled
50
+ */
51
+ export declare function selectTaskBatch(db: Database.Database, maxSize?: number): TaskBatch | null;
52
+ /**
53
+ * Mark a task as in_progress when starting
54
+ */
55
+ export declare function markTaskInProgress(db: Database.Database, taskId: string): void;
56
+ /**
57
+ * Check if all tasks are completed
58
+ */
59
+ export declare function areAllTasksComplete(db: Database.Database, sectionId?: string): boolean;
60
+ /**
61
+ * Count tasks by status
62
+ */
63
+ export declare function getTaskCounts(db: Database.Database, sectionId?: string): {
64
+ pending: number;
65
+ in_progress: number;
66
+ review: number;
67
+ completed: number;
68
+ disputed: number;
69
+ failed: number;
70
+ total: number;
71
+ };
72
+ /**
73
+ * Select the next task and acquire a lock on it
74
+ * Skips tasks that are already locked by other runners
75
+ */
76
+ export declare function selectNextTaskWithLock(db: Database.Database, options: TaskSelectionOptions): SelectedTaskWithLock | null;
77
+ /**
78
+ * Select next task with wait behavior
79
+ * Waits for a locked task if no unlocked tasks are available
80
+ */
81
+ export declare function selectNextTaskWithWait(db: Database.Database, options: TaskSelectionOptions): Promise<SelectedTaskWithLock | null>;
82
+ /**
83
+ * Release task lock after completion
84
+ */
85
+ export declare function releaseTaskLockAfterCompletion(db: Database.Database, taskId: string, runnerId: string, heartbeat?: HeartbeatHandle): LockReleaseResult;
86
+ /**
87
+ * Mark task in progress and acquire lock
88
+ */
89
+ export declare function startTaskWithLock(db: Database.Database, taskId: string, runnerId: string, timeoutMinutes?: number): {
90
+ success: boolean;
91
+ heartbeat?: HeartbeatHandle;
92
+ error?: string;
93
+ };
94
+ /**
95
+ * Complete task and release lock
96
+ */
97
+ export declare function completeTaskWithLock(db: Database.Database, taskId: string, runnerId: string, newStatus: 'review' | 'completed', heartbeat?: HeartbeatHandle): {
98
+ success: boolean;
99
+ error?: string;
100
+ };
101
+ export { isTaskLocked, isSectionLocked, acquireSectionLock, releaseSectionLock, };
102
+ //# sourceMappingURL=task-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-selector.d.ts","sourceRoot":"","sources":["../../src/orchestrator/task-selector.ts"],"names":[],"mappings":"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"}