agent-relay 2.0.21 → 2.0.22

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 (117) hide show
  1. package/dist/dashboard/out/404.html +1 -1
  2. package/dist/dashboard/out/app/onboarding.html +1 -1
  3. package/dist/dashboard/out/app/onboarding.txt +1 -1
  4. package/dist/dashboard/out/app.html +1 -1
  5. package/dist/dashboard/out/app.txt +1 -1
  6. package/dist/dashboard/out/cloud/link.html +1 -1
  7. package/dist/dashboard/out/cloud/link.txt +1 -1
  8. package/dist/dashboard/out/complete-profile.html +1 -1
  9. package/dist/dashboard/out/complete-profile.txt +1 -1
  10. package/dist/dashboard/out/connect-repos.html +1 -1
  11. package/dist/dashboard/out/connect-repos.txt +1 -1
  12. package/dist/dashboard/out/history.html +1 -1
  13. package/dist/dashboard/out/history.txt +1 -1
  14. package/dist/dashboard/out/index.html +1 -1
  15. package/dist/dashboard/out/index.txt +1 -1
  16. package/dist/dashboard/out/login.html +1 -1
  17. package/dist/dashboard/out/login.txt +1 -1
  18. package/dist/dashboard/out/metrics.html +1 -1
  19. package/dist/dashboard/out/metrics.txt +1 -1
  20. package/dist/dashboard/out/pricing.html +1 -1
  21. package/dist/dashboard/out/pricing.txt +1 -1
  22. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  23. package/dist/dashboard/out/providers/setup/claude.txt +1 -1
  24. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  25. package/dist/dashboard/out/providers/setup/codex.txt +1 -1
  26. package/dist/dashboard/out/providers/setup/cursor.html +1 -1
  27. package/dist/dashboard/out/providers/setup/cursor.txt +1 -1
  28. package/dist/dashboard/out/providers.html +1 -1
  29. package/dist/dashboard/out/providers.txt +1 -1
  30. package/dist/dashboard/out/signup.html +1 -1
  31. package/dist/dashboard/out/signup.txt +1 -1
  32. package/package.json +16 -16
  33. package/packages/api-types/package.json +1 -1
  34. package/packages/bridge/package.json +8 -8
  35. package/packages/cli-tester/package.json +1 -1
  36. package/packages/cloud/package.json +6 -6
  37. package/packages/config/package.json +2 -2
  38. package/packages/continuity/package.json +1 -1
  39. package/packages/daemon/dist/orchestrator.js +2 -0
  40. package/packages/daemon/dist/router.d.ts +5 -0
  41. package/packages/daemon/dist/router.js +31 -0
  42. package/packages/daemon/dist/server.d.ts +5 -0
  43. package/packages/daemon/dist/server.js +131 -1
  44. package/packages/daemon/package.json +12 -12
  45. package/packages/dashboard/package.json +13 -13
  46. package/packages/dashboard/ui-dist/404.html +1 -1
  47. package/packages/dashboard/ui-dist/app/onboarding.html +1 -1
  48. package/packages/dashboard/ui-dist/app/onboarding.txt +1 -1
  49. package/packages/dashboard/ui-dist/app.html +1 -1
  50. package/packages/dashboard/ui-dist/app.txt +1 -1
  51. package/packages/dashboard/ui-dist/cloud/link.html +1 -1
  52. package/packages/dashboard/ui-dist/cloud/link.txt +1 -1
  53. package/packages/dashboard/ui-dist/complete-profile.html +1 -1
  54. package/packages/dashboard/ui-dist/complete-profile.txt +1 -1
  55. package/packages/dashboard/ui-dist/connect-repos.html +1 -1
  56. package/packages/dashboard/ui-dist/connect-repos.txt +1 -1
  57. package/packages/dashboard/ui-dist/history.html +1 -1
  58. package/packages/dashboard/ui-dist/history.txt +1 -1
  59. package/packages/dashboard/ui-dist/index.html +1 -1
  60. package/packages/dashboard/ui-dist/index.txt +1 -1
  61. package/packages/dashboard/ui-dist/login.html +1 -1
  62. package/packages/dashboard/ui-dist/login.txt +1 -1
  63. package/packages/dashboard/ui-dist/metrics.html +1 -1
  64. package/packages/dashboard/ui-dist/metrics.txt +1 -1
  65. package/packages/dashboard/ui-dist/pricing.html +1 -1
  66. package/packages/dashboard/ui-dist/pricing.txt +1 -1
  67. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -1
  68. package/packages/dashboard/ui-dist/providers/setup/claude.txt +1 -1
  69. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -1
  70. package/packages/dashboard/ui-dist/providers/setup/codex.txt +1 -1
  71. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -1
  72. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +1 -1
  73. package/packages/dashboard/ui-dist/providers.html +1 -1
  74. package/packages/dashboard/ui-dist/providers.txt +1 -1
  75. package/packages/dashboard/ui-dist/signup.html +1 -1
  76. package/packages/dashboard/ui-dist/signup.txt +1 -1
  77. package/packages/dashboard-server/package.json +12 -12
  78. package/packages/hooks/package.json +4 -4
  79. package/packages/mcp/dist/client.d.ts +15 -0
  80. package/packages/mcp/dist/client.js +9 -0
  81. package/packages/mcp/dist/server.js +13 -1
  82. package/packages/mcp/dist/tools/index.d.ts +2 -0
  83. package/packages/mcp/dist/tools/index.js +2 -0
  84. package/packages/mcp/dist/tools/relay-connected.d.ts +17 -0
  85. package/packages/mcp/dist/tools/relay-connected.js +40 -0
  86. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +20 -0
  87. package/packages/mcp/dist/tools/relay-remove-agent.js +50 -0
  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/dist/types.d.ts +46 -1
  92. package/packages/protocol/package.json +1 -1
  93. package/packages/resiliency/package.json +1 -1
  94. package/packages/sdk/dist/client.d.ts +22 -1
  95. package/packages/sdk/dist/client.js +31 -0
  96. package/packages/sdk/dist/protocol/index.d.ts +1 -1
  97. package/packages/sdk/dist/protocol/types.d.ts +35 -1
  98. package/packages/sdk/package.json +2 -2
  99. package/packages/spawner/package.json +1 -1
  100. package/packages/state/package.json +1 -1
  101. package/packages/storage/dist/adapter.d.ts +4 -0
  102. package/packages/storage/dist/sqlite-adapter.d.ts +10 -0
  103. package/packages/storage/dist/sqlite-adapter.js +26 -0
  104. package/packages/storage/package.json +2 -2
  105. package/packages/telemetry/package.json +1 -1
  106. package/packages/trajectory/package.json +2 -2
  107. package/packages/user-directory/package.json +2 -2
  108. package/packages/utils/package.json +1 -1
  109. package/packages/wrapper/package.json +6 -6
  110. /package/dist/dashboard/out/_next/static/{7MZPqYkVGw3EGzVBkVmY9 → 91mkGYq3qbG8WHE6VytQ8}/_buildManifest.js +0 -0
  111. /package/dist/dashboard/out/_next/static/{7MZPqYkVGw3EGzVBkVmY9 → 91mkGYq3qbG8WHE6VytQ8}/_ssgManifest.js +0 -0
  112. /package/packages/dashboard/ui-dist/_next/static/{7MZPqYkVGw3EGzVBkVmY9 → 91mkGYq3qbG8WHE6VytQ8}/_buildManifest.js +0 -0
  113. /package/packages/dashboard/ui-dist/_next/static/{7MZPqYkVGw3EGzVBkVmY9 → 91mkGYq3qbG8WHE6VytQ8}/_ssgManifest.js +0 -0
  114. /package/packages/dashboard/ui-dist/_next/static/{iJ3Uiz3IrqUJL7IxKZHiV → T2rV14eEU5OweDeV29SvG}/_buildManifest.js +0 -0
  115. /package/packages/dashboard/ui-dist/_next/static/{iJ3Uiz3IrqUJL7IxKZHiV → T2rV14eEU5OweDeV29SvG}/_ssgManifest.js +0 -0
  116. /package/packages/dashboard/ui-dist/_next/static/{l-jd878zUJ_IlraqEWMZc → l8L2OscDSR2vsMIlWcC48}/_buildManifest.js +0 -0
  117. /package/packages/dashboard/ui-dist/_next/static/{l-jd878zUJ_IlraqEWMZc → l8L2OscDSR2vsMIlWcC48}/_ssgManifest.js +0 -0
@@ -3,4 +3,4 @@
3
3
  transition-all duration-300
4
4
  drop-shadow-[0_0_8px_rgba(0,217,255,0.3)]
5
5
 
6
- " aria-label="Agent Relay Logo" role="img"><path d="M30 80 L 50 20 L 70 80" stroke="#00d9ff" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill="none"></path><line x1="40" y1="50" x2="60" y2="50" stroke="#00d9ff" stroke-width="5" stroke-linecap="round"></line><path d="M50 20 L 50 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" opacity="0.7"></path><path d="M50 20 C 80 20 80 50 50 50 L 80 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"></path></svg><h1 class="mt-4 text-3xl font-bold text-white">Get Started</h1><p class="mt-2 text-text-muted text-center">Create your account and start orchestrating AI agents</p></div><div class="bg-bg-primary/80 backdrop-blur-sm border border-border-subtle rounded-2xl p-8 shadow-xl"><div><div class="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\":\"7MZPqYkVGw3EGzVBkVmY9\",\"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>
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\":\"91mkGYq3qbG8WHE6VytQ8\",\"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:["7MZPqYkVGw3EGzVBkVmY9",[[["",{"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]]]]
5
+ 0:["91mkGYq3qbG8WHE6VytQ8",[[["",{"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.21",
3
+ "version": "2.0.22",
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.21",
26
- "@agent-relay/config": "2.0.21",
27
- "@agent-relay/storage": "2.0.21",
28
- "@agent-relay/bridge": "2.0.21",
29
- "@agent-relay/utils": "2.0.21",
30
- "@agent-relay/resiliency": "2.0.21",
31
- "@agent-relay/trajectory": "2.0.21",
32
- "@agent-relay/cloud": "2.0.21",
33
- "@agent-relay/daemon": "2.0.21",
34
- "@agent-relay/user-directory": "2.0.21",
35
- "@agent-relay/sdk": "2.0.21",
25
+ "@agent-relay/protocol": "2.0.22",
26
+ "@agent-relay/config": "2.0.22",
27
+ "@agent-relay/storage": "2.0.22",
28
+ "@agent-relay/bridge": "2.0.22",
29
+ "@agent-relay/utils": "2.0.22",
30
+ "@agent-relay/resiliency": "2.0.22",
31
+ "@agent-relay/trajectory": "2.0.22",
32
+ "@agent-relay/cloud": "2.0.22",
33
+ "@agent-relay/daemon": "2.0.22",
34
+ "@agent-relay/user-directory": "2.0.22",
35
+ "@agent-relay/sdk": "2.0.22",
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.21",
3
+ "version": "2.0.22",
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.21",
41
- "@agent-relay/config": "2.0.21",
42
- "@agent-relay/trajectory": "2.0.21"
40
+ "@agent-relay/protocol": "2.0.22",
41
+ "@agent-relay/config": "2.0.22",
42
+ "@agent-relay/trajectory": "2.0.22"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -102,6 +102,21 @@ export interface RelayClient {
102
102
  idle?: boolean;
103
103
  parent?: string;
104
104
  }>>;
105
+ listConnectedAgents(options?: {
106
+ project?: string;
107
+ }): Promise<Array<{
108
+ name: string;
109
+ cli?: string;
110
+ idle?: boolean;
111
+ parent?: string;
112
+ }>>;
113
+ removeAgent(name: string, options?: {
114
+ removeMessages?: boolean;
115
+ }): Promise<{
116
+ success: boolean;
117
+ removed: boolean;
118
+ message?: string;
119
+ }>;
105
120
  getHealth(options?: {
106
121
  include_crashes?: boolean;
107
122
  include_alerts?: boolean;
@@ -252,6 +252,15 @@ export function createRelayClient(options) {
252
252
  const response = await request('LIST_AGENTS', payload);
253
253
  return response.agents || [];
254
254
  },
255
+ async listConnectedAgents(opts = {}) {
256
+ const payload = { project: opts.project };
257
+ const response = await request('LIST_CONNECTED_AGENTS', payload);
258
+ return response.agents || [];
259
+ },
260
+ async removeAgent(name, opts = {}) {
261
+ const payload = { name, removeMessages: opts.removeMessages };
262
+ return request('REMOVE_AGENT', payload);
263
+ },
255
264
  async getHealth(opts = {}) {
256
265
  const payload = {
257
266
  includeCrashes: opts.include_crashes,
@@ -1,7 +1,7 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
3
  import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
4
- import { relaySendTool, relaySendSchema, handleRelaySend, relayInboxTool, relayInboxSchema, handleRelayInbox, relayWhoTool, relayWhoSchema, handleRelayWho, relaySpawnTool, relaySpawnSchema, handleRelaySpawn, relayReleaseTool, relayReleaseSchema, handleRelayRelease, relayStatusTool, relayStatusSchema, handleRelayStatus, relayLogsTool, relayLogsSchema, handleRelayLogs, relayMetricsTool, relayMetricsSchema, handleRelayMetrics, relayHealthTool, relayHealthSchema, handleRelayHealth, relayContinuityTool, relayContinuitySchema, handleRelayContinuity, } from './tools/index.js';
4
+ import { relaySendTool, relaySendSchema, handleRelaySend, relayInboxTool, relayInboxSchema, handleRelayInbox, relayWhoTool, relayWhoSchema, handleRelayWho, relaySpawnTool, relaySpawnSchema, handleRelaySpawn, relayReleaseTool, relayReleaseSchema, handleRelayRelease, relayStatusTool, relayStatusSchema, handleRelayStatus, relayLogsTool, relayLogsSchema, handleRelayLogs, relayMetricsTool, relayMetricsSchema, handleRelayMetrics, relayHealthTool, relayHealthSchema, handleRelayHealth, relayContinuityTool, relayContinuitySchema, handleRelayContinuity, relayConnectedTool, relayConnectedSchema, handleRelayConnected, relayRemoveAgentTool, relayRemoveAgentSchema, handleRelayRemoveAgent, } from './tools/index.js';
5
5
  import { protocolPrompt, getProtocolPrompt } from './prompts/index.js';
6
6
  import { agentsResource, getAgentsResource, inboxResource, getInboxResource, projectResource, getProjectResource, } from './resources/index.js';
7
7
  /**
@@ -11,8 +11,10 @@ const TOOLS = [
11
11
  relaySendTool,
12
12
  relayInboxTool,
13
13
  relayWhoTool,
14
+ relayConnectedTool,
14
15
  relaySpawnTool,
15
16
  relayReleaseTool,
17
+ relayRemoveAgentTool,
16
18
  relayStatusTool,
17
19
  relayLogsTool,
18
20
  relayMetricsTool,
@@ -68,6 +70,11 @@ export function createMCPServer(client, config) {
68
70
  result = await handleRelayWho(client, input);
69
71
  break;
70
72
  }
73
+ case 'relay_connected': {
74
+ const input = relayConnectedSchema.parse(args);
75
+ result = await handleRelayConnected(client, input);
76
+ break;
77
+ }
71
78
  case 'relay_spawn': {
72
79
  const input = relaySpawnSchema.parse(args);
73
80
  result = await handleRelaySpawn(client, input);
@@ -78,6 +85,11 @@ export function createMCPServer(client, config) {
78
85
  result = await handleRelayRelease(client, input);
79
86
  break;
80
87
  }
88
+ case 'relay_remove_agent': {
89
+ const input = relayRemoveAgentSchema.parse(args);
90
+ result = await handleRelayRemoveAgent(client, input);
91
+ break;
92
+ }
81
93
  case 'relay_status': {
82
94
  const input = relayStatusSchema.parse(args);
83
95
  result = await handleRelayStatus(client, input);
@@ -8,4 +8,6 @@ export { relayLogsTool, relayLogsSchema, handleRelayLogs, type RelayLogsInput, }
8
8
  export { relayMetricsTool, relayMetricsSchema, handleRelayMetrics, type RelayMetricsInput, } from './relay-metrics.js';
9
9
  export { relayHealthTool, relayHealthSchema, handleRelayHealth, type RelayHealthInput, } from './relay-health.js';
10
10
  export { relayContinuityTool, relayContinuitySchema, handleRelayContinuity, type RelayContinuityInput, } from './relay-continuity.js';
11
+ export { relayConnectedTool, relayConnectedSchema, handleRelayConnected, type RelayConnectedInput, } from './relay-connected.js';
12
+ export { relayRemoveAgentTool, relayRemoveAgentSchema, handleRelayRemoveAgent, type RelayRemoveAgentInput, } from './relay-remove-agent.js';
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -8,4 +8,6 @@ export { relayLogsTool, relayLogsSchema, handleRelayLogs, } from './relay-logs.j
8
8
  export { relayMetricsTool, relayMetricsSchema, handleRelayMetrics, } from './relay-metrics.js';
9
9
  export { relayHealthTool, relayHealthSchema, handleRelayHealth, } from './relay-health.js';
10
10
  export { relayContinuityTool, relayContinuitySchema, handleRelayContinuity, } from './relay-continuity.js';
11
+ export { relayConnectedTool, relayConnectedSchema, handleRelayConnected, } from './relay-connected.js';
12
+ export { relayRemoveAgentTool, relayRemoveAgentSchema, handleRelayRemoveAgent, } from './relay-remove-agent.js';
11
13
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { RelayClient } from '../client.js';
4
+ export declare const relayConnectedSchema: z.ZodObject<{
5
+ project: z.ZodOptional<z.ZodString>;
6
+ }, "strip", z.ZodTypeAny, {
7
+ project?: string | undefined;
8
+ }, {
9
+ project?: string | undefined;
10
+ }>;
11
+ export type RelayConnectedInput = z.infer<typeof relayConnectedSchema>;
12
+ export declare const relayConnectedTool: Tool;
13
+ /**
14
+ * List only currently connected agents (not historical/registered).
15
+ */
16
+ export declare function handleRelayConnected(client: RelayClient, input: RelayConnectedInput): Promise<string>;
17
+ //# sourceMappingURL=relay-connected.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ export const relayConnectedSchema = z.object({
3
+ project: z.string().optional().describe('Filter by project (for multi-project setups)'),
4
+ });
5
+ export const relayConnectedTool = {
6
+ name: 'relay_connected',
7
+ description: `List only currently connected agents in the relay network.
8
+
9
+ Unlike relay_who which includes historical/registered agents, this only shows
10
+ agents that are actively connected right now. Use this for accurate liveness checks.
11
+
12
+ Example output:
13
+ - Alice (claude) - connected
14
+ - Bob (codex) - connected`,
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ project: {
19
+ type: 'string',
20
+ description: 'Filter by project',
21
+ },
22
+ },
23
+ required: [],
24
+ },
25
+ };
26
+ /**
27
+ * List only currently connected agents (not historical/registered).
28
+ */
29
+ export async function handleRelayConnected(client, input) {
30
+ const agents = await client.listConnectedAgents(input);
31
+ if (agents.length === 0) {
32
+ return 'No agents currently connected.';
33
+ }
34
+ const formatted = agents.map((a) => {
35
+ const worker = a.parent ? ` [worker of: ${a.parent}]` : '';
36
+ return `- ${a.name} (${a.cli || 'unknown'}) - connected${worker}`;
37
+ });
38
+ return `${agents.length} agent(s) currently connected:\n${formatted.join('\n')}`;
39
+ }
40
+ //# sourceMappingURL=relay-connected.js.map
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { RelayClient } from '../client.js';
4
+ export declare const relayRemoveAgentSchema: z.ZodObject<{
5
+ name: z.ZodString;
6
+ remove_messages: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ name: string;
9
+ remove_messages: boolean;
10
+ }, {
11
+ name: string;
12
+ remove_messages?: boolean | undefined;
13
+ }>;
14
+ export type RelayRemoveAgentInput = z.infer<typeof relayRemoveAgentSchema>;
15
+ export declare const relayRemoveAgentTool: Tool;
16
+ /**
17
+ * Remove an agent from the registry.
18
+ */
19
+ export declare function handleRelayRemoveAgent(client: RelayClient, input: RelayRemoveAgentInput): Promise<string>;
20
+ //# sourceMappingURL=relay-remove-agent.d.ts.map
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ export const relayRemoveAgentSchema = z.object({
3
+ name: z.string().describe('Name of the agent to remove from the registry'),
4
+ remove_messages: z.boolean().optional().default(false).describe('Also remove all messages from/to this agent'),
5
+ });
6
+ export const relayRemoveAgentTool = {
7
+ name: 'relay_remove_agent',
8
+ description: `Remove a stale agent from the relay registry.
9
+
10
+ Use this to clean up agents that are no longer needed or have become stale.
11
+ This removes the agent from:
12
+ - The agent registry (agents.json)
13
+ - The sessions table in storage
14
+ - Optionally, all messages from/to this agent
15
+
16
+ WARNING: This permanently removes the agent's history. Use with caution.`,
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ name: {
21
+ type: 'string',
22
+ description: 'Name of the agent to remove',
23
+ },
24
+ remove_messages: {
25
+ type: 'boolean',
26
+ description: 'Also remove all messages from/to this agent',
27
+ default: false,
28
+ },
29
+ },
30
+ required: ['name'],
31
+ },
32
+ };
33
+ /**
34
+ * Remove an agent from the registry.
35
+ */
36
+ export async function handleRelayRemoveAgent(client, input) {
37
+ const result = await client.removeAgent(input.name, {
38
+ removeMessages: input.remove_messages,
39
+ });
40
+ if (result.success && result.removed) {
41
+ return `✓ ${result.message}`;
42
+ }
43
+ else if (result.success && !result.removed) {
44
+ return `Agent "${input.name}" was not found in registry or storage.`;
45
+ }
46
+ else {
47
+ return `✗ Failed to remove agent: ${result.message}`;
48
+ }
49
+ }
50
+ //# sourceMappingURL=relay-remove-agent.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/mcp",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
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.21",
50
+ "@agent-relay/config": "2.0.22",
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.21",
3
+ "version": "2.0.22",
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.21"
25
+ "@agent-relay/hooks": "2.0.22"
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.21",
3
+ "version": "2.0.22",
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.21"
25
+ "@agent-relay/config": "2.0.22"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -5,7 +5,7 @@
5
5
  * These types define the wire protocol for agent-to-agent communication.
6
6
  */
7
7
  export declare const PROTOCOL_VERSION = 1;
8
- export type MessageType = 'HELLO' | 'WELCOME' | 'SEND' | 'DELIVER' | 'ACK' | 'NACK' | 'PING' | 'PONG' | 'ERROR' | 'BUSY' | 'RESUME' | 'BYE' | 'STATE' | 'SYNC' | 'SYNC_SNAPSHOT' | 'SYNC_DELTA' | 'SUBSCRIBE' | 'UNSUBSCRIBE' | 'SHADOW_BIND' | 'SHADOW_UNBIND' | 'LOG' | 'CHANNEL_JOIN' | 'CHANNEL_LEAVE' | 'CHANNEL_MESSAGE' | 'CHANNEL_INFO' | 'CHANNEL_MEMBERS' | 'CHANNEL_TYPING' | 'SPAWN' | 'SPAWN_RESULT' | 'RELEASE' | 'RELEASE_RESULT' | 'STATUS' | 'STATUS_RESPONSE' | 'INBOX' | 'INBOX_RESPONSE' | 'LIST_AGENTS' | 'LIST_AGENTS_RESPONSE' | 'HEALTH' | 'HEALTH_RESPONSE' | 'METRICS' | 'METRICS_RESPONSE';
8
+ export type MessageType = 'HELLO' | 'WELCOME' | 'SEND' | 'DELIVER' | 'ACK' | 'NACK' | 'PING' | 'PONG' | 'ERROR' | 'BUSY' | 'RESUME' | 'BYE' | 'STATE' | 'SYNC' | 'SYNC_SNAPSHOT' | 'SYNC_DELTA' | 'SUBSCRIBE' | 'UNSUBSCRIBE' | 'SHADOW_BIND' | 'SHADOW_UNBIND' | 'LOG' | 'CHANNEL_JOIN' | 'CHANNEL_LEAVE' | 'CHANNEL_MESSAGE' | 'CHANNEL_INFO' | 'CHANNEL_MEMBERS' | 'CHANNEL_TYPING' | 'SPAWN' | 'SPAWN_RESULT' | 'RELEASE' | 'RELEASE_RESULT' | 'STATUS' | 'STATUS_RESPONSE' | 'INBOX' | 'INBOX_RESPONSE' | 'LIST_AGENTS' | 'LIST_AGENTS_RESPONSE' | 'LIST_CONNECTED_AGENTS' | 'LIST_CONNECTED_AGENTS_RESPONSE' | 'REMOVE_AGENT' | 'REMOVE_AGENT_RESPONSE' | 'HEALTH' | 'HEALTH_RESPONSE' | 'METRICS' | 'METRICS_RESPONSE';
9
9
  export type PayloadKind = 'message' | 'action' | 'state' | 'thinking';
10
10
  /**
11
11
  * Base envelope structure for all protocol messages.
@@ -412,12 +412,57 @@ export interface ListAgentsResponsePayload {
412
412
  parent?: string;
413
413
  }>;
414
414
  }
415
+ /**
416
+ * Payload for LIST_CONNECTED_AGENTS request.
417
+ * Returns only currently connected agents (not historical/registered agents).
418
+ */
419
+ export interface ListConnectedAgentsPayload {
420
+ /** Filter by project */
421
+ project?: string;
422
+ }
423
+ /**
424
+ * Payload for LIST_CONNECTED_AGENTS_RESPONSE.
425
+ */
426
+ export interface ListConnectedAgentsResponsePayload {
427
+ /** List of currently connected agents */
428
+ agents: Array<{
429
+ name: string;
430
+ cli?: string;
431
+ idle?: boolean;
432
+ parent?: string;
433
+ }>;
434
+ }
435
+ /**
436
+ * Payload for REMOVE_AGENT request.
437
+ * Removes an agent from the registry (sessions, agents.json).
438
+ */
439
+ export interface RemoveAgentPayload {
440
+ /** Agent name to remove */
441
+ name: string;
442
+ /** If true, also removes all messages from/to this agent */
443
+ removeMessages?: boolean;
444
+ }
445
+ /**
446
+ * Payload for REMOVE_AGENT_RESPONSE.
447
+ */
448
+ export interface RemoveAgentResponsePayload {
449
+ /** Whether the operation succeeded */
450
+ success: boolean;
451
+ /** Whether an agent was actually removed */
452
+ removed: boolean;
453
+ /** Human-readable message */
454
+ message?: string;
455
+ }
415
456
  export type StatusEnvelope = Envelope<StatusPayload>;
416
457
  export type StatusResponseEnvelope = Envelope<StatusResponsePayload>;
417
458
  export type InboxEnvelope = Envelope<InboxPayload>;
418
459
  export type InboxResponseEnvelope = Envelope<InboxResponsePayload>;
419
460
  export type ListAgentsEnvelope = Envelope<ListAgentsPayload>;
420
461
  export type ListAgentsResponseEnvelope = Envelope<ListAgentsResponsePayload>;
462
+ export type ListConnectedAgentsEnvelope = Envelope<ListConnectedAgentsPayload>;
463
+ export type ListConnectedAgentsResponseEnvelope = Envelope<ListConnectedAgentsResponsePayload>;
464
+ export type RemoveAgentEnvelope = Envelope<RemoveAgentPayload>;
465
+ export type RemoveAgentResponseEnvelope = Envelope<RemoveAgentResponsePayload>;
421
466
  /**
422
467
  * Payload for HEALTH request.
423
468
  */
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/protocol",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
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.21",
3
+ "version": "2.0.22",
4
4
  "description": "Health monitoring, logging, metrics, and crash resilience utilities for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Lightweight client for agent-to-agent communication via Agent Relay daemon.
6
6
  */
7
- import { type Envelope, type SendPayload, type SendMeta, type AckPayload, type PayloadKind, type SpeakOnTrigger, type EntityType, type ChannelMessagePayload, type MessageAttachment, type SpawnResultPayload, type ReleaseResultPayload, type StatusResponsePayload, type InboxMessage, type AgentInfo, type HealthResponsePayload, type MetricsResponsePayload, type CreateProposalOptions, type VoteOptions } from './protocol/types.js';
7
+ import { type Envelope, type SendPayload, type SendMeta, type AckPayload, type PayloadKind, type SpeakOnTrigger, type EntityType, type ChannelMessagePayload, type MessageAttachment, type SpawnResultPayload, type ReleaseResultPayload, type StatusResponsePayload, type InboxMessage, type AgentInfo, type RemoveAgentResponsePayload, type HealthResponsePayload, type MetricsResponsePayload, type CreateProposalOptions, type VoteOptions } from './protocol/types.js';
8
8
  export type ClientState = 'DISCONNECTED' | 'CONNECTING' | 'HANDSHAKING' | 'READY' | 'BACKOFF';
9
9
  export interface SyncOptions {
10
10
  timeoutMs?: number;
@@ -289,6 +289,27 @@ export declare class RelayClient {
289
289
  getMetrics(options?: {
290
290
  agent?: string;
291
291
  }): Promise<MetricsResponsePayload>;
292
+ /**
293
+ * List only currently connected agents (not historical/registered agents).
294
+ * Use this instead of listAgents() when you need accurate liveness information.
295
+ * @param options - Filter options
296
+ * @param options.project - Filter by project
297
+ * @returns Array of currently connected agent info
298
+ */
299
+ listConnectedAgents(options?: {
300
+ project?: string;
301
+ }): Promise<AgentInfo[]>;
302
+ /**
303
+ * Remove an agent from the registry (sessions, agents.json).
304
+ * Use this to clean up stale agents that are no longer needed.
305
+ * @param name - Agent name to remove
306
+ * @param options - Removal options
307
+ * @param options.removeMessages - Also remove all messages from/to this agent (default: false)
308
+ * @returns Result indicating if the agent was removed
309
+ */
310
+ removeAgent(name: string, options?: {
311
+ removeMessages?: boolean;
312
+ }): Promise<RemoveAgentResponsePayload>;
292
313
  private setState;
293
314
  private sendHello;
294
315
  private send;
@@ -731,6 +731,35 @@ export class RelayClient {
731
731
  };
732
732
  return this.query('METRICS', payload);
733
733
  }
734
+ /**
735
+ * List only currently connected agents (not historical/registered agents).
736
+ * Use this instead of listAgents() when you need accurate liveness information.
737
+ * @param options - Filter options
738
+ * @param options.project - Filter by project
739
+ * @returns Array of currently connected agent info
740
+ */
741
+ async listConnectedAgents(options = {}) {
742
+ const payload = {
743
+ project: options.project,
744
+ };
745
+ const response = await this.query('LIST_CONNECTED_AGENTS', payload);
746
+ return response.agents || [];
747
+ }
748
+ /**
749
+ * Remove an agent from the registry (sessions, agents.json).
750
+ * Use this to clean up stale agents that are no longer needed.
751
+ * @param name - Agent name to remove
752
+ * @param options - Removal options
753
+ * @param options.removeMessages - Also remove all messages from/to this agent (default: false)
754
+ * @returns Result indicating if the agent was removed
755
+ */
756
+ async removeAgent(name, options = {}) {
757
+ const payload = {
758
+ name,
759
+ removeMessages: options.removeMessages,
760
+ };
761
+ return this.query('REMOVE_AGENT', payload);
762
+ }
734
763
  // Private methods
735
764
  setState(state) {
736
765
  this._state = state;
@@ -839,6 +868,8 @@ export class RelayClient {
839
868
  case 'STATUS_RESPONSE':
840
869
  case 'INBOX_RESPONSE':
841
870
  case 'LIST_AGENTS_RESPONSE':
871
+ case 'LIST_CONNECTED_AGENTS_RESPONSE':
872
+ case 'REMOVE_AGENT_RESPONSE':
842
873
  case 'HEALTH_RESPONSE':
843
874
  case 'METRICS_RESPONSE':
844
875
  this.handleQueryResponse(envelope);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Protocol exports for @agent-relay/sdk
3
3
  */
4
- export { PROTOCOL_VERSION, type MessageType, type PayloadKind, type Envelope, type EntityType, type HelloPayload, type WelcomePayload, type SendPayload, type SendMeta, type SyncMeta, type DeliveryInfo, type AckPayload, type NackPayload, type BusyPayload, type PingPayload, type PongPayload, type ErrorCode, type ErrorPayload, type LogPayload, type SyncStream, type SyncPayload, type SpeakOnTrigger, type ShadowConfig, type ShadowBindPayload, type ShadowUnbindPayload, type SpawnPayload, type SpawnPolicyDecision, type SpawnResultPayload, type ReleasePayload, type ReleaseResultPayload, type ConsensusType, type VoteValue, type ProposalStatus, type CreateProposalOptions, type VoteOptions, type MessageAttachment, type ChannelJoinPayload, type ChannelLeavePayload, type ChannelMessagePayload, type StatusPayload, type StatusResponsePayload, type InboxPayload, type InboxMessage, type InboxResponsePayload, type ListAgentsPayload, type AgentInfo, type ListAgentsResponsePayload, type HealthPayload, type CrashRecord, type AlertRecord, type HealthResponsePayload, type MetricsPayload, type AgentMetrics, type MetricsResponsePayload, type HelloEnvelope, type WelcomeEnvelope, type SendEnvelope, type DeliverEnvelope, type AckEnvelope, type NackEnvelope, type PingEnvelope, type PongEnvelope, type ErrorEnvelope, type BusyEnvelope, type LogEnvelope, type SyncEnvelope, type ShadowBindEnvelope, type ShadowUnbindEnvelope, type SpawnEnvelope, type SpawnResultEnvelope, type ReleaseEnvelope, type ReleaseResultEnvelope, type ChannelJoinEnvelope, type ChannelLeaveEnvelope, type ChannelMessageEnvelope, type StatusEnvelope, type StatusResponseEnvelope, type InboxEnvelope, type InboxResponseEnvelope, type ListAgentsEnvelope, type ListAgentsResponseEnvelope, type HealthEnvelope, type HealthResponseEnvelope, type MetricsEnvelope, type MetricsResponseEnvelope, } from './types.js';
4
+ export { PROTOCOL_VERSION, type MessageType, type PayloadKind, type Envelope, type EntityType, type HelloPayload, type WelcomePayload, type SendPayload, type SendMeta, type SyncMeta, type DeliveryInfo, type AckPayload, type NackPayload, type BusyPayload, type PingPayload, type PongPayload, type ErrorCode, type ErrorPayload, type LogPayload, type SyncStream, type SyncPayload, type SpeakOnTrigger, type ShadowConfig, type ShadowBindPayload, type ShadowUnbindPayload, type SpawnPayload, type SpawnPolicyDecision, type SpawnResultPayload, type ReleasePayload, type ReleaseResultPayload, type ConsensusType, type VoteValue, type ProposalStatus, type CreateProposalOptions, type VoteOptions, type MessageAttachment, type ChannelJoinPayload, type ChannelLeavePayload, type ChannelMessagePayload, type StatusPayload, type StatusResponsePayload, type InboxPayload, type InboxMessage, type InboxResponsePayload, type ListAgentsPayload, type AgentInfo, type ListAgentsResponsePayload, type ListConnectedAgentsPayload, type ListConnectedAgentsResponsePayload, type RemoveAgentPayload, type RemoveAgentResponsePayload, type HealthPayload, type CrashRecord, type AlertRecord, type HealthResponsePayload, type MetricsPayload, type AgentMetrics, type MetricsResponsePayload, type HelloEnvelope, type WelcomeEnvelope, type SendEnvelope, type DeliverEnvelope, type AckEnvelope, type NackEnvelope, type PingEnvelope, type PongEnvelope, type ErrorEnvelope, type BusyEnvelope, type LogEnvelope, type SyncEnvelope, type ShadowBindEnvelope, type ShadowUnbindEnvelope, type SpawnEnvelope, type SpawnResultEnvelope, type ReleaseEnvelope, type ReleaseResultEnvelope, type ChannelJoinEnvelope, type ChannelLeaveEnvelope, type ChannelMessageEnvelope, type StatusEnvelope, type StatusResponseEnvelope, type InboxEnvelope, type InboxResponseEnvelope, type ListAgentsEnvelope, type ListAgentsResponseEnvelope, type ListConnectedAgentsEnvelope, type ListConnectedAgentsResponseEnvelope, type RemoveAgentEnvelope, type RemoveAgentResponseEnvelope, type HealthEnvelope, type HealthResponseEnvelope, type MetricsEnvelope, type MetricsResponseEnvelope, } from './types.js';
5
5
  export { MAX_FRAME_BYTES, HEADER_SIZE, LEGACY_HEADER_SIZE, type WireFormat, initMessagePack, hasMessagePack, encodeFrame, encodeFrameLegacy, FrameParser, } from './framing.js';
6
6
  //# sourceMappingURL=index.d.ts.map