steroids-cli 0.4.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +640 -0
  3. package/dist/cli/colors.d.ts +110 -0
  4. package/dist/cli/colors.d.ts.map +1 -0
  5. package/dist/cli/colors.js +228 -0
  6. package/dist/cli/colors.js.map +1 -0
  7. package/dist/cli/env.d.ts +159 -0
  8. package/dist/cli/env.d.ts.map +1 -0
  9. package/dist/cli/env.js +227 -0
  10. package/dist/cli/env.js.map +1 -0
  11. package/dist/cli/errors.d.ts +166 -0
  12. package/dist/cli/errors.d.ts.map +1 -0
  13. package/dist/cli/errors.js +244 -0
  14. package/dist/cli/errors.js.map +1 -0
  15. package/dist/cli/flags.d.ts +75 -0
  16. package/dist/cli/flags.d.ts.map +1 -0
  17. package/dist/cli/flags.js +232 -0
  18. package/dist/cli/flags.js.map +1 -0
  19. package/dist/cli/help.d.ts +97 -0
  20. package/dist/cli/help.d.ts.map +1 -0
  21. package/dist/cli/help.js +275 -0
  22. package/dist/cli/help.js.map +1 -0
  23. package/dist/cli/index.d.ts +13 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +29 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/interactive.d.ts +58 -0
  28. package/dist/cli/interactive.d.ts.map +1 -0
  29. package/dist/cli/interactive.js +127 -0
  30. package/dist/cli/interactive.js.map +1 -0
  31. package/dist/cli/output.d.ts +116 -0
  32. package/dist/cli/output.d.ts.map +1 -0
  33. package/dist/cli/output.js +178 -0
  34. package/dist/cli/output.js.map +1 -0
  35. package/dist/commands/about.d.ts +7 -0
  36. package/dist/commands/about.d.ts.map +1 -0
  37. package/dist/commands/about.js +259 -0
  38. package/dist/commands/about.js.map +1 -0
  39. package/dist/commands/ai.d.ts +6 -0
  40. package/dist/commands/ai.d.ts.map +1 -0
  41. package/dist/commands/ai.js +382 -0
  42. package/dist/commands/ai.js.map +1 -0
  43. package/dist/commands/backup.d.ts +3 -0
  44. package/dist/commands/backup.d.ts.map +1 -0
  45. package/dist/commands/backup.js +528 -0
  46. package/dist/commands/backup.js.map +1 -0
  47. package/dist/commands/completion.d.ts +3 -0
  48. package/dist/commands/completion.d.ts.map +1 -0
  49. package/dist/commands/completion.js +405 -0
  50. package/dist/commands/completion.js.map +1 -0
  51. package/dist/commands/config.d.ts +3 -0
  52. package/dist/commands/config.d.ts.map +1 -0
  53. package/dist/commands/config.js +665 -0
  54. package/dist/commands/config.js.map +1 -0
  55. package/dist/commands/disputes.d.ts +3 -0
  56. package/dist/commands/disputes.d.ts.map +1 -0
  57. package/dist/commands/disputes.js +499 -0
  58. package/dist/commands/disputes.js.map +1 -0
  59. package/dist/commands/gc.d.ts +3 -0
  60. package/dist/commands/gc.d.ts.map +1 -0
  61. package/dist/commands/gc.js +300 -0
  62. package/dist/commands/gc.js.map +1 -0
  63. package/dist/commands/git.d.ts +3 -0
  64. package/dist/commands/git.d.ts.map +1 -0
  65. package/dist/commands/git.js +458 -0
  66. package/dist/commands/git.js.map +1 -0
  67. package/dist/commands/health.d.ts +3 -0
  68. package/dist/commands/health.d.ts.map +1 -0
  69. package/dist/commands/health.js +604 -0
  70. package/dist/commands/health.js.map +1 -0
  71. package/dist/commands/hooks.d.ts +6 -0
  72. package/dist/commands/hooks.d.ts.map +1 -0
  73. package/dist/commands/hooks.js +529 -0
  74. package/dist/commands/hooks.js.map +1 -0
  75. package/dist/commands/init.d.ts +6 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +200 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/llm.d.ts +7 -0
  80. package/dist/commands/llm.d.ts.map +1 -0
  81. package/dist/commands/llm.js +285 -0
  82. package/dist/commands/llm.js.map +1 -0
  83. package/dist/commands/locks.d.ts +3 -0
  84. package/dist/commands/locks.d.ts.map +1 -0
  85. package/dist/commands/locks.js +431 -0
  86. package/dist/commands/locks.js.map +1 -0
  87. package/dist/commands/logs.d.ts +3 -0
  88. package/dist/commands/logs.d.ts.map +1 -0
  89. package/dist/commands/logs.js +487 -0
  90. package/dist/commands/logs.js.map +1 -0
  91. package/dist/commands/loop-phases.d.ts +11 -0
  92. package/dist/commands/loop-phases.d.ts.map +1 -0
  93. package/dist/commands/loop-phases.js +204 -0
  94. package/dist/commands/loop-phases.js.map +1 -0
  95. package/dist/commands/loop.d.ts +3 -0
  96. package/dist/commands/loop.d.ts.map +1 -0
  97. package/dist/commands/loop.js +396 -0
  98. package/dist/commands/loop.js.map +1 -0
  99. package/dist/commands/projects.d.ts +6 -0
  100. package/dist/commands/projects.d.ts.map +1 -0
  101. package/dist/commands/projects.js +362 -0
  102. package/dist/commands/projects.js.map +1 -0
  103. package/dist/commands/purge.d.ts +3 -0
  104. package/dist/commands/purge.d.ts.map +1 -0
  105. package/dist/commands/purge.js +516 -0
  106. package/dist/commands/purge.js.map +1 -0
  107. package/dist/commands/runners.d.ts +3 -0
  108. package/dist/commands/runners.d.ts.map +1 -0
  109. package/dist/commands/runners.js +1076 -0
  110. package/dist/commands/runners.js.map +1 -0
  111. package/dist/commands/scan.d.ts +3 -0
  112. package/dist/commands/scan.d.ts.map +1 -0
  113. package/dist/commands/scan.js +291 -0
  114. package/dist/commands/scan.js.map +1 -0
  115. package/dist/commands/sections-commands.d.ts +9 -0
  116. package/dist/commands/sections-commands.d.ts.map +1 -0
  117. package/dist/commands/sections-commands.js +282 -0
  118. package/dist/commands/sections-commands.js.map +1 -0
  119. package/dist/commands/sections-graph.d.ts +25 -0
  120. package/dist/commands/sections-graph.d.ts.map +1 -0
  121. package/dist/commands/sections-graph.js +180 -0
  122. package/dist/commands/sections-graph.js.map +1 -0
  123. package/dist/commands/sections.d.ts +3 -0
  124. package/dist/commands/sections.d.ts.map +1 -0
  125. package/dist/commands/sections.js +376 -0
  126. package/dist/commands/sections.js.map +1 -0
  127. package/dist/commands/stats.d.ts +6 -0
  128. package/dist/commands/stats.d.ts.map +1 -0
  129. package/dist/commands/stats.js +324 -0
  130. package/dist/commands/stats.js.map +1 -0
  131. package/dist/commands/tasks.d.ts +3 -0
  132. package/dist/commands/tasks.d.ts.map +1 -0
  133. package/dist/commands/tasks.js +1115 -0
  134. package/dist/commands/tasks.js.map +1 -0
  135. package/dist/commands/web.d.ts +7 -0
  136. package/dist/commands/web.d.ts.map +1 -0
  137. package/dist/commands/web.js +204 -0
  138. package/dist/commands/web.js.map +1 -0
  139. package/dist/config/ai-setup.d.ts +27 -0
  140. package/dist/config/ai-setup.d.ts.map +1 -0
  141. package/dist/config/ai-setup.js +432 -0
  142. package/dist/config/ai-setup.js.map +1 -0
  143. package/dist/config/browser.d.ts +9 -0
  144. package/dist/config/browser.d.ts.map +1 -0
  145. package/dist/config/browser.js +200 -0
  146. package/dist/config/browser.js.map +1 -0
  147. package/dist/config/json-schema.d.ts +28 -0
  148. package/dist/config/json-schema.d.ts.map +1 -0
  149. package/dist/config/json-schema.js +84 -0
  150. package/dist/config/json-schema.js.map +1 -0
  151. package/dist/config/loader.d.ts +152 -0
  152. package/dist/config/loader.d.ts.map +1 -0
  153. package/dist/config/loader.js +270 -0
  154. package/dist/config/loader.js.map +1 -0
  155. package/dist/config/schema.d.ts +34 -0
  156. package/dist/config/schema.d.ts.map +1 -0
  157. package/dist/config/schema.js +437 -0
  158. package/dist/config/schema.js.map +1 -0
  159. package/dist/config/validator.d.ts +32 -0
  160. package/dist/config/validator.d.ts.map +1 -0
  161. package/dist/config/validator.js +187 -0
  162. package/dist/config/validator.js.map +1 -0
  163. package/dist/database/connection.d.ts +35 -0
  164. package/dist/database/connection.d.ts.map +1 -0
  165. package/dist/database/connection.js +208 -0
  166. package/dist/database/connection.js.map +1 -0
  167. package/dist/database/queries.d.ts +218 -0
  168. package/dist/database/queries.d.ts.map +1 -0
  169. package/dist/database/queries.js +613 -0
  170. package/dist/database/queries.js.map +1 -0
  171. package/dist/database/schema.d.ts +8 -0
  172. package/dist/database/schema.d.ts.map +1 -0
  173. package/dist/database/schema.js +160 -0
  174. package/dist/database/schema.js.map +1 -0
  175. package/dist/disputes/behavior.d.ts +106 -0
  176. package/dist/disputes/behavior.d.ts.map +1 -0
  177. package/dist/disputes/behavior.js +150 -0
  178. package/dist/disputes/behavior.js.map +1 -0
  179. package/dist/disputes/create.d.ts +59 -0
  180. package/dist/disputes/create.d.ts.map +1 -0
  181. package/dist/disputes/create.js +222 -0
  182. package/dist/disputes/create.js.map +1 -0
  183. package/dist/disputes/index.d.ts +21 -0
  184. package/dist/disputes/index.d.ts.map +1 -0
  185. package/dist/disputes/index.js +76 -0
  186. package/dist/disputes/index.js.map +1 -0
  187. package/dist/disputes/markdown.d.ts +41 -0
  188. package/dist/disputes/markdown.d.ts.map +1 -0
  189. package/dist/disputes/markdown.js +261 -0
  190. package/dist/disputes/markdown.js.map +1 -0
  191. package/dist/disputes/queries.d.ts +83 -0
  192. package/dist/disputes/queries.d.ts.map +1 -0
  193. package/dist/disputes/queries.js +180 -0
  194. package/dist/disputes/queries.js.map +1 -0
  195. package/dist/disputes/resolve.d.ts +57 -0
  196. package/dist/disputes/resolve.d.ts.map +1 -0
  197. package/dist/disputes/resolve.js +171 -0
  198. package/dist/disputes/resolve.js.map +1 -0
  199. package/dist/disputes/stale.d.ts +98 -0
  200. package/dist/disputes/stale.d.ts.map +1 -0
  201. package/dist/disputes/stale.js +205 -0
  202. package/dist/disputes/stale.js.map +1 -0
  203. package/dist/disputes/types.d.ts +92 -0
  204. package/dist/disputes/types.d.ts.map +1 -0
  205. package/dist/disputes/types.js +100 -0
  206. package/dist/disputes/types.js.map +1 -0
  207. package/dist/git/push.d.ts +26 -0
  208. package/dist/git/push.d.ts.map +1 -0
  209. package/dist/git/push.js +97 -0
  210. package/dist/git/push.js.map +1 -0
  211. package/dist/git/status.d.ts +61 -0
  212. package/dist/git/status.d.ts.map +1 -0
  213. package/dist/git/status.js +251 -0
  214. package/dist/git/status.js.map +1 -0
  215. package/dist/hooks/events.d.ts +72 -0
  216. package/dist/hooks/events.d.ts.map +1 -0
  217. package/dist/hooks/events.js +120 -0
  218. package/dist/hooks/events.js.map +1 -0
  219. package/dist/hooks/index.d.ts +19 -0
  220. package/dist/hooks/index.d.ts.map +1 -0
  221. package/dist/hooks/index.js +48 -0
  222. package/dist/hooks/index.js.map +1 -0
  223. package/dist/hooks/integration.d.ts +69 -0
  224. package/dist/hooks/integration.d.ts.map +1 -0
  225. package/dist/hooks/integration.js +179 -0
  226. package/dist/hooks/integration.js.map +1 -0
  227. package/dist/hooks/merge.d.ts +115 -0
  228. package/dist/hooks/merge.d.ts.map +1 -0
  229. package/dist/hooks/merge.js +161 -0
  230. package/dist/hooks/merge.js.map +1 -0
  231. package/dist/hooks/orchestrator.d.ts +115 -0
  232. package/dist/hooks/orchestrator.d.ts.map +1 -0
  233. package/dist/hooks/orchestrator.js +226 -0
  234. package/dist/hooks/orchestrator.js.map +1 -0
  235. package/dist/hooks/payload.d.ts +294 -0
  236. package/dist/hooks/payload.d.ts.map +1 -0
  237. package/dist/hooks/payload.js +267 -0
  238. package/dist/hooks/payload.js.map +1 -0
  239. package/dist/hooks/script-runner.d.ts +63 -0
  240. package/dist/hooks/script-runner.d.ts.map +1 -0
  241. package/dist/hooks/script-runner.js +221 -0
  242. package/dist/hooks/script-runner.js.map +1 -0
  243. package/dist/hooks/templates.d.ts +104 -0
  244. package/dist/hooks/templates.d.ts.map +1 -0
  245. package/dist/hooks/templates.js +327 -0
  246. package/dist/hooks/templates.js.map +1 -0
  247. package/dist/hooks/webhook-runner.d.ts +69 -0
  248. package/dist/hooks/webhook-runner.d.ts.map +1 -0
  249. package/dist/hooks/webhook-runner.js +208 -0
  250. package/dist/hooks/webhook-runner.js.map +1 -0
  251. package/dist/index.d.ts +7 -0
  252. package/dist/index.d.ts.map +1 -0
  253. package/dist/index.js +281 -0
  254. package/dist/index.js.map +1 -0
  255. package/dist/locking/cleanup.d.ts +70 -0
  256. package/dist/locking/cleanup.d.ts.map +1 -0
  257. package/dist/locking/cleanup.js +157 -0
  258. package/dist/locking/cleanup.js.map +1 -0
  259. package/dist/locking/queries.d.ts +116 -0
  260. package/dist/locking/queries.d.ts.map +1 -0
  261. package/dist/locking/queries.js +255 -0
  262. package/dist/locking/queries.js.map +1 -0
  263. package/dist/locking/section-lock.d.ts +74 -0
  264. package/dist/locking/section-lock.d.ts.map +1 -0
  265. package/dist/locking/section-lock.js +207 -0
  266. package/dist/locking/section-lock.js.map +1 -0
  267. package/dist/locking/task-lock.d.ts +92 -0
  268. package/dist/locking/task-lock.d.ts.map +1 -0
  269. package/dist/locking/task-lock.js +246 -0
  270. package/dist/locking/task-lock.js.map +1 -0
  271. package/dist/migrations/index.d.ts +7 -0
  272. package/dist/migrations/index.d.ts.map +1 -0
  273. package/dist/migrations/index.js +37 -0
  274. package/dist/migrations/index.js.map +1 -0
  275. package/dist/migrations/manifest.d.ts +92 -0
  276. package/dist/migrations/manifest.d.ts.map +1 -0
  277. package/dist/migrations/manifest.js +270 -0
  278. package/dist/migrations/manifest.js.map +1 -0
  279. package/dist/migrations/runner.d.ts +84 -0
  280. package/dist/migrations/runner.d.ts.map +1 -0
  281. package/dist/migrations/runner.js +351 -0
  282. package/dist/migrations/runner.js.map +1 -0
  283. package/dist/orchestrator/coder.d.ts +32 -0
  284. package/dist/orchestrator/coder.d.ts.map +1 -0
  285. package/dist/orchestrator/coder.js +174 -0
  286. package/dist/orchestrator/coder.js.map +1 -0
  287. package/dist/orchestrator/coordinator.d.ts +28 -0
  288. package/dist/orchestrator/coordinator.d.ts.map +1 -0
  289. package/dist/orchestrator/coordinator.js +256 -0
  290. package/dist/orchestrator/coordinator.js.map +1 -0
  291. package/dist/orchestrator/reviewer.d.ts +35 -0
  292. package/dist/orchestrator/reviewer.d.ts.map +1 -0
  293. package/dist/orchestrator/reviewer.js +241 -0
  294. package/dist/orchestrator/reviewer.js.map +1 -0
  295. package/dist/orchestrator/task-selector.d.ts +102 -0
  296. package/dist/orchestrator/task-selector.d.ts.map +1 -0
  297. package/dist/orchestrator/task-selector.js +341 -0
  298. package/dist/orchestrator/task-selector.js.map +1 -0
  299. package/dist/prompts/coder.d.ts +36 -0
  300. package/dist/prompts/coder.d.ts.map +1 -0
  301. package/dist/prompts/coder.js +315 -0
  302. package/dist/prompts/coder.js.map +1 -0
  303. package/dist/prompts/prompt-helpers.d.ts +51 -0
  304. package/dist/prompts/prompt-helpers.d.ts.map +1 -0
  305. package/dist/prompts/prompt-helpers.js +312 -0
  306. package/dist/prompts/prompt-helpers.js.map +1 -0
  307. package/dist/prompts/reviewer.d.ts +40 -0
  308. package/dist/prompts/reviewer.d.ts.map +1 -0
  309. package/dist/prompts/reviewer.js +438 -0
  310. package/dist/prompts/reviewer.js.map +1 -0
  311. package/dist/providers/api-models.d.ts +65 -0
  312. package/dist/providers/api-models.d.ts.map +1 -0
  313. package/dist/providers/api-models.js +323 -0
  314. package/dist/providers/api-models.js.map +1 -0
  315. package/dist/providers/claude.d.ts +53 -0
  316. package/dist/providers/claude.d.ts.map +1 -0
  317. package/dist/providers/claude.js +229 -0
  318. package/dist/providers/claude.js.map +1 -0
  319. package/dist/providers/codex.d.ts +53 -0
  320. package/dist/providers/codex.d.ts.map +1 -0
  321. package/dist/providers/codex.js +214 -0
  322. package/dist/providers/codex.js.map +1 -0
  323. package/dist/providers/gemini.d.ts +58 -0
  324. package/dist/providers/gemini.d.ts.map +1 -0
  325. package/dist/providers/gemini.js +242 -0
  326. package/dist/providers/gemini.js.map +1 -0
  327. package/dist/providers/index.d.ts +13 -0
  328. package/dist/providers/index.d.ts.map +1 -0
  329. package/dist/providers/index.js +49 -0
  330. package/dist/providers/index.js.map +1 -0
  331. package/dist/providers/interface.d.ts +173 -0
  332. package/dist/providers/interface.d.ts.map +1 -0
  333. package/dist/providers/interface.js +96 -0
  334. package/dist/providers/interface.js.map +1 -0
  335. package/dist/providers/invocation-logger.d.ts +114 -0
  336. package/dist/providers/invocation-logger.d.ts.map +1 -0
  337. package/dist/providers/invocation-logger.js +298 -0
  338. package/dist/providers/invocation-logger.js.map +1 -0
  339. package/dist/providers/openai.d.ts +53 -0
  340. package/dist/providers/openai.d.ts.map +1 -0
  341. package/dist/providers/openai.js +232 -0
  342. package/dist/providers/openai.js.map +1 -0
  343. package/dist/providers/registry.d.ts +100 -0
  344. package/dist/providers/registry.d.ts.map +1 -0
  345. package/dist/providers/registry.js +178 -0
  346. package/dist/providers/registry.js.map +1 -0
  347. package/dist/runners/activity-log.d.ts +65 -0
  348. package/dist/runners/activity-log.d.ts.map +1 -0
  349. package/dist/runners/activity-log.js +148 -0
  350. package/dist/runners/activity-log.js.map +1 -0
  351. package/dist/runners/cron.d.ts +26 -0
  352. package/dist/runners/cron.d.ts.map +1 -0
  353. package/dist/runners/cron.js +176 -0
  354. package/dist/runners/cron.js.map +1 -0
  355. package/dist/runners/daemon.d.ts +71 -0
  356. package/dist/runners/daemon.d.ts.map +1 -0
  357. package/dist/runners/daemon.js +245 -0
  358. package/dist/runners/daemon.js.map +1 -0
  359. package/dist/runners/global-db.d.ts +31 -0
  360. package/dist/runners/global-db.d.ts.map +1 -0
  361. package/dist/runners/global-db.js +230 -0
  362. package/dist/runners/global-db.js.map +1 -0
  363. package/dist/runners/hang-detector.d.ts +38 -0
  364. package/dist/runners/hang-detector.d.ts.map +1 -0
  365. package/dist/runners/hang-detector.js +136 -0
  366. package/dist/runners/hang-detector.js.map +1 -0
  367. package/dist/runners/heartbeat.d.ts +39 -0
  368. package/dist/runners/heartbeat.d.ts.map +1 -0
  369. package/dist/runners/heartbeat.js +79 -0
  370. package/dist/runners/heartbeat.js.map +1 -0
  371. package/dist/runners/lock.d.ts +47 -0
  372. package/dist/runners/lock.d.ts.map +1 -0
  373. package/dist/runners/lock.js +150 -0
  374. package/dist/runners/lock.js.map +1 -0
  375. package/dist/runners/orchestrator-loop.d.ts +20 -0
  376. package/dist/runners/orchestrator-loop.d.ts.map +1 -0
  377. package/dist/runners/orchestrator-loop.js +285 -0
  378. package/dist/runners/orchestrator-loop.js.map +1 -0
  379. package/dist/runners/projects.d.ts +96 -0
  380. package/dist/runners/projects.d.ts.map +1 -0
  381. package/dist/runners/projects.js +255 -0
  382. package/dist/runners/projects.js.map +1 -0
  383. package/dist/runners/wakeup.d.ts +34 -0
  384. package/dist/runners/wakeup.d.ts.map +1 -0
  385. package/dist/runners/wakeup.js +291 -0
  386. package/dist/runners/wakeup.js.map +1 -0
  387. package/migrations/001_initial_schema.sql +106 -0
  388. package/migrations/002_add_commit_sha.sql +12 -0
  389. package/migrations/003_add_section_priority.sql +13 -0
  390. package/migrations/004_add_section_dependencies.sql +18 -0
  391. package/migrations/005_add_audit_actor_model.sql +10 -0
  392. package/migrations/006_add_task_invocations.sql +33 -0
  393. package/migrations/007_add_file_anchor.sql +14 -0
  394. package/migrations/manifest.json +62 -0
  395. package/package.json +49 -0
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Coder invocation
4
+ * Uses AI provider system for flexible LLM support
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.invokeCoder = invokeCoder;
8
+ exports.invokeCoderBatch = invokeCoderBatch;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_os_1 = require("node:os");
11
+ const node_path_1 = require("node:path");
12
+ const queries_js_1 = require("../database/queries.js");
13
+ const connection_js_1 = require("../database/connection.js");
14
+ const coder_js_1 = require("../prompts/coder.js");
15
+ const status_js_1 = require("../git/status.js");
16
+ const loader_js_1 = require("../config/loader.js");
17
+ const registry_js_1 = require("../providers/registry.js");
18
+ const invocation_logger_js_1 = require("../providers/invocation-logger.js");
19
+ /**
20
+ * Write prompt to temp file
21
+ */
22
+ function writePromptToTempFile(prompt) {
23
+ const tempPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-prompt-${Date.now()}.txt`);
24
+ (0, node_fs_1.writeFileSync)(tempPath, prompt, 'utf-8');
25
+ return tempPath;
26
+ }
27
+ /**
28
+ * Invoke AI provider with prompt
29
+ * Uses configuration to determine which provider to use
30
+ */
31
+ async function invokeProvider(promptFile, timeoutMs = 900_000, // 15 minutes default
32
+ taskId, projectPath) {
33
+ // Load configuration to get coder provider settings
34
+ // Project config overrides global config
35
+ const config = (0, loader_js_1.loadConfig)(projectPath);
36
+ const coderConfig = config.ai?.coder;
37
+ if (!coderConfig?.provider || !coderConfig?.model) {
38
+ throw new Error('Coder AI provider not configured. Run "steroids config ai coder" to configure.');
39
+ }
40
+ // Get the provider from registry
41
+ const registry = (0, registry_js_1.getProviderRegistry)();
42
+ const provider = registry.get(coderConfig.provider);
43
+ // Check if provider is available
44
+ if (!(await provider.isAvailable())) {
45
+ throw new Error(`Provider '${coderConfig.provider}' is not available. ` +
46
+ `Ensure the CLI is installed and in PATH.`);
47
+ }
48
+ // Read prompt content
49
+ const promptContent = require('fs').readFileSync(promptFile, 'utf-8');
50
+ // Invoke the provider
51
+ const result = await provider.invoke(promptContent, {
52
+ model: coderConfig.model,
53
+ timeout: timeoutMs,
54
+ cwd: process.cwd(),
55
+ promptFile,
56
+ role: 'coder',
57
+ streamOutput: true,
58
+ });
59
+ // Log the invocation (to both file and database)
60
+ (0, invocation_logger_js_1.logInvocation)(promptContent, result, {
61
+ role: 'coder',
62
+ provider: coderConfig.provider,
63
+ model: coderConfig.model,
64
+ taskId,
65
+ projectPath,
66
+ });
67
+ return {
68
+ success: result.success,
69
+ exitCode: result.exitCode,
70
+ stdout: result.stdout,
71
+ stderr: result.stderr,
72
+ duration: result.duration,
73
+ timedOut: result.timedOut,
74
+ };
75
+ }
76
+ /**
77
+ * Invoke coder for a task
78
+ * @param coordinatorGuidance Optional guidance from coordinator after repeated rejections
79
+ */
80
+ async function invokeCoder(task, projectPath, action, coordinatorGuidance) {
81
+ // Load config to show provider/model being used
82
+ const config = (0, loader_js_1.loadConfig)(projectPath);
83
+ const coderConfig = config.ai?.coder;
84
+ console.log(`\n${'='.repeat(60)}`);
85
+ console.log(`CODER: ${task.title}`);
86
+ console.log(`Action: ${action}`);
87
+ console.log(`Task ID: ${task.id}`);
88
+ console.log(`Provider: ${coderConfig?.provider ?? 'not configured'}`);
89
+ console.log(`Model: ${coderConfig?.model ?? 'not configured'}`);
90
+ if (coordinatorGuidance) {
91
+ console.log(`Coordinator guidance: included (${coordinatorGuidance.length} chars)`);
92
+ }
93
+ console.log(`${'='.repeat(60)}\n`);
94
+ // Fetch rejection history so coder can see past attempts
95
+ let rejectionHistory = [];
96
+ try {
97
+ const { db, close } = (0, connection_js_1.openDatabase)(projectPath);
98
+ rejectionHistory = (0, queries_js_1.getTaskRejections)(db, task.id);
99
+ if (rejectionHistory.length > 0) {
100
+ console.log(`Found ${rejectionHistory.length} previous rejection(s) - coder will see full history`);
101
+ }
102
+ close();
103
+ }
104
+ catch (error) {
105
+ console.warn('Could not fetch rejection history:', error);
106
+ }
107
+ const context = {
108
+ task,
109
+ projectPath,
110
+ previousStatus: task.status,
111
+ rejectionHistory,
112
+ coordinatorGuidance,
113
+ };
114
+ let prompt;
115
+ if (action === 'resume') {
116
+ // Get git status for resuming prompt
117
+ context.gitStatus = (0, status_js_1.getGitStatus)(projectPath);
118
+ context.gitDiff = (0, status_js_1.getGitDiff)(projectPath);
119
+ prompt = (0, coder_js_1.generateResumingCoderPrompt)(context);
120
+ }
121
+ else {
122
+ prompt = (0, coder_js_1.generateCoderPrompt)(context);
123
+ }
124
+ // Write prompt to temp file
125
+ const promptFile = writePromptToTempFile(prompt);
126
+ try {
127
+ const result = await invokeProvider(promptFile, 900_000, task.id, projectPath);
128
+ console.log(`\n${'='.repeat(60)}`);
129
+ console.log(`CODER COMPLETED`);
130
+ console.log(`Exit code: ${result.exitCode}`);
131
+ console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
132
+ console.log(`${'='.repeat(60)}\n`);
133
+ return result;
134
+ }
135
+ finally {
136
+ // Clean up temp file
137
+ if ((0, node_fs_1.existsSync)(promptFile)) {
138
+ (0, node_fs_1.unlinkSync)(promptFile);
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Invoke coder for a batch of tasks
144
+ */
145
+ async function invokeCoderBatch(tasks, sectionName, projectPath) {
146
+ // Load config to show provider/model being used
147
+ const config = (0, loader_js_1.loadConfig)(projectPath);
148
+ const coderConfig = config.ai?.coder;
149
+ console.log(`\n${'='.repeat(60)}`);
150
+ console.log(`BATCH CODER: Section "${sectionName}"`);
151
+ console.log(`Tasks: ${tasks.length}`);
152
+ tasks.forEach((t, i) => console.log(` ${i + 1}. ${t.title} (${t.id})`));
153
+ console.log(`Provider: ${coderConfig?.provider ?? 'not configured'}`);
154
+ console.log(`Model: ${coderConfig?.model ?? 'not configured'}`);
155
+ console.log(`${'='.repeat(60)}\n`);
156
+ const prompt = (0, coder_js_1.generateBatchCoderPrompt)({ tasks, projectPath, sectionName });
157
+ const promptFile = writePromptToTempFile(prompt);
158
+ try {
159
+ // Longer timeout for batch: base 30 minutes + 5 minutes per task
160
+ const timeoutMs = 30 * 60 * 1000 + tasks.length * 5 * 60 * 1000;
161
+ const result = await invokeProvider(promptFile, timeoutMs, undefined, projectPath);
162
+ console.log(`\n${'='.repeat(60)}`);
163
+ console.log(`BATCH CODER COMPLETED`);
164
+ console.log(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
165
+ console.log(`${'='.repeat(60)}\n`);
166
+ return { ...result, taskCount: tasks.length };
167
+ }
168
+ finally {
169
+ if ((0, node_fs_1.existsSync)(promptFile)) {
170
+ (0, node_fs_1.unlinkSync)(promptFile);
171
+ }
172
+ }
173
+ }
174
+ //# sourceMappingURL=coder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coder.js","sourceRoot":"","sources":["../../src/orchestrator/coder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Coordinator intervention
3
+ * Steps in after repeated rejections to break deadlocks
4
+ * Uses the orchestrator AI config to analyze rejection patterns
5
+ * and provide actionable guidance to the coder
6
+ */
7
+ import type { Task, RejectionEntry } from '../database/queries.js';
8
+ export interface CoordinatorContext {
9
+ sectionTasks?: {
10
+ id: string;
11
+ title: string;
12
+ status: string;
13
+ }[];
14
+ submissionNotes?: string | null;
15
+ gitDiffSummary?: string;
16
+ previousGuidance?: string;
17
+ }
18
+ export interface CoordinatorResult {
19
+ success: boolean;
20
+ guidance: string;
21
+ decision: 'guide_coder' | 'override_reviewer' | 'narrow_scope';
22
+ }
23
+ /**
24
+ * Invoke the coordinator to analyze rejection patterns and provide guidance
25
+ * Returns guidance string to inject into the coder prompt, or null if coordinator unavailable
26
+ */
27
+ export declare function invokeCoordinator(task: Task, rejectionHistory: RejectionEntry[], projectPath: string, extra?: CoordinatorContext): Promise<CoordinatorResult | null>;
28
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMnE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,GAAG,mBAAmB,GAAG,cAAc,CAAC;CAChE;AAoMD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,gBAAgB,EAAE,cAAc,EAAE,EAClC,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAuEnC"}
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ /**
3
+ * Coordinator intervention
4
+ * Steps in after repeated rejections to break deadlocks
5
+ * Uses the orchestrator AI config to analyze rejection patterns
6
+ * and provide actionable guidance to the coder
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.invokeCoordinator = invokeCoordinator;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_os_1 = require("node:os");
12
+ const node_path_1 = require("node:path");
13
+ const loader_js_1 = require("../config/loader.js");
14
+ const registry_js_1 = require("../providers/registry.js");
15
+ const invocation_logger_js_1 = require("../providers/invocation-logger.js");
16
+ const prompt_helpers_js_1 = require("../prompts/prompt-helpers.js");
17
+ /**
18
+ * Generate the coordinator prompt
19
+ * The coordinator reviews rejection history and MUST provide a path forward
20
+ * Gets full project context: architecture, spec, and user-facing perspective
21
+ */
22
+ function generateCoordinatorPrompt(task, rejectionHistory, projectPath, extra) {
23
+ const rejectionSummary = rejectionHistory.map(r => `### Rejection #${r.rejection_number}
24
+ ${r.notes || '(no notes)'}
25
+ `).join('\n---\n');
26
+ // Pull in project context so coordinator understands the bigger picture
27
+ const agentsMd = (0, prompt_helpers_js_1.getAgentsMd)(projectPath);
28
+ const specContent = (0, prompt_helpers_js_1.getSourceFileContent)(projectPath, task.source_file);
29
+ // Build optional context sections
30
+ const sectionTasksSection = extra?.sectionTasks && extra.sectionTasks.length > 1
31
+ ? `
32
+ ---
33
+
34
+ ## Other Tasks in This Section
35
+
36
+ This task is part of a group. Other tasks handle related work - don't demand this task does their job:
37
+ ${extra.sectionTasks.filter(t => t.id !== task.id).map(t => `- [${t.status}] ${t.title}`).join('\n')}
38
+ `
39
+ : '';
40
+ const submissionNotesSection = extra?.submissionNotes
41
+ ? `
42
+ ---
43
+
44
+ ## Coder's Latest Submission Notes
45
+
46
+ > ${extra.submissionNotes}
47
+ `
48
+ : '';
49
+ const diffSection = extra?.gitDiffSummary
50
+ ? `
51
+ ---
52
+
53
+ ## What The Coder Actually Changed (Latest Attempt)
54
+
55
+ \`\`\`
56
+ ${extra.gitDiffSummary}
57
+ \`\`\`
58
+ `
59
+ : '';
60
+ // Previous coordinator guidance section (prevents repeating itself)
61
+ const previousGuidanceSection = extra?.previousGuidance
62
+ ? `
63
+ ---
64
+
65
+ ## Your Previous Guidance
66
+
67
+ You previously provided this guidance for this task:
68
+
69
+ > ${extra.previousGuidance.substring(0, 500)}${extra.previousGuidance.length > 500 ? '...' : ''}
70
+
71
+ **Do NOT repeat the same guidance.** If the previous guidance didn't work, provide a DIFFERENT approach.
72
+ `
73
+ : '';
74
+ return `# COORDINATOR INTERVENTION
75
+
76
+ You are a COORDINATOR in a fully automated task system with NO human in the loop.
77
+ A task has been rejected ${rejectionHistory.length} times. You MUST provide a decision that moves the task forward.
78
+
79
+ **Your job is to MAKE A DECISION, not to escalate.** There is no human to escalate to.
80
+
81
+ **IMPORTANT: Your guidance will be sent to BOTH the coder AND the reviewer.**
82
+ - The coder will follow your guidance when implementing fixes
83
+ - The reviewer will see your decision and must respect it (especially override_reviewer decisions)
84
+
85
+ ---
86
+
87
+ ## Task Information
88
+
89
+ **Task ID:** ${task.id}
90
+ **Title:** ${task.title}
91
+ **Rejection Count:** ${task.rejection_count}/15
92
+ **Project:** ${projectPath}
93
+
94
+ ---
95
+
96
+ ## Task Specification (The Brief)
97
+
98
+ From: ${task.source_file ?? '(not specified)'}
99
+
100
+ ${specContent}
101
+
102
+ ---
103
+
104
+ ## Project Architecture & Best Practices
105
+
106
+ ${agentsMd}
107
+
108
+ ---
109
+
110
+ ## Full Rejection History
111
+
112
+ ${rejectionSummary}
113
+ ${sectionTasksSection}${submissionNotesSection}${diffSection}${previousGuidanceSection}
114
+ ---
115
+
116
+ ## Your Decision Framework
117
+
118
+ When making your decision, always consider:
119
+
120
+ 1. **Architecture** - Does the coder's approach follow the project's established patterns and best practices (see above)?
121
+ 2. **The brief** - Does the implementation actually deliver what the specification asks for?
122
+ 3. **User value** - Will this be usable and useful for the end user? Don't get bogged down in technical perfection at the expense of shipping.
123
+ 4. **Scope** - Is the reviewer asking for things outside this single task's responsibility?
124
+
125
+ ---
126
+
127
+ ## Your Analysis
128
+
129
+ 1. **Is there a pattern?** Are the same issues raised repeatedly?
130
+ 2. **Is the feedback achievable?** Can the coder do what the reviewer asks within THIS task's scope?
131
+ 3. **Is there a scope mismatch?** Is the reviewer demanding work outside this task (e.g., global coverage)?
132
+ 4. **Is there a design disagreement?** Different architectural assumptions?
133
+
134
+ ---
135
+
136
+ ## Your Response Format
137
+
138
+ DECISION: (one of: guide_coder | override_reviewer | narrow_scope)
139
+
140
+ - **guide_coder** - The reviewer is right but the coder needs clearer direction
141
+ - **override_reviewer** - The reviewer is asking for something out of scope or impossible; tell the coder what to ignore
142
+ - **narrow_scope** - Both have valid points; narrow the task scope to what's achievable
143
+
144
+ GUIDANCE:
145
+ (Your specific guidance. This will be shown to BOTH the coder AND the reviewer. Be concrete:
146
+ - Which files to modify and what changes to make
147
+ - What reviewer feedback to address vs what to ignore
148
+ - If using override_reviewer: explicitly list which reviewer demands the coder should IGNORE
149
+ - If using narrow_scope: explicitly describe the NARROWED scope the reviewer should evaluate against
150
+ - If the reviewer demands global metrics, state clearly that this is out of scope
151
+ - If there's a design disagreement, pick the approach that best fits the project architecture
152
+ - Give the coder a clear path to get this task approved)
153
+
154
+ ---
155
+
156
+ ## Rules
157
+
158
+ - You MUST provide guidance that unblocks the task. "Try again" is not guidance.
159
+ - If the reviewer demands global project metrics from a single task, tell the coder to ignore that demand
160
+ - If there's a design disagreement, PICK the approach that matches the project's architecture and tell the coder to follow it
161
+ - If the same feedback appeared 3+ times unchanged, the coder needs a fundamentally different approach - describe it
162
+ - Always ask: "Will this be usable for the end user?" - if the current approach works for users, don't block on technicalities
163
+ - Keep guidance under 500 words
164
+ - Focus on UNBLOCKING - the goal is to get this task approved on the next attempt
165
+ `;
166
+ }
167
+ /**
168
+ * Parse the coordinator's response
169
+ * Handles cases where guidance text may contain --- separators
170
+ */
171
+ function parseCoordinatorResponse(output) {
172
+ // Extract decision - look for valid decision values only
173
+ const decisionMatch = output.match(/DECISION:\s*(guide_coder|override_reviewer|narrow_scope)/i);
174
+ const rawDecision = decisionMatch?.[1]?.trim().toLowerCase();
175
+ // Validate decision is one of the allowed values
176
+ const validDecisions = ['guide_coder', 'override_reviewer', 'narrow_scope'];
177
+ const decision = validDecisions.includes(rawDecision)
178
+ ? rawDecision
179
+ : 'guide_coder';
180
+ // Extract guidance - everything after "GUIDANCE:" until end of output
181
+ // Use a greedy match since guidance is typically the last section
182
+ const guidanceMatch = output.match(/GUIDANCE:\s*([\s\S]+)$/i);
183
+ let guidance = guidanceMatch?.[1]?.trim() || output.trim();
184
+ // Strip trailing section markers that might be from prompt template leaking
185
+ guidance = guidance.replace(/\n## Rules[\s\S]*$/i, '').trim();
186
+ return {
187
+ success: true,
188
+ guidance,
189
+ decision,
190
+ };
191
+ }
192
+ /**
193
+ * Invoke the coordinator to analyze rejection patterns and provide guidance
194
+ * Returns guidance string to inject into the coder prompt, or null if coordinator unavailable
195
+ */
196
+ async function invokeCoordinator(task, rejectionHistory, projectPath, extra) {
197
+ const config = (0, loader_js_1.loadConfig)(projectPath);
198
+ const orchestratorConfig = config.ai?.orchestrator;
199
+ // If no orchestrator configured, fall back to reviewer config
200
+ const providerName = orchestratorConfig?.provider || config.ai?.reviewer?.provider;
201
+ const modelName = orchestratorConfig?.model || config.ai?.reviewer?.model;
202
+ if (!providerName || !modelName) {
203
+ console.warn('No orchestrator or reviewer AI configured - skipping coordinator intervention');
204
+ return null;
205
+ }
206
+ console.log(`\n${'='.repeat(60)}`);
207
+ console.log(`COORDINATOR: Analyzing rejections for "${task.title}"`);
208
+ console.log(`Rejection count: ${task.rejection_count}`);
209
+ console.log(`Provider: ${providerName} / ${modelName}`);
210
+ console.log(`${'='.repeat(60)}\n`);
211
+ const registry = (0, registry_js_1.getProviderRegistry)();
212
+ const provider = registry.get(providerName);
213
+ if (!(await provider.isAvailable())) {
214
+ console.warn(`Coordinator provider '${providerName}' not available - skipping`);
215
+ return null;
216
+ }
217
+ const prompt = generateCoordinatorPrompt(task, rejectionHistory, projectPath, extra);
218
+ // Write prompt to temp file
219
+ const tempPath = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `steroids-coordinator-${Date.now()}.txt`);
220
+ (0, node_fs_1.writeFileSync)(tempPath, prompt, 'utf-8');
221
+ try {
222
+ const result = await provider.invoke(prompt, {
223
+ model: modelName,
224
+ timeout: 300_000, // 5 minutes for coordinator
225
+ cwd: projectPath,
226
+ promptFile: tempPath,
227
+ role: 'orchestrator',
228
+ streamOutput: false,
229
+ });
230
+ // Log the invocation
231
+ (0, invocation_logger_js_1.logInvocation)(prompt, result, {
232
+ role: 'orchestrator',
233
+ provider: providerName,
234
+ model: modelName,
235
+ taskId: task.id,
236
+ projectPath,
237
+ });
238
+ if (!result.success) {
239
+ console.warn('Coordinator invocation failed - continuing without guidance');
240
+ return null;
241
+ }
242
+ const parsed = parseCoordinatorResponse(result.stdout);
243
+ console.log(`\n${'='.repeat(60)}`);
244
+ console.log('COORDINATOR RESULT');
245
+ console.log(`Decision: ${parsed.decision}`);
246
+ console.log(`Guidance length: ${parsed.guidance.length} chars`);
247
+ console.log(`${'='.repeat(60)}\n`);
248
+ return parsed;
249
+ }
250
+ finally {
251
+ if ((0, node_fs_1.existsSync)(tempPath)) {
252
+ (0, node_fs_1.unlinkSync)(tempPath);
253
+ }
254
+ }
255
+ }
256
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Reviewer invocation
3
+ * Uses AI provider system for flexible LLM support
4
+ */
5
+ import type { Task } from '../database/queries.js';
6
+ export interface ReviewerResult {
7
+ success: boolean;
8
+ exitCode: number;
9
+ stdout: string;
10
+ stderr: string;
11
+ duration: number;
12
+ timedOut: boolean;
13
+ decision?: 'approve' | 'reject' | 'dispute';
14
+ notes?: string;
15
+ }
16
+ export interface BatchReviewerResult {
17
+ success: boolean;
18
+ exitCode: number;
19
+ stdout: string;
20
+ stderr: string;
21
+ duration: number;
22
+ timedOut: boolean;
23
+ taskCount: number;
24
+ }
25
+ /**
26
+ * Invoke reviewer for a task
27
+ * @param coordinatorGuidance Optional guidance from coordinator after repeated rejections
28
+ * @param coordinatorDecision Optional decision type from coordinator
29
+ */
30
+ export declare function invokeReviewer(task: Task, projectPath: string, coordinatorGuidance?: string, coordinatorDecision?: string): Promise<ReviewerResult>;
31
+ /**
32
+ * Invoke reviewer for a batch of tasks
33
+ */
34
+ export declare function invokeReviewerBatch(tasks: Task[], sectionName: string, projectPath: string): Promise<BatchReviewerResult>;
35
+ //# sourceMappingURL=reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../../src/orchestrator/reviewer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAqBnD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AA4GD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,mBAAmB,CAAC,EAAE,MAAM,EAC5B,mBAAmB,CAAC,EAAE,MAAM,GAC3B,OAAO,CAAC,cAAc,CAAC,CAsGzB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC,CA8C9B"}