agent-relay 2.0.13 → 2.0.14

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 (143) hide show
  1. package/bin/relay-pty-darwin-arm64 +0 -0
  2. package/bin/relay-pty-darwin-x64 +0 -0
  3. package/bin/relay-pty-linux-x64 +0 -0
  4. package/deploy/workspace/codex.config.toml +5 -0
  5. package/deploy/workspace/entrypoint.sh +10 -2
  6. package/dist/dashboard/out/404.html +1 -1
  7. package/dist/dashboard/out/app/onboarding.html +1 -1
  8. package/dist/dashboard/out/app/onboarding.txt +1 -1
  9. package/dist/dashboard/out/app.html +1 -1
  10. package/dist/dashboard/out/app.txt +1 -1
  11. package/dist/dashboard/out/cloud/link.html +1 -1
  12. package/dist/dashboard/out/cloud/link.txt +1 -1
  13. package/dist/dashboard/out/connect-repos.html +1 -1
  14. package/dist/dashboard/out/connect-repos.txt +1 -1
  15. package/dist/dashboard/out/history.html +1 -1
  16. package/dist/dashboard/out/history.txt +1 -1
  17. package/dist/dashboard/out/index.html +1 -1
  18. package/dist/dashboard/out/index.txt +1 -1
  19. package/dist/dashboard/out/login.html +1 -1
  20. package/dist/dashboard/out/login.txt +1 -1
  21. package/dist/dashboard/out/metrics.html +1 -1
  22. package/dist/dashboard/out/metrics.txt +1 -1
  23. package/dist/dashboard/out/pricing.html +1 -1
  24. package/dist/dashboard/out/pricing.txt +1 -1
  25. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  26. package/dist/dashboard/out/providers/setup/claude.txt +1 -1
  27. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  28. package/dist/dashboard/out/providers/setup/codex.txt +1 -1
  29. package/dist/dashboard/out/providers/setup/cursor.html +1 -1
  30. package/dist/dashboard/out/providers/setup/cursor.txt +1 -1
  31. package/dist/dashboard/out/providers.html +1 -1
  32. package/dist/dashboard/out/providers.txt +1 -1
  33. package/dist/dashboard/out/signup.html +1 -1
  34. package/dist/dashboard/out/signup.txt +1 -1
  35. package/dist/src/cli/index.js +131 -21
  36. package/package.json +20 -19
  37. package/packages/api-types/package.json +1 -1
  38. package/packages/bridge/dist/index.d.ts +1 -1
  39. package/packages/bridge/dist/index.js +1 -1
  40. package/packages/bridge/dist/spawner.d.ts +18 -0
  41. package/packages/bridge/dist/spawner.js +122 -38
  42. package/packages/bridge/package.json +8 -7
  43. package/packages/cloud/package.json +6 -6
  44. package/packages/config/package.json +2 -2
  45. package/packages/continuity/package.json +1 -1
  46. package/packages/daemon/dist/connection.js +5 -1
  47. package/packages/daemon/dist/relay-ledger.d.ts +3 -1
  48. package/packages/daemon/dist/relay-ledger.js +8 -2
  49. package/packages/daemon/dist/router.js +13 -0
  50. package/packages/daemon/dist/server.d.ts +7 -0
  51. package/packages/daemon/dist/server.js +338 -4
  52. package/packages/daemon/package.json +12 -12
  53. package/packages/dashboard/dist/server.js +29 -5
  54. package/packages/dashboard/package.json +13 -12
  55. package/packages/dashboard/ui-dist/404.html +1 -1
  56. package/packages/dashboard/ui-dist/app/onboarding.html +1 -1
  57. package/packages/dashboard/ui-dist/app/onboarding.txt +1 -1
  58. package/packages/dashboard/ui-dist/app.html +1 -1
  59. package/packages/dashboard/ui-dist/app.txt +1 -1
  60. package/packages/dashboard/ui-dist/cloud/link.html +1 -1
  61. package/packages/dashboard/ui-dist/cloud/link.txt +1 -1
  62. package/packages/dashboard/ui-dist/connect-repos.html +1 -1
  63. package/packages/dashboard/ui-dist/connect-repos.txt +1 -1
  64. package/packages/dashboard/ui-dist/history.html +1 -1
  65. package/packages/dashboard/ui-dist/history.txt +1 -1
  66. package/packages/dashboard/ui-dist/index.html +1 -1
  67. package/packages/dashboard/ui-dist/index.txt +1 -1
  68. package/packages/dashboard/ui-dist/login.html +1 -1
  69. package/packages/dashboard/ui-dist/login.txt +1 -1
  70. package/packages/dashboard/ui-dist/metrics.html +1 -1
  71. package/packages/dashboard/ui-dist/metrics.txt +1 -1
  72. package/packages/dashboard/ui-dist/pricing.html +1 -1
  73. package/packages/dashboard/ui-dist/pricing.txt +1 -1
  74. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -1
  75. package/packages/dashboard/ui-dist/providers/setup/claude.txt +1 -1
  76. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -1
  77. package/packages/dashboard/ui-dist/providers/setup/codex.txt +1 -1
  78. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -1
  79. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +1 -1
  80. package/packages/dashboard/ui-dist/providers.html +1 -1
  81. package/packages/dashboard/ui-dist/providers.txt +1 -1
  82. package/packages/dashboard/ui-dist/signup.html +1 -1
  83. package/packages/dashboard/ui-dist/signup.txt +1 -1
  84. package/packages/dashboard-server/dist/server.js +29 -5
  85. package/packages/dashboard-server/package.json +12 -12
  86. package/packages/hooks/package.json +4 -4
  87. package/packages/mcp/README.md +24 -3
  88. package/packages/mcp/dist/bin.js +13 -5
  89. package/packages/mcp/dist/client.d.ts +54 -1
  90. package/packages/mcp/dist/client.js +132 -18
  91. package/packages/mcp/dist/cloud.d.ts +12 -0
  92. package/packages/mcp/dist/cloud.js +125 -1
  93. package/packages/mcp/dist/file-transport.d.ts +97 -0
  94. package/packages/mcp/dist/file-transport.js +197 -0
  95. package/packages/mcp/dist/hybrid-client.d.ts +28 -0
  96. package/packages/mcp/dist/hybrid-client.js +159 -0
  97. package/packages/mcp/dist/index.d.ts +4 -2
  98. package/packages/mcp/dist/index.js +6 -2
  99. package/packages/mcp/dist/install.d.ts +23 -1
  100. package/packages/mcp/dist/install.js +229 -31
  101. package/packages/mcp/dist/server.js +7 -1
  102. package/packages/mcp/dist/simple.d.ts +1 -1
  103. package/packages/mcp/dist/tools/index.d.ts +1 -0
  104. package/packages/mcp/dist/tools/index.js +1 -0
  105. package/packages/mcp/dist/tools/relay-continuity.d.ts +35 -0
  106. package/packages/mcp/dist/tools/relay-continuity.js +101 -0
  107. package/packages/mcp/dist/tools/relay-health.d.ts +1 -4
  108. package/packages/mcp/dist/tools/relay-health.js +7 -15
  109. package/packages/mcp/dist/tools/relay-logs.js +4 -2
  110. package/packages/mcp/dist/tools/relay-metrics.d.ts +1 -4
  111. package/packages/mcp/dist/tools/relay-metrics.js +4 -15
  112. package/packages/mcp/dist/tools/relay-send.d.ts +2 -2
  113. package/packages/mcp/package.json +3 -2
  114. package/packages/memory/package.json +2 -2
  115. package/packages/policy/package.json +2 -2
  116. package/packages/protocol/dist/relay-pty-schemas.d.ts +14 -0
  117. package/packages/protocol/dist/types.d.ts +152 -2
  118. package/packages/protocol/package.json +1 -1
  119. package/packages/resiliency/package.json +1 -1
  120. package/packages/sdk/dist/client.js +7 -0
  121. package/packages/sdk/package.json +2 -2
  122. package/packages/spawner/package.json +1 -1
  123. package/packages/state/package.json +1 -1
  124. package/packages/storage/package.json +2 -2
  125. package/packages/telemetry/package.json +1 -1
  126. package/packages/trajectory/package.json +2 -2
  127. package/packages/user-directory/package.json +2 -2
  128. package/packages/utils/dist/logger.js +3 -1
  129. package/packages/utils/package.json +1 -1
  130. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +28 -1
  131. package/packages/wrapper/dist/relay-pty-orchestrator.js +292 -37
  132. package/packages/wrapper/package.json +6 -6
  133. package/scripts/demos/README.md +79 -0
  134. package/scripts/demos/server-capacity.sh +69 -0
  135. package/scripts/demos/sprint-planning.sh +73 -0
  136. /package/dist/dashboard/out/_next/static/{Fa21F5wPUusvLUxj67gGm → RgEj_9Y-mWbLaxggzni-X}/_buildManifest.js +0 -0
  137. /package/dist/dashboard/out/_next/static/{Fa21F5wPUusvLUxj67gGm → RgEj_9Y-mWbLaxggzni-X}/_ssgManifest.js +0 -0
  138. /package/packages/dashboard/ui-dist/_next/static/{Fa21F5wPUusvLUxj67gGm → RgEj_9Y-mWbLaxggzni-X}/_buildManifest.js +0 -0
  139. /package/packages/dashboard/ui-dist/_next/static/{Fa21F5wPUusvLUxj67gGm → RgEj_9Y-mWbLaxggzni-X}/_ssgManifest.js +0 -0
  140. /package/packages/dashboard/ui-dist/_next/static/{coRjSO5QkUdvCiJRCqxfi → UkLmDJOkaPWU2PaNQnkx5}/_buildManifest.js +0 -0
  141. /package/packages/dashboard/ui-dist/_next/static/{coRjSO5QkUdvCiJRCqxfi → UkLmDJOkaPWU2PaNQnkx5}/_ssgManifest.js +0 -0
  142. /package/packages/dashboard/ui-dist/_next/static/{yKnlyfJx-NzAy4kPAGkMr → bv9xidgU2pXi7xxPoCAK-}/_buildManifest.js +0 -0
  143. /package/packages/dashboard/ui-dist/_next/static/{yKnlyfJx-NzAy4kPAGkMr → bv9xidgU2pXi7xxPoCAK-}/_ssgManifest.js +0 -0
@@ -2,6 +2,6 @@
2
2
  3:I[9197,["30","static/chunks/e868780c-48e5f147c90a3a41.js","891","static/chunks/891-5cb1513eeb97a891.js","83","static/chunks/83-4f08122d4e7e79a6.js","631","static/chunks/631-af51bad94027527a.js","150","static/chunks/app/providers/page-bcf46064ac4474ce.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["Fa21F5wPUusvLUxj67gGm",[[["",{"children":["providers",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["providers",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","providers","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/605dd4e30c91986f.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:["RgEj_9Y-mWbLaxggzni-X",[[["",{"children":["providers",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["providers",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","providers","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/605dd4e30c91986f.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
@@ -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/605dd4e30c91986f.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-1ede2205b58649ca.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\":\"Fa21F5wPUusvLUxj67gGm\",\"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/605dd4e30c91986f.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/605dd4e30c91986f.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-1ede2205b58649ca.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\":\"RgEj_9Y-mWbLaxggzni-X\",\"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/605dd4e30c91986f.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-1ede2205b58649ca.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["Fa21F5wPUusvLUxj67gGm",[[["",{"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/605dd4e30c91986f.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:["RgEj_9Y-mWbLaxggzni-X",[[["",{"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/605dd4e30c91986f.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
@@ -17,15 +17,71 @@ import { config as dotenvConfig } from 'dotenv';
17
17
  import { Daemon } from '@agent-relay/daemon';
18
18
  import { RelayClient } from '@agent-relay/sdk';
19
19
  import { RelayPtyOrchestrator, getTmuxPath } from '@agent-relay/wrapper';
20
- import { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, selectShadowCli } from '@agent-relay/bridge';
20
+ import { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, selectShadowCli, ensureMcpPermissions } from '@agent-relay/bridge';
21
21
  import { generateAgentName, checkForUpdatesInBackground, checkForUpdates } from '@agent-relay/utils';
22
22
  import { getShadowForAgent } from '@agent-relay/config';
23
23
  import { initTelemetry, track, enableTelemetry, disableTelemetry, getStatus, isDisabledByEnv, } from '@agent-relay/telemetry';
24
+ import { installMcpConfig } from '@agent-relay/mcp';
24
25
  import fs from 'node:fs';
25
26
  import path from 'node:path';
27
+ import readline from 'node:readline';
26
28
  import { promisify } from 'node:util';
27
- import { exec } from 'node:child_process';
29
+ import { exec, spawn as spawnProcess } from 'node:child_process';
28
30
  import { fileURLToPath } from 'node:url';
31
+ /**
32
+ * Prompt user to choose how to handle missing dashboard package
33
+ * Returns: 'install' | 'skip'
34
+ */
35
+ async function promptDashboardInstall() {
36
+ const rl = readline.createInterface({
37
+ input: process.stdin,
38
+ output: process.stdout,
39
+ });
40
+ console.log(`
41
+ Dashboard package not installed.
42
+
43
+ How would you like to proceed?
44
+ 1. Install now (npm install -g @agent-relay/dashboard)
45
+ 2. Continue without dashboard
46
+ `);
47
+ return new Promise((resolve) => {
48
+ rl.question('Choose [1/2]: ', (answer) => {
49
+ rl.close();
50
+ const choice = answer.trim();
51
+ if (choice === '1') {
52
+ resolve('install');
53
+ }
54
+ else {
55
+ resolve('skip');
56
+ }
57
+ });
58
+ });
59
+ }
60
+ /**
61
+ * Install dashboard package globally
62
+ */
63
+ async function installDashboardGlobally() {
64
+ console.log('\nInstalling @agent-relay/dashboard globally...\n');
65
+ return new Promise((resolve) => {
66
+ const proc = spawnProcess('npm', ['install', '-g', '@agent-relay/dashboard'], {
67
+ stdio: 'inherit',
68
+ });
69
+ proc.on('close', (code) => {
70
+ if (code === 0) {
71
+ console.log('\n✓ Dashboard installed successfully.\n');
72
+ resolve(true);
73
+ }
74
+ else {
75
+ console.error('\n✗ Installation failed. Try running manually:\n npm install -g @agent-relay/dashboard\n');
76
+ resolve(false);
77
+ }
78
+ });
79
+ proc.on('error', () => {
80
+ console.error('\n✗ Installation failed. Try running manually:\n npm install -g @agent-relay/dashboard\n');
81
+ resolve(false);
82
+ });
83
+ });
84
+ }
29
85
  dotenvConfig();
30
86
  const DEFAULT_DASHBOARD_PORT = process.env.AGENT_RELAY_DASHBOARD_PORT || '3888';
31
87
  // Read version from package.json
@@ -98,6 +154,32 @@ program
98
154
  const agentName = options.name ?? generateAgentName();
99
155
  console.error(`Agent: ${agentName}`);
100
156
  console.error(`Project: ${paths.projectId}`);
157
+ // Auto-install MCP config if not present (project-local)
158
+ // Uses .mcp.json in the project root - doesn't modify global settings
159
+ const projectMcpConfigPath = path.join(paths.projectRoot, '.mcp.json');
160
+ const socketPath = path.join(paths.projectRoot, '.agent-relay', 'relay.sock');
161
+ if (!fs.existsSync(projectMcpConfigPath)) {
162
+ try {
163
+ const result = installMcpConfig(projectMcpConfigPath, {
164
+ configKey: 'mcpServers',
165
+ // Set RELAY_SOCKET so MCP server finds daemon regardless of CWD
166
+ env: { RELAY_SOCKET: socketPath },
167
+ });
168
+ if (result.success) {
169
+ console.error(`MCP config: ${projectMcpConfigPath} (auto-created)`);
170
+ }
171
+ }
172
+ catch {
173
+ // Best effort - don't fail the command
174
+ }
175
+ }
176
+ // Ensure MCP tools are auto-approved (creates ~/.claude/settings.local.json for Claude)
177
+ try {
178
+ ensureMcpPermissions(paths.projectRoot, mainCommand, options.debug);
179
+ }
180
+ catch {
181
+ // Best effort - don't fail the command
182
+ }
101
183
  // Auto-detect agent config and inject --model/--agent for Claude CLI
102
184
  let finalArgs = commandArgs;
103
185
  if (isClaudeCli(mainCommand)) {
@@ -336,6 +418,12 @@ program
336
418
  const socketPath = paths.socketPath;
337
419
  const dbPath = paths.dbPath;
338
420
  const pidFilePath = pidFilePathForSocket(socketPath);
421
+ // Set up log file to avoid console output polluting TUI terminals
422
+ // Only set if not already configured via environment
423
+ if (!process.env.AGENT_RELAY_LOG_FILE) {
424
+ const logFile = path.join(paths.dataDir, 'daemon.log');
425
+ process.env.AGENT_RELAY_LOG_FILE = logFile;
426
+ }
339
427
  console.log(`Project: ${paths.projectRoot}`);
340
428
  console.log(`Socket: ${socketPath}`);
341
429
  // Load teams.json if present
@@ -432,25 +520,44 @@ program
432
520
  catch (err) {
433
521
  const error = err;
434
522
  if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'MODULE_NOT_FOUND') {
435
- console.error(`
436
- Dashboard package not installed.
437
-
438
- The dashboard has moved to a separate optional package.
439
- To use the web dashboard, install it:
440
-
441
- npm install -g @agent-relay/dashboard
442
-
443
- Then try again:
444
-
445
- agent-relay up --dashboard
446
-
447
- Or run without dashboard:
448
-
449
- agent-relay up
450
- `);
451
- process.exit(1);
523
+ // Interactive prompt for dashboard installation
524
+ const choice = await promptDashboardInstall();
525
+ if (choice === 'install') {
526
+ const installed = await installDashboardGlobally();
527
+ if (installed) {
528
+ // Retry import after installation
529
+ try {
530
+ const { startDashboard } = await import('@agent-relay/dashboard');
531
+ dashboardPort = await startDashboard({
532
+ port,
533
+ dataDir: paths.dataDir,
534
+ teamDir: paths.teamDir,
535
+ dbPath,
536
+ enableSpawner: true,
537
+ projectRoot: paths.projectRoot,
538
+ onMarkSpawning: (name) => daemon.markSpawning(name),
539
+ onClearSpawning: (name) => daemon.clearSpawning(name),
540
+ });
541
+ console.log(`Dashboard: http://localhost:${dashboardPort}`);
542
+ daemon.onLogOutput = (agentName, data, _timestamp) => {
543
+ const broadcast = global.__broadcastLogOutput;
544
+ if (broadcast) {
545
+ broadcast(agentName, data);
546
+ }
547
+ };
548
+ }
549
+ catch {
550
+ console.error('Dashboard still not found after installation. Continuing without dashboard.');
551
+ }
552
+ }
553
+ }
554
+ else {
555
+ console.log('\nContinuing without dashboard...\n');
556
+ }
557
+ }
558
+ else {
559
+ throw err;
452
560
  }
453
- throw err;
454
561
  }
455
562
  }
456
563
  // Determine if we should auto-spawn agents
@@ -1882,7 +1989,10 @@ cloudCommand
1882
1989
  try {
1883
1990
  const openCommand = process.platform === 'darwin' ? 'open' :
1884
1991
  process.platform === 'win32' ? 'start' : 'xdg-open';
1885
- await execAsync(`${openCommand} "${authUrl}"`);
1992
+ // Use single quotes to prevent shell interpretation of & and other special chars
1993
+ // Escape any single quotes in the URL itself
1994
+ const escapedUrl = authUrl.replace(/'/g, "'\\''");
1995
+ await execAsync(`${openCommand} '${escapedUrl}'`);
1886
1996
  console.log('(Browser opened automatically)');
1887
1997
  }
1888
1998
  catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -16,9 +16,9 @@
16
16
  },
17
17
  "scripts": {
18
18
  "postinstall": "npm rebuild better-sqlite3 && node scripts/postinstall.js",
19
- "build": "npm run clean && turbo run build --filter='./packages/*' && tsc && npm run build:dashboard",
20
- "build:sequential": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc && npm run build:dashboard",
21
- "build:workspace": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc",
19
+ "build": "npm run clean && npm run build:rust && turbo run build --filter='./packages/*' && tsc && npm run build:dashboard",
20
+ "build:sequential": "npm run clean && npm run build:rust && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc && npm run build:dashboard",
21
+ "build:workspace": "npm run clean && npm run build:rust && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc",
22
22
  "build:packages": "turbo run build --filter='./packages/*'",
23
23
  "build:packages:watch": "turbo run build --filter='./packages/*' --watch",
24
24
  "build:mcp": "cd packages/mcp && npm run build",
@@ -55,7 +55,7 @@
55
55
  "dev:local": "npm run build && npm link && echo '✓ agent-relay linked globally'",
56
56
  "dev:unlink": "npm unlink -g agent-relay && echo '✓ agent-relay unlinked'",
57
57
  "dev:rebuild": "npm run build && echo '✓ Rebuilt (linked version updated)'",
58
- "build:rust": "cd relay-pty && cargo build --release && cp target/release/relay-pty ../bin/relay-pty && echo '✓ relay-pty binary built and copied to bin/'",
58
+ "build:rust": "if command -v ~/.cargo/bin/cargo >/dev/null 2>&1; then cd relay-pty && ~/.cargo/bin/cargo build --release && cp target/release/relay-pty ../bin/relay-pty && node -e \"const os=require('os'); const fs=require('fs'); const p=os.platform(); const a=os.arch(); const name='relay-pty-'+p+'-'+a; fs.copyFileSync('target/release/relay-pty', '../bin/'+name); console.log('✓ relay-pty binary built and copied to bin/ and bin/'+name)\"; else echo '⚠ Rust not installed, using prebuilt binaries from bin/'; fi",
59
59
  "start": "node dist/src/cli/index.js",
60
60
  "daemon": "node packages/daemon/dist/server.js",
61
61
  "dashboard": "node packages/dashboard-server/dist/start.js",
@@ -107,20 +107,21 @@
107
107
  },
108
108
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
109
109
  "dependencies": {
110
- "@agent-relay/bridge": "2.0.13",
111
- "@agent-relay/config": "2.0.13",
112
- "@agent-relay/continuity": "2.0.13",
113
- "@agent-relay/daemon": "2.0.13",
114
- "@agent-relay/hooks": "2.0.13",
115
- "@agent-relay/protocol": "2.0.13",
116
- "@agent-relay/resiliency": "2.0.13",
117
- "@agent-relay/sdk": "2.0.13",
118
- "@agent-relay/storage": "2.0.13",
119
- "@agent-relay/telemetry": "2.0.13",
120
- "@agent-relay/trajectory": "2.0.13",
121
- "@agent-relay/user-directory": "2.0.13",
122
- "@agent-relay/utils": "2.0.13",
123
- "@agent-relay/wrapper": "2.0.13",
110
+ "@agent-relay/bridge": "2.0.14",
111
+ "@agent-relay/config": "2.0.14",
112
+ "@agent-relay/continuity": "2.0.14",
113
+ "@agent-relay/daemon": "2.0.14",
114
+ "@agent-relay/hooks": "2.0.14",
115
+ "@agent-relay/mcp": "2.0.14",
116
+ "@agent-relay/protocol": "2.0.14",
117
+ "@agent-relay/resiliency": "2.0.14",
118
+ "@agent-relay/sdk": "2.0.14",
119
+ "@agent-relay/storage": "2.0.14",
120
+ "@agent-relay/telemetry": "2.0.14",
121
+ "@agent-relay/trajectory": "2.0.14",
122
+ "@agent-relay/user-directory": "2.0.14",
123
+ "@agent-relay/utils": "2.0.14",
124
+ "@agent-relay/wrapper": "2.0.14",
124
125
  "@nangohq/node": "^0.69.20",
125
126
  "@types/jsonwebtoken": "^9.0.10",
126
127
  "agent-trajectories": "^0.2.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/api-types",
3
- "version": "2.0.13",
3
+ "version": "2.0.14",
4
4
  "description": "Shared API types and Zod schemas for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -4,5 +4,5 @@ export * from './multi-project-client.js';
4
4
  export * from './utils.js';
5
5
  export { escapeForShell, escapeForTmux } from './utils.js';
6
6
  export { selectShadowCli, type ShadowCli, type ShadowMode, type ShadowCliSelection, } from './shadow-cli.js';
7
- export { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, type AgentSpawnerOptions, type CloudPersistenceHandler, type OnAgentDeathCallback, } from './spawner.js';
7
+ export { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, ensureMcpPermissions, type AgentSpawnerOptions, type CloudPersistenceHandler, type OnAgentDeathCallback, } from './spawner.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -5,5 +5,5 @@ export { escapeForShell, escapeForTmux } from './utils.js';
5
5
  // Shadow CLI selection
6
6
  export { selectShadowCli, } from './shadow-cli.js';
7
7
  // Agent spawner
8
- export { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, } from './spawner.js';
8
+ export { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, ensureMcpPermissions, } from './spawner.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -38,6 +38,24 @@ export type OnAgentDeathCallback = (info: {
38
38
  /** Traceable error ID for support lookup */
39
39
  errorId?: string;
40
40
  }) => void;
41
+ /**
42
+ * Ensure MCP permissions are pre-configured for the given CLI type.
43
+ * This prevents MCP approval prompts from blocking agent initialization.
44
+ *
45
+ * For Claude Code: Creates/updates .claude/settings.local.json with:
46
+ * - enableAllProjectMcpServers: true (auto-approve project MCP servers)
47
+ * - permissions.allow: ["mcp__agent-relay__*"] (pre-approve all agent-relay MCP tools)
48
+ *
49
+ * For Cursor: Creates/updates .cursor/settings.json with MCP permissions
50
+ * For Gemini: Creates/updates .gemini/settings.json with MCP permissions
51
+ * For Windsurf: Creates/updates .windsurf/settings.json with MCP permissions
52
+ * Other CLIs: May use CLI flags instead of config-based permissions
53
+ *
54
+ * @param projectRoot - The project root directory
55
+ * @param cliType - The CLI type (claude, codex, gemini, cursor, etc.)
56
+ * @param debug - Whether to log debug information
57
+ */
58
+ export declare function ensureMcpPermissions(projectRoot: string, cliType: string, debug?: boolean): void;
41
59
  /** Options for AgentSpawner constructor */
42
60
  export interface AgentSpawnerOptions {
43
61
  projectRoot: string;