agent-relay 1.2.0 → 1.2.3

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 (540) hide show
  1. package/.gitattributes +3 -0
  2. package/.nvmrc +1 -0
  3. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
  4. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
  5. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
  6. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
  7. package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
  8. package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
  9. package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
  10. package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
  11. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
  12. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
  13. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
  14. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
  15. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
  16. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
  17. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
  18. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
  19. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
  20. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
  21. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
  22. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
  23. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
  24. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
  25. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
  26. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
  27. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
  28. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
  29. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
  30. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
  31. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
  32. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
  33. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
  34. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
  35. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
  36. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
  37. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
  38. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
  39. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
  40. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
  41. package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
  42. package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
  43. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
  44. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
  45. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
  46. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
  47. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
  48. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
  49. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
  50. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
  51. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
  52. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
  53. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
  54. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
  55. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
  56. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
  57. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
  58. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
  59. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
  60. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
  61. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
  62. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
  63. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
  64. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
  65. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
  66. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
  67. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
  68. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
  69. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
  70. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
  71. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
  72. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
  73. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
  74. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
  75. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
  76. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
  77. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
  78. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
  79. package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
  80. package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
  81. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
  82. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
  83. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
  84. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
  85. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
  86. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
  87. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
  88. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
  89. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
  90. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
  91. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
  92. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
  93. package/.trajectories/index.json +314 -0
  94. package/ARCHITECTURE.md +1245 -0
  95. package/TESTING.md +278 -0
  96. package/deploy/init-db.sql +5 -0
  97. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  98. package/deploy/scripts/setup-railway.sh +75 -0
  99. package/deploy/workspace/entrypoint-browser.sh +118 -0
  100. package/deploy/workspace/entrypoint.sh +348 -0
  101. package/deploy/workspace/git-credential-relay +111 -0
  102. package/dist/cli/index.js +218 -1
  103. package/dist/cloud/api/billing.js +30 -9
  104. package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
  105. package/dist/cloud/api/codex-auth-helper.js +100 -0
  106. package/dist/cloud/api/git.js +24 -3
  107. package/dist/cloud/api/onboarding.js +15 -2
  108. package/dist/cloud/api/repos.d.ts +1 -0
  109. package/dist/cloud/api/repos.js +186 -0
  110. package/dist/cloud/api/webhooks.d.ts +1 -0
  111. package/dist/cloud/api/webhooks.js +149 -0
  112. package/dist/cloud/api/workspaces.js +97 -6
  113. package/dist/cloud/billing/plans.js +19 -19
  114. package/dist/cloud/provisioner/index.d.ts +32 -0
  115. package/dist/cloud/provisioner/index.js +362 -21
  116. package/dist/cloud/server.js +6 -1
  117. package/dist/cloud/services/nango.d.ts +60 -0
  118. package/dist/cloud/services/nango.js +153 -0
  119. package/dist/cloud/services/planLimits.d.ts +22 -0
  120. package/dist/cloud/services/planLimits.js +58 -5
  121. package/dist/dashboard/out/404.html +1 -1
  122. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
  123. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
  124. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
  125. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
  126. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
  127. package/dist/dashboard/out/_next/static/chunks/app/history/{page-56a8b4616a90dc43.js → page-abb9ab2d329f56e9.js} +1 -1
  128. package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  129. package/dist/dashboard/out/_next/static/chunks/app/login/{page-3eac37ea6f5dd153.js → page-c22d080201cbd9fb.js} +1 -1
  130. package/dist/dashboard/out/_next/static/chunks/app/metrics/{page-1081dd190a331a91.js → page-67a3e98d9a43a6ed.js} +1 -1
  131. package/dist/dashboard/out/_next/static/chunks/app/{page-daf87e86f783f980.js → page-77e9c65420a06cfb.js} +1 -1
  132. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
  133. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
  134. package/dist/dashboard/out/_next/static/chunks/app/signup/{page-fee4ed1709070bcd.js → page-68d34f50baa8ab6b.js} +1 -1
  135. package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
  136. package/dist/dashboard/out/_next/static/chunks/{main-97850e03d723ea8c.js → main-ed4e1fb6f29c34cf.js} +1 -1
  137. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
  138. package/dist/dashboard/out/app/onboarding.html +1 -0
  139. package/dist/dashboard/out/app/onboarding.txt +7 -0
  140. package/dist/dashboard/out/app.html +1 -1
  141. package/dist/dashboard/out/app.txt +2 -2
  142. package/dist/dashboard/out/connect-repos.html +1 -1
  143. package/dist/dashboard/out/connect-repos.txt +2 -2
  144. package/dist/dashboard/out/history.html +1 -1
  145. package/dist/dashboard/out/history.txt +2 -2
  146. package/dist/dashboard/out/index.html +1 -1
  147. package/dist/dashboard/out/index.txt +2 -2
  148. package/dist/dashboard/out/login.html +2 -2
  149. package/dist/dashboard/out/login.txt +2 -2
  150. package/dist/dashboard/out/metrics.html +1 -1
  151. package/dist/dashboard/out/metrics.txt +2 -2
  152. package/dist/dashboard/out/pricing.html +3 -3
  153. package/dist/dashboard/out/pricing.txt +2 -2
  154. package/dist/dashboard/out/providers.html +1 -1
  155. package/dist/dashboard/out/providers.txt +2 -2
  156. package/dist/dashboard/out/signup.html +2 -2
  157. package/dist/dashboard/out/signup.txt +2 -2
  158. package/package.json +2 -11
  159. package/test-push.txt +1 -0
  160. package/bin/tmux +0 -0
  161. package/dist/bridge/config.d.ts.map +0 -1
  162. package/dist/bridge/config.js.map +0 -1
  163. package/dist/bridge/index.d.ts.map +0 -1
  164. package/dist/bridge/index.js.map +0 -1
  165. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  166. package/dist/bridge/multi-project-client.js.map +0 -1
  167. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  168. package/dist/bridge/shadow-cli.js.map +0 -1
  169. package/dist/bridge/shadow-config.d.ts.map +0 -1
  170. package/dist/bridge/shadow-config.js.map +0 -1
  171. package/dist/bridge/spawner.d.ts.map +0 -1
  172. package/dist/bridge/spawner.js.map +0 -1
  173. package/dist/bridge/teams-config.d.ts.map +0 -1
  174. package/dist/bridge/teams-config.js.map +0 -1
  175. package/dist/bridge/types.d.ts.map +0 -1
  176. package/dist/bridge/types.js.map +0 -1
  177. package/dist/bridge/utils.d.ts.map +0 -1
  178. package/dist/bridge/utils.js.map +0 -1
  179. package/dist/cli/index.d.ts.map +0 -1
  180. package/dist/cli/index.js.map +0 -1
  181. package/dist/cloud/api/auth.d.ts.map +0 -1
  182. package/dist/cloud/api/auth.js.map +0 -1
  183. package/dist/cloud/api/billing.d.ts.map +0 -1
  184. package/dist/cloud/api/billing.js.map +0 -1
  185. package/dist/cloud/api/cli-pty-runner.d.ts.map +0 -1
  186. package/dist/cloud/api/cli-pty-runner.js.map +0 -1
  187. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  188. package/dist/cloud/api/coordinators.js.map +0 -1
  189. package/dist/cloud/api/daemons.d.ts.map +0 -1
  190. package/dist/cloud/api/daemons.js.map +0 -1
  191. package/dist/cloud/api/generic-webhooks.d.ts.map +0 -1
  192. package/dist/cloud/api/generic-webhooks.js.map +0 -1
  193. package/dist/cloud/api/git.d.ts.map +0 -1
  194. package/dist/cloud/api/git.js.map +0 -1
  195. package/dist/cloud/api/github-app.d.ts.map +0 -1
  196. package/dist/cloud/api/github-app.js.map +0 -1
  197. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  198. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  199. package/dist/cloud/api/monitoring.d.ts.map +0 -1
  200. package/dist/cloud/api/monitoring.js.map +0 -1
  201. package/dist/cloud/api/nango-auth.d.ts.map +0 -1
  202. package/dist/cloud/api/nango-auth.js.map +0 -1
  203. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  204. package/dist/cloud/api/onboarding.js.map +0 -1
  205. package/dist/cloud/api/policy.d.ts.map +0 -1
  206. package/dist/cloud/api/policy.js.map +0 -1
  207. package/dist/cloud/api/providers.d.ts.map +0 -1
  208. package/dist/cloud/api/providers.js.map +0 -1
  209. package/dist/cloud/api/repos.d.ts.map +0 -1
  210. package/dist/cloud/api/repos.js.map +0 -1
  211. package/dist/cloud/api/teams.d.ts.map +0 -1
  212. package/dist/cloud/api/teams.js.map +0 -1
  213. package/dist/cloud/api/test-helpers.d.ts.map +0 -1
  214. package/dist/cloud/api/test-helpers.js.map +0 -1
  215. package/dist/cloud/api/usage.d.ts.map +0 -1
  216. package/dist/cloud/api/usage.js.map +0 -1
  217. package/dist/cloud/api/webhooks.d.ts.map +0 -1
  218. package/dist/cloud/api/webhooks.js.map +0 -1
  219. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  220. package/dist/cloud/api/workspaces.js.map +0 -1
  221. package/dist/cloud/billing/index.d.ts.map +0 -1
  222. package/dist/cloud/billing/index.js.map +0 -1
  223. package/dist/cloud/billing/plans.d.ts.map +0 -1
  224. package/dist/cloud/billing/plans.js.map +0 -1
  225. package/dist/cloud/billing/service.d.ts.map +0 -1
  226. package/dist/cloud/billing/service.js.map +0 -1
  227. package/dist/cloud/billing/types.d.ts.map +0 -1
  228. package/dist/cloud/billing/types.js.map +0 -1
  229. package/dist/cloud/config.d.ts.map +0 -1
  230. package/dist/cloud/config.js.map +0 -1
  231. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  232. package/dist/cloud/db/drizzle.js.map +0 -1
  233. package/dist/cloud/db/index.d.ts.map +0 -1
  234. package/dist/cloud/db/index.js.map +0 -1
  235. package/dist/cloud/db/schema.d.ts.map +0 -1
  236. package/dist/cloud/db/schema.js.map +0 -1
  237. package/dist/cloud/index.d.ts.map +0 -1
  238. package/dist/cloud/index.js.map +0 -1
  239. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  240. package/dist/cloud/provisioner/index.js.map +0 -1
  241. package/dist/cloud/server.d.ts.map +0 -1
  242. package/dist/cloud/server.js.map +0 -1
  243. package/dist/cloud/services/auto-scaler.d.ts.map +0 -1
  244. package/dist/cloud/services/auto-scaler.js.map +0 -1
  245. package/dist/cloud/services/capacity-manager.d.ts.map +0 -1
  246. package/dist/cloud/services/capacity-manager.js.map +0 -1
  247. package/dist/cloud/services/ci-agent-spawner.d.ts.map +0 -1
  248. package/dist/cloud/services/ci-agent-spawner.js.map +0 -1
  249. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  250. package/dist/cloud/services/coordinator.js.map +0 -1
  251. package/dist/cloud/services/index.d.ts.map +0 -1
  252. package/dist/cloud/services/index.js.map +0 -1
  253. package/dist/cloud/services/mention-handler.d.ts.map +0 -1
  254. package/dist/cloud/services/mention-handler.js.map +0 -1
  255. package/dist/cloud/services/nango.d.ts.map +0 -1
  256. package/dist/cloud/services/nango.js.map +0 -1
  257. package/dist/cloud/services/persistence.d.ts.map +0 -1
  258. package/dist/cloud/services/persistence.js.map +0 -1
  259. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  260. package/dist/cloud/services/planLimits.js.map +0 -1
  261. package/dist/cloud/services/scaling-orchestrator.d.ts.map +0 -1
  262. package/dist/cloud/services/scaling-orchestrator.js.map +0 -1
  263. package/dist/cloud/services/scaling-policy.d.ts.map +0 -1
  264. package/dist/cloud/services/scaling-policy.js.map +0 -1
  265. package/dist/cloud/vault/index.d.ts.map +0 -1
  266. package/dist/cloud/vault/index.js.map +0 -1
  267. package/dist/cloud/webhooks/index.d.ts.map +0 -1
  268. package/dist/cloud/webhooks/index.js.map +0 -1
  269. package/dist/cloud/webhooks/parsers/github.d.ts.map +0 -1
  270. package/dist/cloud/webhooks/parsers/github.js.map +0 -1
  271. package/dist/cloud/webhooks/parsers/index.d.ts.map +0 -1
  272. package/dist/cloud/webhooks/parsers/index.js.map +0 -1
  273. package/dist/cloud/webhooks/parsers/linear.d.ts.map +0 -1
  274. package/dist/cloud/webhooks/parsers/linear.js.map +0 -1
  275. package/dist/cloud/webhooks/parsers/slack.d.ts.map +0 -1
  276. package/dist/cloud/webhooks/parsers/slack.js.map +0 -1
  277. package/dist/cloud/webhooks/responders/github.d.ts.map +0 -1
  278. package/dist/cloud/webhooks/responders/github.js.map +0 -1
  279. package/dist/cloud/webhooks/responders/index.d.ts.map +0 -1
  280. package/dist/cloud/webhooks/responders/index.js.map +0 -1
  281. package/dist/cloud/webhooks/responders/linear.d.ts.map +0 -1
  282. package/dist/cloud/webhooks/responders/linear.js.map +0 -1
  283. package/dist/cloud/webhooks/responders/slack.d.ts.map +0 -1
  284. package/dist/cloud/webhooks/responders/slack.js.map +0 -1
  285. package/dist/cloud/webhooks/router.d.ts.map +0 -1
  286. package/dist/cloud/webhooks/router.js.map +0 -1
  287. package/dist/cloud/webhooks/rules-engine.d.ts.map +0 -1
  288. package/dist/cloud/webhooks/rules-engine.js.map +0 -1
  289. package/dist/cloud/webhooks/types.d.ts.map +0 -1
  290. package/dist/cloud/webhooks/types.js.map +0 -1
  291. package/dist/continuity/formatter.d.ts.map +0 -1
  292. package/dist/continuity/formatter.js.map +0 -1
  293. package/dist/continuity/handoff-store.d.ts.map +0 -1
  294. package/dist/continuity/handoff-store.js.map +0 -1
  295. package/dist/continuity/index.d.ts.map +0 -1
  296. package/dist/continuity/index.js.map +0 -1
  297. package/dist/continuity/ledger-store.d.ts.map +0 -1
  298. package/dist/continuity/ledger-store.js.map +0 -1
  299. package/dist/continuity/manager.d.ts.map +0 -1
  300. package/dist/continuity/manager.js.map +0 -1
  301. package/dist/continuity/parser.d.ts.map +0 -1
  302. package/dist/continuity/parser.js.map +0 -1
  303. package/dist/continuity/types.d.ts.map +0 -1
  304. package/dist/continuity/types.js.map +0 -1
  305. package/dist/daemon/agent-manager.d.ts.map +0 -1
  306. package/dist/daemon/agent-manager.js.map +0 -1
  307. package/dist/daemon/agent-registry.d.ts.map +0 -1
  308. package/dist/daemon/agent-registry.js.map +0 -1
  309. package/dist/daemon/api.d.ts.map +0 -1
  310. package/dist/daemon/api.js.map +0 -1
  311. package/dist/daemon/auth.d.ts.map +0 -1
  312. package/dist/daemon/auth.js.map +0 -1
  313. package/dist/daemon/cli-auth.d.ts.map +0 -1
  314. package/dist/daemon/cli-auth.js.map +0 -1
  315. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  316. package/dist/daemon/cloud-sync.js.map +0 -1
  317. package/dist/daemon/connection.d.ts.map +0 -1
  318. package/dist/daemon/connection.js.map +0 -1
  319. package/dist/daemon/index.d.ts.map +0 -1
  320. package/dist/daemon/index.js.map +0 -1
  321. package/dist/daemon/orchestrator.d.ts.map +0 -1
  322. package/dist/daemon/orchestrator.js.map +0 -1
  323. package/dist/daemon/registry.d.ts.map +0 -1
  324. package/dist/daemon/registry.js.map +0 -1
  325. package/dist/daemon/router.d.ts.map +0 -1
  326. package/dist/daemon/router.js.map +0 -1
  327. package/dist/daemon/server.d.ts.map +0 -1
  328. package/dist/daemon/server.js.map +0 -1
  329. package/dist/daemon/services/browser-testing.d.ts.map +0 -1
  330. package/dist/daemon/services/browser-testing.js.map +0 -1
  331. package/dist/daemon/services/container-spawner.d.ts.map +0 -1
  332. package/dist/daemon/services/container-spawner.js.map +0 -1
  333. package/dist/daemon/types.d.ts.map +0 -1
  334. package/dist/daemon/types.js.map +0 -1
  335. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  336. package/dist/daemon/workspace-manager.js.map +0 -1
  337. package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +0 -1
  338. package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +0 -1
  339. package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +0 -1
  340. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +0 -1
  341. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
  342. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-4d72d5a5d8a9b618.js +0 -1
  343. package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +0 -1
  344. package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +0 -1
  345. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  346. package/dist/dashboard-server/metrics.js.map +0 -1
  347. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  348. package/dist/dashboard-server/needs-attention.js.map +0 -1
  349. package/dist/dashboard-server/server.d.ts.map +0 -1
  350. package/dist/dashboard-server/server.js.map +0 -1
  351. package/dist/dashboard-server/start.d.ts.map +0 -1
  352. package/dist/dashboard-server/start.js.map +0 -1
  353. package/dist/hooks/emitter.d.ts.map +0 -1
  354. package/dist/hooks/emitter.js.map +0 -1
  355. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  356. package/dist/hooks/inbox-check/hook.js.map +0 -1
  357. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  358. package/dist/hooks/inbox-check/index.js.map +0 -1
  359. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  360. package/dist/hooks/inbox-check/types.js.map +0 -1
  361. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  362. package/dist/hooks/inbox-check/utils.js.map +0 -1
  363. package/dist/hooks/index.d.ts.map +0 -1
  364. package/dist/hooks/index.js.map +0 -1
  365. package/dist/hooks/registry.d.ts.map +0 -1
  366. package/dist/hooks/registry.js.map +0 -1
  367. package/dist/hooks/trajectory-hooks.d.ts.map +0 -1
  368. package/dist/hooks/trajectory-hooks.js.map +0 -1
  369. package/dist/hooks/types.d.ts.map +0 -1
  370. package/dist/hooks/types.js.map +0 -1
  371. package/dist/index.d.ts.map +0 -1
  372. package/dist/index.js.map +0 -1
  373. package/dist/memory/adapters/index.d.ts.map +0 -1
  374. package/dist/memory/adapters/index.js.map +0 -1
  375. package/dist/memory/adapters/inmemory.d.ts.map +0 -1
  376. package/dist/memory/adapters/inmemory.js.map +0 -1
  377. package/dist/memory/adapters/supermemory.d.ts.map +0 -1
  378. package/dist/memory/adapters/supermemory.js.map +0 -1
  379. package/dist/memory/factory.d.ts.map +0 -1
  380. package/dist/memory/factory.js.map +0 -1
  381. package/dist/memory/index.d.ts.map +0 -1
  382. package/dist/memory/index.js.map +0 -1
  383. package/dist/memory/memory-hooks.d.ts.map +0 -1
  384. package/dist/memory/memory-hooks.js.map +0 -1
  385. package/dist/memory/service.d.ts.map +0 -1
  386. package/dist/memory/service.js.map +0 -1
  387. package/dist/memory/types.d.ts.map +0 -1
  388. package/dist/memory/types.js.map +0 -1
  389. package/dist/policy/agent-policy.d.ts.map +0 -1
  390. package/dist/policy/agent-policy.js.map +0 -1
  391. package/dist/policy/cloud-policy-fetcher.d.ts.map +0 -1
  392. package/dist/policy/cloud-policy-fetcher.js.map +0 -1
  393. package/dist/protocol/framing.d.ts.map +0 -1
  394. package/dist/protocol/framing.js.map +0 -1
  395. package/dist/protocol/index.d.ts.map +0 -1
  396. package/dist/protocol/index.js.map +0 -1
  397. package/dist/protocol/types.d.ts.map +0 -1
  398. package/dist/protocol/types.js.map +0 -1
  399. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  400. package/dist/resiliency/context-persistence.js.map +0 -1
  401. package/dist/resiliency/crash-insights.d.ts.map +0 -1
  402. package/dist/resiliency/crash-insights.js.map +0 -1
  403. package/dist/resiliency/gossip-health.d.ts.map +0 -1
  404. package/dist/resiliency/gossip-health.js.map +0 -1
  405. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  406. package/dist/resiliency/health-monitor.js.map +0 -1
  407. package/dist/resiliency/index.d.ts.map +0 -1
  408. package/dist/resiliency/index.js.map +0 -1
  409. package/dist/resiliency/leader-watchdog.d.ts.map +0 -1
  410. package/dist/resiliency/leader-watchdog.js.map +0 -1
  411. package/dist/resiliency/logger.d.ts.map +0 -1
  412. package/dist/resiliency/logger.js.map +0 -1
  413. package/dist/resiliency/memory-monitor.d.ts.map +0 -1
  414. package/dist/resiliency/memory-monitor.js.map +0 -1
  415. package/dist/resiliency/metrics.d.ts.map +0 -1
  416. package/dist/resiliency/metrics.js.map +0 -1
  417. package/dist/resiliency/provider-context.d.ts.map +0 -1
  418. package/dist/resiliency/provider-context.js.map +0 -1
  419. package/dist/resiliency/stateless-lead.d.ts.map +0 -1
  420. package/dist/resiliency/stateless-lead.js.map +0 -1
  421. package/dist/resiliency/supervisor.d.ts.map +0 -1
  422. package/dist/resiliency/supervisor.js.map +0 -1
  423. package/dist/shared/cli-auth-config.d.ts.map +0 -1
  424. package/dist/shared/cli-auth-config.js.map +0 -1
  425. package/dist/state/agent-state.d.ts.map +0 -1
  426. package/dist/state/agent-state.js.map +0 -1
  427. package/dist/storage/adapter.d.ts.map +0 -1
  428. package/dist/storage/adapter.js.map +0 -1
  429. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  430. package/dist/storage/sqlite-adapter.js.map +0 -1
  431. package/dist/trajectory/config.d.ts.map +0 -1
  432. package/dist/trajectory/config.js.map +0 -1
  433. package/dist/trajectory/index.d.ts.map +0 -1
  434. package/dist/trajectory/index.js.map +0 -1
  435. package/dist/trajectory/integration.d.ts.map +0 -1
  436. package/dist/trajectory/integration.js.map +0 -1
  437. package/dist/utils/agent-config.d.ts.map +0 -1
  438. package/dist/utils/agent-config.js.map +0 -1
  439. package/dist/utils/command-resolver.d.ts.map +0 -1
  440. package/dist/utils/command-resolver.js.map +0 -1
  441. package/dist/utils/index.d.ts.map +0 -1
  442. package/dist/utils/index.js.map +0 -1
  443. package/dist/utils/logger.d.ts.map +0 -1
  444. package/dist/utils/logger.js.map +0 -1
  445. package/dist/utils/name-generator.d.ts.map +0 -1
  446. package/dist/utils/name-generator.js.map +0 -1
  447. package/dist/utils/project-namespace.d.ts.map +0 -1
  448. package/dist/utils/project-namespace.js.map +0 -1
  449. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  450. package/dist/utils/tmux-resolver.js.map +0 -1
  451. package/dist/utils/update-checker.d.ts.map +0 -1
  452. package/dist/utils/update-checker.js.map +0 -1
  453. package/dist/wrapper/client.d.ts.map +0 -1
  454. package/dist/wrapper/client.js.map +0 -1
  455. package/dist/wrapper/inbox.d.ts.map +0 -1
  456. package/dist/wrapper/inbox.js.map +0 -1
  457. package/dist/wrapper/index.d.ts.map +0 -1
  458. package/dist/wrapper/index.js.map +0 -1
  459. package/dist/wrapper/parser.d.ts.map +0 -1
  460. package/dist/wrapper/parser.js.map +0 -1
  461. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  462. package/dist/wrapper/pty-wrapper.js.map +0 -1
  463. package/dist/wrapper/shared.d.ts.map +0 -1
  464. package/dist/wrapper/shared.js.map +0 -1
  465. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  466. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  467. package/docs/AGENTS.md +0 -513
  468. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  469. package/docs/CLOUD-ARCHITECTURE.md +0 -804
  470. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  471. package/docs/CONTRIBUTING.md +0 -151
  472. package/docs/HOOKS_API.md +0 -394
  473. package/docs/INTEGRATION-GUIDE.md +0 -926
  474. package/docs/PROTOCOL.md +0 -325
  475. package/docs/WRAPPER_EVENTS.md +0 -358
  476. package/docs/agent-policy-snippet.md +0 -40
  477. package/docs/agent-relay-protocol.md +0 -238
  478. package/docs/agent-relay-snippet.md +0 -174
  479. package/docs/archive/CHANGELOG.md +0 -11
  480. package/docs/archive/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  481. package/docs/archive/DESIGN_BRIDGE_STAFFING.md +0 -878
  482. package/docs/archive/DESIGN_V2.md +0 -1079
  483. package/docs/archive/EXECUTIVE_SUMMARY.md +0 -358
  484. package/docs/archive/MONETIZATION.md +0 -1679
  485. package/docs/archive/PROPOSAL-trajectories.md +0 -1582
  486. package/docs/archive/ROADMAP.md +0 -329
  487. package/docs/archive/SCALING_ANALYSIS.md +0 -280
  488. package/docs/archive/TESTING_PRESENCE_FEATURES.md +0 -327
  489. package/docs/archive/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  490. package/docs/archive/TMUX_IMPROVEMENTS.md +0 -968
  491. package/docs/archive/dashboard-v2-plan.md +0 -179
  492. package/docs/archive/removable-code-analysis.md +0 -24
  493. package/docs/competitive/GASTOWN.md +0 -451
  494. package/docs/competitive/MCP_AGENT_MAIL.md +0 -389
  495. package/docs/competitive/OVERVIEW.md +0 -898
  496. package/docs/competitive/README.md +0 -34
  497. package/docs/competitive/TMUX_ORCHESTRATOR.md +0 -605
  498. package/docs/dashboard.png +0 -0
  499. package/docs/design/ci-failure-webhooks.md +0 -812
  500. package/docs/design/comprehensive-integrations.md +0 -238
  501. package/docs/design/e2b-sandbox-integration.md +0 -504
  502. package/docs/design/github-app-permissions.md +0 -264
  503. package/docs/guides/CLOUD.md +0 -236
  504. package/docs/guides/LOCAL.md +0 -535
  505. package/docs/guides/SELF-HOSTED.md +0 -494
  506. package/docs/local-testing.md +0 -428
  507. package/docs/proposals/continuous-claude-integration.md +0 -622
  508. package/docs/proposals/custom-commands.md +0 -368
  509. package/docs/proposals/shadow-as-subagent.md +0 -765
  510. package/docs/proposals/slack-bot-integration.md +0 -1457
  511. package/docs/tasks/global-skills-system.tasks.md +0 -230
  512. package/docs/tasks/webhook-integrations.tasks.md +0 -184
  513. package/docs/tasks/workspace-capabilities.tasks.md +0 -121
  514. package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +0 -366
  515. package/scripts/cloud-setup.sh +0 -96
  516. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  517. package/scripts/dev/dev-team-setup.sh +0 -431
  518. package/scripts/e2e-test.sh +0 -119
  519. package/scripts/games/game-protocol.md +0 -79
  520. package/scripts/games/hearts-setup.sh +0 -264
  521. package/scripts/manual-qa.sh +0 -293
  522. package/scripts/run-cloud-qa.sh +0 -220
  523. package/scripts/test-cli-auth/Dockerfile +0 -44
  524. package/scripts/test-cli-auth/Dockerfile.real +0 -79
  525. package/scripts/test-cli-auth/README.md +0 -286
  526. package/scripts/test-cli-auth/ci-test-real-clis.ts +0 -251
  527. package/scripts/test-cli-auth/ci-test-runner.ts +0 -263
  528. package/scripts/test-cli-auth/mock-cli.sh +0 -147
  529. package/scripts/test-cli-auth/package.json +0 -14
  530. package/scripts/test-cli-auth/test-oauth-flow.ts +0 -220
  531. package/scripts/test-pty-input-auto.js +0 -222
  532. package/scripts/test-pty-input.js +0 -150
  533. package/scripts/tictactoe-setup.sh +0 -181
  534. /package/dist/dashboard/out/_next/static/chunks/{117-b100311aff8d5c61.js → 117-f7b8ab0809342e77.js} +0 -0
  535. /package/dist/dashboard/out/_next/static/chunks/{648-a13d3c2b1be45466.js → 648-5cc6e1921389a58a.js} +0 -0
  536. /package/dist/dashboard/out/_next/static/chunks/{724-73c1ee5f60abe860.js → 724-2dae7627550ab88f.js} +0 -0
  537. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-a4973f3e3c82fb67.js → page-53b8a69f76db17d0.js} +0 -0
  538. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
  539. /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
  540. /package/dist/dashboard/out/_next/static/{H5aWG0udPB4iOUIl_gytz → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
package/dist/cli/index.js CHANGED
@@ -1688,6 +1688,7 @@ program
1688
1688
  .action(async (args) => {
1689
1689
  const { spawn } = await import('node:child_process');
1690
1690
  const { getProjectPaths } = await import('../utils/project-namespace.js');
1691
+ const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('../trajectory/config.js');
1691
1692
  const paths = getProjectPaths();
1692
1693
  // Check if trail is available
1693
1694
  const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
@@ -1709,6 +1710,10 @@ program
1709
1710
  console.log('PDERO phases: plan, design, execute, review, observe');
1710
1711
  process.exit(1);
1711
1712
  }
1713
+ // Get trajectory storage path based on config (respects opt-in/opt-out)
1714
+ // Uses TRAJECTORIES_DATA_DIR env var which trail CLI reads
1715
+ const trajectoriesDir = getPrimaryTrajectoriesDir(paths.projectRoot);
1716
+ ensureTrajectoriesDir(paths.projectRoot);
1712
1717
  // Spawn trail with the provided arguments
1713
1718
  const trailProc = spawn('trail', args, {
1714
1719
  cwd: paths.projectRoot,
@@ -1716,7 +1721,7 @@ program
1716
1721
  env: {
1717
1722
  ...process.env,
1718
1723
  TRAJECTORIES_PROJECT: paths.projectId,
1719
- TRAJECTORIES_DATA_DIR: paths.dataDir,
1724
+ TRAJECTORIES_DATA_DIR: trajectoriesDir,
1720
1725
  },
1721
1726
  });
1722
1727
  trailProc.on('close', (code) => {
@@ -2220,5 +2225,217 @@ program
2220
2225
  await wrapper.start();
2221
2226
  console.log(`Profiling ${agentName}... Press Ctrl+C to stop.`);
2222
2227
  });
2228
+ // ============================================================================
2229
+ // codex-auth - Local OAuth callback helper for Codex/OpenAI authentication
2230
+ // ============================================================================
2231
+ program
2232
+ .command('codex-auth')
2233
+ .description('Capture Codex OAuth callback locally (run this when connecting Codex in Agent Relay)')
2234
+ .option('--token <token>', 'Auth session token from Agent Relay dashboard')
2235
+ .option('--cloud-url <url>', 'Cloud API URL', process.env.AGENT_RELAY_CLOUD_URL || 'https://agent-relay.com')
2236
+ .option('--port <port>', 'Callback port (default: 1455)', '1455')
2237
+ .option('--timeout <seconds>', 'Timeout in seconds (default: 300)', '300')
2238
+ .action(async (options) => {
2239
+ const http = await import('node:http');
2240
+ const { URL } = await import('node:url');
2241
+ const CALLBACK_PORT = parseInt(options.port, 10);
2242
+ const TIMEOUT_MS = parseInt(options.timeout, 10) * 1000;
2243
+ const CLOUD_URL = options.cloudUrl.replace(/\/$/, '');
2244
+ // Colors for terminal output
2245
+ const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
2246
+ const green = (s) => `\x1b[32m${s}\x1b[0m`;
2247
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
2248
+ const red = (s) => `\x1b[31m${s}\x1b[0m`;
2249
+ console.log('');
2250
+ console.log(cyan('═══════════════════════════════════════════════════'));
2251
+ console.log(cyan(' Codex Authentication Helper'));
2252
+ console.log(cyan('═══════════════════════════════════════════════════'));
2253
+ console.log('');
2254
+ // Get or create auth session
2255
+ let authSessionId = options.token;
2256
+ if (!authSessionId) {
2257
+ // No token provided - create a session via the API
2258
+ console.log('Creating auth session...');
2259
+ try {
2260
+ const response = await fetch(`${CLOUD_URL}/api/auth/codex-helper/cli-session`, {
2261
+ method: 'POST',
2262
+ headers: { 'Content-Type': 'application/json' },
2263
+ });
2264
+ if (!response.ok) {
2265
+ const error = await response.json().catch(() => ({}));
2266
+ console.log('');
2267
+ console.log(red('Failed to create auth session.'));
2268
+ console.log('');
2269
+ if (response.status === 401) {
2270
+ console.log('To use this command, run it with a token from the Agent Relay dashboard:');
2271
+ console.log('');
2272
+ console.log(cyan(' npx agent-relay codex-auth --token=<TOKEN>'));
2273
+ console.log('');
2274
+ console.log('Get the token from: Settings → Connect Codex → "Use CLI helper"');
2275
+ }
2276
+ else {
2277
+ console.log(`Error: ${error.error || response.statusText}`);
2278
+ }
2279
+ process.exit(1);
2280
+ }
2281
+ const data = await response.json();
2282
+ authSessionId = data.authSessionId;
2283
+ }
2284
+ catch (err) {
2285
+ console.log(red('Failed to connect to Agent Relay Cloud.'));
2286
+ console.log(`URL: ${CLOUD_URL}`);
2287
+ console.log(`Error: ${err instanceof Error ? err.message : String(err)}`);
2288
+ process.exit(1);
2289
+ }
2290
+ }
2291
+ console.log(`Session: ${authSessionId?.slice(0, 8)}...`);
2292
+ console.log(`Listening on port: ${cyan(String(CALLBACK_PORT))}`);
2293
+ console.log('');
2294
+ // Success HTML page
2295
+ const successHtml = `<!DOCTYPE html>
2296
+ <html>
2297
+ <head>
2298
+ <title>Authentication Successful</title>
2299
+ <style>
2300
+ body { font-family: -apple-system, sans-serif; background: #0a0f1a; color: #e2e8f0;
2301
+ display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
2302
+ .card { background: #1a1f2e; padding: 2rem; border-radius: 12px; text-align: center;
2303
+ border: 1px solid rgba(0, 212, 255, 0.3); max-width: 400px; }
2304
+ h1 { color: #00d4ff; margin-bottom: 1rem; }
2305
+ p { color: #94a3b8; margin: 0.5rem 0; }
2306
+ </style>
2307
+ </head>
2308
+ <body>
2309
+ <div class="card">
2310
+ <h1>✓ Authentication Successful!</h1>
2311
+ <p>Your Codex account is now connected.</p>
2312
+ <p style="margin-top: 1rem;">You can close this window.</p>
2313
+ </div>
2314
+ </body>
2315
+ </html>`;
2316
+ // Create HTTP server to capture callback
2317
+ let authCode = null;
2318
+ let serverClosed = false;
2319
+ const server = http.createServer(async (req, res) => {
2320
+ const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
2321
+ if (url.pathname === '/auth/callback') {
2322
+ const code = url.searchParams.get('code');
2323
+ const error = url.searchParams.get('error');
2324
+ if (error) {
2325
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
2326
+ res.end(`OAuth Error: ${error}`);
2327
+ console.log(red(`OAuth error: ${error}`));
2328
+ return;
2329
+ }
2330
+ if (code) {
2331
+ authCode = code;
2332
+ res.writeHead(200, { 'Content-Type': 'text/html' });
2333
+ res.end(successHtml);
2334
+ console.log('');
2335
+ console.log(green('✓ Received OAuth callback!'));
2336
+ }
2337
+ else {
2338
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
2339
+ res.end('Missing authorization code');
2340
+ }
2341
+ }
2342
+ else if (url.pathname === '/favicon.ico') {
2343
+ res.writeHead(404);
2344
+ res.end();
2345
+ }
2346
+ else {
2347
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
2348
+ res.end('Waiting for OAuth callback on /auth/callback...');
2349
+ }
2350
+ });
2351
+ // Handle server errors
2352
+ server.on('error', (err) => {
2353
+ if (err.code === 'EADDRINUSE') {
2354
+ console.log(red(`Port ${CALLBACK_PORT} is already in use.`));
2355
+ console.log('');
2356
+ console.log('Another process may be using this port.');
2357
+ console.log('Close it and try again, or specify a different port with --port');
2358
+ process.exit(1);
2359
+ }
2360
+ throw err;
2361
+ });
2362
+ // Start listening
2363
+ await new Promise((resolve) => {
2364
+ server.listen(CALLBACK_PORT, () => {
2365
+ resolve();
2366
+ });
2367
+ });
2368
+ console.log(green('Server ready!'));
2369
+ console.log('');
2370
+ console.log(yellow('Next steps:'));
2371
+ console.log(' 1. Go to the Agent Relay dashboard');
2372
+ console.log(' 2. Click "Open Codex Login Page" to start OAuth');
2373
+ console.log(' 3. Sign in with your OpenAI account');
2374
+ console.log(' 4. The callback will be captured automatically');
2375
+ console.log('');
2376
+ console.log(cyan(`Waiting for callback... (timeout: ${options.timeout}s)`));
2377
+ // Wait for callback or timeout
2378
+ const startTime = Date.now();
2379
+ while (!authCode && !serverClosed && (Date.now() - startTime) < TIMEOUT_MS) {
2380
+ await new Promise(resolve => setTimeout(resolve, 1000));
2381
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
2382
+ if (elapsed > 0 && elapsed % 30 === 0) {
2383
+ console.log(` Still waiting... (${elapsed}s)`);
2384
+ }
2385
+ }
2386
+ // Close server
2387
+ server.close();
2388
+ serverClosed = true;
2389
+ if (!authCode) {
2390
+ console.log('');
2391
+ console.log(red('Timeout waiting for OAuth callback.'));
2392
+ console.log('');
2393
+ console.log('If you completed sign-in, the callback may have failed.');
2394
+ console.log('Try copying the localhost URL from your browser and pasting');
2395
+ console.log('it into the Agent Relay dashboard manually.');
2396
+ process.exit(1);
2397
+ }
2398
+ // Send code to cloud API
2399
+ console.log('Sending auth code to Agent Relay...');
2400
+ try {
2401
+ const response = await fetch(`${CLOUD_URL}/api/auth/codex-helper/callback`, {
2402
+ method: 'POST',
2403
+ headers: { 'Content-Type': 'application/json' },
2404
+ body: JSON.stringify({
2405
+ authSessionId,
2406
+ code: authCode,
2407
+ }),
2408
+ });
2409
+ const data = await response.json();
2410
+ if (response.ok && data.success) {
2411
+ console.log('');
2412
+ console.log(green('═══════════════════════════════════════════════════'));
2413
+ console.log(green(' Authentication Complete!'));
2414
+ console.log(green('═══════════════════════════════════════════════════'));
2415
+ console.log('');
2416
+ console.log('Your Codex account is now connected to Agent Relay.');
2417
+ console.log('You can close this terminal and return to the dashboard.');
2418
+ console.log('');
2419
+ }
2420
+ else {
2421
+ console.log('');
2422
+ console.log(red('Failed to send auth code to Agent Relay.'));
2423
+ console.log(`Error: ${data.error || 'Unknown error'}`);
2424
+ console.log('');
2425
+ console.log('You can try pasting this code manually in the dashboard:');
2426
+ console.log(cyan(authCode));
2427
+ process.exit(1);
2428
+ }
2429
+ }
2430
+ catch (err) {
2431
+ console.log('');
2432
+ console.log(red('Failed to connect to Agent Relay Cloud.'));
2433
+ console.log(`Error: ${err instanceof Error ? err.message : String(err)}`);
2434
+ console.log('');
2435
+ console.log('You can try pasting this code manually in the dashboard:');
2436
+ console.log(cyan(authCode));
2437
+ process.exit(1);
2438
+ }
2439
+ });
2223
2440
  program.parse();
2224
2441
  //# sourceMappingURL=index.js.map
@@ -6,6 +6,7 @@
6
6
  import { Router } from 'express';
7
7
  import { getBillingService, getAllPlans, getPlan, comparePlans } from '../billing/index.js';
8
8
  import { getConfig } from '../config.js';
9
+ import { db } from '../db/index.js';
9
10
  export const billingRouter = Router();
10
11
  /**
11
12
  * Middleware to require authentication
@@ -315,8 +316,14 @@ billingRouter.post('/webhook',
315
316
  }
316
317
  const billing = getBillingService();
317
318
  try {
318
- // Get raw body
319
- const rawBody = JSON.stringify(req.body);
319
+ // Use the preserved raw body from express.json verify callback
320
+ // This is critical for Stripe signature verification - JSON.stringify(req.body) won't work
321
+ const rawBody = req.rawBody;
322
+ if (!rawBody) {
323
+ console.error('Raw body not available for Stripe webhook verification');
324
+ res.status(400).json({ error: 'Raw body not available' });
325
+ return;
326
+ }
320
327
  // Verify and parse event
321
328
  const event = billing.verifyWebhookSignature(rawBody, sig);
322
329
  // Process the event
@@ -330,16 +337,30 @@ billingRouter.post('/webhook',
330
337
  // Handle specific events
331
338
  switch (billingEvent.type) {
332
339
  case 'subscription.created':
333
- case 'subscription.updated':
334
- // Update user's subscription in database
335
- // This would integrate with your user/database layer
336
- console.log('Subscription updated for user:', billingEvent.userId);
340
+ case 'subscription.updated': {
341
+ // Extract subscription tier and update user's plan
342
+ if (billingEvent.userId) {
343
+ const subscription = billingEvent.data;
344
+ const tier = billing.getTierFromSubscription(subscription);
345
+ // Update user's plan in database
346
+ await db.users.update(billingEvent.userId, { plan: tier });
347
+ console.log(`Updated user ${billingEvent.userId} plan to: ${tier}`);
348
+ }
349
+ else {
350
+ console.warn('Subscription event received without userId:', billingEvent.id);
351
+ }
337
352
  break;
338
- case 'subscription.canceled':
339
- console.log('Subscription canceled for user:', billingEvent.userId);
353
+ }
354
+ case 'subscription.canceled': {
355
+ // Reset user to free plan
356
+ if (billingEvent.userId) {
357
+ await db.users.update(billingEvent.userId, { plan: 'free' });
358
+ console.log(`User ${billingEvent.userId} subscription canceled, reset to free plan`);
359
+ }
340
360
  break;
361
+ }
341
362
  case 'invoice.payment_failed':
342
- // Notify user of failed payment
363
+ // Log payment failure (don't immediately downgrade - Stripe retries)
343
364
  console.log('Payment failed for user:', billingEvent.userId);
344
365
  break;
345
366
  }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Codex Auth Helper API
3
+ *
4
+ * Provides endpoints for the `npx agent-relay codex-auth` CLI command
5
+ * to capture OAuth callbacks locally and send them to the cloud.
6
+ *
7
+ * This solves the "This site can't be reached" problem where Codex redirects
8
+ * to localhost:1455 after auth but nothing is listening.
9
+ */
10
+ export declare const codexAuthHelperRouter: import("express-serve-static-core").Router;
11
+ /**
12
+ * Stop the cleanup interval. Call this on server shutdown.
13
+ */
14
+ export declare function stopCodexAuthCleanup(): void;
15
+ //# sourceMappingURL=codex-auth-helper.d.ts.map
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Codex Auth Helper API
3
+ *
4
+ * Provides endpoints for the `npx agent-relay codex-auth` CLI command
5
+ * to capture OAuth callbacks locally and send them to the cloud.
6
+ *
7
+ * This solves the "This site can't be reached" problem where Codex redirects
8
+ * to localhost:1455 after auth but nothing is listening.
9
+ */
10
+ import { Router } from 'express';
11
+ import crypto from 'crypto';
12
+ import { requireAuth } from './auth.js';
13
+ export const codexAuthHelperRouter = Router();
14
+ const pendingAuthSessions = new Map();
15
+ // Clean up old sessions every minute
16
+ const cleanupInterval = setInterval(() => {
17
+ const now = Date.now();
18
+ for (const [id, session] of pendingAuthSessions) {
19
+ // Remove sessions older than 10 minutes
20
+ if (now - session.createdAt.getTime() > 10 * 60 * 1000) {
21
+ pendingAuthSessions.delete(id);
22
+ }
23
+ }
24
+ }, 60000);
25
+ /**
26
+ * Stop the cleanup interval. Call this on server shutdown.
27
+ */
28
+ export function stopCodexAuthCleanup() {
29
+ clearInterval(cleanupInterval);
30
+ }
31
+ /**
32
+ * POST /api/auth/codex-helper/cli-session
33
+ * Create a new auth session for the CLI command.
34
+ * Returns an authSessionId that the CLI uses to send the auth code.
35
+ */
36
+ codexAuthHelperRouter.post('/cli-session', requireAuth, async (req, res) => {
37
+ const userId = req.session.userId;
38
+ const authSessionId = crypto.randomUUID();
39
+ pendingAuthSessions.set(authSessionId, {
40
+ userId,
41
+ createdAt: new Date(),
42
+ });
43
+ console.log(`[codex-helper] Created CLI session ${authSessionId} for user ${userId}`);
44
+ res.json({
45
+ authSessionId,
46
+ expiresIn: 600, // 10 minutes
47
+ command: `npx agent-relay codex-auth --token=${authSessionId}`,
48
+ });
49
+ });
50
+ /**
51
+ * POST /api/auth/codex-helper/callback
52
+ * Receives the auth code from the CLI.
53
+ * No auth required - validated by authSessionId.
54
+ */
55
+ codexAuthHelperRouter.post('/callback', async (req, res) => {
56
+ const { authSessionId, code, error } = req.body;
57
+ if (!authSessionId) {
58
+ return res.status(400).json({ error: 'Missing authSessionId' });
59
+ }
60
+ const session = pendingAuthSessions.get(authSessionId);
61
+ if (!session) {
62
+ return res.status(404).json({ error: 'Session not found or expired' });
63
+ }
64
+ if (error) {
65
+ console.log(`[codex-helper] Auth error for session ${authSessionId}:`, error);
66
+ pendingAuthSessions.delete(authSessionId);
67
+ return res.json({ success: false, error });
68
+ }
69
+ if (!code) {
70
+ return res.status(400).json({ error: 'Missing auth code' });
71
+ }
72
+ // Store the code so the polling endpoint can retrieve it
73
+ session.code = code;
74
+ pendingAuthSessions.set(authSessionId, session);
75
+ console.log(`[codex-helper] Auth code received for session ${authSessionId}`);
76
+ res.json({ success: true, message: 'Auth code received. You can close this terminal.' });
77
+ });
78
+ /**
79
+ * GET /api/auth/codex-helper/status/:authSessionId
80
+ * Check if auth code has been received.
81
+ * The dashboard polls this to know when the CLI has captured the callback.
82
+ */
83
+ codexAuthHelperRouter.get('/status/:authSessionId', requireAuth, async (req, res) => {
84
+ const { authSessionId } = req.params;
85
+ const session = pendingAuthSessions.get(authSessionId);
86
+ if (!session || session.userId !== req.session.userId) {
87
+ return res.status(404).json({ error: 'Session not found or expired' });
88
+ }
89
+ if (session.code) {
90
+ // Clean up session after successful retrieval (code is single-use)
91
+ const code = session.code;
92
+ pendingAuthSessions.delete(authSessionId);
93
+ return res.json({
94
+ ready: true,
95
+ code,
96
+ });
97
+ }
98
+ res.json({ ready: false });
99
+ });
100
+ //# sourceMappingURL=codex-auth-helper.js.map
@@ -76,12 +76,33 @@ gitRouter.get('/token', async (req, res) => {
76
76
  hint: 'Connect a repository via the GitHub App to enable git operations',
77
77
  });
78
78
  }
79
- // Get fresh token from Nango (auto-refreshes if needed)
80
- const token = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
79
+ // Get fresh tokens from Nango (auto-refreshes if needed)
80
+ // - installationToken: for git operations (clone, push, pull)
81
+ // - userToken: for gh CLI operations (requires user context)
82
+ const installationToken = await nangoService.getGithubAppToken(repoWithConnection.nangoConnectionId);
83
+ // Try to get user OAuth token from github-app-oauth connection_config first
84
+ // Fall back to separate 'github' user connection if available
85
+ let userToken = null;
86
+ try {
87
+ userToken = await nangoService.getGithubUserOAuthToken(repoWithConnection.nangoConnectionId);
88
+ }
89
+ catch {
90
+ // Try the separate github user connection if available
91
+ const userRepo = repos.find(r => r.nangoConnectionId && r.nangoConnectionId !== repoWithConnection.nangoConnectionId);
92
+ if (userRepo?.nangoConnectionId) {
93
+ try {
94
+ userToken = await nangoService.getGithubUserToken(userRepo.nangoConnectionId);
95
+ }
96
+ catch {
97
+ console.log('[git] No github user token available');
98
+ }
99
+ }
100
+ }
81
101
  // GitHub App installation tokens expire after 1 hour
82
102
  const expiresAt = new Date(Date.now() + 55 * 60 * 1000).toISOString(); // 55 min buffer
83
103
  res.json({
84
- token,
104
+ token: installationToken,
105
+ userToken, // For gh CLI - may be null if not available
85
106
  expiresAt,
86
107
  username: 'x-access-token', // GitHub App tokens use this as username
87
108
  });
@@ -95,12 +95,25 @@ onboardingRouter.post('/cli/:provider/start', async (req, res) => {
95
95
  // Forward auth request to workspace daemon
96
96
  // When running in Docker, localhost refers to the container, not the host
97
97
  // Use host.docker.internal on Mac/Windows to reach the host machine
98
+ // When running on Fly.io, use internal networking (.internal) instead of public DNS
98
99
  let workspaceUrl = workspace.publicUrl.replace(/\/$/, '');
100
+ // Detect Fly.io by checking FLY_APP_NAME env var
101
+ const isOnFly = !!process.env.FLY_APP_NAME;
99
102
  // Detect Docker by checking for /.dockerenv file or RUNNING_IN_DOCKER env var
100
103
  const isInDocker = process.env.RUNNING_IN_DOCKER === 'true' ||
101
104
  await import('fs').then(fs => fs.existsSync('/.dockerenv')).catch(() => false);
102
- console.log('[onboarding] isInDocker:', isInDocker, 'RUNNING_IN_DOCKER:', process.env.RUNNING_IN_DOCKER);
103
- if (isInDocker && workspaceUrl.includes('localhost')) {
105
+ console.log('[onboarding] isOnFly:', isOnFly, 'isInDocker:', isInDocker);
106
+ if (isOnFly && workspaceUrl.includes('.fly.dev')) {
107
+ // Use Fly.io internal networking for server-to-server communication
108
+ // ar-583f273b.fly.dev -> http://ar-583f273b.internal:3888
109
+ // .internal uses IPv6 and works by default for apps in the same org
110
+ const appName = workspaceUrl.match(/https?:\/\/([^.]+)\.fly\.dev/)?.[1];
111
+ if (appName) {
112
+ workspaceUrl = `http://${appName}.internal:3888`;
113
+ console.log('[onboarding] Using Fly internal network:', workspaceUrl);
114
+ }
115
+ }
116
+ else if (isInDocker && workspaceUrl.includes('localhost')) {
104
117
  workspaceUrl = workspaceUrl.replace('localhost', 'host.docker.internal');
105
118
  console.log('[onboarding] Translated localhost to host.docker.internal');
106
119
  }
@@ -2,6 +2,7 @@
2
2
  * Repos API Routes
3
3
  *
4
4
  * GitHub repository management - list, import, sync.
5
+ * Includes Nango-based GitHub permission checking for dashboard access control.
5
6
  */
6
7
  export declare const reposRouter: import("express-serve-static-core").Router;
7
8
  //# sourceMappingURL=repos.d.ts.map