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,280 @@
1
+ /**
2
+ * Fallback handler for orchestrator output parsing
3
+ * Multi-layer parsing strategy to handle invalid JSON
4
+ */
5
+ import { validateCoderResult, validateReviewerResult } from './schemas.js';
6
+ export class OrchestrationFallbackHandler {
7
+ /**
8
+ * Parse coder orchestrator output with multi-layer fallback
9
+ */
10
+ parseCoderOutput(rawOutput) {
11
+ // Layer 1: Direct JSON parse
12
+ try {
13
+ const parsed = JSON.parse(rawOutput);
14
+ if (validateCoderResult(parsed)) {
15
+ console.log('[Orchestrator] ✓ Layer 1: Direct JSON parse succeeded');
16
+ return parsed;
17
+ }
18
+ else {
19
+ console.warn('[Orchestrator] Layer 1 JSON parsed but validation failed');
20
+ }
21
+ }
22
+ catch (e) {
23
+ console.warn('[Orchestrator] Layer 1: JSON.parse failed');
24
+ }
25
+ // Layer 2: Extract from markdown code block
26
+ const jsonBlock = rawOutput.match(/```json\s*([\s\S]*?)\s*```/);
27
+ if (jsonBlock) {
28
+ try {
29
+ const parsed = JSON.parse(jsonBlock[1]);
30
+ if (validateCoderResult(parsed)) {
31
+ console.log('[Orchestrator] ✓ Layer 2: Markdown extraction succeeded');
32
+ return parsed;
33
+ }
34
+ else {
35
+ console.warn('[Orchestrator] Layer 2 JSON parsed but validation failed');
36
+ }
37
+ }
38
+ catch (e) {
39
+ console.warn('[Orchestrator] Layer 2: Markdown block found but JSON.parse failed');
40
+ }
41
+ }
42
+ // Layer 3: Find first { to last }
43
+ const start = rawOutput.indexOf('{');
44
+ const end = rawOutput.lastIndexOf('}');
45
+ if (start !== -1 && end !== -1 && end > start) {
46
+ try {
47
+ const parsed = JSON.parse(rawOutput.substring(start, end + 1));
48
+ if (validateCoderResult(parsed)) {
49
+ console.log('[Orchestrator] ✓ Layer 3: Substring extraction succeeded');
50
+ return parsed;
51
+ }
52
+ else {
53
+ console.warn('[Orchestrator] Layer 3 JSON parsed but validation failed');
54
+ }
55
+ }
56
+ catch (e) {
57
+ console.warn('[Orchestrator] Layer 3: Substring found but JSON.parse failed');
58
+ }
59
+ }
60
+ // Layer 4: Keyword fallback
61
+ console.warn('[Orchestrator] ⚠ Layer 4: Using keyword fallback (all parsing failed)');
62
+ return this.keywordFallbackCoder(rawOutput);
63
+ }
64
+ /**
65
+ * Parse reviewer orchestrator output with multi-layer fallback
66
+ */
67
+ parseReviewerOutput(rawOutput) {
68
+ // Layer 1: Direct JSON parse
69
+ try {
70
+ const parsed = JSON.parse(rawOutput);
71
+ if (validateReviewerResult(parsed)) {
72
+ console.log('[Orchestrator] ✓ Layer 1: Direct JSON parse succeeded');
73
+ return parsed;
74
+ }
75
+ else {
76
+ console.warn('[Orchestrator] Layer 1 JSON parsed but validation failed');
77
+ }
78
+ }
79
+ catch (e) {
80
+ console.warn('[Orchestrator] Layer 1: JSON.parse failed');
81
+ }
82
+ // Layer 2: Extract from markdown code block
83
+ const jsonBlock = rawOutput.match(/```json\s*([\s\S]*?)\s*```/);
84
+ if (jsonBlock) {
85
+ try {
86
+ const parsed = JSON.parse(jsonBlock[1]);
87
+ if (validateReviewerResult(parsed)) {
88
+ console.log('[Orchestrator] ✓ Layer 2: Markdown extraction succeeded');
89
+ return parsed;
90
+ }
91
+ else {
92
+ console.warn('[Orchestrator] Layer 2 JSON parsed but validation failed');
93
+ }
94
+ }
95
+ catch (e) {
96
+ console.warn('[Orchestrator] Layer 2: Markdown block found but JSON.parse failed');
97
+ }
98
+ }
99
+ // Layer 3: Find first { to last }
100
+ const start = rawOutput.indexOf('{');
101
+ const end = rawOutput.lastIndexOf('}');
102
+ if (start !== -1 && end !== -1 && end > start) {
103
+ try {
104
+ const parsed = JSON.parse(rawOutput.substring(start, end + 1));
105
+ if (validateReviewerResult(parsed)) {
106
+ console.log('[Orchestrator] ✓ Layer 3: Substring extraction succeeded');
107
+ return parsed;
108
+ }
109
+ else {
110
+ console.warn('[Orchestrator] Layer 3 JSON parsed but validation failed');
111
+ }
112
+ }
113
+ catch (e) {
114
+ console.warn('[Orchestrator] Layer 3: Substring found but JSON.parse failed');
115
+ }
116
+ }
117
+ // Layer 4: Keyword fallback
118
+ console.warn('[Orchestrator] ⚠ Layer 4: Using keyword fallback (all parsing failed)');
119
+ return this.keywordFallbackReviewer(rawOutput);
120
+ }
121
+ /**
122
+ * Keyword-based fallback for coder orchestrator
123
+ */
124
+ keywordFallbackCoder(output) {
125
+ const lower = output.toLowerCase();
126
+ // Check for timeout
127
+ if (/timeout|timed out/.test(lower)) {
128
+ return {
129
+ action: 'retry',
130
+ reasoning: 'FALLBACK: Detected timeout',
131
+ commits: [],
132
+ next_status: 'in_progress',
133
+ metadata: {
134
+ files_changed: 0,
135
+ confidence: 'low',
136
+ exit_clean: false,
137
+ has_commits: false
138
+ }
139
+ };
140
+ }
141
+ // Check for errors
142
+ if (/fatal|error|failed/.test(lower) && !/commit/.test(lower)) {
143
+ return {
144
+ action: 'error',
145
+ reasoning: 'FALLBACK: Detected error keywords',
146
+ commits: [],
147
+ next_status: 'failed',
148
+ metadata: {
149
+ files_changed: 0,
150
+ confidence: 'low',
151
+ exit_clean: false,
152
+ has_commits: false
153
+ }
154
+ };
155
+ }
156
+ // Check for completion with commit
157
+ if (/commit|committed/.test(lower) && !/error|failed/.test(lower)) {
158
+ return {
159
+ action: 'submit',
160
+ reasoning: 'FALLBACK: Detected commit keywords',
161
+ commits: [],
162
+ next_status: 'review',
163
+ metadata: {
164
+ files_changed: 0,
165
+ confidence: 'low',
166
+ exit_clean: true,
167
+ has_commits: false
168
+ }
169
+ };
170
+ }
171
+ // Check for completion signals
172
+ if (/complete|finished|done|ready/.test(lower)) {
173
+ return {
174
+ action: 'submit',
175
+ reasoning: 'FALLBACK: Detected completion keywords',
176
+ commits: [],
177
+ next_status: 'review',
178
+ metadata: {
179
+ files_changed: 0,
180
+ confidence: 'low',
181
+ exit_clean: true,
182
+ has_commits: false
183
+ }
184
+ };
185
+ }
186
+ // Safe default: retry
187
+ return {
188
+ action: 'retry',
189
+ reasoning: 'FALLBACK: Orchestrator failed, defaulting to retry',
190
+ commits: [],
191
+ next_status: 'in_progress',
192
+ metadata: {
193
+ files_changed: 0,
194
+ confidence: 'low',
195
+ exit_clean: true,
196
+ has_commits: false
197
+ }
198
+ };
199
+ }
200
+ /**
201
+ * Keyword-based fallback for reviewer orchestrator
202
+ */
203
+ keywordFallbackReviewer(output) {
204
+ const lower = output.toLowerCase();
205
+ // Check for approval
206
+ if (/(lgtm|approve|looks good|approved)/.test(lower) && !/reject|issues|needs work/.test(lower)) {
207
+ return {
208
+ decision: 'approve',
209
+ reasoning: 'FALLBACK: Detected approval keywords',
210
+ notes: 'Approved based on keyword detection',
211
+ next_status: 'completed',
212
+ metadata: {
213
+ rejection_count: 0,
214
+ confidence: 'low',
215
+ push_to_remote: true,
216
+ repeated_issue: false
217
+ }
218
+ };
219
+ }
220
+ // Check for rejection
221
+ if (/reject|issues|needs work|fix|problem/.test(lower)) {
222
+ return {
223
+ decision: 'reject',
224
+ reasoning: 'FALLBACK: Detected rejection keywords',
225
+ notes: 'Rejected - see full reviewer output for details',
226
+ next_status: 'in_progress',
227
+ metadata: {
228
+ rejection_count: 0,
229
+ confidence: 'low',
230
+ push_to_remote: false,
231
+ repeated_issue: false
232
+ }
233
+ };
234
+ }
235
+ // Check for dispute
236
+ if (/dispute|disagree|out of scope/.test(lower)) {
237
+ return {
238
+ decision: 'dispute',
239
+ reasoning: 'FALLBACK: Detected dispute keywords',
240
+ notes: 'Dispute detected - human decision needed',
241
+ next_status: 'disputed',
242
+ metadata: {
243
+ rejection_count: 0,
244
+ confidence: 'low',
245
+ push_to_remote: false,
246
+ repeated_issue: false
247
+ }
248
+ };
249
+ }
250
+ // Check for skip
251
+ if (/skip|no changes|nothing to review/.test(lower)) {
252
+ return {
253
+ decision: 'skip',
254
+ reasoning: 'FALLBACK: Detected skip keywords',
255
+ notes: 'Task skipped',
256
+ next_status: 'skipped',
257
+ metadata: {
258
+ rejection_count: 0,
259
+ confidence: 'low',
260
+ push_to_remote: true,
261
+ repeated_issue: false
262
+ }
263
+ };
264
+ }
265
+ // Safe default: unclear
266
+ return {
267
+ decision: 'unclear',
268
+ reasoning: 'FALLBACK: Orchestrator failed, retrying review',
269
+ notes: 'Review unclear, retrying',
270
+ next_status: 'review',
271
+ metadata: {
272
+ rejection_count: 0,
273
+ confidence: 'low',
274
+ push_to_remote: false,
275
+ repeated_issue: false
276
+ }
277
+ };
278
+ }
279
+ }
280
+ //# sourceMappingURL=fallback-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-handler.js","sourceRoot":"","sources":["../../../../src/orchestrator/fallback-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Orchestrator invocation functions
3
+ * Calls the orchestrator LLM to analyze output and make decisions
4
+ */
5
+ import type { CoderContext, ReviewerContext } from './types.js';
6
+ /**
7
+ * Invoke post-coder orchestrator to analyze coder output
8
+ */
9
+ export declare function invokeCoderOrchestrator(context: CoderContext, projectPath?: string): Promise<string>;
10
+ /**
11
+ * Invoke post-reviewer orchestrator to analyze reviewer output
12
+ */
13
+ export declare function invokeReviewerOrchestrator(context: ReviewerContext, projectPath?: string): Promise<string>;
14
+ //# sourceMappingURL=invoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../../../src/orchestrator/invoke.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhE;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,YAAY,EACrB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,eAAe,EACxB,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Orchestrator invocation functions
3
+ * Calls the orchestrator LLM to analyze output and make decisions
4
+ */
5
+ import { writeFileSync, unlinkSync } from 'node:fs';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ import { loadConfig } from '../config/loader.js';
9
+ import { getProviderRegistry } from '../providers/registry.js';
10
+ import { logInvocation } from '../providers/invocation-logger.js';
11
+ import { buildPostCoderPrompt } from './post-coder.js';
12
+ import { buildPostReviewerPrompt } from './post-reviewer.js';
13
+ /**
14
+ * Invoke post-coder orchestrator to analyze coder output
15
+ */
16
+ export async function invokeCoderOrchestrator(context, projectPath = process.cwd()) {
17
+ const prompt = buildPostCoderPrompt(context);
18
+ return await invokeOrchestrator(prompt, 'orchestrator', projectPath, context.task.id);
19
+ }
20
+ /**
21
+ * Invoke post-reviewer orchestrator to analyze reviewer output
22
+ */
23
+ export async function invokeReviewerOrchestrator(context, projectPath = process.cwd()) {
24
+ const prompt = buildPostReviewerPrompt(context);
25
+ return await invokeOrchestrator(prompt, 'orchestrator', projectPath, context.task.id);
26
+ }
27
+ /**
28
+ * Generic orchestrator invocation
29
+ */
30
+ async function invokeOrchestrator(prompt, role, projectPath, taskId) {
31
+ // Load configuration to get orchestrator provider settings
32
+ const config = loadConfig(projectPath);
33
+ const orchestratorConfig = config.ai?.orchestrator;
34
+ const providerName = orchestratorConfig?.provider;
35
+ const modelName = orchestratorConfig?.model;
36
+ if (!providerName || !modelName) {
37
+ throw new Error('Orchestrator AI provider not configured. Run "steroids config ai orchestrator" to configure.');
38
+ }
39
+ // Get the provider from registry
40
+ const registry = getProviderRegistry();
41
+ const provider = registry.get(providerName);
42
+ // Check if provider is available
43
+ if (!(await provider.isAvailable())) {
44
+ throw new Error(`Provider '${providerName}' is not available. ` +
45
+ `Ensure the CLI is installed and in PATH.`);
46
+ }
47
+ // Write prompt to temp file
48
+ const promptFile = join(tmpdir(), `steroids-orchestrator-${Date.now()}.txt`);
49
+ writeFileSync(promptFile, prompt, 'utf-8');
50
+ try {
51
+ const result = await logInvocation(prompt, (ctx) => provider.invoke(prompt, {
52
+ model: modelName,
53
+ timeout: 30_000,
54
+ cwd: projectPath,
55
+ promptFile,
56
+ role,
57
+ streamOutput: false, // Don't stream orchestrator output
58
+ onActivity: ctx?.onActivity,
59
+ }), {
60
+ role,
61
+ provider: providerName,
62
+ model: modelName,
63
+ taskId,
64
+ projectPath,
65
+ });
66
+ return result.stdout;
67
+ }
68
+ finally {
69
+ // Cleanup temp file
70
+ try {
71
+ unlinkSync(promptFile);
72
+ }
73
+ catch { }
74
+ }
75
+ }
76
+ //# sourceMappingURL=invoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../../../src/orchestrator/invoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Post-Coder Orchestrator
3
+ * Analyzes coder output and decides if work is ready for review
4
+ */
5
+ import { CoderContext } from './types.js';
6
+ /**
7
+ * Generate post-coder orchestrator prompt
8
+ */
9
+ export declare function buildPostCoderPrompt(context: CoderContext): string;
10
+ //# sourceMappingURL=post-coder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-coder.d.ts","sourceRoot":"","sources":["../../../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuMlE"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Post-Coder Orchestrator
3
+ * Analyzes coder output and decides if work is ready for review
4
+ */
5
+ /**
6
+ * Generate post-coder orchestrator prompt
7
+ */
8
+ export function buildPostCoderPrompt(context) {
9
+ const { task, coder_output: { stdout, stderr, exit_code, timed_out, duration_ms }, git_state: { commits, files_changed, has_uncommitted_changes } } = context;
10
+ const duration_seconds = (duration_ms / 1000).toFixed(1);
11
+ const stdout_tail = stdout.slice(-2000);
12
+ const stderr_tail = stderr.slice(-2000);
13
+ let rejectionSection = '';
14
+ if (task.rejection_notes) {
15
+ rejectionSection = `
16
+ **Previous Rejection:** ${task.rejection_notes}
17
+ **Rejection Count:** ${task.rejection_count || 0}
18
+ `;
19
+ }
20
+ let commitsSection = '';
21
+ if (commits.length > 0) {
22
+ commitsSection = commits.map(c => `- ${c.sha} - ${c.message}`).join('\n');
23
+ }
24
+ let filesSection = '';
25
+ if (files_changed.length > 0) {
26
+ filesSection = files_changed.map(f => `- ${f}`).join('\n');
27
+ }
28
+ let stderrSection = '';
29
+ if (stderr) {
30
+ stderrSection = `
31
+ **Errors:**
32
+ \`\`\`
33
+ ${stderr_tail}
34
+ \`\`\`
35
+ `;
36
+ }
37
+ return `# POST-CODER ORCHESTRATOR
38
+
39
+ You are a state machine that analyzes coder output and determines the next action.
40
+
41
+ **CRITICAL: You MUST respond ONLY with valid JSON. No markdown, no other text.**
42
+
43
+ ---
44
+
45
+ ## Task Context
46
+
47
+ **Task ID:** ${task.id}
48
+ **Task Title:** ${task.title}
49
+ **Task Status:** in_progress
50
+ ${rejectionSection}
51
+ ---
52
+
53
+ ## Coder Execution
54
+
55
+ **Exit Code:** ${exit_code}
56
+ **Timed Out:** ${timed_out}
57
+ **Duration:** ${duration_seconds}s
58
+
59
+ **Output (last 2000 chars):**
60
+ \`\`\`
61
+ ${stdout_tail}
62
+ \`\`\`
63
+ ${stderrSection}
64
+ ---
65
+
66
+ ## Git State
67
+
68
+ **Commits Made:** ${commits.length}
69
+ ${commitsSection}
70
+
71
+ **Files Changed:** ${files_changed.length}
72
+ ${filesSection}
73
+
74
+ **Uncommitted Changes:** ${has_uncommitted_changes}
75
+
76
+ ---
77
+
78
+ ## Decision Rules
79
+
80
+ ### 1. Error States
81
+ - Exit code non-zero + timeout → \`error\` (process killed)
82
+ - Exit code non-zero + no commits + no changes → \`error\` (failed to start)
83
+ - Stderr contains "fatal" / "Permission denied" → \`error\`
84
+
85
+ ### 2. Incomplete Work
86
+ - Exit 0 but no commits and no changes → \`retry\` (did nothing)
87
+ - Timeout but has commits/changes → \`stage_commit_submit\` (save progress)
88
+ - Output contains "need more time" / "continuing" → \`retry\`
89
+
90
+ ### 3. Completion Without Commit
91
+ - Exit 0 + uncommitted changes + completion signal → \`stage_commit_submit\`
92
+ - Look for: "changes ready", "implementation complete", "finished"
93
+
94
+ ### 4. Normal Completion
95
+ - Exit 0 + commits exist → \`submit\`
96
+ - Most common happy path
97
+
98
+ ### 5. Uncertainty Default
99
+ - When signals conflict → \`retry\` (safer than error)
100
+
101
+ ---
102
+
103
+ ## Output Format (JSON ONLY)
104
+
105
+ \`\`\`json
106
+ {
107
+ "action": "submit" | "retry" | "stage_commit_submit" | "error",
108
+ "reasoning": "One sentence why (max 100 chars)",
109
+ "commits": ["sha1", "sha2"],
110
+ "commit_message": "Only if stage_commit_submit",
111
+ "next_status": "review" | "in_progress" | "failed",
112
+ "metadata": {
113
+ "files_changed": 0,
114
+ "confidence": "high" | "medium" | "low",
115
+ "exit_clean": true,
116
+ "has_commits": false
117
+ }
118
+ }
119
+ \`\`\`
120
+
121
+ ### Field Rules
122
+
123
+ **action:**
124
+ - \`submit\` → Work complete, has commits, ready for review
125
+ - \`retry\` → Incomplete or unclear, run coder again
126
+ - \`stage_commit_submit\` → Work complete but not committed
127
+ - \`error\` → Fatal issue, needs human intervention
128
+
129
+ **next_status:**
130
+ - \`review\` for submit and stage_commit_submit
131
+ - \`in_progress\` for retry
132
+ - \`failed\` for error
133
+
134
+ **confidence:**
135
+ - \`high\` - Clear signals, obvious decision
136
+ - \`medium\` - Reasonable inference from context
137
+ - \`low\` - Uncertain, making best guess
138
+
139
+ ---
140
+
141
+ ## Examples
142
+
143
+ ### Example 1: Normal Completion
144
+ \`\`\`json
145
+ {
146
+ "action": "submit",
147
+ "reasoning": "Clean exit with 2 commits",
148
+ "commits": ["abc123", "def456"],
149
+ "commit_message": null,
150
+ "next_status": "review",
151
+ "metadata": {
152
+ "files_changed": 3,
153
+ "confidence": "high",
154
+ "exit_clean": true,
155
+ "has_commits": true
156
+ }
157
+ }
158
+ \`\`\`
159
+
160
+ ### Example 2: Uncommitted Work
161
+ \`\`\`json
162
+ {
163
+ "action": "stage_commit_submit",
164
+ "reasoning": "Work complete but not committed",
165
+ "commits": [],
166
+ "commit_message": "feat: implement task specification",
167
+ "next_status": "review",
168
+ "metadata": {
169
+ "files_changed": 2,
170
+ "confidence": "high",
171
+ "exit_clean": true,
172
+ "has_commits": false
173
+ }
174
+ }
175
+ \`\`\`
176
+
177
+ ### Example 3: Timeout
178
+ \`\`\`json
179
+ {
180
+ "action": "retry",
181
+ "reasoning": "Timeout with no output, retrying",
182
+ "commits": [],
183
+ "commit_message": null,
184
+ "next_status": "in_progress",
185
+ "metadata": {
186
+ "files_changed": 0,
187
+ "confidence": "high",
188
+ "exit_clean": false,
189
+ "has_commits": false
190
+ }
191
+ }
192
+ \`\`\`
193
+
194
+ ---
195
+
196
+ Analyze the context above and respond with JSON:`;
197
+ }
198
+ //# sourceMappingURL=post-coder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-coder.js","sourceRoot":"","sources":["../../../../src/orchestrator/post-coder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,EACJ,IAAI,EACJ,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,EACnE,SAAS,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,EAC/D,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,gBAAgB,GAAG;0BACG,IAAI,CAAC,eAAe;uBACvB,IAAI,CAAC,eAAe,IAAI,CAAC;CAC/C,CAAC;IACA,CAAC;IAED,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,MAAM,EAAE,CAAC;QACX,aAAa,GAAG;;;EAGlB,WAAW;;CAEZ,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;eAUM,IAAI,CAAC,EAAE;kBACJ,IAAI,CAAC,KAAK;;EAE1B,gBAAgB;;;;;iBAKD,SAAS;iBACT,SAAS;gBACV,gBAAgB;;;;EAI9B,WAAW;;EAEX,aAAa;;;;;oBAKK,OAAO,CAAC,MAAM;EAChC,cAAc;;qBAEK,aAAa,CAAC,MAAM;EACvC,YAAY;;2BAEa,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDA0HD,CAAC;AAClD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Post-Reviewer Orchestrator
3
+ * Analyzes reviewer output and decides task outcome
4
+ */
5
+ import { ReviewerContext } from './types.js';
6
+ /**
7
+ * Generate post-reviewer orchestrator prompt
8
+ */
9
+ export declare function buildPostReviewerPrompt(context: ReviewerContext): string;
10
+ //# sourceMappingURL=post-reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-reviewer.d.ts","sourceRoot":"","sources":["../../../../src/orchestrator/post-reviewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAqMxE"}