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,227 @@
1
+ /**
2
+ * Claude Provider
3
+ * Implementation for Anthropic's Claude CLI
4
+ */
5
+ import { spawn } from 'node:child_process';
6
+ import { writeFileSync, unlinkSync, existsSync } from 'node:fs';
7
+ import { tmpdir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { BaseAIProvider, } from './interface.js';
10
+ /**
11
+ * Available Claude models
12
+ * Use aliases (sonnet, opus, haiku) for latest versions
13
+ */
14
+ const CLAUDE_MODELS = [
15
+ {
16
+ id: 'opus',
17
+ name: 'Claude Opus (latest)',
18
+ recommendedFor: ['orchestrator', 'reviewer'],
19
+ supportsStreaming: true,
20
+ },
21
+ {
22
+ id: 'sonnet',
23
+ name: 'Claude Sonnet (latest)',
24
+ recommendedFor: ['coder'],
25
+ supportsStreaming: true,
26
+ },
27
+ {
28
+ id: 'haiku',
29
+ name: 'Claude Haiku (latest)',
30
+ recommendedFor: [],
31
+ supportsStreaming: true,
32
+ },
33
+ ];
34
+ /**
35
+ * Default models per role
36
+ */
37
+ const DEFAULT_MODELS = {
38
+ orchestrator: 'opus',
39
+ coder: 'sonnet',
40
+ reviewer: 'opus',
41
+ };
42
+ /**
43
+ * Default timeout in milliseconds (15 minutes)
44
+ */
45
+ const DEFAULT_TIMEOUT = 900_000;
46
+ /**
47
+ * Default invocation template for Claude CLI
48
+ * Uses -p flag for print mode with prompt from file via shell substitution
49
+ */
50
+ const DEFAULT_INVOCATION_TEMPLATE = '{cli} -p "$(cat {prompt_file})" --model {model}';
51
+ /**
52
+ * Claude AI Provider implementation
53
+ */
54
+ export class ClaudeProvider extends BaseAIProvider {
55
+ name = 'claude';
56
+ displayName = 'Anthropic Claude';
57
+ /**
58
+ * Write prompt to a temporary file
59
+ */
60
+ writePromptFile(prompt) {
61
+ const tempPath = join(tmpdir(), `steroids-claude-${Date.now()}.txt`);
62
+ writeFileSync(tempPath, prompt, { mode: 0o600 });
63
+ return tempPath;
64
+ }
65
+ /**
66
+ * Clean up temporary prompt file
67
+ */
68
+ cleanupPromptFile(path) {
69
+ try {
70
+ if (existsSync(path)) {
71
+ unlinkSync(path);
72
+ }
73
+ }
74
+ catch {
75
+ // Ignore cleanup errors
76
+ }
77
+ }
78
+ /**
79
+ * Invoke Claude CLI with a prompt
80
+ */
81
+ async invoke(prompt, options) {
82
+ const timeout = options.timeout ?? DEFAULT_TIMEOUT;
83
+ const cwd = options.cwd ?? process.cwd();
84
+ const model = options.model;
85
+ const streamOutput = options.streamOutput ?? true;
86
+ const onActivity = options.onActivity;
87
+ // Apply custom invocation template if provided in options
88
+ if (options.invocationTemplate) {
89
+ this.setInvocationTemplate(options.invocationTemplate);
90
+ }
91
+ // Write prompt to temp file
92
+ const promptFile = options.promptFile ?? this.writePromptFile(prompt);
93
+ const createdTempFile = !options.promptFile;
94
+ try {
95
+ return await this.invokeWithFile(promptFile, model, timeout, cwd, streamOutput, onActivity);
96
+ }
97
+ finally {
98
+ if (createdTempFile) {
99
+ this.cleanupPromptFile(promptFile);
100
+ }
101
+ }
102
+ }
103
+ /**
104
+ * Invoke Claude CLI with a prompt file using the invocation template
105
+ */
106
+ invokeWithFile(promptFile, model, timeout, cwd, streamOutput, onActivity) {
107
+ return new Promise((resolve) => {
108
+ const startTime = Date.now();
109
+ let stdout = '';
110
+ let stderr = '';
111
+ let timedOut = false;
112
+ // Build command from invocation template
113
+ const command = this.buildCommand(promptFile, model);
114
+ // Spawn using shell to handle the command template
115
+ const child = spawn(command, {
116
+ shell: true,
117
+ cwd,
118
+ stdio: ['pipe', 'pipe', 'pipe'],
119
+ });
120
+ const timeoutHandle = setTimeout(() => {
121
+ timedOut = true;
122
+ child.kill('SIGTERM');
123
+ // Force kill after 5 seconds if still running
124
+ setTimeout(() => {
125
+ if (!child.killed) {
126
+ child.kill('SIGKILL');
127
+ }
128
+ }, 5000);
129
+ }, timeout);
130
+ child.stdout?.on('data', (data) => {
131
+ const text = data.toString();
132
+ stdout += text;
133
+ onActivity?.({ type: 'output', stream: 'stdout', msg: text });
134
+ // Stream output in real-time if enabled
135
+ if (streamOutput) {
136
+ process.stdout.write(text);
137
+ }
138
+ });
139
+ child.stderr?.on('data', (data) => {
140
+ const text = data.toString();
141
+ stderr += text;
142
+ onActivity?.({ type: 'output', stream: 'stderr', msg: text });
143
+ if (streamOutput) {
144
+ process.stderr.write(text);
145
+ }
146
+ });
147
+ child.on('close', (code) => {
148
+ clearTimeout(timeoutHandle);
149
+ const duration = Date.now() - startTime;
150
+ resolve({
151
+ success: code === 0 && !timedOut,
152
+ exitCode: code ?? 1,
153
+ stdout,
154
+ stderr,
155
+ duration,
156
+ timedOut,
157
+ });
158
+ });
159
+ child.on('error', (error) => {
160
+ clearTimeout(timeoutHandle);
161
+ const duration = Date.now() - startTime;
162
+ resolve({
163
+ success: false,
164
+ exitCode: 1,
165
+ stdout,
166
+ stderr: error.message,
167
+ duration,
168
+ timedOut: false,
169
+ });
170
+ });
171
+ });
172
+ }
173
+ /**
174
+ * Check if Claude CLI is available
175
+ */
176
+ async isAvailable() {
177
+ return new Promise((resolve) => {
178
+ const cli = this.cliPath ?? 'claude';
179
+ const child = spawn('which', [cli], {
180
+ shell: true,
181
+ stdio: ['pipe', 'pipe', 'pipe'],
182
+ });
183
+ child.on('close', (code) => {
184
+ resolve(code === 0);
185
+ });
186
+ child.on('error', () => {
187
+ resolve(false);
188
+ });
189
+ // Timeout after 5 seconds
190
+ setTimeout(() => {
191
+ child.kill();
192
+ resolve(false);
193
+ }, 5000);
194
+ });
195
+ }
196
+ /**
197
+ * List available model IDs
198
+ */
199
+ listModels() {
200
+ return CLAUDE_MODELS.map((m) => m.id);
201
+ }
202
+ /**
203
+ * Get detailed model information
204
+ */
205
+ getModelInfo() {
206
+ return [...CLAUDE_MODELS];
207
+ }
208
+ /**
209
+ * Get the default model for a role
210
+ */
211
+ getDefaultModel(role) {
212
+ return DEFAULT_MODELS[role];
213
+ }
214
+ /**
215
+ * Get the default invocation template for Claude CLI
216
+ */
217
+ getDefaultInvocationTemplate() {
218
+ return DEFAULT_INVOCATION_TEMPLATE;
219
+ }
220
+ }
221
+ /**
222
+ * Create a Claude provider instance
223
+ */
224
+ export function createClaudeProvider() {
225
+ return new ClaudeProvider();
226
+ }
227
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/providers/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Codex Provider
3
+ * Implementation for OpenAI Codex CLI
4
+ */
5
+ import { BaseAIProvider, type InvokeOptions, type InvokeResult, type ModelInfo } from './interface.js';
6
+ /**
7
+ * Codex AI Provider implementation
8
+ */
9
+ export declare class CodexProvider extends BaseAIProvider {
10
+ readonly name = "codex";
11
+ readonly displayName = "OpenAI Codex";
12
+ /**
13
+ * Write prompt to a temporary file
14
+ */
15
+ private writePromptFile;
16
+ /**
17
+ * Clean up temporary prompt file
18
+ */
19
+ private cleanupPromptFile;
20
+ /**
21
+ * Get the default invocation template
22
+ */
23
+ getDefaultInvocationTemplate(): string;
24
+ /**
25
+ * Invoke Codex CLI with a prompt
26
+ */
27
+ invoke(prompt: string, options: InvokeOptions): Promise<InvokeResult>;
28
+ /**
29
+ * Invoke Codex CLI with a prompt file using the invocation template
30
+ */
31
+ private invokeWithFile;
32
+ /**
33
+ * Check if Codex CLI is available
34
+ */
35
+ isAvailable(): Promise<boolean>;
36
+ /**
37
+ * List available model IDs
38
+ */
39
+ listModels(): string[];
40
+ /**
41
+ * Get detailed model information
42
+ */
43
+ getModelInfo(): ModelInfo[];
44
+ /**
45
+ * Get the default model for a role
46
+ */
47
+ getDefaultModel(role: 'orchestrator' | 'coder' | 'reviewer'): string | undefined;
48
+ }
49
+ /**
50
+ * Create a Codex provider instance
51
+ */
52
+ export declare function createCodexProvider(): CodexProvider;
53
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAoCxB;;GAEG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAC/C,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,kBAAkB;IAEtC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,4BAA4B,IAAI,MAAM;IAItC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB3E;;OAEG;IACH,OAAO,CAAC,cAAc;IA2HtB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAyBrC;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,YAAY,IAAI,SAAS,EAAE;IAI3B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS;CAGjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Codex Provider
3
+ * Implementation for OpenAI Codex CLI
4
+ */
5
+ import { spawn } from 'node:child_process';
6
+ import { writeFileSync, unlinkSync, existsSync } from 'node:fs';
7
+ import { tmpdir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { BaseAIProvider, } from './interface.js';
10
+ /**
11
+ * Available Codex models
12
+ */
13
+ const CODEX_MODELS = [
14
+ {
15
+ id: 'codex',
16
+ name: 'Codex',
17
+ recommendedFor: ['reviewer'],
18
+ supportsStreaming: true,
19
+ },
20
+ ];
21
+ /**
22
+ * Default models per role
23
+ */
24
+ const DEFAULT_MODELS = {
25
+ orchestrator: undefined,
26
+ coder: undefined,
27
+ reviewer: 'codex',
28
+ };
29
+ /**
30
+ * Default timeout in milliseconds (15 minutes)
31
+ */
32
+ const DEFAULT_TIMEOUT = 900_000;
33
+ /**
34
+ * Default invocation template for Codex CLI
35
+ * Uses dangerously-bypass-approvals-and-sandbox for full git access
36
+ * --skip-git-repo-check allows running outside trusted directories
37
+ * WARNING: This bypasses all sandboxing - use only in controlled environments
38
+ */
39
+ const DEFAULT_INVOCATION_TEMPLATE = 'cat {prompt_file} | {cli} exec --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check -';
40
+ /**
41
+ * Codex AI Provider implementation
42
+ */
43
+ export class CodexProvider extends BaseAIProvider {
44
+ name = 'codex';
45
+ displayName = 'OpenAI Codex';
46
+ /**
47
+ * Write prompt to a temporary file
48
+ */
49
+ writePromptFile(prompt) {
50
+ const tempPath = join(tmpdir(), `steroids-codex-${Date.now()}.txt`);
51
+ writeFileSync(tempPath, prompt, { mode: 0o600 });
52
+ return tempPath;
53
+ }
54
+ /**
55
+ * Clean up temporary prompt file
56
+ */
57
+ cleanupPromptFile(path) {
58
+ try {
59
+ if (existsSync(path)) {
60
+ unlinkSync(path);
61
+ }
62
+ }
63
+ catch {
64
+ // Ignore cleanup errors
65
+ }
66
+ }
67
+ /**
68
+ * Get the default invocation template
69
+ */
70
+ getDefaultInvocationTemplate() {
71
+ return DEFAULT_INVOCATION_TEMPLATE;
72
+ }
73
+ /**
74
+ * Invoke Codex CLI with a prompt
75
+ */
76
+ async invoke(prompt, options) {
77
+ const timeout = options.timeout ?? DEFAULT_TIMEOUT;
78
+ const cwd = options.cwd ?? process.cwd();
79
+ const streamOutput = options.streamOutput ?? true;
80
+ const onActivity = options.onActivity;
81
+ // Apply custom invocation template if provided in options
82
+ if (options.invocationTemplate) {
83
+ this.setInvocationTemplate(options.invocationTemplate);
84
+ }
85
+ // Write prompt to temp file
86
+ const promptFile = options.promptFile ?? this.writePromptFile(prompt);
87
+ const createdTempFile = !options.promptFile;
88
+ try {
89
+ return await this.invokeWithFile(promptFile, options.model, timeout, cwd, streamOutput, onActivity);
90
+ }
91
+ finally {
92
+ if (createdTempFile) {
93
+ this.cleanupPromptFile(promptFile);
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Invoke Codex CLI with a prompt file using the invocation template
99
+ */
100
+ invokeWithFile(promptFile, model, timeout, cwd, streamOutput, onActivity) {
101
+ return new Promise((resolve) => {
102
+ const startTime = Date.now();
103
+ let stdout = '';
104
+ let stderr = '';
105
+ let timedOut = false;
106
+ let stdoutParseBuffer = '';
107
+ let expectingToolCmd = false;
108
+ // Build command from invocation template
109
+ const command = this.buildCommand(promptFile, model);
110
+ // Spawn using shell to handle the command template
111
+ const child = spawn(command, {
112
+ shell: true,
113
+ cwd,
114
+ stdio: ['pipe', 'pipe', 'pipe'],
115
+ });
116
+ const timeoutHandle = setTimeout(() => {
117
+ timedOut = true;
118
+ child.kill('SIGTERM');
119
+ // Force kill after 5 seconds if still running
120
+ setTimeout(() => {
121
+ if (!child.killed) {
122
+ child.kill('SIGKILL');
123
+ }
124
+ }, 5000);
125
+ }, timeout);
126
+ child.stdout?.on('data', (data) => {
127
+ const text = data.toString();
128
+ stdout += text;
129
+ if (streamOutput) {
130
+ process.stdout.write(text);
131
+ }
132
+ if (!onActivity)
133
+ return;
134
+ // Best-effort parsing for Codex CLI tool execution markers:
135
+ // Some versions emit lines like:
136
+ // exec
137
+ // <command>
138
+ // We interpret that as a tool event and otherwise forward text as output.
139
+ stdoutParseBuffer += text;
140
+ while (true) {
141
+ const nl = stdoutParseBuffer.indexOf('\n');
142
+ if (nl === -1)
143
+ break;
144
+ const line = stdoutParseBuffer.slice(0, nl);
145
+ stdoutParseBuffer = stdoutParseBuffer.slice(nl + 1);
146
+ if (expectingToolCmd) {
147
+ const cmd = line.trim();
148
+ if (cmd)
149
+ onActivity({ type: 'tool', cmd });
150
+ expectingToolCmd = false;
151
+ continue;
152
+ }
153
+ if (line === 'exec') {
154
+ expectingToolCmd = true;
155
+ continue;
156
+ }
157
+ onActivity({ type: 'output', stream: 'stdout', msg: `${line}\n` });
158
+ }
159
+ });
160
+ child.stderr?.on('data', (data) => {
161
+ const text = data.toString();
162
+ stderr += text;
163
+ onActivity?.({ type: 'output', stream: 'stderr', msg: text });
164
+ if (streamOutput) {
165
+ process.stderr.write(text);
166
+ }
167
+ });
168
+ child.on('close', (code) => {
169
+ clearTimeout(timeoutHandle);
170
+ const duration = Date.now() - startTime;
171
+ if (onActivity && stdoutParseBuffer) {
172
+ // Flush remaining unterminated line.
173
+ if (expectingToolCmd) {
174
+ const cmd = stdoutParseBuffer.trim();
175
+ if (cmd)
176
+ onActivity({ type: 'tool', cmd });
177
+ }
178
+ else {
179
+ onActivity({ type: 'output', stream: 'stdout', msg: stdoutParseBuffer });
180
+ }
181
+ }
182
+ resolve({
183
+ success: code === 0 && !timedOut,
184
+ exitCode: code ?? 1,
185
+ stdout,
186
+ stderr,
187
+ duration,
188
+ timedOut,
189
+ });
190
+ });
191
+ child.on('error', (error) => {
192
+ clearTimeout(timeoutHandle);
193
+ const duration = Date.now() - startTime;
194
+ resolve({
195
+ success: false,
196
+ exitCode: 1,
197
+ stdout,
198
+ stderr: error.message,
199
+ duration,
200
+ timedOut: false,
201
+ });
202
+ });
203
+ });
204
+ }
205
+ /**
206
+ * Check if Codex CLI is available
207
+ */
208
+ async isAvailable() {
209
+ return new Promise((resolve) => {
210
+ const cli = this.cliPath ?? 'codex';
211
+ const child = spawn('which', [cli], {
212
+ shell: true,
213
+ stdio: ['pipe', 'pipe', 'pipe'],
214
+ });
215
+ child.on('close', (code) => {
216
+ resolve(code === 0);
217
+ });
218
+ child.on('error', () => {
219
+ resolve(false);
220
+ });
221
+ // Timeout after 5 seconds
222
+ setTimeout(() => {
223
+ child.kill();
224
+ resolve(false);
225
+ }, 5000);
226
+ });
227
+ }
228
+ /**
229
+ * List available model IDs
230
+ */
231
+ listModels() {
232
+ return CODEX_MODELS.map((m) => m.id);
233
+ }
234
+ /**
235
+ * Get detailed model information
236
+ */
237
+ getModelInfo() {
238
+ return [...CODEX_MODELS];
239
+ }
240
+ /**
241
+ * Get the default model for a role
242
+ */
243
+ getDefaultModel(role) {
244
+ return DEFAULT_MODELS[role];
245
+ }
246
+ }
247
+ /**
248
+ * Create a Codex provider instance
249
+ */
250
+ export function createCodexProvider() {
251
+ return new CodexProvider();
252
+ }
253
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../src/providers/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Gemini Provider
3
+ * Implementation for Google Gemini CLI
4
+ */
5
+ import { BaseAIProvider, type InvokeOptions, type InvokeResult, type ModelInfo } from './interface.js';
6
+ /**
7
+ * Gemini AI Provider implementation
8
+ */
9
+ export declare class GeminiProvider extends BaseAIProvider {
10
+ readonly name = "gemini";
11
+ readonly displayName = "Google Gemini";
12
+ /**
13
+ * Write prompt to a temporary file
14
+ */
15
+ private writePromptFile;
16
+ /**
17
+ * Clean up temporary prompt file
18
+ */
19
+ private cleanupPromptFile;
20
+ /**
21
+ * Get the default invocation template
22
+ */
23
+ getDefaultInvocationTemplate(): string;
24
+ /**
25
+ * Invoke Gemini CLI with a prompt
26
+ */
27
+ invoke(prompt: string, options: InvokeOptions): Promise<InvokeResult>;
28
+ /**
29
+ * Invoke Gemini CLI with a prompt file using the invocation template
30
+ */
31
+ private invokeWithFile;
32
+ /**
33
+ * Check if Gemini CLI is available
34
+ * Checks for both 'gemini' and 'gcloud' CLIs
35
+ */
36
+ isAvailable(): Promise<boolean>;
37
+ /**
38
+ * Check if a specific CLI is available
39
+ */
40
+ private checkCliAvailable;
41
+ /**
42
+ * List available model IDs
43
+ */
44
+ listModels(): string[];
45
+ /**
46
+ * Get detailed model information
47
+ */
48
+ getModelInfo(): ModelInfo[];
49
+ /**
50
+ * Get the default model for a role
51
+ */
52
+ getDefaultModel(role: 'orchestrator' | 'coder' | 'reviewer'): string;
53
+ }
54
+ /**
55
+ * Create a Gemini provider instance
56
+ */
57
+ export declare function createGeminiProvider(): GeminiProvider;
58
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EACL,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AA8CxB;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,mBAAmB;IAEvC;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,4BAA4B,IAAI,MAAM;IAItC;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB3E;;OAEG;IACH,OAAO,CAAC,cAAc;IAmFtB;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuBzB;;OAEG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;OAEG;IACH,YAAY,IAAI,SAAS,EAAE;IAI3B;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM;CAGrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}