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,589 @@
1
+ /**
2
+ * Database query functions for tasks, sections, and audit
3
+ */
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ // Status markers for display
6
+ export const STATUS_MARKERS = {
7
+ pending: '[ ]',
8
+ in_progress: '[-]',
9
+ review: '[o]',
10
+ completed: '[x]',
11
+ disputed: '[!]',
12
+ failed: '[F]',
13
+ skipped: '[S]', // Fully skipped - external setup required
14
+ partial: '[s]', // Partial - coded what we could, rest is external
15
+ };
16
+ // ============ Section Operations ============
17
+ export function createSection(db, name, position) {
18
+ const id = uuidv4();
19
+ // Get max position if not specified
20
+ if (position === undefined) {
21
+ const maxPos = db
22
+ .prepare('SELECT MAX(position) as max FROM sections')
23
+ .get();
24
+ position = (maxPos?.max ?? -1) + 1;
25
+ }
26
+ db.prepare(`INSERT INTO sections (id, name, position) VALUES (?, ?, ?)`).run(id, name, position);
27
+ return {
28
+ id,
29
+ name,
30
+ position,
31
+ created_at: new Date().toISOString(),
32
+ };
33
+ }
34
+ export function listSections(db) {
35
+ return db
36
+ .prepare('SELECT * FROM sections ORDER BY position ASC')
37
+ .all();
38
+ }
39
+ export function getSection(db, id) {
40
+ // Try exact match first
41
+ let section = db
42
+ .prepare('SELECT * FROM sections WHERE id = ?')
43
+ .get(id);
44
+ // If not found, try prefix match (for short IDs)
45
+ if (!section && id.length >= 4) {
46
+ const matches = db
47
+ .prepare('SELECT * FROM sections WHERE id LIKE ?')
48
+ .all(`${id}%`);
49
+ if (matches.length === 1) {
50
+ section = matches[0];
51
+ }
52
+ else if (matches.length > 1) {
53
+ // Ambiguous prefix - throw error with suggestions
54
+ const matchingIds = matches.map(s => `${s.id.substring(0, 8)} (${s.name})`).join(', ');
55
+ throw new Error(`Ambiguous section prefix "${id}". Matches: ${matchingIds}. ` +
56
+ `Please provide a longer prefix or use the full section name.`);
57
+ }
58
+ // If 0 matches, section remains null and will be handled by caller
59
+ }
60
+ return section;
61
+ }
62
+ export function getSectionByName(db, name) {
63
+ return db
64
+ .prepare('SELECT * FROM sections WHERE name = ?')
65
+ .get(name);
66
+ }
67
+ const FEEDBACK_SECTION_NAME = 'Needs User Input';
68
+ export function getOrCreateFeedbackSection(db) {
69
+ const existing = getSectionByName(db, FEEDBACK_SECTION_NAME);
70
+ if (existing)
71
+ return existing;
72
+ const maxPos = db
73
+ .prepare('SELECT MAX(position) as max FROM sections')
74
+ .get();
75
+ const position = (maxPos?.max ?? -1) + 1;
76
+ const id = uuidv4();
77
+ db.prepare(`INSERT INTO sections (id, name, position, priority, skipped) VALUES (?, ?, ?, ?, ?)`).run(id, FEEDBACK_SECTION_NAME, position, 100, 1);
78
+ return { id, name: FEEDBACK_SECTION_NAME, position, priority: 100, skipped: 1, created_at: new Date().toISOString() };
79
+ }
80
+ export function getSectionTaskCount(db, sectionId) {
81
+ const result = db
82
+ .prepare('SELECT COUNT(*) as count FROM tasks WHERE section_id = ?')
83
+ .get(sectionId);
84
+ return result.count;
85
+ }
86
+ /**
87
+ * Get dependencies for a section that have incomplete tasks
88
+ * Returns sections that the given section depends on and have any non-completed tasks
89
+ * (pending, in_progress, review, disputed, failed, skipped, partial)
90
+ */
91
+ export function getPendingDependencies(db, sectionId) {
92
+ return db
93
+ .prepare(`SELECT DISTINCT s.*
94
+ FROM sections s
95
+ INNER JOIN section_dependencies sd ON s.id = sd.depends_on_section_id
96
+ WHERE sd.section_id = ?
97
+ AND EXISTS (
98
+ SELECT 1 FROM tasks t
99
+ WHERE t.section_id = s.id
100
+ AND t.status != 'completed'
101
+ )
102
+ ORDER BY s.position ASC`)
103
+ .all(sectionId);
104
+ }
105
+ /**
106
+ * Check if all dependencies for a section are met
107
+ * Dependencies are considered met when all tasks in dependent sections are completed
108
+ */
109
+ export function hasDependenciesMet(db, sectionId) {
110
+ const pendingDeps = getPendingDependencies(db, sectionId);
111
+ return pendingDeps.length === 0;
112
+ }
113
+ /**
114
+ * Set the priority of a section
115
+ * Priority range: 0 (highest) to 100 (lowest), default is 50
116
+ */
117
+ export function setSectionPriority(db, sectionId, priority) {
118
+ if (priority < 0 || priority > 100) {
119
+ throw new Error('Priority must be between 0 and 100');
120
+ }
121
+ const result = db
122
+ .prepare('UPDATE sections SET priority = ? WHERE id = ?')
123
+ .run(priority, sectionId);
124
+ if (result.changes === 0) {
125
+ throw new Error(`Section not found: ${sectionId}`);
126
+ }
127
+ }
128
+ /**
129
+ * Check if adding a dependency would create a circular dependency
130
+ * Returns true if circular dependency would be created
131
+ */
132
+ export function wouldCreateCircularDependency(db, sectionId, dependsOnSectionId) {
133
+ // Self-dependency is always circular
134
+ if (sectionId === dependsOnSectionId) {
135
+ return true;
136
+ }
137
+ // Build dependency graph
138
+ const visited = new Set();
139
+ const recursionStack = new Set();
140
+ function hasCycle(currentId) {
141
+ if (recursionStack.has(currentId)) {
142
+ return true; // Found a cycle
143
+ }
144
+ if (visited.has(currentId)) {
145
+ return false; // Already checked this path
146
+ }
147
+ visited.add(currentId);
148
+ recursionStack.add(currentId);
149
+ // Get all sections that currentId depends on
150
+ const deps = db
151
+ .prepare(`SELECT depends_on_section_id FROM section_dependencies WHERE section_id = ?`)
152
+ .all(currentId);
153
+ // Add the proposed new dependency for simulation
154
+ if (currentId === sectionId) {
155
+ deps.push({ depends_on_section_id: dependsOnSectionId });
156
+ }
157
+ for (const dep of deps) {
158
+ if (hasCycle(dep.depends_on_section_id)) {
159
+ return true;
160
+ }
161
+ }
162
+ recursionStack.delete(currentId);
163
+ return false;
164
+ }
165
+ return hasCycle(sectionId);
166
+ }
167
+ /**
168
+ * Add a dependency between sections
169
+ * Makes sectionId depend on dependsOnSectionId
170
+ */
171
+ export function addSectionDependency(db, sectionId, dependsOnSectionId) {
172
+ // Check for circular dependencies
173
+ if (wouldCreateCircularDependency(db, sectionId, dependsOnSectionId)) {
174
+ throw new Error('Cannot add dependency: would create a circular dependency');
175
+ }
176
+ const id = uuidv4();
177
+ try {
178
+ db.prepare(`INSERT INTO section_dependencies (id, section_id, depends_on_section_id)
179
+ VALUES (?, ?, ?)`).run(id, sectionId, dependsOnSectionId);
180
+ return {
181
+ id,
182
+ section_id: sectionId,
183
+ depends_on_section_id: dependsOnSectionId,
184
+ created_at: new Date().toISOString(),
185
+ };
186
+ }
187
+ catch (error) {
188
+ if (error.message?.includes('UNIQUE constraint')) {
189
+ throw new Error('This dependency already exists');
190
+ }
191
+ if (error.message?.includes('FOREIGN KEY constraint')) {
192
+ throw new Error('One or both section IDs are invalid');
193
+ }
194
+ throw error;
195
+ }
196
+ }
197
+ /**
198
+ * Remove a dependency between sections
199
+ */
200
+ export function removeSectionDependency(db, sectionId, dependsOnSectionId) {
201
+ const result = db
202
+ .prepare(`DELETE FROM section_dependencies
203
+ WHERE section_id = ? AND depends_on_section_id = ?`)
204
+ .run(sectionId, dependsOnSectionId);
205
+ if (result.changes === 0) {
206
+ throw new Error('Dependency not found');
207
+ }
208
+ }
209
+ /**
210
+ * Get all dependencies for a section
211
+ */
212
+ export function getSectionDependencies(db, sectionId) {
213
+ return db
214
+ .prepare(`SELECT s.*
215
+ FROM sections s
216
+ INNER JOIN section_dependencies sd ON s.id = sd.depends_on_section_id
217
+ WHERE sd.section_id = ?
218
+ ORDER BY s.position ASC`)
219
+ .all(sectionId);
220
+ }
221
+ /**
222
+ * Get all sections that depend on a given section
223
+ */
224
+ export function getSectionDependents(db, sectionId) {
225
+ return db
226
+ .prepare(`SELECT s.*
227
+ FROM sections s
228
+ INNER JOIN section_dependencies sd ON s.id = sd.section_id
229
+ WHERE sd.depends_on_section_id = ?
230
+ ORDER BY s.position ASC`)
231
+ .all(sectionId);
232
+ }
233
+ // ============ Task Operations ============
234
+ export function createTask(db, title, options = {}) {
235
+ const id = uuidv4();
236
+ const status = options.status ?? 'pending';
237
+ db.prepare(`INSERT INTO tasks (id, title, status, section_id, source_file, file_path, file_line, file_commit_sha, file_content_hash)
238
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, title, status, options.sectionId ?? null, options.sourceFile ?? null, options.filePath ?? null, options.fileLine ?? null, options.fileCommitSha ?? null, options.fileContentHash ?? null);
239
+ // Add audit entry for creation
240
+ addAuditEntry(db, id, null, status, 'human:cli');
241
+ return {
242
+ id,
243
+ title,
244
+ status,
245
+ section_id: options.sectionId ?? null,
246
+ source_file: options.sourceFile ?? null,
247
+ file_path: options.filePath ?? null,
248
+ file_line: options.fileLine ?? null,
249
+ file_commit_sha: options.fileCommitSha ?? null,
250
+ file_content_hash: options.fileContentHash ?? null,
251
+ rejection_count: 0,
252
+ created_at: new Date().toISOString(),
253
+ updated_at: new Date().toISOString(),
254
+ };
255
+ }
256
+ export function getTask(db, id) {
257
+ // Try exact match first
258
+ let task = db
259
+ .prepare('SELECT * FROM tasks WHERE id = ?')
260
+ .get(id);
261
+ // If not found, try prefix match (for short IDs)
262
+ if (!task && id.length >= 6) {
263
+ task = db
264
+ .prepare('SELECT * FROM tasks WHERE id LIKE ?')
265
+ .get(`${id}%`);
266
+ }
267
+ return task;
268
+ }
269
+ export function getTaskByTitle(db, title) {
270
+ // Exact match first
271
+ let task = db
272
+ .prepare('SELECT * FROM tasks WHERE title = ?')
273
+ .get(title);
274
+ if (!task) {
275
+ // Partial match
276
+ task = db
277
+ .prepare('SELECT * FROM tasks WHERE title LIKE ?')
278
+ .get(`%${title}%`);
279
+ }
280
+ return task;
281
+ }
282
+ export function listTasks(db, options = {}) {
283
+ let sql = `
284
+ SELECT t.* FROM tasks t
285
+ LEFT JOIN sections s ON t.section_id = s.id
286
+ WHERE 1=1
287
+ `;
288
+ const params = [];
289
+ if (options.status && options.status !== 'all') {
290
+ sql += ' AND t.status = ?';
291
+ params.push(options.status);
292
+ }
293
+ if (options.sectionId) {
294
+ sql += ' AND t.section_id = ?';
295
+ params.push(options.sectionId);
296
+ }
297
+ if (options.search) {
298
+ sql += ' AND t.title LIKE ?';
299
+ params.push(`%${options.search}%`);
300
+ }
301
+ // Sort by status priority (in_progress first, completed/skipped last)
302
+ sql += ` ORDER BY
303
+ CASE t.status
304
+ WHEN 'in_progress' THEN 1
305
+ WHEN 'review' THEN 2
306
+ WHEN 'pending' THEN 3
307
+ WHEN 'disputed' THEN 4
308
+ WHEN 'failed' THEN 5
309
+ WHEN 'partial' THEN 6
310
+ WHEN 'skipped' THEN 7
311
+ WHEN 'completed' THEN 8
312
+ ELSE 9
313
+ END,
314
+ COALESCE(s.position, 999999),
315
+ t.created_at`;
316
+ return db.prepare(sql).all(...params);
317
+ }
318
+ export function updateTaskStatus(db, taskId, newStatus, actor, notes, commitSha) {
319
+ const task = getTask(db, taskId);
320
+ if (!task) {
321
+ throw new Error(`Task not found: ${taskId}`);
322
+ }
323
+ const oldStatus = task.status;
324
+ db.prepare(`UPDATE tasks SET status = ?, updated_at = datetime('now') WHERE id = ?`).run(newStatus, taskId);
325
+ addAuditEntry(db, taskId, oldStatus, newStatus, actor, notes, commitSha);
326
+ }
327
+ /**
328
+ * Reset rejection count to 0 (keeps audit history)
329
+ * Use when manually restarting a task after spec changes
330
+ */
331
+ export function resetRejectionCount(db, taskId, actor, notes) {
332
+ const task = getTask(db, taskId);
333
+ if (!task) {
334
+ throw new Error(`Task not found: ${taskId}`);
335
+ }
336
+ const oldCount = task.rejection_count;
337
+ db.prepare(`UPDATE tasks SET rejection_count = 0, updated_at = datetime('now') WHERE id = ?`).run(taskId);
338
+ // Record in audit trail
339
+ addAuditEntry(db, taskId, task.status, task.status, actor, notes ?? `Rejection count reset from ${oldCount} to 0`);
340
+ return oldCount;
341
+ }
342
+ export function approveTask(db, taskId, model, notes, commitSha) {
343
+ updateTaskStatus(db, taskId, 'completed', `model:${model}`, notes, commitSha);
344
+ }
345
+ export function rejectTask(db, taskId, model, notes, commitSha) {
346
+ const task = getTask(db, taskId);
347
+ if (!task) {
348
+ throw new Error(`Task not found: ${taskId}`);
349
+ }
350
+ const newRejectionCount = task.rejection_count + 1;
351
+ if (newRejectionCount >= 15) {
352
+ // Task failed - exceeded max rejections
353
+ db.prepare(`UPDATE tasks SET status = 'failed', rejection_count = ?, updated_at = datetime('now')
354
+ WHERE id = ?`).run(newRejectionCount, taskId);
355
+ addAuditEntry(db, taskId, task.status, 'failed', `model:${model}`, `Exceeded 15 rejections. Last note: ${notes ?? 'none'}`, commitSha);
356
+ // Create system dispute
357
+ createSystemDisputeForRejection(db, taskId, 'Exceeded 15 rejections');
358
+ return { status: 'failed', rejectionCount: newRejectionCount };
359
+ }
360
+ // Normal rejection - back to in_progress
361
+ db.prepare(`UPDATE tasks SET status = 'in_progress', rejection_count = ?, updated_at = datetime('now')
362
+ WHERE id = ?`).run(newRejectionCount, taskId);
363
+ addAuditEntry(db, taskId, task.status, 'in_progress', `model:${model}`, notes, commitSha);
364
+ return { status: 'retry', rejectionCount: newRejectionCount };
365
+ }
366
+ export function addAuditEntry(db, taskId, fromStatus, toStatus, actor, options, commitSha) {
367
+ // Support legacy signature: addAuditEntry(db, taskId, from, to, actor, notes, commitSha)
368
+ if (typeof options === 'string' || options === undefined) {
369
+ const notes = options;
370
+ db.prepare(`INSERT INTO audit (task_id, from_status, to_status, actor, actor_type, model, notes, commit_sha)
371
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(taskId, fromStatus, toStatus, actor, 'human', null, notes ?? null, commitSha ?? null);
372
+ return;
373
+ }
374
+ // New signature with options object
375
+ db.prepare(`INSERT INTO audit (task_id, from_status, to_status, actor, actor_type, model, notes, commit_sha)
376
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(taskId, fromStatus, toStatus, actor, options.actorType ?? 'human', options.model ?? null, options.notes ?? null, options.commitSha ?? null);
377
+ }
378
+ export function getTaskAudit(db, taskId) {
379
+ return db
380
+ .prepare('SELECT * FROM audit WHERE task_id = ? ORDER BY created_at ASC')
381
+ .all(taskId);
382
+ }
383
+ /**
384
+ * Get rejection history for a task
385
+ * Returns entries where a review was rejected (review -> in_progress)
386
+ * Includes commit hash for easy reference
387
+ */
388
+ export function getTaskRejections(db, taskId) {
389
+ const rejections = db
390
+ .prepare(`SELECT notes, commit_sha, actor, created_at
391
+ FROM audit
392
+ WHERE task_id = ?
393
+ AND from_status = 'review'
394
+ AND to_status = 'in_progress'
395
+ ORDER BY created_at ASC`)
396
+ .all(taskId);
397
+ return rejections.map((r, index) => ({
398
+ rejection_number: index + 1,
399
+ commit_sha: r.commit_sha,
400
+ notes: r.notes,
401
+ actor: r.actor,
402
+ created_at: r.created_at,
403
+ }));
404
+ }
405
+ /**
406
+ * Get the latest submission notes (when coder submitted for review)
407
+ * This captures any notes the coder included with --notes flag
408
+ */
409
+ export function getLatestSubmissionNotes(db, taskId) {
410
+ const entry = db
411
+ .prepare(`SELECT notes FROM audit
412
+ WHERE task_id = ?
413
+ AND to_status = 'review'
414
+ ORDER BY created_at DESC
415
+ LIMIT 1`)
416
+ .get(taskId);
417
+ return entry?.notes ?? null;
418
+ }
419
+ // ============ Dispute Operations ============
420
+ // NOTE: Full dispute operations are in src/disputes/
421
+ // This is a minimal helper for backward compatibility with rejectTask
422
+ export function createSystemDisputeForRejection(db, taskId, reason) {
423
+ const id = uuidv4();
424
+ db.prepare(`INSERT INTO disputes (id, task_id, type, reason, created_by, coder_position)
425
+ VALUES (?, ?, 'system', ?, 'system', ?)`).run(id, taskId, reason, 'Task exceeded maximum rejection count and requires human intervention.');
426
+ return id;
427
+ }
428
+ // ============ Task Selection (for orchestrator) ============
429
+ /**
430
+ * Helper to filter out tasks from sections with unmet dependencies
431
+ */
432
+ function filterTasksWithMetDependencies(db, tasks) {
433
+ return tasks.filter(task => {
434
+ if (!task.section_id) {
435
+ // Tasks without a section are always allowed
436
+ return true;
437
+ }
438
+ // Check if section has all dependencies met
439
+ return hasDependenciesMet(db, task.section_id);
440
+ });
441
+ }
442
+ export function findNextTask(db, sectionId) {
443
+ // Build WHERE clause for section filtering
444
+ const sectionFilter = sectionId ? 'AND t.section_id = ?' : '';
445
+ const sectionParams = sectionId ? [sectionId] : [];
446
+ // Exclude tasks in skipped sections unless a specific section was requested
447
+ const skipFilter = sectionId ? '' : 'AND (s.skipped IS NULL OR s.skipped = 0)';
448
+ // Priority 1: Tasks ready for review
449
+ const reviewTasks = db
450
+ .prepare(`SELECT t.* FROM tasks t
451
+ LEFT JOIN sections s ON t.section_id = s.id
452
+ WHERE t.status = 'review' ${sectionFilter} ${skipFilter}
453
+ ORDER BY COALESCE(s.position, 999999), t.created_at`)
454
+ .all(...sectionParams);
455
+ const filteredReviewTasks = filterTasksWithMetDependencies(db, reviewTasks);
456
+ if (filteredReviewTasks.length > 0) {
457
+ return { task: filteredReviewTasks[0], action: 'review' };
458
+ }
459
+ // Priority 2: Tasks in progress
460
+ const inProgressTasks = db
461
+ .prepare(`SELECT t.* FROM tasks t
462
+ LEFT JOIN sections s ON t.section_id = s.id
463
+ WHERE t.status = 'in_progress' ${sectionFilter} ${skipFilter}
464
+ ORDER BY COALESCE(s.position, 999999), t.created_at`)
465
+ .all(...sectionParams);
466
+ const filteredInProgressTasks = filterTasksWithMetDependencies(db, inProgressTasks);
467
+ if (filteredInProgressTasks.length > 0) {
468
+ return { task: filteredInProgressTasks[0], action: 'resume' };
469
+ }
470
+ // Priority 3: Pending tasks
471
+ const pendingTasks = db
472
+ .prepare(`SELECT t.* FROM tasks t
473
+ LEFT JOIN sections s ON t.section_id = s.id
474
+ WHERE t.status = 'pending' ${sectionFilter} ${skipFilter}
475
+ ORDER BY COALESCE(s.position, 999999), t.created_at`)
476
+ .all(...sectionParams);
477
+ const filteredPendingTasks = filterTasksWithMetDependencies(db, pendingTasks);
478
+ if (filteredPendingTasks.length > 0) {
479
+ return { task: filteredPendingTasks[0], action: 'start' };
480
+ }
481
+ return { task: null, action: 'idle' };
482
+ }
483
+ /**
484
+ * Get the last rejection notes for a task
485
+ */
486
+ export function getLastRejectionNotes(db, taskId) {
487
+ const entry = db
488
+ .prepare(`SELECT notes FROM audit
489
+ WHERE task_id = ? AND to_status = 'in_progress' AND notes IS NOT NULL
490
+ ORDER BY created_at DESC LIMIT 1`)
491
+ .get(taskId);
492
+ return entry?.notes ?? null;
493
+ }
494
+ /**
495
+ * Get task counts by status for project stats
496
+ * Used by runner heartbeat to update global database
497
+ */
498
+ export function getTaskCountsByStatus(db) {
499
+ const rows = db
500
+ .prepare('SELECT status, COUNT(*) as count FROM tasks GROUP BY status')
501
+ .all();
502
+ const counts = {
503
+ pending: 0,
504
+ in_progress: 0,
505
+ review: 0,
506
+ completed: 0,
507
+ };
508
+ for (const row of rows) {
509
+ if (row.status === 'pending') {
510
+ counts.pending = row.count;
511
+ }
512
+ else if (row.status === 'in_progress') {
513
+ counts.in_progress = row.count;
514
+ }
515
+ else if (row.status === 'review') {
516
+ counts.review = row.count;
517
+ }
518
+ else if (row.status === 'completed') {
519
+ counts.completed = row.count;
520
+ }
521
+ }
522
+ return counts;
523
+ }
524
+ /**
525
+ * Log an LLM invocation for a task
526
+ * This stores the full prompt and response for debugging
527
+ */
528
+ export function createTaskInvocation(db, params) {
529
+ const result = db.prepare(`INSERT INTO task_invocations (
530
+ task_id, role, provider, model, prompt, response, error,
531
+ exit_code, duration_ms, success, timed_out, rejection_number
532
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(params.taskId, params.role, params.provider, params.model, params.prompt, params.response ?? null, params.error ?? null, params.exitCode, params.durationMs, params.success ? 1 : 0, params.timedOut ? 1 : 0, params.rejectionNumber ?? null);
533
+ return result.lastInsertRowid;
534
+ }
535
+ /**
536
+ * Get all invocations for a task
537
+ * Ordered by creation time (oldest first)
538
+ */
539
+ export function getTaskInvocations(db, taskId) {
540
+ return db
541
+ .prepare(`SELECT * FROM task_invocations
542
+ WHERE task_id = ?
543
+ ORDER BY created_at ASC`)
544
+ .all(taskId);
545
+ }
546
+ /**
547
+ * Get recent invocations for a task (limited)
548
+ * Ordered by creation time (newest first)
549
+ */
550
+ export function getRecentTaskInvocations(db, taskId, limit = 10) {
551
+ return db
552
+ .prepare(`SELECT * FROM task_invocations
553
+ WHERE task_id = ?
554
+ ORDER BY created_at DESC
555
+ LIMIT ?`)
556
+ .all(taskId, limit);
557
+ }
558
+ /**
559
+ * Get the latest invocation for a specific role
560
+ */
561
+ export function getLatestInvocation(db, taskId, role) {
562
+ return db
563
+ .prepare(`SELECT * FROM task_invocations
564
+ WHERE task_id = ? AND role = ?
565
+ ORDER BY created_at DESC
566
+ LIMIT 1`)
567
+ .get(taskId, role);
568
+ }
569
+ /**
570
+ * Get invocation count for a task
571
+ */
572
+ export function getInvocationCount(db, taskId) {
573
+ const rows = db
574
+ .prepare(`SELECT role, COUNT(*) as count
575
+ FROM task_invocations
576
+ WHERE task_id = ?
577
+ GROUP BY role`)
578
+ .all(taskId);
579
+ const counts = { coder: 0, reviewer: 0, total: 0 };
580
+ for (const row of rows) {
581
+ if (row.role === 'coder')
582
+ counts.coder = row.count;
583
+ if (row.role === 'reviewer')
584
+ counts.reviewer = row.count;
585
+ counts.total += row.count;
586
+ }
587
+ return counts;
588
+ }
589
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../../src/database/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Database schema definitions for Steroids CLI
3
+ * Creates all required tables with proper constraints
4
+ */
5
+ export declare const SCHEMA_VERSION = "0.1.0";
6
+ export declare const SCHEMA_SQL = "\n-- Schema metadata (version tracking)\nCREATE TABLE IF NOT EXISTS _schema (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Applied migrations log\nCREATE TABLE IF NOT EXISTS _migrations (\n id INTEGER PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n checksum TEXT NOT NULL,\n applied_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Sections (task groups)\nCREATE TABLE IF NOT EXISTS sections (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n position INTEGER NOT NULL,\n priority INTEGER DEFAULT 50,\n skipped INTEGER DEFAULT 0,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_sections_priority ON sections(priority);\n\n-- Tasks\nCREATE TABLE IF NOT EXISTS tasks (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n section_id TEXT REFERENCES sections(id),\n source_file TEXT,\n file_path TEXT,\n file_line INTEGER,\n file_commit_sha TEXT,\n file_content_hash TEXT,\n rejection_count INTEGER NOT NULL DEFAULT 0,\n failure_count INTEGER NOT NULL DEFAULT 0,\n last_failure_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);\nCREATE INDEX IF NOT EXISTS idx_tasks_section ON tasks(section_id);\nCREATE INDEX IF NOT EXISTS idx_tasks_failures ON tasks(failure_count) WHERE failure_count > 0;\n\n-- Audit trail (immutable log of status changes)\nCREATE TABLE IF NOT EXISTS audit (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL REFERENCES tasks(id),\n from_status TEXT,\n to_status TEXT NOT NULL,\n actor TEXT NOT NULL,\n actor_type TEXT DEFAULT 'human',\n model TEXT,\n notes TEXT,\n commit_sha TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_audit_task ON audit(task_id);\nCREATE INDEX IF NOT EXISTS idx_audit_commit ON audit(commit_sha);\n\n-- Disputes\nCREATE TABLE IF NOT EXISTS disputes (\n id TEXT PRIMARY KEY,\n task_id TEXT NOT NULL REFERENCES tasks(id),\n type TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'open',\n reason TEXT NOT NULL,\n coder_position TEXT,\n reviewer_position TEXT,\n resolution TEXT,\n resolution_notes TEXT,\n created_by TEXT NOT NULL,\n resolved_by TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n resolved_at TEXT\n);\n\nCREATE INDEX IF NOT EXISTS idx_disputes_task ON disputes(task_id);\nCREATE INDEX IF NOT EXISTS idx_disputes_status ON disputes(status);\n\n-- Task locks (for orchestrator coordination)\nCREATE TABLE IF NOT EXISTS task_locks (\n task_id TEXT PRIMARY KEY REFERENCES tasks(id),\n runner_id TEXT NOT NULL,\n acquired_at TEXT NOT NULL DEFAULT (datetime('now')),\n expires_at TEXT NOT NULL,\n heartbeat_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_task_locks_expires ON task_locks(expires_at);\n\n-- Section locks (for orchestrator coordination)\nCREATE TABLE IF NOT EXISTS section_locks (\n section_id TEXT PRIMARY KEY REFERENCES sections(id),\n runner_id TEXT NOT NULL,\n acquired_at TEXT NOT NULL DEFAULT (datetime('now')),\n expires_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_section_locks_expires ON section_locks(expires_at);\n\n-- Section dependencies (ordering constraints between sections)\nCREATE TABLE IF NOT EXISTS section_dependencies (\n id TEXT PRIMARY KEY,\n section_id TEXT NOT NULL REFERENCES sections(id),\n depends_on_section_id TEXT NOT NULL REFERENCES sections(id),\n created_at TEXT DEFAULT (datetime('now')),\n UNIQUE(section_id, depends_on_section_id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_section_dependencies_section ON section_dependencies(section_id);\nCREATE INDEX IF NOT EXISTS idx_section_dependencies_depends_on ON section_dependencies(depends_on_section_id);\n\n-- Task invocations (LLM calls per task)\nCREATE TABLE IF NOT EXISTS task_invocations (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n task_id TEXT NOT NULL REFERENCES tasks(id),\n role TEXT NOT NULL,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n prompt TEXT NOT NULL,\n response TEXT,\n error TEXT,\n started_at_ms INTEGER,\n completed_at_ms INTEGER,\n status TEXT DEFAULT 'completed' CHECK(status IN ('running', 'completed', 'failed', 'timeout')),\n exit_code INTEGER NOT NULL DEFAULT 0,\n duration_ms INTEGER NOT NULL DEFAULT 0,\n success INTEGER NOT NULL DEFAULT 0,\n timed_out INTEGER NOT NULL DEFAULT 0,\n rejection_number INTEGER,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_task_invocations_task ON task_invocations(task_id);\nCREATE INDEX IF NOT EXISTS idx_task_invocations_role ON task_invocations(role);\nCREATE INDEX IF NOT EXISTS idx_task_invocations_created ON task_invocations(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_task_invocations_task_status ON task_invocations(task_id, status, started_at_ms DESC);\n\n-- Incidents (stuck-task detection/recovery)\nCREATE TABLE IF NOT EXISTS incidents (\n id TEXT PRIMARY KEY,\n task_id TEXT REFERENCES tasks(id),\n runner_id TEXT,\n failure_mode TEXT NOT NULL,\n detected_at TEXT NOT NULL,\n resolved_at TEXT,\n resolution TEXT,\n details TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_incidents_task ON incidents(task_id);\nCREATE INDEX IF NOT EXISTS idx_incidents_detected ON incidents(detected_at);\nCREATE INDEX IF NOT EXISTS idx_incidents_unresolved ON incidents(resolved_at) WHERE resolved_at IS NULL;\n";
7
+ export declare const INITIAL_SCHEMA_DATA = "\nINSERT OR REPLACE INTO _schema (key, value) VALUES ('version', '0.1.0');\nINSERT OR REPLACE INTO _schema (key, value) VALUES ('created_at', datetime('now'));\n\n-- Mark all migrations as applied since new databases have the full schema\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (1, '001_initial_schema', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (2, '002_add_commit_sha', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (3, '003_add_section_priority', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (4, '004_add_section_dependencies', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (5, '005_add_audit_actor_model', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (6, '006_add_task_invocations', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (7, '007_add_file_anchor', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (8, '008_add_section_skipped', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (9, '009_add_incidents_and_failure_tracking', 'builtin');\nINSERT OR IGNORE INTO _migrations (id, name, checksum) VALUES (10, '010_add_lifecycle_timestamps', 'builtin');\n";
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/database/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,cAAc,UAAU,CAAC;AAEtC,eAAO,MAAM,UAAU,wmLAiKtB,CAAC;AAEF,eAAO,MAAM,mBAAmB,wyCAe/B,CAAC"}