agentrix 0.0.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 (402) hide show
  1. package/README.md +235 -0
  2. package/bin/agentrix.js +5 -0
  3. package/dist/api/auth.d.ts +10 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +30 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/automation.d.ts +52 -0
  8. package/dist/api/automation.d.ts.map +1 -0
  9. package/dist/api/automation.js +181 -0
  10. package/dist/api/automation.js.map +1 -0
  11. package/dist/api/base-handler.d.ts +62 -0
  12. package/dist/api/base-handler.d.ts.map +1 -0
  13. package/dist/api/base-handler.js +55 -0
  14. package/dist/api/base-handler.js.map +1 -0
  15. package/dist/api/config.d.ts +5 -0
  16. package/dist/api/config.d.ts.map +1 -0
  17. package/dist/api/config.js +14 -0
  18. package/dist/api/config.js.map +1 -0
  19. package/dist/api/create-plan.d.ts +8 -0
  20. package/dist/api/create-plan.d.ts.map +1 -0
  21. package/dist/api/create-plan.js +77 -0
  22. package/dist/api/create-plan.js.map +1 -0
  23. package/dist/api/git-status.d.ts +6 -0
  24. package/dist/api/git-status.d.ts.map +1 -0
  25. package/dist/api/git-status.js +57 -0
  26. package/dist/api/git-status.js.map +1 -0
  27. package/dist/api/plans.d.ts +6 -0
  28. package/dist/api/plans.d.ts.map +1 -0
  29. package/dist/api/plans.js +75 -0
  30. package/dist/api/plans.js.map +1 -0
  31. package/dist/api/repo-dashboard.d.ts +13 -0
  32. package/dist/api/repo-dashboard.d.ts.map +1 -0
  33. package/dist/api/repo-dashboard.js +47 -0
  34. package/dist/api/repo-dashboard.js.map +1 -0
  35. package/dist/api/repo-issue.d.ts +12 -0
  36. package/dist/api/repo-issue.d.ts.map +1 -0
  37. package/dist/api/repo-issue.js +47 -0
  38. package/dist/api/repo-issue.js.map +1 -0
  39. package/dist/api/repos.d.ts +9 -0
  40. package/dist/api/repos.d.ts.map +1 -0
  41. package/dist/api/repos.js +46 -0
  42. package/dist/api/repos.js.map +1 -0
  43. package/dist/api/sessions.d.ts +5 -0
  44. package/dist/api/sessions.d.ts.map +1 -0
  45. package/dist/api/sessions.js +19 -0
  46. package/dist/api/sessions.js.map +1 -0
  47. package/dist/api/tasks.d.ts +6 -0
  48. package/dist/api/tasks.d.ts.map +1 -0
  49. package/dist/api/tasks.js +22 -0
  50. package/dist/api/tasks.js.map +1 -0
  51. package/dist/api/terminal.d.ts +7 -0
  52. package/dist/api/terminal.d.ts.map +1 -0
  53. package/dist/api/terminal.js +16 -0
  54. package/dist/api/terminal.js.map +1 -0
  55. package/dist/api/worktrees.d.ts +7 -0
  56. package/dist/api/worktrees.d.ts.map +1 -0
  57. package/dist/api/worktrees.js +26 -0
  58. package/dist/api/worktrees.js.map +1 -0
  59. package/dist/cli/arg-parser.d.ts +3 -0
  60. package/dist/cli/arg-parser.d.ts.map +1 -0
  61. package/dist/cli/arg-parser.js +243 -0
  62. package/dist/cli/arg-parser.js.map +1 -0
  63. package/dist/cli/config-resolver.d.ts +29 -0
  64. package/dist/cli/config-resolver.d.ts.map +1 -0
  65. package/dist/cli/config-resolver.js +139 -0
  66. package/dist/cli/config-resolver.js.map +1 -0
  67. package/dist/cli/config.d.ts +5 -0
  68. package/dist/cli/config.d.ts.map +1 -0
  69. package/dist/cli/config.js +224 -0
  70. package/dist/cli/config.js.map +1 -0
  71. package/dist/cli/constants.d.ts +7 -0
  72. package/dist/cli/constants.d.ts.map +1 -0
  73. package/dist/cli/constants.js +15 -0
  74. package/dist/cli/constants.js.map +1 -0
  75. package/dist/cli/help.d.ts +3 -0
  76. package/dist/cli/help.d.ts.map +1 -0
  77. package/dist/cli/help.js +35 -0
  78. package/dist/cli/help.js.map +1 -0
  79. package/dist/cli/index.d.ts +23 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +23 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/plans-command.d.ts +3 -0
  84. package/dist/cli/plans-command.d.ts.map +1 -0
  85. package/dist/cli/plans-command.js +151 -0
  86. package/dist/cli/plans-command.js.map +1 -0
  87. package/dist/cli/server-starter.d.ts +26 -0
  88. package/dist/cli/server-starter.d.ts.map +1 -0
  89. package/dist/cli/server-starter.js +72 -0
  90. package/dist/cli/server-starter.js.map +1 -0
  91. package/dist/cli/types.d.ts +46 -0
  92. package/dist/cli/types.d.ts.map +1 -0
  93. package/dist/cli/types.js +2 -0
  94. package/dist/cli/types.js.map +1 -0
  95. package/dist/cli/validation.d.ts +14 -0
  96. package/dist/cli/validation.d.ts.map +1 -0
  97. package/dist/cli/validation.js +99 -0
  98. package/dist/cli/validation.js.map +1 -0
  99. package/dist/cli.d.ts +5 -0
  100. package/dist/cli.d.ts.map +1 -0
  101. package/dist/cli.js +73 -0
  102. package/dist/cli.js.map +1 -0
  103. package/dist/config/agent-commands.d.ts +27 -0
  104. package/dist/config/agent-commands.d.ts.map +1 -0
  105. package/dist/config/agent-commands.js +56 -0
  106. package/dist/config/agent-commands.js.map +1 -0
  107. package/dist/config/constants.d.ts +35 -0
  108. package/dist/config/constants.d.ts.map +1 -0
  109. package/dist/config/constants.js +35 -0
  110. package/dist/config/constants.js.map +1 -0
  111. package/dist/config/developer-messages.d.ts +2 -0
  112. package/dist/config/developer-messages.d.ts.map +1 -0
  113. package/dist/config/developer-messages.js +43 -0
  114. package/dist/config/developer-messages.js.map +1 -0
  115. package/dist/core/agents.d.ts +23 -0
  116. package/dist/core/agents.d.ts.map +1 -0
  117. package/dist/core/agents.js +91 -0
  118. package/dist/core/agents.js.map +1 -0
  119. package/dist/core/auth.d.ts +3 -0
  120. package/dist/core/auth.d.ts.map +1 -0
  121. package/dist/core/auth.js +69 -0
  122. package/dist/core/auth.js.map +1 -0
  123. package/dist/core/automation/branch.d.ts +18 -0
  124. package/dist/core/automation/branch.d.ts.map +1 -0
  125. package/dist/core/automation/branch.js +29 -0
  126. package/dist/core/automation/branch.js.map +1 -0
  127. package/dist/core/automation/git-orchestration.d.ts +51 -0
  128. package/dist/core/automation/git-orchestration.d.ts.map +1 -0
  129. package/dist/core/automation/git-orchestration.js +25 -0
  130. package/dist/core/automation/git-orchestration.js.map +1 -0
  131. package/dist/core/automation/plan.d.ts +15 -0
  132. package/dist/core/automation/plan.d.ts.map +1 -0
  133. package/dist/core/automation/plan.js +25 -0
  134. package/dist/core/automation/plan.js.map +1 -0
  135. package/dist/core/automation/request-validation.d.ts +45 -0
  136. package/dist/core/automation/request-validation.d.ts.map +1 -0
  137. package/dist/core/automation/request-validation.js +144 -0
  138. package/dist/core/automation/request-validation.js.map +1 -0
  139. package/dist/core/automation/task-runner.d.ts +42 -0
  140. package/dist/core/automation/task-runner.d.ts.map +1 -0
  141. package/dist/core/automation/task-runner.js +215 -0
  142. package/dist/core/automation/task-runner.js.map +1 -0
  143. package/dist/core/branch-name.d.ts +13 -0
  144. package/dist/core/branch-name.d.ts.map +1 -0
  145. package/dist/core/branch-name.js +429 -0
  146. package/dist/core/branch-name.js.map +1 -0
  147. package/dist/core/default-branch.d.ts +12 -0
  148. package/dist/core/default-branch.d.ts.map +1 -0
  149. package/dist/core/default-branch.js +78 -0
  150. package/dist/core/default-branch.js.map +1 -0
  151. package/dist/core/event-bus.d.ts +73 -0
  152. package/dist/core/event-bus.d.ts.map +1 -0
  153. package/dist/core/event-bus.js +127 -0
  154. package/dist/core/event-bus.js.map +1 -0
  155. package/dist/core/git.d.ts +13 -0
  156. package/dist/core/git.d.ts.map +1 -0
  157. package/dist/core/git.js +15 -0
  158. package/dist/core/git.js.map +1 -0
  159. package/dist/core/github.d.ts +10 -0
  160. package/dist/core/github.d.ts.map +1 -0
  161. package/dist/core/github.js +245 -0
  162. package/dist/core/github.js.map +1 -0
  163. package/dist/core/plan-storage.d.ts +46 -0
  164. package/dist/core/plan-storage.d.ts.map +1 -0
  165. package/dist/core/plan-storage.js +237 -0
  166. package/dist/core/plan-storage.js.map +1 -0
  167. package/dist/core/plan.d.ts +23 -0
  168. package/dist/core/plan.d.ts.map +1 -0
  169. package/dist/core/plan.js +445 -0
  170. package/dist/core/plan.js.map +1 -0
  171. package/dist/core/repositories.d.ts +2 -0
  172. package/dist/core/repositories.d.ts.map +1 -0
  173. package/dist/core/repositories.js +58 -0
  174. package/dist/core/repositories.js.map +1 -0
  175. package/dist/core/repository-config.d.ts +9 -0
  176. package/dist/core/repository-config.d.ts.map +1 -0
  177. package/dist/core/repository-config.js +65 -0
  178. package/dist/core/repository-config.js.map +1 -0
  179. package/dist/core/task-store.d.ts +14 -0
  180. package/dist/core/task-store.d.ts.map +1 -0
  181. package/dist/core/task-store.js +105 -0
  182. package/dist/core/task-store.js.map +1 -0
  183. package/dist/core/tasks.d.ts +62 -0
  184. package/dist/core/tasks.d.ts.map +1 -0
  185. package/dist/core/tasks.js +582 -0
  186. package/dist/core/tasks.js.map +1 -0
  187. package/dist/core/terminal-sessions.d.ts +18 -0
  188. package/dist/core/terminal-sessions.d.ts.map +1 -0
  189. package/dist/core/terminal-sessions.js +539 -0
  190. package/dist/core/terminal-sessions.js.map +1 -0
  191. package/dist/core/tmux.d.ts +29 -0
  192. package/dist/core/tmux.d.ts.map +1 -0
  193. package/dist/core/tmux.js +151 -0
  194. package/dist/core/tmux.js.map +1 -0
  195. package/dist/core/workdir.d.ts +8 -0
  196. package/dist/core/workdir.d.ts.map +1 -0
  197. package/dist/core/workdir.js +26 -0
  198. package/dist/core/workdir.js.map +1 -0
  199. package/dist/domain/branch-validator.d.ts +51 -0
  200. package/dist/domain/branch-validator.d.ts.map +1 -0
  201. package/dist/domain/branch-validator.js +88 -0
  202. package/dist/domain/branch-validator.js.map +1 -0
  203. package/dist/domain/git-url-parser.d.ts +27 -0
  204. package/dist/domain/git-url-parser.d.ts.map +1 -0
  205. package/dist/domain/git-url-parser.js +84 -0
  206. package/dist/domain/git-url-parser.js.map +1 -0
  207. package/dist/domain/index.d.ts +8 -0
  208. package/dist/domain/index.d.ts.map +1 -0
  209. package/dist/domain/index.js +5 -0
  210. package/dist/domain/index.js.map +1 -0
  211. package/dist/domain/repository.d.ts +55 -0
  212. package/dist/domain/repository.d.ts.map +1 -0
  213. package/dist/domain/repository.js +73 -0
  214. package/dist/domain/repository.js.map +1 -0
  215. package/dist/domain/worktree.d.ts +43 -0
  216. package/dist/domain/worktree.d.ts.map +1 -0
  217. package/dist/domain/worktree.js +57 -0
  218. package/dist/domain/worktree.js.map +1 -0
  219. package/dist/infrastructure/cookies/cookie-manager.d.ts +18 -0
  220. package/dist/infrastructure/cookies/cookie-manager.d.ts.map +1 -0
  221. package/dist/infrastructure/cookies/cookie-manager.js +20 -0
  222. package/dist/infrastructure/cookies/cookie-manager.js.map +1 -0
  223. package/dist/infrastructure/cookies/cookie-parser.d.ts +43 -0
  224. package/dist/infrastructure/cookies/cookie-parser.d.ts.map +1 -0
  225. package/dist/infrastructure/cookies/cookie-parser.js +88 -0
  226. package/dist/infrastructure/cookies/cookie-parser.js.map +1 -0
  227. package/dist/infrastructure/cookies/cookie-security.d.ts +15 -0
  228. package/dist/infrastructure/cookies/cookie-security.d.ts.map +1 -0
  229. package/dist/infrastructure/cookies/cookie-security.js +35 -0
  230. package/dist/infrastructure/cookies/cookie-security.js.map +1 -0
  231. package/dist/infrastructure/cookies/index.d.ts +7 -0
  232. package/dist/infrastructure/cookies/index.d.ts.map +1 -0
  233. package/dist/infrastructure/cookies/index.js +4 -0
  234. package/dist/infrastructure/cookies/index.js.map +1 -0
  235. package/dist/infrastructure/errors/error-handler.d.ts +22 -0
  236. package/dist/infrastructure/errors/error-handler.d.ts.map +1 -0
  237. package/dist/infrastructure/errors/error-handler.js +89 -0
  238. package/dist/infrastructure/errors/error-handler.js.map +1 -0
  239. package/dist/infrastructure/errors/http-error.d.ts +30 -0
  240. package/dist/infrastructure/errors/http-error.d.ts.map +1 -0
  241. package/dist/infrastructure/errors/http-error.js +46 -0
  242. package/dist/infrastructure/errors/http-error.js.map +1 -0
  243. package/dist/infrastructure/errors/index.d.ts +5 -0
  244. package/dist/infrastructure/errors/index.d.ts.map +1 -0
  245. package/dist/infrastructure/errors/index.js +5 -0
  246. package/dist/infrastructure/errors/index.js.map +1 -0
  247. package/dist/infrastructure/errors/not-found-error.d.ts +8 -0
  248. package/dist/infrastructure/errors/not-found-error.d.ts.map +1 -0
  249. package/dist/infrastructure/errors/not-found-error.js +13 -0
  250. package/dist/infrastructure/errors/not-found-error.js.map +1 -0
  251. package/dist/infrastructure/errors/validation-error.d.ts +21 -0
  252. package/dist/infrastructure/errors/validation-error.d.ts.map +1 -0
  253. package/dist/infrastructure/errors/validation-error.js +31 -0
  254. package/dist/infrastructure/errors/validation-error.js.map +1 -0
  255. package/dist/infrastructure/logging/index.d.ts +3 -0
  256. package/dist/infrastructure/logging/index.d.ts.map +1 -0
  257. package/dist/infrastructure/logging/index.js +2 -0
  258. package/dist/infrastructure/logging/index.js.map +1 -0
  259. package/dist/infrastructure/logging/logger.d.ts +21 -0
  260. package/dist/infrastructure/logging/logger.d.ts.map +1 -0
  261. package/dist/infrastructure/logging/logger.js +49 -0
  262. package/dist/infrastructure/logging/logger.js.map +1 -0
  263. package/dist/repositories/git-repository.d.ts +67 -0
  264. package/dist/repositories/git-repository.d.ts.map +1 -0
  265. package/dist/repositories/git-repository.js +111 -0
  266. package/dist/repositories/git-repository.js.map +1 -0
  267. package/dist/repositories/git-status-repository.d.ts +22 -0
  268. package/dist/repositories/git-status-repository.d.ts.map +1 -0
  269. package/dist/repositories/git-status-repository.js +620 -0
  270. package/dist/repositories/git-status-repository.js.map +1 -0
  271. package/dist/repositories/repository-repository.d.ts +44 -0
  272. package/dist/repositories/repository-repository.d.ts.map +1 -0
  273. package/dist/repositories/repository-repository.js +155 -0
  274. package/dist/repositories/repository-repository.js.map +1 -0
  275. package/dist/repositories/worktree-repository.d.ts +66 -0
  276. package/dist/repositories/worktree-repository.d.ts.map +1 -0
  277. package/dist/repositories/worktree-repository.js +330 -0
  278. package/dist/repositories/worktree-repository.js.map +1 -0
  279. package/dist/server/cookies.d.ts +6 -0
  280. package/dist/server/cookies.d.ts.map +1 -0
  281. package/dist/server/cookies.js +6 -0
  282. package/dist/server/cookies.js.map +1 -0
  283. package/dist/server/events.d.ts +8 -0
  284. package/dist/server/events.d.ts.map +1 -0
  285. package/dist/server/events.js +128 -0
  286. package/dist/server/events.js.map +1 -0
  287. package/dist/server/index.d.ts +18 -0
  288. package/dist/server/index.d.ts.map +1 -0
  289. package/dist/server/index.js +173 -0
  290. package/dist/server/index.js.map +1 -0
  291. package/dist/server/router.d.ts +16 -0
  292. package/dist/server/router.d.ts.map +1 -0
  293. package/dist/server/router.js +256 -0
  294. package/dist/server/router.js.map +1 -0
  295. package/dist/server/ui.d.ts +8 -0
  296. package/dist/server/ui.d.ts.map +1 -0
  297. package/dist/server/ui.js +211 -0
  298. package/dist/server/ui.js.map +1 -0
  299. package/dist/server/websocket.d.ts +9 -0
  300. package/dist/server/websocket.d.ts.map +1 -0
  301. package/dist/server/websocket.js +116 -0
  302. package/dist/server/websocket.js.map +1 -0
  303. package/dist/services/auth-service.d.ts +49 -0
  304. package/dist/services/auth-service.d.ts.map +1 -0
  305. package/dist/services/auth-service.js +53 -0
  306. package/dist/services/auth-service.js.map +1 -0
  307. package/dist/services/index.d.ts +11 -0
  308. package/dist/services/index.d.ts.map +1 -0
  309. package/dist/services/index.js +6 -0
  310. package/dist/services/index.js.map +1 -0
  311. package/dist/services/repository-service.d.ts +57 -0
  312. package/dist/services/repository-service.d.ts.map +1 -0
  313. package/dist/services/repository-service.js +62 -0
  314. package/dist/services/repository-service.js.map +1 -0
  315. package/dist/services/session-service.d.ts +31 -0
  316. package/dist/services/session-service.d.ts.map +1 -0
  317. package/dist/services/session-service.js +134 -0
  318. package/dist/services/session-service.js.map +1 -0
  319. package/dist/services/terminal-service.d.ts +43 -0
  320. package/dist/services/terminal-service.d.ts.map +1 -0
  321. package/dist/services/terminal-service.js +85 -0
  322. package/dist/services/terminal-service.js.map +1 -0
  323. package/dist/services/worktree-service.d.ts +39 -0
  324. package/dist/services/worktree-service.d.ts.map +1 -0
  325. package/dist/services/worktree-service.js +208 -0
  326. package/dist/services/worktree-service.js.map +1 -0
  327. package/dist/types/auth.d.ts +35 -0
  328. package/dist/types/auth.d.ts.map +1 -0
  329. package/dist/types/auth.js +2 -0
  330. package/dist/types/auth.js.map +1 -0
  331. package/dist/types/config.d.ts +46 -0
  332. package/dist/types/config.d.ts.map +1 -0
  333. package/dist/types/config.js +5 -0
  334. package/dist/types/config.js.map +1 -0
  335. package/dist/types/git.d.ts +190 -0
  336. package/dist/types/git.d.ts.map +1 -0
  337. package/dist/types/git.js +5 -0
  338. package/dist/types/git.js.map +1 -0
  339. package/dist/types/http.d.ts +46 -0
  340. package/dist/types/http.d.ts.map +1 -0
  341. package/dist/types/http.js +2 -0
  342. package/dist/types/http.js.map +1 -0
  343. package/dist/types/index.d.ts +8 -0
  344. package/dist/types/index.d.ts.map +1 -0
  345. package/dist/types/index.js +2 -0
  346. package/dist/types/index.js.map +1 -0
  347. package/dist/types/plan.d.ts +31 -0
  348. package/dist/types/plan.d.ts.map +1 -0
  349. package/dist/types/plan.js +5 -0
  350. package/dist/types/plan.js.map +1 -0
  351. package/dist/types/services.d.ts +99 -0
  352. package/dist/types/services.d.ts.map +1 -0
  353. package/dist/types/services.js +2 -0
  354. package/dist/types/services.js.map +1 -0
  355. package/dist/types/tasks.d.ts +68 -0
  356. package/dist/types/tasks.d.ts.map +1 -0
  357. package/dist/types/tasks.js +5 -0
  358. package/dist/types/tasks.js.map +1 -0
  359. package/dist/types/terminal.d.ts +60 -0
  360. package/dist/types/terminal.d.ts.map +1 -0
  361. package/dist/types/terminal.js +2 -0
  362. package/dist/types/terminal.js.map +1 -0
  363. package/dist/utils/cookies.d.ts +7 -0
  364. package/dist/utils/cookies.d.ts.map +1 -0
  365. package/dist/utils/cookies.js +6 -0
  366. package/dist/utils/cookies.js.map +1 -0
  367. package/dist/utils/http.d.ts +23 -0
  368. package/dist/utils/http.d.ts.map +1 -0
  369. package/dist/utils/http.js +58 -0
  370. package/dist/utils/http.js.map +1 -0
  371. package/dist/utils/random.d.ts +12 -0
  372. package/dist/utils/random.d.ts.map +1 -0
  373. package/dist/utils/random.js +25 -0
  374. package/dist/utils/random.js.map +1 -0
  375. package/dist/utils/repository-cache.d.ts +8 -0
  376. package/dist/utils/repository-cache.d.ts.map +1 -0
  377. package/dist/utils/repository-cache.js +13 -0
  378. package/dist/utils/repository-cache.js.map +1 -0
  379. package/dist/validation/index.d.ts +9 -0
  380. package/dist/validation/index.d.ts.map +1 -0
  381. package/dist/validation/index.js +6 -0
  382. package/dist/validation/index.js.map +1 -0
  383. package/dist/validation/request-validator.d.ts +99 -0
  384. package/dist/validation/request-validator.d.ts.map +1 -0
  385. package/dist/validation/request-validator.js +189 -0
  386. package/dist/validation/request-validator.js.map +1 -0
  387. package/dist/validation/schemas/repository-schema.d.ts +26 -0
  388. package/dist/validation/schemas/repository-schema.d.ts.map +1 -0
  389. package/dist/validation/schemas/repository-schema.js +31 -0
  390. package/dist/validation/schemas/repository-schema.js.map +1 -0
  391. package/dist/validation/schemas/terminal-schema.d.ts +21 -0
  392. package/dist/validation/schemas/terminal-schema.d.ts.map +1 -0
  393. package/dist/validation/schemas/terminal-schema.js +38 -0
  394. package/dist/validation/schemas/terminal-schema.js.map +1 -0
  395. package/dist/validation/schemas/worktree-schema.d.ts +21 -0
  396. package/dist/validation/schemas/worktree-schema.d.ts.map +1 -0
  397. package/dist/validation/schemas/worktree-schema.js +29 -0
  398. package/dist/validation/schemas/worktree-schema.js.map +1 -0
  399. package/package.json +79 -0
  400. package/ui/dist/assets/index-BDDrbP3l.js +354 -0
  401. package/ui/dist/assets/index-CwB7gOl4.css +41 -0
  402. package/ui/dist/index.html +13 -0
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Coordinates the asynchronous automation launch task, updating task progress and metadata.
3
+ */
4
+ export const TASK_TYPE_AUTOMATION = 'automation:launch';
5
+ export const STEP_IDS = Object.freeze({
6
+ ENSURE_REPO: 'ensure-repository',
7
+ GENERATE_PLAN: 'generate-plan',
8
+ ENSURE_WORKTREE: 'ensure-worktree',
9
+ LAUNCH_AGENT: 'launch-agent',
10
+ REFRESH_REPOS: 'refresh-repositories',
11
+ });
12
+ export const STEP_LABELS = Object.freeze({
13
+ [STEP_IDS.ENSURE_REPO]: 'Ensure repository',
14
+ [STEP_IDS.GENERATE_PLAN]: 'Generate plan',
15
+ [STEP_IDS.ENSURE_WORKTREE]: 'Ensure worktree',
16
+ [STEP_IDS.LAUNCH_AGENT]: 'Launch agent',
17
+ [STEP_IDS.REFRESH_REPOS]: 'Refresh repositories',
18
+ });
19
+ export async function runAutomationTask({ runTaskImpl, resolveBranchName, generatePlanText, gitOrchestrator, launchAgent, workdir, planEnabled, routeLabel, prompt, org, repo, agent, requestId, worktreeInput, branchNameGenerator, defaultBranches, planService, finishSuccess, finishFailure, onBranchResolved, }) {
20
+ if (typeof runTaskImpl !== 'function') {
21
+ throw new Error('runTask implementation is required');
22
+ }
23
+ if (!gitOrchestrator) {
24
+ throw new Error('git orchestrator is required');
25
+ }
26
+ const orchestrator = gitOrchestrator;
27
+ const { ensureRepositoryReady, ensureWorktreeReady, refreshRepositoryViews } = orchestrator;
28
+ const branchResult = await resolveBranchName({
29
+ worktreeInput,
30
+ branchNameGenerator,
31
+ prompt,
32
+ org,
33
+ repo,
34
+ defaultBranches,
35
+ });
36
+ const { branch, defaultBranchOverride } = branchResult;
37
+ if (typeof onBranchResolved === 'function') {
38
+ onBranchResolved(branch);
39
+ }
40
+ const agentData = agent;
41
+ const taskMetadata = {
42
+ automationRequestId: requestId,
43
+ planEnabled,
44
+ promptProvided: Boolean(prompt.trim()),
45
+ org,
46
+ repo,
47
+ branch,
48
+ command: agentData.key,
49
+ status: 'pending',
50
+ };
51
+ const taskResult = runTaskImpl({
52
+ type: TASK_TYPE_AUTOMATION,
53
+ title: `Automation launch for ${org}/${repo}`,
54
+ metadata: taskMetadata,
55
+ }, async (context) => {
56
+ const ctx = context;
57
+ const { progress, setResult, updateMetadata } = ctx;
58
+ const finalData = {
59
+ org,
60
+ repo,
61
+ branch,
62
+ plan: planEnabled,
63
+ promptRoute: routeLabel,
64
+ automationRequestId: requestId,
65
+ agent: agentData.key,
66
+ agentCommand: agentData.command,
67
+ repositoryPath: null,
68
+ worktreePath: null,
69
+ clonedRepository: false,
70
+ createdWorktree: false,
71
+ pid: null,
72
+ terminalSessionId: null,
73
+ terminalSessionCreated: false,
74
+ tmuxSessionName: null,
75
+ terminalUsingTmux: false,
76
+ };
77
+ let currentStep = null;
78
+ const startStep = (id, message) => {
79
+ currentStep = id;
80
+ progress.startStep(id, { label: STEP_LABELS[id], message });
81
+ };
82
+ const completeStep = (id, message) => {
83
+ progress.completeStep(id, { label: STEP_LABELS[id], message });
84
+ if (currentStep === id) {
85
+ currentStep = null;
86
+ }
87
+ };
88
+ const failCurrentStep = (message) => {
89
+ if (!currentStep) {
90
+ return;
91
+ }
92
+ progress.failStep(currentStep, { label: STEP_LABELS[currentStep], message });
93
+ currentStep = null;
94
+ };
95
+ progress.ensureStep(STEP_IDS.ENSURE_REPO, STEP_LABELS[STEP_IDS.ENSURE_REPO]);
96
+ progress.ensureStep(STEP_IDS.GENERATE_PLAN, STEP_LABELS[STEP_IDS.GENERATE_PLAN]);
97
+ progress.ensureStep(STEP_IDS.ENSURE_WORKTREE, STEP_LABELS[STEP_IDS.ENSURE_WORKTREE]);
98
+ progress.ensureStep(STEP_IDS.LAUNCH_AGENT, STEP_LABELS[STEP_IDS.LAUNCH_AGENT]);
99
+ progress.ensureStep(STEP_IDS.REFRESH_REPOS, STEP_LABELS[STEP_IDS.REFRESH_REPOS]);
100
+ updateMetadata({ status: 'running' });
101
+ try {
102
+ startStep(STEP_IDS.ENSURE_REPO, 'Ensuring repository exists.');
103
+ const repoResult = await ensureRepositoryReady(workdir, org, repo);
104
+ const { repositoryPath, cloned: clonedRepository } = repoResult;
105
+ finalData.repositoryPath = repositoryPath;
106
+ finalData.clonedRepository = clonedRepository;
107
+ updateMetadata({ repositoryPath, clonedRepository });
108
+ completeStep(STEP_IDS.ENSURE_REPO, clonedRepository ? 'Repository cloned successfully.' : 'Repository is ready.');
109
+ let effectivePrompt = prompt;
110
+ if (planEnabled) {
111
+ startStep(STEP_IDS.GENERATE_PLAN, 'Generating plan text.');
112
+ try {
113
+ const planResult = (await generatePlanText({
114
+ planEnabled,
115
+ prompt,
116
+ planService,
117
+ repositoryPath,
118
+ }));
119
+ effectivePrompt = planResult.promptToExecute;
120
+ completeStep(STEP_IDS.GENERATE_PLAN, 'Plan generated successfully.');
121
+ }
122
+ catch (error) {
123
+ const message = error instanceof Error ? error.message : String(error);
124
+ failCurrentStep(message);
125
+ updateMetadata({ status: 'failed', error: message });
126
+ throw error instanceof Error ? error : new Error(message);
127
+ }
128
+ }
129
+ else {
130
+ progress.skipStep(STEP_IDS.GENERATE_PLAN, {
131
+ label: STEP_LABELS[STEP_IDS.GENERATE_PLAN],
132
+ message: 'Plan generation disabled for this request.',
133
+ });
134
+ }
135
+ startStep(STEP_IDS.ENSURE_WORKTREE, 'Ensuring worktree is available.');
136
+ const worktreeResult = await ensureWorktreeReady(workdir, org, repo, branch, { defaultBranchOverride });
137
+ const { worktreePath, created: createdWorktree } = worktreeResult;
138
+ finalData.worktreePath = worktreePath;
139
+ finalData.createdWorktree = createdWorktree;
140
+ updateMetadata({ worktreePath, createdWorktree });
141
+ completeStep(STEP_IDS.ENSURE_WORKTREE, createdWorktree ? 'Worktree created successfully.' : 'Worktree already existed.');
142
+ startStep(STEP_IDS.REFRESH_REPOS, 'Refreshing repository view.');
143
+ try {
144
+ await refreshRepositoryViews(workdir);
145
+ completeStep(STEP_IDS.REFRESH_REPOS, 'Repository view updated.');
146
+ }
147
+ catch (error) {
148
+ const message = error instanceof Error ? error.message : String(error);
149
+ failCurrentStep(message);
150
+ updateMetadata({ status: 'failed', error: message });
151
+ finishFailure(error);
152
+ throw error instanceof Error ? error : new Error(message);
153
+ }
154
+ startStep(STEP_IDS.LAUNCH_AGENT, 'Launching agent command.');
155
+ const launchResult = await launchAgent({
156
+ command: agentData.command,
157
+ workdir,
158
+ org,
159
+ repo,
160
+ branch,
161
+ prompt: effectivePrompt,
162
+ });
163
+ const { pid, sessionId, tmuxSessionName, usingTmux, createdSession, } = launchResult;
164
+ finalData.pid = pid;
165
+ finalData.terminalSessionId = sessionId;
166
+ finalData.terminalSessionCreated = createdSession;
167
+ finalData.tmuxSessionName = tmuxSessionName;
168
+ finalData.terminalUsingTmux = usingTmux;
169
+ updateMetadata({
170
+ pid,
171
+ terminalSessionId: sessionId,
172
+ terminalSessionCreated: createdSession,
173
+ tmuxSessionName,
174
+ terminalUsingTmux: usingTmux,
175
+ });
176
+ completeStep(STEP_IDS.LAUNCH_AGENT, 'Agent launched successfully.');
177
+ finishSuccess(`${org}/${repo}#${branch}`);
178
+ updateMetadata({ status: 'succeeded' });
179
+ setResult(finalData);
180
+ return finalData;
181
+ }
182
+ catch (error) {
183
+ const message = error instanceof Error ? error.message : String(error);
184
+ failCurrentStep(message);
185
+ updateMetadata({ status: 'failed', error: message });
186
+ finishFailure(error);
187
+ if (!(error instanceof Error)) {
188
+ throw new Error(message);
189
+ }
190
+ throw error;
191
+ }
192
+ });
193
+ const queuedData = {
194
+ org,
195
+ repo,
196
+ branch,
197
+ repositoryPath: null,
198
+ worktreePath: null,
199
+ clonedRepository: null,
200
+ createdWorktree: null,
201
+ agent: agentData.key,
202
+ agentCommand: agentData.command,
203
+ pid: null,
204
+ terminalSessionId: null,
205
+ terminalSessionCreated: false,
206
+ tmuxSessionName: null,
207
+ terminalUsingTmux: false,
208
+ plan: planEnabled,
209
+ promptRoute: routeLabel,
210
+ automationRequestId: requestId,
211
+ };
212
+ const task = (await taskResult);
213
+ return { taskId: task.id, queuedData, branch };
214
+ }
215
+ //# sourceMappingURL=task-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../../../src/core/automation/task-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare function createBranchNameGenerator({ defaultLlm }?: {
2
+ defaultLlm?: string;
3
+ }): {
4
+ isConfigured: boolean;
5
+ generateBranchName: (context?: {
6
+ prompt?: string;
7
+ org?: string;
8
+ repo?: string;
9
+ llm?: string;
10
+ }) => Promise<string>;
11
+ dispose(): Promise<void>;
12
+ };
13
+ //# sourceMappingURL=branch-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-name.d.ts","sourceRoot":"","sources":["../../src/core/branch-name.ts"],"names":[],"mappings":"AA0VA,wBAAgB,yBAAyB,CAAC,EAAE,UAAU,EAAE,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO;;mCAMzC;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;;EA8H1G"}
@@ -0,0 +1,429 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { loadDeveloperMessage } from '../config/developer-messages.js';
3
+ import { normaliseBranchName } from './git.js';
4
+ const SUPPORTED_LLMS = new Set(['codex', 'claude', 'cursor']);
5
+ const DEFAULT_LLM = 'codex';
6
+ const COMMAND_TIMEOUT_MS = 30_000;
7
+ const COMMAND_MAX_BUFFER = 512 * 1024;
8
+ const DEFAULT_DEVELOPER_MESSAGE = 'Generate a branch name in the format <type>/<description> with no preamble or postamble, and no code blocks. The <type> must be one of: feature, enhancement, fix, chore, or another appropriate status. The <description> should be concise (max 7 words), using dashes to separate words. Example: feature/create-calendar-page.';
9
+ const COMMAND_NAMES = {
10
+ codex: 'codex',
11
+ claude: 'claude',
12
+ cursor: 'cursor-agent',
13
+ };
14
+ function slugifySegment(value) {
15
+ if (typeof value !== 'string') {
16
+ return '';
17
+ }
18
+ return value
19
+ .toLowerCase()
20
+ .replace(/[^a-z0-9._-]+/g, '-')
21
+ .replace(/-+/g, '-')
22
+ .replace(/^-+|-+$/g, '');
23
+ }
24
+ function sanitiseCandidate(rawValue) {
25
+ if (typeof rawValue !== 'string') {
26
+ return '';
27
+ }
28
+ const line = rawValue
29
+ .split('\n')
30
+ .map((segment) => segment.trim())
31
+ .find(Boolean);
32
+ if (!line) {
33
+ return '';
34
+ }
35
+ const cleaned = line.replace(/^`+|`+$/g, '').replace(/^"+|"+$/g, '').trim();
36
+ if (!cleaned) {
37
+ return '';
38
+ }
39
+ const segments = cleaned.split('/').map((segment) => slugifySegment(segment));
40
+ let type = segments[0];
41
+ const remainder = segments.slice(1).filter(Boolean);
42
+ if (!type) {
43
+ type = 'feature';
44
+ }
45
+ if (remainder.length === 0) {
46
+ const fallback = slugifySegment(cleaned.replace(/\//g, '-'));
47
+ if (!fallback) {
48
+ return '';
49
+ }
50
+ remainder.push(fallback);
51
+ }
52
+ const branch = [type, ...remainder].join('/');
53
+ return normaliseBranchName(branch);
54
+ }
55
+ function buildUserPrompt({ prompt, org, repo } = {}) {
56
+ const sections = [];
57
+ if (org && repo) {
58
+ sections.push(`Repository: ${org}/${repo}`);
59
+ }
60
+ if (prompt) {
61
+ sections.push(`Summary:\n${prompt}`);
62
+ }
63
+ if (sections.length === 0) {
64
+ sections.push('Generate a succinct branch name for an upcoming change.');
65
+ }
66
+ return sections.join('\n\n');
67
+ }
68
+ function shellQuote(value) {
69
+ const str = String(value ?? '');
70
+ if (str === '') {
71
+ return "''";
72
+ }
73
+ return `'${str.replace(/'/g, `'\\''`)}'`;
74
+ }
75
+ function buildCommandString(baseCommand, args = []) {
76
+ const trimmedBase = typeof baseCommand === 'string' && baseCommand.trim() ? baseCommand.trim() : '';
77
+ if (!trimmedBase) {
78
+ throw new Error('Command is not configured for branch naming.');
79
+ }
80
+ const serializedArgs = args.map((arg) => shellQuote(arg));
81
+ return [trimmedBase, ...serializedArgs].join(' ');
82
+ }
83
+ function normaliseLlm(input) {
84
+ if (typeof input !== 'string') {
85
+ return DEFAULT_LLM;
86
+ }
87
+ const trimmed = input.trim().toLowerCase();
88
+ if (!trimmed) {
89
+ return DEFAULT_LLM;
90
+ }
91
+ if (!SUPPORTED_LLMS.has(trimmed)) {
92
+ return DEFAULT_LLM;
93
+ }
94
+ return trimmed;
95
+ }
96
+ function buildPromptText({ developerMessage, userPrompt }) {
97
+ const sections = [developerMessage.trim()];
98
+ if (userPrompt.trim()) {
99
+ sections.push(userPrompt.trim());
100
+ }
101
+ sections.push('Respond with the branch name only.');
102
+ return sections.join('\n\n');
103
+ }
104
+ async function executeLlmCommand(command, { signal, onProcessStart } = {}) {
105
+ const { shellPath, shellArgs } = resolveShellInvocation();
106
+ const isPosix = process.platform !== 'win32';
107
+ return new Promise((resolve, reject) => {
108
+ let stdout = '';
109
+ let stderr = '';
110
+ let totalOutput = 0;
111
+ let timedOut = false;
112
+ let aborted = false;
113
+ let killTimer = null;
114
+ let overflowed = false;
115
+ const child = spawn(shellPath, [...shellArgs, command], {
116
+ stdio: ['ignore', 'pipe', 'pipe'],
117
+ env: process.env,
118
+ detached: isPosix,
119
+ });
120
+ if (typeof onProcessStart === 'function') {
121
+ try {
122
+ onProcessStart(child);
123
+ }
124
+ catch {
125
+ // ignore observer errors
126
+ }
127
+ }
128
+ const cleanup = () => {
129
+ if (timeoutId) {
130
+ clearTimeout(timeoutId);
131
+ }
132
+ if (killTimer) {
133
+ clearTimeout(killTimer);
134
+ }
135
+ if (abortListener && signal) {
136
+ signal.removeEventListener('abort', abortListener);
137
+ }
138
+ if (child.stdout) {
139
+ child.stdout.off('data', handleStdout);
140
+ }
141
+ if (child.stderr) {
142
+ child.stderr.off('data', handleStderr);
143
+ }
144
+ child.off('error', handleError);
145
+ child.off('close', handleClose);
146
+ };
147
+ const abortError = new Error('Command aborted');
148
+ abortError.name = 'AbortError';
149
+ const terminateChild = (code = 'SIGTERM') => {
150
+ if (isPosix && typeof child.pid === 'number' && child.pid > 0) {
151
+ try {
152
+ process.kill(-child.pid, code);
153
+ }
154
+ catch {
155
+ // ignore group kill errors
156
+ }
157
+ }
158
+ if (!child.killed) {
159
+ try {
160
+ child.kill(code);
161
+ }
162
+ catch {
163
+ // ignore kill errors
164
+ }
165
+ }
166
+ killTimer = setTimeout(() => {
167
+ if (isPosix && typeof child.pid === 'number' && child.pid > 0) {
168
+ try {
169
+ process.kill(-child.pid, 'SIGKILL');
170
+ }
171
+ catch {
172
+ // ignore group kill errors
173
+ }
174
+ }
175
+ if (!child.killed) {
176
+ try {
177
+ child.kill('SIGKILL');
178
+ }
179
+ catch {
180
+ // ignore kill errors
181
+ }
182
+ }
183
+ }, 1000);
184
+ killTimer.unref?.();
185
+ };
186
+ const handleAbort = () => {
187
+ if (aborted) {
188
+ return;
189
+ }
190
+ aborted = true;
191
+ terminateChild();
192
+ };
193
+ let abortListener = null;
194
+ if (signal) {
195
+ if (signal.aborted) {
196
+ handleAbort();
197
+ }
198
+ else {
199
+ abortListener = handleAbort;
200
+ signal.addEventListener('abort', abortListener);
201
+ }
202
+ }
203
+ const timeoutId = COMMAND_TIMEOUT_MS
204
+ ? setTimeout(() => {
205
+ timedOut = true;
206
+ terminateChild();
207
+ }, COMMAND_TIMEOUT_MS)
208
+ : null;
209
+ timeoutId?.unref?.();
210
+ child.stdout?.setEncoding('utf8');
211
+ child.stderr?.setEncoding('utf8');
212
+ const handleStdout = (chunk) => {
213
+ stdout += chunk;
214
+ totalOutput += Buffer.byteLength(chunk, 'utf8');
215
+ if (totalOutput > COMMAND_MAX_BUFFER) {
216
+ overflowed = true;
217
+ terminateChild();
218
+ }
219
+ };
220
+ const handleStderr = (chunk) => {
221
+ stderr += chunk;
222
+ totalOutput += Buffer.byteLength(chunk, 'utf8');
223
+ if (totalOutput > COMMAND_MAX_BUFFER) {
224
+ overflowed = true;
225
+ terminateChild();
226
+ }
227
+ };
228
+ if (child.stdout) {
229
+ child.stdout.on('data', handleStdout);
230
+ }
231
+ if (child.stderr) {
232
+ child.stderr.on('data', handleStderr);
233
+ }
234
+ const handleError = (error) => {
235
+ cleanup();
236
+ reject(error);
237
+ };
238
+ child.on('error', handleError);
239
+ const handleClose = (code, signalCode) => {
240
+ cleanup();
241
+ if (overflowed) {
242
+ reject(new Error('Command output exceeded maximum buffer size.'));
243
+ return;
244
+ }
245
+ if (aborted) {
246
+ reject(abortError);
247
+ return;
248
+ }
249
+ if (timedOut) {
250
+ reject(new Error('Command timed out.'));
251
+ return;
252
+ }
253
+ if (signalCode) {
254
+ reject(new Error(`Command terminated due to signal ${signalCode}`));
255
+ return;
256
+ }
257
+ if (code !== 0) {
258
+ const message = stderr.trim() || stdout.trim() || `Command exited with code ${code}`;
259
+ reject(new Error(message));
260
+ return;
261
+ }
262
+ resolve(stdout);
263
+ };
264
+ child.once('close', handleClose);
265
+ });
266
+ }
267
+ function resolveShellInvocation() {
268
+ const shellPath = typeof process.env["SHELL"] === 'string' && process.env["SHELL"].trim()
269
+ ? process.env["SHELL"].trim()
270
+ : '/bin/sh';
271
+ const name = shellPath.split('/').pop();
272
+ const shellArgs = [];
273
+ if (name === 'bash' || name === 'zsh' || name === 'fish') {
274
+ shellArgs.push('-il');
275
+ }
276
+ shellArgs.push('-c');
277
+ return { shellPath, shellArgs };
278
+ }
279
+ function resolveBaseCommand(llm) {
280
+ if (llm === 'codex') {
281
+ return COMMAND_NAMES.codex;
282
+ }
283
+ if (llm === 'claude') {
284
+ return COMMAND_NAMES.claude;
285
+ }
286
+ if (llm === 'cursor') {
287
+ return COMMAND_NAMES.cursor;
288
+ }
289
+ return null;
290
+ }
291
+ function buildCommandForLlm(llm, promptText) {
292
+ const baseCommand = resolveBaseCommand(llm);
293
+ if (!baseCommand) {
294
+ throw new Error(`No command configured for LLM "${llm}".`);
295
+ }
296
+ const commandPrefix = `command ${baseCommand}`;
297
+ switch (llm) {
298
+ case 'claude':
299
+ return buildCommandString(commandPrefix, ['-p', promptText]);
300
+ case 'cursor':
301
+ return buildCommandString(commandPrefix, ['-p', promptText]);
302
+ case 'codex':
303
+ default:
304
+ return buildCommandString(commandPrefix, ['exec', promptText, '--skip-git-repo-check']);
305
+ }
306
+ }
307
+ export function createBranchNameGenerator({ defaultLlm } = {}) {
308
+ const chosenLlm = normaliseLlm(defaultLlm);
309
+ const activeControllers = new Set();
310
+ const runningCommands = new Set();
311
+ const activeProcesses = new Set();
312
+ async function generateBranchName(context = {}) {
313
+ const userPrompt = buildUserPrompt(context);
314
+ const developerMessage = await loadDeveloperMessage('branch-name', DEFAULT_DEVELOPER_MESSAGE);
315
+ const promptText = buildPromptText({ developerMessage, userPrompt });
316
+ const requestedLlm = normaliseLlm(context.llm || chosenLlm);
317
+ const controller = new AbortController();
318
+ activeControllers.add(controller);
319
+ let commandPromise;
320
+ try {
321
+ const command = buildCommandForLlm(requestedLlm, promptText);
322
+ try {
323
+ commandPromise = Promise.resolve(executeLlmCommand(command, {
324
+ signal: controller.signal,
325
+ onProcessStart: (childProcess) => {
326
+ if (!childProcess) {
327
+ return;
328
+ }
329
+ activeProcesses.add(childProcess);
330
+ const proc = childProcess;
331
+ proc.once('close', () => {
332
+ activeProcesses.delete(childProcess);
333
+ });
334
+ },
335
+ }));
336
+ }
337
+ catch (error) {
338
+ const err = error;
339
+ if (controller.signal.aborted || err?.name === 'AbortError' || err?.code === 'ABORT_ERR') {
340
+ throw new Error('Branch name generation was cancelled.');
341
+ }
342
+ throw error;
343
+ }
344
+ runningCommands.add(commandPromise);
345
+ let output;
346
+ try {
347
+ output = await commandPromise;
348
+ }
349
+ finally {
350
+ runningCommands.delete(commandPromise);
351
+ }
352
+ const candidate = sanitiseCandidate(output);
353
+ if (!candidate) {
354
+ throw new Error('Generated branch name was empty.');
355
+ }
356
+ if (candidate.toLowerCase() === 'main') {
357
+ throw new Error('Generated branch name is invalid (branch "main" is not allowed).');
358
+ }
359
+ return candidate;
360
+ }
361
+ catch (error) {
362
+ const err = error;
363
+ if (controller.signal.aborted || err?.name === 'AbortError' || err?.code === 'ABORT_ERR') {
364
+ throw new Error('Branch name generation was cancelled.');
365
+ }
366
+ const message = error instanceof Error ? error.message : String(error);
367
+ throw new Error(`Failed to generate branch name using ${requestedLlm}: ${message}`);
368
+ }
369
+ finally {
370
+ activeControllers.delete(controller);
371
+ }
372
+ }
373
+ async function disposeAll() {
374
+ if (activeControllers.size === 0 && runningCommands.size === 0 && activeProcesses.size === 0) {
375
+ return;
376
+ }
377
+ const controllers = Array.from(activeControllers);
378
+ controllers.forEach((controller) => {
379
+ try {
380
+ controller.abort();
381
+ }
382
+ catch {
383
+ // ignore abort errors during disposal
384
+ }
385
+ });
386
+ activeControllers.clear();
387
+ const processes = Array.from(activeProcesses);
388
+ activeProcesses.clear();
389
+ processes.forEach((child) => {
390
+ try {
391
+ if (!child.killed && child.kill) {
392
+ child.kill('SIGTERM');
393
+ }
394
+ }
395
+ catch {
396
+ // ignore kill errors during disposal
397
+ }
398
+ });
399
+ if (processes.length > 0) {
400
+ await Promise.allSettled(processes.map((child) => new Promise((resolve) => {
401
+ if (child.exitCode !== null || child.signalCode) {
402
+ resolve();
403
+ return;
404
+ }
405
+ const handleResolve = () => resolve();
406
+ if (child.once) {
407
+ child.once('close', handleResolve);
408
+ child.once('exit', handleResolve);
409
+ }
410
+ else {
411
+ resolve();
412
+ }
413
+ })));
414
+ }
415
+ const pending = Array.from(runningCommands);
416
+ runningCommands.clear();
417
+ if (pending.length > 0) {
418
+ await Promise.allSettled(pending);
419
+ }
420
+ }
421
+ return {
422
+ isConfigured: true,
423
+ generateBranchName,
424
+ async dispose() {
425
+ await disposeAll();
426
+ },
427
+ };
428
+ }
429
+ //# sourceMappingURL=branch-name.js.map