agent-relay 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/.gitattributes +3 -0
  2. package/.nvmrc +1 -0
  3. package/.trajectories/agent-relay-322-324.md +17 -0
  4. package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.json +49 -0
  5. package/.trajectories/completed/2026-01/traj_03zupyv1s7b9.md +31 -0
  6. package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.json +125 -0
  7. package/.trajectories/completed/2026-01/traj_0zacdjl1g4ht.md +62 -0
  8. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
  9. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
  10. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
  11. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
  12. package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
  13. package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
  14. package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
  15. package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
  16. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
  17. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
  18. package/.trajectories/completed/2026-01/traj_33iuy72sezbk.json +49 -0
  19. package/.trajectories/completed/2026-01/traj_33iuy72sezbk.md +31 -0
  20. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
  21. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
  22. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
  23. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
  24. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
  25. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
  26. package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.json +77 -0
  27. package/.trajectories/completed/2026-01/traj_5ammh5qtvklq.md +42 -0
  28. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
  29. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
  30. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
  31. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
  32. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
  33. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
  34. package/.trajectories/completed/2026-01/traj_6mieijqyvaag.json +77 -0
  35. package/.trajectories/completed/2026-01/traj_6mieijqyvaag.md +42 -0
  36. package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.json +77 -0
  37. package/.trajectories/completed/2026-01/traj_78ffm31jn3uk.md +42 -0
  38. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
  39. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
  40. package/.trajectories/completed/2026-01/traj_94gnp3k30goq.json +66 -0
  41. package/.trajectories/completed/2026-01/traj_94gnp3k30goq.md +36 -0
  42. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
  43. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
  44. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
  45. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
  46. package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.json +40 -0
  47. package/.trajectories/completed/2026-01/traj_avqeghu6pz5a.md +22 -0
  48. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
  49. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
  50. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
  51. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
  52. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
  53. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
  54. package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.json +121 -0
  55. package/.trajectories/completed/2026-01/traj_dcsp9s8y01ra.md +29 -0
  56. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
  57. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
  58. package/.trajectories/completed/2026-01/traj_fhx9irlckht6.json +53 -0
  59. package/.trajectories/completed/2026-01/traj_fhx9irlckht6.md +32 -0
  60. package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.json +101 -0
  61. package/.trajectories/completed/2026-01/traj_fqduidx3xbtp.md +52 -0
  62. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
  63. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
  64. package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
  65. package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
  66. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
  67. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
  68. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
  69. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
  70. package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.json +49 -0
  71. package/.trajectories/completed/2026-01/traj_hf81ey93uz6t.md +31 -0
  72. package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.json +65 -0
  73. package/.trajectories/completed/2026-01/traj_hfmki2jr9d4r.md +37 -0
  74. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
  75. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
  76. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
  77. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
  78. package/.trajectories/completed/2026-01/traj_lq450ly148uw.json +49 -0
  79. package/.trajectories/completed/2026-01/traj_lq450ly148uw.md +31 -0
  80. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
  81. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
  82. package/.trajectories/completed/2026-01/traj_multi_server_arch.md +101 -0
  83. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
  84. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
  85. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
  86. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
  87. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
  88. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
  89. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
  90. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
  91. package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.json +27 -0
  92. package/.trajectories/completed/2026-01/traj_psd9ob0j2ru3.md +14 -0
  93. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
  94. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
  95. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
  96. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
  97. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
  98. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
  99. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
  100. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
  101. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
  102. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
  103. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
  104. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
  105. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
  106. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
  107. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
  108. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
  109. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
  110. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
  111. package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.json +53 -0
  112. package/.trajectories/completed/2026-01/traj_ub8csuv3lcv4.md +32 -0
  113. package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.json +186 -0
  114. package/.trajectories/completed/2026-01/traj_uc29tlso8i9s.md +86 -0
  115. package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.json +77 -0
  116. package/.trajectories/completed/2026-01/traj_ui9b4tqxoa7j.md +42 -0
  117. package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
  118. package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
  119. package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.json +89 -0
  120. package/.trajectories/completed/2026-01/traj_v9dkdoxylyid.md +47 -0
  121. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
  122. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
  123. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
  124. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
  125. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
  126. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
  127. package/.trajectories/completed/2026-01/traj_xy9vifpqet80.json +65 -0
  128. package/.trajectories/completed/2026-01/traj_xy9vifpqet80.md +37 -0
  129. package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.json +49 -0
  130. package/.trajectories/completed/2026-01/traj_y7aiwijyfmmv.md +31 -0
  131. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
  132. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
  133. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
  134. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
  135. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
  136. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
  137. package/.trajectories/consolidate-settings-panel.md +24 -0
  138. package/.trajectories/gh-cli-user-token.md +26 -0
  139. package/.trajectories/index.json +468 -0
  140. package/ARCHITECTURE.md +1245 -0
  141. package/TESTING.md +278 -0
  142. package/deploy/init-db.sql +5 -0
  143. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  144. package/deploy/scripts/setup-railway.sh +75 -0
  145. package/deploy/workspace/codex.config.toml +15 -0
  146. package/deploy/workspace/entrypoint-browser.sh +118 -0
  147. package/deploy/workspace/entrypoint.sh +508 -0
  148. package/deploy/workspace/git-credential-relay +126 -0
  149. package/dist/bridge/spawner.d.ts +7 -0
  150. package/dist/bridge/spawner.js +40 -9
  151. package/dist/bridge/types.d.ts +2 -0
  152. package/dist/cli/index.js +260 -1
  153. package/dist/cloud/api/admin.d.ts +8 -0
  154. package/dist/cloud/api/admin.js +212 -0
  155. package/dist/cloud/api/auth.js +8 -0
  156. package/dist/cloud/api/billing.d.ts +0 -10
  157. package/dist/cloud/api/billing.js +278 -67
  158. package/dist/cloud/api/codex-auth-helper.d.ts +21 -0
  159. package/dist/cloud/api/codex-auth-helper.js +307 -0
  160. package/dist/cloud/api/coordinators.js +402 -0
  161. package/dist/cloud/api/daemons.js +15 -11
  162. package/dist/cloud/api/git.js +127 -19
  163. package/dist/cloud/api/github-app.js +42 -8
  164. package/dist/cloud/api/nango-auth.js +297 -16
  165. package/dist/cloud/api/onboarding.js +112 -35
  166. package/dist/cloud/api/providers.js +12 -16
  167. package/dist/cloud/api/repos.d.ts +1 -0
  168. package/dist/cloud/api/repos.js +311 -49
  169. package/dist/cloud/api/test-helpers.js +40 -0
  170. package/dist/cloud/api/usage.js +13 -0
  171. package/dist/cloud/api/webhooks.d.ts +1 -0
  172. package/dist/cloud/api/webhooks.js +149 -0
  173. package/dist/cloud/api/workspaces.d.ts +18 -0
  174. package/dist/cloud/api/workspaces.js +1042 -21
  175. package/dist/cloud/billing/plans.js +19 -19
  176. package/dist/cloud/config.d.ts +8 -0
  177. package/dist/cloud/config.js +15 -0
  178. package/dist/cloud/db/drizzle.d.ts +5 -2
  179. package/dist/cloud/db/drizzle.js +27 -20
  180. package/dist/cloud/db/schema.d.ts +19 -51
  181. package/dist/cloud/db/schema.js +5 -4
  182. package/dist/cloud/index.d.ts +0 -1
  183. package/dist/cloud/index.js +0 -1
  184. package/dist/cloud/provisioner/index.d.ts +125 -1
  185. package/dist/cloud/provisioner/index.js +939 -53
  186. package/dist/cloud/server.js +161 -16
  187. package/dist/cloud/services/compute-enforcement.d.ts +57 -0
  188. package/dist/cloud/services/compute-enforcement.js +175 -0
  189. package/dist/cloud/services/index.d.ts +2 -0
  190. package/dist/cloud/services/index.js +4 -0
  191. package/dist/cloud/services/intro-expiration.d.ts +55 -0
  192. package/dist/cloud/services/intro-expiration.js +211 -0
  193. package/dist/cloud/services/nango.d.ts +74 -0
  194. package/dist/cloud/services/nango.js +218 -5
  195. package/dist/cloud/services/planLimits.d.ts +22 -0
  196. package/dist/cloud/services/planLimits.js +58 -5
  197. package/dist/cloud/services/ssh-security.d.ts +31 -0
  198. package/dist/cloud/services/ssh-security.js +63 -0
  199. package/dist/continuity/manager.d.ts +5 -0
  200. package/dist/continuity/manager.js +56 -2
  201. package/dist/daemon/api.d.ts +2 -0
  202. package/dist/daemon/api.js +214 -5
  203. package/dist/daemon/cli-auth.d.ts +13 -1
  204. package/dist/daemon/cli-auth.js +166 -47
  205. package/dist/daemon/connection.d.ts +7 -1
  206. package/dist/daemon/connection.js +15 -0
  207. package/dist/daemon/orchestrator.d.ts +2 -0
  208. package/dist/daemon/orchestrator.js +26 -0
  209. package/dist/daemon/repo-manager.d.ts +116 -0
  210. package/dist/daemon/repo-manager.js +384 -0
  211. package/dist/daemon/router.d.ts +60 -1
  212. package/dist/daemon/router.js +281 -20
  213. package/dist/daemon/user-directory.d.ts +111 -0
  214. package/dist/daemon/user-directory.js +233 -0
  215. package/dist/dashboard/out/404.html +1 -1
  216. package/dist/dashboard/out/_next/static/T1tgCqVWHFIkV7ClEtzD7/_ssgManifest.js +1 -0
  217. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +9 -0
  218. package/dist/dashboard/out/_next/static/chunks/766-b54f0853794b78c3.js +1 -0
  219. package/dist/dashboard/out/_next/static/chunks/83-b51836037078006c.js +1 -0
  220. package/dist/dashboard/out/_next/static/chunks/891-6cd50de1224f70bb.js +1 -0
  221. package/dist/dashboard/out/_next/static/chunks/899-bb19a9b3d9b39ea6.js +1 -0
  222. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-8939b0fc700f7eca.js +1 -0
  223. package/dist/dashboard/out/_next/static/chunks/app/app/page-5af1b6b439858aa6.js +1 -0
  224. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-ac39dc0cc3c26fa7.js +1 -0
  225. package/dist/dashboard/out/_next/static/chunks/app/{page-daf87e86f783f980.js → page-4a5938c18a11a654.js} +1 -1
  226. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ac3a6ac433fd6001.js +1 -0
  227. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-09f9caae98a18c09.js +1 -0
  228. package/dist/dashboard/out/_next/static/chunks/{main-97850e03d723ea8c.js → main-2ee6beb2ae96d210.js} +1 -1
  229. package/dist/dashboard/out/_next/static/css/85d2af9c7ac74d62.css +1 -0
  230. package/dist/dashboard/out/_next/static/css/fe4b28883eeff359.css +1 -0
  231. package/dist/dashboard/out/app/onboarding.html +1 -0
  232. package/dist/dashboard/out/app/onboarding.txt +7 -0
  233. package/dist/dashboard/out/app.html +1 -1
  234. package/dist/dashboard/out/app.txt +3 -3
  235. package/dist/dashboard/out/apple-icon.png +0 -0
  236. package/dist/dashboard/out/connect-repos.html +1 -1
  237. package/dist/dashboard/out/connect-repos.txt +3 -3
  238. package/dist/dashboard/out/history.html +1 -1
  239. package/dist/dashboard/out/history.txt +3 -3
  240. package/dist/dashboard/out/index.html +1 -1
  241. package/dist/dashboard/out/index.txt +3 -3
  242. package/dist/dashboard/out/login.html +2 -2
  243. package/dist/dashboard/out/login.txt +3 -3
  244. package/dist/dashboard/out/metrics.html +1 -1
  245. package/dist/dashboard/out/metrics.txt +3 -3
  246. package/dist/dashboard/out/pricing.html +3 -3
  247. package/dist/dashboard/out/pricing.txt +3 -3
  248. package/dist/dashboard/out/providers/setup/claude.html +1 -0
  249. package/dist/dashboard/out/providers/setup/claude.txt +8 -0
  250. package/dist/dashboard/out/providers/setup/codex.html +1 -0
  251. package/dist/dashboard/out/providers/setup/codex.txt +8 -0
  252. package/dist/dashboard/out/providers.html +1 -1
  253. package/dist/dashboard/out/providers.txt +3 -3
  254. package/dist/dashboard/out/signup.html +2 -2
  255. package/dist/dashboard/out/signup.txt +3 -3
  256. package/dist/dashboard-server/server.js +316 -12
  257. package/dist/dashboard-server/user-bridge.d.ts +103 -0
  258. package/dist/dashboard-server/user-bridge.js +189 -0
  259. package/dist/protocol/channels.d.ts +205 -0
  260. package/dist/protocol/channels.js +154 -0
  261. package/dist/protocol/types.d.ts +13 -1
  262. package/dist/resiliency/provider-context.js +2 -0
  263. package/dist/shared/cli-auth-config.d.ts +19 -0
  264. package/dist/shared/cli-auth-config.js +58 -2
  265. package/dist/utils/agent-config.js +1 -1
  266. package/dist/wrapper/auth-detection.d.ts +49 -0
  267. package/dist/wrapper/auth-detection.js +192 -0
  268. package/dist/wrapper/base-wrapper.d.ts +153 -0
  269. package/dist/wrapper/base-wrapper.js +393 -0
  270. package/dist/wrapper/client.d.ts +7 -1
  271. package/dist/wrapper/client.js +3 -0
  272. package/dist/wrapper/index.d.ts +1 -0
  273. package/dist/wrapper/index.js +4 -3
  274. package/dist/wrapper/pty-wrapper.d.ts +62 -84
  275. package/dist/wrapper/pty-wrapper.js +154 -180
  276. package/dist/wrapper/tmux-wrapper.d.ts +41 -66
  277. package/dist/wrapper/tmux-wrapper.js +90 -134
  278. package/package.json +5 -12
  279. package/scripts/postinstall.js +11 -155
  280. package/scripts/test-interactive-terminal.sh +248 -0
  281. package/test-push.txt +1 -0
  282. package/bin/tmux +0 -0
  283. package/dist/bridge/config.d.ts.map +0 -1
  284. package/dist/bridge/config.js.map +0 -1
  285. package/dist/bridge/index.d.ts.map +0 -1
  286. package/dist/bridge/index.js.map +0 -1
  287. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  288. package/dist/bridge/multi-project-client.js.map +0 -1
  289. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  290. package/dist/bridge/shadow-cli.js.map +0 -1
  291. package/dist/bridge/shadow-config.d.ts.map +0 -1
  292. package/dist/bridge/shadow-config.js.map +0 -1
  293. package/dist/bridge/spawner.d.ts.map +0 -1
  294. package/dist/bridge/spawner.js.map +0 -1
  295. package/dist/bridge/teams-config.d.ts.map +0 -1
  296. package/dist/bridge/teams-config.js.map +0 -1
  297. package/dist/bridge/types.d.ts.map +0 -1
  298. package/dist/bridge/types.js.map +0 -1
  299. package/dist/bridge/utils.d.ts.map +0 -1
  300. package/dist/bridge/utils.js.map +0 -1
  301. package/dist/cli/index.d.ts.map +0 -1
  302. package/dist/cli/index.js.map +0 -1
  303. package/dist/cloud/api/auth.d.ts.map +0 -1
  304. package/dist/cloud/api/auth.js.map +0 -1
  305. package/dist/cloud/api/billing.d.ts.map +0 -1
  306. package/dist/cloud/api/billing.js.map +0 -1
  307. package/dist/cloud/api/cli-pty-runner.d.ts.map +0 -1
  308. package/dist/cloud/api/cli-pty-runner.js.map +0 -1
  309. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  310. package/dist/cloud/api/coordinators.js.map +0 -1
  311. package/dist/cloud/api/daemons.d.ts.map +0 -1
  312. package/dist/cloud/api/daemons.js.map +0 -1
  313. package/dist/cloud/api/generic-webhooks.d.ts.map +0 -1
  314. package/dist/cloud/api/generic-webhooks.js.map +0 -1
  315. package/dist/cloud/api/git.d.ts.map +0 -1
  316. package/dist/cloud/api/git.js.map +0 -1
  317. package/dist/cloud/api/github-app.d.ts.map +0 -1
  318. package/dist/cloud/api/github-app.js.map +0 -1
  319. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  320. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  321. package/dist/cloud/api/monitoring.d.ts.map +0 -1
  322. package/dist/cloud/api/monitoring.js.map +0 -1
  323. package/dist/cloud/api/nango-auth.d.ts.map +0 -1
  324. package/dist/cloud/api/nango-auth.js.map +0 -1
  325. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  326. package/dist/cloud/api/onboarding.js.map +0 -1
  327. package/dist/cloud/api/policy.d.ts.map +0 -1
  328. package/dist/cloud/api/policy.js.map +0 -1
  329. package/dist/cloud/api/providers.d.ts.map +0 -1
  330. package/dist/cloud/api/providers.js.map +0 -1
  331. package/dist/cloud/api/repos.d.ts.map +0 -1
  332. package/dist/cloud/api/repos.js.map +0 -1
  333. package/dist/cloud/api/teams.d.ts.map +0 -1
  334. package/dist/cloud/api/teams.js.map +0 -1
  335. package/dist/cloud/api/test-helpers.d.ts.map +0 -1
  336. package/dist/cloud/api/test-helpers.js.map +0 -1
  337. package/dist/cloud/api/usage.d.ts.map +0 -1
  338. package/dist/cloud/api/usage.js.map +0 -1
  339. package/dist/cloud/api/webhooks.d.ts.map +0 -1
  340. package/dist/cloud/api/webhooks.js.map +0 -1
  341. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  342. package/dist/cloud/api/workspaces.js.map +0 -1
  343. package/dist/cloud/billing/index.d.ts.map +0 -1
  344. package/dist/cloud/billing/index.js.map +0 -1
  345. package/dist/cloud/billing/plans.d.ts.map +0 -1
  346. package/dist/cloud/billing/plans.js.map +0 -1
  347. package/dist/cloud/billing/service.d.ts.map +0 -1
  348. package/dist/cloud/billing/service.js.map +0 -1
  349. package/dist/cloud/billing/types.d.ts.map +0 -1
  350. package/dist/cloud/billing/types.js.map +0 -1
  351. package/dist/cloud/config.d.ts.map +0 -1
  352. package/dist/cloud/config.js.map +0 -1
  353. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  354. package/dist/cloud/db/drizzle.js.map +0 -1
  355. package/dist/cloud/db/index.d.ts.map +0 -1
  356. package/dist/cloud/db/index.js.map +0 -1
  357. package/dist/cloud/db/schema.d.ts.map +0 -1
  358. package/dist/cloud/db/schema.js.map +0 -1
  359. package/dist/cloud/index.d.ts.map +0 -1
  360. package/dist/cloud/index.js.map +0 -1
  361. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  362. package/dist/cloud/provisioner/index.js.map +0 -1
  363. package/dist/cloud/server.d.ts.map +0 -1
  364. package/dist/cloud/server.js.map +0 -1
  365. package/dist/cloud/services/auto-scaler.d.ts.map +0 -1
  366. package/dist/cloud/services/auto-scaler.js.map +0 -1
  367. package/dist/cloud/services/capacity-manager.d.ts.map +0 -1
  368. package/dist/cloud/services/capacity-manager.js.map +0 -1
  369. package/dist/cloud/services/ci-agent-spawner.d.ts.map +0 -1
  370. package/dist/cloud/services/ci-agent-spawner.js.map +0 -1
  371. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  372. package/dist/cloud/services/coordinator.js.map +0 -1
  373. package/dist/cloud/services/index.d.ts.map +0 -1
  374. package/dist/cloud/services/index.js.map +0 -1
  375. package/dist/cloud/services/mention-handler.d.ts.map +0 -1
  376. package/dist/cloud/services/mention-handler.js.map +0 -1
  377. package/dist/cloud/services/nango.d.ts.map +0 -1
  378. package/dist/cloud/services/nango.js.map +0 -1
  379. package/dist/cloud/services/persistence.d.ts.map +0 -1
  380. package/dist/cloud/services/persistence.js.map +0 -1
  381. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  382. package/dist/cloud/services/planLimits.js.map +0 -1
  383. package/dist/cloud/services/scaling-orchestrator.d.ts.map +0 -1
  384. package/dist/cloud/services/scaling-orchestrator.js.map +0 -1
  385. package/dist/cloud/services/scaling-policy.d.ts.map +0 -1
  386. package/dist/cloud/services/scaling-policy.js.map +0 -1
  387. package/dist/cloud/vault/index.d.ts +0 -76
  388. package/dist/cloud/vault/index.d.ts.map +0 -1
  389. package/dist/cloud/vault/index.js +0 -219
  390. package/dist/cloud/vault/index.js.map +0 -1
  391. package/dist/cloud/webhooks/index.d.ts.map +0 -1
  392. package/dist/cloud/webhooks/index.js.map +0 -1
  393. package/dist/cloud/webhooks/parsers/github.d.ts.map +0 -1
  394. package/dist/cloud/webhooks/parsers/github.js.map +0 -1
  395. package/dist/cloud/webhooks/parsers/index.d.ts.map +0 -1
  396. package/dist/cloud/webhooks/parsers/index.js.map +0 -1
  397. package/dist/cloud/webhooks/parsers/linear.d.ts.map +0 -1
  398. package/dist/cloud/webhooks/parsers/linear.js.map +0 -1
  399. package/dist/cloud/webhooks/parsers/slack.d.ts.map +0 -1
  400. package/dist/cloud/webhooks/parsers/slack.js.map +0 -1
  401. package/dist/cloud/webhooks/responders/github.d.ts.map +0 -1
  402. package/dist/cloud/webhooks/responders/github.js.map +0 -1
  403. package/dist/cloud/webhooks/responders/index.d.ts.map +0 -1
  404. package/dist/cloud/webhooks/responders/index.js.map +0 -1
  405. package/dist/cloud/webhooks/responders/linear.d.ts.map +0 -1
  406. package/dist/cloud/webhooks/responders/linear.js.map +0 -1
  407. package/dist/cloud/webhooks/responders/slack.d.ts.map +0 -1
  408. package/dist/cloud/webhooks/responders/slack.js.map +0 -1
  409. package/dist/cloud/webhooks/router.d.ts.map +0 -1
  410. package/dist/cloud/webhooks/router.js.map +0 -1
  411. package/dist/cloud/webhooks/rules-engine.d.ts.map +0 -1
  412. package/dist/cloud/webhooks/rules-engine.js.map +0 -1
  413. package/dist/cloud/webhooks/types.d.ts.map +0 -1
  414. package/dist/cloud/webhooks/types.js.map +0 -1
  415. package/dist/continuity/formatter.d.ts.map +0 -1
  416. package/dist/continuity/formatter.js.map +0 -1
  417. package/dist/continuity/handoff-store.d.ts.map +0 -1
  418. package/dist/continuity/handoff-store.js.map +0 -1
  419. package/dist/continuity/index.d.ts.map +0 -1
  420. package/dist/continuity/index.js.map +0 -1
  421. package/dist/continuity/ledger-store.d.ts.map +0 -1
  422. package/dist/continuity/ledger-store.js.map +0 -1
  423. package/dist/continuity/manager.d.ts.map +0 -1
  424. package/dist/continuity/manager.js.map +0 -1
  425. package/dist/continuity/parser.d.ts.map +0 -1
  426. package/dist/continuity/parser.js.map +0 -1
  427. package/dist/continuity/types.d.ts.map +0 -1
  428. package/dist/continuity/types.js.map +0 -1
  429. package/dist/daemon/agent-manager.d.ts.map +0 -1
  430. package/dist/daemon/agent-manager.js.map +0 -1
  431. package/dist/daemon/agent-registry.d.ts.map +0 -1
  432. package/dist/daemon/agent-registry.js.map +0 -1
  433. package/dist/daemon/api.d.ts.map +0 -1
  434. package/dist/daemon/api.js.map +0 -1
  435. package/dist/daemon/auth.d.ts.map +0 -1
  436. package/dist/daemon/auth.js.map +0 -1
  437. package/dist/daemon/cli-auth.d.ts.map +0 -1
  438. package/dist/daemon/cli-auth.js.map +0 -1
  439. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  440. package/dist/daemon/cloud-sync.js.map +0 -1
  441. package/dist/daemon/connection.d.ts.map +0 -1
  442. package/dist/daemon/connection.js.map +0 -1
  443. package/dist/daemon/index.d.ts.map +0 -1
  444. package/dist/daemon/index.js.map +0 -1
  445. package/dist/daemon/orchestrator.d.ts.map +0 -1
  446. package/dist/daemon/orchestrator.js.map +0 -1
  447. package/dist/daemon/registry.d.ts.map +0 -1
  448. package/dist/daemon/registry.js.map +0 -1
  449. package/dist/daemon/router.d.ts.map +0 -1
  450. package/dist/daemon/router.js.map +0 -1
  451. package/dist/daemon/server.d.ts.map +0 -1
  452. package/dist/daemon/server.js.map +0 -1
  453. package/dist/daemon/services/browser-testing.d.ts.map +0 -1
  454. package/dist/daemon/services/browser-testing.js.map +0 -1
  455. package/dist/daemon/services/container-spawner.d.ts.map +0 -1
  456. package/dist/daemon/services/container-spawner.js.map +0 -1
  457. package/dist/daemon/types.d.ts.map +0 -1
  458. package/dist/daemon/types.js.map +0 -1
  459. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  460. package/dist/daemon/workspace-manager.js.map +0 -1
  461. package/dist/dashboard/out/_next/static/H5aWG0udPB4iOUIl_gytz/_ssgManifest.js +0 -1
  462. package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +0 -1
  463. package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +0 -9
  464. package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +0 -1
  465. package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +0 -1
  466. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +0 -1
  467. package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +0 -1
  468. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +0 -1
  469. package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +0 -1
  470. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  471. package/dist/dashboard-server/metrics.js.map +0 -1
  472. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  473. package/dist/dashboard-server/needs-attention.js.map +0 -1
  474. package/dist/dashboard-server/server.d.ts.map +0 -1
  475. package/dist/dashboard-server/server.js.map +0 -1
  476. package/dist/dashboard-server/start.d.ts.map +0 -1
  477. package/dist/dashboard-server/start.js.map +0 -1
  478. package/dist/hooks/emitter.d.ts.map +0 -1
  479. package/dist/hooks/emitter.js.map +0 -1
  480. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  481. package/dist/hooks/inbox-check/hook.js.map +0 -1
  482. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  483. package/dist/hooks/inbox-check/index.js.map +0 -1
  484. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  485. package/dist/hooks/inbox-check/types.js.map +0 -1
  486. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  487. package/dist/hooks/inbox-check/utils.js.map +0 -1
  488. package/dist/hooks/index.d.ts.map +0 -1
  489. package/dist/hooks/index.js.map +0 -1
  490. package/dist/hooks/registry.d.ts.map +0 -1
  491. package/dist/hooks/registry.js.map +0 -1
  492. package/dist/hooks/trajectory-hooks.d.ts.map +0 -1
  493. package/dist/hooks/trajectory-hooks.js.map +0 -1
  494. package/dist/hooks/types.d.ts.map +0 -1
  495. package/dist/hooks/types.js.map +0 -1
  496. package/dist/index.d.ts.map +0 -1
  497. package/dist/index.js.map +0 -1
  498. package/dist/memory/adapters/index.d.ts.map +0 -1
  499. package/dist/memory/adapters/index.js.map +0 -1
  500. package/dist/memory/adapters/inmemory.d.ts.map +0 -1
  501. package/dist/memory/adapters/inmemory.js.map +0 -1
  502. package/dist/memory/adapters/supermemory.d.ts.map +0 -1
  503. package/dist/memory/adapters/supermemory.js.map +0 -1
  504. package/dist/memory/factory.d.ts.map +0 -1
  505. package/dist/memory/factory.js.map +0 -1
  506. package/dist/memory/index.d.ts.map +0 -1
  507. package/dist/memory/index.js.map +0 -1
  508. package/dist/memory/memory-hooks.d.ts.map +0 -1
  509. package/dist/memory/memory-hooks.js.map +0 -1
  510. package/dist/memory/service.d.ts.map +0 -1
  511. package/dist/memory/service.js.map +0 -1
  512. package/dist/memory/types.d.ts.map +0 -1
  513. package/dist/memory/types.js.map +0 -1
  514. package/dist/policy/agent-policy.d.ts.map +0 -1
  515. package/dist/policy/agent-policy.js.map +0 -1
  516. package/dist/policy/cloud-policy-fetcher.d.ts.map +0 -1
  517. package/dist/policy/cloud-policy-fetcher.js.map +0 -1
  518. package/dist/protocol/framing.d.ts.map +0 -1
  519. package/dist/protocol/framing.js.map +0 -1
  520. package/dist/protocol/index.d.ts.map +0 -1
  521. package/dist/protocol/index.js.map +0 -1
  522. package/dist/protocol/types.d.ts.map +0 -1
  523. package/dist/protocol/types.js.map +0 -1
  524. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  525. package/dist/resiliency/context-persistence.js.map +0 -1
  526. package/dist/resiliency/crash-insights.d.ts.map +0 -1
  527. package/dist/resiliency/crash-insights.js.map +0 -1
  528. package/dist/resiliency/gossip-health.d.ts.map +0 -1
  529. package/dist/resiliency/gossip-health.js.map +0 -1
  530. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  531. package/dist/resiliency/health-monitor.js.map +0 -1
  532. package/dist/resiliency/index.d.ts.map +0 -1
  533. package/dist/resiliency/index.js.map +0 -1
  534. package/dist/resiliency/leader-watchdog.d.ts.map +0 -1
  535. package/dist/resiliency/leader-watchdog.js.map +0 -1
  536. package/dist/resiliency/logger.d.ts.map +0 -1
  537. package/dist/resiliency/logger.js.map +0 -1
  538. package/dist/resiliency/memory-monitor.d.ts.map +0 -1
  539. package/dist/resiliency/memory-monitor.js.map +0 -1
  540. package/dist/resiliency/metrics.d.ts.map +0 -1
  541. package/dist/resiliency/metrics.js.map +0 -1
  542. package/dist/resiliency/provider-context.d.ts.map +0 -1
  543. package/dist/resiliency/provider-context.js.map +0 -1
  544. package/dist/resiliency/stateless-lead.d.ts.map +0 -1
  545. package/dist/resiliency/stateless-lead.js.map +0 -1
  546. package/dist/resiliency/supervisor.d.ts.map +0 -1
  547. package/dist/resiliency/supervisor.js.map +0 -1
  548. package/dist/shared/cli-auth-config.d.ts.map +0 -1
  549. package/dist/shared/cli-auth-config.js.map +0 -1
  550. package/dist/state/agent-state.d.ts.map +0 -1
  551. package/dist/state/agent-state.js.map +0 -1
  552. package/dist/storage/adapter.d.ts.map +0 -1
  553. package/dist/storage/adapter.js.map +0 -1
  554. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  555. package/dist/storage/sqlite-adapter.js.map +0 -1
  556. package/dist/trajectory/config.d.ts.map +0 -1
  557. package/dist/trajectory/config.js.map +0 -1
  558. package/dist/trajectory/index.d.ts.map +0 -1
  559. package/dist/trajectory/index.js.map +0 -1
  560. package/dist/trajectory/integration.d.ts.map +0 -1
  561. package/dist/trajectory/integration.js.map +0 -1
  562. package/dist/utils/agent-config.d.ts.map +0 -1
  563. package/dist/utils/agent-config.js.map +0 -1
  564. package/dist/utils/command-resolver.d.ts.map +0 -1
  565. package/dist/utils/command-resolver.js.map +0 -1
  566. package/dist/utils/index.d.ts.map +0 -1
  567. package/dist/utils/index.js.map +0 -1
  568. package/dist/utils/logger.d.ts.map +0 -1
  569. package/dist/utils/logger.js.map +0 -1
  570. package/dist/utils/name-generator.d.ts.map +0 -1
  571. package/dist/utils/name-generator.js.map +0 -1
  572. package/dist/utils/project-namespace.d.ts.map +0 -1
  573. package/dist/utils/project-namespace.js.map +0 -1
  574. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  575. package/dist/utils/tmux-resolver.js.map +0 -1
  576. package/dist/utils/update-checker.d.ts.map +0 -1
  577. package/dist/utils/update-checker.js.map +0 -1
  578. package/dist/wrapper/client.d.ts.map +0 -1
  579. package/dist/wrapper/client.js.map +0 -1
  580. package/dist/wrapper/inbox.d.ts.map +0 -1
  581. package/dist/wrapper/inbox.js.map +0 -1
  582. package/dist/wrapper/index.d.ts.map +0 -1
  583. package/dist/wrapper/index.js.map +0 -1
  584. package/dist/wrapper/parser.d.ts.map +0 -1
  585. package/dist/wrapper/parser.js.map +0 -1
  586. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  587. package/dist/wrapper/pty-wrapper.js.map +0 -1
  588. package/dist/wrapper/shared.d.ts.map +0 -1
  589. package/dist/wrapper/shared.js.map +0 -1
  590. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  591. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  592. package/docs/AGENTS.md +0 -513
  593. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  594. package/docs/CLOUD-ARCHITECTURE.md +0 -804
  595. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  596. package/docs/CONTRIBUTING.md +0 -151
  597. package/docs/HOOKS_API.md +0 -394
  598. package/docs/INTEGRATION-GUIDE.md +0 -926
  599. package/docs/PROTOCOL.md +0 -325
  600. package/docs/WRAPPER_EVENTS.md +0 -358
  601. package/docs/agent-policy-snippet.md +0 -40
  602. package/docs/agent-relay-protocol.md +0 -238
  603. package/docs/agent-relay-snippet.md +0 -174
  604. package/docs/archive/CHANGELOG.md +0 -11
  605. package/docs/archive/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  606. package/docs/archive/DESIGN_BRIDGE_STAFFING.md +0 -878
  607. package/docs/archive/DESIGN_V2.md +0 -1079
  608. package/docs/archive/EXECUTIVE_SUMMARY.md +0 -358
  609. package/docs/archive/MONETIZATION.md +0 -1679
  610. package/docs/archive/PROPOSAL-trajectories.md +0 -1582
  611. package/docs/archive/ROADMAP.md +0 -329
  612. package/docs/archive/SCALING_ANALYSIS.md +0 -280
  613. package/docs/archive/TESTING_PRESENCE_FEATURES.md +0 -327
  614. package/docs/archive/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  615. package/docs/archive/TMUX_IMPROVEMENTS.md +0 -968
  616. package/docs/archive/dashboard-v2-plan.md +0 -179
  617. package/docs/archive/removable-code-analysis.md +0 -24
  618. package/docs/competitive/GASTOWN.md +0 -451
  619. package/docs/competitive/MCP_AGENT_MAIL.md +0 -389
  620. package/docs/competitive/OVERVIEW.md +0 -898
  621. package/docs/competitive/README.md +0 -34
  622. package/docs/competitive/TMUX_ORCHESTRATOR.md +0 -605
  623. package/docs/dashboard.png +0 -0
  624. package/docs/design/ci-failure-webhooks.md +0 -812
  625. package/docs/design/comprehensive-integrations.md +0 -238
  626. package/docs/design/e2b-sandbox-integration.md +0 -504
  627. package/docs/design/github-app-permissions.md +0 -264
  628. package/docs/guides/CLOUD.md +0 -236
  629. package/docs/guides/LOCAL.md +0 -535
  630. package/docs/guides/SELF-HOSTED.md +0 -494
  631. package/docs/local-testing.md +0 -428
  632. package/docs/proposals/continuous-claude-integration.md +0 -622
  633. package/docs/proposals/custom-commands.md +0 -368
  634. package/docs/proposals/shadow-as-subagent.md +0 -765
  635. package/docs/proposals/slack-bot-integration.md +0 -1457
  636. package/docs/tasks/global-skills-system.tasks.md +0 -230
  637. package/docs/tasks/webhook-integrations.tasks.md +0 -184
  638. package/docs/tasks/workspace-capabilities.tasks.md +0 -121
  639. package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +0 -366
  640. package/scripts/cloud-setup.sh +0 -96
  641. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  642. package/scripts/dev/dev-team-setup.sh +0 -431
  643. package/scripts/e2e-test.sh +0 -119
  644. package/scripts/games/game-protocol.md +0 -79
  645. package/scripts/games/hearts-setup.sh +0 -264
  646. package/scripts/manual-qa.sh +0 -293
  647. package/scripts/run-cloud-qa.sh +0 -220
  648. package/scripts/test-cli-auth/Dockerfile +0 -44
  649. package/scripts/test-cli-auth/Dockerfile.real +0 -79
  650. package/scripts/test-cli-auth/README.md +0 -286
  651. package/scripts/test-cli-auth/ci-test-real-clis.ts +0 -251
  652. package/scripts/test-cli-auth/ci-test-runner.ts +0 -263
  653. package/scripts/test-cli-auth/mock-cli.sh +0 -147
  654. package/scripts/test-cli-auth/package.json +0 -14
  655. package/scripts/test-cli-auth/test-oauth-flow.ts +0 -220
  656. package/scripts/test-pty-input-auto.js +0 -222
  657. package/scripts/test-pty-input.js +0 -150
  658. package/scripts/tictactoe-setup.sh +0 -181
  659. /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz → T1tgCqVWHFIkV7ClEtzD7}/_buildManifest.js +0 -0
  660. /package/dist/dashboard/out/_next/static/chunks/{117-b100311aff8d5c61.js → 117-f7b8ab0809342e77.js} +0 -0
  661. /package/dist/dashboard/out/_next/static/chunks/{648-a13d3c2b1be45466.js → 648-5cc6e1921389a58a.js} +0 -0
  662. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-a4973f3e3c82fb67.js → page-53b8a69f76db17d0.js} +0 -0
  663. /package/dist/dashboard/out/_next/static/chunks/app/connect-repos/{page-dc2e3a1a22478efc.js → page-f45ecbc3e06134fc.js} +0 -0
  664. /package/dist/dashboard/out/_next/static/chunks/app/history/{page-56a8b4616a90dc43.js → page-8c8bed33beb2bf1c.js} +0 -0
  665. /package/dist/dashboard/out/_next/static/chunks/app/login/{page-3eac37ea6f5dd153.js → page-16f3b49e55b1e0ed.js} +0 -0
  666. /package/dist/dashboard/out/_next/static/chunks/app/pricing/{page-4d72d5a5d8a9b618.js → page-982a7000fee44014.js} +0 -0
  667. /package/dist/dashboard/out/_next/static/chunks/app/signup/{page-fee4ed1709070bcd.js → page-547dd0ca55ecd0ba.js} +0 -0
  668. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
@@ -20,6 +20,408 @@ const coordinatorWriteRoutes = [
20
20
  coordinatorWriteRoutes.forEach(route => {
21
21
  coordinatorsRouter.use(route, checkCoordinatorAccess);
22
22
  });
23
+ // ============================================================================
24
+ // Project Group CRUD Routes
25
+ // These must come BEFORE the /:groupId/coordinator routes
26
+ // ============================================================================
27
+ /**
28
+ * GET /api/project-groups
29
+ * List all project groups for the authenticated user
30
+ */
31
+ coordinatorsRouter.get('/', async (req, res) => {
32
+ const userId = req.session.userId;
33
+ try {
34
+ const result = await db.projectGroups.findAllWithRepositories(userId);
35
+ res.json({
36
+ groups: result.groups.map(group => ({
37
+ id: group.id,
38
+ name: group.name,
39
+ description: group.description,
40
+ color: group.color,
41
+ icon: group.icon,
42
+ coordinatorAgent: group.coordinatorAgent,
43
+ sortOrder: group.sortOrder,
44
+ repositoryCount: group.repositories.length,
45
+ repositories: group.repositories.map(repo => ({
46
+ id: repo.id,
47
+ githubFullName: repo.githubFullName,
48
+ defaultBranch: repo.defaultBranch,
49
+ isPrivate: repo.isPrivate,
50
+ })),
51
+ createdAt: group.createdAt,
52
+ updatedAt: group.updatedAt,
53
+ })),
54
+ ungroupedRepositories: result.ungroupedRepositories.map(repo => ({
55
+ id: repo.id,
56
+ githubFullName: repo.githubFullName,
57
+ defaultBranch: repo.defaultBranch,
58
+ isPrivate: repo.isPrivate,
59
+ workspaceId: repo.workspaceId,
60
+ })),
61
+ });
62
+ }
63
+ catch (error) {
64
+ console.error('Error listing project groups:', error);
65
+ res.status(500).json({ error: 'Failed to list project groups' });
66
+ }
67
+ });
68
+ /**
69
+ * POST /api/project-groups
70
+ * Create a new project group
71
+ */
72
+ coordinatorsRouter.post('/', async (req, res) => {
73
+ const userId = req.session.userId;
74
+ const { name, description, color, icon, repositoryIds } = req.body;
75
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
76
+ return res.status(400).json({ error: 'Name is required' });
77
+ }
78
+ if (name.length > 255) {
79
+ return res.status(400).json({ error: 'Name must be 255 characters or less' });
80
+ }
81
+ try {
82
+ // Check for duplicate name
83
+ const existing = await db.projectGroups.findByName(userId, name.trim());
84
+ if (existing) {
85
+ return res.status(409).json({ error: 'A project group with this name already exists' });
86
+ }
87
+ // Create the group
88
+ const group = await db.projectGroups.create({
89
+ userId,
90
+ name: name.trim(),
91
+ description: description?.trim() || null,
92
+ color: color || null,
93
+ icon: icon || null,
94
+ coordinatorAgent: { enabled: false },
95
+ sortOrder: 0,
96
+ });
97
+ // Assign repositories to the group if provided
98
+ if (repositoryIds && Array.isArray(repositoryIds) && repositoryIds.length > 0) {
99
+ // Verify all repositories belong to the user
100
+ const userRepos = await db.repositories.findByUserId(userId);
101
+ const userRepoIds = new Set(userRepos.map(r => r.id));
102
+ for (const repoId of repositoryIds) {
103
+ if (!userRepoIds.has(repoId)) {
104
+ return res.status(400).json({
105
+ error: `Repository ${repoId} not found or not owned by user`,
106
+ });
107
+ }
108
+ }
109
+ // Assign repositories to the group
110
+ for (const repoId of repositoryIds) {
111
+ await db.repositories.assignToGroup(repoId, group.id);
112
+ }
113
+ }
114
+ // Fetch the group with repositories for response
115
+ const groupWithRepos = await db.projectGroups.findWithRepositories(group.id);
116
+ res.status(201).json({
117
+ success: true,
118
+ group: {
119
+ id: groupWithRepos.id,
120
+ name: groupWithRepos.name,
121
+ description: groupWithRepos.description,
122
+ color: groupWithRepos.color,
123
+ icon: groupWithRepos.icon,
124
+ coordinatorAgent: groupWithRepos.coordinatorAgent,
125
+ repositories: groupWithRepos.repositories.map(repo => ({
126
+ id: repo.id,
127
+ githubFullName: repo.githubFullName,
128
+ defaultBranch: repo.defaultBranch,
129
+ isPrivate: repo.isPrivate,
130
+ })),
131
+ createdAt: groupWithRepos.createdAt,
132
+ updatedAt: groupWithRepos.updatedAt,
133
+ },
134
+ });
135
+ }
136
+ catch (error) {
137
+ console.error('Error creating project group:', error);
138
+ res.status(500).json({ error: 'Failed to create project group' });
139
+ }
140
+ });
141
+ /**
142
+ * GET /api/project-groups/:id
143
+ * Get a specific project group with its repositories
144
+ */
145
+ coordinatorsRouter.get('/:id', async (req, res) => {
146
+ const userId = req.session.userId;
147
+ const { id } = req.params;
148
+ // Skip if this looks like a coordinator route
149
+ if (id === 'coordinators') {
150
+ return res.status(404).json({ error: 'Not found' });
151
+ }
152
+ try {
153
+ const group = await db.projectGroups.findWithRepositories(id);
154
+ if (!group) {
155
+ return res.status(404).json({ error: 'Project group not found' });
156
+ }
157
+ if (group.userId !== userId) {
158
+ return res.status(403).json({ error: 'Unauthorized' });
159
+ }
160
+ res.json({
161
+ id: group.id,
162
+ name: group.name,
163
+ description: group.description,
164
+ color: group.color,
165
+ icon: group.icon,
166
+ coordinatorAgent: group.coordinatorAgent,
167
+ sortOrder: group.sortOrder,
168
+ repositories: group.repositories.map(repo => ({
169
+ id: repo.id,
170
+ githubFullName: repo.githubFullName,
171
+ defaultBranch: repo.defaultBranch,
172
+ isPrivate: repo.isPrivate,
173
+ syncStatus: repo.syncStatus,
174
+ lastSyncedAt: repo.lastSyncedAt,
175
+ workspaceId: repo.workspaceId,
176
+ })),
177
+ createdAt: group.createdAt,
178
+ updatedAt: group.updatedAt,
179
+ });
180
+ }
181
+ catch (error) {
182
+ console.error('Error getting project group:', error);
183
+ res.status(500).json({ error: 'Failed to get project group' });
184
+ }
185
+ });
186
+ /**
187
+ * PATCH /api/project-groups/:id
188
+ * Update a project group's metadata
189
+ */
190
+ coordinatorsRouter.patch('/:id', async (req, res) => {
191
+ const userId = req.session.userId;
192
+ const { id } = req.params;
193
+ const { name, description, color, icon } = req.body;
194
+ try {
195
+ const group = await db.projectGroups.findById(id);
196
+ if (!group) {
197
+ return res.status(404).json({ error: 'Project group not found' });
198
+ }
199
+ if (group.userId !== userId) {
200
+ return res.status(403).json({ error: 'Unauthorized' });
201
+ }
202
+ // Build update object with only provided fields
203
+ const updates = {};
204
+ if (name !== undefined) {
205
+ if (typeof name !== 'string' || name.trim().length === 0) {
206
+ return res.status(400).json({ error: 'Name cannot be empty' });
207
+ }
208
+ if (name.length > 255) {
209
+ return res.status(400).json({ error: 'Name must be 255 characters or less' });
210
+ }
211
+ // Check for duplicate name (excluding current group)
212
+ const existing = await db.projectGroups.findByName(userId, name.trim());
213
+ if (existing && existing.id !== id) {
214
+ return res.status(409).json({ error: 'A project group with this name already exists' });
215
+ }
216
+ updates.name = name.trim();
217
+ }
218
+ if (description !== undefined) {
219
+ updates.description = description?.trim() || null;
220
+ }
221
+ if (color !== undefined) {
222
+ // Validate hex color format if provided
223
+ if (color && !/^#[0-9A-Fa-f]{6}$/.test(color)) {
224
+ return res.status(400).json({ error: 'Color must be a valid hex color (e.g., #3B82F6)' });
225
+ }
226
+ updates.color = color || null;
227
+ }
228
+ if (icon !== undefined) {
229
+ updates.icon = icon || null;
230
+ }
231
+ if (Object.keys(updates).length === 0) {
232
+ return res.status(400).json({ error: 'No valid fields to update' });
233
+ }
234
+ await db.projectGroups.update(id, updates);
235
+ // Fetch updated group
236
+ const updatedGroup = await db.projectGroups.findWithRepositories(id);
237
+ res.json({
238
+ success: true,
239
+ group: {
240
+ id: updatedGroup.id,
241
+ name: updatedGroup.name,
242
+ description: updatedGroup.description,
243
+ color: updatedGroup.color,
244
+ icon: updatedGroup.icon,
245
+ coordinatorAgent: updatedGroup.coordinatorAgent,
246
+ repositories: updatedGroup.repositories.map(repo => ({
247
+ id: repo.id,
248
+ githubFullName: repo.githubFullName,
249
+ defaultBranch: repo.defaultBranch,
250
+ isPrivate: repo.isPrivate,
251
+ })),
252
+ updatedAt: updatedGroup.updatedAt,
253
+ },
254
+ });
255
+ }
256
+ catch (error) {
257
+ console.error('Error updating project group:', error);
258
+ res.status(500).json({ error: 'Failed to update project group' });
259
+ }
260
+ });
261
+ /**
262
+ * DELETE /api/project-groups/:id
263
+ * Delete a project group (repositories are unassigned, not deleted)
264
+ */
265
+ coordinatorsRouter.delete('/:id', async (req, res) => {
266
+ const userId = req.session.userId;
267
+ const { id } = req.params;
268
+ try {
269
+ const group = await db.projectGroups.findById(id);
270
+ if (!group) {
271
+ return res.status(404).json({ error: 'Project group not found' });
272
+ }
273
+ if (group.userId !== userId) {
274
+ return res.status(403).json({ error: 'Unauthorized' });
275
+ }
276
+ // Stop coordinator if running
277
+ if (group.coordinatorAgent?.enabled) {
278
+ try {
279
+ const coordinatorService = getCoordinatorService();
280
+ await coordinatorService.stop(id);
281
+ }
282
+ catch (err) {
283
+ console.warn('Error stopping coordinator during group deletion:', err);
284
+ }
285
+ }
286
+ // Delete the group (repositories will have projectGroupId set to null due to ON DELETE SET NULL)
287
+ await db.projectGroups.delete(id);
288
+ res.json({
289
+ success: true,
290
+ message: 'Project group deleted',
291
+ });
292
+ }
293
+ catch (error) {
294
+ console.error('Error deleting project group:', error);
295
+ res.status(500).json({ error: 'Failed to delete project group' });
296
+ }
297
+ });
298
+ /**
299
+ * POST /api/project-groups/:id/repositories
300
+ * Add repositories to a project group
301
+ */
302
+ coordinatorsRouter.post('/:id/repositories', async (req, res) => {
303
+ const userId = req.session.userId;
304
+ const { id } = req.params;
305
+ const { repositoryIds } = req.body;
306
+ if (!repositoryIds || !Array.isArray(repositoryIds) || repositoryIds.length === 0) {
307
+ return res.status(400).json({ error: 'repositoryIds array is required' });
308
+ }
309
+ try {
310
+ const group = await db.projectGroups.findById(id);
311
+ if (!group) {
312
+ return res.status(404).json({ error: 'Project group not found' });
313
+ }
314
+ if (group.userId !== userId) {
315
+ return res.status(403).json({ error: 'Unauthorized' });
316
+ }
317
+ // Verify all repositories belong to the user
318
+ const userRepos = await db.repositories.findByUserId(userId);
319
+ const userRepoIds = new Set(userRepos.map(r => r.id));
320
+ for (const repoId of repositoryIds) {
321
+ if (!userRepoIds.has(repoId)) {
322
+ return res.status(400).json({
323
+ error: `Repository ${repoId} not found or not owned by user`,
324
+ });
325
+ }
326
+ }
327
+ // Assign repositories to the group
328
+ for (const repoId of repositoryIds) {
329
+ await db.repositories.assignToGroup(repoId, id);
330
+ }
331
+ // Fetch updated group
332
+ const updatedGroup = await db.projectGroups.findWithRepositories(id);
333
+ res.json({
334
+ success: true,
335
+ group: {
336
+ id: updatedGroup.id,
337
+ name: updatedGroup.name,
338
+ repositories: updatedGroup.repositories.map(repo => ({
339
+ id: repo.id,
340
+ githubFullName: repo.githubFullName,
341
+ defaultBranch: repo.defaultBranch,
342
+ isPrivate: repo.isPrivate,
343
+ })),
344
+ },
345
+ });
346
+ }
347
+ catch (error) {
348
+ console.error('Error adding repositories to group:', error);
349
+ res.status(500).json({ error: 'Failed to add repositories to group' });
350
+ }
351
+ });
352
+ /**
353
+ * DELETE /api/project-groups/:id/repositories/:repoId
354
+ * Remove a repository from a project group
355
+ */
356
+ coordinatorsRouter.delete('/:id/repositories/:repoId', async (req, res) => {
357
+ const userId = req.session.userId;
358
+ const { id, repoId } = req.params;
359
+ try {
360
+ const group = await db.projectGroups.findById(id);
361
+ if (!group) {
362
+ return res.status(404).json({ error: 'Project group not found' });
363
+ }
364
+ if (group.userId !== userId) {
365
+ return res.status(403).json({ error: 'Unauthorized' });
366
+ }
367
+ // Verify repository exists and belongs to this group
368
+ const repo = await db.repositories.findById(repoId);
369
+ if (!repo) {
370
+ return res.status(404).json({ error: 'Repository not found' });
371
+ }
372
+ if (repo.userId !== userId) {
373
+ return res.status(403).json({ error: 'Unauthorized' });
374
+ }
375
+ if (repo.projectGroupId !== id) {
376
+ return res.status(400).json({ error: 'Repository is not in this group' });
377
+ }
378
+ // Remove repository from group (set projectGroupId to null)
379
+ await db.repositories.assignToGroup(repoId, null);
380
+ res.json({
381
+ success: true,
382
+ message: 'Repository removed from group',
383
+ });
384
+ }
385
+ catch (error) {
386
+ console.error('Error removing repository from group:', error);
387
+ res.status(500).json({ error: 'Failed to remove repository from group' });
388
+ }
389
+ });
390
+ /**
391
+ * PUT /api/project-groups/reorder
392
+ * Reorder project groups
393
+ */
394
+ coordinatorsRouter.put('/reorder', async (req, res) => {
395
+ const userId = req.session.userId;
396
+ const { orderedIds } = req.body;
397
+ if (!orderedIds || !Array.isArray(orderedIds)) {
398
+ return res.status(400).json({ error: 'orderedIds array is required' });
399
+ }
400
+ try {
401
+ // Verify all groups belong to user
402
+ const userGroups = await db.projectGroups.findByUserId(userId);
403
+ const userGroupIds = new Set(userGroups.map(g => g.id));
404
+ for (const groupId of orderedIds) {
405
+ if (!userGroupIds.has(groupId)) {
406
+ return res.status(400).json({
407
+ error: `Group ${groupId} not found or not owned by user`,
408
+ });
409
+ }
410
+ }
411
+ await db.projectGroups.reorder(userId, orderedIds);
412
+ res.json({
413
+ success: true,
414
+ message: 'Groups reordered',
415
+ });
416
+ }
417
+ catch (error) {
418
+ console.error('Error reordering project groups:', error);
419
+ res.status(500).json({ error: 'Failed to reorder project groups' });
420
+ }
421
+ });
422
+ // ============================================================================
423
+ // Coordinator Agent Routes
424
+ // ============================================================================
23
425
  /**
24
426
  * GET /api/project-groups/:groupId/coordinator
25
427
  * Get coordinator agent configuration
@@ -12,7 +12,6 @@ import { Router } from 'express';
12
12
  import { randomBytes, createHash } from 'crypto';
13
13
  import { requireAuth } from './auth.js';
14
14
  import { db } from '../db/index.js';
15
- import { vault } from '../vault/index.js';
16
15
  export const daemonsRouter = Router();
17
16
  /**
18
17
  * Generate a secure API key
@@ -201,21 +200,26 @@ daemonsRouter.post('/heartbeat', requireDaemonAuth, async (req, res) => {
201
200
  });
202
201
  /**
203
202
  * GET /api/daemons/credentials
204
- * Get credentials for the daemon's user (syncs cloud credentials to local)
203
+ * Get credentials for the daemon's user
204
+ *
205
+ * Note: Tokens are no longer stored centrally. CLI tools authenticate directly
206
+ * on workspace/local instances. This endpoint returns connected provider info only.
205
207
  */
206
208
  daemonsRouter.get('/credentials', requireDaemonAuth, async (req, res) => {
207
209
  const daemon = req.daemon;
208
210
  try {
209
- // Get all decrypted credentials for the user via vault
210
- const credentialsMap = await vault.getUserCredentials(daemon.userId);
211
- // Convert Map to array format for API response
212
- const credentials = Array.from(credentialsMap.entries()).map(([provider, cred]) => ({
213
- provider,
214
- accessToken: cred.accessToken,
215
- tokenType: 'bearer',
216
- expiresAt: cred.tokenExpiresAt,
211
+ // Get connected providers for this user (no tokens stored centrally)
212
+ const credentials = await db.credentials.findByUserId(daemon.userId);
213
+ // Return provider info without tokens
214
+ const providers = credentials.map((cred) => ({
215
+ provider: cred.provider,
216
+ providerAccountEmail: cred.providerAccountEmail,
217
+ connectedAt: cred.createdAt,
217
218
  }));
218
- res.json({ credentials });
219
+ res.json({
220
+ providers,
221
+ note: 'Tokens are authenticated locally on workspace instances via CLI.',
222
+ });
219
223
  }
220
224
  catch (error) {
221
225
  console.error('Error fetching credentials:', error);
@@ -23,20 +23,34 @@ function generateExpectedToken(workspaceId) {
23
23
  /**
24
24
  * Verify workspace access token
25
25
  * Workspaces authenticate with a secret passed at provisioning time
26
+ *
27
+ * Returns:
28
+ * - { valid: true } if token matches
29
+ * - { valid: false, reason: string } if token is invalid or missing
26
30
  */
27
31
  function verifyWorkspaceToken(req, workspaceId) {
28
32
  const authHeader = req.get('authorization');
29
- if (!authHeader?.startsWith('Bearer ')) {
30
- return false;
33
+ if (!authHeader) {
34
+ return { valid: false, reason: 'No Authorization header. WORKSPACE_TOKEN may not be set in the container.' };
35
+ }
36
+ if (!authHeader.startsWith('Bearer ')) {
37
+ return { valid: false, reason: 'Invalid Authorization header format. Expected: Bearer <token>' };
31
38
  }
32
39
  const providedToken = authHeader.slice(7);
40
+ if (!providedToken) {
41
+ return { valid: false, reason: 'Empty bearer token provided.' };
42
+ }
33
43
  const expectedToken = generateExpectedToken(workspaceId);
34
44
  // Use timing-safe comparison to prevent timing attacks
35
45
  try {
36
- return crypto.timingSafeEqual(Buffer.from(providedToken), Buffer.from(expectedToken));
46
+ const isValid = crypto.timingSafeEqual(Buffer.from(providedToken), Buffer.from(expectedToken));
47
+ if (!isValid) {
48
+ return { valid: false, reason: 'Token mismatch. Workspace may need reprovisioning or SESSION_SECRET changed.' };
49
+ }
50
+ return { valid: true };
37
51
  }
38
52
  catch {
39
- return false;
53
+ return { valid: false, reason: 'Token comparison failed (length mismatch). Workspace may need reprovisioning.' };
40
54
  }
41
55
  }
42
56
  /**
@@ -57,38 +71,103 @@ gitRouter.get('/token', async (req, res) => {
57
71
  return res.status(400).json({ error: 'workspaceId is required' });
58
72
  }
59
73
  // Verify the request is from a valid workspace
60
- if (!verifyWorkspaceToken(req, workspaceId)) {
61
- return res.status(401).json({ error: 'Invalid workspace token' });
74
+ const tokenVerification = verifyWorkspaceToken(req, workspaceId);
75
+ if (!tokenVerification.valid) {
76
+ console.warn(`[git] Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
77
+ return res.status(401).json({
78
+ error: 'Invalid workspace token',
79
+ code: 'INVALID_WORKSPACE_TOKEN',
80
+ hint: tokenVerification.reason,
81
+ });
62
82
  }
63
83
  try {
64
84
  // Get workspace to find the user
65
85
  const workspace = await db.workspaces.findById(workspaceId);
66
86
  if (!workspace) {
67
- return res.status(404).json({ error: 'Workspace not found' });
87
+ console.warn(`[git] Workspace not found: ${workspaceId}`);
88
+ return res.status(404).json({
89
+ error: 'Workspace not found',
90
+ code: 'WORKSPACE_NOT_FOUND',
91
+ hint: 'The workspace may have been deleted. Try reprovisioning.',
92
+ });
68
93
  }
69
94
  const userId = workspace.userId;
95
+ console.log(`[git] Token request for workspace ${workspaceId.substring(0, 8)}, user ${userId.substring(0, 8)}`);
70
96
  // Find a repository with a Nango connection for this user
71
97
  const repos = await db.repositories.findByUserId(userId);
72
98
  const repoWithConnection = repos.find(r => r.nangoConnectionId);
73
99
  if (!repoWithConnection?.nangoConnectionId) {
100
+ console.warn(`[git] No Nango connection found for user ${userId.substring(0, 8)}. Repos: ${repos.length}, with connections: ${repos.filter(r => r.nangoConnectionId).length}`);
74
101
  return res.status(404).json({
75
102
  error: 'No GitHub App connection found',
76
- hint: 'Connect a repository via the GitHub App to enable git operations',
103
+ code: 'NO_GITHUB_APP_CONNECTION',
104
+ hint: 'Install the GitHub App on your repositories at https://github.com/apps/agent-relay',
105
+ repoCount: repos.length,
77
106
  });
78
107
  }
79
- // Get fresh token from Nango (auto-refreshes if needed)
80
- const token = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
108
+ console.log(`[git] Fetching token from Nango for connection ${repoWithConnection.nangoConnectionId.substring(0, 8)}...`);
109
+ // Get fresh tokens from Nango (auto-refreshes if needed)
110
+ // - installationToken: for git operations (clone, push, pull)
111
+ // - userToken: for gh CLI operations (requires user context)
112
+ let installationToken;
113
+ try {
114
+ installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
115
+ }
116
+ catch (nangoError) {
117
+ const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
118
+ console.error(`[git] Nango token fetch failed for connection ${repoWithConnection.nangoConnectionId}:`, errorMessage);
119
+ // Provide specific hints based on error type
120
+ if (errorMessage.includes('not found') || errorMessage.includes('404')) {
121
+ return res.status(500).json({
122
+ error: 'GitHub App connection expired or revoked',
123
+ code: 'NANGO_CONNECTION_EXPIRED',
124
+ hint: 'Reconnect your GitHub App at https://github.com/apps/agent-relay',
125
+ details: errorMessage,
126
+ });
127
+ }
128
+ return res.status(500).json({
129
+ error: 'Failed to fetch GitHub token from Nango',
130
+ code: 'NANGO_TOKEN_FETCH_FAILED',
131
+ hint: 'This may be a temporary issue. Try again in a few seconds.',
132
+ details: errorMessage,
133
+ });
134
+ }
135
+ // Try to get user OAuth token from github-app-oauth connection_config first
136
+ // Fall back to separate 'github' user connection if available
137
+ let userToken = null;
138
+ try {
139
+ userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
140
+ }
141
+ catch {
142
+ // Try the separate github user connection if available
143
+ const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
144
+ if (userRepo?.nangoConnectionId) {
145
+ try {
146
+ userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
147
+ }
148
+ catch {
149
+ console.log('[git] No github user token available');
150
+ }
151
+ }
152
+ }
81
153
  // GitHub App installation tokens expire after 1 hour
82
154
  const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString(); // 55 min buffer
155
+ console.log(`[git] Token fetched successfully for workspace ${workspaceId.substring(0, 8)}`);
83
156
  res.json({
84
- token,
157
+ token: installationToken,
158
+ userToken, // For gh CLI - may be null if not available
85
159
  expiresAt,
86
160
  username: 'x-access-token', // GitHub App tokens use this as username
87
161
  });
88
162
  }
89
163
  catch (error) {
90
- console.error('[git] Error getting token:', error);
91
- res.status(500).json({ error: 'Failed to get GitHub token' });
164
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
165
+ console.error('[git] Unexpected error getting token:', error);
166
+ res.status(500).json({
167
+ error: 'Failed to get GitHub token',
168
+ code: 'UNEXPECTED_ERROR',
169
+ details: errorMessage,
170
+ });
92
171
  }
93
172
  });
94
173
  /**
@@ -100,22 +179,46 @@ gitRouter.post('/token', async (req, res) => {
100
179
  if (!workspaceId || typeof workspaceId !== 'string') {
101
180
  return res.status(400).json({ error: 'workspaceId is required' });
102
181
  }
103
- if (!verifyWorkspaceToken(req, workspaceId)) {
104
- return res.status(401).json({ error: 'Invalid workspace token' });
182
+ const tokenVerification = verifyWorkspaceToken(req, workspaceId);
183
+ if (!tokenVerification.valid) {
184
+ console.warn(`[git] POST: Token verification failed for workspace ${workspaceId.substring(0, 8)}: ${tokenVerification.reason}`);
185
+ return res.status(401).json({
186
+ error: 'Invalid workspace token',
187
+ code: 'INVALID_WORKSPACE_TOKEN',
188
+ hint: tokenVerification.reason,
189
+ });
105
190
  }
106
191
  try {
107
192
  const workspace = await db.workspaces.findById(workspaceId);
108
193
  if (!workspace) {
109
- return res.status(404).json({ error: 'Workspace not found' });
194
+ console.warn(`[git] POST: Workspace not found: ${workspaceId}`);
195
+ return res.status(404).json({
196
+ error: 'Workspace not found',
197
+ code: 'WORKSPACE_NOT_FOUND',
198
+ });
110
199
  }
111
200
  const repos = await db.repositories.findByUserId(workspace.userId);
112
201
  const repoWithConnection = repos.find(r => r.nangoConnectionId);
113
202
  if (!repoWithConnection?.nangoConnectionId) {
203
+ console.warn(`[git] POST: No Nango connection for user ${workspace.userId.substring(0, 8)}`);
114
204
  return res.status(404).json({
115
205
  error: 'No GitHub App connection found',
206
+ code: 'NO_GITHUB_APP_CONNECTION',
207
+ });
208
+ }
209
+ let token;
210
+ try {
211
+ token = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
212
+ }
213
+ catch (nangoError) {
214
+ const errorMessage = nangoError instanceof Error ? nangoError.message : 'Unknown error';
215
+ console.error(`[git] POST: Nango token fetch failed:`, errorMessage);
216
+ return res.status(500).json({
217
+ error: 'Failed to fetch GitHub token',
218
+ code: 'NANGO_TOKEN_FETCH_FAILED',
219
+ details: errorMessage,
116
220
  });
117
221
  }
118
- const token = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
119
222
  const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString();
120
223
  res.json({
121
224
  token,
@@ -124,8 +227,13 @@ gitRouter.post('/token', async (req, res) => {
124
227
  });
125
228
  }
126
229
  catch (error) {
127
- console.error('[git] Error getting token:', error);
128
- res.status(500).json({ error: 'Failed to get GitHub token' });
230
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
231
+ console.error('[git] POST: Unexpected error:', error);
232
+ res.status(500).json({
233
+ error: 'Failed to get GitHub token',
234
+ code: 'UNEXPECTED_ERROR',
235
+ details: errorMessage,
236
+ });
129
237
  }
130
238
  });
131
239
  //# sourceMappingURL=git.js.map