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,128 @@
1
+ import { discoverRepositories } from '../core/git.js';
2
+ import { listActiveSessions } from '../core/terminal-sessions.js';
3
+ import { getEventTypes, subscribeToEvents } from '../core/event-bus.js';
4
+ import { listTasks } from '../core/tasks.js';
5
+ const HEARTBEAT_INTERVAL_MS = 15000;
6
+ function writeEvent(res, { event, data }) {
7
+ const payload = typeof data === 'string' ? data : JSON.stringify(data);
8
+ res.write(`event: ${event}\n`);
9
+ res.write(`data: ${payload}\n\n`);
10
+ }
11
+ async function sendInitialSnapshots(res, workdir) {
12
+ const [reposSnapshot, sessionsSnapshot, tasksSnapshot] = await Promise.all([
13
+ discoverRepositories(workdir).catch(() => ({})),
14
+ Promise.resolve(listActiveSessions()).then((sessions) => sessions.map((session) => {
15
+ const lastActivityAtMs = typeof session.lastActivityAt === 'number'
16
+ ? session.lastActivityAt
17
+ : session.lastActivityAt instanceof Date
18
+ ? session.lastActivityAt.getTime()
19
+ : null;
20
+ return {
21
+ id: session.id,
22
+ org: session.org,
23
+ repo: session.repo,
24
+ branch: session.branch,
25
+ usingTmux: session.usingTmux,
26
+ idle: Boolean(session.idle),
27
+ lastActivityAt: lastActivityAtMs ? new Date(lastActivityAtMs).toISOString() : null,
28
+ };
29
+ })),
30
+ Promise.resolve(listTasks()).catch(() => []),
31
+ ]);
32
+ writeEvent(res, { event: getEventTypes().REPOS_UPDATE, data: { data: reposSnapshot } });
33
+ writeEvent(res, { event: getEventTypes().SESSIONS_UPDATE, data: { sessions: sessionsSnapshot } });
34
+ if (Array.isArray(tasksSnapshot) && tasksSnapshot.length > 0) {
35
+ writeEvent(res, { event: getEventTypes().TASKS_UPDATE, data: { tasks: tasksSnapshot } });
36
+ }
37
+ }
38
+ export function createEventStreamHandler({ authManager, workdir }) {
39
+ if (!authManager) {
40
+ throw new Error('authManager is required');
41
+ }
42
+ if (!workdir) {
43
+ throw new Error('workdir is required');
44
+ }
45
+ return async function handleEventStream(context) {
46
+ const { res, req } = context;
47
+ if (!authManager.isAuthenticated(req)) {
48
+ res.statusCode = 401;
49
+ res.end();
50
+ return;
51
+ }
52
+ res.writeHead(200, {
53
+ 'Cache-Control': 'no-store',
54
+ Connection: 'keep-alive',
55
+ 'Content-Type': 'text/event-stream',
56
+ 'X-Accel-Buffering': 'no',
57
+ });
58
+ res.write(': connected\n\n');
59
+ const cleanupFunctions = [];
60
+ const heartbeatInterval = setInterval(() => {
61
+ try {
62
+ res.write(`: ping ${Date.now()}\n\n`);
63
+ }
64
+ catch {
65
+ clearInterval(heartbeatInterval);
66
+ }
67
+ }, HEARTBEAT_INTERVAL_MS);
68
+ cleanupFunctions.push(() => clearInterval(heartbeatInterval));
69
+ const unsubscribeRepos = subscribeToEvents(getEventTypes().REPOS_UPDATE, (payload) => {
70
+ try {
71
+ writeEvent(res, { event: getEventTypes().REPOS_UPDATE, data: { data: payload } });
72
+ }
73
+ catch {
74
+ res.end();
75
+ }
76
+ });
77
+ cleanupFunctions.push(unsubscribeRepos);
78
+ const unsubscribeSessions = subscribeToEvents(getEventTypes().SESSIONS_UPDATE, (payload) => {
79
+ try {
80
+ writeEvent(res, {
81
+ event: getEventTypes().SESSIONS_UPDATE,
82
+ data: { sessions: payload },
83
+ });
84
+ }
85
+ catch {
86
+ res.end();
87
+ }
88
+ });
89
+ cleanupFunctions.push(unsubscribeSessions);
90
+ const unsubscribeTasks = subscribeToEvents(getEventTypes().TASKS_UPDATE, (payload) => {
91
+ try {
92
+ writeEvent(res, {
93
+ event: getEventTypes().TASKS_UPDATE,
94
+ data: payload,
95
+ });
96
+ }
97
+ catch {
98
+ res.end();
99
+ }
100
+ });
101
+ cleanupFunctions.push(unsubscribeTasks);
102
+ req.on('close', () => {
103
+ cleanupFunctions.forEach((fn) => {
104
+ try {
105
+ fn();
106
+ }
107
+ catch {
108
+ // ignore cleanup errors
109
+ }
110
+ });
111
+ });
112
+ try {
113
+ await sendInitialSnapshots(res, workdir);
114
+ }
115
+ catch (error) {
116
+ const err = error;
117
+ try {
118
+ res.write(`event: error\n`);
119
+ res.write(`data: ${JSON.stringify({ error: err?.message || 'Failed to stream events' })}\n\n`);
120
+ }
121
+ catch {
122
+ // ignore secondary failures
123
+ }
124
+ res.end();
125
+ }
126
+ };
127
+ }
128
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/server/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Server as HttpServer } from 'node:http';
2
+ import { DEFAULT_HOST, DEFAULT_PORT } from '../config/constants.js';
3
+ import { generateRandomPassword } from '../utils/random.js';
4
+ import type { ServerConfig } from '../types/config.js';
5
+ export interface StartServerResult {
6
+ server: HttpServer;
7
+ host: string;
8
+ port: number;
9
+ uiPath: string;
10
+ workdir: string;
11
+ close: () => Promise<void>;
12
+ password: string;
13
+ commands: unknown;
14
+ publicUrl: string | null;
15
+ }
16
+ export declare function startServer({ uiPath, port, host, workdir, password, commandOverrides, ngrok: ngrokConfig, automationApiKey, openaiApiKey, branchNameLlm, planLlm, defaultBranches, cookieSecure, terminalSessionMode, }?: Partial<ServerConfig>): Promise<StartServerResult>;
17
+ export { DEFAULT_HOST, DEFAULT_PORT, generateRandomPassword };
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAIpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAW5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,wBAAsB,WAAW,CAAC,EAChC,MAAM,EACN,IAAmB,EACnB,IAAmB,EACnB,OAAO,EACP,QAAQ,EACR,gBAAgB,EAChB,KAAK,EAAE,WAAW,EAClB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,OAAO,EACP,eAAe,EACf,YAAY,EACZ,mBAA4B,GAC7B,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwLzD;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,173 @@
1
+ import http from 'node:http';
2
+ import { DEFAULT_HOST, DEFAULT_PORT } from '../config/constants.js';
3
+ import { createAuthManager } from '../core/auth.js';
4
+ import { resolveWorkdir } from '../core/workdir.js';
5
+ import { disposeAllSessions } from '../core/terminal-sessions.js';
6
+ import { generateRandomPassword } from '../utils/random.js';
7
+ import { sendJson } from '../utils/http.js';
8
+ import { createRouter } from './router.js';
9
+ import { attachTerminalWebSockets } from './websocket.js';
10
+ import { createUiProvider } from './ui.js';
11
+ import { createCookieManager } from './cookies.js';
12
+ import { createAgentCommands } from '../config/agent-commands.js';
13
+ import { createBranchNameGenerator } from '../core/branch-name.js';
14
+ import { createPlanService } from '../core/plan.js';
15
+ import { configureTaskPersistence, flushTaskPersistence } from '../core/tasks.js';
16
+ import { createTaskStore } from '../core/task-store.js';
17
+ export async function startServer({ uiPath, port = DEFAULT_PORT, host = DEFAULT_HOST, workdir, password, commandOverrides, ngrok: ngrokConfig, automationApiKey, openaiApiKey, branchNameLlm, planLlm, defaultBranches, cookieSecure, terminalSessionMode = 'auto', } = {}) {
18
+ if (!uiPath) {
19
+ throw new Error('Missing required option: uiPath');
20
+ }
21
+ const uiProvider = await createUiProvider(uiPath);
22
+ const resolvedWorkdir = workdir ? await resolveWorkdir(workdir) : process.cwd();
23
+ const taskStore = createTaskStore({ root: resolvedWorkdir, logger: console });
24
+ await configureTaskPersistence({
25
+ saveSnapshot: (snapshot) => taskStore.saveSnapshot(snapshot),
26
+ logger: console,
27
+ });
28
+ const resolvedPassword = typeof password === 'string' && password.length > 0 ? password : generateRandomPassword();
29
+ const authManager = createAuthManager(resolvedPassword);
30
+ const agentCommands = createAgentCommands(commandOverrides);
31
+ const resolvedOpenAiKey = openaiApiKey ?? process.env['OPENAI_API_KEY'] ?? undefined;
32
+ if (resolvedOpenAiKey && !process.env['OPENAI_API_KEY']) {
33
+ process.env['OPENAI_API_KEY'] = resolvedOpenAiKey;
34
+ }
35
+ const branchNameGenerator = createBranchNameGenerator({
36
+ defaultLlm: branchNameLlm,
37
+ });
38
+ const planService = createPlanService({ defaultLlm: planLlm });
39
+ const cookieManager = createCookieManager({ secureSetting: cookieSecure });
40
+ const router = createRouter({
41
+ authManager,
42
+ workdir: resolvedWorkdir,
43
+ agentCommands,
44
+ automationApiKey,
45
+ branchNameGenerator,
46
+ planService,
47
+ defaultBranches,
48
+ cookieManager,
49
+ terminalSessionMode,
50
+ });
51
+ const server = http.createServer(async (req, res) => {
52
+ try {
53
+ const handled = await router(req, res);
54
+ if (handled) {
55
+ return;
56
+ }
57
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
58
+ if (url.pathname.startsWith('/api/')) {
59
+ sendJson(res, 404, { error: 'Not Found' });
60
+ return;
61
+ }
62
+ await uiProvider.serve(req, res);
63
+ }
64
+ catch (error) {
65
+ console.error('[agentrix] Request handling error:', error);
66
+ if (!res.headersSent) {
67
+ res.statusCode = 500;
68
+ res.end('Internal Server Error');
69
+ }
70
+ else {
71
+ res.end();
72
+ }
73
+ }
74
+ });
75
+ const { close: closeWebSockets } = attachTerminalWebSockets(server, authManager);
76
+ const activeSockets = new Set();
77
+ server.on('connection', (socket) => {
78
+ activeSockets.add(socket);
79
+ socket.on('close', () => {
80
+ activeSockets.delete(socket);
81
+ });
82
+ });
83
+ await new Promise((resolve, reject) => {
84
+ server.once('error', reject);
85
+ server.listen(port, host, () => {
86
+ server.off('error', reject);
87
+ resolve();
88
+ });
89
+ });
90
+ let ngrokListener = null;
91
+ let ngrokUrl = null;
92
+ const shouldStartNgrok = Boolean(ngrokConfig?.apiKey) && Boolean(ngrokConfig?.domain);
93
+ if (shouldStartNgrok) {
94
+ try {
95
+ const { forward } = await import('@ngrok/ngrok');
96
+ const listener = await forward({
97
+ addr: port,
98
+ authtoken: ngrokConfig?.apiKey || '',
99
+ domain: ngrokConfig?.domain || '',
100
+ });
101
+ ngrokListener = listener;
102
+ ngrokUrl = listener.url();
103
+ }
104
+ catch (error) {
105
+ await disposeAllSessions().catch(() => { });
106
+ await closeWebSockets().catch(() => { });
107
+ try {
108
+ await new Promise((resolve) => {
109
+ server.close(() => resolve());
110
+ });
111
+ }
112
+ catch {
113
+ // ignore errors during shutdown
114
+ }
115
+ authManager.clear();
116
+ throw new Error(`Failed to establish ngrok tunnel: ${error instanceof Error ? error.message : String(error)}`);
117
+ }
118
+ }
119
+ let closing = false;
120
+ async function closeAll() {
121
+ if (closing) {
122
+ return;
123
+ }
124
+ closing = true;
125
+ activeSockets.forEach((socket) => {
126
+ try {
127
+ socket.destroy();
128
+ }
129
+ catch {
130
+ // ignore socket destroy errors during shutdown
131
+ }
132
+ });
133
+ const serverClose = new Promise((resolve) => {
134
+ server.close(() => resolve());
135
+ });
136
+ const closeTasks = [
137
+ flushTaskPersistence(),
138
+ disposeAllSessions(),
139
+ closeWebSockets(),
140
+ serverClose,
141
+ ];
142
+ if (branchNameGenerator && typeof branchNameGenerator.dispose === 'function') {
143
+ closeTasks.push(branchNameGenerator
144
+ .dispose()
145
+ .catch((error) => console.error('[agentrix] Failed to dispose branch name generator:', error)));
146
+ }
147
+ if (planService && typeof planService.dispose === 'function') {
148
+ closeTasks.push(planService
149
+ .dispose()
150
+ .catch((error) => console.error('[agentrix] Failed to dispose plan service:', error)));
151
+ }
152
+ if (ngrokListener) {
153
+ closeTasks.push(ngrokListener
154
+ .close()
155
+ .catch((err) => console.error('[agentrix] Failed to close ngrok tunnel:', err)));
156
+ }
157
+ await Promise.allSettled(closeTasks);
158
+ authManager.clear();
159
+ }
160
+ return {
161
+ server,
162
+ host,
163
+ port,
164
+ uiPath: uiProvider.resolvedPath,
165
+ workdir: resolvedWorkdir,
166
+ close: closeAll,
167
+ password: resolvedPassword,
168
+ commands: agentCommands,
169
+ publicUrl: ngrokUrl,
170
+ };
171
+ }
172
+ export { DEFAULT_HOST, DEFAULT_PORT, generateRandomPassword };
173
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { AuthManager, CookieManager } from '../types/auth.js';
3
+ export interface RouterConfig {
4
+ authManager: AuthManager;
5
+ workdir: string;
6
+ agentCommands: unknown;
7
+ automationApiKey?: string;
8
+ branchNameGenerator: unknown;
9
+ planService: unknown;
10
+ defaultBranches: unknown;
11
+ cookieManager?: CookieManager;
12
+ terminalSessionMode?: 'auto' | 'tmux' | 'pty';
13
+ }
14
+ export type Router = (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
15
+ export declare function createRouter({ authManager, workdir, agentCommands, automationApiKey, branchNameGenerator, planService, defaultBranches, cookieManager, terminalSessionMode, }: RouterConfig): Router;
16
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAgBjE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;CAC/C;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAErF,wBAAgB,YAAY,CAAC,EAC3B,WAAW,EACX,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,eAAe,EACf,aAAa,EACb,mBAA4B,GAC7B,EAAE,YAAY,GAAG,MAAM,CAyPvB"}
@@ -0,0 +1,256 @@
1
+ import { createAuthHandlers } from '../api/auth.js';
2
+ import { createAutomationHandlers } from '../api/automation.js';
3
+ import { createRepoHandlers } from '../api/repos.js';
4
+ import { createRepoDashboardHandlers } from '../api/repo-dashboard.js';
5
+ import { createRepoIssueHandlers } from '../api/repo-issue.js';
6
+ import { createSessionHandlers } from '../api/sessions.js';
7
+ import { createTerminalHandlers } from '../api/terminal.js';
8
+ import { createWorktreeHandlers } from '../api/worktrees.js';
9
+ import { createGitStatusHandlers } from '../api/git-status.js';
10
+ import { sendJson, readJsonBody } from '../utils/http.js';
11
+ import { createConfigHandlers } from '../api/config.js';
12
+ import { createPlanHandlers } from '../api/create-plan.js';
13
+ import { createPlanArtifactHandlers } from '../api/plans.js';
14
+ import { createEventStreamHandler } from './events.js';
15
+ import { createTaskHandlers } from '../api/tasks.js';
16
+ export function createRouter({ authManager, workdir, agentCommands, automationApiKey, branchNameGenerator, planService, defaultBranches, cookieManager, terminalSessionMode = 'auto', }) {
17
+ if (!authManager) {
18
+ throw new Error('authManager is required');
19
+ }
20
+ if (!agentCommands) {
21
+ throw new Error('agentCommands is required');
22
+ }
23
+ const authHandlers = createAuthHandlers(authManager, { cookieManager });
24
+ const automationHandlers = createAutomationHandlers({
25
+ workdir,
26
+ agentCommands,
27
+ apiKey: automationApiKey,
28
+ branchNameGenerator,
29
+ planService,
30
+ defaultBranches,
31
+ });
32
+ const repoHandlers = createRepoHandlers(workdir);
33
+ const repoDashboardHandlers = createRepoDashboardHandlers(workdir);
34
+ const repoIssueHandlers = createRepoIssueHandlers(workdir);
35
+ const sessionHandlers = createSessionHandlers(workdir);
36
+ const worktreeHandlers = createWorktreeHandlers(workdir, branchNameGenerator, defaultBranches);
37
+ const terminalHandlers = createTerminalHandlers(workdir, { mode: terminalSessionMode });
38
+ const configHandlers = createConfigHandlers(agentCommands);
39
+ const planHandlers = createPlanHandlers({ planService: planService });
40
+ const gitStatusHandlers = createGitStatusHandlers(workdir);
41
+ const planArtifactHandlers = createPlanArtifactHandlers(workdir);
42
+ const eventStreamHandler = createEventStreamHandler({ authManager, workdir });
43
+ const taskHandlers = createTaskHandlers();
44
+ const routes = new Map([
45
+ [
46
+ '/api/auth/login',
47
+ {
48
+ requiresAuth: false,
49
+ handlers: { POST: authHandlers.login },
50
+ },
51
+ ],
52
+ [
53
+ '/api/auth/logout',
54
+ {
55
+ requiresAuth: false,
56
+ handlers: { POST: authHandlers.logout },
57
+ },
58
+ ],
59
+ [
60
+ '/api/auth/status',
61
+ {
62
+ requiresAuth: false,
63
+ handlers: { GET: authHandlers.status, HEAD: authHandlers.status },
64
+ },
65
+ ],
66
+ [
67
+ '/api/repos',
68
+ {
69
+ requiresAuth: true,
70
+ handlers: {
71
+ GET: repoHandlers.list,
72
+ HEAD: repoHandlers.list,
73
+ POST: repoHandlers.create,
74
+ DELETE: repoHandlers.delete,
75
+ },
76
+ },
77
+ ],
78
+ [
79
+ '/api/repos/init-command',
80
+ {
81
+ requiresAuth: true,
82
+ handlers: { POST: repoHandlers.updateInitCommand },
83
+ },
84
+ ],
85
+ [
86
+ '/api/repos/dashboard',
87
+ {
88
+ requiresAuth: true,
89
+ handlers: { GET: repoDashboardHandlers.read, HEAD: repoDashboardHandlers.read },
90
+ },
91
+ ],
92
+ [
93
+ '/api/repos/issue',
94
+ {
95
+ requiresAuth: true,
96
+ handlers: { GET: repoIssueHandlers.read, HEAD: repoIssueHandlers.read },
97
+ },
98
+ ],
99
+ [
100
+ '/api/sessions',
101
+ {
102
+ requiresAuth: true,
103
+ handlers: { GET: sessionHandlers.list, HEAD: sessionHandlers.list },
104
+ },
105
+ ],
106
+ [
107
+ '/api/worktrees',
108
+ {
109
+ requiresAuth: true,
110
+ handlers: {
111
+ POST: worktreeHandlers.create,
112
+ DELETE: worktreeHandlers.delete,
113
+ },
114
+ },
115
+ ],
116
+ [
117
+ '/api/git/status',
118
+ {
119
+ requiresAuth: true,
120
+ handlers: { GET: gitStatusHandlers.read, HEAD: gitStatusHandlers.read },
121
+ },
122
+ ],
123
+ [
124
+ '/api/git/diff',
125
+ {
126
+ requiresAuth: true,
127
+ handlers: { POST: gitStatusHandlers.diff },
128
+ },
129
+ ],
130
+ [
131
+ '/api/terminal/open',
132
+ {
133
+ requiresAuth: true,
134
+ handlers: { POST: terminalHandlers.open },
135
+ },
136
+ ],
137
+ [
138
+ '/api/terminal/send',
139
+ {
140
+ requiresAuth: true,
141
+ handlers: { POST: terminalHandlers.send },
142
+ },
143
+ ],
144
+ [
145
+ '/api/commands',
146
+ {
147
+ requiresAuth: true,
148
+ handlers: { GET: configHandlers.commands, HEAD: configHandlers.commands },
149
+ },
150
+ ],
151
+ [
152
+ '/api/automation/launch',
153
+ {
154
+ requiresAuth: false,
155
+ handlers: { POST: automationHandlers.launch },
156
+ },
157
+ ],
158
+ [
159
+ '/api/create-plan',
160
+ {
161
+ requiresAuth: true,
162
+ handlers: { POST: planHandlers.create },
163
+ },
164
+ ],
165
+ [
166
+ '/api/plans',
167
+ {
168
+ requiresAuth: true,
169
+ handlers: { GET: planArtifactHandlers.list },
170
+ },
171
+ ],
172
+ [
173
+ '/api/plans/content',
174
+ {
175
+ requiresAuth: true,
176
+ handlers: { GET: planArtifactHandlers.read },
177
+ },
178
+ ],
179
+ [
180
+ '/api/events',
181
+ {
182
+ requiresAuth: true,
183
+ handlers: { GET: eventStreamHandler },
184
+ },
185
+ ],
186
+ [
187
+ '/api/tasks',
188
+ {
189
+ requiresAuth: true,
190
+ handlers: { GET: taskHandlers.list, HEAD: taskHandlers.list },
191
+ },
192
+ ],
193
+ ]);
194
+ function handleMethodNotAllowed(res, allowedMethods = []) {
195
+ const headerValue = allowedMethods.join(', ');
196
+ if (headerValue) {
197
+ res.setHeader('Allow', headerValue);
198
+ }
199
+ res.statusCode = 405;
200
+ res.end('Method Not Allowed');
201
+ }
202
+ return async function route(req, res) {
203
+ const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
204
+ if (url.pathname.startsWith('/api/tasks/')) {
205
+ if (!authManager.isAuthenticated(req)) {
206
+ sendJson(res, 401, { error: 'Authentication required' });
207
+ return true;
208
+ }
209
+ if (req.method && !['GET', 'HEAD'].includes(req.method.toUpperCase())) {
210
+ handleMethodNotAllowed(res, ['GET', 'HEAD']);
211
+ return true;
212
+ }
213
+ const taskId = url.pathname.slice('/api/tasks/'.length);
214
+ if (!taskId) {
215
+ sendJson(res, 404, { error: 'Task not found' });
216
+ return true;
217
+ }
218
+ const context = {
219
+ req,
220
+ res,
221
+ url,
222
+ method: req.method?.toUpperCase() || 'GET',
223
+ params: { id: taskId },
224
+ workdir,
225
+ readJsonBody: () => readJsonBody(req),
226
+ };
227
+ await taskHandlers.read(context, taskId);
228
+ return true;
229
+ }
230
+ const route = routes.get(url.pathname);
231
+ if (!route) {
232
+ return false;
233
+ }
234
+ const method = (req.method?.toUpperCase() || 'GET');
235
+ const allowed = route.handlers[method];
236
+ if (!allowed) {
237
+ handleMethodNotAllowed(res, Object.keys(route.handlers));
238
+ return true;
239
+ }
240
+ if (route.requiresAuth && !authManager.isAuthenticated(req)) {
241
+ sendJson(res, 401, { error: 'Authentication required' });
242
+ return true;
243
+ }
244
+ const context = {
245
+ req,
246
+ res,
247
+ url,
248
+ method,
249
+ workdir,
250
+ readJsonBody: () => readJsonBody(req),
251
+ };
252
+ await allowed(context);
253
+ return true;
254
+ };
255
+ }
256
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export interface UiProvider {
3
+ type?: string;
4
+ resolvedPath: string;
5
+ serve(req: IncomingMessage, res: ServerResponse): Promise<void>;
6
+ }
7
+ export declare function createUiProvider(uiPath: string): Promise<UiProvider>;
8
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/server/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkNjE,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAsB1E"}