@intrect/openswarm 0.9.3 → 0.10.1

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 (374) hide show
  1. package/README.md +76 -1
  2. package/config.example.yaml +6 -0
  3. package/dist/adapters/agenticLoop.d.ts +24 -0
  4. package/dist/adapters/agenticLoop.d.ts.map +1 -1
  5. package/dist/adapters/agenticLoop.js +130 -11
  6. package/dist/adapters/agenticLoop.js.map +1 -1
  7. package/dist/adapters/applyPatch.d.ts +21 -0
  8. package/dist/adapters/applyPatch.d.ts.map +1 -0
  9. package/dist/adapters/applyPatch.js +175 -0
  10. package/dist/adapters/applyPatch.js.map +1 -0
  11. package/dist/adapters/base.d.ts.map +1 -1
  12. package/dist/adapters/base.js +7 -0
  13. package/dist/adapters/base.js.map +1 -1
  14. package/dist/adapters/codex.js +10 -0
  15. package/dist/adapters/codex.js.map +1 -1
  16. package/dist/adapters/codexResponses.d.ts +8 -0
  17. package/dist/adapters/codexResponses.d.ts.map +1 -1
  18. package/dist/adapters/codexResponses.js +86 -8
  19. package/dist/adapters/codexResponses.js.map +1 -1
  20. package/dist/adapters/errorClassification.d.ts +8 -0
  21. package/dist/adapters/errorClassification.d.ts.map +1 -0
  22. package/dist/adapters/errorClassification.js +54 -0
  23. package/dist/adapters/errorClassification.js.map +1 -0
  24. package/dist/adapters/gpt.d.ts.map +1 -1
  25. package/dist/adapters/gpt.js +12 -1
  26. package/dist/adapters/gpt.js.map +1 -1
  27. package/dist/adapters/local.d.ts.map +1 -1
  28. package/dist/adapters/local.js +9 -1
  29. package/dist/adapters/local.js.map +1 -1
  30. package/dist/adapters/openrouter.d.ts.map +1 -1
  31. package/dist/adapters/openrouter.js +9 -1
  32. package/dist/adapters/openrouter.js.map +1 -1
  33. package/dist/adapters/rateLimitError.d.ts +29 -0
  34. package/dist/adapters/rateLimitError.d.ts.map +1 -0
  35. package/dist/adapters/rateLimitError.js +64 -0
  36. package/dist/adapters/rateLimitError.js.map +1 -0
  37. package/dist/adapters/resultParsing.d.ts.map +1 -1
  38. package/dist/adapters/resultParsing.js +18 -0
  39. package/dist/adapters/resultParsing.js.map +1 -1
  40. package/dist/adapters/tools.d.ts +3 -0
  41. package/dist/adapters/tools.d.ts.map +1 -1
  42. package/dist/adapters/tools.js +148 -11
  43. package/dist/adapters/tools.js.map +1 -1
  44. package/dist/adapters/types.d.ts +15 -0
  45. package/dist/adapters/types.d.ts.map +1 -1
  46. package/dist/adapters/webTools.d.ts.map +1 -1
  47. package/dist/adapters/webTools.js +44 -21
  48. package/dist/adapters/webTools.js.map +1 -1
  49. package/dist/agents/agentPair.d.ts +9 -0
  50. package/dist/agents/agentPair.d.ts.map +1 -1
  51. package/dist/agents/agentPair.js.map +1 -1
  52. package/dist/agents/auditor.d.ts.map +1 -1
  53. package/dist/agents/auditor.js +3 -0
  54. package/dist/agents/auditor.js.map +1 -1
  55. package/dist/agents/documenter.d.ts.map +1 -1
  56. package/dist/agents/documenter.js +3 -0
  57. package/dist/agents/documenter.js.map +1 -1
  58. package/dist/agents/draftAnalyzer.d.ts +30 -7
  59. package/dist/agents/draftAnalyzer.d.ts.map +1 -1
  60. package/dist/agents/draftAnalyzer.js +181 -30
  61. package/dist/agents/draftAnalyzer.js.map +1 -1
  62. package/dist/agents/multiLensReview.d.ts +49 -0
  63. package/dist/agents/multiLensReview.d.ts.map +1 -0
  64. package/dist/agents/multiLensReview.js +148 -0
  65. package/dist/agents/multiLensReview.js.map +1 -0
  66. package/dist/agents/pairPipeline.d.ts +7 -1
  67. package/dist/agents/pairPipeline.d.ts.map +1 -1
  68. package/dist/agents/pairPipeline.js +110 -66
  69. package/dist/agents/pairPipeline.js.map +1 -1
  70. package/dist/agents/pipelineFormat.d.ts.map +1 -1
  71. package/dist/agents/pipelineFormat.js +4 -0
  72. package/dist/agents/pipelineFormat.js.map +1 -1
  73. package/dist/agents/reviewer.d.ts +16 -0
  74. package/dist/agents/reviewer.d.ts.map +1 -1
  75. package/dist/agents/reviewer.js +30 -0
  76. package/dist/agents/reviewer.js.map +1 -1
  77. package/dist/agents/skillDocumenter.d.ts.map +1 -1
  78. package/dist/agents/skillDocumenter.js +3 -0
  79. package/dist/agents/skillDocumenter.js.map +1 -1
  80. package/dist/agents/tester.d.ts.map +1 -1
  81. package/dist/agents/tester.js +3 -0
  82. package/dist/agents/tester.js.map +1 -1
  83. package/dist/agents/worker.d.ts +14 -0
  84. package/dist/agents/worker.d.ts.map +1 -1
  85. package/dist/agents/worker.js +123 -22
  86. package/dist/agents/worker.js.map +1 -1
  87. package/dist/automation/autonomousRunner.d.ts +12 -0
  88. package/dist/automation/autonomousRunner.d.ts.map +1 -1
  89. package/dist/automation/autonomousRunner.js +218 -29
  90. package/dist/automation/autonomousRunner.js.map +1 -1
  91. package/dist/automation/runnerExecution.d.ts +15 -0
  92. package/dist/automation/runnerExecution.d.ts.map +1 -1
  93. package/dist/automation/runnerExecution.js +77 -1
  94. package/dist/automation/runnerExecution.js.map +1 -1
  95. package/dist/automation/runnerState.d.ts +7 -0
  96. package/dist/automation/runnerState.d.ts.map +1 -1
  97. package/dist/automation/runnerState.js +23 -1
  98. package/dist/automation/runnerState.js.map +1 -1
  99. package/dist/automation/runnerTypes.d.ts +2 -0
  100. package/dist/automation/runnerTypes.d.ts.map +1 -1
  101. package/dist/automation/scheduler.d.ts +12 -0
  102. package/dist/automation/scheduler.d.ts.map +1 -1
  103. package/dist/automation/scheduler.js +29 -2
  104. package/dist/automation/scheduler.js.map +1 -1
  105. package/dist/automation/taskSource.d.ts +9 -1
  106. package/dist/automation/taskSource.d.ts.map +1 -1
  107. package/dist/automation/taskSource.js +13 -2
  108. package/dist/automation/taskSource.js.map +1 -1
  109. package/dist/cli/auditPM.d.ts +40 -0
  110. package/dist/cli/auditPM.d.ts.map +1 -0
  111. package/dist/cli/auditPM.js +152 -0
  112. package/dist/cli/auditPM.js.map +1 -0
  113. package/dist/cli/designPipeline.d.ts +30 -0
  114. package/dist/cli/designPipeline.d.ts.map +1 -0
  115. package/dist/cli/designPipeline.js +113 -0
  116. package/dist/cli/designPipeline.js.map +1 -0
  117. package/dist/cli/mcpCommand.d.ts +22 -0
  118. package/dist/cli/mcpCommand.d.ts.map +1 -0
  119. package/dist/cli/mcpCommand.js +93 -0
  120. package/dist/cli/mcpCommand.js.map +1 -0
  121. package/dist/cli/projectHandler.d.ts.map +1 -1
  122. package/dist/cli/projectHandler.js +4 -2
  123. package/dist/cli/projectHandler.js.map +1 -1
  124. package/dist/cli/reviewAudit.d.ts +130 -0
  125. package/dist/cli/reviewAudit.d.ts.map +1 -0
  126. package/dist/cli/reviewAudit.js +283 -0
  127. package/dist/cli/reviewAudit.js.map +1 -0
  128. package/dist/cli/reviewCommand.d.ts +53 -0
  129. package/dist/cli/reviewCommand.d.ts.map +1 -0
  130. package/dist/cli/reviewCommand.js +207 -0
  131. package/dist/cli/reviewCommand.js.map +1 -0
  132. package/dist/cli/reviewMaxCommand.d.ts +35 -0
  133. package/dist/cli/reviewMaxCommand.d.ts.map +1 -0
  134. package/dist/cli/reviewMaxCommand.js +278 -0
  135. package/dist/cli/reviewMaxCommand.js.map +1 -0
  136. package/dist/cli/reviewProgress.d.ts +34 -0
  137. package/dist/cli/reviewProgress.d.ts.map +1 -0
  138. package/dist/cli/reviewProgress.js +109 -0
  139. package/dist/cli/reviewProgress.js.map +1 -0
  140. package/dist/cli/scheduleCommand.d.ts +15 -0
  141. package/dist/cli/scheduleCommand.d.ts.map +1 -0
  142. package/dist/cli/scheduleCommand.js +68 -0
  143. package/dist/cli/scheduleCommand.js.map +1 -0
  144. package/dist/cli.js +182 -26
  145. package/dist/cli.js.map +1 -1
  146. package/dist/core/config.d.ts +24 -0
  147. package/dist/core/config.d.ts.map +1 -1
  148. package/dist/core/config.js +42 -0
  149. package/dist/core/config.js.map +1 -1
  150. package/dist/core/providerOverride.d.ts.map +1 -1
  151. package/dist/core/providerOverride.js +16 -13
  152. package/dist/core/providerOverride.js.map +1 -1
  153. package/dist/core/service.d.ts.map +1 -1
  154. package/dist/core/service.js +11 -0
  155. package/dist/core/service.js.map +1 -1
  156. package/dist/core/types.d.ts +38 -0
  157. package/dist/core/types.d.ts.map +1 -1
  158. package/dist/discord/discordHandlers.d.ts.map +1 -1
  159. package/dist/discord/discordHandlers.js +1 -0
  160. package/dist/discord/discordHandlers.js.map +1 -1
  161. package/dist/index.js +4 -0
  162. package/dist/index.js.map +1 -1
  163. package/dist/linear/linear.d.ts +21 -0
  164. package/dist/linear/linear.d.ts.map +1 -1
  165. package/dist/linear/linear.js +109 -4
  166. package/dist/linear/linear.js.map +1 -1
  167. package/dist/linear/projectUpdater.js +3 -1
  168. package/dist/linear/projectUpdater.js.map +1 -1
  169. package/dist/locale/prompts/en.d.ts.map +1 -1
  170. package/dist/locale/prompts/en.js +104 -11
  171. package/dist/locale/prompts/en.js.map +1 -1
  172. package/dist/locale/prompts/ko.d.ts.map +1 -1
  173. package/dist/locale/prompts/ko.js +103 -11
  174. package/dist/locale/prompts/ko.js.map +1 -1
  175. package/dist/locale/types.d.ts +12 -0
  176. package/dist/locale/types.d.ts.map +1 -1
  177. package/dist/mcp/mcpClient.d.ts +28 -1
  178. package/dist/mcp/mcpClient.d.ts.map +1 -1
  179. package/dist/mcp/mcpClient.js +74 -3
  180. package/dist/mcp/mcpClient.js.map +1 -1
  181. package/dist/orchestration/decisionEngine.d.ts +20 -0
  182. package/dist/orchestration/decisionEngine.d.ts.map +1 -1
  183. package/dist/orchestration/decisionEngine.js +23 -0
  184. package/dist/orchestration/decisionEngine.js.map +1 -1
  185. package/dist/orchestration/taskScheduler.d.ts.map +1 -1
  186. package/dist/orchestration/taskScheduler.js +12 -1
  187. package/dist/orchestration/taskScheduler.js.map +1 -1
  188. package/dist/support/chatBackend.d.ts +18 -0
  189. package/dist/support/chatBackend.d.ts.map +1 -1
  190. package/dist/support/chatBackend.js +92 -8
  191. package/dist/support/chatBackend.js.map +1 -1
  192. package/dist/support/chatSession.d.ts +51 -0
  193. package/dist/support/chatSession.d.ts.map +1 -0
  194. package/dist/support/chatSession.js +134 -0
  195. package/dist/support/chatSession.js.map +1 -0
  196. package/dist/support/chatTui.d.ts.map +1 -1
  197. package/dist/support/chatTui.js +6 -75
  198. package/dist/support/chatTui.js.map +1 -1
  199. package/dist/support/concurrencyPool.d.ts +18 -0
  200. package/dist/support/concurrencyPool.d.ts.map +1 -0
  201. package/dist/support/concurrencyPool.js +46 -0
  202. package/dist/support/concurrencyPool.js.map +1 -0
  203. package/dist/support/dashboardHtml.d.ts +1 -1
  204. package/dist/support/dashboardHtml.d.ts.map +1 -1
  205. package/dist/support/dashboardHtml.js +0 -28
  206. package/dist/support/dashboardHtml.js.map +1 -1
  207. package/dist/support/editParser.d.ts +26 -0
  208. package/dist/support/editParser.d.ts.map +1 -1
  209. package/dist/support/editParser.js +43 -0
  210. package/dist/support/editParser.js.map +1 -1
  211. package/dist/support/goalCommand.d.ts +35 -0
  212. package/dist/support/goalCommand.d.ts.map +1 -0
  213. package/dist/support/goalCommand.js +112 -0
  214. package/dist/support/goalCommand.js.map +1 -0
  215. package/dist/support/index.d.ts +0 -1
  216. package/dist/support/index.d.ts.map +1 -1
  217. package/dist/support/index.js +0 -1
  218. package/dist/support/index.js.map +1 -1
  219. package/dist/support/web.d.ts.map +1 -1
  220. package/dist/support/web.js +0 -7
  221. package/dist/support/web.js.map +1 -1
  222. package/dist/taskState/store.d.ts +5 -0
  223. package/dist/taskState/store.d.ts.map +1 -1
  224. package/dist/taskState/store.js +16 -0
  225. package/dist/taskState/store.js.map +1 -1
  226. package/dist/telemetry/telemetry.d.ts +42 -0
  227. package/dist/telemetry/telemetry.d.ts.map +1 -0
  228. package/dist/telemetry/telemetry.js +138 -0
  229. package/dist/telemetry/telemetry.js.map +1 -0
  230. package/dist/tui/App.d.ts +20 -0
  231. package/dist/tui/App.d.ts.map +1 -0
  232. package/dist/tui/App.js +52 -0
  233. package/dist/tui/App.js.map +1 -0
  234. package/dist/tui/chatModel.d.ts +81 -0
  235. package/dist/tui/chatModel.d.ts.map +1 -0
  236. package/dist/tui/chatModel.js +129 -0
  237. package/dist/tui/chatModel.js.map +1 -0
  238. package/dist/tui/components/AuditBoard.d.ts +10 -0
  239. package/dist/tui/components/AuditBoard.d.ts.map +1 -0
  240. package/dist/tui/components/AuditBoard.js +50 -0
  241. package/dist/tui/components/AuditBoard.js.map +1 -0
  242. package/dist/tui/components/ChatInput.d.ts +14 -0
  243. package/dist/tui/components/ChatInput.d.ts.map +1 -0
  244. package/dist/tui/components/ChatInput.js +46 -0
  245. package/dist/tui/components/ChatInput.js.map +1 -0
  246. package/dist/tui/components/ChatLog.d.ts +12 -0
  247. package/dist/tui/components/ChatLog.d.ts.map +1 -0
  248. package/dist/tui/components/ChatLog.js +47 -0
  249. package/dist/tui/components/ChatLog.js.map +1 -0
  250. package/dist/tui/components/CommandPalette.d.ts +6 -0
  251. package/dist/tui/components/CommandPalette.d.ts.map +1 -0
  252. package/dist/tui/components/CommandPalette.js +14 -0
  253. package/dist/tui/components/CommandPalette.js.map +1 -0
  254. package/dist/tui/components/ContextBar.d.ts +9 -0
  255. package/dist/tui/components/ContextBar.d.ts.map +1 -0
  256. package/dist/tui/components/ContextBar.js +18 -0
  257. package/dist/tui/components/ContextBar.js.map +1 -0
  258. package/dist/tui/components/DataTable.d.ts +6 -0
  259. package/dist/tui/components/DataTable.d.ts.map +1 -0
  260. package/dist/tui/components/DataTable.js +13 -0
  261. package/dist/tui/components/DataTable.js.map +1 -0
  262. package/dist/tui/components/HelpBar.d.ts +2 -0
  263. package/dist/tui/components/HelpBar.d.ts.map +1 -0
  264. package/dist/tui/components/HelpBar.js +8 -0
  265. package/dist/tui/components/HelpBar.js.map +1 -0
  266. package/dist/tui/components/LiveLog.d.ts +6 -0
  267. package/dist/tui/components/LiveLog.d.ts.map +1 -0
  268. package/dist/tui/components/LiveLog.js +10 -0
  269. package/dist/tui/components/LiveLog.js.map +1 -0
  270. package/dist/tui/components/LogLine.d.ts +4 -0
  271. package/dist/tui/components/LogLine.d.ts.map +1 -0
  272. package/dist/tui/components/LogLine.js +8 -0
  273. package/dist/tui/components/LogLine.js.map +1 -0
  274. package/dist/tui/components/SelectList.d.ts +6 -0
  275. package/dist/tui/components/SelectList.d.ts.map +1 -0
  276. package/dist/tui/components/SelectList.js +15 -0
  277. package/dist/tui/components/SelectList.js.map +1 -0
  278. package/dist/tui/components/StageTimeline.d.ts +7 -0
  279. package/dist/tui/components/StageTimeline.d.ts.map +1 -0
  280. package/dist/tui/components/StageTimeline.js +18 -0
  281. package/dist/tui/components/StageTimeline.js.map +1 -0
  282. package/dist/tui/components/StatusBar.d.ts +7 -0
  283. package/dist/tui/components/StatusBar.d.ts.map +1 -0
  284. package/dist/tui/components/StatusBar.js +8 -0
  285. package/dist/tui/components/StatusBar.js.map +1 -0
  286. package/dist/tui/components/SubagentTree.d.ts +10 -0
  287. package/dist/tui/components/SubagentTree.d.ts.map +1 -0
  288. package/dist/tui/components/SubagentTree.js +12 -0
  289. package/dist/tui/components/SubagentTree.js.map +1 -0
  290. package/dist/tui/components/TabBar.d.ts +5 -0
  291. package/dist/tui/components/TabBar.d.ts.map +1 -0
  292. package/dist/tui/components/TabBar.js +9 -0
  293. package/dist/tui/components/TabBar.js.map +1 -0
  294. package/dist/tui/components/WorkingIndicator.d.ts +6 -0
  295. package/dist/tui/components/WorkingIndicator.d.ts.map +1 -0
  296. package/dist/tui/components/WorkingIndicator.js +20 -0
  297. package/dist/tui/components/WorkingIndicator.js.map +1 -0
  298. package/dist/tui/hooks/useMonitor.d.ts +8 -0
  299. package/dist/tui/hooks/useMonitor.d.ts.map +1 -0
  300. package/dist/tui/hooks/useMonitor.js +42 -0
  301. package/dist/tui/hooks/useMonitor.js.map +1 -0
  302. package/dist/tui/hooks/usePipelineEvents.d.ts +6 -0
  303. package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -0
  304. package/dist/tui/hooks/usePipelineEvents.js +21 -0
  305. package/dist/tui/hooks/usePipelineEvents.js.map +1 -0
  306. package/dist/tui/hooks/useTerminalSize.d.ts +6 -0
  307. package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -0
  308. package/dist/tui/hooks/useTerminalSize.js +26 -0
  309. package/dist/tui/hooks/useTerminalSize.js.map +1 -0
  310. package/dist/tui/index.d.ts +22 -0
  311. package/dist/tui/index.d.ts.map +1 -0
  312. package/dist/tui/index.js +18 -0
  313. package/dist/tui/index.js.map +1 -0
  314. package/dist/tui/inputDebug.d.ts +20 -0
  315. package/dist/tui/inputDebug.d.ts.map +1 -0
  316. package/dist/tui/inputDebug.js +42 -0
  317. package/dist/tui/inputDebug.js.map +1 -0
  318. package/dist/tui/loadingMessages.d.ts +11 -0
  319. package/dist/tui/loadingMessages.d.ts.map +1 -0
  320. package/dist/tui/loadingMessages.js +39 -0
  321. package/dist/tui/loadingMessages.js.map +1 -0
  322. package/dist/tui/logFormat.d.ts +10 -0
  323. package/dist/tui/logFormat.d.ts.map +1 -0
  324. package/dist/tui/logFormat.js +86 -0
  325. package/dist/tui/logFormat.js.map +1 -0
  326. package/dist/tui/markdown.d.ts +3 -0
  327. package/dist/tui/markdown.d.ts.map +1 -0
  328. package/dist/tui/markdown.js +33 -0
  329. package/dist/tui/markdown.js.map +1 -0
  330. package/dist/tui/monitorApi.d.ts +6 -0
  331. package/dist/tui/monitorApi.d.ts.map +1 -0
  332. package/dist/tui/monitorApi.js +35 -0
  333. package/dist/tui/monitorApi.js.map +1 -0
  334. package/dist/tui/monitorRows.d.ts +43 -0
  335. package/dist/tui/monitorRows.d.ts.map +1 -0
  336. package/dist/tui/monitorRows.js +65 -0
  337. package/dist/tui/monitorRows.js.map +1 -0
  338. package/dist/tui/panels/ChatPanel.d.ts +16 -0
  339. package/dist/tui/panels/ChatPanel.d.ts.map +1 -0
  340. package/dist/tui/panels/ChatPanel.js +305 -0
  341. package/dist/tui/panels/ChatPanel.js.map +1 -0
  342. package/dist/tui/panels/LogsPanel.d.ts +8 -0
  343. package/dist/tui/panels/LogsPanel.d.ts.map +1 -0
  344. package/dist/tui/panels/LogsPanel.js +19 -0
  345. package/dist/tui/panels/LogsPanel.js.map +1 -0
  346. package/dist/tui/panels/MonitorPanel.d.ts +8 -0
  347. package/dist/tui/panels/MonitorPanel.d.ts.map +1 -0
  348. package/dist/tui/panels/MonitorPanel.js +19 -0
  349. package/dist/tui/panels/MonitorPanel.js.map +1 -0
  350. package/dist/tui/panels/PipelinePanel.d.ts +6 -0
  351. package/dist/tui/panels/PipelinePanel.d.ts.map +1 -0
  352. package/dist/tui/panels/PipelinePanel.js +22 -0
  353. package/dist/tui/panels/PipelinePanel.js.map +1 -0
  354. package/dist/tui/pipelineEvents.d.ts +21 -0
  355. package/dist/tui/pipelineEvents.d.ts.map +1 -0
  356. package/dist/tui/pipelineEvents.js +30 -0
  357. package/dist/tui/pipelineEvents.js.map +1 -0
  358. package/dist/tui/sse.d.ts +24 -0
  359. package/dist/tui/sse.d.ts.map +1 -0
  360. package/dist/tui/sse.js +78 -0
  361. package/dist/tui/sse.js.map +1 -0
  362. package/dist/tui/subagentTree.d.ts +10 -0
  363. package/dist/tui/subagentTree.d.ts.map +1 -0
  364. package/dist/tui/subagentTree.js +30 -0
  365. package/dist/tui/subagentTree.js.map +1 -0
  366. package/dist/tui/tabs.d.ts +10 -0
  367. package/dist/tui/tabs.d.ts.map +1 -0
  368. package/dist/tui/tabs.js +26 -0
  369. package/dist/tui/tabs.js.map +1 -0
  370. package/dist/tui/theme.d.ts +29 -0
  371. package/dist/tui/theme.d.ts.map +1 -0
  372. package/dist/tui/theme.js +34 -0
  373. package/dist/tui/theme.js.map +1 -0
  374. package/package.json +13 -3
@@ -0,0 +1,278 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // ============================================
3
+ // OpenSwarm - `openswarm review --max` entry (INT-2006)
4
+ // ============================================
5
+ //
6
+ // CLI shell for the full-codebase, multi-agent audit: collect source → partition
7
+ // into areas → cost gate → mount the live ink board → fan reviewer subagents out
8
+ // (runMaxReview) → print the aggregate verdict → optionally file per-area Linear
9
+ // follow-ups. The orchestration/aggregation lives in reviewAudit.ts (unit-tested
10
+ // and ink-free); this file is the effectful boundary.
11
+ import { render } from 'ink';
12
+ import { EventEmitter } from 'node:events';
13
+ import { createInterface } from 'node:readline';
14
+ import { execFileSync } from 'node:child_process';
15
+ import { writeFile, mkdir } from 'node:fs/promises';
16
+ import { join, dirname, basename } from 'node:path';
17
+ import { listSourceFiles, partitionIntoAreas, runMaxReview, formatAuditSummary, formatAuditReport, mergeFallback, } from './reviewAudit.js';
18
+ import { AuditBoard } from '../tui/components/AuditBoard.js';
19
+ import { resolveIssueFromBranch, ensureTaskSource, resolveProjectId } from './reviewCommand.js';
20
+ import { synthesizeAuditIssues } from './auditPM.js';
21
+ /**
22
+ * Pick the adapter to retry usage-limited areas on. Explicit --fallback wins;
23
+ * otherwise a codex primary auto-falls back to claude (Claude subscription). (INT-2192)
24
+ */
25
+ function resolveFallbackAdapter(opts) {
26
+ if (opts.noFallback)
27
+ return undefined;
28
+ if (opts.fallbackAdapter)
29
+ return opts.fallbackAdapter;
30
+ const primary = opts.adapter ?? 'codex-responses';
31
+ return primary === 'codex' || primary === 'codex-responses' ? 'claude' : undefined;
32
+ }
33
+ /** Interactive cost gate. Non-TTY always proceeds (scripted runs). */
34
+ async function confirmCost(areas, files, concurrency) {
35
+ if (!process.stdin.isTTY)
36
+ return true;
37
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
38
+ const answer = await new Promise((res) => rl.question(`Audit ${files} file(s) across ${areas} area(s) with ${concurrency} concurrent reviewer subagents ` +
39
+ `(~${areas} agent runs). Continue? [y/N] `, res));
40
+ rl.close();
41
+ return /^y(es)?$/i.test(answer.trim());
42
+ }
43
+ /** File each area's recommendedActions as Linear follow-ups, one call per area (avoids the 10-action cap). */
44
+ async function filePerAreaFollowups(cwd, fileIssue, run) {
45
+ const withActions = run.results.filter((r) => r.review?.recommendedActions?.length);
46
+ if (!withActions.length) {
47
+ console.log('No follow-ups to file.');
48
+ return;
49
+ }
50
+ const source = await ensureTaskSource();
51
+ if (!source) {
52
+ console.log('Could not file follow-ups: Linear not connected. Run `openswarm auth login --provider linear` (or set linearApiKey).');
53
+ return;
54
+ }
55
+ let parent = typeof fileIssue === 'string' ? fileIssue : undefined;
56
+ if (!parent) {
57
+ const branch = (() => {
58
+ try {
59
+ return execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, stdio: ['ignore', 'pipe', 'ignore'] })
60
+ .toString()
61
+ .trim();
62
+ }
63
+ catch {
64
+ return '';
65
+ }
66
+ })();
67
+ parent = resolveIssueFromBranch(branch);
68
+ if (parent)
69
+ console.log(`Filing follow-ups under ${parent} (inferred from branch "${branch}").`);
70
+ }
71
+ const projectId = parent ? undefined : await resolveProjectId(cwd);
72
+ const { fileReviewerFollowups } = await import('../automation/runnerExecution.js');
73
+ let filed = 0;
74
+ for (const r of withActions) {
75
+ filed += await fileReviewerFollowups(source, parent, r.review, { autoFile: true, projectId, requireApprove: false });
76
+ }
77
+ console.log(filed > 0
78
+ ? parent
79
+ ? `Filed ${filed} follow-up sub-issue(s) under ${parent}.`
80
+ : `Filed ${filed} standalone follow-up issue(s) (pass \`--issues <id>\` to nest them).`
81
+ : 'Could not file follow-ups (0 created).');
82
+ }
83
+ /**
84
+ * Run the full-codebase multi-agent audit. Returns the aggregate verdict (or
85
+ * null when there's nothing to audit / the user declined). exit code is set to 1
86
+ * by the caller on a reject verdict.
87
+ */
88
+ export async function runReviewMaxCommand(opts = {}) {
89
+ const cwd = opts.path ?? process.cwd();
90
+ const concurrency = Math.max(1, opts.concurrency ?? 4);
91
+ let files;
92
+ try {
93
+ files = listSourceFiles(cwd);
94
+ }
95
+ catch {
96
+ console.error(`Not a git repository (or git unavailable): ${cwd}`);
97
+ return null;
98
+ }
99
+ if (!files.length) {
100
+ console.log('No production source files to audit.');
101
+ return null;
102
+ }
103
+ const areas = partitionIntoAreas(files, opts.maxFilesPerArea ?? 12);
104
+ if (opts.dryRun) {
105
+ console.log(`Audit plan — ${files.length} file(s) across ${areas.length} area(s):`);
106
+ areas.forEach((a) => console.log(` · ${a.label} (${a.files.length} file(s))`));
107
+ return null;
108
+ }
109
+ if (!opts.yes && !(await confirmCost(areas.length, files.length, concurrency))) {
110
+ console.log('Aborted.');
111
+ return null;
112
+ }
113
+ // Live board → stderr so the final report on stdout stays pipe-clean.
114
+ const events = new EventEmitter();
115
+ events.setMaxListeners(0);
116
+ const board = render(_jsx(AuditBoard, { areas: areas, concurrency: concurrency, events: events }), {
117
+ stdout: process.stderr,
118
+ });
119
+ let run;
120
+ try {
121
+ run = await runMaxReview(areas, cwd, { concurrency, adapter: opts.adapter }, { onProgress: (e) => events.emit('progress', e) });
122
+ }
123
+ finally {
124
+ board.unmount();
125
+ }
126
+ // Auto-fallback: a codex usage-limit aborted the run early → retry the failed/
127
+ // skipped areas on the fallback adapter (default claude → Claude subscription). (INT-2192)
128
+ if (run.rateLimit) {
129
+ const fallback = resolveFallbackAdapter(opts);
130
+ if (fallback) {
131
+ const pending = areas.filter((_, i) => run.results[i]?.error);
132
+ console.warn(`\n⚠ Codex usage limit hit — falling back to "${fallback}" for ${pending.length} remaining area(s)...`);
133
+ const fbRun = await runMaxReview(pending, cwd, { concurrency, adapter: fallback }, {
134
+ onProgress: (e) => {
135
+ if (e.type === 'done')
136
+ console.error(` [${fallback}] ${e.label}: ${e.decision}`);
137
+ else if (e.type === 'error')
138
+ console.error(` [${fallback}] ${e.label}: failed`);
139
+ },
140
+ });
141
+ run = mergeFallback(run, fbRun);
142
+ }
143
+ }
144
+ console.log(formatAuditSummary(run.summary));
145
+ // If a usage-limit is still unresolved (fallback also exhausted, or no fallback),
146
+ // surface the reset time. (INT-2192)
147
+ if (run.rateLimit) {
148
+ const skipped = run.summary.areas.filter((a) => a.decision === 'error').length;
149
+ const when = run.rateLimit.resetsAt ? new Date(run.rateLimit.resetsAt * 1000).toLocaleString() : 'an unknown time';
150
+ console.warn(`\n⚠ Usage limit unresolved — ${skipped} area(s) still incomplete. ${run.rateLimit.message}`);
151
+ console.warn(` Retry after ${when}${resolveFallbackAdapter(opts) ? ' (fallback adapter also exhausted)' : ', or set `--fallback <adapter>`'}.`);
152
+ }
153
+ // (3) Persist a markdown report so the result isn't lost to the scrollback. (INT-2022)
154
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
155
+ const report = formatAuditReport(run.summary, basename(cwd) || cwd, ts);
156
+ const outPath = opts.out ?? join(cwd, '.openswarm', 'audit', `audit-${ts}.md`);
157
+ try {
158
+ await mkdir(dirname(outPath), { recursive: true });
159
+ await writeFile(outPath, report, 'utf8');
160
+ console.log(`\nReport saved: ${outPath}`);
161
+ }
162
+ catch (e) {
163
+ console.warn(`Could not save report: ${e instanceof Error ? e.message : String(e)}`);
164
+ }
165
+ // (4) Linear: PM synthesis is the DEFAULT — a master parent + ≤10 cohesive
166
+ // sub-issues. `--issues <id>` overrides the parent with an existing issue;
167
+ // `--issues-per-area` keeps the legacy per-area fan-out; `--no-linear`
168
+ // skips Linear entirely (report only). (INT-2022 / INT-2225)
169
+ if (opts.issuesPerArea) {
170
+ await filePerAreaFollowups(cwd, opts.issuesPerArea, run);
171
+ }
172
+ else if (!opts.noLinear && run.summary.recommendedActions.length) {
173
+ await filePmSynthesizedIssues(cwd, opts, run.summary, report, ts);
174
+ }
175
+ else if (run.summary.recommendedActions.length) {
176
+ console.log(`\n${run.summary.recommendedActions.length} follow-up(s) — captured in the report (--no-linear).`);
177
+ }
178
+ return { decision: run.summary.decision };
179
+ }
180
+ /**
181
+ * Create one master audit issue holding the full report (default Linear
182
+ * behavior). Returns the created issue's internal id (usable as a sub-issue
183
+ * parent) or null on failure. (INT-2022 / INT-2225)
184
+ */
185
+ async function createMasterAuditIssue(cwd, summary, report, ts) {
186
+ const source = await ensureTaskSource();
187
+ if (!source) {
188
+ console.log('Linear not connected — report saved to file only. `openswarm auth login --provider linear` to enable.');
189
+ return null;
190
+ }
191
+ const projectId = await resolveProjectId(cwd);
192
+ const title = `chore(audit): codebase audit ${ts.slice(0, 10)} — review --max (${summary.recommendedActions.length} follow-ups)`;
193
+ try {
194
+ const res = await source.createTask(title, report, projectId);
195
+ if ('identifier' in res) {
196
+ console.log(`Linear master audit issue: ${res.identifier}`);
197
+ return res.id;
198
+ }
199
+ console.warn(`Could not create Linear issue (report saved to file): ${res.error}`);
200
+ return null;
201
+ }
202
+ catch (e) {
203
+ console.warn(`Could not create Linear issue (report saved to file): ${e instanceof Error ? e.message : String(e)}`);
204
+ return null;
205
+ }
206
+ }
207
+ /**
208
+ * PM layer for `--issues`: synthesize the deduped follow-ups into ≤10 cohesive
209
+ * issues and file them as sub-issues. The parent is the explicit `--issues <id>`
210
+ * when given, otherwise a freshly created master audit issue (which also holds
211
+ * the full report). Falls back gracefully — if synthesis yields nothing (too few
212
+ * follow-ups, or the LLM output couldn't be parsed), the master issue alone still
213
+ * captures everything. (INT-2225)
214
+ */
215
+ async function filePmSynthesizedIssues(cwd, opts, summary, report, ts) {
216
+ const actions = summary.recommendedActions;
217
+ if (!actions.length) {
218
+ console.log('No follow-ups to file.');
219
+ return;
220
+ }
221
+ const source = await ensureTaskSource();
222
+ if (!source) {
223
+ console.log('Could not file follow-ups: Linear not connected. Run `openswarm auth login --provider linear` (or set linearApiKey).');
224
+ return;
225
+ }
226
+ const projectId = await resolveProjectId(cwd);
227
+ if (!projectId) {
228
+ // No <repo>/openswarm.json mapping → issues get filed without a project (and
229
+ // on a multi-team config, only the first team). Tell the user how to map it. (INT-2239)
230
+ console.warn('⚠ No Linear project mapped for this repo (openswarm.json `linear.projectId` missing) — ' +
231
+ 'issues will not be linked to a project. Run `openswarm add` here to map it.');
232
+ }
233
+ // Resolve the parent: explicit --issues <id>, else create the master report issue.
234
+ let parentId = typeof opts.fileIssue === 'string' && opts.fileIssue ? opts.fileIssue : undefined;
235
+ if (!parentId && !opts.noLinear) {
236
+ parentId = (await createMasterAuditIssue(cwd, summary, report, ts)) ?? undefined;
237
+ }
238
+ console.log(`Synthesizing ${actions.length} follow-up(s) into cohesive issues (PM pass)...`);
239
+ const issues = await synthesizeAuditIssues(actions, {
240
+ adapter: opts.adapter,
241
+ cwd,
242
+ repoName: basename(cwd) || cwd,
243
+ onLog: (l) => console.error(` · ${l}`),
244
+ });
245
+ if (!issues.length) {
246
+ console.log(parentId
247
+ ? 'PM synthesis produced no grouped issues — the master audit issue captures all follow-ups.'
248
+ : 'PM synthesis produced no grouped issues — follow-ups are captured in the saved report.');
249
+ return;
250
+ }
251
+ let filed = 0;
252
+ for (const issue of issues) {
253
+ try {
254
+ const res = parentId
255
+ ? await source.createSubIssue(parentId, issue.title, issue.description, {
256
+ priority: issue.priority,
257
+ projectId,
258
+ })
259
+ : await source.createTask(issue.title, issue.description, projectId);
260
+ if ('identifier' in res) {
261
+ filed++;
262
+ console.log(` ✓ ${res.identifier} ${issue.title} (${issue.items.length} follow-up(s))`);
263
+ }
264
+ else {
265
+ console.warn(` ✗ Could not create issue "${issue.title}": ${res.error}`);
266
+ }
267
+ }
268
+ catch (e) {
269
+ console.warn(` ✗ Could not create issue "${issue.title}": ${e instanceof Error ? e.message : String(e)}`);
270
+ }
271
+ }
272
+ console.log(filed > 0
273
+ ? parentId
274
+ ? `Filed ${filed} synthesized sub-issue(s) under the master audit issue.`
275
+ : `Filed ${filed} synthesized issue(s).`
276
+ : 'Could not file synthesized issues (0 created).');
277
+ }
278
+ //# sourceMappingURL=reviewMaxCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewMaxCommand.js","sourceRoot":"","sources":["../../src/cli/reviewMaxCommand.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /** Braille spinner frame for a tick. Pure. */
2
+ export declare function spinnerFrame(tick: number): string;
3
+ /** Collapse newlines/whitespace runs to single spaces so a note stays one line. Pure. */
4
+ export declare function oneLine(s: string): string;
5
+ /** Display width of a string in terminal columns (wide chars count as 2). Pure. */
6
+ export declare function displayWidth(s: string): number;
7
+ /**
8
+ * Truncate to a terminal COLUMN budget (not code-unit length) with an ellipsis,
9
+ * so a line of wide chars never exceeds the width and wraps. (INT-1966)
10
+ */
11
+ export declare function truncateLine(s: string, width: number): string;
12
+ /** One progress line: `⠙ reviewing… 3s · 🔧 read_file`. Pure. */
13
+ export declare function formatProgress(tick: number, elapsedSec: number, last?: string, width?: number): string;
14
+ export interface ReviewProgressDeps {
15
+ write?: (s: string) => void;
16
+ now?: () => number;
17
+ setIntervalFn?: (fn: () => void, ms: number) => ReturnType<typeof setInterval>;
18
+ clearIntervalFn?: (h: ReturnType<typeof setInterval>) => void;
19
+ intervalMs?: number;
20
+ /** Terminal width to truncate the line to (default stdout.columns ?? 80). */
21
+ columns?: number;
22
+ }
23
+ export interface ReviewProgress {
24
+ /** Update the trailing activity note (e.g. the latest tool line). */
25
+ note: (line: string) => void;
26
+ /** Stop the spinner and clear the line. */
27
+ stop: () => void;
28
+ }
29
+ /**
30
+ * Start a spinner heartbeat that re-renders every intervalMs until stop().
31
+ * Returns handles to update the activity note and to stop. (INT-1963)
32
+ */
33
+ export declare function startReviewProgress(deps?: ReviewProgressDeps): ReviewProgress;
34
+ //# sourceMappingURL=reviewProgress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewProgress.d.ts","sourceRoot":"","sources":["../../src/cli/reviewProgress.ts"],"names":[],"mappings":"AAUA,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AA2BD,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAItG;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC/E,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,KAAK,IAAI,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,kBAAuB,GAAG,cAAc,CAkCjF"}
@@ -0,0 +1,109 @@
1
+ // ============================================
2
+ // OpenSwarm - review progress indicator (INT-1963)
3
+ // ============================================
4
+ //
5
+ // A live "still working" heartbeat for `openswarm review`, so a multi-second
6
+ // reviewer run doesn't look frozen. The formatter is pure (unit-tested); the
7
+ // runtime owns a timer + stderr writes (injectable for tests).
8
+ const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
9
+ /** Braille spinner frame for a tick. Pure. */
10
+ export function spinnerFrame(tick) {
11
+ return FRAMES[((tick % FRAMES.length) + FRAMES.length) % FRAMES.length];
12
+ }
13
+ /** Collapse newlines/whitespace runs to single spaces so a note stays one line. Pure. */
14
+ export function oneLine(s) {
15
+ return s.replace(/\s+/g, ' ').trim();
16
+ }
17
+ /**
18
+ * Terminal display width of a code point: East-Asian wide / fullwidth characters
19
+ * (Hangul, CJK, kana, fullwidth forms) and most emoji occupy 2 columns. (INT-1966)
20
+ */
21
+ function charWidth(cp) {
22
+ if ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
23
+ (cp >= 0x2e80 && cp <= 0x303e) || // CJK radicals, Kangxi, symbols
24
+ (cp >= 0x3041 && cp <= 0x33ff) || // Hiragana, Katakana, CJK symbols
25
+ (cp >= 0x3400 && cp <= 0x4dbf) || // CJK Ext A
26
+ (cp >= 0x4e00 && cp <= 0x9fff) || // CJK Unified
27
+ (cp >= 0xa000 && cp <= 0xa4cf) || // Yi
28
+ (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables
29
+ (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility
30
+ (cp >= 0xfe30 && cp <= 0xfe4f) || // CJK Compatibility Forms
31
+ (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth Forms
32
+ (cp >= 0xffe0 && cp <= 0xffe6) ||
33
+ (cp >= 0x1f300 && cp <= 0x1faff) || // emoji & symbols
34
+ (cp >= 0x20000 && cp <= 0x3fffd) // CJK Ext B+
35
+ ) {
36
+ return 2;
37
+ }
38
+ return 1;
39
+ }
40
+ /** Display width of a string in terminal columns (wide chars count as 2). Pure. */
41
+ export function displayWidth(s) {
42
+ let w = 0;
43
+ for (const ch of s)
44
+ w += charWidth(ch.codePointAt(0) ?? 0);
45
+ return w;
46
+ }
47
+ /**
48
+ * Truncate to a terminal COLUMN budget (not code-unit length) with an ellipsis,
49
+ * so a line of wide chars never exceeds the width and wraps. (INT-1966)
50
+ */
51
+ export function truncateLine(s, width) {
52
+ if (width <= 0)
53
+ return '';
54
+ if (displayWidth(s) <= width)
55
+ return s;
56
+ let out = '';
57
+ let w = 0;
58
+ for (const ch of s) {
59
+ const cw = charWidth(ch.codePointAt(0) ?? 0);
60
+ if (w + cw > width - 1)
61
+ break; // reserve one column for the ellipsis
62
+ out += ch;
63
+ w += cw;
64
+ }
65
+ return `${out}…`;
66
+ }
67
+ /** One progress line: `⠙ reviewing… 3s · 🔧 read_file`. Pure. */
68
+ export function formatProgress(tick, elapsedSec, last, width) {
69
+ const base = `${spinnerFrame(tick)} reviewing… ${elapsedSec}s`;
70
+ const line = last ? `${base} · ${last}` : base;
71
+ return width ? truncateLine(line, width) : line;
72
+ }
73
+ const CLEAR_LINE = '\r\x1b[2K';
74
+ /**
75
+ * Start a spinner heartbeat that re-renders every intervalMs until stop().
76
+ * Returns handles to update the activity note and to stop. (INT-1963)
77
+ */
78
+ export function startReviewProgress(deps = {}) {
79
+ const write = deps.write ?? ((s) => process.stderr.write(s));
80
+ const now = deps.now ?? (() => Date.now());
81
+ const setIntervalFn = deps.setIntervalFn ?? setInterval;
82
+ const clearIntervalFn = deps.clearIntervalFn ?? clearInterval;
83
+ const intervalMs = deps.intervalMs ?? 200;
84
+ const columns = deps.columns ?? process.stdout.columns ?? 80;
85
+ // Reserve the last column: writing into it auto-wraps on most terminals, which
86
+ // re-introduces the multi-row stacking we're trying to avoid. (INT-1966)
87
+ const maxCols = Math.max(10, columns - 1);
88
+ const start = now();
89
+ let tick = 0;
90
+ let last;
91
+ const render = () => {
92
+ const elapsedSec = Math.max(0, Math.floor((now() - start) / 1000));
93
+ // Single line, truncated to display width — a wide-char note must never wrap/stack. (INT-1966)
94
+ write(`${CLEAR_LINE}${formatProgress(tick, elapsedSec, last, maxCols)}`);
95
+ tick += 1;
96
+ };
97
+ render(); // immediate first frame
98
+ const handle = setIntervalFn(render, intervalMs);
99
+ return {
100
+ note: (line) => {
101
+ last = oneLine(line) || last;
102
+ },
103
+ stop: () => {
104
+ clearIntervalFn(handle);
105
+ write(CLEAR_LINE);
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=reviewProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewProgress.js","sourceRoot":"","sources":["../../src/cli/reviewProgress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ScheduledJob } from '../automation/scheduler.js';
2
+ /** Render the schedule list for the terminal. */
3
+ export declare function formatScheduleList(jobs: ScheduledJob[]): string;
4
+ export interface ScheduleDeps {
5
+ add: (name: string, projectPath: string, prompt: string, schedule: string) => Promise<ScheduledJob>;
6
+ list: () => Promise<ScheduledJob[]>;
7
+ remove: (nameOrId: string) => Promise<boolean>;
8
+ toggle: (nameOrId: string) => Promise<ScheduledJob | null>;
9
+ }
10
+ export interface ScheduleCommandOptions {
11
+ path?: string;
12
+ }
13
+ /** Route a `schedule` subcommand. Returns the message to print. */
14
+ export declare function runScheduleCommand(action: string, args: string[], opts?: ScheduleCommandOptions, deps?: ScheduleDeps): Promise<string>;
15
+ //# sourceMappingURL=scheduleCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleCommand.d.ts","sourceRoot":"","sources":["../../src/cli/scheduleCommand.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,CAc/D;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpG,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CAC5D;AAYD,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,sBAA2B,EACjC,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
@@ -0,0 +1,68 @@
1
+ // ============================================
2
+ // OpenSwarm - `openswarm schedule add|list|remove|pause` (INT-1957)
3
+ // ============================================
4
+ //
5
+ // CLI surface over the existing scheduler (src/automation/scheduler.ts): register
6
+ // agent tasks on a cron/interval, persisted to ~/.openswarm/schedules.json and
7
+ // run by the daemon (startAllSchedules). The formatter is pure; routing delegates
8
+ // to the scheduler via injectable deps (testable without fs/cron).
9
+ /** Render the schedule list for the terminal. */
10
+ export function formatScheduleList(jobs) {
11
+ if (!jobs.length) {
12
+ return 'No schedules. Add one: openswarm schedule add <name> <cron|interval> <task>';
13
+ }
14
+ return jobs
15
+ .map((j) => {
16
+ const state = j.enabled ? '▶' : '⏸';
17
+ const last = j.lastRun ? ` (last: ${new Date(j.lastRun).toISOString()})` : '';
18
+ const fails = j.consecutiveFailures
19
+ ? ` ⚠ ${j.consecutiveFailures} consecutive failure(s)${j.enabled ? '' : ' — auto-paused'}`
20
+ : '';
21
+ return ` ${state} ${j.name} — ${j.schedule} — ${j.prompt}${last}${fails}`;
22
+ })
23
+ .join('\n');
24
+ }
25
+ async function defaultDeps() {
26
+ const s = await import('../automation/scheduler.js');
27
+ return {
28
+ add: (name, projectPath, prompt, schedule) => s.addSchedule(name, projectPath, prompt, schedule),
29
+ list: () => s.listSchedules(),
30
+ remove: (nameOrId) => s.removeSchedule(nameOrId),
31
+ toggle: (nameOrId) => s.toggleSchedule(nameOrId),
32
+ };
33
+ }
34
+ /** Route a `schedule` subcommand. Returns the message to print. */
35
+ export async function runScheduleCommand(action, args, opts = {}, deps) {
36
+ const d = deps ?? (await defaultDeps());
37
+ switch (action) {
38
+ case 'add': {
39
+ const [name, schedule, ...rest] = args;
40
+ if (!name || !schedule || !rest.length) {
41
+ throw new Error('usage: openswarm schedule add <name> <cron|interval> <task...>');
42
+ }
43
+ const job = await d.add(name, opts.path ?? process.cwd(), rest.join(' '), schedule);
44
+ return `Added schedule "${job.name}" (${job.schedule}). The daemon runs it on schedule.`;
45
+ }
46
+ case 'list':
47
+ return formatScheduleList(await d.list());
48
+ case 'remove': {
49
+ const name = args[0];
50
+ if (!name)
51
+ throw new Error('usage: openswarm schedule remove <name>');
52
+ return (await d.remove(name)) ? `Removed schedule "${name}".` : `No schedule named "${name}".`;
53
+ }
54
+ case 'pause':
55
+ case 'toggle': {
56
+ const name = args[0];
57
+ if (!name)
58
+ throw new Error('usage: openswarm schedule pause <name>');
59
+ const job = await d.toggle(name);
60
+ if (!job)
61
+ return `No schedule named "${name}".`;
62
+ return `${job.enabled ? 'Resumed' : 'Paused'} schedule "${name}".`;
63
+ }
64
+ default:
65
+ throw new Error(`Unknown schedule action "${action}" (use add|list|remove|pause)`);
66
+ }
67
+ }
68
+ //# sourceMappingURL=scheduleCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduleCommand.js","sourceRoot":"","sources":["../../src/cli/scheduleCommand.ts"],"names":[],"mappings":"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"}