agent-relay 1.1.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 (567) 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/README.md +1 -1
  96. package/TESTING.md +278 -0
  97. package/deploy/init-db.sql +5 -0
  98. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  99. package/deploy/scripts/setup-railway.sh +75 -0
  100. package/deploy/workspace/entrypoint-browser.sh +118 -0
  101. package/deploy/workspace/entrypoint.sh +348 -0
  102. package/deploy/workspace/git-credential-relay +111 -0
  103. package/dist/bridge/spawner.d.ts +53 -0
  104. package/dist/bridge/spawner.js +203 -19
  105. package/dist/bridge/types.d.ts +12 -0
  106. package/dist/cli/index.js +618 -5
  107. package/dist/cloud/api/auth.d.ts +3 -2
  108. package/dist/cloud/api/auth.js +10 -98
  109. package/dist/cloud/api/billing.js +30 -9
  110. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  111. package/dist/cloud/api/cli-pty-runner.js +119 -0
  112. package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
  113. package/dist/cloud/api/codex-auth-helper.js +100 -0
  114. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  115. package/dist/cloud/api/generic-webhooks.js +129 -0
  116. package/dist/cloud/api/git.d.ts +8 -0
  117. package/dist/cloud/api/git.js +152 -0
  118. package/dist/cloud/api/github-app.d.ts +11 -0
  119. package/dist/cloud/api/github-app.js +189 -0
  120. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  121. package/dist/cloud/api/middleware/planLimits.js +39 -1
  122. package/dist/cloud/api/monitoring.d.ts +11 -0
  123. package/dist/cloud/api/monitoring.js +578 -0
  124. package/dist/cloud/api/nango-auth.d.ts +9 -0
  125. package/dist/cloud/api/nango-auth.js +377 -0
  126. package/dist/cloud/api/onboarding.d.ts +8 -1
  127. package/dist/cloud/api/onboarding.js +313 -119
  128. package/dist/cloud/api/policy.d.ts +8 -0
  129. package/dist/cloud/api/policy.js +229 -0
  130. package/dist/cloud/api/providers.js +114 -42
  131. package/dist/cloud/api/repos.d.ts +1 -0
  132. package/dist/cloud/api/repos.js +186 -0
  133. package/dist/cloud/api/test-helpers.d.ts +10 -0
  134. package/dist/cloud/api/test-helpers.js +575 -0
  135. package/dist/cloud/api/webhooks.d.ts +8 -0
  136. package/dist/cloud/api/webhooks.js +645 -0
  137. package/dist/cloud/api/workspaces.js +320 -12
  138. package/dist/cloud/billing/plans.js +32 -19
  139. package/dist/cloud/billing/types.d.ts +9 -3
  140. package/dist/cloud/config.d.ts +9 -2
  141. package/dist/cloud/config.js +13 -4
  142. package/dist/cloud/db/drizzle.d.ts +84 -1
  143. package/dist/cloud/db/drizzle.js +470 -0
  144. package/dist/cloud/db/index.d.ts +9 -4
  145. package/dist/cloud/db/index.js +11 -3
  146. package/dist/cloud/db/schema.d.ts +3283 -556
  147. package/dist/cloud/db/schema.js +314 -1
  148. package/dist/cloud/index.d.ts +1 -0
  149. package/dist/cloud/index.js +2 -0
  150. package/dist/cloud/provisioner/index.d.ts +56 -0
  151. package/dist/cloud/provisioner/index.js +676 -34
  152. package/dist/cloud/server.d.ts +1 -0
  153. package/dist/cloud/server.js +362 -13
  154. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  155. package/dist/cloud/services/auto-scaler.js +439 -0
  156. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  157. package/dist/cloud/services/capacity-manager.js +449 -0
  158. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  159. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  160. package/dist/cloud/services/index.d.ts +12 -0
  161. package/dist/cloud/services/index.js +15 -0
  162. package/dist/cloud/services/mention-handler.d.ts +65 -0
  163. package/dist/cloud/services/mention-handler.js +405 -0
  164. package/dist/cloud/services/nango.d.ts +186 -0
  165. package/dist/cloud/services/nango.js +344 -0
  166. package/dist/cloud/services/persistence.d.ts +131 -0
  167. package/dist/cloud/services/persistence.js +200 -0
  168. package/dist/cloud/services/planLimits.d.ts +37 -0
  169. package/dist/cloud/services/planLimits.js +86 -5
  170. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  171. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  172. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  173. package/dist/cloud/services/scaling-policy.js +415 -0
  174. package/dist/cloud/vault/index.js +1 -1
  175. package/dist/cloud/webhooks/index.d.ts +24 -0
  176. package/dist/cloud/webhooks/index.js +29 -0
  177. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  178. package/dist/cloud/webhooks/parsers/github.js +234 -0
  179. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  180. package/dist/cloud/webhooks/parsers/index.js +30 -0
  181. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  182. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  183. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  184. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  185. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  186. package/dist/cloud/webhooks/responders/github.js +73 -0
  187. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  188. package/dist/cloud/webhooks/responders/index.js +30 -0
  189. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  190. package/dist/cloud/webhooks/responders/linear.js +149 -0
  191. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  192. package/dist/cloud/webhooks/responders/slack.js +178 -0
  193. package/dist/cloud/webhooks/router.d.ts +25 -0
  194. package/dist/cloud/webhooks/router.js +504 -0
  195. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  196. package/dist/cloud/webhooks/rules-engine.js +287 -0
  197. package/dist/cloud/webhooks/types.d.ts +186 -0
  198. package/dist/cloud/webhooks/types.js +8 -0
  199. package/dist/continuity/formatter.d.ts +51 -0
  200. package/dist/continuity/formatter.js +313 -0
  201. package/dist/continuity/handoff-store.d.ts +67 -0
  202. package/dist/continuity/handoff-store.js +472 -0
  203. package/dist/continuity/index.d.ts +45 -0
  204. package/dist/continuity/index.js +48 -0
  205. package/dist/continuity/ledger-store.d.ts +110 -0
  206. package/dist/continuity/ledger-store.js +500 -0
  207. package/dist/continuity/manager.d.ts +178 -0
  208. package/dist/continuity/manager.js +562 -0
  209. package/dist/continuity/parser.d.ts +76 -0
  210. package/dist/continuity/parser.js +579 -0
  211. package/dist/continuity/types.d.ts +180 -0
  212. package/dist/continuity/types.js +9 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.js +107 -6
  215. package/dist/daemon/agent-registry.d.ts +32 -0
  216. package/dist/daemon/agent-registry.js +42 -2
  217. package/dist/daemon/api.d.ts +12 -0
  218. package/dist/daemon/api.js +131 -2
  219. package/dist/daemon/cli-auth.d.ts +67 -0
  220. package/dist/daemon/cli-auth.js +537 -0
  221. package/dist/daemon/cloud-sync.js +9 -7
  222. package/dist/daemon/orchestrator.js +30 -0
  223. package/dist/daemon/router.d.ts +5 -0
  224. package/dist/daemon/router.js +78 -26
  225. package/dist/daemon/server.d.ts +5 -0
  226. package/dist/daemon/server.js +9 -1
  227. package/dist/daemon/services/browser-testing.d.ts +88 -0
  228. package/dist/daemon/services/browser-testing.js +244 -0
  229. package/dist/daemon/services/container-spawner.d.ts +135 -0
  230. package/dist/daemon/services/container-spawner.js +313 -0
  231. package/dist/daemon/types.d.ts +5 -1
  232. package/dist/dashboard/out/404.html +1 -1
  233. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  234. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  235. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
  236. package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -0
  237. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
  238. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
  239. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
  240. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
  241. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-abb9ab2d329f56e9.js} +1 -1
  242. package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  243. package/dist/dashboard/out/_next/static/chunks/app/login/page-c22d080201cbd9fb.js +1 -0
  244. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
  245. package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
  246. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
  247. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
  248. package/dist/dashboard/out/_next/static/chunks/app/signup/page-68d34f50baa8ab6b.js +1 -0
  249. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  250. package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
  251. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
  252. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  253. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  254. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
  255. package/dist/dashboard/out/app/onboarding.html +1 -0
  256. package/dist/dashboard/out/app/onboarding.txt +7 -0
  257. package/dist/dashboard/out/app.html +1 -14
  258. package/dist/dashboard/out/app.txt +2 -2
  259. package/dist/dashboard/out/connect-repos.html +1 -0
  260. package/dist/dashboard/out/connect-repos.txt +7 -0
  261. package/dist/dashboard/out/history.html +1 -1
  262. package/dist/dashboard/out/history.txt +2 -2
  263. package/dist/dashboard/out/index.html +1 -1
  264. package/dist/dashboard/out/index.txt +2 -2
  265. package/dist/dashboard/out/login.html +6 -0
  266. package/dist/dashboard/out/login.txt +7 -0
  267. package/dist/dashboard/out/metrics.html +1 -1
  268. package/dist/dashboard/out/metrics.txt +2 -2
  269. package/dist/dashboard/out/pricing.html +3 -3
  270. package/dist/dashboard/out/pricing.txt +2 -2
  271. package/dist/dashboard/out/providers.html +1 -0
  272. package/dist/dashboard/out/providers.txt +7 -0
  273. package/dist/dashboard/out/signup.html +6 -0
  274. package/dist/dashboard/out/signup.txt +7 -0
  275. package/dist/dashboard-server/server.js +1308 -8
  276. package/dist/hooks/emitter.d.ts +40 -0
  277. package/dist/hooks/emitter.js +63 -0
  278. package/dist/hooks/index.d.ts +3 -0
  279. package/dist/hooks/index.js +3 -0
  280. package/dist/hooks/registry.d.ts +173 -0
  281. package/dist/hooks/registry.js +476 -0
  282. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  283. package/dist/hooks/trajectory-hooks.js +183 -0
  284. package/dist/hooks/types.d.ts +141 -0
  285. package/dist/index.d.ts +2 -0
  286. package/dist/index.js +3 -0
  287. package/dist/memory/adapters/index.d.ts +8 -0
  288. package/dist/memory/adapters/index.js +8 -0
  289. package/dist/memory/adapters/inmemory.d.ts +59 -0
  290. package/dist/memory/adapters/inmemory.js +195 -0
  291. package/dist/memory/adapters/supermemory.d.ts +71 -0
  292. package/dist/memory/adapters/supermemory.js +338 -0
  293. package/dist/memory/factory.d.ts +48 -0
  294. package/dist/memory/factory.js +143 -0
  295. package/dist/memory/index.d.ts +32 -0
  296. package/dist/memory/index.js +32 -0
  297. package/dist/memory/memory-hooks.d.ts +60 -0
  298. package/dist/memory/memory-hooks.js +313 -0
  299. package/dist/memory/service.d.ts +49 -0
  300. package/dist/memory/service.js +146 -0
  301. package/dist/memory/types.d.ts +195 -0
  302. package/dist/memory/types.js +8 -0
  303. package/dist/policy/agent-policy.d.ts +225 -0
  304. package/dist/policy/agent-policy.js +665 -0
  305. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  306. package/dist/policy/cloud-policy-fetcher.js +64 -0
  307. package/dist/resiliency/crash-insights.d.ts +156 -0
  308. package/dist/resiliency/crash-insights.js +492 -0
  309. package/dist/resiliency/gossip-health.d.ts +137 -0
  310. package/dist/resiliency/gossip-health.js +241 -0
  311. package/dist/resiliency/index.d.ts +5 -0
  312. package/dist/resiliency/index.js +5 -0
  313. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  314. package/dist/resiliency/leader-watchdog.js +189 -0
  315. package/dist/resiliency/memory-monitor.d.ts +172 -0
  316. package/dist/resiliency/memory-monitor.js +593 -0
  317. package/dist/resiliency/stateless-lead.d.ts +149 -0
  318. package/dist/resiliency/stateless-lead.js +308 -0
  319. package/dist/resiliency/supervisor.d.ts +38 -0
  320. package/dist/resiliency/supervisor.js +122 -0
  321. package/dist/shared/cli-auth-config.d.ts +91 -0
  322. package/dist/shared/cli-auth-config.js +264 -0
  323. package/dist/storage/adapter.d.ts +1 -1
  324. package/dist/trajectory/config.d.ts +84 -0
  325. package/dist/trajectory/config.js +163 -0
  326. package/dist/trajectory/index.d.ts +8 -0
  327. package/dist/trajectory/index.js +8 -0
  328. package/dist/trajectory/integration.d.ts +292 -0
  329. package/dist/trajectory/integration.js +834 -0
  330. package/dist/utils/logger.js +1 -1
  331. package/dist/utils/project-namespace.d.ts +24 -0
  332. package/dist/utils/project-namespace.js +84 -0
  333. package/dist/wrapper/parser.d.ts +10 -0
  334. package/dist/wrapper/parser.js +100 -33
  335. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  336. package/dist/wrapper/pty-wrapper.js +943 -106
  337. package/dist/wrapper/shared.d.ts +165 -0
  338. package/dist/wrapper/shared.js +270 -0
  339. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  340. package/dist/wrapper/tmux-wrapper.js +541 -120
  341. package/package.json +16 -16
  342. package/scripts/postinstall.js +60 -0
  343. package/test-push.txt +1 -0
  344. package/bin/tmux +0 -0
  345. package/dist/bridge/config.d.ts.map +0 -1
  346. package/dist/bridge/config.js.map +0 -1
  347. package/dist/bridge/index.d.ts.map +0 -1
  348. package/dist/bridge/index.js.map +0 -1
  349. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  350. package/dist/bridge/multi-project-client.js.map +0 -1
  351. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  352. package/dist/bridge/shadow-cli.js.map +0 -1
  353. package/dist/bridge/shadow-config.d.ts.map +0 -1
  354. package/dist/bridge/shadow-config.js.map +0 -1
  355. package/dist/bridge/spawner.d.ts.map +0 -1
  356. package/dist/bridge/spawner.js.map +0 -1
  357. package/dist/bridge/teams-config.d.ts.map +0 -1
  358. package/dist/bridge/teams-config.js.map +0 -1
  359. package/dist/bridge/types.d.ts.map +0 -1
  360. package/dist/bridge/types.js.map +0 -1
  361. package/dist/bridge/utils.d.ts.map +0 -1
  362. package/dist/bridge/utils.js.map +0 -1
  363. package/dist/cli/index.d.ts.map +0 -1
  364. package/dist/cli/index.js.map +0 -1
  365. package/dist/cloud/api/auth.d.ts.map +0 -1
  366. package/dist/cloud/api/auth.js.map +0 -1
  367. package/dist/cloud/api/billing.d.ts.map +0 -1
  368. package/dist/cloud/api/billing.js.map +0 -1
  369. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  370. package/dist/cloud/api/coordinators.js.map +0 -1
  371. package/dist/cloud/api/daemons.d.ts.map +0 -1
  372. package/dist/cloud/api/daemons.js.map +0 -1
  373. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  374. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  375. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  376. package/dist/cloud/api/onboarding.js.map +0 -1
  377. package/dist/cloud/api/providers.d.ts.map +0 -1
  378. package/dist/cloud/api/providers.js.map +0 -1
  379. package/dist/cloud/api/repos.d.ts.map +0 -1
  380. package/dist/cloud/api/repos.js.map +0 -1
  381. package/dist/cloud/api/teams.d.ts.map +0 -1
  382. package/dist/cloud/api/teams.js.map +0 -1
  383. package/dist/cloud/api/usage.d.ts.map +0 -1
  384. package/dist/cloud/api/usage.js.map +0 -1
  385. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  386. package/dist/cloud/api/workspaces.js.map +0 -1
  387. package/dist/cloud/billing/index.d.ts.map +0 -1
  388. package/dist/cloud/billing/index.js.map +0 -1
  389. package/dist/cloud/billing/plans.d.ts.map +0 -1
  390. package/dist/cloud/billing/plans.js.map +0 -1
  391. package/dist/cloud/billing/service.d.ts.map +0 -1
  392. package/dist/cloud/billing/service.js.map +0 -1
  393. package/dist/cloud/billing/types.d.ts.map +0 -1
  394. package/dist/cloud/billing/types.js.map +0 -1
  395. package/dist/cloud/config.d.ts.map +0 -1
  396. package/dist/cloud/config.js.map +0 -1
  397. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  398. package/dist/cloud/db/drizzle.js.map +0 -1
  399. package/dist/cloud/db/index.d.ts.map +0 -1
  400. package/dist/cloud/db/index.js.map +0 -1
  401. package/dist/cloud/db/schema.d.ts.map +0 -1
  402. package/dist/cloud/db/schema.js.map +0 -1
  403. package/dist/cloud/index.d.ts.map +0 -1
  404. package/dist/cloud/index.js.map +0 -1
  405. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  406. package/dist/cloud/provisioner/index.js.map +0 -1
  407. package/dist/cloud/server.d.ts.map +0 -1
  408. package/dist/cloud/server.js.map +0 -1
  409. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  410. package/dist/cloud/services/coordinator.js.map +0 -1
  411. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  412. package/dist/cloud/services/planLimits.js.map +0 -1
  413. package/dist/cloud/vault/index.d.ts.map +0 -1
  414. package/dist/cloud/vault/index.js.map +0 -1
  415. package/dist/daemon/agent-manager.d.ts.map +0 -1
  416. package/dist/daemon/agent-manager.js.map +0 -1
  417. package/dist/daemon/agent-registry.d.ts.map +0 -1
  418. package/dist/daemon/agent-registry.js.map +0 -1
  419. package/dist/daemon/api.d.ts.map +0 -1
  420. package/dist/daemon/api.js.map +0 -1
  421. package/dist/daemon/auth.d.ts.map +0 -1
  422. package/dist/daemon/auth.js.map +0 -1
  423. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  424. package/dist/daemon/cloud-sync.js.map +0 -1
  425. package/dist/daemon/connection.d.ts.map +0 -1
  426. package/dist/daemon/connection.js.map +0 -1
  427. package/dist/daemon/index.d.ts.map +0 -1
  428. package/dist/daemon/index.js.map +0 -1
  429. package/dist/daemon/orchestrator.d.ts.map +0 -1
  430. package/dist/daemon/orchestrator.js.map +0 -1
  431. package/dist/daemon/registry.d.ts.map +0 -1
  432. package/dist/daemon/registry.js.map +0 -1
  433. package/dist/daemon/router.d.ts.map +0 -1
  434. package/dist/daemon/router.js.map +0 -1
  435. package/dist/daemon/server.d.ts.map +0 -1
  436. package/dist/daemon/server.js.map +0 -1
  437. package/dist/daemon/types.d.ts.map +0 -1
  438. package/dist/daemon/types.js.map +0 -1
  439. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  440. package/dist/daemon/workspace-manager.js.map +0 -1
  441. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  442. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  443. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  444. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  445. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  446. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
  447. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  448. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  449. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
  450. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  451. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  452. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  453. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  454. package/dist/dashboard-server/metrics.js.map +0 -1
  455. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  456. package/dist/dashboard-server/needs-attention.js.map +0 -1
  457. package/dist/dashboard-server/server.d.ts.map +0 -1
  458. package/dist/dashboard-server/server.js.map +0 -1
  459. package/dist/dashboard-server/start.d.ts.map +0 -1
  460. package/dist/dashboard-server/start.js.map +0 -1
  461. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  462. package/dist/hooks/inbox-check/hook.js.map +0 -1
  463. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  464. package/dist/hooks/inbox-check/index.js.map +0 -1
  465. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  466. package/dist/hooks/inbox-check/types.js.map +0 -1
  467. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  468. package/dist/hooks/inbox-check/utils.js.map +0 -1
  469. package/dist/hooks/index.d.ts.map +0 -1
  470. package/dist/hooks/index.js.map +0 -1
  471. package/dist/hooks/types.d.ts.map +0 -1
  472. package/dist/hooks/types.js.map +0 -1
  473. package/dist/index.d.ts.map +0 -1
  474. package/dist/index.js.map +0 -1
  475. package/dist/protocol/framing.d.ts.map +0 -1
  476. package/dist/protocol/framing.js.map +0 -1
  477. package/dist/protocol/index.d.ts.map +0 -1
  478. package/dist/protocol/index.js.map +0 -1
  479. package/dist/protocol/types.d.ts.map +0 -1
  480. package/dist/protocol/types.js.map +0 -1
  481. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  482. package/dist/resiliency/context-persistence.js.map +0 -1
  483. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  484. package/dist/resiliency/health-monitor.js.map +0 -1
  485. package/dist/resiliency/index.d.ts.map +0 -1
  486. package/dist/resiliency/index.js.map +0 -1
  487. package/dist/resiliency/logger.d.ts.map +0 -1
  488. package/dist/resiliency/logger.js.map +0 -1
  489. package/dist/resiliency/metrics.d.ts.map +0 -1
  490. package/dist/resiliency/metrics.js.map +0 -1
  491. package/dist/resiliency/provider-context.d.ts.map +0 -1
  492. package/dist/resiliency/provider-context.js.map +0 -1
  493. package/dist/resiliency/supervisor.d.ts.map +0 -1
  494. package/dist/resiliency/supervisor.js.map +0 -1
  495. package/dist/state/agent-state.d.ts.map +0 -1
  496. package/dist/state/agent-state.js.map +0 -1
  497. package/dist/storage/adapter.d.ts.map +0 -1
  498. package/dist/storage/adapter.js.map +0 -1
  499. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  500. package/dist/storage/sqlite-adapter.js.map +0 -1
  501. package/dist/utils/agent-config.d.ts.map +0 -1
  502. package/dist/utils/agent-config.js.map +0 -1
  503. package/dist/utils/command-resolver.d.ts.map +0 -1
  504. package/dist/utils/command-resolver.js.map +0 -1
  505. package/dist/utils/index.d.ts.map +0 -1
  506. package/dist/utils/index.js.map +0 -1
  507. package/dist/utils/logger.d.ts.map +0 -1
  508. package/dist/utils/logger.js.map +0 -1
  509. package/dist/utils/name-generator.d.ts.map +0 -1
  510. package/dist/utils/name-generator.js.map +0 -1
  511. package/dist/utils/project-namespace.d.ts.map +0 -1
  512. package/dist/utils/project-namespace.js.map +0 -1
  513. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  514. package/dist/utils/tmux-resolver.js.map +0 -1
  515. package/dist/utils/update-checker.d.ts.map +0 -1
  516. package/dist/utils/update-checker.js.map +0 -1
  517. package/dist/wrapper/client.d.ts.map +0 -1
  518. package/dist/wrapper/client.js.map +0 -1
  519. package/dist/wrapper/inbox.d.ts.map +0 -1
  520. package/dist/wrapper/inbox.js.map +0 -1
  521. package/dist/wrapper/index.d.ts.map +0 -1
  522. package/dist/wrapper/index.js.map +0 -1
  523. package/dist/wrapper/parser.d.ts.map +0 -1
  524. package/dist/wrapper/parser.js.map +0 -1
  525. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  526. package/dist/wrapper/pty-wrapper.js.map +0 -1
  527. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  528. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  529. package/docs/AGENTS.md +0 -513
  530. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  531. package/docs/CHANGELOG.md +0 -11
  532. package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  533. package/docs/CLOUD-ARCHITECTURE.md +0 -652
  534. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  535. package/docs/COMPETITIVE_ANALYSIS.md +0 -897
  536. package/docs/CONTRIBUTING.md +0 -151
  537. package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
  538. package/docs/DESIGN_V2.md +0 -1079
  539. package/docs/INTEGRATION-GUIDE.md +0 -926
  540. package/docs/MONETIZATION.md +0 -1679
  541. package/docs/PROPOSAL-trajectories.md +0 -1582
  542. package/docs/PROTOCOL.md +0 -325
  543. package/docs/SCALING_ANALYSIS.md +0 -280
  544. package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
  545. package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  546. package/docs/TMUX_IMPROVEMENTS.md +0 -968
  547. package/docs/agent-relay-snippet.md +0 -168
  548. package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
  549. package/docs/dashboard-v2-plan.md +0 -179
  550. package/docs/guides/CLOUD.md +0 -236
  551. package/docs/guides/LOCAL.md +0 -535
  552. package/docs/guides/SELF-HOSTED.md +0 -494
  553. package/docs/proposals/shadow-as-subagent.md +0 -765
  554. package/docs/proposals/slack-bot-integration.md +0 -1457
  555. package/docs/removable-code-analysis.md +0 -24
  556. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  557. package/scripts/dev/dev-team-setup.sh +0 -431
  558. package/scripts/e2e-test.sh +0 -119
  559. package/scripts/games/game-protocol.md +0 -79
  560. package/scripts/games/hearts-setup.sh +0 -264
  561. package/scripts/tictactoe-setup.sh +0 -181
  562. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
  563. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
  564. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-53b8a69f76db17d0.js} +0 -0
  565. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
  566. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
  567. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
package/dist/cli/index.js CHANGED
@@ -55,6 +55,7 @@ program
55
55
  .option('-n, --name <name>', 'Agent name (auto-generated if not set)')
56
56
  .option('-q, --quiet', 'Disable debug output', false)
57
57
  .option('--prefix <pattern>', 'Relay prefix pattern (default: ->relay:)')
58
+ .option('--dashboard-port <port>', 'Dashboard port for spawn/release API (auto-detected if not set)')
58
59
  .option('--shadow <name>', 'Spawn a shadow agent with this name that monitors the primary')
59
60
  .option('--shadow-role <role>', 'Shadow role: reviewer, auditor, or triggers (comma-separated: SESSION_END,CODE_WRITTEN,REVIEW_REQUEST,EXPLICIT_ASK,ALL_MESSAGES)')
60
61
  .argument('[command...]', 'Command to wrap (e.g., claude)')
@@ -85,8 +86,31 @@ program
85
86
  }
86
87
  const { TmuxWrapper } = await import('../wrapper/tmux-wrapper.js');
87
88
  const { AgentSpawner } = await import('../bridge/spawner.js');
88
- // Create spawner so any agent can spawn workers
89
- const spawner = new AgentSpawner(paths.projectRoot);
89
+ // Determine dashboard port for spawn/release API
90
+ // Priority: CLI flag > env var > auto-detect default port
91
+ let dashboardPort;
92
+ if (options.dashboardPort) {
93
+ dashboardPort = parseInt(options.dashboardPort, 10);
94
+ }
95
+ else {
96
+ // Try to detect if dashboard is running at default port
97
+ const defaultPort = parseInt(DEFAULT_DASHBOARD_PORT, 10);
98
+ try {
99
+ const response = await fetch(`http://localhost:${defaultPort}/api/status`, {
100
+ method: 'GET',
101
+ signal: AbortSignal.timeout(500), // Quick timeout for detection
102
+ });
103
+ if (response.ok) {
104
+ dashboardPort = defaultPort;
105
+ console.error(`Dashboard detected: http://localhost:${dashboardPort}`);
106
+ }
107
+ }
108
+ catch {
109
+ // Dashboard not running - spawn/release will use fallback callbacks
110
+ }
111
+ }
112
+ // Create spawner as fallback for direct spawn (if dashboard API not available)
113
+ const spawner = new AgentSpawner(paths.projectRoot, undefined, dashboardPort);
90
114
  const wrapper = new TmuxWrapper({
91
115
  name: agentName,
92
116
  command: mainCommand,
@@ -96,7 +120,9 @@ program
96
120
  relayPrefix: options.prefix,
97
121
  useInbox: true,
98
122
  inboxDir: paths.dataDir, // Use the project-specific data directory for the inbox
99
- // Wire up spawn/release callbacks so any agent can spawn workers
123
+ // Use dashboard API for spawn/release when available (preferred - works from any context)
124
+ dashboardPort,
125
+ // Wire up spawn/release callbacks as fallback (if no dashboardPort)
100
126
  onSpawn: async (workerName, workerCli, task) => {
101
127
  console.error(`[${agentName}] Spawning ${workerName} (${workerCli})...`);
102
128
  const result = await spawner.spawn({
@@ -125,7 +151,7 @@ program
125
151
  });
126
152
  process.on('SIGINT', async () => {
127
153
  await spawner.releaseAll();
128
- wrapper.stop();
154
+ await wrapper.stop();
129
155
  process.exit(0);
130
156
  });
131
157
  await wrapper.start();
@@ -1650,6 +1676,62 @@ cloudCommand
1650
1676
  process.exit(1);
1651
1677
  }
1652
1678
  });
1679
+ // ============================================================================
1680
+ // TRAJECTORY COMMANDS (trail proxy)
1681
+ // ============================================================================
1682
+ // trail - Proxy to trail CLI for trajectory tracking
1683
+ program
1684
+ .command('trail')
1685
+ .description('Trajectory tracking commands (proxies to trail CLI)')
1686
+ .argument('[args...]', 'Arguments to pass to trail CLI')
1687
+ .allowUnknownOption()
1688
+ .action(async (args) => {
1689
+ const { spawn } = await import('node:child_process');
1690
+ const { getProjectPaths } = await import('../utils/project-namespace.js');
1691
+ const { getPrimaryTrajectoriesDir, ensureTrajectoriesDir } = await import('../trajectory/config.js');
1692
+ const paths = getProjectPaths();
1693
+ // Check if trail is available
1694
+ const trailCheck = spawn('which', ['trail'], { stdio: 'pipe' });
1695
+ const trailExists = await new Promise((resolve) => {
1696
+ trailCheck.on('close', (code) => resolve(code === 0));
1697
+ trailCheck.on('error', () => resolve(false));
1698
+ });
1699
+ if (!trailExists) {
1700
+ console.error('trail CLI not found. Install with: npm install -g agent-trajectories');
1701
+ console.log('');
1702
+ console.log('The trail CLI provides trajectory tracking for agent work:');
1703
+ console.log(' trail start "<task>" Start tracking a new trajectory');
1704
+ console.log(' trail status Show current trajectory status');
1705
+ console.log(' trail phase <phase> Transition to PDERO phase');
1706
+ console.log(' trail decision "<choice>" Record a decision');
1707
+ console.log(' trail complete Complete the trajectory');
1708
+ console.log(' trail list List all trajectories');
1709
+ console.log('');
1710
+ console.log('PDERO phases: plan, design, execute, review, observe');
1711
+ process.exit(1);
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);
1717
+ // Spawn trail with the provided arguments
1718
+ const trailProc = spawn('trail', args, {
1719
+ cwd: paths.projectRoot,
1720
+ stdio: 'inherit',
1721
+ env: {
1722
+ ...process.env,
1723
+ TRAJECTORIES_PROJECT: paths.projectId,
1724
+ TRAJECTORIES_DATA_DIR: trajectoriesDir,
1725
+ },
1726
+ });
1727
+ trailProc.on('close', (code) => {
1728
+ process.exit(code ?? 0);
1729
+ });
1730
+ trailProc.on('error', (err) => {
1731
+ console.error(`Failed to run trail: ${err.message}`);
1732
+ process.exit(1);
1733
+ });
1734
+ });
1653
1735
  cloudCommand
1654
1736
  .command('agents')
1655
1737
  .description('List agents across all linked machines')
@@ -1795,7 +1877,7 @@ cloudCommand
1795
1877
  .command('daemons')
1796
1878
  .description('List all linked daemon instances')
1797
1879
  .option('--json', 'Output as JSON')
1798
- .action(async (options) => {
1880
+ .action(async (_options) => {
1799
1881
  const os = await import('node:os');
1800
1882
  const dataDir = process.env.AGENT_RELAY_DATA_DIR ||
1801
1883
  path.join(os.homedir(), '.local', 'share', 'agent-relay');
@@ -1824,5 +1906,536 @@ cloudCommand
1824
1906
  process.exit(1);
1825
1907
  }
1826
1908
  });
1909
+ // ============================================================================
1910
+ // Monitoring commands (metrics, health, profiler)
1911
+ // ============================================================================
1912
+ // metrics - Show agent memory metrics
1913
+ program
1914
+ .command('metrics')
1915
+ .description('Show agent memory metrics and resource usage')
1916
+ .option('--agent <name>', 'Show metrics for specific agent')
1917
+ .option('--port <port>', 'Dashboard port', DEFAULT_DASHBOARD_PORT)
1918
+ .option('--json', 'Output as JSON')
1919
+ .option('--watch', 'Continuously update metrics')
1920
+ .option('--interval <ms>', 'Update interval for watch mode', '5000')
1921
+ .action(async (options) => {
1922
+ const port = options.port || DEFAULT_DASHBOARD_PORT;
1923
+ const fetchMetrics = async () => {
1924
+ try {
1925
+ const response = await fetch(`http://localhost:${port}/api/metrics/agents`);
1926
+ if (!response.ok) {
1927
+ throw new Error(`HTTP ${response.status}`);
1928
+ }
1929
+ return await response.json();
1930
+ }
1931
+ catch (err) {
1932
+ if (err.code === 'ECONNREFUSED') {
1933
+ console.error(`Cannot connect to dashboard at port ${port}. Is the daemon running?`);
1934
+ console.log(`Run 'agent-relay up' to start the daemon.`);
1935
+ }
1936
+ else {
1937
+ console.error(`Failed to fetch metrics: ${err.message}`);
1938
+ }
1939
+ process.exit(1);
1940
+ }
1941
+ };
1942
+ const formatBytes = (bytes) => {
1943
+ if (bytes === 0)
1944
+ return '0 B';
1945
+ const k = 1024;
1946
+ const sizes = ['B', 'KB', 'MB', 'GB'];
1947
+ const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
1948
+ return `${(bytes / Math.pow(k, i)).toFixed(1)} ${sizes[i]}`;
1949
+ };
1950
+ const formatUptime = (ms) => {
1951
+ if (ms < 60000)
1952
+ return `${Math.floor(ms / 1000)}s`;
1953
+ if (ms < 3600000)
1954
+ return `${Math.floor(ms / 60000)}m`;
1955
+ return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
1956
+ };
1957
+ const displayMetrics = (data) => {
1958
+ let agents = data.agents;
1959
+ if (options.agent) {
1960
+ agents = agents.filter(a => a.name === options.agent);
1961
+ if (agents.length === 0) {
1962
+ console.error(`Agent "${options.agent}" not found`);
1963
+ return;
1964
+ }
1965
+ }
1966
+ if (options.json) {
1967
+ console.log(JSON.stringify({ agents, system: data.system }, null, 2));
1968
+ return;
1969
+ }
1970
+ if (options.watch) {
1971
+ // Clear screen for watch mode
1972
+ console.clear();
1973
+ console.log(`Agent Metrics (updating every ${options.interval}ms) [Ctrl+C to stop]`);
1974
+ console.log(`System: ${formatBytes(data.system.heapUsed)} heap / ${formatBytes(data.system.freeMemory)} free`);
1975
+ console.log('');
1976
+ }
1977
+ if (agents.length === 0) {
1978
+ console.log('No agents with memory metrics.');
1979
+ console.log('Ensure agents are running and memory monitoring is enabled.');
1980
+ return;
1981
+ }
1982
+ console.log('AGENT PID MEMORY CPU TREND ALERT UPTIME');
1983
+ console.log('─'.repeat(75));
1984
+ for (const agent of agents) {
1985
+ const name = agent.name.padEnd(15);
1986
+ const pid = (agent.pid?.toString() || '-').padEnd(8);
1987
+ const memory = formatBytes(agent.rssBytes || 0).padEnd(11);
1988
+ const cpu = ((agent.cpuPercent?.toFixed(1) || '0') + '%').padEnd(6);
1989
+ const trend = (agent.trend || 'unknown').padEnd(11);
1990
+ const alertColors = {
1991
+ normal: 'normal',
1992
+ warning: '\x1b[33mwarning\x1b[0m',
1993
+ critical: '\x1b[31mcritical\x1b[0m',
1994
+ oom_imminent: '\x1b[31;1mOOM!\x1b[0m',
1995
+ };
1996
+ const alert = (alertColors[agent.alertLevel || 'normal'] || agent.alertLevel || '-').padEnd(9);
1997
+ const uptime = formatUptime(agent.uptimeMs || 0);
1998
+ console.log(`${name} ${pid} ${memory} ${cpu} ${trend} ${alert} ${uptime}`);
1999
+ }
2000
+ if (!options.watch) {
2001
+ console.log('');
2002
+ console.log(`Total: ${agents.length} agent(s)`);
2003
+ if (agents.some(a => a.alertLevel && a.alertLevel !== 'normal')) {
2004
+ console.log('');
2005
+ console.log('⚠️ Some agents have elevated memory usage. Run `agent-relay health` for details.');
2006
+ }
2007
+ }
2008
+ };
2009
+ if (options.watch) {
2010
+ const interval = parseInt(options.interval || '5000', 10);
2011
+ const update = async () => {
2012
+ try {
2013
+ const data = await fetchMetrics();
2014
+ displayMetrics(data);
2015
+ }
2016
+ catch {
2017
+ // Error already logged in fetchMetrics
2018
+ }
2019
+ };
2020
+ process.on('SIGINT', () => {
2021
+ console.log('\nStopped watching metrics.');
2022
+ process.exit(0);
2023
+ });
2024
+ await update();
2025
+ setInterval(update, interval);
2026
+ }
2027
+ else {
2028
+ const data = await fetchMetrics();
2029
+ displayMetrics(data);
2030
+ }
2031
+ });
2032
+ // health - Show crash insights and system health
2033
+ program
2034
+ .command('health')
2035
+ .description('Show system health, crash insights, and recommendations')
2036
+ .option('--port <port>', 'Dashboard port', DEFAULT_DASHBOARD_PORT)
2037
+ .option('--json', 'Output as JSON')
2038
+ .option('--crashes', 'Show recent crash history')
2039
+ .option('--alerts', 'Show unacknowledged alerts')
2040
+ .action(async (options) => {
2041
+ const port = options.port || DEFAULT_DASHBOARD_PORT;
2042
+ try {
2043
+ const response = await fetch(`http://localhost:${port}/api/metrics/health`);
2044
+ if (!response.ok) {
2045
+ throw new Error(`HTTP ${response.status}`);
2046
+ }
2047
+ const data = await response.json();
2048
+ if (options.json) {
2049
+ console.log(JSON.stringify(data, null, 2));
2050
+ return;
2051
+ }
2052
+ // Health score with color
2053
+ const scoreColor = data.healthScore >= 80 ? '\x1b[32m' : // Green
2054
+ data.healthScore >= 50 ? '\x1b[33m' : // Yellow
2055
+ '\x1b[31m'; // Red
2056
+ const resetColor = '\x1b[0m';
2057
+ console.log('');
2058
+ console.log('═══════════════════════════════════════════════════════════════');
2059
+ console.log(` SYSTEM HEALTH: ${scoreColor}${data.healthScore}/100${resetColor}`);
2060
+ console.log('═══════════════════════════════════════════════════════════════');
2061
+ console.log('');
2062
+ console.log(` ${data.summary}`);
2063
+ console.log('');
2064
+ // Show stats
2065
+ console.log(` Agents: ${data.stats.agentCount}`);
2066
+ console.log(` Crashes (24h): ${data.stats.totalCrashes24h}`);
2067
+ console.log(` Alerts (24h): ${data.stats.totalAlerts24h}`);
2068
+ console.log('');
2069
+ // Show issues
2070
+ if (data.issues.length > 0) {
2071
+ console.log(' ISSUES:');
2072
+ for (const issue of data.issues) {
2073
+ const icon = issue.severity === 'critical' ? '🔴' :
2074
+ issue.severity === 'high' ? '🟠' :
2075
+ issue.severity === 'medium' ? '🟡' : '🔵';
2076
+ console.log(` ${icon} ${issue.message}`);
2077
+ }
2078
+ console.log('');
2079
+ }
2080
+ // Show recommendations
2081
+ if (data.recommendations.length > 0) {
2082
+ console.log(' RECOMMENDATIONS:');
2083
+ for (const rec of data.recommendations) {
2084
+ console.log(` → ${rec}`);
2085
+ }
2086
+ console.log('');
2087
+ }
2088
+ // Show crashes if requested
2089
+ if (options.crashes && data.crashes.length > 0) {
2090
+ console.log(' RECENT CRASHES:');
2091
+ console.log(' ─────────────────────────────────────────────────────────────');
2092
+ for (const crash of data.crashes.slice(0, 10)) {
2093
+ const time = new Date(crash.crashedAt).toLocaleString();
2094
+ console.log(` ${crash.agentName} - ${time}`);
2095
+ console.log(` Cause: ${crash.likelyCause} | ${crash.summary.slice(0, 60)}...`);
2096
+ }
2097
+ console.log('');
2098
+ }
2099
+ // Show alerts if requested
2100
+ if (options.alerts && data.alerts.length > 0) {
2101
+ console.log(' UNACKNOWLEDGED ALERTS:');
2102
+ console.log(' ─────────────────────────────────────────────────────────────');
2103
+ for (const alert of data.alerts.slice(0, 10)) {
2104
+ const _time = new Date(alert.createdAt).toLocaleString();
2105
+ const icon = alert.alertType === 'oom_imminent' ? '🔴' :
2106
+ alert.alertType === 'critical' ? '🟠' : '🟡';
2107
+ console.log(` ${icon} ${alert.agentName} - ${alert.alertType}`);
2108
+ console.log(` ${alert.message}`);
2109
+ }
2110
+ console.log('');
2111
+ }
2112
+ console.log('═══════════════════════════════════════════════════════════════');
2113
+ console.log('');
2114
+ if (!options.crashes && data.stats.totalCrashes24h > 0) {
2115
+ console.log(' Tip: Run `agent-relay health --crashes` to see crash details');
2116
+ }
2117
+ if (!options.alerts && data.stats.totalAlerts24h > 0) {
2118
+ console.log(' Tip: Run `agent-relay health --alerts` to see alerts');
2119
+ }
2120
+ console.log('');
2121
+ }
2122
+ catch (err) {
2123
+ if (err.code === 'ECONNREFUSED') {
2124
+ console.error(`Cannot connect to dashboard at port ${port}. Is the daemon running?`);
2125
+ console.log(`Run 'agent-relay up' to start the daemon.`);
2126
+ }
2127
+ else {
2128
+ console.error(`Failed to fetch health data: ${err.message}`);
2129
+ }
2130
+ process.exit(1);
2131
+ }
2132
+ });
2133
+ // profile - Run agent with profiling enabled
2134
+ program
2135
+ .command('profile')
2136
+ .description('Run an agent with memory profiling enabled')
2137
+ .argument('<command...>', 'Command to profile')
2138
+ .option('-n, --name <name>', 'Agent name')
2139
+ .option('--heap-snapshot-interval <ms>', 'Take heap snapshots at interval (ms)', '60000')
2140
+ .option('--output-dir <dir>', 'Directory for profile output', './profiles')
2141
+ .option('--expose-gc', 'Expose garbage collector for manual GC')
2142
+ .action(async (commandParts, options) => {
2143
+ const { getProjectPaths } = await import('../utils/project-namespace.js');
2144
+ if (!commandParts || commandParts.length === 0) {
2145
+ console.error('No command specified');
2146
+ process.exit(1);
2147
+ }
2148
+ const [cmd, ...args] = commandParts;
2149
+ const agentName = options.name ?? generateAgentName();
2150
+ const outputDir = options.outputDir || './profiles';
2151
+ const snapshotInterval = parseInt(options.heapSnapshotInterval || '60000', 10);
2152
+ // Create output directory
2153
+ if (!fs.existsSync(outputDir)) {
2154
+ fs.mkdirSync(outputDir, { recursive: true });
2155
+ }
2156
+ console.log('');
2157
+ console.log('🔬 Agent Relay Profiler');
2158
+ console.log('');
2159
+ console.log(` Agent: ${agentName}`);
2160
+ console.log(` Command: ${cmd} ${args.join(' ')}`);
2161
+ console.log(` Output: ${outputDir}`);
2162
+ console.log(` Heap snapshots: every ${snapshotInterval}ms`);
2163
+ console.log('');
2164
+ // Build Node.js flags for profiling
2165
+ const nodeFlags = [
2166
+ '--inspect', // Enable inspector
2167
+ '--inspect-brk=0', // Don't actually break, just enable
2168
+ ];
2169
+ if (options.exposeGc) {
2170
+ nodeFlags.push('--expose-gc');
2171
+ }
2172
+ // Set environment variables for profiling
2173
+ const profileEnv = {
2174
+ ...process.env,
2175
+ NODE_OPTIONS: `${process.env.NODE_OPTIONS || ''} ${nodeFlags.join(' ')}`.trim(),
2176
+ AGENT_RELAY_PROFILE_ENABLED: '1',
2177
+ AGENT_RELAY_PROFILE_OUTPUT: outputDir,
2178
+ AGENT_RELAY_PROFILE_INTERVAL: snapshotInterval.toString(),
2179
+ };
2180
+ console.log('Starting profiled agent...');
2181
+ console.log('');
2182
+ // Use the regular wrapper but with profiling environment
2183
+ const paths = getProjectPaths();
2184
+ const { TmuxWrapper } = await import('../wrapper/tmux-wrapper.js');
2185
+ const wrapper = new TmuxWrapper({
2186
+ name: agentName,
2187
+ command: cmd,
2188
+ args,
2189
+ socketPath: paths.socketPath,
2190
+ debug: true,
2191
+ env: profileEnv,
2192
+ useInbox: true,
2193
+ inboxDir: paths.dataDir,
2194
+ });
2195
+ // Start memory sampling
2196
+ const sampleInterval = setInterval(() => {
2197
+ const memUsage = process.memoryUsage();
2198
+ const timestamp = new Date().toISOString();
2199
+ const sample = {
2200
+ timestamp,
2201
+ heapUsed: memUsage.heapUsed,
2202
+ heapTotal: memUsage.heapTotal,
2203
+ external: memUsage.external,
2204
+ rss: memUsage.rss,
2205
+ };
2206
+ // Append to samples file
2207
+ const samplesFile = path.join(outputDir, `${agentName}-memory.jsonl`);
2208
+ fs.appendFileSync(samplesFile, JSON.stringify(sample) + '\n');
2209
+ }, 5000);
2210
+ process.on('SIGINT', async () => {
2211
+ clearInterval(sampleInterval);
2212
+ console.log('\n');
2213
+ console.log('Profiling stopped.');
2214
+ console.log('');
2215
+ console.log(`Profile data saved to: ${outputDir}/`);
2216
+ console.log(` - ${agentName}-memory.jsonl (memory samples)`);
2217
+ console.log('');
2218
+ console.log('To analyze:');
2219
+ console.log(` 1. Open chrome://inspect in Chrome`);
2220
+ console.log(` 2. Load CPU/heap profiles from ${outputDir}/`);
2221
+ console.log('');
2222
+ wrapper.stop();
2223
+ process.exit(0);
2224
+ });
2225
+ await wrapper.start();
2226
+ console.log(`Profiling ${agentName}... Press Ctrl+C to stop.`);
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
+ });
1827
2440
  program.parse();
1828
2441
  //# sourceMappingURL=index.js.map