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,160 @@
1
+ /**
2
+ * Configuration loader
3
+ * Loads and merges global and project config files
4
+ */
5
+ export interface SteroidsConfig {
6
+ ai?: {
7
+ orchestrator?: {
8
+ provider?: 'claude' | 'gemini' | 'openai';
9
+ model?: string;
10
+ cli?: string;
11
+ };
12
+ coder?: {
13
+ provider?: 'claude' | 'gemini' | 'openai';
14
+ model?: string;
15
+ cli?: string;
16
+ };
17
+ reviewer?: {
18
+ provider?: 'claude' | 'gemini' | 'openai';
19
+ model?: string;
20
+ cli?: string;
21
+ };
22
+ };
23
+ output?: {
24
+ format?: 'table' | 'json';
25
+ colors?: boolean;
26
+ verbose?: boolean;
27
+ };
28
+ git?: {
29
+ autoPush?: boolean;
30
+ remote?: string;
31
+ branch?: string;
32
+ commitPrefix?: string;
33
+ retryOnFailure?: boolean;
34
+ };
35
+ runners?: {
36
+ heartbeatInterval?: string;
37
+ staleTimeout?: string;
38
+ subprocessHangTimeout?: string;
39
+ maxConcurrent?: number;
40
+ logRetention?: string;
41
+ daemonLogs?: boolean;
42
+ };
43
+ health?: {
44
+ threshold?: number;
45
+ checks?: {
46
+ git?: boolean;
47
+ deps?: boolean;
48
+ tests?: boolean;
49
+ lint?: boolean;
50
+ };
51
+ orphanedTaskTimeout?: number;
52
+ maxCoderDuration?: number;
53
+ maxReviewerDuration?: number;
54
+ runnerHeartbeatTimeout?: number;
55
+ invocationStaleness?: number;
56
+ autoRecover?: boolean;
57
+ maxRecoveryAttempts?: number;
58
+ maxIncidentsPerHour?: number;
59
+ };
60
+ locking?: {
61
+ taskTimeout?: string;
62
+ sectionTimeout?: string;
63
+ waitTimeout?: string;
64
+ pollInterval?: string;
65
+ };
66
+ database?: {
67
+ autoMigrate?: boolean;
68
+ backupBeforeMigrate?: boolean;
69
+ };
70
+ logs?: {
71
+ retention?: string;
72
+ keepLogs?: boolean;
73
+ level?: 'debug' | 'info' | 'warn' | 'error';
74
+ };
75
+ disputes?: {
76
+ timeoutDays?: number;
77
+ autoCreateOnMaxRejections?: boolean;
78
+ majorBlocksLoop?: boolean;
79
+ coordinatorCanDispute?: boolean;
80
+ };
81
+ projects?: {
82
+ scanPaths?: string[];
83
+ excludePatterns?: string[];
84
+ };
85
+ backup?: {
86
+ enabled?: boolean;
87
+ retention?: string;
88
+ includeConfig?: boolean;
89
+ includeLogs?: boolean;
90
+ };
91
+ build?: {
92
+ timeout?: string;
93
+ };
94
+ test?: {
95
+ timeout?: string;
96
+ };
97
+ webui?: {
98
+ port?: number;
99
+ host?: string;
100
+ auth?: boolean;
101
+ };
102
+ quality?: {
103
+ tests?: {
104
+ required?: boolean;
105
+ minCoverage?: number;
106
+ };
107
+ };
108
+ sections?: {
109
+ batchMode?: boolean;
110
+ maxBatchSize?: number;
111
+ };
112
+ hooks?: unknown[];
113
+ }
114
+ /**
115
+ * Default configuration values
116
+ */
117
+ export declare const DEFAULT_CONFIG: SteroidsConfig;
118
+ /**
119
+ * Get global config path (~/.steroids/config.yaml)
120
+ */
121
+ export declare function getGlobalConfigPath(): string;
122
+ /**
123
+ * Get project config path (.steroids/config.yaml)
124
+ */
125
+ export declare function getProjectConfigPath(projectPath?: string): string;
126
+ /**
127
+ * Load config from a file
128
+ * Returns empty object if file doesn't exist
129
+ */
130
+ export declare function loadConfigFile(filePath: string): Partial<SteroidsConfig>;
131
+ /**
132
+ * Deep merge two config objects
133
+ * Second object values override first
134
+ */
135
+ export declare function mergeConfigs(base: Partial<SteroidsConfig>, override: Partial<SteroidsConfig>): Partial<SteroidsConfig>;
136
+ /**
137
+ * Apply environment variable overrides
138
+ * STEROIDS_AI_CODER_MODEL -> ai.coder.model
139
+ */
140
+ export declare function applyEnvOverrides(config: Partial<SteroidsConfig>): Partial<SteroidsConfig>;
141
+ /**
142
+ * Load merged configuration
143
+ * Priority: defaults < global < project < environment
144
+ */
145
+ export declare function loadConfig(projectPath?: string): SteroidsConfig;
146
+ /**
147
+ * Save config to file
148
+ */
149
+ export declare function saveConfig(config: Partial<SteroidsConfig>, filePath: string): void;
150
+ /**
151
+ * Get a config value by dot-notation path
152
+ * e.g., getConfigValue(config, 'ai.coder.model')
153
+ */
154
+ export declare function getConfigValue(config: SteroidsConfig, path: string): unknown;
155
+ /**
156
+ * Set a config value by dot-notation path
157
+ * Returns a new config object with the value set
158
+ */
159
+ export declare function setConfigValue(config: SteroidsConfig, path: string, value: unknown): SteroidsConfig;
160
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Configuration loader
3
+ * Loads and merges global and project config files
4
+ */
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
+ import { join, dirname } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ import { parse, stringify } from 'yaml';
9
+ const STEROIDS_DIR = '.steroids';
10
+ const CONFIG_FILE = 'config.yaml';
11
+ /**
12
+ * Default configuration values
13
+ */
14
+ export const DEFAULT_CONFIG = {
15
+ ai: {
16
+ orchestrator: {
17
+ provider: 'claude',
18
+ model: 'claude-sonnet-4',
19
+ },
20
+ coder: {
21
+ provider: 'claude',
22
+ model: 'claude-sonnet-4',
23
+ },
24
+ reviewer: {
25
+ provider: 'claude',
26
+ model: 'claude-sonnet-4',
27
+ },
28
+ },
29
+ output: {
30
+ format: 'table',
31
+ colors: true,
32
+ verbose: false,
33
+ },
34
+ git: {
35
+ autoPush: true,
36
+ remote: 'origin',
37
+ branch: 'main',
38
+ commitPrefix: '',
39
+ retryOnFailure: true,
40
+ },
41
+ runners: {
42
+ heartbeatInterval: '30s',
43
+ staleTimeout: '5m',
44
+ subprocessHangTimeout: '15m',
45
+ maxConcurrent: 1,
46
+ logRetention: '7d',
47
+ },
48
+ health: {
49
+ threshold: 80,
50
+ checks: {
51
+ git: true,
52
+ deps: true,
53
+ tests: true,
54
+ lint: true,
55
+ },
56
+ orphanedTaskTimeout: 600,
57
+ maxCoderDuration: 1800,
58
+ maxReviewerDuration: 900,
59
+ runnerHeartbeatTimeout: 300,
60
+ invocationStaleness: 600,
61
+ autoRecover: true,
62
+ maxRecoveryAttempts: 3,
63
+ maxIncidentsPerHour: 10,
64
+ },
65
+ locking: {
66
+ taskTimeout: '60m',
67
+ sectionTimeout: '120m',
68
+ waitTimeout: '30m',
69
+ pollInterval: '5s',
70
+ },
71
+ database: {
72
+ autoMigrate: true,
73
+ backupBeforeMigrate: true,
74
+ },
75
+ logs: {
76
+ retention: '30d',
77
+ keepLogs: true,
78
+ level: 'info',
79
+ },
80
+ disputes: {
81
+ timeoutDays: 7,
82
+ autoCreateOnMaxRejections: true,
83
+ majorBlocksLoop: false,
84
+ },
85
+ projects: {
86
+ scanPaths: ['~/Projects'],
87
+ excludePatterns: ['node_modules', '.git'],
88
+ },
89
+ backup: {
90
+ enabled: true,
91
+ retention: '7d',
92
+ includeConfig: true,
93
+ includeLogs: false,
94
+ },
95
+ build: {
96
+ timeout: '5m',
97
+ },
98
+ test: {
99
+ timeout: '10m',
100
+ },
101
+ webui: {
102
+ port: 3000,
103
+ host: 'localhost',
104
+ auth: false,
105
+ },
106
+ quality: {
107
+ tests: {
108
+ required: false,
109
+ },
110
+ },
111
+ sections: {
112
+ batchMode: false,
113
+ maxBatchSize: 10,
114
+ },
115
+ };
116
+ /**
117
+ * Get global config path (~/.steroids/config.yaml)
118
+ */
119
+ export function getGlobalConfigPath() {
120
+ return join(homedir(), STEROIDS_DIR, CONFIG_FILE);
121
+ }
122
+ /**
123
+ * Get project config path (.steroids/config.yaml)
124
+ */
125
+ export function getProjectConfigPath(projectPath) {
126
+ const basePath = projectPath ?? process.cwd();
127
+ return join(basePath, STEROIDS_DIR, CONFIG_FILE);
128
+ }
129
+ /**
130
+ * Load config from a file
131
+ * Returns empty object if file doesn't exist
132
+ */
133
+ export function loadConfigFile(filePath) {
134
+ if (!existsSync(filePath)) {
135
+ return {};
136
+ }
137
+ try {
138
+ const content = readFileSync(filePath, 'utf-8');
139
+ return parse(content) ?? {};
140
+ }
141
+ catch (error) {
142
+ console.warn(`Warning: Failed to parse config at ${filePath}`);
143
+ return {};
144
+ }
145
+ }
146
+ /**
147
+ * Deep merge two config objects
148
+ * Second object values override first
149
+ */
150
+ export function mergeConfigs(base, override) {
151
+ const result = { ...base };
152
+ for (const key of Object.keys(override)) {
153
+ const baseValue = base[key];
154
+ const overrideValue = override[key];
155
+ // Skip "unset" values - empty strings, null, or undefined should not override base values
156
+ // This preserves base config when override has empty/unset values
157
+ // Note: We intentionally DO NOT skip false or 0, as these are legitimate override values
158
+ if (overrideValue === undefined || overrideValue === null || overrideValue === '') {
159
+ continue;
160
+ }
161
+ if (baseValue !== null &&
162
+ typeof baseValue === 'object' &&
163
+ !Array.isArray(baseValue) &&
164
+ overrideValue !== null &&
165
+ typeof overrideValue === 'object' &&
166
+ !Array.isArray(overrideValue)) {
167
+ // Deep merge nested objects
168
+ result[key] = mergeConfigs(baseValue, overrideValue);
169
+ }
170
+ else {
171
+ // Override value
172
+ result[key] = overrideValue;
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ /**
178
+ * Apply environment variable overrides
179
+ * STEROIDS_AI_CODER_MODEL -> ai.coder.model
180
+ */
181
+ export function applyEnvOverrides(config) {
182
+ const result = { ...config };
183
+ for (const [key, value] of Object.entries(process.env)) {
184
+ if (!key.startsWith('STEROIDS_'))
185
+ continue;
186
+ // Convert STEROIDS_AI_CODER_MODEL to ['ai', 'coder', 'model']
187
+ const path = key
188
+ .substring('STEROIDS_'.length)
189
+ .toLowerCase()
190
+ .split('_');
191
+ // Set nested value
192
+ let current = result;
193
+ for (let i = 0; i < path.length - 1; i++) {
194
+ if (!(path[i] in current) || typeof current[path[i]] !== 'object') {
195
+ current[path[i]] = {};
196
+ }
197
+ current = current[path[i]];
198
+ }
199
+ // Convert value type
200
+ const finalKey = path[path.length - 1];
201
+ if (value === 'true') {
202
+ current[finalKey] = true;
203
+ }
204
+ else if (value === 'false') {
205
+ current[finalKey] = false;
206
+ }
207
+ else if (!isNaN(Number(value))) {
208
+ current[finalKey] = Number(value);
209
+ }
210
+ else {
211
+ current[finalKey] = value;
212
+ }
213
+ }
214
+ return result;
215
+ }
216
+ /**
217
+ * Load merged configuration
218
+ * Priority: defaults < global < project < environment
219
+ */
220
+ export function loadConfig(projectPath) {
221
+ // Start with defaults
222
+ let config = { ...DEFAULT_CONFIG };
223
+ // Load and merge global config
224
+ const globalConfig = loadConfigFile(getGlobalConfigPath());
225
+ config = mergeConfigs(config, globalConfig);
226
+ // Load and merge project config
227
+ const projectConfig = loadConfigFile(getProjectConfigPath(projectPath));
228
+ config = mergeConfigs(config, projectConfig);
229
+ // Apply environment overrides
230
+ config = applyEnvOverrides(config);
231
+ return config;
232
+ }
233
+ /**
234
+ * Save config to file
235
+ */
236
+ export function saveConfig(config, filePath) {
237
+ const dir = dirname(filePath);
238
+ if (!existsSync(dir)) {
239
+ mkdirSync(dir, { recursive: true });
240
+ }
241
+ const content = stringify(config, { indent: 2 });
242
+ writeFileSync(filePath, content, 'utf-8');
243
+ }
244
+ /**
245
+ * Get a config value by dot-notation path
246
+ * e.g., getConfigValue(config, 'ai.coder.model')
247
+ */
248
+ export function getConfigValue(config, path) {
249
+ const parts = path.split('.');
250
+ let current = config;
251
+ for (const part of parts) {
252
+ if (current === null || typeof current !== 'object') {
253
+ return undefined;
254
+ }
255
+ current = current[part];
256
+ }
257
+ return current;
258
+ }
259
+ /**
260
+ * Set a config value by dot-notation path
261
+ * Returns a new config object with the value set
262
+ */
263
+ export function setConfigValue(config, path, value) {
264
+ const result = JSON.parse(JSON.stringify(config));
265
+ const parts = path.split('.');
266
+ let current = result;
267
+ for (let i = 0; i < parts.length - 1; i++) {
268
+ if (!(parts[i] in current) || typeof current[parts[i]] !== 'object') {
269
+ current[parts[i]] = {};
270
+ }
271
+ current = current[parts[i]];
272
+ }
273
+ current[parts[parts.length - 1]] = value;
274
+ return result;
275
+ }
276
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * SQLite database connection management
3
+ * Uses better-sqlite3 for synchronous operations with WAL mode
4
+ */
5
+ import Database from 'better-sqlite3';
6
+ export interface DatabaseConnection {
7
+ db: Database.Database;
8
+ close: () => void;
9
+ }
10
+ /**
11
+ * Get the path to the steroids database
12
+ */
13
+ export declare function getDbPath(projectPath?: string): string;
14
+ /**
15
+ * Check if steroids is initialized in the given directory
16
+ */
17
+ export declare function isInitialized(projectPath?: string): boolean;
18
+ /**
19
+ * Initialize the database with schema
20
+ */
21
+ export declare function initDatabase(projectPath?: string): DatabaseConnection;
22
+ /**
23
+ * Open an existing database connection
24
+ * Automatically applies pending migrations if any are found
25
+ */
26
+ export declare function openDatabase(projectPath?: string): DatabaseConnection;
27
+ /**
28
+ * Get schema version from database
29
+ */
30
+ export declare function getSchemaVersion(db: Database.Database): string | null;
31
+ /**
32
+ * Check if database schema is current
33
+ */
34
+ export declare function isSchemaUpToDate(db: Database.Database): boolean;
35
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../src/database/connection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAwBrE;AAyCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAoCrE;AAsED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI,CASrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAG/D"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * SQLite database connection management
3
+ * Uses better-sqlite3 for synchronous operations with WAL mode
4
+ */
5
+ import Database from 'better-sqlite3';
6
+ import { existsSync, mkdirSync } from 'node:fs';
7
+ import { dirname, join } from 'node:path';
8
+ import { SCHEMA_SQL, INITIAL_SCHEMA_DATA, SCHEMA_VERSION } from './schema.js';
9
+ import { autoMigrate } from '../migrations/runner.js';
10
+ const STEROIDS_DIR = '.steroids';
11
+ const DB_NAME = 'steroids.db';
12
+ /**
13
+ * Get the path to the steroids database
14
+ */
15
+ export function getDbPath(projectPath) {
16
+ const basePath = projectPath || process.cwd();
17
+ return join(basePath, STEROIDS_DIR, DB_NAME);
18
+ }
19
+ /**
20
+ * Check if steroids is initialized in the given directory
21
+ */
22
+ export function isInitialized(projectPath) {
23
+ return existsSync(getDbPath(projectPath));
24
+ }
25
+ /**
26
+ * Initialize the database with schema
27
+ */
28
+ export function initDatabase(projectPath) {
29
+ const dbPath = getDbPath(projectPath);
30
+ const steroidsDir = dirname(dbPath);
31
+ // Create .steroids directory if it doesn't exist
32
+ if (!existsSync(steroidsDir)) {
33
+ mkdirSync(steroidsDir, { recursive: true });
34
+ }
35
+ const db = new Database(dbPath);
36
+ // Configure SQLite for optimal performance and safety
37
+ db.pragma('journal_mode = WAL');
38
+ db.pragma('busy_timeout = 5000');
39
+ db.pragma('foreign_keys = ON');
40
+ // Create schema
41
+ db.exec(SCHEMA_SQL);
42
+ db.exec(INITIAL_SCHEMA_DATA);
43
+ return {
44
+ db,
45
+ close: () => db.close(),
46
+ };
47
+ }
48
+ /**
49
+ * Check if an error is a schema mismatch (missing column/table)
50
+ */
51
+ function isSchemaMismatchError(err) {
52
+ if (!(err instanceof Error))
53
+ return false;
54
+ const msg = err.message.toLowerCase();
55
+ return (msg.includes('has no column named') ||
56
+ msg.includes('no such column') ||
57
+ msg.includes('no such table'));
58
+ }
59
+ /**
60
+ * Format a helpful error message for schema mismatches
61
+ */
62
+ function formatMigrationHint(originalError, migrationResult) {
63
+ const lines = [
64
+ `Database schema is out of date: ${originalError.message}`,
65
+ '',
66
+ 'Your database is missing columns or tables added in a newer version of Steroids.',
67
+ ];
68
+ if (migrationResult) {
69
+ lines.push(`Auto-migration failed: ${migrationResult}`);
70
+ }
71
+ lines.push('', 'To fix this, run:', '', ' STEROIDS_AUTO_MIGRATE=1 steroids health', '', 'Or set STEROIDS_AUTO_MIGRATE=1 in your environment to migrate automatically.');
72
+ return lines.join('\n');
73
+ }
74
+ /**
75
+ * Open an existing database connection
76
+ * Automatically applies pending migrations if any are found
77
+ */
78
+ export function openDatabase(projectPath) {
79
+ const dbPath = getDbPath(projectPath);
80
+ if (!existsSync(dbPath)) {
81
+ throw new Error(`Steroids not initialized. Run 'steroids init' first.\nExpected database at: ${dbPath}`);
82
+ }
83
+ const db = new Database(dbPath);
84
+ // Configure SQLite
85
+ db.pragma('journal_mode = WAL');
86
+ db.pragma('busy_timeout = 5000');
87
+ db.pragma('foreign_keys = ON');
88
+ // Always attempt auto-migration for pending migrations
89
+ try {
90
+ const result = autoMigrate(db, dbPath);
91
+ if (result.applied && result.migrations.length > 0) {
92
+ console.log(`Auto-migrated database: ${result.migrations.join(', ')}`);
93
+ }
94
+ if (result.error) {
95
+ console.error(`Warning: Migration issue: ${result.error}`);
96
+ }
97
+ }
98
+ catch (err) {
99
+ // Log but don't fail - the DB may still work if no new columns are needed
100
+ const msg = err instanceof Error ? err.message : String(err);
101
+ console.warn(`Warning: Could not check migrations: ${msg}`);
102
+ }
103
+ // Wrap the database with schema error interception
104
+ return {
105
+ db: wrapWithSchemaErrorHandling(db),
106
+ close: () => db.close(),
107
+ };
108
+ }
109
+ /**
110
+ * Wrap a database instance to intercept schema mismatch errors
111
+ * and provide helpful migration instructions instead of raw SQLite errors
112
+ */
113
+ function wrapWithSchemaErrorHandling(db) {
114
+ const originalPrepare = db.prepare.bind(db);
115
+ db.prepare = function wrappedPrepare(sql) {
116
+ try {
117
+ const stmt = originalPrepare(sql);
118
+ return wrapStatement(stmt);
119
+ }
120
+ catch (err) {
121
+ if (isSchemaMismatchError(err)) {
122
+ const hint = formatMigrationHint(err);
123
+ const wrapped = new Error(hint);
124
+ wrapped.name = 'MigrationRequired';
125
+ throw wrapped;
126
+ }
127
+ throw err;
128
+ }
129
+ };
130
+ // Also wrap db.exec for raw SQL execution
131
+ const originalExec = db.exec.bind(db);
132
+ db.exec = function wrappedExec(sql) {
133
+ try {
134
+ return originalExec(sql);
135
+ }
136
+ catch (err) {
137
+ if (isSchemaMismatchError(err)) {
138
+ const hint = formatMigrationHint(err);
139
+ const wrapped = new Error(hint);
140
+ wrapped.name = 'MigrationRequired';
141
+ throw wrapped;
142
+ }
143
+ throw err;
144
+ }
145
+ };
146
+ return db;
147
+ }
148
+ /**
149
+ * Wrap a prepared statement to intercept schema errors at execution time
150
+ */
151
+ function wrapStatement(stmt) {
152
+ const wrapMethod = (fn) => {
153
+ return ((...args) => {
154
+ try {
155
+ return fn.apply(stmt, args);
156
+ }
157
+ catch (err) {
158
+ if (isSchemaMismatchError(err)) {
159
+ const hint = formatMigrationHint(err);
160
+ const wrapped = new Error(hint);
161
+ wrapped.name = 'MigrationRequired';
162
+ throw wrapped;
163
+ }
164
+ throw err;
165
+ }
166
+ });
167
+ };
168
+ if (stmt.run)
169
+ stmt.run = wrapMethod(stmt.run.bind(stmt));
170
+ if (stmt.get)
171
+ stmt.get = wrapMethod(stmt.get.bind(stmt));
172
+ if (stmt.all)
173
+ stmt.all = wrapMethod(stmt.all.bind(stmt));
174
+ return stmt;
175
+ }
176
+ /**
177
+ * Get schema version from database
178
+ */
179
+ export function getSchemaVersion(db) {
180
+ try {
181
+ const row = db
182
+ .prepare('SELECT value FROM _schema WHERE key = ?')
183
+ .get('version');
184
+ return row?.value ?? null;
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ }
190
+ /**
191
+ * Check if database schema is current
192
+ */
193
+ export function isSchemaUpToDate(db) {
194
+ const version = getSchemaVersion(db);
195
+ return version === SCHEMA_VERSION;
196
+ }
197
+ //# sourceMappingURL=connection.js.map