night-orch 0.1.0

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 (911) hide show
  1. package/README.md +138 -0
  2. package/dist/cli/commands/cleanup.d.ts +14 -0
  3. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  4. package/dist/cli/commands/cleanup.js +62 -0
  5. package/dist/cli/commands/cleanup.js.map +1 -0
  6. package/dist/cli/commands/continue.d.ts +9 -0
  7. package/dist/cli/commands/continue.d.ts.map +1 -0
  8. package/dist/cli/commands/continue.js +70 -0
  9. package/dist/cli/commands/continue.js.map +1 -0
  10. package/dist/cli/commands/cost-override.d.ts +11 -0
  11. package/dist/cli/commands/cost-override.d.ts.map +1 -0
  12. package/dist/cli/commands/cost-override.js +76 -0
  13. package/dist/cli/commands/cost-override.js.map +1 -0
  14. package/dist/cli/commands/daily-cost-override.d.ts +11 -0
  15. package/dist/cli/commands/daily-cost-override.d.ts.map +1 -0
  16. package/dist/cli/commands/daily-cost-override.js +71 -0
  17. package/dist/cli/commands/daily-cost-override.js.map +1 -0
  18. package/dist/cli/commands/delete-entry.d.ts +12 -0
  19. package/dist/cli/commands/delete-entry.d.ts.map +1 -0
  20. package/dist/cli/commands/delete-entry.js +68 -0
  21. package/dist/cli/commands/delete-entry.js.map +1 -0
  22. package/dist/cli/commands/doctor.d.ts +9 -0
  23. package/dist/cli/commands/doctor.d.ts.map +1 -0
  24. package/dist/cli/commands/doctor.js +227 -0
  25. package/dist/cli/commands/doctor.js.map +1 -0
  26. package/dist/cli/commands/init.d.ts +2 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -0
  28. package/dist/cli/commands/init.js +73 -0
  29. package/dist/cli/commands/init.js.map +1 -0
  30. package/dist/cli/commands/labels-init.d.ts +9 -0
  31. package/dist/cli/commands/labels-init.d.ts.map +1 -0
  32. package/dist/cli/commands/labels-init.js +52 -0
  33. package/dist/cli/commands/labels-init.js.map +1 -0
  34. package/dist/cli/commands/mcp.d.ts +9 -0
  35. package/dist/cli/commands/mcp.d.ts.map +1 -0
  36. package/dist/cli/commands/mcp.js +52 -0
  37. package/dist/cli/commands/mcp.js.map +1 -0
  38. package/dist/cli/commands/monitoring-init.d.ts +2 -0
  39. package/dist/cli/commands/monitoring-init.d.ts.map +1 -0
  40. package/dist/cli/commands/monitoring-init.js +43 -0
  41. package/dist/cli/commands/monitoring-init.js.map +1 -0
  42. package/dist/cli/commands/notify-test.d.ts +9 -0
  43. package/dist/cli/commands/notify-test.d.ts.map +1 -0
  44. package/dist/cli/commands/notify-test.js +41 -0
  45. package/dist/cli/commands/notify-test.js.map +1 -0
  46. package/dist/cli/commands/rebase.d.ts +9 -0
  47. package/dist/cli/commands/rebase.d.ts.map +1 -0
  48. package/dist/cli/commands/rebase.js +63 -0
  49. package/dist/cli/commands/rebase.js.map +1 -0
  50. package/dist/cli/commands/retry.d.ts +14 -0
  51. package/dist/cli/commands/retry.d.ts.map +1 -0
  52. package/dist/cli/commands/retry.js +52 -0
  53. package/dist/cli/commands/retry.js.map +1 -0
  54. package/dist/cli/commands/run-once.d.ts +9 -0
  55. package/dist/cli/commands/run-once.d.ts.map +1 -0
  56. package/dist/cli/commands/run-once.js +62 -0
  57. package/dist/cli/commands/run-once.js.map +1 -0
  58. package/dist/cli/commands/run.d.ts +9 -0
  59. package/dist/cli/commands/run.d.ts.map +1 -0
  60. package/dist/cli/commands/run.js +142 -0
  61. package/dist/cli/commands/run.js.map +1 -0
  62. package/dist/cli/commands/serve.d.ts +14 -0
  63. package/dist/cli/commands/serve.d.ts.map +1 -0
  64. package/dist/cli/commands/serve.js +51 -0
  65. package/dist/cli/commands/serve.js.map +1 -0
  66. package/dist/cli/commands/settings.d.ts +10 -0
  67. package/dist/cli/commands/settings.d.ts.map +1 -0
  68. package/dist/cli/commands/settings.js +100 -0
  69. package/dist/cli/commands/settings.js.map +1 -0
  70. package/dist/cli/commands/status.d.ts +8 -0
  71. package/dist/cli/commands/status.d.ts.map +1 -0
  72. package/dist/cli/commands/status.js +153 -0
  73. package/dist/cli/commands/status.js.map +1 -0
  74. package/dist/cli/commands/sync.d.ts +9 -0
  75. package/dist/cli/commands/sync.d.ts.map +1 -0
  76. package/dist/cli/commands/sync.js +60 -0
  77. package/dist/cli/commands/sync.js.map +1 -0
  78. package/dist/cli/commands/update.d.ts +4 -0
  79. package/dist/cli/commands/update.d.ts.map +1 -0
  80. package/dist/cli/commands/update.js +29 -0
  81. package/dist/cli/commands/update.js.map +1 -0
  82. package/dist/cli/commands/watch.d.ts +9 -0
  83. package/dist/cli/commands/watch.d.ts.map +1 -0
  84. package/dist/cli/commands/watch.js +56 -0
  85. package/dist/cli/commands/watch.js.map +1 -0
  86. package/dist/cli/commands/web.d.ts +16 -0
  87. package/dist/cli/commands/web.d.ts.map +1 -0
  88. package/dist/cli/commands/web.js +206 -0
  89. package/dist/cli/commands/web.js.map +1 -0
  90. package/dist/cli/index.d.ts +3 -0
  91. package/dist/cli/index.d.ts.map +1 -0
  92. package/dist/cli/index.js +213 -0
  93. package/dist/cli/index.js.map +1 -0
  94. package/dist/cli/init/detector.d.ts +7 -0
  95. package/dist/cli/init/detector.d.ts.map +1 -0
  96. package/dist/cli/init/detector.js +40 -0
  97. package/dist/cli/init/detector.js.map +1 -0
  98. package/dist/cli/init/templates.d.ts +10 -0
  99. package/dist/cli/init/templates.d.ts.map +1 -0
  100. package/dist/cli/init/templates.js +30 -0
  101. package/dist/cli/init/templates.js.map +1 -0
  102. package/dist/cli/tui/actions-bar.d.ts +21 -0
  103. package/dist/cli/tui/actions-bar.d.ts.map +1 -0
  104. package/dist/cli/tui/actions-bar.js +91 -0
  105. package/dist/cli/tui/actions-bar.js.map +1 -0
  106. package/dist/cli/tui/active-runs.d.ts +9 -0
  107. package/dist/cli/tui/active-runs.d.ts.map +1 -0
  108. package/dist/cli/tui/active-runs.js +23 -0
  109. package/dist/cli/tui/active-runs.js.map +1 -0
  110. package/dist/cli/tui/agent-stream.d.ts +10 -0
  111. package/dist/cli/tui/agent-stream.d.ts.map +1 -0
  112. package/dist/cli/tui/agent-stream.js +83 -0
  113. package/dist/cli/tui/agent-stream.js.map +1 -0
  114. package/dist/cli/tui/app.d.ts +40 -0
  115. package/dist/cli/tui/app.d.ts.map +1 -0
  116. package/dist/cli/tui/app.js +995 -0
  117. package/dist/cli/tui/app.js.map +1 -0
  118. package/dist/cli/tui/constants.d.ts +15 -0
  119. package/dist/cli/tui/constants.d.ts.map +1 -0
  120. package/dist/cli/tui/constants.js +102 -0
  121. package/dist/cli/tui/constants.js.map +1 -0
  122. package/dist/cli/tui/cost-bar.d.ts +10 -0
  123. package/dist/cli/tui/cost-bar.d.ts.map +1 -0
  124. package/dist/cli/tui/cost-bar.js +17 -0
  125. package/dist/cli/tui/cost-bar.js.map +1 -0
  126. package/dist/cli/tui/data.d.ts +56 -0
  127. package/dist/cli/tui/data.d.ts.map +1 -0
  128. package/dist/cli/tui/data.js +296 -0
  129. package/dist/cli/tui/data.js.map +1 -0
  130. package/dist/cli/tui/format.d.ts +11 -0
  131. package/dist/cli/tui/format.d.ts.map +1 -0
  132. package/dist/cli/tui/format.js +83 -0
  133. package/dist/cli/tui/format.js.map +1 -0
  134. package/dist/cli/tui/header.d.ts +16 -0
  135. package/dist/cli/tui/header.d.ts.map +1 -0
  136. package/dist/cli/tui/header.js +22 -0
  137. package/dist/cli/tui/header.js.map +1 -0
  138. package/dist/cli/tui/logs-view.d.ts +19 -0
  139. package/dist/cli/tui/logs-view.d.ts.map +1 -0
  140. package/dist/cli/tui/logs-view.js +63 -0
  141. package/dist/cli/tui/logs-view.js.map +1 -0
  142. package/dist/cli/tui/merge-queue-panel.d.ts +9 -0
  143. package/dist/cli/tui/merge-queue-panel.d.ts.map +1 -0
  144. package/dist/cli/tui/merge-queue-panel.js +14 -0
  145. package/dist/cli/tui/merge-queue-panel.js.map +1 -0
  146. package/dist/cli/tui/projects-view.d.ts +25 -0
  147. package/dist/cli/tui/projects-view.d.ts.map +1 -0
  148. package/dist/cli/tui/projects-view.js +145 -0
  149. package/dist/cli/tui/projects-view.js.map +1 -0
  150. package/dist/cli/tui/recent-runs.d.ts +9 -0
  151. package/dist/cli/tui/recent-runs.d.ts.map +1 -0
  152. package/dist/cli/tui/recent-runs.js +20 -0
  153. package/dist/cli/tui/recent-runs.js.map +1 -0
  154. package/dist/cli/tui/runs-view.d.ts +22 -0
  155. package/dist/cli/tui/runs-view.d.ts.map +1 -0
  156. package/dist/cli/tui/runs-view.js +48 -0
  157. package/dist/cli/tui/runs-view.js.map +1 -0
  158. package/dist/cli/tui/settings-view.d.ts +9 -0
  159. package/dist/cli/tui/settings-view.d.ts.map +1 -0
  160. package/dist/cli/tui/settings-view.js +21 -0
  161. package/dist/cli/tui/settings-view.js.map +1 -0
  162. package/dist/cli/tui/stats-view.d.ts +11 -0
  163. package/dist/cli/tui/stats-view.d.ts.map +1 -0
  164. package/dist/cli/tui/stats-view.js +48 -0
  165. package/dist/cli/tui/stats-view.js.map +1 -0
  166. package/dist/cli/tui/titles.d.ts +36 -0
  167. package/dist/cli/tui/titles.d.ts.map +1 -0
  168. package/dist/cli/tui/titles.js +50 -0
  169. package/dist/cli/tui/titles.js.map +1 -0
  170. package/dist/cli/tui/types.d.ts +10 -0
  171. package/dist/cli/tui/types.d.ts.map +1 -0
  172. package/dist/cli/tui/types.js +2 -0
  173. package/dist/cli/tui/types.js.map +1 -0
  174. package/dist/cli/tui/view-model.d.ts +20 -0
  175. package/dist/cli/tui/view-model.d.ts.map +1 -0
  176. package/dist/cli/tui/view-model.js +80 -0
  177. package/dist/cli/tui/view-model.js.map +1 -0
  178. package/dist/components/button/button.tui.d.ts +4 -0
  179. package/dist/components/button/button.tui.d.ts.map +1 -0
  180. package/dist/components/button/button.tui.js +16 -0
  181. package/dist/components/button/button.tui.js.map +1 -0
  182. package/dist/components/button/button.web.d.ts +4 -0
  183. package/dist/components/button/button.web.d.ts.map +1 -0
  184. package/dist/components/button/button.web.js +7 -0
  185. package/dist/components/button/button.web.js.map +1 -0
  186. package/dist/components/button/index.d.ts +5 -0
  187. package/dist/components/button/index.d.ts.map +1 -0
  188. package/dist/components/button/index.js +4 -0
  189. package/dist/components/button/index.js.map +1 -0
  190. package/dist/components/button/types.d.ts +28 -0
  191. package/dist/components/button/types.d.ts.map +1 -0
  192. package/dist/components/button/types.js +2 -0
  193. package/dist/components/button/types.js.map +1 -0
  194. package/dist/components/button/view-model.d.ts +3 -0
  195. package/dist/components/button/view-model.d.ts.map +1 -0
  196. package/dist/components/button/view-model.js +53 -0
  197. package/dist/components/button/view-model.js.map +1 -0
  198. package/dist/components/card/card.tui.d.ts +4 -0
  199. package/dist/components/card/card.tui.d.ts.map +1 -0
  200. package/dist/components/card/card.tui.js +41 -0
  201. package/dist/components/card/card.tui.js.map +1 -0
  202. package/dist/components/card/card.web.d.ts +4 -0
  203. package/dist/components/card/card.web.d.ts.map +1 -0
  204. package/dist/components/card/card.web.js +12 -0
  205. package/dist/components/card/card.web.js.map +1 -0
  206. package/dist/components/card/index.d.ts +5 -0
  207. package/dist/components/card/index.d.ts.map +1 -0
  208. package/dist/components/card/index.js +4 -0
  209. package/dist/components/card/index.js.map +1 -0
  210. package/dist/components/card/types.d.ts +22 -0
  211. package/dist/components/card/types.d.ts.map +1 -0
  212. package/dist/components/card/types.js +2 -0
  213. package/dist/components/card/types.js.map +1 -0
  214. package/dist/components/card/view-model.d.ts +3 -0
  215. package/dist/components/card/view-model.d.ts.map +1 -0
  216. package/dist/components/card/view-model.js +35 -0
  217. package/dist/components/card/view-model.js.map +1 -0
  218. package/dist/components/index.d.ts +5 -0
  219. package/dist/components/index.d.ts.map +1 -0
  220. package/dist/components/index.js +5 -0
  221. package/dist/components/index.js.map +1 -0
  222. package/dist/components/issue-row/index.d.ts +5 -0
  223. package/dist/components/issue-row/index.d.ts.map +1 -0
  224. package/dist/components/issue-row/index.js +4 -0
  225. package/dist/components/issue-row/index.js.map +1 -0
  226. package/dist/components/issue-row/issue-row.tui.d.ts +4 -0
  227. package/dist/components/issue-row/issue-row.tui.d.ts.map +1 -0
  228. package/dist/components/issue-row/issue-row.tui.js +15 -0
  229. package/dist/components/issue-row/issue-row.tui.js.map +1 -0
  230. package/dist/components/issue-row/issue-row.web.d.ts +4 -0
  231. package/dist/components/issue-row/issue-row.web.d.ts.map +1 -0
  232. package/dist/components/issue-row/issue-row.web.js +14 -0
  233. package/dist/components/issue-row/issue-row.web.js.map +1 -0
  234. package/dist/components/issue-row/types.d.ts +18 -0
  235. package/dist/components/issue-row/types.d.ts.map +1 -0
  236. package/dist/components/issue-row/types.js +2 -0
  237. package/dist/components/issue-row/types.js.map +1 -0
  238. package/dist/components/issue-row/view-model.d.ts +3 -0
  239. package/dist/components/issue-row/view-model.d.ts.map +1 -0
  240. package/dist/components/issue-row/view-model.js +31 -0
  241. package/dist/components/issue-row/view-model.js.map +1 -0
  242. package/dist/components/modal/index.d.ts +3 -0
  243. package/dist/components/modal/index.d.ts.map +1 -0
  244. package/dist/components/modal/index.js +2 -0
  245. package/dist/components/modal/index.js.map +1 -0
  246. package/dist/components/modal/modal.web.d.ts +16 -0
  247. package/dist/components/modal/modal.web.d.ts.map +1 -0
  248. package/dist/components/modal/modal.web.js +92 -0
  249. package/dist/components/modal/modal.web.js.map +1 -0
  250. package/dist/components/modal/types.d.ts +15 -0
  251. package/dist/components/modal/types.d.ts.map +1 -0
  252. package/dist/components/modal/types.js +2 -0
  253. package/dist/components/modal/types.js.map +1 -0
  254. package/dist/config/loader.d.ts +23 -0
  255. package/dist/config/loader.d.ts.map +1 -0
  256. package/dist/config/loader.js +136 -0
  257. package/dist/config/loader.js.map +1 -0
  258. package/dist/config/paths.d.ts +6 -0
  259. package/dist/config/paths.d.ts.map +1 -0
  260. package/dist/config/paths.js +24 -0
  261. package/dist/config/paths.js.map +1 -0
  262. package/dist/config/schema.d.ts +3088 -0
  263. package/dist/config/schema.d.ts.map +1 -0
  264. package/dist/config/schema.js +328 -0
  265. package/dist/config/schema.js.map +1 -0
  266. package/dist/discovery/commands.d.ts +33 -0
  267. package/dist/discovery/commands.d.ts.map +1 -0
  268. package/dist/discovery/commands.js +82 -0
  269. package/dist/discovery/commands.js.map +1 -0
  270. package/dist/discovery/decomposer.d.ts +6 -0
  271. package/dist/discovery/decomposer.d.ts.map +1 -0
  272. package/dist/discovery/decomposer.js +102 -0
  273. package/dist/discovery/decomposer.js.map +1 -0
  274. package/dist/discovery/discover.d.ts +21 -0
  275. package/dist/discovery/discover.d.ts.map +1 -0
  276. package/dist/discovery/discover.js +98 -0
  277. package/dist/discovery/discover.js.map +1 -0
  278. package/dist/discovery/followup.d.ts +14 -0
  279. package/dist/discovery/followup.d.ts.map +1 -0
  280. package/dist/discovery/followup.js +27 -0
  281. package/dist/discovery/followup.js.map +1 -0
  282. package/dist/discovery/roles.d.ts +15 -0
  283. package/dist/discovery/roles.d.ts.map +1 -0
  284. package/dist/discovery/roles.js +36 -0
  285. package/dist/discovery/roles.js.map +1 -0
  286. package/dist/discovery/selector.d.ts +13 -0
  287. package/dist/discovery/selector.d.ts.map +1 -0
  288. package/dist/discovery/selector.js +27 -0
  289. package/dist/discovery/selector.js.map +1 -0
  290. package/dist/discovery/triage.d.ts +29 -0
  291. package/dist/discovery/triage.d.ts.map +1 -0
  292. package/dist/discovery/triage.js +61 -0
  293. package/dist/discovery/triage.js.map +1 -0
  294. package/dist/environment/bootstrap.d.ts +19 -0
  295. package/dist/environment/bootstrap.d.ts.map +1 -0
  296. package/dist/environment/bootstrap.js +89 -0
  297. package/dist/environment/bootstrap.js.map +1 -0
  298. package/dist/environment/dedicated.d.ts +17 -0
  299. package/dist/environment/dedicated.d.ts.map +1 -0
  300. package/dist/environment/dedicated.js +68 -0
  301. package/dist/environment/dedicated.js.map +1 -0
  302. package/dist/environment/env-file.d.ts +16 -0
  303. package/dist/environment/env-file.d.ts.map +1 -0
  304. package/dist/environment/env-file.js +74 -0
  305. package/dist/environment/env-file.js.map +1 -0
  306. package/dist/environment/manager.d.ts +33 -0
  307. package/dist/environment/manager.d.ts.map +1 -0
  308. package/dist/environment/manager.js +113 -0
  309. package/dist/environment/manager.js.map +1 -0
  310. package/dist/environment/port.d.ts +15 -0
  311. package/dist/environment/port.d.ts.map +1 -0
  312. package/dist/environment/port.js +21 -0
  313. package/dist/environment/port.js.map +1 -0
  314. package/dist/environment/shared.d.ts +6 -0
  315. package/dist/environment/shared.d.ts.map +1 -0
  316. package/dist/environment/shared.js +30 -0
  317. package/dist/environment/shared.js.map +1 -0
  318. package/dist/events/bus.d.ts +18 -0
  319. package/dist/events/bus.d.ts.map +1 -0
  320. package/dist/events/bus.js +70 -0
  321. package/dist/events/bus.js.map +1 -0
  322. package/dist/events/observability.d.ts +32 -0
  323. package/dist/events/observability.d.ts.map +1 -0
  324. package/dist/events/observability.js +155 -0
  325. package/dist/events/observability.js.map +1 -0
  326. package/dist/events/types.d.ts +18 -0
  327. package/dist/events/types.d.ts.map +1 -0
  328. package/dist/events/types.js +2 -0
  329. package/dist/events/types.js.map +1 -0
  330. package/dist/forge/bot-comment.d.ts +17 -0
  331. package/dist/forge/bot-comment.d.ts.map +1 -0
  332. package/dist/forge/bot-comment.js +30 -0
  333. package/dist/forge/bot-comment.js.map +1 -0
  334. package/dist/forge/factory.d.ts +4 -0
  335. package/dist/forge/factory.d.ts.map +1 -0
  336. package/dist/forge/factory.js +31 -0
  337. package/dist/forge/factory.js.map +1 -0
  338. package/dist/forge/forgejo-client.d.ts +20 -0
  339. package/dist/forge/forgejo-client.d.ts.map +1 -0
  340. package/dist/forge/forgejo-client.js +114 -0
  341. package/dist/forge/forgejo-client.js.map +1 -0
  342. package/dist/forge/forgejo-labels.d.ts +13 -0
  343. package/dist/forge/forgejo-labels.d.ts.map +1 -0
  344. package/dist/forge/forgejo-labels.js +51 -0
  345. package/dist/forge/forgejo-labels.js.map +1 -0
  346. package/dist/forge/forgejo.d.ts +31 -0
  347. package/dist/forge/forgejo.d.ts.map +1 -0
  348. package/dist/forge/forgejo.js +264 -0
  349. package/dist/forge/forgejo.js.map +1 -0
  350. package/dist/forge/github.d.ts +31 -0
  351. package/dist/forge/github.d.ts.map +1 -0
  352. package/dist/forge/github.js +438 -0
  353. package/dist/forge/github.js.map +1 -0
  354. package/dist/forge/status-comment.d.ts +19 -0
  355. package/dist/forge/status-comment.d.ts.map +1 -0
  356. package/dist/forge/status-comment.js +44 -0
  357. package/dist/forge/status-comment.js.map +1 -0
  358. package/dist/forge/types.d.ts +118 -0
  359. package/dist/forge/types.d.ts.map +1 -0
  360. package/dist/forge/types.js +2 -0
  361. package/dist/forge/types.js.map +1 -0
  362. package/dist/git/process.d.ts +15 -0
  363. package/dist/git/process.d.ts.map +1 -0
  364. package/dist/git/process.js +38 -0
  365. package/dist/git/process.js.map +1 -0
  366. package/dist/git/repo.d.ts +64 -0
  367. package/dist/git/repo.d.ts.map +1 -0
  368. package/dist/git/repo.js +158 -0
  369. package/dist/git/repo.js.map +1 -0
  370. package/dist/git/slug.d.ts +13 -0
  371. package/dist/git/slug.d.ts.map +1 -0
  372. package/dist/git/slug.js +28 -0
  373. package/dist/git/slug.js.map +1 -0
  374. package/dist/git/worktree.d.ts +23 -0
  375. package/dist/git/worktree.d.ts.map +1 -0
  376. package/dist/git/worktree.js +200 -0
  377. package/dist/git/worktree.js.map +1 -0
  378. package/dist/labels/bootstrap.d.ts +12 -0
  379. package/dist/labels/bootstrap.d.ts.map +1 -0
  380. package/dist/labels/bootstrap.js +101 -0
  381. package/dist/labels/bootstrap.js.map +1 -0
  382. package/dist/labels/config.d.ts +6 -0
  383. package/dist/labels/config.d.ts.map +1 -0
  384. package/dist/labels/config.js +56 -0
  385. package/dist/labels/config.js.map +1 -0
  386. package/dist/labels/manager.d.ts +10 -0
  387. package/dist/labels/manager.d.ts.map +1 -0
  388. package/dist/labels/manager.js +30 -0
  389. package/dist/labels/manager.js.map +1 -0
  390. package/dist/labels/transitions.d.ts +33 -0
  391. package/dist/labels/transitions.d.ts.map +1 -0
  392. package/dist/labels/transitions.js +81 -0
  393. package/dist/labels/transitions.js.map +1 -0
  394. package/dist/loop/checkpoint.d.ts +60 -0
  395. package/dist/loop/checkpoint.d.ts.map +1 -0
  396. package/dist/loop/checkpoint.js +226 -0
  397. package/dist/loop/checkpoint.js.map +1 -0
  398. package/dist/loop/commit.d.ts +17 -0
  399. package/dist/loop/commit.d.ts.map +1 -0
  400. package/dist/loop/commit.js +65 -0
  401. package/dist/loop/commit.js.map +1 -0
  402. package/dist/loop/context.d.ts +11 -0
  403. package/dist/loop/context.d.ts.map +1 -0
  404. package/dist/loop/context.js +26 -0
  405. package/dist/loop/context.js.map +1 -0
  406. package/dist/loop/cost.d.ts +79 -0
  407. package/dist/loop/cost.d.ts.map +1 -0
  408. package/dist/loop/cost.js +223 -0
  409. package/dist/loop/cost.js.map +1 -0
  410. package/dist/loop/decision.d.ts +22 -0
  411. package/dist/loop/decision.d.ts.map +1 -0
  412. package/dist/loop/decision.js +118 -0
  413. package/dist/loop/decision.js.map +1 -0
  414. package/dist/loop/diff-guard.d.ts +21 -0
  415. package/dist/loop/diff-guard.d.ts.map +1 -0
  416. package/dist/loop/diff-guard.js +52 -0
  417. package/dist/loop/diff-guard.js.map +1 -0
  418. package/dist/loop/engine.d.ts +32 -0
  419. package/dist/loop/engine.d.ts.map +1 -0
  420. package/dist/loop/engine.js +376 -0
  421. package/dist/loop/engine.js.map +1 -0
  422. package/dist/loop/parallel.d.ts +20 -0
  423. package/dist/loop/parallel.d.ts.map +1 -0
  424. package/dist/loop/parallel.js +144 -0
  425. package/dist/loop/parallel.js.map +1 -0
  426. package/dist/loop/plan-summary-comment.d.ts +5 -0
  427. package/dist/loop/plan-summary-comment.d.ts.map +1 -0
  428. package/dist/loop/plan-summary-comment.js +89 -0
  429. package/dist/loop/plan-summary-comment.js.map +1 -0
  430. package/dist/loop/pricing.d.ts +23 -0
  431. package/dist/loop/pricing.d.ts.map +1 -0
  432. package/dist/loop/pricing.js +64 -0
  433. package/dist/loop/pricing.js.map +1 -0
  434. package/dist/loop/review-feedback.d.ts +12 -0
  435. package/dist/loop/review-feedback.d.ts.map +1 -0
  436. package/dist/loop/review-feedback.js +55 -0
  437. package/dist/loop/review-feedback.js.map +1 -0
  438. package/dist/loop/step-executor.d.ts +70 -0
  439. package/dist/loop/step-executor.d.ts.map +1 -0
  440. package/dist/loop/step-executor.js +328 -0
  441. package/dist/loop/step-executor.js.map +1 -0
  442. package/dist/loop/supervisor.d.ts +9 -0
  443. package/dist/loop/supervisor.d.ts.map +1 -0
  444. package/dist/loop/supervisor.js +22 -0
  445. package/dist/loop/supervisor.js.map +1 -0
  446. package/dist/loop/types.d.ts +66 -0
  447. package/dist/loop/types.d.ts.map +1 -0
  448. package/dist/loop/types.js +2 -0
  449. package/dist/loop/types.js.map +1 -0
  450. package/dist/loop/verifier.d.ts +9 -0
  451. package/dist/loop/verifier.d.ts.map +1 -0
  452. package/dist/loop/verifier.js +59 -0
  453. package/dist/loop/verifier.js.map +1 -0
  454. package/dist/loop/workflow.d.ts +38 -0
  455. package/dist/loop/workflow.d.ts.map +1 -0
  456. package/dist/loop/workflow.js +64 -0
  457. package/dist/loop/workflow.js.map +1 -0
  458. package/dist/mcp/http.d.ts +8 -0
  459. package/dist/mcp/http.d.ts.map +1 -0
  460. package/dist/mcp/http.js +76 -0
  461. package/dist/mcp/http.js.map +1 -0
  462. package/dist/mcp/resources/index.d.ts +11 -0
  463. package/dist/mcp/resources/index.d.ts.map +1 -0
  464. package/dist/mcp/resources/index.js +137 -0
  465. package/dist/mcp/resources/index.js.map +1 -0
  466. package/dist/mcp/server.d.ts +16 -0
  467. package/dist/mcp/server.d.ts.map +1 -0
  468. package/dist/mcp/server.js +54 -0
  469. package/dist/mcp/server.js.map +1 -0
  470. package/dist/mcp/tools/index.d.ts +19 -0
  471. package/dist/mcp/tools/index.d.ts.map +1 -0
  472. package/dist/mcp/tools/index.js +847 -0
  473. package/dist/mcp/tools/index.js.map +1 -0
  474. package/dist/mentions/manager.d.ts +12 -0
  475. package/dist/mentions/manager.d.ts.map +1 -0
  476. package/dist/mentions/manager.js +50 -0
  477. package/dist/mentions/manager.js.map +1 -0
  478. package/dist/mentions/resolver.d.ts +12 -0
  479. package/dist/mentions/resolver.d.ts.map +1 -0
  480. package/dist/mentions/resolver.js +26 -0
  481. package/dist/mentions/resolver.js.map +1 -0
  482. package/dist/mentions/tracker.d.ts +8 -0
  483. package/dist/mentions/tracker.d.ts.map +1 -0
  484. package/dist/mentions/tracker.js +18 -0
  485. package/dist/mentions/tracker.js.map +1 -0
  486. package/dist/merge-queue/batch.d.ts +19 -0
  487. package/dist/merge-queue/batch.d.ts.map +1 -0
  488. package/dist/merge-queue/batch.js +100 -0
  489. package/dist/merge-queue/batch.js.map +1 -0
  490. package/dist/merge-queue/bisect.d.ts +10 -0
  491. package/dist/merge-queue/bisect.d.ts.map +1 -0
  492. package/dist/merge-queue/bisect.js +18 -0
  493. package/dist/merge-queue/bisect.js.map +1 -0
  494. package/dist/merge-queue/eligibility.d.ts +25 -0
  495. package/dist/merge-queue/eligibility.d.ts.map +1 -0
  496. package/dist/merge-queue/eligibility.js +125 -0
  497. package/dist/merge-queue/eligibility.js.map +1 -0
  498. package/dist/merge-queue/finalize.d.ts +7 -0
  499. package/dist/merge-queue/finalize.d.ts.map +1 -0
  500. package/dist/merge-queue/finalize.js +36 -0
  501. package/dist/merge-queue/finalize.js.map +1 -0
  502. package/dist/merge-queue/runner.d.ts +13 -0
  503. package/dist/merge-queue/runner.d.ts.map +1 -0
  504. package/dist/merge-queue/runner.js +246 -0
  505. package/dist/merge-queue/runner.js.map +1 -0
  506. package/dist/merge-queue/staging.d.ts +13 -0
  507. package/dist/merge-queue/staging.d.ts.map +1 -0
  508. package/dist/merge-queue/staging.js +88 -0
  509. package/dist/merge-queue/staging.js.map +1 -0
  510. package/dist/merge-queue/types.d.ts +23 -0
  511. package/dist/merge-queue/types.d.ts.map +1 -0
  512. package/dist/merge-queue/types.js +2 -0
  513. package/dist/merge-queue/types.js.map +1 -0
  514. package/dist/metrics/collectors.d.ts +24 -0
  515. package/dist/metrics/collectors.d.ts.map +1 -0
  516. package/dist/metrics/collectors.js +132 -0
  517. package/dist/metrics/collectors.js.map +1 -0
  518. package/dist/metrics/server.d.ts +8 -0
  519. package/dist/metrics/server.d.ts.map +1 -0
  520. package/dist/metrics/server.js +41 -0
  521. package/dist/metrics/server.js.map +1 -0
  522. package/dist/metrics/service.d.ts +26 -0
  523. package/dist/metrics/service.d.ts.map +1 -0
  524. package/dist/metrics/service.js +161 -0
  525. package/dist/metrics/service.js.map +1 -0
  526. package/dist/notify/channels/console.d.ts +10 -0
  527. package/dist/notify/channels/console.d.ts.map +1 -0
  528. package/dist/notify/channels/console.js +17 -0
  529. package/dist/notify/channels/console.js.map +1 -0
  530. package/dist/notify/channels/discord.d.ts +13 -0
  531. package/dist/notify/channels/discord.d.ts.map +1 -0
  532. package/dist/notify/channels/discord.js +183 -0
  533. package/dist/notify/channels/discord.js.map +1 -0
  534. package/dist/notify/channels/github-comment.d.ts +13 -0
  535. package/dist/notify/channels/github-comment.d.ts.map +1 -0
  536. package/dist/notify/channels/github-comment.js +52 -0
  537. package/dist/notify/channels/github-comment.js.map +1 -0
  538. package/dist/notify/channels/smtp.d.ts +17 -0
  539. package/dist/notify/channels/smtp.d.ts.map +1 -0
  540. package/dist/notify/channels/smtp.js +65 -0
  541. package/dist/notify/channels/smtp.js.map +1 -0
  542. package/dist/notify/channels/webhook-common.d.ts +19 -0
  543. package/dist/notify/channels/webhook-common.d.ts.map +1 -0
  544. package/dist/notify/channels/webhook-common.js +111 -0
  545. package/dist/notify/channels/webhook-common.js.map +1 -0
  546. package/dist/notify/channels/webhook.d.ts +13 -0
  547. package/dist/notify/channels/webhook.d.ts.map +1 -0
  548. package/dist/notify/channels/webhook.js +72 -0
  549. package/dist/notify/channels/webhook.js.map +1 -0
  550. package/dist/notify/dispatcher.d.ts +11 -0
  551. package/dist/notify/dispatcher.d.ts.map +1 -0
  552. package/dist/notify/dispatcher.js +66 -0
  553. package/dist/notify/dispatcher.js.map +1 -0
  554. package/dist/notify/factory.d.ts +5 -0
  555. package/dist/notify/factory.d.ts.map +1 -0
  556. package/dist/notify/factory.js +46 -0
  557. package/dist/notify/factory.js.map +1 -0
  558. package/dist/notify/payload.d.ts +8 -0
  559. package/dist/notify/payload.d.ts.map +1 -0
  560. package/dist/notify/payload.js +37 -0
  561. package/dist/notify/payload.js.map +1 -0
  562. package/dist/notify/types.d.ts +34 -0
  563. package/dist/notify/types.d.ts.map +1 -0
  564. package/dist/notify/types.js +2 -0
  565. package/dist/notify/types.js.map +1 -0
  566. package/dist/ops/auto-cleanup.d.ts +14 -0
  567. package/dist/ops/auto-cleanup.d.ts.map +1 -0
  568. package/dist/ops/auto-cleanup.js +58 -0
  569. package/dist/ops/auto-cleanup.js.map +1 -0
  570. package/dist/ops/cleanup.d.ts +32 -0
  571. package/dist/ops/cleanup.d.ts.map +1 -0
  572. package/dist/ops/cleanup.js +208 -0
  573. package/dist/ops/cleanup.js.map +1 -0
  574. package/dist/ops/continue.d.ts +12 -0
  575. package/dist/ops/continue.d.ts.map +1 -0
  576. package/dist/ops/continue.js +240 -0
  577. package/dist/ops/continue.js.map +1 -0
  578. package/dist/ops/cost-override.d.ts +16 -0
  579. package/dist/ops/cost-override.d.ts.map +1 -0
  580. package/dist/ops/cost-override.js +28 -0
  581. package/dist/ops/cost-override.js.map +1 -0
  582. package/dist/ops/daily-cost-override.d.ts +15 -0
  583. package/dist/ops/daily-cost-override.d.ts.map +1 -0
  584. package/dist/ops/daily-cost-override.js +23 -0
  585. package/dist/ops/daily-cost-override.js.map +1 -0
  586. package/dist/ops/delete-entry.d.ts +44 -0
  587. package/dist/ops/delete-entry.d.ts.map +1 -0
  588. package/dist/ops/delete-entry.js +381 -0
  589. package/dist/ops/delete-entry.js.map +1 -0
  590. package/dist/ops/labels-init.d.ts +43 -0
  591. package/dist/ops/labels-init.d.ts.map +1 -0
  592. package/dist/ops/labels-init.js +149 -0
  593. package/dist/ops/labels-init.js.map +1 -0
  594. package/dist/ops/rebase-and-check.d.ts +34 -0
  595. package/dist/ops/rebase-and-check.d.ts.map +1 -0
  596. package/dist/ops/rebase-and-check.js +110 -0
  597. package/dist/ops/rebase-and-check.js.map +1 -0
  598. package/dist/ops/rebase.d.ts +18 -0
  599. package/dist/ops/rebase.d.ts.map +1 -0
  600. package/dist/ops/rebase.js +67 -0
  601. package/dist/ops/rebase.js.map +1 -0
  602. package/dist/ops/retention.d.ts +29 -0
  603. package/dist/ops/retention.d.ts.map +1 -0
  604. package/dist/ops/retention.js +120 -0
  605. package/dist/ops/retention.js.map +1 -0
  606. package/dist/ops/retry.d.ts +19 -0
  607. package/dist/ops/retry.d.ts.map +1 -0
  608. package/dist/ops/retry.js +106 -0
  609. package/dist/ops/retry.js.map +1 -0
  610. package/dist/ops/summary.d.ts +42 -0
  611. package/dist/ops/summary.d.ts.map +1 -0
  612. package/dist/ops/summary.js +86 -0
  613. package/dist/ops/summary.js.map +1 -0
  614. package/dist/ops/sync.d.ts +47 -0
  615. package/dist/ops/sync.d.ts.map +1 -0
  616. package/dist/ops/sync.js +445 -0
  617. package/dist/ops/sync.js.map +1 -0
  618. package/dist/planning/mode.d.ts +14 -0
  619. package/dist/planning/mode.d.ts.map +1 -0
  620. package/dist/planning/mode.js +33 -0
  621. package/dist/planning/mode.js.map +1 -0
  622. package/dist/poller/control.d.ts +21 -0
  623. package/dist/poller/control.d.ts.map +1 -0
  624. package/dist/poller/control.js +42 -0
  625. package/dist/poller/control.js.map +1 -0
  626. package/dist/poller/shutdown.d.ts +20 -0
  627. package/dist/poller/shutdown.d.ts.map +1 -0
  628. package/dist/poller/shutdown.js +94 -0
  629. package/dist/poller/shutdown.js.map +1 -0
  630. package/dist/publishing/pr-body.d.ts +25 -0
  631. package/dist/publishing/pr-body.d.ts.map +1 -0
  632. package/dist/publishing/pr-body.js +119 -0
  633. package/dist/publishing/pr-body.js.map +1 -0
  634. package/dist/publishing/publisher.d.ts +19 -0
  635. package/dist/publishing/publisher.d.ts.map +1 -0
  636. package/dist/publishing/publisher.js +116 -0
  637. package/dist/publishing/publisher.js.map +1 -0
  638. package/dist/publishing/push.d.ts +13 -0
  639. package/dist/publishing/push.d.ts.map +1 -0
  640. package/dist/publishing/push.js +56 -0
  641. package/dist/publishing/push.js.map +1 -0
  642. package/dist/reactions/handler.d.ts +20 -0
  643. package/dist/reactions/handler.d.ts.map +1 -0
  644. package/dist/reactions/handler.js +50 -0
  645. package/dist/reactions/handler.js.map +1 -0
  646. package/dist/reactions/scanner.d.ts +13 -0
  647. package/dist/reactions/scanner.d.ts.map +1 -0
  648. package/dist/reactions/scanner.js +141 -0
  649. package/dist/reactions/scanner.js.map +1 -0
  650. package/dist/reactions/types.d.ts +41 -0
  651. package/dist/reactions/types.d.ts.map +1 -0
  652. package/dist/reactions/types.js +2 -0
  653. package/dist/reactions/types.js.map +1 -0
  654. package/dist/runner/poller.d.ts +19 -0
  655. package/dist/runner/poller.d.ts.map +1 -0
  656. package/dist/runner/poller.js +1358 -0
  657. package/dist/runner/poller.js.map +1 -0
  658. package/dist/settings/registry.d.ts +37 -0
  659. package/dist/settings/registry.d.ts.map +1 -0
  660. package/dist/settings/registry.js +299 -0
  661. package/dist/settings/registry.js.map +1 -0
  662. package/dist/settings/runtime.d.ts +33 -0
  663. package/dist/settings/runtime.d.ts.map +1 -0
  664. package/dist/settings/runtime.js +148 -0
  665. package/dist/settings/runtime.js.map +1 -0
  666. package/dist/state/db.d.ts +3 -0
  667. package/dist/state/db.d.ts.map +1 -0
  668. package/dist/state/db.js +80 -0
  669. package/dist/state/db.js.map +1 -0
  670. package/dist/state/issues.d.ts +47 -0
  671. package/dist/state/issues.d.ts.map +1 -0
  672. package/dist/state/issues.js +188 -0
  673. package/dist/state/issues.js.map +1 -0
  674. package/dist/state/leases.d.ts +27 -0
  675. package/dist/state/leases.d.ts.map +1 -0
  676. package/dist/state/leases.js +75 -0
  677. package/dist/state/leases.js.map +1 -0
  678. package/dist/state/migrations/001-initial.d.ts +3 -0
  679. package/dist/state/migrations/001-initial.d.ts.map +1 -0
  680. package/dist/state/migrations/001-initial.js +70 -0
  681. package/dist/state/migrations/001-initial.js.map +1 -0
  682. package/dist/state/migrations/002-placeholder.d.ts +7 -0
  683. package/dist/state/migrations/002-placeholder.d.ts.map +1 -0
  684. package/dist/state/migrations/002-placeholder.js +8 -0
  685. package/dist/state/migrations/002-placeholder.js.map +1 -0
  686. package/dist/state/migrations/003-mention-tracking.d.ts +3 -0
  687. package/dist/state/migrations/003-mention-tracking.d.ts.map +1 -0
  688. package/dist/state/migrations/003-mention-tracking.js +13 -0
  689. package/dist/state/migrations/003-mention-tracking.js.map +1 -0
  690. package/dist/state/migrations/004-command-tracking.d.ts +3 -0
  691. package/dist/state/migrations/004-command-tracking.d.ts.map +1 -0
  692. package/dist/state/migrations/004-command-tracking.js +13 -0
  693. package/dist/state/migrations/004-command-tracking.js.map +1 -0
  694. package/dist/state/migrations/005-block-reason.d.ts +3 -0
  695. package/dist/state/migrations/005-block-reason.d.ts.map +1 -0
  696. package/dist/state/migrations/005-block-reason.js +4 -0
  697. package/dist/state/migrations/005-block-reason.js.map +1 -0
  698. package/dist/state/migrations/006-parent-run.d.ts +3 -0
  699. package/dist/state/migrations/006-parent-run.d.ts.map +1 -0
  700. package/dist/state/migrations/006-parent-run.js +4 -0
  701. package/dist/state/migrations/006-parent-run.js.map +1 -0
  702. package/dist/state/migrations/007-merge-queue.d.ts +3 -0
  703. package/dist/state/migrations/007-merge-queue.d.ts.map +1 -0
  704. package/dist/state/migrations/007-merge-queue.js +21 -0
  705. package/dist/state/migrations/007-merge-queue.js.map +1 -0
  706. package/dist/state/migrations/008-agent-events.d.ts +3 -0
  707. package/dist/state/migrations/008-agent-events.d.ts.map +1 -0
  708. package/dist/state/migrations/008-agent-events.js +15 -0
  709. package/dist/state/migrations/008-agent-events.js.map +1 -0
  710. package/dist/state/migrations/009-run-titles.d.ts +3 -0
  711. package/dist/state/migrations/009-run-titles.d.ts.map +1 -0
  712. package/dist/state/migrations/009-run-titles.js +11 -0
  713. package/dist/state/migrations/009-run-titles.js.map +1 -0
  714. package/dist/state/migrations/010-issues.d.ts +9 -0
  715. package/dist/state/migrations/010-issues.d.ts.map +1 -0
  716. package/dist/state/migrations/010-issues.js +193 -0
  717. package/dist/state/migrations/010-issues.js.map +1 -0
  718. package/dist/state/migrations/011-rebuild-issues-from-latest-run.d.ts +8 -0
  719. package/dist/state/migrations/011-rebuild-issues-from-latest-run.d.ts.map +1 -0
  720. package/dist/state/migrations/011-rebuild-issues-from-latest-run.js +125 -0
  721. package/dist/state/migrations/011-rebuild-issues-from-latest-run.js.map +1 -0
  722. package/dist/state/migrations/012-settings-overrides.d.ts +3 -0
  723. package/dist/state/migrations/012-settings-overrides.d.ts.map +1 -0
  724. package/dist/state/migrations/012-settings-overrides.js +14 -0
  725. package/dist/state/migrations/012-settings-overrides.js.map +1 -0
  726. package/dist/state/migrations/013-token-usage.d.ts +3 -0
  727. package/dist/state/migrations/013-token-usage.d.ts.map +1 -0
  728. package/dist/state/migrations/013-token-usage.js +21 -0
  729. package/dist/state/migrations/013-token-usage.js.map +1 -0
  730. package/dist/state/migrations/014-daily-run-usage.d.ts +3 -0
  731. package/dist/state/migrations/014-daily-run-usage.d.ts.map +1 -0
  732. package/dist/state/migrations/014-daily-run-usage.js +14 -0
  733. package/dist/state/migrations/014-daily-run-usage.js.map +1 -0
  734. package/dist/state/migrations/015-run-cost-override.d.ts +11 -0
  735. package/dist/state/migrations/015-run-cost-override.d.ts.map +1 -0
  736. package/dist/state/migrations/015-run-cost-override.js +20 -0
  737. package/dist/state/migrations/015-run-cost-override.js.map +1 -0
  738. package/dist/state/migrations/016-daily-cost-cap-override.d.ts +15 -0
  739. package/dist/state/migrations/016-daily-cost-cap-override.d.ts.map +1 -0
  740. package/dist/state/migrations/016-daily-cost-cap-override.js +24 -0
  741. package/dist/state/migrations/016-daily-cost-cap-override.js.map +1 -0
  742. package/dist/state/migrations/017-merge-batch-merged-prs.d.ts +13 -0
  743. package/dist/state/migrations/017-merge-batch-merged-prs.d.ts.map +1 -0
  744. package/dist/state/migrations/017-merge-batch-merged-prs.js +22 -0
  745. package/dist/state/migrations/017-merge-batch-merged-prs.js.map +1 -0
  746. package/dist/state/migrations/018-run-retry-count.d.ts +13 -0
  747. package/dist/state/migrations/018-run-retry-count.d.ts.map +1 -0
  748. package/dist/state/migrations/018-run-retry-count.js +22 -0
  749. package/dist/state/migrations/018-run-retry-count.js.map +1 -0
  750. package/dist/state/migrations/019-runs-active-index-top-level.d.ts +16 -0
  751. package/dist/state/migrations/019-runs-active-index-top-level.d.ts.map +1 -0
  752. package/dist/state/migrations/019-runs-active-index-top-level.js +23 -0
  753. package/dist/state/migrations/019-runs-active-index-top-level.js.map +1 -0
  754. package/dist/state/runs.d.ts +100 -0
  755. package/dist/state/runs.d.ts.map +1 -0
  756. package/dist/state/runs.js +321 -0
  757. package/dist/state/runs.js.map +1 -0
  758. package/dist/state/settings.d.ts +16 -0
  759. package/dist/state/settings.d.ts.map +1 -0
  760. package/dist/state/settings.js +55 -0
  761. package/dist/state/settings.js.map +1 -0
  762. package/dist/state/stats.d.ts +133 -0
  763. package/dist/state/stats.d.ts.map +1 -0
  764. package/dist/state/stats.js +419 -0
  765. package/dist/state/stats.js.map +1 -0
  766. package/dist/supervisor/health.d.ts +24 -0
  767. package/dist/supervisor/health.d.ts.map +1 -0
  768. package/dist/supervisor/health.js +186 -0
  769. package/dist/supervisor/health.js.map +1 -0
  770. package/dist/supervisor/index.d.ts +31 -0
  771. package/dist/supervisor/index.d.ts.map +1 -0
  772. package/dist/supervisor/index.js +387 -0
  773. package/dist/supervisor/index.js.map +1 -0
  774. package/dist/supervisor/status.d.ts +18 -0
  775. package/dist/supervisor/status.d.ts.map +1 -0
  776. package/dist/supervisor/status.js +30 -0
  777. package/dist/supervisor/status.js.map +1 -0
  778. package/dist/supervisor/updater.d.ts +18 -0
  779. package/dist/supervisor/updater.d.ts.map +1 -0
  780. package/dist/supervisor/updater.js +108 -0
  781. package/dist/supervisor/updater.js.map +1 -0
  782. package/dist/utils/build-info.d.ts +6 -0
  783. package/dist/utils/build-info.d.ts.map +1 -0
  784. package/dist/utils/build-info.js +56 -0
  785. package/dist/utils/build-info.js.map +1 -0
  786. package/dist/utils/command.d.ts +8 -0
  787. package/dist/utils/command.d.ts.map +1 -0
  788. package/dist/utils/command.js +71 -0
  789. package/dist/utils/command.js.map +1 -0
  790. package/dist/utils/ids.d.ts +4 -0
  791. package/dist/utils/ids.d.ts.map +1 -0
  792. package/dist/utils/ids.js +17 -0
  793. package/dist/utils/ids.js.map +1 -0
  794. package/dist/utils/install-method.d.ts +4 -0
  795. package/dist/utils/install-method.d.ts.map +1 -0
  796. package/dist/utils/install-method.js +13 -0
  797. package/dist/utils/install-method.js.map +1 -0
  798. package/dist/utils/issue-repo.d.ts +2 -0
  799. package/dist/utils/issue-repo.d.ts.map +1 -0
  800. package/dist/utils/issue-repo.js +7 -0
  801. package/dist/utils/issue-repo.js.map +1 -0
  802. package/dist/utils/logger.d.ts +7 -0
  803. package/dist/utils/logger.d.ts.map +1 -0
  804. package/dist/utils/logger.js +63 -0
  805. package/dist/utils/logger.js.map +1 -0
  806. package/dist/utils/project-root.d.ts +8 -0
  807. package/dist/utils/project-root.d.ts.map +1 -0
  808. package/dist/utils/project-root.js +22 -0
  809. package/dist/utils/project-root.js.map +1 -0
  810. package/dist/utils/sanitize-error.d.ts +36 -0
  811. package/dist/utils/sanitize-error.d.ts.map +1 -0
  812. package/dist/utils/sanitize-error.js +89 -0
  813. package/dist/utils/sanitize-error.js.map +1 -0
  814. package/dist/utils/time.d.ts +7 -0
  815. package/dist/utils/time.d.ts.map +1 -0
  816. package/dist/utils/time.js +47 -0
  817. package/dist/utils/time.js.map +1 -0
  818. package/dist/web/server.d.ts +14 -0
  819. package/dist/web/server.d.ts.map +1 -0
  820. package/dist/web/server.js +1185 -0
  821. package/dist/web/server.js.map +1 -0
  822. package/dist/workers/acp.d.ts +9 -0
  823. package/dist/workers/acp.d.ts.map +1 -0
  824. package/dist/workers/acp.js +190 -0
  825. package/dist/workers/acp.js.map +1 -0
  826. package/dist/workers/acpx-imports.d.ts +18 -0
  827. package/dist/workers/acpx-imports.d.ts.map +1 -0
  828. package/dist/workers/acpx-imports.js +43 -0
  829. package/dist/workers/acpx-imports.js.map +1 -0
  830. package/dist/workers/claude.d.ts +9 -0
  831. package/dist/workers/claude.d.ts.map +1 -0
  832. package/dist/workers/claude.js +341 -0
  833. package/dist/workers/claude.js.map +1 -0
  834. package/dist/workers/codex.d.ts +21 -0
  835. package/dist/workers/codex.d.ts.map +1 -0
  836. package/dist/workers/codex.js +337 -0
  837. package/dist/workers/codex.js.map +1 -0
  838. package/dist/workers/command.d.ts +6 -0
  839. package/dist/workers/command.d.ts.map +1 -0
  840. package/dist/workers/command.js +15 -0
  841. package/dist/workers/command.js.map +1 -0
  842. package/dist/workers/env.d.ts +18 -0
  843. package/dist/workers/env.d.ts.map +1 -0
  844. package/dist/workers/env.js +172 -0
  845. package/dist/workers/env.js.map +1 -0
  846. package/dist/workers/events.d.ts +7 -0
  847. package/dist/workers/events.d.ts.map +1 -0
  848. package/dist/workers/events.js +30 -0
  849. package/dist/workers/events.js.map +1 -0
  850. package/dist/workers/factory.d.ts +6 -0
  851. package/dist/workers/factory.d.ts.map +1 -0
  852. package/dist/workers/factory.js +13 -0
  853. package/dist/workers/factory.js.map +1 -0
  854. package/dist/workers/parsers/coder.d.ts +6 -0
  855. package/dist/workers/parsers/coder.d.ts.map +1 -0
  856. package/dist/workers/parsers/coder.js +59 -0
  857. package/dist/workers/parsers/coder.js.map +1 -0
  858. package/dist/workers/parsers/decomposer.d.ts +16 -0
  859. package/dist/workers/parsers/decomposer.d.ts.map +1 -0
  860. package/dist/workers/parsers/decomposer.js +35 -0
  861. package/dist/workers/parsers/decomposer.js.map +1 -0
  862. package/dist/workers/parsers/extract.d.ts +41 -0
  863. package/dist/workers/parsers/extract.d.ts.map +1 -0
  864. package/dist/workers/parsers/extract.js +231 -0
  865. package/dist/workers/parsers/extract.js.map +1 -0
  866. package/dist/workers/parsers/planner.d.ts +6 -0
  867. package/dist/workers/parsers/planner.d.ts.map +1 -0
  868. package/dist/workers/parsers/planner.js +77 -0
  869. package/dist/workers/parsers/planner.js.map +1 -0
  870. package/dist/workers/parsers/reviewer.d.ts +6 -0
  871. package/dist/workers/parsers/reviewer.d.ts.map +1 -0
  872. package/dist/workers/parsers/reviewer.js +105 -0
  873. package/dist/workers/parsers/reviewer.js.map +1 -0
  874. package/dist/workers/prompt/compiler.d.ts +11 -0
  875. package/dist/workers/prompt/compiler.d.ts.map +1 -0
  876. package/dist/workers/prompt/compiler.js +199 -0
  877. package/dist/workers/prompt/compiler.js.map +1 -0
  878. package/dist/workers/prompt/templates.d.ts +13 -0
  879. package/dist/workers/prompt/templates.d.ts.map +1 -0
  880. package/dist/workers/prompt/templates.js +110 -0
  881. package/dist/workers/prompt/templates.js.map +1 -0
  882. package/dist/workers/registry.d.ts +9 -0
  883. package/dist/workers/registry.d.ts.map +1 -0
  884. package/dist/workers/registry.js +21 -0
  885. package/dist/workers/registry.js.map +1 -0
  886. package/dist/workers/streaming-exec.d.ts +26 -0
  887. package/dist/workers/streaming-exec.d.ts.map +1 -0
  888. package/dist/workers/streaming-exec.js +166 -0
  889. package/dist/workers/streaming-exec.js.map +1 -0
  890. package/dist/workers/timeout.d.ts +17 -0
  891. package/dist/workers/timeout.d.ts.map +1 -0
  892. package/dist/workers/timeout.js +37 -0
  893. package/dist/workers/timeout.js.map +1 -0
  894. package/dist/workers/types.d.ts +120 -0
  895. package/dist/workers/types.d.ts.map +1 -0
  896. package/dist/workers/types.js +2 -0
  897. package/dist/workers/types.js.map +1 -0
  898. package/docker-compose.example.yaml +29 -0
  899. package/examples/config.example.yaml +256 -0
  900. package/examples/night-orch.service +40 -0
  901. package/monitoring/grafana/dashboards/night-orch.json +140 -0
  902. package/monitoring/grafana/provisioning/dashboards/dashboards.yml +10 -0
  903. package/monitoring/grafana/provisioning/datasources/prometheus.yml +9 -0
  904. package/monitoring/prometheus.yml +8 -0
  905. package/package.json +104 -0
  906. package/web/dist/assets/index-CBFNqVuV.js +9 -0
  907. package/web/dist/assets/index-RCNGmuI2.css +1 -0
  908. package/web/dist/icon.svg +10 -0
  909. package/web/dist/index.html +22 -0
  910. package/web/dist/manifest.webmanifest +16 -0
  911. package/web/dist/sw.js +58 -0
@@ -0,0 +1,995 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useMemo, useCallback, useRef } from 'react';
3
+ import { Box, Text, useApp, useInput, useStdout } from 'ink';
4
+ import { RetryEngine } from '../../ops/retry.js';
5
+ import { setIssueCostOverride } from '../../ops/cost-override.js';
6
+ import { setDailyCostCapOverride } from '../../ops/daily-cost-override.js';
7
+ import { SyncEngine } from '../../ops/sync.js';
8
+ import { CleanupEngine } from '../../ops/cleanup.js';
9
+ import { LabelsInitEngine, formatLabelsInitSummary } from '../../ops/labels-init.js';
10
+ import { DeleteIssueEntryEngine } from '../../ops/delete-entry.js';
11
+ import { pollOnce } from '../../runner/poller.js';
12
+ import { queueRebase } from '../../ops/rebase-and-check.js';
13
+ import { queueContinue } from '../../ops/continue.js';
14
+ import { createForgeAdapter } from '../../forge/factory.js';
15
+ import { loadTuiStats } from '../../state/stats.js';
16
+ import { ActionsBar } from './actions-bar.js';
17
+ import { buildIssueList, loadRuns, loadAgentEvents, loadMergeBatches } from './data.js';
18
+ import { Header } from './header.js';
19
+ import { LogsView } from './logs-view.js';
20
+ import { ProjectsView } from './projects-view.js';
21
+ import { RunsView } from './runs-view.js';
22
+ import { SettingsView } from './settings-view.js';
23
+ import { StatsView } from './stats-view.js';
24
+ import { collectMissingTitleTargets, hasReadableTitle } from './titles.js';
25
+ import { TABS } from './constants.js';
26
+ import { formatUtcClock, nowUtcIso } from '../../utils/time.js';
27
+ import { getBuildInfo } from '../../utils/build-info.js';
28
+ import { clearRuntimeSettingOverride, listRuntimeSettings, resolveConfigWithRuntimeSettings, setRuntimeSettingOverride, } from '../../settings/runtime.js';
29
+ const MAX_LOG_LINES = 500;
30
+ const FOCUSED_EVENT_WINDOW_SIZE = 18;
31
+ const MIN_LOG_WINDOW_SIZE = 4;
32
+ const LOG_WINDOW_RESERVED_ROWS = 17;
33
+ const EXIT_GRACE_TIMEOUT_MS = 15_000;
34
+ const CLEANUP_CONFIRM_TIMEOUT_MS = 5_000;
35
+ const BUILD_INFO = getBuildInfo();
36
+ function formatSettingValue(value) {
37
+ if (typeof value === 'boolean')
38
+ return value ? 'true' : 'false';
39
+ return String(value);
40
+ }
41
+ export function resolveTabHotkey(input) {
42
+ if (input === '1')
43
+ return 'runs';
44
+ if (input === '2')
45
+ return 'projects';
46
+ if (input === '3')
47
+ return 'stats';
48
+ if (input === '4')
49
+ return 'logs';
50
+ if (input === '5')
51
+ return 'settings';
52
+ return null;
53
+ }
54
+ export function moveProjectSelection(current, direction, projectCount) {
55
+ const maxProjectIndex = Math.max(0, projectCount - 1);
56
+ return Math.max(0, Math.min(maxProjectIndex, current + direction));
57
+ }
58
+ export function resolveSelectedLogIndex(logs, selectedLogId) {
59
+ if (logs.length === 0)
60
+ return -1;
61
+ if (selectedLogId === null)
62
+ return -1;
63
+ return logs.findIndex((line) => line.id === selectedLogId);
64
+ }
65
+ export function reconcileSelectedLogId(logs, selectedLogId, previousSelectedIndex, previousLogCount) {
66
+ if (logs.length === 0)
67
+ return null;
68
+ const previousTailIndex = previousLogCount > 0 ? previousLogCount - 1 : -1;
69
+ const wasAtTail = previousSelectedIndex >= 0 && previousSelectedIndex >= previousTailIndex;
70
+ const selectedIndex = resolveSelectedLogIndex(logs, selectedLogId);
71
+ if (selectedIndex >= 0) {
72
+ if (wasAtTail && selectedIndex !== logs.length - 1) {
73
+ return logs[logs.length - 1].id;
74
+ }
75
+ return selectedLogId;
76
+ }
77
+ if (wasAtTail || selectedLogId === null) {
78
+ return logs[logs.length - 1].id;
79
+ }
80
+ const fallbackIndex = Math.max(0, Math.min(logs.length - 1, previousSelectedIndex));
81
+ return logs[fallbackIndex].id;
82
+ }
83
+ export function moveLogSelection(logs, selectedLogId, direction) {
84
+ if (logs.length === 0)
85
+ return null;
86
+ const currentIndex = resolveSelectedLogIndex(logs, selectedLogId);
87
+ const safeIndex = currentIndex >= 0 ? currentIndex : logs.length - 1;
88
+ const nextIndex = Math.max(0, Math.min(logs.length - 1, safeIndex + direction));
89
+ return logs[nextIndex].id;
90
+ }
91
+ export function reconcileLogSelectionSnapshot(logs, selectedLogId, previousSelectedIndex, previousLogCount) {
92
+ const nextSelectedLogId = reconcileSelectedLogId(logs, selectedLogId, previousSelectedIndex, previousLogCount);
93
+ return {
94
+ selectedLogId: nextSelectedLogId,
95
+ selectedLogIndex: resolveSelectedLogIndex(logs, nextSelectedLogId),
96
+ logCount: logs.length,
97
+ };
98
+ }
99
+ export function resolveLogWindowSize(termRows) {
100
+ return Math.max(MIN_LOG_WINDOW_SIZE, termRows - LOG_WINDOW_RESERVED_ROWS);
101
+ }
102
+ export function resolveCleanupConfirmationTransition(pending, event) {
103
+ if (!pending) {
104
+ return event === 'pressD' ? 'arm' : 'none';
105
+ }
106
+ if (event === 'pressD')
107
+ return 'confirm';
108
+ if (event === 'pressOther')
109
+ return 'cancel';
110
+ if (event === 'timeout')
111
+ return 'expire';
112
+ return 'none';
113
+ }
114
+ export function resolveActionCommand(args) {
115
+ if (args.input === 'r')
116
+ return 'refresh';
117
+ const isFocusedRun = args.activeTab === 'runs' && args.runsViewMode === 'focus';
118
+ const isFocusedProject = args.activeTab === 'projects' && args.projectsViewMode === 'focus';
119
+ const isFocusedDetail = isFocusedRun || isFocusedProject;
120
+ const monitorOnlyActionKey = args.input === 'p'
121
+ || args.input === 's'
122
+ || args.input === 'D'
123
+ || args.input === 'L';
124
+ if (args.actionBusy)
125
+ return 'none';
126
+ if (!args.controlsEnabled && monitorOnlyActionKey) {
127
+ return 'standaloneMessage';
128
+ }
129
+ // Keep focused detail screens isolated to match their legend.
130
+ if (isFocusedDetail && (args.input === 'p' || args.input === 's' || args.input === 'D' || args.input === 'L')) {
131
+ return 'none';
132
+ }
133
+ if (args.input === 'p')
134
+ return 'poll';
135
+ if (args.input === 's')
136
+ return 'sync';
137
+ if (args.input === 'L')
138
+ return 'labelsInit';
139
+ if (args.input === '%')
140
+ return 'dailyCostOverride';
141
+ if (args.input === 'D') {
142
+ return args.cleanupConfirmPending ? 'cleanupConfirm' : 'cleanupArm';
143
+ }
144
+ if (args.activeTab !== 'runs' || args.runsViewMode !== 'list') {
145
+ return 'none';
146
+ }
147
+ if (args.input === 't')
148
+ return 'retry';
149
+ if (args.input === 'T')
150
+ return 'retryFresh';
151
+ if (args.input === 'c')
152
+ return 'continue';
153
+ if (args.input === '_')
154
+ return 'rebase';
155
+ if (args.input === 'X')
156
+ return 'deleteEntry';
157
+ if (args.input === '$')
158
+ return 'costOverride';
159
+ return 'none';
160
+ }
161
+ export function App({ db, config, pollIntervalMs = 2000, dryRun = false, enableBackgroundPoller = true, }) {
162
+ const { exit } = useApp();
163
+ const { stdout } = useStdout();
164
+ const [termRows, setTermRows] = useState(stdout.rows ?? 24);
165
+ const [tick, setTick] = useState(0);
166
+ const [selectedIssueKey, setSelectedIssueKey] = useState(null);
167
+ const [statusLine, setStatusLine] = useState('Ready');
168
+ const [actionState, setActionState] = useState({ busy: false, action: null });
169
+ const [activeTab, setActiveTab] = useState('runs');
170
+ const [runsViewMode, setRunsViewMode] = useState('list');
171
+ const [projectsViewMode, setProjectsViewMode] = useState('list');
172
+ const [selectedProjectIndex, setSelectedProjectIndex] = useState(0);
173
+ const [selectedSettingIndex, setSelectedSettingIndex] = useState(0);
174
+ const [autoRefresh, setAutoRefresh] = useState(true);
175
+ const [cleanupConfirmPending, setCleanupConfirmPending] = useState(false);
176
+ const [lastRefreshAt, setLastRefreshAt] = useState(nowUtcIso());
177
+ const [titleLookup, setTitleLookup] = useState({ issues: {}, prs: {} });
178
+ const [runEventScrollOffset, setRunEventScrollOffset] = useState(0);
179
+ const [selectedLogId, setSelectedLogId] = useState(null);
180
+ const [logDetailScrollOffset, setLogDetailScrollOffset] = useState(0);
181
+ const [logLines, setLogLines] = useState([]);
182
+ const [startupReady, setStartupReady] = useState(!enableBackgroundPoller);
183
+ const attemptedIssueKeys = useRef(new Set());
184
+ const attemptedPrKeys = useRef(new Set());
185
+ const lastHydrationAt = useRef(0);
186
+ const lastLogCount = useRef(0);
187
+ const selectedLogIndexRef = useRef(-1);
188
+ const logSequence = useRef(1);
189
+ const pollInFlight = useRef(false);
190
+ const pollPromise = useRef(null);
191
+ const actionPromise = useRef(null);
192
+ const shuttingDown = useRef(false);
193
+ const exitTimer = useRef(null);
194
+ const cleanupConfirmTimer = useRef(null);
195
+ useEffect(() => {
196
+ const onResize = () => setTermRows(stdout.rows ?? 24);
197
+ stdout.on('resize', onResize);
198
+ return () => { stdout.off('resize', onResize); };
199
+ }, [stdout]);
200
+ const appendLog = useCallback((level, message) => {
201
+ setLogLines((current) => {
202
+ const next = [
203
+ ...current,
204
+ {
205
+ id: logSequence.current++,
206
+ createdAt: nowUtcIso(),
207
+ level,
208
+ message,
209
+ },
210
+ ];
211
+ if (next.length <= MAX_LOG_LINES)
212
+ return next;
213
+ return next.slice(next.length - MAX_LOG_LINES);
214
+ });
215
+ }, []);
216
+ const runtimeConfig = useMemo(() => resolveConfigWithRuntimeSettings(config, db), [config, db, tick]);
217
+ const effectivePollIntervalMs = runtimeConfig.github.pollIntervalSeconds > 0
218
+ ? runtimeConfig.github.pollIntervalSeconds * 1000
219
+ : pollIntervalMs;
220
+ const runtimeSettings = useMemo(() => listRuntimeSettings(config, db), [config, db, tick]);
221
+ const forgeByRepo = useMemo(() => {
222
+ const map = new Map();
223
+ for (const repoConfig of config.repos) {
224
+ map.set(repoConfig.repo, createForgeAdapter(repoConfig, config));
225
+ }
226
+ return map;
227
+ }, [config]);
228
+ useEffect(() => {
229
+ if (!autoRefresh)
230
+ return;
231
+ const timer = setInterval(() => {
232
+ setTick((t) => t + 1);
233
+ }, effectivePollIntervalMs);
234
+ return () => clearInterval(timer);
235
+ }, [autoRefresh, effectivePollIntervalMs]);
236
+ useEffect(() => {
237
+ setLastRefreshAt(nowUtcIso());
238
+ }, [tick]);
239
+ useEffect(() => {
240
+ if (!enableBackgroundPoller)
241
+ return;
242
+ let alive = true;
243
+ void (async () => {
244
+ appendLog('info', 'startup recovery: begin');
245
+ try {
246
+ const { LeaseManager } = await import('../../state/leases.js');
247
+ const leaseManager = new LeaseManager(db);
248
+ const releasedLeases = leaseManager.releaseAll();
249
+ if (releasedLeases > 0) {
250
+ appendLog('info', `startup recovery: released ${releasedLeases} orphaned lease(s)`);
251
+ }
252
+ }
253
+ catch (err) {
254
+ appendLog('warn', `startup recovery: lease cleanup failed: ${err.message}`);
255
+ }
256
+ try {
257
+ const startupConfig = resolveConfigWithRuntimeSettings(config, db);
258
+ const syncEngine = new SyncEngine(db, startupConfig);
259
+ const syncResult = await syncEngine.reconcile(dryRun);
260
+ appendLog('info', `startup recovery: ${syncResult.reconciledRuns.length} reconciled, ${syncResult.expiredLeases} expired lease(s)`);
261
+ }
262
+ catch (err) {
263
+ appendLog('warn', `startup recovery: sync failed: ${err.message}`);
264
+ }
265
+ if (!alive)
266
+ return;
267
+ setStartupReady(true);
268
+ setTick((t) => t + 1);
269
+ })();
270
+ return () => {
271
+ alive = false;
272
+ };
273
+ }, [appendLog, config, db, dryRun, enableBackgroundPoller]);
274
+ const runs = useMemo(() => loadRuns(db), [db, tick]);
275
+ const issues = useMemo(() => buildIssueList(runs), [runs]);
276
+ const selectedIndex = issues.findIndex((issue) => issue.key === selectedIssueKey);
277
+ const selectedIssue = selectedIndex >= 0 ? (issues[selectedIndex] ?? null) : (issues[0] ?? null);
278
+ const selectedRun = selectedIssue?.runs[0] ?? null;
279
+ const selectedRunEvents = useMemo(() => (selectedRun ? loadAgentEvents(db, selectedRun.id, runsViewMode === 'focus' ? 240 : 12) : []), [db, tick, selectedRun?.id, runsViewMode]);
280
+ const mergeBatches = useMemo(() => loadMergeBatches(db), [db, tick]);
281
+ const stats = useMemo(() => loadTuiStats(db, { costModel: runtimeConfig.cost.model }), [db, runtimeConfig.cost.model, tick]);
282
+ const logWindowSize = useMemo(() => resolveLogWindowSize(termRows), [termRows]);
283
+ const selectedLogIndex = useMemo(() => resolveSelectedLogIndex(logLines, selectedLogId), [logLines, selectedLogId]);
284
+ useEffect(() => {
285
+ const snapshot = reconcileLogSelectionSnapshot(logLines, selectedLogId, selectedLogIndexRef.current, lastLogCount.current);
286
+ setSelectedLogId(snapshot.selectedLogId);
287
+ selectedLogIndexRef.current = snapshot.selectedLogIndex;
288
+ lastLogCount.current = snapshot.logCount;
289
+ }, [logLines, selectedLogId]);
290
+ useEffect(() => {
291
+ setLogDetailScrollOffset(0);
292
+ }, [selectedLogId]);
293
+ useEffect(() => {
294
+ const maxOffset = Math.max(0, selectedRunEvents.length - FOCUSED_EVENT_WINDOW_SIZE);
295
+ setRunEventScrollOffset((current) => Math.min(current, maxOffset));
296
+ }, [selectedRunEvents.length]);
297
+ useEffect(() => {
298
+ if (issues.length === 0) {
299
+ if (selectedIssueKey !== null)
300
+ setSelectedIssueKey(null);
301
+ return;
302
+ }
303
+ if (!selectedIssueKey || !issues.some((issue) => issue.key === selectedIssueKey)) {
304
+ setSelectedIssueKey(issues[0].key);
305
+ }
306
+ }, [issues, selectedIssueKey]);
307
+ useEffect(() => {
308
+ const maxIndex = Math.max(0, config.repos.length - 1);
309
+ setSelectedProjectIndex((current) => Math.max(0, Math.min(current, maxIndex)));
310
+ }, [config.repos]);
311
+ useEffect(() => {
312
+ const maxIndex = Math.max(0, runtimeSettings.length - 1);
313
+ setSelectedSettingIndex((current) => Math.max(0, Math.min(current, maxIndex)));
314
+ }, [runtimeSettings.length]);
315
+ useEffect(() => {
316
+ const now = Date.now();
317
+ if (now - lastHydrationAt.current < 3000) {
318
+ return;
319
+ }
320
+ const missing = collectMissingTitleTargets(runs, titleLookup, attemptedIssueKeys.current, attemptedPrKeys.current, 6);
321
+ if (missing.issues.length === 0 && missing.prs.length === 0) {
322
+ return;
323
+ }
324
+ lastHydrationAt.current = now;
325
+ for (const issue of missing.issues) {
326
+ attemptedIssueKeys.current.add(issue.key);
327
+ }
328
+ for (const pr of missing.prs) {
329
+ attemptedPrKeys.current.add(pr.key);
330
+ }
331
+ void (async () => {
332
+ const nextIssueTitles = {};
333
+ const nextPrTitles = {};
334
+ const updateIssueStmt = db.prepare(`UPDATE runs
335
+ SET issue_title = ?
336
+ WHERE repo = ?
337
+ AND issue_number = ?
338
+ AND (issue_title IS NULL OR TRIM(issue_title) = '')`);
339
+ const updateIssueAggregateStmt = db.prepare(`UPDATE issues
340
+ SET issue_title = ?
341
+ WHERE repo = ?
342
+ AND issue_number = ?
343
+ AND (issue_title IS NULL OR TRIM(issue_title) = '')`);
344
+ const updatePrStmt = db.prepare(`UPDATE runs
345
+ SET pr_title = ?
346
+ WHERE repo = ?
347
+ AND pr_number = ?
348
+ AND (pr_title IS NULL OR TRIM(pr_title) = '')`);
349
+ const updatePrAggregateStmt = db.prepare(`UPDATE issues
350
+ SET pr_title = ?
351
+ WHERE repo = ?
352
+ AND pr_number = ?
353
+ AND (pr_title IS NULL OR TRIM(pr_title) = '')`);
354
+ for (const target of missing.issues) {
355
+ const forge = forgeByRepo.get(target.repo);
356
+ if (!forge)
357
+ continue;
358
+ try {
359
+ const issue = await forge.getIssue(target.repo, target.issueNumber);
360
+ if (hasReadableTitle(issue.title)) {
361
+ const title = issue.title.trim();
362
+ nextIssueTitles[target.key] = title;
363
+ updateIssueStmt.run(title, target.repo, target.issueNumber);
364
+ updateIssueAggregateStmt.run(title, target.repo, target.issueNumber);
365
+ }
366
+ }
367
+ catch {
368
+ // Best effort title hydration; keep previous UI value when unavailable.
369
+ }
370
+ }
371
+ for (const target of missing.prs) {
372
+ const forge = forgeByRepo.get(target.repo);
373
+ if (!forge?.getPR)
374
+ continue;
375
+ try {
376
+ const pr = await forge.getPR(target.repo, target.prNumber);
377
+ if (hasReadableTitle(pr.title)) {
378
+ const title = pr.title.trim();
379
+ nextPrTitles[target.key] = title;
380
+ updatePrStmt.run(title, target.repo, target.prNumber);
381
+ updatePrAggregateStmt.run(title, target.repo, target.prNumber);
382
+ }
383
+ }
384
+ catch {
385
+ // Best effort title hydration; keep previous UI value when unavailable.
386
+ }
387
+ }
388
+ if (Object.keys(nextIssueTitles).length === 0 && Object.keys(nextPrTitles).length === 0) {
389
+ return;
390
+ }
391
+ setTitleLookup((current) => ({
392
+ issues: { ...current.issues, ...nextIssueTitles },
393
+ prs: { ...current.prs, ...nextPrTitles },
394
+ }));
395
+ setTick((t) => t + 1);
396
+ })();
397
+ }, [db, forgeByRepo, runs, titleLookup]);
398
+ const runPollCycle = useCallback(async (trigger, targetIssue) => {
399
+ if (pollInFlight.current) {
400
+ return 'poll already in progress';
401
+ }
402
+ pollInFlight.current = true;
403
+ const p = (async () => {
404
+ const target = trigger === 'manual' && targetIssue
405
+ ? { repo: targetIssue.repo, issueNumber: targetIssue.issue_number }
406
+ : undefined;
407
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
408
+ const result = await pollOnce(currentRuntimeConfig, db, dryRun, undefined, target);
409
+ const targetSuffix = target ? ` for ${target.repo}#${target.issueNumber}` : '';
410
+ const summary = `${result.processed} processed, ${result.errors} error(s)${targetSuffix}${dryRun ? ' (dry-run)' : ''}`;
411
+ appendLog('info', `${trigger} poll: ${summary}`);
412
+ return summary;
413
+ })();
414
+ pollPromise.current = p;
415
+ try {
416
+ return await p;
417
+ }
418
+ catch (err) {
419
+ appendLog('error', `${trigger} poll failed: ${err.message}`);
420
+ throw err;
421
+ }
422
+ finally {
423
+ pollInFlight.current = false;
424
+ pollPromise.current = null;
425
+ setTick((t) => t + 1);
426
+ }
427
+ }, [appendLog, config, db, dryRun]);
428
+ useEffect(() => {
429
+ if (!enableBackgroundPoller || !startupReady || !autoRefresh)
430
+ return;
431
+ let stopped = false;
432
+ const cycle = async () => {
433
+ if (stopped || shuttingDown.current)
434
+ return;
435
+ try {
436
+ const summary = await runPollCycle('auto');
437
+ setStatusLine(`poll: ${summary}`);
438
+ }
439
+ catch (err) {
440
+ setStatusLine(`poll failed: ${err.message}`);
441
+ }
442
+ };
443
+ void cycle();
444
+ const timer = setInterval(() => {
445
+ void cycle();
446
+ }, effectivePollIntervalMs);
447
+ return () => {
448
+ stopped = true;
449
+ clearInterval(timer);
450
+ };
451
+ }, [autoRefresh, effectivePollIntervalMs, enableBackgroundPoller, runPollCycle, startupReady]);
452
+ const moveSelection = useCallback((direction) => {
453
+ if (issues.length === 0)
454
+ return;
455
+ const currentIndex = selectedIssue
456
+ ? issues.findIndex((issue) => issue.key === selectedIssue.key)
457
+ : 0;
458
+ const safeIndex = currentIndex >= 0 ? currentIndex : 0;
459
+ const nextIndex = Math.max(0, Math.min(issues.length - 1, safeIndex + direction));
460
+ const nextIssue = issues[nextIndex];
461
+ if (nextIssue) {
462
+ setSelectedIssueKey(nextIssue.key);
463
+ }
464
+ }, [issues, selectedIssue]);
465
+ const switchTab = useCallback((direction) => {
466
+ const currentIndex = TABS.findIndex((tab) => tab.id === activeTab);
467
+ const nextIndex = Math.max(0, Math.min(TABS.length - 1, currentIndex + direction));
468
+ const next = TABS[nextIndex];
469
+ if (next)
470
+ setActiveTab(next.id);
471
+ }, [activeTab]);
472
+ const moveSettingSelection = useCallback((direction) => {
473
+ const maxIndex = Math.max(0, runtimeSettings.length - 1);
474
+ setSelectedSettingIndex((current) => Math.max(0, Math.min(maxIndex, current + direction)));
475
+ }, [runtimeSettings.length]);
476
+ const forceRefresh = useCallback(() => {
477
+ setTick((t) => t + 1);
478
+ setStatusLine(`Refreshed at ${formatUtcClock(nowUtcIso())}`);
479
+ }, []);
480
+ const runAction = useCallback(async (actionName, actionFn) => {
481
+ if (actionState.busy)
482
+ return;
483
+ setActionState({ busy: true, action: actionName });
484
+ setStatusLine(`Running ${actionName}...`);
485
+ appendLog('info', `action ${actionName}: start`);
486
+ const actionTask = actionFn();
487
+ actionPromise.current = actionTask;
488
+ try {
489
+ const result = await actionTask;
490
+ setStatusLine(`${actionName}: ${result}`);
491
+ appendLog('info', `action ${actionName}: ${result}`);
492
+ }
493
+ catch (err) {
494
+ const message = err.message;
495
+ setStatusLine(`${actionName} failed: ${message}`);
496
+ appendLog('error', `action ${actionName} failed: ${message}`);
497
+ }
498
+ finally {
499
+ if (actionPromise.current === actionTask) {
500
+ actionPromise.current = null;
501
+ }
502
+ setActionState({ busy: false, action: null });
503
+ setTick((t) => t + 1);
504
+ }
505
+ }, [actionState.busy, appendLog]);
506
+ const runRetry = useCallback(async (fresh = false) => {
507
+ const label = fresh ? 'retry-fresh' : 'retry';
508
+ await runAction(label, async () => {
509
+ if (!selectedIssue)
510
+ throw new Error('No issue selected');
511
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
512
+ const engine = new RetryEngine(db, currentRuntimeConfig);
513
+ await engine.retry(selectedIssue.repo, selectedIssue.issue_number, {
514
+ immediate: false,
515
+ resetPlan: fresh,
516
+ resetBranch: fresh,
517
+ dryRun,
518
+ });
519
+ const suffix = fresh ? ' (fresh start)' : '';
520
+ return `queued ${selectedIssue.repo}#${selectedIssue.issue_number}${suffix}${dryRun ? ' (dry-run)' : ''}`;
521
+ });
522
+ }, [config, db, dryRun, runAction, selectedIssue]);
523
+ const runSync = useCallback(async () => {
524
+ await runAction('sync', async () => {
525
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
526
+ const engine = new SyncEngine(db, currentRuntimeConfig);
527
+ const result = await engine.reconcile(dryRun);
528
+ return `${result.reconciledRuns.length} reconciled, ${result.labelCorrections.length} label fixes, ${result.expiredLeases} expired lease(s), ${result.orphanedWorktrees.length} orphaned worktree(s)${dryRun ? ' (dry-run)' : ''}`;
529
+ });
530
+ }, [config, db, dryRun, runAction]);
531
+ const runCleanup = useCallback(async () => {
532
+ await runAction('cleanup', async () => {
533
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
534
+ const engine = new CleanupEngine(db, currentRuntimeConfig);
535
+ const result = await engine.run({
536
+ completedWorktrees: true,
537
+ errorWorktreeAgeDays: 7,
538
+ mergedBranches: false,
539
+ logArchiveAgeDays: 30,
540
+ dryRun,
541
+ });
542
+ const freed = result.freedDiskMb > 0 ? `, freed ${result.freedDiskMb.toFixed(1)} MB` : '';
543
+ return `${result.removedWorktrees.length} worktree(s), ${result.removedBranches.length} branch(es), ${result.archivedLogs.length} log(s), ${result.expiredLeases} lease(s)${freed}${dryRun ? ' (dry-run)' : ''}`;
544
+ });
545
+ }, [config, db, dryRun, runAction]);
546
+ const runLabelsInit = useCallback(async () => {
547
+ await runAction('labels-init', async () => {
548
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
549
+ const targetRepo = activeTab === 'projects'
550
+ ? currentRuntimeConfig.repos[selectedProjectIndex]?.repo
551
+ : selectedIssue?.repo ?? currentRuntimeConfig.repos[0]?.repo;
552
+ if (!targetRepo) {
553
+ throw new Error('No repositories configured');
554
+ }
555
+ const engine = new LabelsInitEngine(currentRuntimeConfig);
556
+ const result = await engine.run({
557
+ targetRepo,
558
+ dryRun,
559
+ });
560
+ return `${targetRepo}: ${formatLabelsInitSummary(result)}`;
561
+ });
562
+ }, [activeTab, config, dryRun, runAction, selectedIssue, selectedProjectIndex]);
563
+ const clearCleanupConfirmation = useCallback(() => {
564
+ if (cleanupConfirmTimer.current) {
565
+ clearTimeout(cleanupConfirmTimer.current);
566
+ cleanupConfirmTimer.current = null;
567
+ }
568
+ setCleanupConfirmPending(false);
569
+ }, []);
570
+ const runPoll = useCallback(async () => {
571
+ await runAction('poll', async () => runPollCycle('manual', selectedIssue));
572
+ }, [runAction, runPollCycle, selectedIssue]);
573
+ const runRebase = useCallback(async () => {
574
+ await runAction('rebase', async () => {
575
+ const target = selectedIssue ?? issues.find((issue) => issue.status === 'review_ready');
576
+ if (!target)
577
+ throw new Error('No issue selected');
578
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
579
+ const repoConfig = currentRuntimeConfig.repos.find((r) => r.repo === target.repo);
580
+ if (!repoConfig)
581
+ throw new Error(`Repo not found in config: ${target.repo}`);
582
+ const forge = createForgeAdapter(repoConfig, currentRuntimeConfig);
583
+ let botUser = '';
584
+ try {
585
+ const auth = await forge.validateAuth();
586
+ botUser = auth.user;
587
+ }
588
+ catch {
589
+ // Best effort only.
590
+ }
591
+ const result = await queueRebase(db, forge, repoConfig, target.issue_number, botUser);
592
+ return `${target.repo}#${target.issue_number}: ${result.reason}`;
593
+ });
594
+ }, [config, db, issues, runAction, selectedIssue]);
595
+ const runContinue = useCallback(async () => {
596
+ await runAction('continue', async () => {
597
+ const target = selectedIssue ?? issues.find((issue) => issue.status === 'blocked' || issue.status === 'review_ready' || issue.status === 'error');
598
+ if (!target)
599
+ throw new Error('No issue selected');
600
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
601
+ const repoConfig = currentRuntimeConfig.repos.find((r) => r.repo === target.repo);
602
+ if (!repoConfig)
603
+ throw new Error(`Repo not found in config: ${target.repo}`);
604
+ const forge = createForgeAdapter(repoConfig, currentRuntimeConfig);
605
+ let botUser = '';
606
+ try {
607
+ const auth = await forge.validateAuth();
608
+ botUser = auth.user;
609
+ }
610
+ catch {
611
+ // Best effort only.
612
+ }
613
+ const result = await queueContinue(db, forge, repoConfig, target.issue_number, botUser, { dryRun });
614
+ return `${target.repo}#${target.issue_number}: ${result.reason}${dryRun ? ' (dry-run)' : ''}`;
615
+ });
616
+ }, [config, db, dryRun, issues, runAction, selectedIssue]);
617
+ const runDeleteEntry = useCallback(async () => {
618
+ await runAction('delete-entry', async () => {
619
+ if (!selectedIssue)
620
+ throw new Error('No issue selected');
621
+ const currentRuntimeConfig = resolveConfigWithRuntimeSettings(config, db);
622
+ const engine = new DeleteIssueEntryEngine(db, currentRuntimeConfig);
623
+ const result = await engine.deleteEntry(selectedIssue.repo, selectedIssue.issue_number, {
624
+ dryRun,
625
+ force: false,
626
+ });
627
+ if (!result.found) {
628
+ return `no local entry for ${selectedIssue.repo}#${selectedIssue.issue_number}${dryRun ? ' (dry-run)' : ''}`;
629
+ }
630
+ const warningSuffix = result.worktreesFailed.length > 0
631
+ ? `, ${result.worktreesFailed.length} worktree warning(s)`
632
+ : '';
633
+ return `${selectedIssue.repo}#${selectedIssue.issue_number}: ${result.runsDeleted} run(s), ${result.issuesDeleted} issue row(s), ${result.worktreesRemoved.length} worktree(s)${warningSuffix}${dryRun ? ' (dry-run)' : ''}`;
634
+ });
635
+ }, [config, db, dryRun, runAction, selectedIssue]);
636
+ const runCostOverride = useCallback(async () => {
637
+ if (!selectedIssue) {
638
+ setStatusLine('No issue selected');
639
+ return;
640
+ }
641
+ await runAction('cost-override', async () => {
642
+ // TUI grants a deterministic headroom boost: double the current per-run
643
+ // cap. For a bespoke amount, use CLI `night-orch cost-override` or MCP.
644
+ const override = Math.max(config.security.maxCostPerRunUsd * 2, (selectedIssue.estimated_cost_usd ?? 0) + config.security.maxCostPerRunUsd);
645
+ const result = setIssueCostOverride(db, selectedIssue.repo, selectedIssue.issue_number, override);
646
+ return `${selectedIssue.repo}#${selectedIssue.issue_number}: cost override $${override.toFixed(2)} (daily cap bypassed for run ${result.runId})`;
647
+ });
648
+ }, [config, db, runAction, selectedIssue]);
649
+ const runDailyCostOverride = useCallback(async () => {
650
+ await runAction('daily-cost-override', async () => {
651
+ // Deterministic headroom boost: double today's effective daily cap.
652
+ // For a bespoke amount, use CLI `night-orch daily-cost-override` or MCP.
653
+ const override = config.security.maxDailyCostUsd * 2;
654
+ const result = setDailyCostCapOverride(db, override);
655
+ return `daily cap override for ${result.date}: $${override.toFixed(2)} (auto-expires at 00:00 UTC)`;
656
+ });
657
+ }, [config, db, runAction]);
658
+ const runSetSetting = useCallback(async (nextValue) => {
659
+ const target = runtimeSettings[selectedSettingIndex];
660
+ if (!target) {
661
+ setStatusLine('No setting selected');
662
+ return;
663
+ }
664
+ await runAction('setting-set', async () => {
665
+ const result = setRuntimeSettingOverride(config, db, target.key, nextValue, 'tui');
666
+ return `${result.setting.key} => ${formatSettingValue(result.setting.effectiveValue)}`;
667
+ });
668
+ }, [config, db, runAction, runtimeSettings, selectedSettingIndex]);
669
+ const runClearSetting = useCallback(async () => {
670
+ const target = runtimeSettings[selectedSettingIndex];
671
+ if (!target) {
672
+ setStatusLine('No setting selected');
673
+ return;
674
+ }
675
+ await runAction('setting-unset', async () => {
676
+ const result = clearRuntimeSettingOverride(config, db, target.key);
677
+ return `${result.setting.key} => ${formatSettingValue(result.setting.effectiveValue)} (${result.setting.source})`;
678
+ });
679
+ }, [config, db, runAction, runtimeSettings, selectedSettingIndex]);
680
+ const runAdjustSelectedSetting = useCallback(async (direction) => {
681
+ const target = runtimeSettings[selectedSettingIndex];
682
+ if (!target) {
683
+ setStatusLine('No setting selected');
684
+ return;
685
+ }
686
+ if (target.type !== 'number') {
687
+ setStatusLine(`"${target.key}" is boolean. Use space to toggle.`);
688
+ return;
689
+ }
690
+ const current = target.effectiveValue;
691
+ if (typeof current !== 'number') {
692
+ setStatusLine(`"${target.key}" has non-numeric effective value`);
693
+ return;
694
+ }
695
+ const step = target.step ?? 1;
696
+ const min = target.min ?? Number.NEGATIVE_INFINITY;
697
+ const max = target.max ?? Number.POSITIVE_INFINITY;
698
+ const next = Math.max(min, Math.min(max, current + direction * step));
699
+ if (next === current) {
700
+ setStatusLine(`"${target.key}" already at bound`);
701
+ return;
702
+ }
703
+ await runSetSetting(next);
704
+ }, [runSetSetting, runtimeSettings, selectedSettingIndex]);
705
+ const runToggleSelectedSetting = useCallback(async () => {
706
+ const target = runtimeSettings[selectedSettingIndex];
707
+ if (!target) {
708
+ setStatusLine('No setting selected');
709
+ return;
710
+ }
711
+ if (target.type !== 'boolean') {
712
+ setStatusLine(`"${target.key}" is numeric. Use +/- to adjust.`);
713
+ return;
714
+ }
715
+ const current = target.effectiveValue;
716
+ if (typeof current !== 'boolean') {
717
+ setStatusLine(`"${target.key}" has non-boolean effective value`);
718
+ return;
719
+ }
720
+ await runSetSetting(!current);
721
+ }, [runSetSetting, runtimeSettings, selectedSettingIndex]);
722
+ const gracefulExit = useCallback(() => {
723
+ if (shuttingDown.current) {
724
+ if (exitTimer.current) {
725
+ clearTimeout(exitTimer.current);
726
+ exitTimer.current = null;
727
+ }
728
+ setStatusLine('Forced shutdown');
729
+ exit();
730
+ return;
731
+ }
732
+ shuttingDown.current = true;
733
+ const pendingTasks = [pollPromise.current, actionPromise.current].filter((task) => task !== null);
734
+ if (pendingTasks.length === 0) {
735
+ exit();
736
+ return;
737
+ }
738
+ setStatusLine('Shutting down — waiting for current operation to finish (press q/Ctrl+C again to force)...');
739
+ exitTimer.current = setTimeout(() => {
740
+ setStatusLine('Shutdown timeout reached — forcing exit');
741
+ exit();
742
+ }, EXIT_GRACE_TIMEOUT_MS);
743
+ void Promise.allSettled(pendingTasks).finally(() => {
744
+ if (exitTimer.current) {
745
+ clearTimeout(exitTimer.current);
746
+ exitTimer.current = null;
747
+ }
748
+ exit();
749
+ });
750
+ }, [exit]);
751
+ useEffect(() => {
752
+ return () => {
753
+ if (exitTimer.current) {
754
+ clearTimeout(exitTimer.current);
755
+ exitTimer.current = null;
756
+ }
757
+ if (cleanupConfirmTimer.current) {
758
+ clearTimeout(cleanupConfirmTimer.current);
759
+ cleanupConfirmTimer.current = null;
760
+ }
761
+ };
762
+ }, []);
763
+ useInput((input, key) => {
764
+ if (key.ctrl && input === 'c') {
765
+ gracefulExit();
766
+ return;
767
+ }
768
+ const focusedRunDetail = activeTab === 'runs' && runsViewMode === 'focus';
769
+ const focusedProjectDetail = activeTab === 'projects' && projectsViewMode === 'focus';
770
+ if (cleanupConfirmPending && (input !== 'D' || focusedRunDetail || focusedProjectDetail)) {
771
+ const transition = resolveCleanupConfirmationTransition(true, 'pressOther');
772
+ if (transition === 'cancel') {
773
+ clearCleanupConfirmation();
774
+ }
775
+ }
776
+ if (focusedRunDetail) {
777
+ if (key.escape || input === 'q') {
778
+ setRunsViewMode('list');
779
+ setStatusLine('Closed issue detail');
780
+ return;
781
+ }
782
+ if (key.downArrow || input === 'j') {
783
+ setRunEventScrollOffset((current) => current + 1);
784
+ return;
785
+ }
786
+ if (key.upArrow || input === 'k') {
787
+ setRunEventScrollOffset((current) => Math.max(0, current - 1));
788
+ return;
789
+ }
790
+ }
791
+ if (focusedProjectDetail && (key.escape || input === 'q')) {
792
+ setProjectsViewMode('list');
793
+ setStatusLine('Closed project detail');
794
+ return;
795
+ }
796
+ if (input === 'q') {
797
+ gracefulExit();
798
+ return;
799
+ }
800
+ const tabFromHotkey = resolveTabHotkey(input);
801
+ if (tabFromHotkey) {
802
+ setActiveTab(tabFromHotkey);
803
+ return;
804
+ }
805
+ if (key.rightArrow || input === 'l') {
806
+ switchTab(1);
807
+ return;
808
+ }
809
+ if (key.leftArrow || input === 'h') {
810
+ switchTab(-1);
811
+ return;
812
+ }
813
+ if (activeTab === 'runs' && runsViewMode === 'list') {
814
+ if (key.downArrow || input === 'j') {
815
+ moveSelection(1);
816
+ return;
817
+ }
818
+ if (key.upArrow || input === 'k') {
819
+ moveSelection(-1);
820
+ return;
821
+ }
822
+ if (input === 'o' || key.return) {
823
+ if (selectedIssue) {
824
+ setRunsViewMode('focus');
825
+ setRunEventScrollOffset(0);
826
+ }
827
+ return;
828
+ }
829
+ }
830
+ if (activeTab === 'projects' && projectsViewMode === 'list') {
831
+ if (key.downArrow || input === 'j') {
832
+ setSelectedProjectIndex((current) => moveProjectSelection(current, 1, runtimeConfig.repos.length));
833
+ return;
834
+ }
835
+ if (key.upArrow || input === 'k') {
836
+ setSelectedProjectIndex((current) => moveProjectSelection(current, -1, runtimeConfig.repos.length));
837
+ return;
838
+ }
839
+ if (input === 'o' || key.return) {
840
+ if (runtimeConfig.repos.length > 0) {
841
+ setProjectsViewMode('focus');
842
+ }
843
+ return;
844
+ }
845
+ }
846
+ if (activeTab === 'logs') {
847
+ if (key.downArrow || input === 'j') {
848
+ const nextId = moveLogSelection(logLines, selectedLogId, 1);
849
+ setSelectedLogId(nextId);
850
+ selectedLogIndexRef.current = resolveSelectedLogIndex(logLines, nextId);
851
+ return;
852
+ }
853
+ if (key.upArrow || input === 'k') {
854
+ const nextId = moveLogSelection(logLines, selectedLogId, -1);
855
+ setSelectedLogId(nextId);
856
+ selectedLogIndexRef.current = resolveSelectedLogIndex(logLines, nextId);
857
+ return;
858
+ }
859
+ if (input === 'J') {
860
+ setLogDetailScrollOffset((current) => current + 1);
861
+ return;
862
+ }
863
+ if (input === 'K') {
864
+ setLogDetailScrollOffset((current) => Math.max(0, current - 1));
865
+ return;
866
+ }
867
+ }
868
+ if (activeTab === 'settings') {
869
+ if (key.downArrow || input === 'j') {
870
+ moveSettingSelection(1);
871
+ return;
872
+ }
873
+ if (key.upArrow || input === 'k') {
874
+ moveSettingSelection(-1);
875
+ return;
876
+ }
877
+ if (input === '+' || input === '=') {
878
+ void runAdjustSelectedSetting(1);
879
+ return;
880
+ }
881
+ if (input === '-') {
882
+ void runAdjustSelectedSetting(-1);
883
+ return;
884
+ }
885
+ if (input === 'u') {
886
+ void runClearSetting();
887
+ return;
888
+ }
889
+ if (input === ' ') {
890
+ void runToggleSelectedSetting();
891
+ return;
892
+ }
893
+ }
894
+ if (activeTab === 'stats' && input === 'a') {
895
+ setAutoRefresh((current) => {
896
+ const next = !current;
897
+ setStatusLine(next ? 'Auto-refresh enabled' : 'Auto-refresh paused');
898
+ appendLog('info', next ? 'auto-refresh enabled' : 'auto-refresh paused');
899
+ return next;
900
+ });
901
+ return;
902
+ }
903
+ const actionCommand = resolveActionCommand({
904
+ input,
905
+ activeTab,
906
+ runsViewMode,
907
+ projectsViewMode,
908
+ controlsEnabled: enableBackgroundPoller,
909
+ actionBusy: actionState.busy,
910
+ cleanupConfirmPending,
911
+ });
912
+ if (actionCommand === 'refresh') {
913
+ forceRefresh();
914
+ return;
915
+ }
916
+ if (actionCommand === 'standaloneMessage') {
917
+ setStatusLine('Monitor mode: poll/sync/cleanup/labels-init available via `night-orch` CLI');
918
+ return;
919
+ }
920
+ if (actionCommand === 'poll') {
921
+ void runPoll();
922
+ return;
923
+ }
924
+ if (actionCommand === 'sync') {
925
+ void runSync();
926
+ return;
927
+ }
928
+ if (actionCommand === 'labelsInit') {
929
+ void runLabelsInit();
930
+ return;
931
+ }
932
+ if (actionCommand === 'cleanupArm') {
933
+ const transition = resolveCleanupConfirmationTransition(cleanupConfirmPending, 'pressD');
934
+ if (transition !== 'arm')
935
+ return;
936
+ setCleanupConfirmPending(true);
937
+ setStatusLine('Press D again within 5s to confirm cleanup');
938
+ appendLog('warn', 'cleanup requested: awaiting confirmation');
939
+ if (cleanupConfirmTimer.current) {
940
+ clearTimeout(cleanupConfirmTimer.current);
941
+ }
942
+ cleanupConfirmTimer.current = setTimeout(() => {
943
+ cleanupConfirmTimer.current = null;
944
+ const timeoutTransition = resolveCleanupConfirmationTransition(true, 'timeout');
945
+ if (timeoutTransition === 'expire') {
946
+ setCleanupConfirmPending(false);
947
+ setStatusLine('Cleanup confirmation expired');
948
+ }
949
+ }, CLEANUP_CONFIRM_TIMEOUT_MS);
950
+ return;
951
+ }
952
+ if (actionCommand === 'cleanupConfirm') {
953
+ const transition = resolveCleanupConfirmationTransition(cleanupConfirmPending, 'pressD');
954
+ if (transition !== 'confirm')
955
+ return;
956
+ clearCleanupConfirmation();
957
+ void runCleanup();
958
+ return;
959
+ }
960
+ if (actionCommand === 'retry') {
961
+ void runRetry();
962
+ return;
963
+ }
964
+ if (actionCommand === 'retryFresh') {
965
+ void runRetry(true);
966
+ return;
967
+ }
968
+ if (actionCommand === 'continue') {
969
+ void runContinue();
970
+ return;
971
+ }
972
+ if (actionCommand === 'rebase') {
973
+ void runRebase();
974
+ return;
975
+ }
976
+ if (actionCommand === 'deleteEntry') {
977
+ void runDeleteEntry();
978
+ return;
979
+ }
980
+ if (actionCommand === 'costOverride') {
981
+ void runCostOverride();
982
+ return;
983
+ }
984
+ if (actionCommand === 'dailyCostOverride') {
985
+ void runDailyCostOverride();
986
+ return;
987
+ }
988
+ if (actionCommand === 'none') {
989
+ return;
990
+ }
991
+ });
992
+ const runsVisible = runsViewMode === 'focus' ? 8 : 10;
993
+ return (_jsxs(Box, { flexDirection: "column", height: termRows, children: [_jsx(Header, { activeTab: activeTab, pollIntervalMs: effectivePollIntervalMs, dryRun: dryRun, status: stats, autoRefresh: autoRefresh, lastRefreshAt: lastRefreshAt, buildInfo: BUILD_INFO }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: actionState.busy ? 'yellow' : 'gray', children: actionState.busy ? `busy: ${actionState.action ?? 'action'}` : statusLine }) }), activeTab === 'runs' && (_jsx(RunsView, { issues: issues, selectedIndex: selectedIndex < 0 ? 0 : selectedIndex, selectedIssue: selectedIssue, selectedRun: selectedRun, selectedRunEvents: selectedRunEvents, mergeBatches: mergeBatches, stats: stats, titleLookup: titleLookup, mode: runsViewMode, maxVisibleRuns: runsVisible, eventScrollOffset: runEventScrollOffset, eventWindowSize: FOCUSED_EVENT_WINDOW_SIZE })), activeTab === 'stats' && (_jsx(StatsView, { stats: stats, autoRefresh: autoRefresh, pollIntervalMs: effectivePollIntervalMs, lastRefreshAt: lastRefreshAt })), activeTab === 'projects' && (_jsx(ProjectsView, { repos: runtimeConfig.repos, selectedIndex: selectedProjectIndex, workerProfiles: runtimeConfig.workerProfiles, globalGithubTokenEnv: runtimeConfig.github.tokenEnv, globalGithubApiBaseUrl: runtimeConfig.github.apiBaseUrl, mode: projectsViewMode })), activeTab === 'logs' && (_jsx(Box, { flexGrow: 1, minHeight: 0, children: _jsx(LogsView, { logs: logLines, selectedIndex: selectedLogIndex, windowSize: logWindowSize, detailScrollOffset: logDetailScrollOffset }) })), activeTab === 'settings' && (_jsx(SettingsView, { settings: runtimeSettings, selectedIndex: selectedSettingIndex })), _jsx(ActionsBar, { activeTab: activeTab, busy: actionState.busy, runsFocused: activeTab === 'runs' && runsViewMode === 'focus', projectsFocused: activeTab === 'projects' && projectsViewMode === 'focus', autoRefresh: autoRefresh, controlsEnabled: enableBackgroundPoller })] }));
994
+ }
995
+ //# sourceMappingURL=app.js.map