agent-relay 2.0.18 → 2.0.19

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 (120) hide show
  1. package/dist/dashboard/out/404.html +1 -1
  2. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +1 -0
  3. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +1 -0
  4. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +1 -0
  5. package/dist/dashboard/out/_next/static/css/{45361ce86b2847c4.css → 6892f8422896ef7a.css} +1 -1
  6. package/dist/dashboard/out/app/onboarding.html +1 -1
  7. package/dist/dashboard/out/app/onboarding.txt +1 -1
  8. package/dist/dashboard/out/app.html +1 -1
  9. package/dist/dashboard/out/app.txt +2 -2
  10. package/dist/dashboard/out/cloud/link.html +1 -1
  11. package/dist/dashboard/out/cloud/link.txt +1 -1
  12. package/dist/dashboard/out/complete-profile.html +2 -2
  13. package/dist/dashboard/out/complete-profile.txt +1 -1
  14. package/dist/dashboard/out/connect-repos.html +1 -1
  15. package/dist/dashboard/out/connect-repos.txt +1 -1
  16. package/dist/dashboard/out/history.html +1 -1
  17. package/dist/dashboard/out/history.txt +1 -1
  18. package/dist/dashboard/out/index.html +1 -1
  19. package/dist/dashboard/out/index.txt +2 -2
  20. package/dist/dashboard/out/login.html +2 -2
  21. package/dist/dashboard/out/login.txt +1 -1
  22. package/dist/dashboard/out/metrics.html +1 -1
  23. package/dist/dashboard/out/metrics.txt +1 -1
  24. package/dist/dashboard/out/pricing.html +2 -2
  25. package/dist/dashboard/out/pricing.txt +1 -1
  26. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  27. package/dist/dashboard/out/providers/setup/claude.txt +1 -1
  28. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  29. package/dist/dashboard/out/providers/setup/codex.txt +1 -1
  30. package/dist/dashboard/out/providers/setup/cursor.html +1 -1
  31. package/dist/dashboard/out/providers/setup/cursor.txt +1 -1
  32. package/dist/dashboard/out/providers.html +1 -1
  33. package/dist/dashboard/out/providers.txt +2 -2
  34. package/dist/dashboard/out/signup.html +2 -2
  35. package/dist/dashboard/out/signup.txt +1 -1
  36. package/package.json +16 -16
  37. package/packages/api-types/package.json +1 -1
  38. package/packages/bridge/package.json +8 -8
  39. package/packages/cloud/dist/api/cli-pty-runner.js +9 -6
  40. package/packages/cloud/package.json +6 -6
  41. package/packages/config/dist/cli-auth-config.js +10 -0
  42. package/packages/config/package.json +2 -2
  43. package/packages/continuity/package.json +1 -1
  44. package/packages/daemon/dist/cli-auth.js +5 -1
  45. package/packages/daemon/package.json +12 -12
  46. package/packages/dashboard/package.json +13 -13
  47. package/packages/dashboard/ui/app/providers/page.tsx +2 -2
  48. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +23 -8
  49. package/packages/dashboard/ui/react-components/SpawnModal.tsx +16 -6
  50. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +22 -6
  51. package/packages/dashboard/ui-dist/404.html +1 -1
  52. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +1 -0
  53. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +1 -0
  54. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +1 -0
  55. package/packages/dashboard/ui-dist/_next/static/css/{45361ce86b2847c4.css → 6892f8422896ef7a.css} +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 +2 -2
  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/complete-profile.html +2 -2
  63. package/packages/dashboard/ui-dist/complete-profile.txt +1 -1
  64. package/packages/dashboard/ui-dist/connect-repos.html +1 -1
  65. package/packages/dashboard/ui-dist/connect-repos.txt +1 -1
  66. package/packages/dashboard/ui-dist/history.html +1 -1
  67. package/packages/dashboard/ui-dist/history.txt +1 -1
  68. package/packages/dashboard/ui-dist/index.html +1 -1
  69. package/packages/dashboard/ui-dist/index.txt +2 -2
  70. package/packages/dashboard/ui-dist/login.html +2 -2
  71. package/packages/dashboard/ui-dist/login.txt +1 -1
  72. package/packages/dashboard/ui-dist/metrics.html +1 -1
  73. package/packages/dashboard/ui-dist/metrics.txt +1 -1
  74. package/packages/dashboard/ui-dist/pricing.html +2 -2
  75. package/packages/dashboard/ui-dist/pricing.txt +1 -1
  76. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -1
  77. package/packages/dashboard/ui-dist/providers/setup/claude.txt +1 -1
  78. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -1
  79. package/packages/dashboard/ui-dist/providers/setup/codex.txt +1 -1
  80. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -1
  81. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +1 -1
  82. package/packages/dashboard/ui-dist/providers.html +1 -1
  83. package/packages/dashboard/ui-dist/providers.txt +2 -2
  84. package/packages/dashboard/ui-dist/signup.html +2 -2
  85. package/packages/dashboard/ui-dist/signup.txt +1 -1
  86. package/packages/dashboard-server/package.json +12 -12
  87. package/packages/hooks/package.json +4 -4
  88. package/packages/mcp/package.json +2 -2
  89. package/packages/memory/package.json +2 -2
  90. package/packages/policy/package.json +2 -2
  91. package/packages/protocol/package.json +1 -1
  92. package/packages/resiliency/package.json +1 -1
  93. package/packages/sdk/package.json +2 -2
  94. package/packages/spawner/package.json +1 -1
  95. package/packages/state/package.json +1 -1
  96. package/packages/storage/package.json +2 -2
  97. package/packages/telemetry/package.json +1 -1
  98. package/packages/trajectory/package.json +2 -2
  99. package/packages/user-directory/package.json +2 -2
  100. package/packages/utils/package.json +1 -1
  101. package/packages/wrapper/dist/idle-detector.d.ts +4 -0
  102. package/packages/wrapper/dist/idle-detector.js +21 -8
  103. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +5 -0
  104. package/packages/wrapper/dist/relay-pty-orchestrator.js +53 -0
  105. package/packages/wrapper/package.json +6 -6
  106. package/scripts/postinstall.js +41 -1
  107. package/dist/dashboard/out/_next/static/chunks/320-402ffc8646b31da1.js +0 -1
  108. package/dist/dashboard/out/_next/static/chunks/631-af51bad94027527a.js +0 -1
  109. package/dist/dashboard/out/_next/static/chunks/app/providers/page-bcf46064ac4474ce.js +0 -1
  110. package/packages/dashboard/ui-dist/_next/static/chunks/320-402ffc8646b31da1.js +0 -1
  111. package/packages/dashboard/ui-dist/_next/static/chunks/631-af51bad94027527a.js +0 -1
  112. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-bcf46064ac4474ce.js +0 -1
  113. /package/dist/dashboard/out/_next/static/{JIjqkuDKNeoSg7KaMMuhx → cREcLZyPb-5NyVZje0Qfe}/_buildManifest.js +0 -0
  114. /package/dist/dashboard/out/_next/static/{JIjqkuDKNeoSg7KaMMuhx → cREcLZyPb-5NyVZje0Qfe}/_ssgManifest.js +0 -0
  115. /package/packages/dashboard/ui-dist/_next/static/{JIjqkuDKNeoSg7KaMMuhx → N3ajGnJqRESKyCjDvyU52}/_buildManifest.js +0 -0
  116. /package/packages/dashboard/ui-dist/_next/static/{JIjqkuDKNeoSg7KaMMuhx → N3ajGnJqRESKyCjDvyU52}/_ssgManifest.js +0 -0
  117. /package/packages/dashboard/ui-dist/_next/static/{nmkOi7bqeDmLMoWBih8lz → UQiyWwBxIP-9it3GYVBDL}/_buildManifest.js +0 -0
  118. /package/packages/dashboard/ui-dist/_next/static/{nmkOi7bqeDmLMoWBih8lz → UQiyWwBxIP-9it3GYVBDL}/_ssgManifest.js +0 -0
  119. /package/packages/dashboard/ui-dist/_next/static/{wk_gKRNSPpWE-ZhGL6UMl → cREcLZyPb-5NyVZje0Qfe}/_buildManifest.js +0 -0
  120. /package/packages/dashboard/ui-dist/_next/static/{wk_gKRNSPpWE-ZhGL6UMl → cREcLZyPb-5NyVZje0Qfe}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/45361ce86b2847c4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js"/><script src="/_next/static/chunks/fd9d1056-609918ca7b6280bb.js" async=""></script><script src="/_next/static/chunks/117-c8afed19e821a35d.js" async=""></script><script src="/_next/static/chunks/main-app-fdbeb09028f57c9f.js" async=""></script><script src="/_next/static/chunks/282-980c2eb8fff20123.js" async=""></script><script src="/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js" async=""></script><title>Agent Relay Dashboard</title><meta name="description" content="Fleet control dashboard for Agent Relay"/><link rel="apple-touch-icon" href="/apple-icon.png?9e7a840704165ca6" type="image/png" sizes="256x256"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="min-h-screen bg-gradient-to-br from-[#0a0a0f] via-[#0d1117] to-[#0a0a0f] flex flex-col items-center justify-center p-4"><div class="fixed inset-0 opacity-10"><div class="absolute inset-0" style="background-image:linear-gradient(rgba(0, 217, 255, 0.1) 1px, transparent 1px),
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/6892f8422896ef7a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js"/><script src="/_next/static/chunks/fd9d1056-609918ca7b6280bb.js" async=""></script><script src="/_next/static/chunks/117-c8afed19e821a35d.js" async=""></script><script src="/_next/static/chunks/main-app-fdbeb09028f57c9f.js" async=""></script><script src="/_next/static/chunks/282-980c2eb8fff20123.js" async=""></script><script src="/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js" async=""></script><title>Agent Relay Dashboard</title><meta name="description" content="Fleet control dashboard for Agent Relay"/><link rel="apple-touch-icon" href="/apple-icon.png?9e7a840704165ca6" type="image/png" sizes="256x256"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div class="min-h-screen bg-gradient-to-br from-[#0a0a0f] via-[#0d1117] to-[#0a0a0f] flex flex-col items-center justify-center p-4"><div class="fixed inset-0 opacity-10"><div class="absolute inset-0" style="background-image:linear-gradient(rgba(0, 217, 255, 0.1) 1px, transparent 1px),
2
2
  linear-gradient(90deg, rgba(0, 217, 255, 0.1) 1px, transparent 1px);background-size:50px 50px"></div></div><div class="fixed inset-0 overflow-hidden pointer-events-none"><div class="absolute -top-40 -left-40 w-80 h-80 bg-accent-cyan/20 rounded-full blur-[100px]"></div><div class="absolute -bottom-40 -right-40 w-80 h-80 bg-[#00ffc8]/15 rounded-full blur-[100px]"></div></div><div class="relative z-10 w-full max-w-md"><div class="flex flex-col items-center mb-8"><svg width="56" height="56" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg" class="
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="flex mb-6 bg-bg-secondary/50 rounded-lg p-1"><button type="button" class="flex-1 py-2 px-4 rounded-md text-sm font-medium transition-colors bg-bg-primary text-white shadow-sm">GitHub</button><button type="button" class="flex-1 py-2 px-4 rounded-md text-sm font-medium transition-colors text-text-muted hover:text-white">Email</button></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/45361ce86b2847c4.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-c7a0a28341365ae0.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\":\"JIjqkuDKNeoSg7KaMMuhx\",\"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/45361ce86b2847c4.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="flex mb-6 bg-bg-secondary/50 rounded-lg p-1"><button type="button" class="flex-1 py-2 px-4 rounded-md text-sm font-medium transition-colors bg-bg-primary text-white shadow-sm">GitHub</button><button type="button" class="flex-1 py-2 px-4 rounded-md text-sm font-medium transition-colors text-text-muted hover:text-white">Email</button></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/6892f8422896ef7a.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-c7a0a28341365ae0.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\":\"cREcLZyPb-5NyVZje0Qfe\",\"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/6892f8422896ef7a.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-c7a0a28341365ae0.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["JIjqkuDKNeoSg7KaMMuhx",[[["",{"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/45361ce86b2847c4.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:["cREcLZyPb-5NyVZje0Qfe",[[["",{"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/6892f8422896ef7a.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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/dashboard-server",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Relay dashboard server - HTTP/WebSocket server for agent coordination",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,17 +22,17 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/protocol": "2.0.18",
26
- "@agent-relay/config": "2.0.18",
27
- "@agent-relay/storage": "2.0.18",
28
- "@agent-relay/bridge": "2.0.18",
29
- "@agent-relay/utils": "2.0.18",
30
- "@agent-relay/resiliency": "2.0.18",
31
- "@agent-relay/trajectory": "2.0.18",
32
- "@agent-relay/cloud": "2.0.18",
33
- "@agent-relay/daemon": "2.0.18",
34
- "@agent-relay/user-directory": "2.0.18",
35
- "@agent-relay/sdk": "2.0.18",
25
+ "@agent-relay/protocol": "2.0.19",
26
+ "@agent-relay/config": "2.0.19",
27
+ "@agent-relay/storage": "2.0.19",
28
+ "@agent-relay/bridge": "2.0.19",
29
+ "@agent-relay/utils": "2.0.19",
30
+ "@agent-relay/resiliency": "2.0.19",
31
+ "@agent-relay/trajectory": "2.0.19",
32
+ "@agent-relay/cloud": "2.0.19",
33
+ "@agent-relay/daemon": "2.0.19",
34
+ "@agent-relay/user-directory": "2.0.19",
35
+ "@agent-relay/sdk": "2.0.19",
36
36
  "array-flatten": "^1.1.1",
37
37
  "express": "^4.21.2",
38
38
  "ws": "^8.18.3"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,9 +37,9 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@agent-relay/protocol": "2.0.18",
41
- "@agent-relay/config": "2.0.18",
42
- "@agent-relay/trajectory": "2.0.18"
40
+ "@agent-relay/protocol": "2.0.19",
41
+ "@agent-relay/config": "2.0.19",
42
+ "@agent-relay/trajectory": "2.0.19"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/mcp",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "MCP server for Agent Relay - native messaging tools for AI agents in Claude, Cursor, and VS Code",
5
5
  "author": "Agent Workforce Inc.",
6
6
  "license": "Apache-2.0",
@@ -47,7 +47,7 @@
47
47
  "prepublishOnly": "npm run clean && npm run build && npm test"
48
48
  },
49
49
  "dependencies": {
50
- "@agent-relay/config": "2.0.18",
50
+ "@agent-relay/config": "2.0.19",
51
51
  "@modelcontextprotocol/sdk": "^1.0.0",
52
52
  "smol-toml": "^1.6.0",
53
53
  "zod": "^3.23.8"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/memory",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/hooks": "2.0.18"
25
+ "@agent-relay/hooks": "2.0.19"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/policy",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/config": "2.0.18"
25
+ "@agent-relay/config": "2.0.19"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/protocol",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Wire protocol types and framing for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/resiliency",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Health monitoring, logging, metrics, and crash resilience utilities for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/sdk",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Lightweight SDK for agent-to-agent communication via Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "access": "public"
56
56
  },
57
57
  "dependencies": {
58
- "@agent-relay/protocol": "2.0.18"
58
+ "@agent-relay/protocol": "2.0.19"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=18.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/spawner",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Agent spawning types and utilities for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/state",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Agent state persistence for non-hook CLIs (Codex, Gemini, etc.)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/storage",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Storage adapters and interfaces for Relay message/session persistence",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -56,7 +56,7 @@
56
56
  }
57
57
  },
58
58
  "dependencies": {
59
- "@agent-relay/protocol": "2.0.18"
59
+ "@agent-relay/protocol": "2.0.19"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/telemetry",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Anonymous telemetry for Agent Relay usage analytics",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/trajectory",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Trajectory integration utilities (trail/PDERO) for Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/config": "2.0.18"
25
+ "@agent-relay/config": "2.0.19"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/user-directory",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "User directory service for agent-relay (per-user credential storage)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/resiliency": "2.0.18"
25
+ "@agent-relay/resiliency": "2.0.19"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/utils",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "Shared utilities for agent-relay: logging, name generation, command resolution, update checking",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -66,6 +66,10 @@ export declare class UniversalIdleDetector {
66
66
  /**
67
67
  * Check if the agent is in an editor mode (vim INSERT, REPLACE, etc.).
68
68
  * When in editor mode, message injection should be delayed.
69
+ *
70
+ * Note: Claude CLI shows "-- INSERT --" in its status bar (for vim keybindings mode)
71
+ * but this is NOT the same as being in vim. We exclude Claude CLI's status bar
72
+ * by checking for the "⏵" symbol that follows its mode indicator.
69
73
  */
70
74
  isInEditorMode(): boolean;
71
75
  /**
@@ -103,19 +103,32 @@ export class UniversalIdleDetector {
103
103
  /**
104
104
  * Check if the agent is in an editor mode (vim INSERT, REPLACE, etc.).
105
105
  * When in editor mode, message injection should be delayed.
106
+ *
107
+ * Note: Claude CLI shows "-- INSERT --" in its status bar (for vim keybindings mode)
108
+ * but this is NOT the same as being in vim. We exclude Claude CLI's status bar
109
+ * by checking for the "⏵" symbol that follows its mode indicator.
106
110
  */
107
111
  isInEditorMode() {
108
112
  // Check the last portion of output for editor mode indicators
109
113
  const lastOutput = this.outputBuffer.slice(-500);
110
- // Vim/Neovim mode indicators
114
+ // Claude CLI status bar pattern - this is NOT vim editor mode
115
+ // Example: "-- INSERT -- ⏵⏵ bypass permissions on (shift+tab to cycle)"
116
+ // Also match: "-- NORMAL --", "-- VISUAL --" followed by Claude's UI elements
117
+ const claudeCliStatusBar = /-- (?:INSERT|NORMAL|VISUAL|REPLACE) --\s*[⏵⏴►▶]/;
118
+ if (claudeCliStatusBar.test(lastOutput)) {
119
+ return false;
120
+ }
121
+ // Vim/Neovim mode indicators (standalone, not part of Claude CLI status)
122
+ // These patterns require the mode indicator to be at the end of a line
123
+ // or followed only by whitespace, which matches vim's actual display
111
124
  const editorModePatterns = [
112
- /-- INSERT --/i,
113
- /-- REPLACE --/i,
114
- /-- VISUAL --/i,
115
- /-- VISUAL LINE --/i,
116
- /-- VISUAL BLOCK --/i,
117
- /-- SELECT --/i,
118
- /-- TERMINAL --/i,
125
+ /-- INSERT --\s*$/m,
126
+ /-- REPLACE --\s*$/m,
127
+ /-- VISUAL --\s*$/m,
128
+ /-- VISUAL LINE --\s*$/m,
129
+ /-- VISUAL BLOCK --\s*$/m,
130
+ /-- SELECT --\s*$/m,
131
+ /-- TERMINAL --\s*$/m,
119
132
  // Emacs indicators
120
133
  /\*\*\* Emacs/,
121
134
  /M-x/,
@@ -110,6 +110,7 @@ export declare class RelayPtyOrchestrator extends BaseWrapper {
110
110
  private readonly PERIODIC_REMINDER_INTERVAL_MS;
111
111
  private sessionStartTime;
112
112
  private isGracefulStop;
113
+ private earlyExitInfo?;
113
114
  private memoryMonitor;
114
115
  private memoryAlertHandler;
115
116
  private cgroupManager;
@@ -201,6 +202,10 @@ export declare class RelayPtyOrchestrator extends BaseWrapper {
201
202
  * Release agent via dashboard API
202
203
  */
203
204
  private releaseViaDashboardApi;
205
+ /**
206
+ * Check if the relay-pty process is still alive
207
+ */
208
+ private isProcessAlive;
204
209
  /**
205
210
  * Connect to the relay-pty socket
206
211
  */
@@ -87,6 +87,8 @@ export class RelayPtyOrchestrator extends BaseWrapper {
87
87
  sessionStartTime = 0;
88
88
  // Track if agent is being gracefully stopped (vs crashed)
89
89
  isGracefulStop = false;
90
+ // Track early process exit for better error messages
91
+ earlyExitInfo;
90
92
  // Memory/CPU monitoring
91
93
  memoryMonitor;
92
94
  memoryAlertHandler = null;
@@ -540,6 +542,8 @@ export class RelayPtyOrchestrator extends BaseWrapper {
540
542
  ...(this.config.args ?? []),
541
543
  ];
542
544
  this.log(` Spawning: ${binaryPath} ${args.join(' ')}`);
545
+ // Reset early exit info from any previous spawn attempt
546
+ this.earlyExitInfo = undefined;
543
547
  // For interactive mode, let Rust directly inherit stdin/stdout from the terminal
544
548
  // This is more robust than manual forwarding through pipes
545
549
  // We still pipe stderr to capture JSON parsed commands
@@ -566,10 +570,14 @@ export class RelayPtyOrchestrator extends BaseWrapper {
566
570
  this.handleOutput(text);
567
571
  });
568
572
  }
573
+ // Capture stderr for early exit diagnosis
574
+ let stderrBuffer = '';
569
575
  // Handle stderr (relay-pty logs and JSON output) - always needed
576
+ // Also captures to buffer for error diagnostics if process dies early
570
577
  if (proc.stderr) {
571
578
  proc.stderr.on('data', (data) => {
572
579
  const text = data.toString();
580
+ stderrBuffer += text;
573
581
  this.handleStderr(text);
574
582
  });
575
583
  }
@@ -577,6 +585,10 @@ export class RelayPtyOrchestrator extends BaseWrapper {
577
585
  proc.on('exit', (code, signal) => {
578
586
  const exitCode = code ?? (signal === 'SIGKILL' ? 137 : 1);
579
587
  this.log(` Process exited: code=${exitCode} signal=${signal}`);
588
+ // Capture early exit info for better error messages if socket not yet connected
589
+ if (!this.socketConnected) {
590
+ this.earlyExitInfo = { code, signal, stderr: stderrBuffer };
591
+ }
580
592
  this.running = false;
581
593
  // Get crash context before unregistering from memory monitor
582
594
  const crashContext = this.memoryMonitor.getCrashContext(this.config.name);
@@ -942,6 +954,22 @@ export class RelayPtyOrchestrator extends BaseWrapper {
942
954
  // =========================================================================
943
955
  // Socket communication
944
956
  // =========================================================================
957
+ /**
958
+ * Check if the relay-pty process is still alive
959
+ */
960
+ isProcessAlive() {
961
+ if (!this.relayPtyProcess || this.relayPtyProcess.exitCode !== null) {
962
+ return false;
963
+ }
964
+ try {
965
+ // Signal 0 checks if process exists without killing it
966
+ process.kill(this.relayPtyProcess.pid, 0);
967
+ return true;
968
+ }
969
+ catch {
970
+ return false;
971
+ }
972
+ }
945
973
  /**
946
974
  * Connect to the relay-pty socket
947
975
  */
@@ -949,6 +977,20 @@ export class RelayPtyOrchestrator extends BaseWrapper {
949
977
  const timeout = this.config.socketConnectTimeoutMs ?? 5000;
950
978
  const maxAttempts = this.config.socketReconnectAttempts ?? 3;
951
979
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
980
+ // Check if relay-pty process died before attempting connection
981
+ if (!this.isProcessAlive()) {
982
+ const exitInfo = this.earlyExitInfo;
983
+ if (exitInfo) {
984
+ const exitReason = exitInfo.signal
985
+ ? `signal ${exitInfo.signal}`
986
+ : `code ${exitInfo.code ?? 'unknown'}`;
987
+ const stderrHint = exitInfo.stderr
988
+ ? `\n stderr: ${exitInfo.stderr.trim().slice(0, 500)}`
989
+ : '';
990
+ throw new Error(`relay-pty process died early (${exitReason}).${stderrHint}`);
991
+ }
992
+ throw new Error('relay-pty process died before socket could be created');
993
+ }
952
994
  try {
953
995
  await this.attemptSocketConnection(timeout);
954
996
  this.log(` Socket connected`);
@@ -961,6 +1003,17 @@ export class RelayPtyOrchestrator extends BaseWrapper {
961
1003
  }
962
1004
  }
963
1005
  }
1006
+ // Final check for process death after all attempts
1007
+ if (!this.isProcessAlive() && this.earlyExitInfo) {
1008
+ const exitInfo = this.earlyExitInfo;
1009
+ const exitReason = exitInfo.signal
1010
+ ? `signal ${exitInfo.signal}`
1011
+ : `code ${exitInfo.code ?? 'unknown'}`;
1012
+ const stderrHint = exitInfo.stderr
1013
+ ? `\n stderr: ${exitInfo.stderr.trim().slice(0, 500)}`
1014
+ : '';
1015
+ throw new Error(`relay-pty process died during socket connection (${exitReason}).${stderrHint}`);
1016
+ }
964
1017
  throw new Error(`Failed to connect to socket after ${maxAttempts} attempts`);
965
1018
  }
966
1019
  /**
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/wrapper",
3
- "version": "2.0.18",
3
+ "version": "2.0.19",
4
4
  "description": "CLI agent wrappers for Agent Relay - tmux, pty integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -30,11 +30,11 @@
30
30
  "clean": "rm -rf dist"
31
31
  },
32
32
  "dependencies": {
33
- "@agent-relay/api-types": "2.0.18",
34
- "@agent-relay/protocol": "2.0.18",
35
- "@agent-relay/config": "2.0.18",
36
- "@agent-relay/continuity": "2.0.18",
37
- "@agent-relay/resiliency": "2.0.18"
33
+ "@agent-relay/api-types": "2.0.19",
34
+ "@agent-relay/protocol": "2.0.19",
35
+ "@agent-relay/config": "2.0.19",
36
+ "@agent-relay/continuity": "2.0.19",
37
+ "@agent-relay/resiliency": "2.0.19"
38
38
  },
39
39
  "devDependencies": {
40
40
  "typescript": "^5.9.3",
@@ -73,6 +73,36 @@ function getRelayPtyBinaryName() {
73
73
  return `relay-pty-${targetPlatform}-${targetArch}`;
74
74
  }
75
75
 
76
+ /**
77
+ * Re-sign a binary with ad-hoc signature on macOS.
78
+ * This is required because macOS code signature validation can fail
79
+ * when binaries are copied/downloaded, causing SIGKILL on execution.
80
+ *
81
+ * The codesign tool is always available on macOS (part of the system).
82
+ * This is a common solution for npm packages distributing native binaries.
83
+ * Similar approach is used by esbuild, swc, and other Rust/Go tools.
84
+ *
85
+ * @param {string} binaryPath - Path to the binary to sign
86
+ * @returns {boolean} - Whether signing succeeded
87
+ */
88
+ function resignBinaryForMacOS(binaryPath) {
89
+ if (os.platform() !== 'darwin') {
90
+ return true; // Only needed on macOS
91
+ }
92
+
93
+ try {
94
+ // codesign is always available on macOS as a system utility
95
+ execSync(`codesign --force --sign - "${binaryPath}"`, { stdio: 'pipe' });
96
+ return true;
97
+ } catch (err) {
98
+ // This shouldn't happen on a normal macOS system, but handle gracefully
99
+ warn(`Failed to re-sign binary: ${err.message}`);
100
+ warn('The binary may fail to execute due to code signature issues.');
101
+ warn('You can manually fix this by running: codesign --force --sign - ' + binaryPath);
102
+ return false;
103
+ }
104
+ }
105
+
76
106
  /**
77
107
  * Install the relay-pty binary for the current platform
78
108
  */
@@ -103,6 +133,9 @@ function installRelayPtyBinary() {
103
133
  const sourceStats = fs.statSync(sourcePath);
104
134
  const targetStats = fs.statSync(targetPath);
105
135
  if (sourceStats.size === targetStats.size) {
136
+ // Re-sign even if already installed to ensure signature is valid
137
+ // This fixes issues where previous installs have invalid signatures
138
+ resignBinaryForMacOS(targetPath);
106
139
  info('relay-pty binary already installed');
107
140
  return true;
108
141
  }
@@ -115,7 +148,14 @@ function installRelayPtyBinary() {
115
148
  try {
116
149
  fs.copyFileSync(sourcePath, targetPath);
117
150
  fs.chmodSync(targetPath, 0o755);
118
- success(`Installed relay-pty binary for ${os.platform()}-${os.arch()}`);
151
+
152
+ // Re-sign the binary on macOS to prevent code signature validation failures
153
+ // Without this, macOS may SIGKILL the process immediately on execution
154
+ if (resignBinaryForMacOS(targetPath)) {
155
+ success(`Installed relay-pty binary for ${os.platform()}-${os.arch()}`);
156
+ } else {
157
+ warn(`Installed relay-pty binary but signing failed - may not work on macOS`);
158
+ }
119
159
  return true;
120
160
  } catch (err) {
121
161
  warn(`Failed to install relay-pty binary: ${err.message}`);