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,91 @@
1
+ import { createIsolatedTerminalSession, queueSessionInput } from './terminal-sessions.js';
2
+ import { runTmux } from './tmux.js';
3
+ import { savePlanToWorktree } from './plan-storage.js';
4
+ function normaliseTerminalInput(value) {
5
+ if (!value) {
6
+ return '';
7
+ }
8
+ const normalised = String(value).replace(/\r\n/g, '\n').replace(/\r/g, '\n').replace(/\n/g, '\r');
9
+ return /\r$/.test(normalised) ? normalised : `${normalised}\r`;
10
+ }
11
+ function shellQuote(value) {
12
+ if (value === undefined || value === null) {
13
+ return "''";
14
+ }
15
+ const text = String(value);
16
+ if (text === '') {
17
+ return "''";
18
+ }
19
+ return `'${text.replace(/'/g, `'\\''`)}'`;
20
+ }
21
+ async function preparePromptEnvironment(session, prompt) {
22
+ const value = typeof prompt === 'string' ? prompt : '';
23
+ if (session?.usingTmux && session.tmuxSessionName) {
24
+ const target = `=${session.tmuxSessionName}`;
25
+ try {
26
+ if (value) {
27
+ await runTmux(['set-environment', '-t', target, 'AGENTRIX_PROMPT', value]);
28
+ }
29
+ else {
30
+ await runTmux(['set-environment', '-u', '-t', target, 'AGENTRIX_PROMPT']);
31
+ }
32
+ return null;
33
+ }
34
+ catch (error) {
35
+ const err = error;
36
+ console.warn('[agentrix] Failed to set tmux environment variable:', err?.message || error);
37
+ }
38
+ }
39
+ if (!value) {
40
+ return 'unset AGENTRIX_PROMPT';
41
+ }
42
+ return `export AGENTRIX_PROMPT=${shellQuote(value)}`;
43
+ }
44
+ /**
45
+ * Launches an automation agent command inside the managed terminal session for a worktree.
46
+ * Commands run inside the same tmux-backed terminal infrastructure used by the UI so that
47
+ * automation launches remain observable and attachable from the frontend.
48
+ */
49
+ export async function launchAgentProcess({ command, workdir, org, repo, branch, prompt, }) {
50
+ if (!command || typeof command !== 'string' || !command.trim()) {
51
+ throw new Error('Agent command is required');
52
+ }
53
+ if (!workdir || !org || !repo || !branch) {
54
+ throw new Error('workdir, org, repo, and branch are required to launch an agent');
55
+ }
56
+ const executable = command.trim();
57
+ const promptValue = typeof prompt === 'string' ? prompt : '';
58
+ const session = await createIsolatedTerminalSession(workdir, org, repo, branch);
59
+ if (session.worktreePath) {
60
+ try {
61
+ await savePlanToWorktree({
62
+ worktreePath: session.worktreePath,
63
+ branch,
64
+ planText: promptValue,
65
+ });
66
+ }
67
+ catch (error) {
68
+ const err = error;
69
+ console.warn('[agentrix] Failed to persist automation plan:', err?.message || error);
70
+ }
71
+ }
72
+ const envPreparation = await preparePromptEnvironment(session, promptValue);
73
+ if (envPreparation) {
74
+ const envInput = normaliseTerminalInput(envPreparation);
75
+ if (envInput) {
76
+ queueSessionInput(session, envInput);
77
+ }
78
+ }
79
+ const commandWithPrompt = promptValue.length > 0 ? `${executable} ${shellQuote(promptValue)}` : executable;
80
+ queueSessionInput(session, normaliseTerminalInput(commandWithPrompt));
81
+ const pid = session?.process?.pid ?? null;
82
+ return {
83
+ pid,
84
+ command: executable,
85
+ sessionId: session.id,
86
+ tmuxSessionName: session.tmuxSessionName ?? null,
87
+ usingTmux: Boolean(session.usingTmux),
88
+ createdSession: true,
89
+ };
90
+ }
91
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/core/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AuthManager } from '../types/auth.js';
2
+ export declare function createAuthManager(expectedPassword: string): AuthManager;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,WAAW,CA+EvE"}
@@ -0,0 +1,69 @@
1
+ import { SESSION_COOKIE_NAME, SESSION_MAX_AGE_SECONDS } from '../config/constants.js';
2
+ import { clearCookie, parseCookies, setCookie } from '../infrastructure/cookies/index.js';
3
+ import { generateSessionToken } from '../utils/random.js';
4
+ export function createAuthManager(expectedPassword) {
5
+ const validSessionTokens = new Set();
6
+ function createError(message, statusCode) {
7
+ const error = new Error(message);
8
+ error.statusCode = statusCode;
9
+ return error;
10
+ }
11
+ function getTokenFromRequest(req) {
12
+ const cookies = parseCookies(req.headers?.cookie);
13
+ return cookies[SESSION_COOKIE_NAME] || '';
14
+ }
15
+ function isAuthenticated(req) {
16
+ const token = getTokenFromRequest(req);
17
+ return Boolean(token && validSessionTokens.has(token));
18
+ }
19
+ function login(req, res, providedPassword, options = {}) {
20
+ if (typeof providedPassword !== 'string' || !providedPassword.trim()) {
21
+ throw createError('Password is required', 400);
22
+ }
23
+ if (providedPassword.trim() !== expectedPassword) {
24
+ throw createError('Invalid password', 401);
25
+ }
26
+ const existing = getTokenFromRequest(req);
27
+ if (existing) {
28
+ validSessionTokens.delete(existing);
29
+ }
30
+ const token = generateSessionToken();
31
+ validSessionTokens.add(token);
32
+ const secureFlag = options.secure;
33
+ setCookie(res, SESSION_COOKIE_NAME, token, {
34
+ maxAge: SESSION_MAX_AGE_SECONDS,
35
+ sameSite: 'Strict',
36
+ httpOnly: true,
37
+ path: '/',
38
+ secure: secureFlag,
39
+ });
40
+ return token;
41
+ }
42
+ function logout(req, res, options = {}) {
43
+ const token = getTokenFromRequest(req);
44
+ if (token) {
45
+ validSessionTokens.delete(token);
46
+ }
47
+ clearCookie(res, SESSION_COOKIE_NAME, {
48
+ path: '/',
49
+ sameSite: 'Strict',
50
+ httpOnly: true,
51
+ secure: options?.secure,
52
+ });
53
+ }
54
+ function hasToken(token) {
55
+ return validSessionTokens.has(token);
56
+ }
57
+ function clear() {
58
+ validSessionTokens.clear();
59
+ }
60
+ return {
61
+ login,
62
+ logout,
63
+ isAuthenticated,
64
+ hasToken,
65
+ clear,
66
+ getTokenFromRequest,
67
+ };
68
+ }
69
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/core/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Branch resolution for automation requests, whether supplied by the client or generated.
3
+ */
4
+ export interface ResolveBranchNameParams {
5
+ worktreeInput?: string;
6
+ branchNameGenerator: unknown;
7
+ prompt: string;
8
+ org: string;
9
+ repo: string;
10
+ defaultBranches: unknown;
11
+ }
12
+ export interface ResolveBranchNameResult {
13
+ branch: string;
14
+ defaultBranchOverride?: string;
15
+ source: 'worktree' | 'generator';
16
+ }
17
+ export declare function resolveBranchName({ worktreeInput, branchNameGenerator, prompt, org, repo, defaultBranches, }: ResolveBranchNameParams): Promise<ResolveBranchNameResult>;
18
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../../src/core/automation/branch.ts"],"names":[],"mappings":"AAMA;;GAEG;AAEH,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;CAClC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,aAAa,EACb,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,IAAI,EACJ,eAAe,GAChB,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAoC5D"}
@@ -0,0 +1,29 @@
1
+ import { selectDefaultBranchOverride } from '../default-branch.js';
2
+ import { AutomationRequestError, sanitiseWorktreeDescriptor, } from './request-validation.js';
3
+ export async function resolveBranchName({ worktreeInput, branchNameGenerator, prompt, org, repo, defaultBranches, }) {
4
+ const defaultBranchOverride = selectDefaultBranchOverride(defaultBranches, org, repo);
5
+ if (worktreeInput) {
6
+ const branch = sanitiseWorktreeDescriptor(worktreeInput);
7
+ return { branch, defaultBranchOverride, source: 'worktree' };
8
+ }
9
+ const generator = branchNameGenerator;
10
+ if (!generator || !generator.isConfigured) {
11
+ throw new AutomationRequestError(503, 'Branch name generation is not configured. Provide a worktree name or configure a local LLM command (set branchNameLlm in config.json).');
12
+ }
13
+ try {
14
+ const branch = await generator.generateBranchName({
15
+ prompt,
16
+ org,
17
+ repo,
18
+ });
19
+ if (!branch) {
20
+ throw new AutomationRequestError(500, 'Failed to determine branch name.');
21
+ }
22
+ return { branch, defaultBranchOverride, source: 'generator' };
23
+ }
24
+ catch (error) {
25
+ const message = error instanceof Error ? error.message : String(error);
26
+ throw new AutomationRequestError(500, message, error instanceof Error ? error : undefined);
27
+ }
28
+ }
29
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../../src/core/automation/branch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,yBAAyB,CAAC;AAqBjC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,aAAa,EACb,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,IAAI,EACJ,eAAe,GACS;IACxB,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAEtF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,SAAS,GAAG,mBAA0G,CAAC;IAC7H,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,IAAI,sBAAsB,CAC9B,GAAG,EACH,wIAAwI,CACzI,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,kBAAmB,CAAC;YACjD,MAAM;YACN,GAAG;YACH,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,sBAAsB,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,sBAAsB,CAC9B,GAAG,EACH,OAAO,EACP,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,51 @@
1
+ export interface EnsureRepositoryReadyParams {
2
+ ensureRepositoryExists: (workdir: string, org: string, repo: string) => Promise<{
3
+ repositoryPath: string;
4
+ cloned: boolean;
5
+ }>;
6
+ workdir: string;
7
+ org: string;
8
+ repo: string;
9
+ }
10
+ export interface EnsureWorktreeReadyParams {
11
+ ensureWorktreeExists: (workdir: string, org: string, repo: string, branch: string, options?: unknown) => Promise<{
12
+ worktreePath: string;
13
+ created: boolean;
14
+ }>;
15
+ workdir: string;
16
+ org: string;
17
+ repo: string;
18
+ branch: string;
19
+ defaultBranchOverride?: string;
20
+ }
21
+ export interface RefreshRepositoryViewsParams {
22
+ refreshCache: (workdir: string) => Promise<unknown>;
23
+ workdir: string;
24
+ }
25
+ export interface GitOrchestrator {
26
+ ensureRepositoryReady(args: Omit<EnsureRepositoryReadyParams, 'ensureRepositoryExists'>): Promise<{
27
+ repositoryPath: string;
28
+ clonedRepository: boolean;
29
+ }>;
30
+ ensureWorktreeReady(args: Omit<EnsureWorktreeReadyParams, 'ensureWorktreeExists'>): Promise<{
31
+ worktreePath: string;
32
+ createdWorktree: boolean;
33
+ }>;
34
+ refreshRepositoryViews(args: Omit<RefreshRepositoryViewsParams, 'refreshCache'>): Promise<void>;
35
+ }
36
+ export declare function ensureRepositoryReady({ ensureRepositoryExists, workdir, org, repo, }: EnsureRepositoryReadyParams): Promise<{
37
+ repositoryPath: string;
38
+ clonedRepository: boolean;
39
+ }>;
40
+ export declare function ensureWorktreeReady({ ensureWorktreeExists, workdir, org, repo, branch, defaultBranchOverride, }: EnsureWorktreeReadyParams): Promise<{
41
+ worktreePath: string;
42
+ createdWorktree: boolean;
43
+ }>;
44
+ export declare function refreshRepositoryViews({ refreshCache, workdir, }: RefreshRepositoryViewsParams): Promise<void>;
45
+ export interface GitOrchestratorConfig {
46
+ ensureRepositoryExists: EnsureRepositoryReadyParams['ensureRepositoryExists'];
47
+ ensureWorktreeExists: EnsureWorktreeReadyParams['ensureWorktreeExists'];
48
+ refreshCache?: RefreshRepositoryViewsParams['refreshCache'];
49
+ }
50
+ export declare function createGitOrchestrator({ ensureRepositoryExists, ensureWorktreeExists, refreshCache, }: GitOrchestratorConfig): GitOrchestrator;
51
+ //# sourceMappingURL=git-orchestration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-orchestration.d.ts","sourceRoot":"","sources":["../../../src/core/automation/git-orchestration.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,2BAA2B;IAC1C,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7H,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7J,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,2BAA2B,EAAE,wBAAwB,CAAC,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzJ,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAChJ,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,4BAA4B,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjG;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,sBAAsB,EACtB,OAAO,EACP,GAAG,EACH,IAAI,GACL,EAAE,2BAA2B,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAAC,CAG9F;AAED,wBAAsB,mBAAmB,CAAC,EACxC,oBAAoB,EACpB,OAAO,EACP,GAAG,EACH,IAAI,EACJ,MAAM,EACN,qBAAqB,GACtB,EAAE,yBAAyB,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAMzF;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,YAAY,EACZ,OAAO,GACR,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9C;AAED,MAAM,WAAW,qBAAqB;IACpC,sBAAsB,EAAE,2BAA2B,CAAC,wBAAwB,CAAC,CAAC;IAC9E,oBAAoB,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,4BAA4B,CAAC,cAAc,CAAC,CAAC;CAC7D;AAED,wBAAgB,qBAAqB,CAAC,EACpC,sBAAsB,EACtB,oBAAoB,EACpB,YAAqC,GACtC,EAAE,qBAAqB,GAAG,eAAe,CASzC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Git/worktree orchestration helpers used by the automation task runner.
3
+ */
4
+ import { refreshRepositoryCache } from '../../utils/repository-cache.js';
5
+ export async function ensureRepositoryReady({ ensureRepositoryExists, workdir, org, repo, }) {
6
+ const { repositoryPath, cloned } = await ensureRepositoryExists(workdir, org, repo);
7
+ return { repositoryPath, clonedRepository: cloned };
8
+ }
9
+ export async function ensureWorktreeReady({ ensureWorktreeExists, workdir, org, repo, branch, defaultBranchOverride, }) {
10
+ const { worktreePath, created } = await ensureWorktreeExists(workdir, org, repo, branch, {
11
+ defaultBranchOverride,
12
+ });
13
+ return { worktreePath, createdWorktree: created };
14
+ }
15
+ export async function refreshRepositoryViews({ refreshCache, workdir, }) {
16
+ await refreshCache(workdir);
17
+ }
18
+ export function createGitOrchestrator({ ensureRepositoryExists, ensureWorktreeExists, refreshCache = refreshRepositoryCache, }) {
19
+ return {
20
+ ensureRepositoryReady: (args) => ensureRepositoryReady({ ensureRepositoryExists, ...args }),
21
+ ensureWorktreeReady: (args) => ensureWorktreeReady({ ensureWorktreeExists, ...args }),
22
+ refreshRepositoryViews: (args) => refreshRepositoryViews({ refreshCache, ...args }),
23
+ };
24
+ }
25
+ //# sourceMappingURL=git-orchestration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-orchestration.js","sourceRoot":"","sources":["../../../src/core/automation/git-orchestration.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AA6BzE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,sBAAsB,EACtB,OAAO,EACP,GAAG,EACH,IAAI,GACwB;IAC5B,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACpF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EACxC,oBAAoB,EACpB,OAAO,EACP,GAAG,EACH,IAAI,EACJ,MAAM,EACN,qBAAqB,GACK;IAC1B,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE;QACvF,qBAAqB;KACtB,CAAC,CAAC;IAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,YAAY,EACZ,OAAO,GACsB;IAC7B,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAQD,MAAM,UAAU,qBAAqB,CAAC,EACpC,sBAAsB,EACtB,oBAAoB,EACpB,YAAY,GAAG,sBAAsB,GACf;IACtB,OAAO;QACL,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC9B,qBAAqB,CAAC,EAAE,sBAAsB,EAAE,GAAG,IAAI,EAAE,CAAC;QAC5D,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC5B,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,CAAC;QACxD,sBAAsB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/B,sBAAsB,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Utilities for wrapping optional plan generation prior to launching an automation task.
3
+ */
4
+ export interface GeneratePlanTextParams {
5
+ planEnabled: boolean;
6
+ prompt: string;
7
+ planService: unknown;
8
+ repositoryPath?: string;
9
+ }
10
+ export interface GeneratePlanTextResult {
11
+ promptToExecute: string;
12
+ planGenerated: boolean;
13
+ }
14
+ export declare function generatePlanText({ planEnabled, prompt, planService, repositoryPath, }: GeneratePlanTextParams): Promise<GeneratePlanTextResult>;
15
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/core/automation/plan.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CAAC,EACrC,WAAW,EACX,MAAM,EACN,WAAW,EACX,cAAc,GACf,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgC1D"}
@@ -0,0 +1,25 @@
1
+ import { AutomationRequestError } from './request-validation.js';
2
+ export async function generatePlanText({ planEnabled, prompt, planService, repositoryPath, }) {
3
+ if (!planEnabled) {
4
+ return { promptToExecute: prompt, planGenerated: false };
5
+ }
6
+ if (!prompt.trim()) {
7
+ throw new AutomationRequestError(400, 'prompt is required when plan is true');
8
+ }
9
+ const service = planService;
10
+ if (!service || !service.isConfigured) {
11
+ throw new AutomationRequestError(503, 'Plan generation is not configured. Configure a local LLM command (set planLlm in config.json).');
12
+ }
13
+ try {
14
+ const planText = await service.createPlanText({
15
+ prompt,
16
+ cwd: repositoryPath,
17
+ });
18
+ return { promptToExecute: planText, planGenerated: true };
19
+ }
20
+ catch (error) {
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ throw new AutomationRequestError(500, message, error instanceof Error ? error : undefined);
23
+ }
24
+ }
25
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/core/automation/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAkBjE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EACrC,WAAW,EACX,MAAM,EACN,WAAW,EACX,cAAc,GACS;IACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,sBAAsB,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,OAAO,GAAG,WAA8F,CAAC;IAC/G,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI,sBAAsB,CAC9B,GAAG,EACH,gGAAgG,CACjG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAe,CAAC;YAC7C,MAAM;YACN,GAAG,EAAE,cAAc;SACpB,CAAC,CAAC;QAEH,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,sBAAsB,CAC9B,GAAG,EACH,OAAO,EACP,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Helpers for validating inbound automation API requests and normalising payload data.
3
+ */
4
+ export declare class AutomationRequestError extends Error {
5
+ status: number;
6
+ cause?: unknown;
7
+ constructor(status: number, message: string, cause?: unknown);
8
+ }
9
+ export declare function extractApiKey(req: {
10
+ headers?: Record<string, string | string[] | undefined>;
11
+ }): string;
12
+ export declare function parseRequestPayload(readJsonBody: () => Promise<unknown>): Promise<unknown>;
13
+ export declare function parsePlanFlag(value: unknown): boolean;
14
+ export declare function validatePrompt(rawPrompt: unknown): string;
15
+ export declare function parseRepoIdentifier(input: unknown): {
16
+ org: string;
17
+ repo: string;
18
+ };
19
+ export declare function sanitiseWorktreeDescriptor(worktreeDescriptor: unknown): string;
20
+ export declare function resolveAgentCommand(agentCommands: unknown, requested: unknown): {
21
+ key: string;
22
+ command: unknown;
23
+ };
24
+ export interface ValidateAutomationRequestParams {
25
+ req: {
26
+ headers?: Record<string, string | string[] | undefined>;
27
+ };
28
+ expectedApiKey: string;
29
+ readJsonBody: () => Promise<unknown>;
30
+ agentCommands: unknown;
31
+ }
32
+ export declare function validateAutomationRequest({ req, expectedApiKey, readJsonBody, agentCommands, }: ValidateAutomationRequestParams): Promise<{
33
+ payload: unknown;
34
+ planEnabled: boolean;
35
+ routeLabel: string;
36
+ org: string;
37
+ repo: string;
38
+ agent: {
39
+ key: string;
40
+ command: unknown;
41
+ };
42
+ prompt: string;
43
+ worktreeInput: string;
44
+ }>;
45
+ //# sourceMappingURL=request-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-validation.d.ts","sourceRoot":"","sources":["../../../src/core/automation/request-validation.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,EAAE,MAAM,CAAC;IACN,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAQ7D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;CAAE,GAAG,MAAM,CAetG;AAED,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAUzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBjF;AAED,wBAAgB,0BAA0B,CAAC,kBAAkB,EAAE,OAAO,GAAG,MAAM,CA4C9E;AAED,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAsBjH;AAED,MAAM,WAAW,+BAA+B;IAC9C,GAAG,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,yBAAyB,CAAC,EAC9C,GAAG,EACH,cAAc,EACd,YAAY,EACZ,aAAa,GACd,EAAE,+BAA+B,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAmCD"}
@@ -0,0 +1,144 @@
1
+ import { normaliseBranchName } from '../git.js';
2
+ /**
3
+ * Helpers for validating inbound automation API requests and normalising payload data.
4
+ */
5
+ export class AutomationRequestError extends Error {
6
+ status;
7
+ cause;
8
+ constructor(status, message, cause) {
9
+ super(message);
10
+ this.name = 'AutomationRequestError';
11
+ this.status = status;
12
+ if (cause) {
13
+ this.cause = cause;
14
+ }
15
+ }
16
+ }
17
+ export function extractApiKey(req) {
18
+ const apiKeyHeader = req.headers?.['x-api-key'];
19
+ if (typeof apiKeyHeader === 'string' && apiKeyHeader.trim()) {
20
+ return apiKeyHeader.trim();
21
+ }
22
+ const authHeader = req.headers?.['authorization'];
23
+ if (typeof authHeader === 'string') {
24
+ const trimmed = authHeader.trim();
25
+ if (/^bearer\s+/i.test(trimmed)) {
26
+ return trimmed.replace(/^bearer\s+/i, '').trim();
27
+ }
28
+ }
29
+ return '';
30
+ }
31
+ export async function parseRequestPayload(readJsonBody) {
32
+ try {
33
+ return await readJsonBody();
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : 'Invalid JSON payload';
37
+ throw new AutomationRequestError(400, message, error instanceof Error ? error : undefined);
38
+ }
39
+ }
40
+ export function parsePlanFlag(value) {
41
+ if (value === undefined) {
42
+ return true;
43
+ }
44
+ if (typeof value === 'boolean') {
45
+ return value;
46
+ }
47
+ throw new AutomationRequestError(400, 'plan must be a boolean');
48
+ }
49
+ export function validatePrompt(rawPrompt) {
50
+ if (rawPrompt === undefined) {
51
+ return '';
52
+ }
53
+ if (typeof rawPrompt !== 'string') {
54
+ throw new AutomationRequestError(400, 'prompt must be a string');
55
+ }
56
+ return rawPrompt;
57
+ }
58
+ export function parseRepoIdentifier(input) {
59
+ if (typeof input !== 'string' || !input.trim()) {
60
+ throw new AutomationRequestError(400, 'repo must be provided in the format "org/repository"');
61
+ }
62
+ const cleaned = input.trim().replace(/\.git$/i, '');
63
+ const segments = cleaned.split('/').filter(Boolean);
64
+ if (segments.length !== 2) {
65
+ throw new AutomationRequestError(400, 'repo must be provided in the format "org/repository"');
66
+ }
67
+ return { org: segments[0], repo: segments[1] };
68
+ }
69
+ export function sanitiseWorktreeDescriptor(worktreeDescriptor) {
70
+ if (typeof worktreeDescriptor !== 'string' || !worktreeDescriptor.trim()) {
71
+ throw new AutomationRequestError(400, 'worktree must be provided as "type/title"');
72
+ }
73
+ const parts = worktreeDescriptor
74
+ .split('/')
75
+ .map((part) => part.trim())
76
+ .filter(Boolean);
77
+ if (parts.length < 2) {
78
+ throw new AutomationRequestError(400, 'worktree must include both type and title separated by "/"');
79
+ }
80
+ const slugify = (value) => value
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9._-]+/gi, '-')
83
+ .replace(/-+/g, '-')
84
+ .replace(/^-+|-+$/g, '');
85
+ const segments = parts.map((part) => {
86
+ const slug = slugify(part);
87
+ if (!slug) {
88
+ throw new AutomationRequestError(400, 'worktree name segments must include alphanumeric characters');
89
+ }
90
+ return slug;
91
+ });
92
+ const branchName = normaliseBranchName(segments.join('/'));
93
+ if (!branchName) {
94
+ throw new AutomationRequestError(400, 'Derived branch name is empty');
95
+ }
96
+ if (branchName.toLowerCase() === 'main') {
97
+ throw new AutomationRequestError(400, 'worktree branch "main" is not allowed');
98
+ }
99
+ return branchName;
100
+ }
101
+ export function resolveAgentCommand(agentCommands, requested) {
102
+ const key = typeof requested === 'string' ? requested.trim().toLowerCase() : '';
103
+ if (!key) {
104
+ throw new AutomationRequestError(400, 'command must be one of: codex, cursor, claude');
105
+ }
106
+ const commands = agentCommands;
107
+ const mapping = {
108
+ codex: commands?.['codexDangerous'] || commands?.['codex'],
109
+ cursor: commands?.['cursor'],
110
+ claude: commands?.['claudeDangerous'] || commands?.['claude'],
111
+ };
112
+ const command = mapping[key];
113
+ if (!command) {
114
+ throw new AutomationRequestError(400, `Unsupported command "${requested}". Expected codex, cursor, or claude.`);
115
+ }
116
+ return { key, command: command };
117
+ }
118
+ export async function validateAutomationRequest({ req, expectedApiKey, readJsonBody, agentCommands, }) {
119
+ if (!expectedApiKey) {
120
+ throw new AutomationRequestError(503, 'Automation API is not configured (missing API key)');
121
+ }
122
+ const providedKey = extractApiKey(req);
123
+ if (providedKey !== expectedApiKey) {
124
+ throw new AutomationRequestError(401, 'Invalid API key');
125
+ }
126
+ const payload = await parseRequestPayload(readJsonBody);
127
+ const planEnabled = parsePlanFlag(payload['plan']);
128
+ const routeLabel = planEnabled ? 'create-plan' : 'passthrough';
129
+ const prompt = validatePrompt(payload['prompt']);
130
+ const { org, repo } = parseRepoIdentifier(payload['repo']);
131
+ const worktreeInput = typeof payload['worktree'] === 'string' ? payload['worktree'].trim() : '';
132
+ const agent = resolveAgentCommand(agentCommands, payload['command']);
133
+ return {
134
+ payload,
135
+ planEnabled,
136
+ routeLabel,
137
+ prompt,
138
+ org,
139
+ repo,
140
+ worktreeInput,
141
+ agent,
142
+ };
143
+ }
144
+ //# sourceMappingURL=request-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-validation.js","sourceRoot":"","sources":["../../../src/core/automation/request-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Coordinates the asynchronous automation launch task, updating task progress and metadata.
3
+ */
4
+ export declare const TASK_TYPE_AUTOMATION = "automation:launch";
5
+ export declare const STEP_IDS: Readonly<{
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 declare const STEP_LABELS: Readonly<{
13
+ "ensure-repository": "Ensure repository";
14
+ "generate-plan": "Generate plan";
15
+ "ensure-worktree": "Ensure worktree";
16
+ "launch-agent": "Launch agent";
17
+ "refresh-repositories": "Refresh repositories";
18
+ }>;
19
+ export interface RunAutomationTaskParams {
20
+ runTaskImpl: (config: unknown, executor: (context: unknown) => Promise<unknown>) => Promise<unknown>;
21
+ resolveBranchName: (params: unknown) => Promise<unknown>;
22
+ generatePlanText: (params: unknown) => Promise<unknown>;
23
+ gitOrchestrator: unknown;
24
+ launchAgent: (params: unknown) => Promise<void>;
25
+ workdir: string;
26
+ planEnabled: boolean;
27
+ routeLabel: string;
28
+ prompt: string;
29
+ org: string;
30
+ repo: string;
31
+ agent: string;
32
+ requestId: string;
33
+ worktreeInput?: string;
34
+ branchNameGenerator: unknown;
35
+ defaultBranches: unknown;
36
+ planService: unknown;
37
+ finishSuccess: (response: unknown) => void;
38
+ finishFailure: (error: unknown) => void;
39
+ onBranchResolved?: (branch: string) => void;
40
+ }
41
+ export declare function runAutomationTask({ runTaskImpl, resolveBranchName, generatePlanText, gitOrchestrator, launchAgent, workdir, planEnabled, routeLabel, prompt, org, repo, agent, requestId, worktreeInput, branchNameGenerator, defaultBranches, planService, finishSuccess, finishFailure, onBranchResolved, }: RunAutomationTaskParams): Promise<void>;
42
+ //# sourceMappingURL=task-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../../../src/core/automation/task-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AAExD,eAAO,MAAM,QAAQ;;;;;;EAMnB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;EAMtB,CAAC;AAEH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrG,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAsB,iBAAiB,CAAC,EACtC,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,OAAO,EACP,WAAW,EACX,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,KAAK,EACL,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuQzC"}