agent-relay 2.0.0 → 2.0.4

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 (360) hide show
  1. package/deploy/workspace/entrypoint.sh +4 -0
  2. package/dist/dashboard/out/404.html +1 -1
  3. package/dist/dashboard/out/app/onboarding.html +1 -1
  4. package/dist/dashboard/out/app/onboarding.txt +1 -1
  5. package/dist/dashboard/out/app.html +1 -1
  6. package/dist/dashboard/out/app.txt +1 -1
  7. package/dist/dashboard/out/cloud/link.html +1 -1
  8. package/dist/dashboard/out/cloud/link.txt +1 -1
  9. package/dist/dashboard/out/connect-repos.html +1 -1
  10. package/dist/dashboard/out/connect-repos.txt +1 -1
  11. package/dist/dashboard/out/history.html +1 -1
  12. package/dist/dashboard/out/history.txt +1 -1
  13. package/dist/dashboard/out/index.html +1 -1
  14. package/dist/dashboard/out/index.txt +1 -1
  15. package/dist/dashboard/out/login.html +1 -1
  16. package/dist/dashboard/out/login.txt +1 -1
  17. package/dist/dashboard/out/metrics.html +1 -1
  18. package/dist/dashboard/out/metrics.txt +1 -1
  19. package/dist/dashboard/out/pricing.html +1 -1
  20. package/dist/dashboard/out/pricing.txt +1 -1
  21. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  22. package/dist/dashboard/out/providers/setup/claude.txt +1 -1
  23. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  24. package/dist/dashboard/out/providers/setup/codex.txt +1 -1
  25. package/dist/dashboard/out/providers/setup/cursor.html +1 -1
  26. package/dist/dashboard/out/providers/setup/cursor.txt +1 -1
  27. package/dist/dashboard/out/providers.html +1 -1
  28. package/dist/dashboard/out/providers.txt +1 -1
  29. package/dist/dashboard/out/signup.html +1 -1
  30. package/dist/dashboard/out/signup.txt +1 -1
  31. package/dist/src/cli/index.js +7 -5
  32. package/package.json +10 -10
  33. package/packages/api-types/package.json +1 -1
  34. package/packages/bridge/dist/spawner.js +3 -1
  35. package/packages/bridge/package.json +12 -7
  36. package/packages/cloud/package.json +11 -6
  37. package/packages/config/dist/project-namespace.d.ts +4 -0
  38. package/packages/config/dist/project-namespace.js +8 -0
  39. package/packages/config/dist/relay-config.d.ts +14 -6
  40. package/packages/config/dist/relay-config.js +14 -6
  41. package/packages/config/package.json +7 -2
  42. package/packages/continuity/package.json +6 -1
  43. package/packages/daemon/package.json +16 -11
  44. package/packages/dashboard/dist/server.js +89 -17
  45. package/packages/dashboard/package.json +14 -22
  46. package/packages/dashboard/ui/react-components/SpawnModal.tsx +119 -29
  47. package/packages/dashboard/ui-dist/404.html +1 -1
  48. package/packages/dashboard/ui-dist/_next/static/chunks/677-7323947c23b35979.js +1 -0
  49. package/packages/dashboard/ui-dist/app/onboarding.html +1 -1
  50. package/packages/dashboard/ui-dist/app/onboarding.txt +1 -1
  51. package/packages/dashboard/ui-dist/app.html +1 -1
  52. package/packages/dashboard/ui-dist/app.txt +1 -1
  53. package/packages/dashboard/ui-dist/cloud/link.html +1 -1
  54. package/packages/dashboard/ui-dist/cloud/link.txt +1 -1
  55. package/packages/dashboard/ui-dist/connect-repos.html +1 -1
  56. package/packages/dashboard/ui-dist/connect-repos.txt +1 -1
  57. package/packages/dashboard/ui-dist/history.html +1 -1
  58. package/packages/dashboard/ui-dist/history.txt +1 -1
  59. package/packages/dashboard/ui-dist/index.html +1 -1
  60. package/packages/dashboard/ui-dist/index.txt +1 -1
  61. package/packages/dashboard/ui-dist/login.html +1 -1
  62. package/packages/dashboard/ui-dist/login.txt +1 -1
  63. package/packages/dashboard/ui-dist/metrics.html +1 -1
  64. package/packages/dashboard/ui-dist/metrics.txt +1 -1
  65. package/packages/dashboard/ui-dist/pricing.html +1 -1
  66. package/packages/dashboard/ui-dist/pricing.txt +1 -1
  67. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -1
  68. package/packages/dashboard/ui-dist/providers/setup/claude.txt +1 -1
  69. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -1
  70. package/packages/dashboard/ui-dist/providers/setup/codex.txt +1 -1
  71. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -1
  72. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +1 -1
  73. package/packages/dashboard/ui-dist/providers.html +1 -1
  74. package/packages/dashboard/ui-dist/providers.txt +1 -1
  75. package/packages/dashboard/ui-dist/signup.html +1 -1
  76. package/packages/dashboard/ui-dist/signup.txt +1 -1
  77. package/packages/dashboard-server/package.json +18 -12
  78. package/packages/hooks/package.json +9 -4
  79. package/packages/mcp/README.md +135 -19
  80. package/packages/mcp/dist/cloud.js +50 -1
  81. package/packages/mcp/package.json +1 -1
  82. package/packages/memory/package.json +7 -2
  83. package/packages/policy/package.json +7 -2
  84. package/packages/protocol/package.json +6 -1
  85. package/packages/resiliency/package.json +6 -1
  86. package/packages/sdk/README.md +160 -43
  87. package/packages/sdk/dist/client.d.ts +99 -3
  88. package/packages/sdk/dist/client.js +113 -6
  89. package/packages/sdk/dist/discovery.d.ts +29 -0
  90. package/packages/sdk/dist/discovery.js +126 -0
  91. package/packages/sdk/dist/index.d.ts +1 -0
  92. package/packages/sdk/dist/index.js +2 -0
  93. package/packages/sdk/dist/standalone.js +1 -0
  94. package/packages/sdk/package.json +2 -2
  95. package/packages/spawner/package.json +2 -2
  96. package/packages/state/package.json +6 -1
  97. package/packages/storage/package.json +7 -2
  98. package/packages/trajectory/package.json +7 -2
  99. package/packages/user-directory/package.json +7 -2
  100. package/packages/utils/package.json +6 -1
  101. package/packages/wrapper/dist/base-wrapper.d.ts +25 -1
  102. package/packages/wrapper/dist/base-wrapper.js +44 -2
  103. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +2 -0
  104. package/packages/wrapper/dist/relay-pty-orchestrator.js +55 -10
  105. package/packages/wrapper/dist/shared.d.ts +25 -0
  106. package/packages/wrapper/dist/shared.js +40 -0
  107. package/packages/wrapper/dist/tmux-wrapper.d.ts +7 -0
  108. package/packages/wrapper/dist/tmux-wrapper.js +62 -9
  109. package/packages/wrapper/package.json +7 -7
  110. package/.turbo/cache/013415461711937f-meta.json +0 -1
  111. package/.turbo/cache/013415461711937f.tar.zst +0 -0
  112. package/.turbo/cache/0562b1ff326acd6d-meta.json +0 -1
  113. package/.turbo/cache/0562b1ff326acd6d.tar.zst +0 -0
  114. package/.turbo/cache/0b46e0e17254882f-meta.json +0 -1
  115. package/.turbo/cache/0b46e0e17254882f.tar.zst +0 -0
  116. package/.turbo/cache/3799eda981d53d14-meta.json +0 -1
  117. package/.turbo/cache/3799eda981d53d14.tar.zst +0 -0
  118. package/.turbo/cache/47e9d8f404ed064d-meta.json +0 -1
  119. package/.turbo/cache/47e9d8f404ed064d.tar.zst +0 -0
  120. package/.turbo/cache/4cde1d1e5b298099-meta.json +0 -1
  121. package/.turbo/cache/4cde1d1e5b298099.tar.zst +0 -0
  122. package/.turbo/cache/538eea955c0936ef-meta.json +0 -1
  123. package/.turbo/cache/538eea955c0936ef.tar.zst +0 -0
  124. package/.turbo/cache/5dceac7f229f5d5d-meta.json +0 -1
  125. package/.turbo/cache/5dceac7f229f5d5d.tar.zst +0 -0
  126. package/.turbo/cache/64c15b201819367d-meta.json +0 -1
  127. package/.turbo/cache/64c15b201819367d.tar.zst +0 -0
  128. package/.turbo/cache/6d6a21a05efca434-meta.json +0 -1
  129. package/.turbo/cache/6d6a21a05efca434.tar.zst +0 -0
  130. package/.turbo/cache/7562610cb03ec040-meta.json +0 -1
  131. package/.turbo/cache/7562610cb03ec040.tar.zst +0 -0
  132. package/.turbo/cache/81a2456e17af4d7f-meta.json +0 -1
  133. package/.turbo/cache/81a2456e17af4d7f.tar.zst +0 -0
  134. package/.turbo/cache/823fc2a7b12f724c-meta.json +0 -1
  135. package/.turbo/cache/823fc2a7b12f724c.tar.zst +0 -0
  136. package/.turbo/cache/9daad16a073d1f91-meta.json +0 -1
  137. package/.turbo/cache/9daad16a073d1f91.tar.zst +0 -0
  138. package/.turbo/cache/b81ccbab0a606b60-meta.json +0 -1
  139. package/.turbo/cache/b81ccbab0a606b60.tar.zst +0 -0
  140. package/.turbo/cache/cf98487988bfcf91-meta.json +0 -1
  141. package/.turbo/cache/cf98487988bfcf91.tar.zst +0 -0
  142. package/.turbo/cache/cfdf7c57dca71f27-meta.json +0 -1
  143. package/.turbo/cache/cfdf7c57dca71f27.tar.zst +0 -0
  144. package/.turbo/cache/d3063ef43811b1e5-meta.json +0 -1
  145. package/.turbo/cache/d3063ef43811b1e5.tar.zst +0 -0
  146. package/.turbo/cache/de28892eb7678e65-meta.json +0 -1
  147. package/.turbo/cache/de28892eb7678e65.tar.zst +0 -0
  148. package/.turbo/cache/ec29adce408132ba-meta.json +0 -1
  149. package/.turbo/cache/ec29adce408132ba.tar.zst +0 -0
  150. package/.turbo/cache/f70450d8d305f172-meta.json +0 -1
  151. package/.turbo/cache/f70450d8d305f172.tar.zst +0 -0
  152. package/.turbo/cache/fe384d5d6b7a983a-meta.json +0 -1
  153. package/.turbo/cache/fe384d5d6b7a983a.tar.zst +0 -0
  154. package/bin/relay-pty +0 -0
  155. package/packages/dashboard/ui/.next/BUILD_ID +0 -1
  156. package/packages/dashboard/ui/.next/app-build-manifest.json +0 -135
  157. package/packages/dashboard/ui/.next/app-path-routes-manifest.json +0 -1
  158. package/packages/dashboard/ui/.next/build-manifest.json +0 -32
  159. package/packages/dashboard/ui/.next/cache/config.json +0 -7
  160. package/packages/dashboard/ui/.next/cache/eslint/.cache_1asv1h5 +0 -1
  161. package/packages/dashboard/ui/.next/cache/webpack/client-production/0.pack +0 -0
  162. package/packages/dashboard/ui/.next/cache/webpack/client-production/index.pack +0 -0
  163. package/packages/dashboard/ui/.next/cache/webpack/edge-server-production/0.pack +0 -0
  164. package/packages/dashboard/ui/.next/cache/webpack/edge-server-production/index.pack +0 -0
  165. package/packages/dashboard/ui/.next/cache/webpack/server-production/0.pack +0 -0
  166. package/packages/dashboard/ui/.next/cache/webpack/server-production/index.pack +0 -0
  167. package/packages/dashboard/ui/.next/export-detail.json +0 -1
  168. package/packages/dashboard/ui/.next/export-marker.json +0 -1
  169. package/packages/dashboard/ui/.next/images-manifest.json +0 -1
  170. package/packages/dashboard/ui/.next/next-minimal-server.js.nft.json +0 -1
  171. package/packages/dashboard/ui/.next/next-server.js.nft.json +0 -1
  172. package/packages/dashboard/ui/.next/package.json +0 -1
  173. package/packages/dashboard/ui/.next/prerender-manifest.json +0 -1
  174. package/packages/dashboard/ui/.next/react-loadable-manifest.json +0 -1970
  175. package/packages/dashboard/ui/.next/required-server-files.json +0 -1
  176. package/packages/dashboard/ui/.next/routes-manifest.json +0 -1
  177. package/packages/dashboard/ui/.next/server/app/_not-found/page.js +0 -1
  178. package/packages/dashboard/ui/.next/server/app/_not-found/page.js.nft.json +0 -1
  179. package/packages/dashboard/ui/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  180. package/packages/dashboard/ui/.next/server/app/_not-found.html +0 -1
  181. package/packages/dashboard/ui/.next/server/app/_not-found.meta +0 -6
  182. package/packages/dashboard/ui/.next/server/app/_not-found.rsc +0 -9
  183. package/packages/dashboard/ui/.next/server/app/app/onboarding/page.js +0 -6
  184. package/packages/dashboard/ui/.next/server/app/app/onboarding/page.js.nft.json +0 -1
  185. package/packages/dashboard/ui/.next/server/app/app/onboarding/page_client-reference-manifest.js +0 -1
  186. package/packages/dashboard/ui/.next/server/app/app/onboarding.html +0 -1
  187. package/packages/dashboard/ui/.next/server/app/app/onboarding.meta +0 -5
  188. package/packages/dashboard/ui/.next/server/app/app/onboarding.rsc +0 -7
  189. package/packages/dashboard/ui/.next/server/app/app/page.js +0 -436
  190. package/packages/dashboard/ui/.next/server/app/app/page.js.nft.json +0 -1
  191. package/packages/dashboard/ui/.next/server/app/app/page_client-reference-manifest.js +0 -1
  192. package/packages/dashboard/ui/.next/server/app/app.html +0 -1
  193. package/packages/dashboard/ui/.next/server/app/app.meta +0 -5
  194. package/packages/dashboard/ui/.next/server/app/app.rsc +0 -7
  195. package/packages/dashboard/ui/.next/server/app/apple-icon.png/route.js +0 -12
  196. package/packages/dashboard/ui/.next/server/app/apple-icon.png/route.js.nft.json +0 -1
  197. package/packages/dashboard/ui/.next/server/app/apple-icon.png.body +0 -0
  198. package/packages/dashboard/ui/.next/server/app/apple-icon.png.meta +0 -1
  199. package/packages/dashboard/ui/.next/server/app/cloud/link/page.js +0 -1
  200. package/packages/dashboard/ui/.next/server/app/cloud/link/page.js.nft.json +0 -1
  201. package/packages/dashboard/ui/.next/server/app/cloud/link/page_client-reference-manifest.js +0 -1
  202. package/packages/dashboard/ui/.next/server/app/cloud/link.html +0 -1
  203. package/packages/dashboard/ui/.next/server/app/cloud/link.meta +0 -5
  204. package/packages/dashboard/ui/.next/server/app/cloud/link.rsc +0 -7
  205. package/packages/dashboard/ui/.next/server/app/connect-repos/page.js +0 -6
  206. package/packages/dashboard/ui/.next/server/app/connect-repos/page.js.nft.json +0 -1
  207. package/packages/dashboard/ui/.next/server/app/connect-repos/page_client-reference-manifest.js +0 -1
  208. package/packages/dashboard/ui/.next/server/app/connect-repos.html +0 -1
  209. package/packages/dashboard/ui/.next/server/app/connect-repos.meta +0 -5
  210. package/packages/dashboard/ui/.next/server/app/connect-repos.rsc +0 -7
  211. package/packages/dashboard/ui/.next/server/app/history/page.js +0 -1
  212. package/packages/dashboard/ui/.next/server/app/history/page.js.nft.json +0 -1
  213. package/packages/dashboard/ui/.next/server/app/history/page_client-reference-manifest.js +0 -1
  214. package/packages/dashboard/ui/.next/server/app/history.html +0 -1
  215. package/packages/dashboard/ui/.next/server/app/history.meta +0 -5
  216. package/packages/dashboard/ui/.next/server/app/history.rsc +0 -7
  217. package/packages/dashboard/ui/.next/server/app/index.html +0 -1
  218. package/packages/dashboard/ui/.next/server/app/index.meta +0 -5
  219. package/packages/dashboard/ui/.next/server/app/index.rsc +0 -7
  220. package/packages/dashboard/ui/.next/server/app/login/page.js +0 -6
  221. package/packages/dashboard/ui/.next/server/app/login/page.js.nft.json +0 -1
  222. package/packages/dashboard/ui/.next/server/app/login/page_client-reference-manifest.js +0 -1
  223. package/packages/dashboard/ui/.next/server/app/login.html +0 -5
  224. package/packages/dashboard/ui/.next/server/app/login.meta +0 -5
  225. package/packages/dashboard/ui/.next/server/app/login.rsc +0 -7
  226. package/packages/dashboard/ui/.next/server/app/metrics/page.js +0 -1
  227. package/packages/dashboard/ui/.next/server/app/metrics/page.js.nft.json +0 -1
  228. package/packages/dashboard/ui/.next/server/app/metrics/page_client-reference-manifest.js +0 -1
  229. package/packages/dashboard/ui/.next/server/app/metrics.html +0 -1
  230. package/packages/dashboard/ui/.next/server/app/metrics.meta +0 -5
  231. package/packages/dashboard/ui/.next/server/app/metrics.rsc +0 -7
  232. package/packages/dashboard/ui/.next/server/app/page.js +0 -1
  233. package/packages/dashboard/ui/.next/server/app/page.js.nft.json +0 -1
  234. package/packages/dashboard/ui/.next/server/app/page_client-reference-manifest.js +0 -1
  235. package/packages/dashboard/ui/.next/server/app/pricing/page.js +0 -5
  236. package/packages/dashboard/ui/.next/server/app/pricing/page.js.nft.json +0 -1
  237. package/packages/dashboard/ui/.next/server/app/pricing/page_client-reference-manifest.js +0 -1
  238. package/packages/dashboard/ui/.next/server/app/pricing.html +0 -13
  239. package/packages/dashboard/ui/.next/server/app/pricing.meta +0 -5
  240. package/packages/dashboard/ui/.next/server/app/pricing.rsc +0 -7
  241. package/packages/dashboard/ui/.next/server/app/providers/page.js +0 -2
  242. package/packages/dashboard/ui/.next/server/app/providers/page.js.nft.json +0 -1
  243. package/packages/dashboard/ui/.next/server/app/providers/page_client-reference-manifest.js +0 -1
  244. package/packages/dashboard/ui/.next/server/app/providers/setup/[provider]/page.js +0 -1
  245. package/packages/dashboard/ui/.next/server/app/providers/setup/[provider]/page.js.nft.json +0 -1
  246. package/packages/dashboard/ui/.next/server/app/providers/setup/[provider]/page_client-reference-manifest.js +0 -1
  247. package/packages/dashboard/ui/.next/server/app/providers/setup/claude.html +0 -1
  248. package/packages/dashboard/ui/.next/server/app/providers/setup/claude.meta +0 -5
  249. package/packages/dashboard/ui/.next/server/app/providers/setup/claude.rsc +0 -8
  250. package/packages/dashboard/ui/.next/server/app/providers/setup/codex.html +0 -1
  251. package/packages/dashboard/ui/.next/server/app/providers/setup/codex.meta +0 -5
  252. package/packages/dashboard/ui/.next/server/app/providers/setup/codex.rsc +0 -8
  253. package/packages/dashboard/ui/.next/server/app/providers/setup/cursor.html +0 -1
  254. package/packages/dashboard/ui/.next/server/app/providers/setup/cursor.meta +0 -5
  255. package/packages/dashboard/ui/.next/server/app/providers/setup/cursor.rsc +0 -8
  256. package/packages/dashboard/ui/.next/server/app/providers.html +0 -1
  257. package/packages/dashboard/ui/.next/server/app/providers.meta +0 -5
  258. package/packages/dashboard/ui/.next/server/app/providers.rsc +0 -7
  259. package/packages/dashboard/ui/.next/server/app/signup/page.js +0 -6
  260. package/packages/dashboard/ui/.next/server/app/signup/page.js.nft.json +0 -1
  261. package/packages/dashboard/ui/.next/server/app/signup/page_client-reference-manifest.js +0 -1
  262. package/packages/dashboard/ui/.next/server/app/signup.html +0 -6
  263. package/packages/dashboard/ui/.next/server/app/signup.meta +0 -5
  264. package/packages/dashboard/ui/.next/server/app/signup.rsc +0 -7
  265. package/packages/dashboard/ui/.next/server/app-paths-manifest.json +0 -16
  266. package/packages/dashboard/ui/.next/server/chunks/190.js +0 -1
  267. package/packages/dashboard/ui/.next/server/chunks/205.js +0 -1
  268. package/packages/dashboard/ui/.next/server/chunks/251.js +0 -9
  269. package/packages/dashboard/ui/.next/server/chunks/288.js +0 -1
  270. package/packages/dashboard/ui/.next/server/chunks/434.js +0 -1
  271. package/packages/dashboard/ui/.next/server/chunks/471.js +0 -2
  272. package/packages/dashboard/ui/.next/server/chunks/621.js +0 -1
  273. package/packages/dashboard/ui/.next/server/chunks/680.js +0 -5
  274. package/packages/dashboard/ui/.next/server/chunks/682.js +0 -6
  275. package/packages/dashboard/ui/.next/server/chunks/684.js +0 -1
  276. package/packages/dashboard/ui/.next/server/chunks/71.js +0 -196
  277. package/packages/dashboard/ui/.next/server/chunks/711.js +0 -1
  278. package/packages/dashboard/ui/.next/server/chunks/90.js +0 -17
  279. package/packages/dashboard/ui/.next/server/chunks/948.js +0 -2
  280. package/packages/dashboard/ui/.next/server/chunks/font-manifest.json +0 -1
  281. package/packages/dashboard/ui/.next/server/font-manifest.json +0 -1
  282. package/packages/dashboard/ui/.next/server/functions-config-manifest.json +0 -1
  283. package/packages/dashboard/ui/.next/server/interception-route-rewrite-manifest.js +0 -1
  284. package/packages/dashboard/ui/.next/server/middleware-build-manifest.js +0 -1
  285. package/packages/dashboard/ui/.next/server/middleware-manifest.json +0 -6
  286. package/packages/dashboard/ui/.next/server/middleware-react-loadable-manifest.js +0 -1
  287. package/packages/dashboard/ui/.next/server/next-font-manifest.js +0 -1
  288. package/packages/dashboard/ui/.next/server/next-font-manifest.json +0 -1
  289. package/packages/dashboard/ui/.next/server/pages/404.html +0 -1
  290. package/packages/dashboard/ui/.next/server/pages/500.html +0 -1
  291. package/packages/dashboard/ui/.next/server/pages/_app.js +0 -1
  292. package/packages/dashboard/ui/.next/server/pages/_app.js.nft.json +0 -1
  293. package/packages/dashboard/ui/.next/server/pages/_document.js +0 -1
  294. package/packages/dashboard/ui/.next/server/pages/_document.js.nft.json +0 -1
  295. package/packages/dashboard/ui/.next/server/pages/_error.js +0 -1
  296. package/packages/dashboard/ui/.next/server/pages/_error.js.nft.json +0 -1
  297. package/packages/dashboard/ui/.next/server/pages-manifest.json +0 -1
  298. package/packages/dashboard/ui/.next/server/server-reference-manifest.js +0 -1
  299. package/packages/dashboard/ui/.next/server/server-reference-manifest.json +0 -1
  300. package/packages/dashboard/ui/.next/server/webpack-runtime.js +0 -1
  301. package/packages/dashboard/ui/.next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  302. package/packages/dashboard/ui/.next/static/chunks/117-c8afed19e821a35d.js +0 -2
  303. package/packages/dashboard/ui/.next/static/chunks/282-980c2eb8fff20123.js +0 -1
  304. package/packages/dashboard/ui/.next/static/chunks/532-bace199897eeab37.js +0 -9
  305. package/packages/dashboard/ui/.next/static/chunks/631-af51bad94027527a.js +0 -1
  306. package/packages/dashboard/ui/.next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  307. package/packages/dashboard/ui/.next/static/chunks/677-30e60cb0b47875b6.js +0 -1
  308. package/packages/dashboard/ui/.next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  309. package/packages/dashboard/ui/.next/static/chunks/83-4f08122d4e7e79a6.js +0 -1
  310. package/packages/dashboard/ui/.next/static/chunks/847-f1f467060f32afff.js +0 -1
  311. package/packages/dashboard/ui/.next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  312. package/packages/dashboard/ui/.next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  313. package/packages/dashboard/ui/.next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  314. package/packages/dashboard/ui/.next/static/chunks/app/app/page-44813aa26ad19681.js +0 -1
  315. package/packages/dashboard/ui/.next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  316. package/packages/dashboard/ui/.next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  317. package/packages/dashboard/ui/.next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  318. package/packages/dashboard/ui/.next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  319. package/packages/dashboard/ui/.next/static/chunks/app/login/page-a0ca6f7ca6a100b8.js +0 -1
  320. package/packages/dashboard/ui/.next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  321. package/packages/dashboard/ui/.next/static/chunks/app/page-7993778218818ace.js +0 -1
  322. package/packages/dashboard/ui/.next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  323. package/packages/dashboard/ui/.next/static/chunks/app/providers/page-bcf46064ac4474ce.js +0 -1
  324. package/packages/dashboard/ui/.next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  325. package/packages/dashboard/ui/.next/static/chunks/app/signup/page-1ede2205b58649ca.js +0 -1
  326. package/packages/dashboard/ui/.next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  327. package/packages/dashboard/ui/.next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  328. package/packages/dashboard/ui/.next/static/chunks/framework-f66176bb897dc684.js +0 -1
  329. package/packages/dashboard/ui/.next/static/chunks/main-5a40a5ae29646e1b.js +0 -1
  330. package/packages/dashboard/ui/.next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  331. package/packages/dashboard/ui/.next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  332. package/packages/dashboard/ui/.next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  333. package/packages/dashboard/ui/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  334. package/packages/dashboard/ui/.next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  335. package/packages/dashboard/ui/.next/static/css/4034f236dd1a3178.css +0 -1
  336. package/packages/dashboard/ui/.next/static/css/99c2552394077586.css +0 -1
  337. package/packages/dashboard/ui/.next/trace +0 -63
  338. package/packages/dashboard/ui/.next/types/app/app/onboarding/page.ts +0 -79
  339. package/packages/dashboard/ui/.next/types/app/app/page.ts +0 -79
  340. package/packages/dashboard/ui/.next/types/app/cloud/link/page.ts +0 -79
  341. package/packages/dashboard/ui/.next/types/app/connect-repos/page.ts +0 -79
  342. package/packages/dashboard/ui/.next/types/app/history/page.ts +0 -79
  343. package/packages/dashboard/ui/.next/types/app/layout.ts +0 -79
  344. package/packages/dashboard/ui/.next/types/app/login/page.ts +0 -79
  345. package/packages/dashboard/ui/.next/types/app/metrics/page.ts +0 -79
  346. package/packages/dashboard/ui/.next/types/app/page.ts +0 -79
  347. package/packages/dashboard/ui/.next/types/app/pricing/page.ts +0 -79
  348. package/packages/dashboard/ui/.next/types/app/providers/page.ts +0 -79
  349. package/packages/dashboard/ui/.next/types/app/providers/setup/[provider]/page.ts +0 -79
  350. package/packages/dashboard/ui/.next/types/app/signup/page.ts +0 -79
  351. package/packages/dashboard/ui/.next/types/package.json +0 -1
  352. package/packages/dashboard/ui-dist/_next/static/chunks/677-30e60cb0b47875b6.js +0 -1
  353. /package/dist/dashboard/out/_next/static/{ZCFjHbkF8yDKS2md3lVgb → 72btMIJ64BCAB4UgVkpaq}/_buildManifest.js +0 -0
  354. /package/dist/dashboard/out/_next/static/{ZCFjHbkF8yDKS2md3lVgb → 72btMIJ64BCAB4UgVkpaq}/_ssgManifest.js +0 -0
  355. /package/packages/dashboard/ui-dist/_next/static/{HR7W9z1PPVPFqUboUVZFZ → 0AsOfRemPXJmtynCKT-rx}/_buildManifest.js +0 -0
  356. /package/packages/dashboard/ui-dist/_next/static/{HR7W9z1PPVPFqUboUVZFZ → 0AsOfRemPXJmtynCKT-rx}/_ssgManifest.js +0 -0
  357. /package/packages/dashboard/ui-dist/_next/static/{ZCFjHbkF8yDKS2md3lVgb → 72btMIJ64BCAB4UgVkpaq}/_buildManifest.js +0 -0
  358. /package/packages/dashboard/ui-dist/_next/static/{ZCFjHbkF8yDKS2md3lVgb → 72btMIJ64BCAB4UgVkpaq}/_ssgManifest.js +0 -0
  359. /package/packages/dashboard/{ui/.next/static/HR7W9z1PPVPFqUboUVZFZ → ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU}/_buildManifest.js +0 -0
  360. /package/packages/dashboard/{ui/.next/static/HR7W9z1PPVPFqUboUVZFZ → ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU}/_ssgManifest.js +0 -0
@@ -3,4 +3,4 @@
3
3
  transition-all duration-300
4
4
  drop-shadow-[0_0_8px_rgba(0,217,255,0.3)]
5
5
 
6
- " aria-label="Agent Relay Logo" role="img"><path d="M30 80 L 50 20 L 70 80" stroke="#00d9ff" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill="none"></path><line x1="40" y1="50" x2="60" y2="50" stroke="#00d9ff" stroke-width="5" stroke-linecap="round"></line><path d="M50 20 L 50 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" opacity="0.7"></path><path d="M50 20 C 80 20 80 50 50 50 L 80 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"></path></svg><h1 class="mt-4 text-3xl font-bold text-white">Get Started</h1><p class="mt-2 text-text-muted text-center">Create your account and start orchestrating AI agents</p></div><div class="bg-bg-primary/80 backdrop-blur-sm border border-border-subtle rounded-2xl p-8 shadow-xl"><div><div class="mb-6 space-y-3"><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-accent-cyan/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-accent-cyan" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg></div><span>Deploy AI agents in seconds</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#00ffc8]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#00ffc8]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg></div><span>Real-time agent collaboration</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#0891b2]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#0891b2]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><span>Secure credential management</span></div></div><button type="button" disabled="" class="w-full py-4 px-6 bg-[#24292e] hover:bg-[#2f363d] border border-[#444d56] rounded-xl text-white font-medium flex items-center justify-center gap-3 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"><svg class="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg><span>Loading...</span></button><p class="mt-6 text-center text-text-muted text-sm">By signing up, you agree to our<!-- --> <a href="/terms" class="text-accent-cyan hover:underline">Terms of Service</a> <!-- -->and<!-- --> <a href="/privacy" class="text-accent-cyan hover:underline">Privacy Policy</a></p></div></div><div class="mt-6 text-center"><p class="text-text-muted">Already have an account?<!-- --> <a href="/login" class="text-accent-cyan hover:underline font-medium">Sign in</a></p></div><div class="mt-4 text-center"><a href="/" class="text-text-muted hover:text-white transition-colors text-sm">Back to home</a></div></div></div><script src="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/99c2552394077586.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[4665,[\"282\",\"static/chunks/282-980c2eb8fff20123.js\",\"966\",\"static/chunks/app/signup/page-18a4665665f6be11.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"ZCFjHbkF8yDKS2md3lVgb\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"signup\"],\"initialTree\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"signup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/99c2552394077586.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Agent Relay Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Fleet control dashboard for Agent Relay\"}],[\"$\",\"link\",\"4\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?9e7a840704165ca6\",\"type\":\"image/png\",\"sizes\":\"256x256\"}]]\n3:null\n"])</script></body></html>
6
+ " aria-label="Agent Relay Logo" role="img"><path d="M30 80 L 50 20 L 70 80" stroke="#00d9ff" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill="none"></path><line x1="40" y1="50" x2="60" y2="50" stroke="#00d9ff" stroke-width="5" stroke-linecap="round"></line><path d="M50 20 L 50 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" opacity="0.7"></path><path d="M50 20 C 80 20 80 50 50 50 L 80 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"></path></svg><h1 class="mt-4 text-3xl font-bold text-white">Get Started</h1><p class="mt-2 text-text-muted text-center">Create your account and start orchestrating AI agents</p></div><div class="bg-bg-primary/80 backdrop-blur-sm border border-border-subtle rounded-2xl p-8 shadow-xl"><div><div class="mb-6 space-y-3"><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-accent-cyan/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-accent-cyan" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg></div><span>Deploy AI agents in seconds</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#00ffc8]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#00ffc8]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg></div><span>Real-time agent collaboration</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#0891b2]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#0891b2]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><span>Secure credential management</span></div></div><button type="button" disabled="" class="w-full py-4 px-6 bg-[#24292e] hover:bg-[#2f363d] border border-[#444d56] rounded-xl text-white font-medium flex items-center justify-center gap-3 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"><svg class="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg><span>Loading...</span></button><p class="mt-6 text-center text-text-muted text-sm">By signing up, you agree to our<!-- --> <a href="/terms" class="text-accent-cyan hover:underline">Terms of Service</a> <!-- -->and<!-- --> <a href="/privacy" class="text-accent-cyan hover:underline">Privacy Policy</a></p></div></div><div class="mt-6 text-center"><p class="text-text-muted">Already have an account?<!-- --> <a href="/login" class="text-accent-cyan hover:underline font-medium">Sign in</a></p></div><div class="mt-4 text-center"><a href="/" class="text-text-muted hover:text-white transition-colors text-sm">Back to home</a></div></div></div><script src="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/99c2552394077586.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[4665,[\"282\",\"static/chunks/282-980c2eb8fff20123.js\",\"966\",\"static/chunks/app/signup/page-18a4665665f6be11.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"72btMIJ64BCAB4UgVkpaq\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"signup\"],\"initialTree\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"signup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/99c2552394077586.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Agent Relay Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Fleet control dashboard for Agent Relay\"}],[\"$\",\"link\",\"4\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?9e7a840704165ca6\",\"type\":\"image/png\",\"sizes\":\"256x256\"}]]\n3:null\n"])</script></body></html>
@@ -2,6 +2,6 @@
2
2
  3:I[4665,["282","static/chunks/282-980c2eb8fff20123.js","966","static/chunks/app/signup/page-18a4665665f6be11.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["ZCFjHbkF8yDKS2md3lVgb",[[["",{"children":["signup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["signup",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","signup","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/99c2552394077586.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
5
+ 0:["72btMIJ64BCAB4UgVkpaq",[[["",{"children":["signup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["signup",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","signup","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/99c2552394077586.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
6
  6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Agent Relay Dashboard"}],["$","meta","3",{"name":"description","content":"Fleet control dashboard for Agent Relay"}],["$","link","4",{"rel":"apple-touch-icon","href":"/apple-icon.png?9e7a840704165ca6","type":"image/png","sizes":"256x256"}]]
7
7
  1:null
@@ -63,10 +63,11 @@ program
63
63
  .name('agent-relay')
64
64
  .description('Agent-to-agent messaging')
65
65
  .version(VERSION, '-V, --version', 'Output the version number');
66
- // create-agent - Wrap agent with real-time messaging
66
+ // create-agent - Wrap agent with real-time messaging (requires TTY)
67
+ // For programmatic spawning from scripts, use 'agent-relay spawn' instead (no TTY required)
67
68
  program
68
69
  .command('create-agent')
69
- .description('Wrap an agent with real-time messaging')
70
+ .description('Wrap an agent with real-time messaging (requires TTY, use "spawn" for scripts)')
70
71
  .option('-n, --name <name>', 'Agent name (auto-generated if not set)')
71
72
  .option('-d, --debug', 'Enable debug output')
72
73
  .option('--prefix <pattern>', 'Relay prefix pattern (default: ->relay:)')
@@ -1589,10 +1590,11 @@ program
1589
1590
  }
1590
1591
  }
1591
1592
  });
1592
- // spawn - Spawn an agent via API (works from any context, no tmux required)
1593
+ // spawn - Spawn an agent via API (works from any context, no TTY required)
1594
+ // Use this for programmatic spawning from scripts, detached processes, or containers
1593
1595
  program
1594
- .command('spawn', { hidden: true })
1595
- .description('Spawn an agent via dashboard API (no tmux required, works in containers)')
1596
+ .command('spawn')
1597
+ .description('Spawn an agent via dashboard API (recommended for programmatic use, no TTY required)')
1596
1598
  .argument('<name>', 'Agent name')
1597
1599
  .argument('<cli>', 'CLI to use (claude, codex, gemini, etc.)')
1598
1600
  .argument('[task]', 'Task description (can also be piped via stdin)')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -106,15 +106,15 @@
106
106
  },
107
107
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
108
108
  "dependencies": {
109
- "@agent-relay/sdk": "2.0.0",
110
- "@agent-relay/config": "2.0.0",
111
- "@agent-relay/protocol": "2.0.0",
112
- "@agent-relay/storage": "2.0.0",
113
- "@agent-relay/continuity": "2.0.0",
114
- "@agent-relay/trajectory": "2.0.0",
115
- "@agent-relay/hooks": "2.0.0",
116
- "@agent-relay/resiliency": "2.0.0",
117
- "@agent-relay/user-directory": "2.0.0",
109
+ "@agent-relay/sdk": "2.0.4",
110
+ "@agent-relay/config": "2.0.4",
111
+ "@agent-relay/protocol": "2.0.4",
112
+ "@agent-relay/storage": "2.0.4",
113
+ "@agent-relay/continuity": "2.0.4",
114
+ "@agent-relay/trajectory": "2.0.4",
115
+ "@agent-relay/hooks": "2.0.4",
116
+ "@agent-relay/resiliency": "2.0.4",
117
+ "@agent-relay/user-directory": "2.0.4",
118
118
  "@nangohq/node": "^0.69.20",
119
119
  "@types/jsonwebtoken": "^9.0.10",
120
120
  "agent-trajectories": "^0.2.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/api-types",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Shared API types and Zod schemas for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -605,7 +605,9 @@ export class AgentSpawner {
605
605
  // 2. Relay daemon socket is accessible (daemon must be running)
606
606
  // Without both, MCP context would be shown but tools wouldn't work
607
607
  const mcpConfigPath = path.join(this.projectRoot, '.mcp.json');
608
- const relaySocket = process.env.RELAY_SOCKET || '/tmp/agent-relay.sock';
608
+ // Use the actual socket path from config (project-local .agent-relay/relay.sock)
609
+ // or fall back to environment variable
610
+ const relaySocket = this.socketPath || process.env.RELAY_SOCKET || path.join(this.projectRoot, '.agent-relay', 'relay.sock');
609
611
  let hasMcp = false;
610
612
  if (fs.existsSync(mcpConfigPath)) {
611
613
  try {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/bridge",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Multi-project bridge client utilities for Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,12 +22,12 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/protocol": "2.0.0",
26
- "@agent-relay/config": "2.0.0",
27
- "@agent-relay/utils": "2.0.0",
28
- "@agent-relay/policy": "2.0.0",
29
- "@agent-relay/user-directory": "2.0.0",
30
- "@agent-relay/wrapper": "2.0.0"
25
+ "@agent-relay/protocol": "2.0.4",
26
+ "@agent-relay/config": "2.0.4",
27
+ "@agent-relay/utils": "2.0.4",
28
+ "@agent-relay/policy": "2.0.4",
29
+ "@agent-relay/user-directory": "2.0.4",
30
+ "@agent-relay/wrapper": "2.0.4"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^22.19.3",
@@ -36,5 +36,10 @@
36
36
  },
37
37
  "publishConfig": {
38
38
  "access": "public"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/AgentWorkforce/relay.git",
43
+ "directory": "packages/bridge"
39
44
  }
40
45
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/cloud",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Cloud API server and services for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,11 +38,11 @@
38
38
  "test:watch": "vitest"
39
39
  },
40
40
  "dependencies": {
41
- "@agent-relay/wrapper": "2.0.0",
42
- "@agent-relay/config": "2.0.0",
43
- "@agent-relay/resiliency": "2.0.0",
44
- "@agent-relay/storage": "2.0.0",
45
- "@agent-relay/protocol": "2.0.0"
41
+ "@agent-relay/wrapper": "2.0.4",
42
+ "@agent-relay/config": "2.0.4",
43
+ "@agent-relay/resiliency": "2.0.4",
44
+ "@agent-relay/storage": "2.0.4",
45
+ "@agent-relay/protocol": "2.0.4"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/node": "^22.19.3",
@@ -51,5 +51,10 @@
51
51
  },
52
52
  "publishConfig": {
53
53
  "access": "public"
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/AgentWorkforce/relay.git",
58
+ "directory": "packages/cloud"
54
59
  }
55
60
  }
@@ -8,6 +8,10 @@
8
8
  */
9
9
  /**
10
10
  * Get the project root by looking for common markers
11
+ *
12
+ * Priority:
13
+ * 1. AGENT_RELAY_PROJECT environment variable (for worktrees/subprojects)
14
+ * 2. Find project root by looking for markers (.git, package.json, etc.)
11
15
  */
12
16
  export declare function findProjectRoot(startDir?: string): string;
13
17
  /**
@@ -43,8 +43,16 @@ function hashPath(projectPath) {
43
43
  }
44
44
  /**
45
45
  * Get the project root by looking for common markers
46
+ *
47
+ * Priority:
48
+ * 1. AGENT_RELAY_PROJECT environment variable (for worktrees/subprojects)
49
+ * 2. Find project root by looking for markers (.git, package.json, etc.)
46
50
  */
47
51
  export function findProjectRoot(startDir = process.cwd()) {
52
+ // Allow explicit override for worktrees and subprojects
53
+ if (process.env.AGENT_RELAY_PROJECT) {
54
+ return path.resolve(process.env.AGENT_RELAY_PROJECT);
55
+ }
48
56
  let current = path.resolve(startDir);
49
57
  const root = path.parse(current).root;
50
58
  const markers = ['.git', 'package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml', '.agent-relay'];
@@ -7,19 +7,27 @@ export declare const DEFAULT_CONNECTION_CONFIG: {
7
7
  readonly writeQueueLowWaterMark: 500;
8
8
  };
9
9
  export declare const DEFAULT_TMUX_WRAPPER_CONFIG: {
10
- readonly pollInterval: 200;
11
- readonly idleBeforeInjectMs: 1500;
12
- readonly injectRetryMs: 500;
10
+ readonly pollInterval: 150;
11
+ readonly idleBeforeInjectMs: 800;
12
+ readonly injectRetryMs: 300;
13
13
  readonly debug: false;
14
14
  readonly debugLogIntervalMs: 0;
15
15
  readonly mouseMode: true;
16
16
  readonly activityIdleThresholdMs: 30000;
17
- readonly outputStabilityTimeoutMs: 2000;
18
- readonly outputStabilityPollMs: 200;
17
+ readonly outputStabilityTimeoutMs: 800;
18
+ readonly outputStabilityPollMs: 150;
19
19
  readonly streamLogs: true;
20
20
  };
21
- export declare const DEFAULT_IDLE_BEFORE_INJECT_MS = 1500;
21
+ export declare const DEFAULT_IDLE_BEFORE_INJECT_MS = 800;
22
22
  export declare const DEFAULT_IDLE_CONFIDENCE_THRESHOLD = 0.7;
23
+ /** Low-latency mode constants for time-critical messaging */
24
+ export declare const LOW_LATENCY_CONFIG: {
25
+ readonly pollInterval: 100;
26
+ readonly idleBeforeInjectMs: 300;
27
+ readonly injectRetryMs: 200;
28
+ readonly outputStabilityTimeoutMs: 300;
29
+ readonly outputStabilityPollMs: 100;
30
+ };
23
31
  /** Default Unix socket path for daemon communication */
24
32
  export declare const DEFAULT_SOCKET_PATH = "/tmp/agent-relay.sock";
25
33
  //# sourceMappingURL=relay-config.d.ts.map
@@ -7,19 +7,27 @@ export const DEFAULT_CONNECTION_CONFIG = {
7
7
  writeQueueLowWaterMark: 500,
8
8
  };
9
9
  export const DEFAULT_TMUX_WRAPPER_CONFIG = {
10
- pollInterval: 200,
11
- idleBeforeInjectMs: 1500,
12
- injectRetryMs: 500,
10
+ pollInterval: 150,
11
+ idleBeforeInjectMs: 800,
12
+ injectRetryMs: 300,
13
13
  debug: false,
14
14
  debugLogIntervalMs: 0,
15
15
  mouseMode: true,
16
16
  activityIdleThresholdMs: 30_000,
17
- outputStabilityTimeoutMs: 2000,
18
- outputStabilityPollMs: 200,
17
+ outputStabilityTimeoutMs: 800,
18
+ outputStabilityPollMs: 150,
19
19
  streamLogs: true,
20
20
  };
21
- export const DEFAULT_IDLE_BEFORE_INJECT_MS = 1500;
21
+ export const DEFAULT_IDLE_BEFORE_INJECT_MS = 800;
22
22
  export const DEFAULT_IDLE_CONFIDENCE_THRESHOLD = 0.7;
23
+ /** Low-latency mode constants for time-critical messaging */
24
+ export const LOW_LATENCY_CONFIG = {
25
+ pollInterval: 100,
26
+ idleBeforeInjectMs: 300,
27
+ injectRetryMs: 200,
28
+ outputStabilityTimeoutMs: 300,
29
+ outputStabilityPollMs: 100,
30
+ };
23
31
  /** Default Unix socket path for daemon communication */
24
32
  export const DEFAULT_SOCKET_PATH = '/tmp/agent-relay.sock';
25
33
  //# sourceMappingURL=relay-config.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -83,7 +83,7 @@
83
83
  "test:watch": "vitest"
84
84
  },
85
85
  "dependencies": {
86
- "@agent-relay/protocol": "2.0.0",
86
+ "@agent-relay/protocol": "2.0.4",
87
87
  "zod": "^3.23.8",
88
88
  "zod-to-json-schema": "^3.23.1"
89
89
  },
@@ -94,5 +94,10 @@
94
94
  },
95
95
  "publishConfig": {
96
96
  "access": "public"
97
+ },
98
+ "repository": {
99
+ "type": "git",
100
+ "url": "git+https://github.com/AgentWorkforce/relay.git",
101
+ "directory": "packages/config"
97
102
  }
98
103
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/continuity",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Session continuity manager for Relay (ledgers, handoffs, resume)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -28,5 +28,10 @@
28
28
  },
29
29
  "publishConfig": {
30
30
  "access": "public"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/AgentWorkforce/relay.git",
35
+ "directory": "packages/continuity"
31
36
  }
32
37
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/daemon",
3
- "version": "2.0.0",
3
+ "version": "2.0.4",
4
4
  "description": "Relay daemon server - agent coordination and message routing",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,16 +22,16 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/protocol": "2.0.0",
26
- "@agent-relay/config": "2.0.0",
27
- "@agent-relay/storage": "2.0.0",
28
- "@agent-relay/bridge": "2.0.0",
29
- "@agent-relay/utils": "2.0.0",
30
- "@agent-relay/policy": "2.0.0",
31
- "@agent-relay/memory": "2.0.0",
32
- "@agent-relay/resiliency": "2.0.0",
33
- "@agent-relay/user-directory": "2.0.0",
34
- "@agent-relay/wrapper": "2.0.0",
25
+ "@agent-relay/protocol": "2.0.4",
26
+ "@agent-relay/config": "2.0.4",
27
+ "@agent-relay/storage": "2.0.4",
28
+ "@agent-relay/bridge": "2.0.4",
29
+ "@agent-relay/utils": "2.0.4",
30
+ "@agent-relay/policy": "2.0.4",
31
+ "@agent-relay/memory": "2.0.4",
32
+ "@agent-relay/resiliency": "2.0.4",
33
+ "@agent-relay/user-directory": "2.0.4",
34
+ "@agent-relay/wrapper": "2.0.4",
35
35
  "ws": "^8.18.3",
36
36
  "better-sqlite3": "^12.6.2",
37
37
  "pg": "^8.16.3",
@@ -48,5 +48,10 @@
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"
51
+ },
52
+ "repository": {
53
+ "type": "git",
54
+ "url": "git+https://github.com/AgentWorkforce/relay.git",
55
+ "directory": "packages/daemon"
51
56
  }
52
57
  }
@@ -754,11 +754,31 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
754
754
  }
755
755
  // Check if userBridge has a client for this user (avoid duplicate connections)
756
756
  // This prevents the connection storm where two clients fight for the same name
757
+ // IMPORTANT: Return the client even if it's not READY yet to avoid creating duplicates
758
+ // The caller should handle the CONNECTING state appropriately
757
759
  if (userBridge) {
758
760
  const userBridgeClient = userBridge.getRelayClient(senderName);
759
- if (userBridgeClient && userBridgeClient.state === 'READY') {
760
- console.log(`[dashboard] Reusing userBridge client for ${senderName}`);
761
- return userBridgeClient;
761
+ if (userBridgeClient) {
762
+ if (userBridgeClient.state === 'READY') {
763
+ console.log(`[dashboard] Reusing userBridge client for ${senderName}`);
764
+ return userBridgeClient;
765
+ }
766
+ // Client exists but not ready - wait for it instead of creating a duplicate
767
+ console.log(`[dashboard] userBridge client for ${senderName} exists but state=${userBridgeClient.state}, waiting...`);
768
+ // Wait up to 5 seconds for the client to become ready
769
+ for (let i = 0; i < 50; i++) {
770
+ await new Promise(r => setTimeout(r, 100));
771
+ if (userBridgeClient.state === 'READY') {
772
+ console.log(`[dashboard] userBridge client for ${senderName} now ready after ${(i + 1) * 100}ms`);
773
+ return userBridgeClient;
774
+ }
775
+ if (userBridgeClient.state === 'DISCONNECTED') {
776
+ console.log(`[dashboard] userBridge client for ${senderName} disconnected, will create new`);
777
+ break;
778
+ }
779
+ }
780
+ // Timed out or disconnected - fall through to create new client
781
+ console.log(`[dashboard] userBridge client for ${senderName} timed out waiting for ready state`);
762
782
  }
763
783
  }
764
784
  // Check if there's already a pending connection for this sender
@@ -3478,6 +3498,35 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
3478
3498
  app.get('/api/metrics/agents', async (req, res) => {
3479
3499
  try {
3480
3500
  const agents = [];
3501
+ // Helper to get the actual agent process PID (child of relay-pty wrapper)
3502
+ const getActualAgentPid = async (wrapperPid) => {
3503
+ try {
3504
+ const { execSync } = await import('child_process');
3505
+ if (process.platform === 'darwin') {
3506
+ // macOS: pgrep -P gets children of a parent process
3507
+ const children = execSync(`pgrep -P ${wrapperPid}`, { encoding: 'utf8' }).trim();
3508
+ const childPids = children.split('\n').filter(p => p).map(p => parseInt(p, 10));
3509
+ // Return the first child (the actual claude/codex/gemini process)
3510
+ return childPids[0] || null;
3511
+ }
3512
+ else {
3513
+ // Linux: Use /proc/<pid>/children or pgrep
3514
+ const childrenPath = `/proc/${wrapperPid}/task/${wrapperPid}/children`;
3515
+ if (fs.existsSync(childrenPath)) {
3516
+ const children = fs.readFileSync(childrenPath, 'utf8').trim();
3517
+ const childPids = children.split(/\s+/).filter(p => p).map(p => parseInt(p, 10));
3518
+ return childPids[0] || null;
3519
+ }
3520
+ // Fallback to pgrep
3521
+ const children = execSync(`pgrep -P ${wrapperPid}`, { encoding: 'utf8' }).trim();
3522
+ const childPids = children.split('\n').filter(p => p).map(p => parseInt(p, 10));
3523
+ return childPids[0] || null;
3524
+ }
3525
+ }
3526
+ catch {
3527
+ return null;
3528
+ }
3529
+ };
3481
3530
  // Get metrics from spawner's active workers
3482
3531
  if (spawner) {
3483
3532
  const activeWorkers = spawner.getActiveWorkers();
@@ -3485,10 +3534,17 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
3485
3534
  // Get memory and CPU usage
3486
3535
  let rssBytes = 0;
3487
3536
  let cpuPercent = 0;
3537
+ let actualPid = worker.pid;
3488
3538
  if (worker.pid) {
3489
3539
  try {
3540
+ // The worker.pid is relay-pty wrapper - get the actual agent process (child)
3541
+ const childPid = await getActualAgentPid(worker.pid);
3542
+ const targetPid = childPid || worker.pid;
3543
+ if (childPid) {
3544
+ actualPid = childPid;
3545
+ }
3490
3546
  // Try /proc filesystem first (Linux)
3491
- const statusPath = `/proc/${worker.pid}/status`;
3547
+ const statusPath = `/proc/${targetPid}/status`;
3492
3548
  if (fs.existsSync(statusPath)) {
3493
3549
  const status = fs.readFileSync(statusPath, 'utf8');
3494
3550
  // Parse VmRSS (Resident Set Size) from /proc/[pid]/status
@@ -3500,7 +3556,7 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
3500
3556
  else if (process.platform === 'darwin') {
3501
3557
  // macOS: Use ps command to get RSS and CPU
3502
3558
  const { execSync } = await import('child_process');
3503
- const psOutput = execSync(`ps -o rss=,pcpu= -p ${worker.pid}`, { encoding: 'utf8' }).trim();
3559
+ const psOutput = execSync(`ps -o rss=,pcpu= -p ${targetPid}`, { encoding: 'utf8' }).trim();
3504
3560
  if (psOutput) {
3505
3561
  const [rssStr, cpuStr] = psOutput.split(/\s+/);
3506
3562
  if (rssStr)
@@ -3516,7 +3572,7 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
3516
3572
  }
3517
3573
  agents.push({
3518
3574
  name: worker.name,
3519
- pid: worker.pid,
3575
+ pid: actualPid,
3520
3576
  status: worker.pid ? 'running' : 'unknown',
3521
3577
  rssBytes,
3522
3578
  cpuPercent,
@@ -3530,22 +3586,38 @@ export async function startDashboard(portOrOptions, dataDirArg, teamDirArg, dbPa
3530
3586
  }
3531
3587
  }
3532
3588
  // Also check agents.json for registered agents that may not be spawned
3589
+ // Filter out internal clients and human users - only show real AI agents
3590
+ const isInternalOrUser = (name, agent) => {
3591
+ // Internal system clients
3592
+ if (name.startsWith('_') || name.startsWith('__'))
3593
+ return true;
3594
+ if (name === 'Dashboard' || name === 'cli')
3595
+ return true;
3596
+ // Agents without CLI info are likely SDK-connected humans/tools, not AI agents
3597
+ // Real AI agents have cli field (claude, codex, gemini, etc.)
3598
+ if (!agent?.cli)
3599
+ return true;
3600
+ return false;
3601
+ };
3533
3602
  const agentsPath = path.join(teamDir, 'agents.json');
3534
3603
  if (fs.existsSync(agentsPath)) {
3535
3604
  const data = JSON.parse(fs.readFileSync(agentsPath, 'utf-8'));
3536
3605
  const registeredAgents = data.agents || [];
3537
3606
  for (const agent of registeredAgents) {
3538
- if (!agents.find(a => a.name === agent.name)) {
3539
- // Check if recently active (within 30 seconds)
3540
- const lastSeen = agent.lastSeen ? new Date(agent.lastSeen).getTime() : 0;
3541
- const isActive = Date.now() - lastSeen < 30000;
3542
- if (isActive) {
3543
- agents.push({
3544
- name: agent.name,
3545
- status: 'active',
3546
- alertLevel: 'normal',
3547
- });
3548
- }
3607
+ // Skip if already in list or is internal/user
3608
+ if (agents.find(a => a.name === agent.name))
3609
+ continue;
3610
+ if (isInternalOrUser(agent.name, agent))
3611
+ continue;
3612
+ // Check if recently active (within 30 seconds)
3613
+ const lastSeen = agent.lastSeen ? new Date(agent.lastSeen).getTime() : 0;
3614
+ const isActive = Date.now() - lastSeen < 30000;
3615
+ if (isActive) {
3616
+ agents.push({
3617
+ name: agent.name,
3618
+ status: 'active',
3619
+ alertLevel: 'normal',
3620
+ });
3549
3621
  }
3550
3622
  }
3551
3623
  }