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
@@ -2,6 +2,6 @@
2
2
  3:I[9197,["30","static/chunks/e868780c-48e5f147c90a3a41.js","891","static/chunks/891-5cb1513eeb97a891.js","83","static/chunks/83-26d2bde54616ee90.js","631","static/chunks/631-16b905e5920f9b59.js","150","static/chunks/app/providers/page-ecb16ffd3b36262b.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["7MZPqYkVGw3EGzVBkVmY9",[[["",{"children":["providers",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["providers",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","providers","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/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":["providers",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["providers",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","providers","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/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
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -114,21 +114,21 @@
114
114
  },
115
115
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
116
116
  "dependencies": {
117
- "@agent-relay/bridge": "2.0.21",
118
- "@agent-relay/config": "2.0.21",
119
- "@agent-relay/continuity": "2.0.21",
120
- "@agent-relay/daemon": "2.0.21",
121
- "@agent-relay/hooks": "2.0.21",
122
- "@agent-relay/mcp": "2.0.21",
123
- "@agent-relay/protocol": "2.0.21",
124
- "@agent-relay/resiliency": "2.0.21",
125
- "@agent-relay/sdk": "2.0.21",
126
- "@agent-relay/storage": "2.0.21",
127
- "@agent-relay/telemetry": "2.0.21",
128
- "@agent-relay/trajectory": "2.0.21",
129
- "@agent-relay/user-directory": "2.0.21",
130
- "@agent-relay/utils": "2.0.21",
131
- "@agent-relay/wrapper": "2.0.21",
117
+ "@agent-relay/bridge": "2.0.22",
118
+ "@agent-relay/config": "2.0.22",
119
+ "@agent-relay/continuity": "2.0.22",
120
+ "@agent-relay/daemon": "2.0.22",
121
+ "@agent-relay/hooks": "2.0.22",
122
+ "@agent-relay/mcp": "2.0.22",
123
+ "@agent-relay/protocol": "2.0.22",
124
+ "@agent-relay/resiliency": "2.0.22",
125
+ "@agent-relay/sdk": "2.0.22",
126
+ "@agent-relay/storage": "2.0.22",
127
+ "@agent-relay/telemetry": "2.0.22",
128
+ "@agent-relay/trajectory": "2.0.22",
129
+ "@agent-relay/user-directory": "2.0.22",
130
+ "@agent-relay/utils": "2.0.22",
131
+ "@agent-relay/wrapper": "2.0.22",
132
132
  "@nangohq/node": "^0.69.20",
133
133
  "@types/jsonwebtoken": "^9.0.10",
134
134
  "agent-trajectories": "^0.2.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/api-types",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Shared API types and Zod schemas for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/bridge",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Multi-project bridge client utilities for Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,13 +22,13 @@
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/utils": "2.0.21",
28
- "@agent-relay/policy": "2.0.21",
29
- "@agent-relay/user-directory": "2.0.21",
30
- "@agent-relay/wrapper": "2.0.21",
31
- "@agent-relay/mcp": "2.0.21"
25
+ "@agent-relay/protocol": "2.0.22",
26
+ "@agent-relay/config": "2.0.22",
27
+ "@agent-relay/utils": "2.0.22",
28
+ "@agent-relay/policy": "2.0.22",
29
+ "@agent-relay/user-directory": "2.0.22",
30
+ "@agent-relay/wrapper": "2.0.22",
31
+ "@agent-relay/mcp": "2.0.22"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/cli-tester",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Manual interactive testing for CLI authentication flows",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/cloud",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Cloud API server and services for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,11 +38,11 @@
38
38
  "test:watch": "vitest"
39
39
  },
40
40
  "dependencies": {
41
- "@agent-relay/wrapper": "2.0.21",
42
- "@agent-relay/config": "2.0.21",
43
- "@agent-relay/resiliency": "2.0.21",
44
- "@agent-relay/storage": "2.0.21",
45
- "@agent-relay/protocol": "2.0.21"
41
+ "@agent-relay/wrapper": "2.0.22",
42
+ "@agent-relay/config": "2.0.22",
43
+ "@agent-relay/resiliency": "2.0.22",
44
+ "@agent-relay/storage": "2.0.22",
45
+ "@agent-relay/protocol": "2.0.22"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -83,7 +83,7 @@
83
83
  "test:watch": "vitest"
84
84
  },
85
85
  "dependencies": {
86
- "@agent-relay/protocol": "2.0.21",
86
+ "@agent-relay/protocol": "2.0.22",
87
87
  "zod": "^3.23.8",
88
88
  "zod-to-json-schema": "^3.23.1"
89
89
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/continuity",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Session continuity manager for Relay (ledgers, handoffs, resume)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -971,6 +971,8 @@ export class Orchestrator extends EventEmitter {
971
971
  likelyCause: crashContext.likelyCause,
972
972
  crashType: 'heartbeat_failure',
973
973
  });
974
+ // Remove the stale agent from the router so connected-agents.json is accurate
975
+ workspace?.daemon?.removeStaleAgent(health.agentName);
974
976
  logger.error('Agent crashed', {
975
977
  workspaceId: health.workspaceId,
976
978
  agentName: health.agentName,
@@ -225,6 +225,11 @@ export declare class Router {
225
225
  * Get connection by agent name.
226
226
  */
227
227
  getConnection(agentName: string): RoutableConnection | undefined;
228
+ /**
229
+ * Force remove an agent from the router (used when process dies without clean disconnect).
230
+ * This cleans up the agent's connection and subscriptions without needing the connection object.
231
+ */
232
+ forceRemoveAgent(agentName: string): boolean;
228
233
  /**
229
234
  * Get number of active connections.
230
235
  */
@@ -876,6 +876,37 @@ export class Router {
876
876
  getConnection(agentName) {
877
877
  return this.agents.get(agentName);
878
878
  }
879
+ /**
880
+ * Force remove an agent from the router (used when process dies without clean disconnect).
881
+ * This cleans up the agent's connection and subscriptions without needing the connection object.
882
+ */
883
+ forceRemoveAgent(agentName) {
884
+ const connection = this.agents.get(agentName);
885
+ if (!connection) {
886
+ routerLog.debug(`forceRemoveAgent: agent ${agentName} not found in router`);
887
+ return false;
888
+ }
889
+ routerLog.info(`Force removing stale agent: ${agentName}`);
890
+ // Remove from agents map
891
+ this.agents.delete(agentName);
892
+ // Remove from all channel subscriptions
893
+ for (const [channel, subscribers] of this.subscriptions) {
894
+ if (subscribers.delete(agentName)) {
895
+ routerLog.debug(`Removed ${agentName} from channel ${channel}`);
896
+ }
897
+ }
898
+ // Remove from connections map
899
+ this.connections.delete(connection.id);
900
+ // Clear any pending deliveries
901
+ this.deliveryTracker.clearPendingForConnection(connection.id);
902
+ // Clean up channel memberships (same as unregister)
903
+ this.removeFromAllChannels(agentName);
904
+ // Clean up shadow relationships
905
+ this.unbindShadow(agentName);
906
+ // Clear processing state
907
+ this.clearProcessing(agentName);
908
+ return true;
909
+ }
879
910
  /**
880
911
  * Get number of active connections.
881
912
  */
@@ -80,6 +80,11 @@ export declare class Daemon {
80
80
  * Called when spawn fails or is cancelled (successful registration clears automatically).
81
81
  */
82
82
  clearSpawning(agentName: string): void;
83
+ /**
84
+ * Remove a stale agent from the router (used when process dies without clean disconnect).
85
+ * This is called by the orchestrator's health monitoring when a PID is detected as dead.
86
+ */
87
+ removeStaleAgent(agentName: string): boolean;
83
88
  /**
84
89
  * Initialize storage adapter (called during start).
85
90
  */
@@ -178,6 +178,21 @@ export class Daemon {
178
178
  clearSpawning(agentName) {
179
179
  this.router.clearSpawning(agentName);
180
180
  }
181
+ /**
182
+ * Remove a stale agent from the router (used when process dies without clean disconnect).
183
+ * This is called by the orchestrator's health monitoring when a PID is detected as dead.
184
+ */
185
+ removeStaleAgent(agentName) {
186
+ const removed = this.router.forceRemoveAgent(agentName);
187
+ if (removed) {
188
+ // Notify cloud sync about agent removal
189
+ this.notifyCloudSync();
190
+ // Update connected-agents.json to reflect the removal
191
+ this.writeConnectedAgentsFile();
192
+ log.info('Removed stale agent from router', { agentName });
193
+ }
194
+ return removed;
195
+ }
181
196
  /**
182
197
  * Initialize storage adapter (called during start).
183
198
  */
@@ -1170,7 +1185,8 @@ export class Daemon {
1170
1185
  name,
1171
1186
  cli: registryAgent?.cli,
1172
1187
  idle: false, // Connected agents are not idle
1173
- parent: registryAgent?.task?.includes('spawned by') ? 'parent' : undefined,
1188
+ // TODO: Add proper parent tracking via spawner relationship
1189
+ parent: undefined,
1174
1190
  };
1175
1191
  });
1176
1192
  // Optionally include idle agents from registry
@@ -1196,6 +1212,120 @@ export class Daemon {
1196
1212
  connection.send(response);
1197
1213
  break;
1198
1214
  }
1215
+ case 'LIST_CONNECTED_AGENTS': {
1216
+ // Returns only currently connected agents (not historical/registered agents)
1217
+ const connectedAgents = this.router.getAgents();
1218
+ const registryAgents = this.registry?.getAgents() ?? [];
1219
+ const registryMap = new Map(registryAgents.map(a => [a.name, a]));
1220
+ const agents = connectedAgents
1221
+ .filter(name => !this.isInternalAgent(name))
1222
+ .map(name => {
1223
+ const registryAgent = registryMap.get(name);
1224
+ return {
1225
+ name,
1226
+ cli: registryAgent?.cli,
1227
+ idle: false,
1228
+ // TODO: Add proper parent tracking via spawner relationship
1229
+ parent: undefined,
1230
+ };
1231
+ });
1232
+ const connectedResponse = {
1233
+ v: PROTOCOL_VERSION,
1234
+ type: 'LIST_CONNECTED_AGENTS_RESPONSE',
1235
+ id: envelope.id,
1236
+ ts: Date.now(),
1237
+ payload: { agents },
1238
+ };
1239
+ connection.send(connectedResponse);
1240
+ break;
1241
+ }
1242
+ case 'REMOVE_AGENT': {
1243
+ const removePayload = envelope.payload;
1244
+ const agentName = removePayload.name;
1245
+ // Validate agent name
1246
+ if (!agentName || typeof agentName !== 'string' || agentName.length === 0) {
1247
+ const errorResponse = {
1248
+ v: PROTOCOL_VERSION,
1249
+ type: 'REMOVE_AGENT_RESPONSE',
1250
+ id: envelope.id,
1251
+ ts: Date.now(),
1252
+ payload: { success: false, removed: false, message: 'Invalid agent name: name is required' },
1253
+ };
1254
+ connection.send(errorResponse);
1255
+ break;
1256
+ }
1257
+ if (agentName.length > 128) {
1258
+ const errorResponse = {
1259
+ v: PROTOCOL_VERSION,
1260
+ type: 'REMOVE_AGENT_RESPONSE',
1261
+ id: envelope.id,
1262
+ ts: Date.now(),
1263
+ payload: { success: false, removed: false, message: 'Invalid agent name: exceeds 128 characters' },
1264
+ };
1265
+ connection.send(errorResponse);
1266
+ break;
1267
+ }
1268
+ const doRemove = async () => {
1269
+ let removed = false;
1270
+ let message = '';
1271
+ // Remove from registry (agents.json)
1272
+ if (this.registry) {
1273
+ const wasInRegistry = this.registry.getAgents().some(a => a.name === agentName);
1274
+ if (wasInRegistry) {
1275
+ this.registry.remove(agentName);
1276
+ removed = true;
1277
+ message = `Removed ${agentName} from registry`;
1278
+ }
1279
+ }
1280
+ // Remove from storage (sessions table) if storage is available
1281
+ if (this.storage?.removeAgent) {
1282
+ await this.storage.removeAgent(agentName);
1283
+ if (!removed) {
1284
+ removed = true;
1285
+ message = `Removed ${agentName} from storage`;
1286
+ }
1287
+ else {
1288
+ message += ' and storage';
1289
+ }
1290
+ }
1291
+ // Optionally remove messages
1292
+ if (removePayload.removeMessages && this.storage?.removeMessagesForAgent) {
1293
+ await this.storage.removeMessagesForAgent(agentName);
1294
+ message += ' (including messages)';
1295
+ }
1296
+ // Force remove from router if still connected (shouldn't be, but just in case)
1297
+ if (this.router.forceRemoveAgent(agentName)) {
1298
+ message += ', disconnected from router';
1299
+ // Notify cloud sync and update connected-agents.json
1300
+ this.notifyCloudSync();
1301
+ this.writeConnectedAgentsFile();
1302
+ }
1303
+ if (!removed) {
1304
+ message = `Agent ${agentName} not found in registry or storage`;
1305
+ }
1306
+ return { removed, message };
1307
+ };
1308
+ doRemove().then(({ removed, message }) => {
1309
+ const removeResponse = {
1310
+ v: PROTOCOL_VERSION,
1311
+ type: 'REMOVE_AGENT_RESPONSE',
1312
+ id: envelope.id,
1313
+ ts: Date.now(),
1314
+ payload: { success: removed, removed, message },
1315
+ };
1316
+ connection.send(removeResponse);
1317
+ }).catch(err => {
1318
+ const removeResponse = {
1319
+ v: PROTOCOL_VERSION,
1320
+ type: 'REMOVE_AGENT_RESPONSE',
1321
+ id: envelope.id,
1322
+ ts: Date.now(),
1323
+ payload: { success: false, removed: false, message: `Error: ${err.message}` },
1324
+ };
1325
+ connection.send(removeResponse);
1326
+ });
1327
+ break;
1328
+ }
1199
1329
  case 'HEALTH': {
1200
1330
  const healthPayload = envelope.payload;
1201
1331
  // Compute health based on available data
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/daemon",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Relay daemon server - agent coordination and message routing",
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/policy": "2.0.21",
31
- "@agent-relay/memory": "2.0.21",
32
- "@agent-relay/resiliency": "2.0.21",
33
- "@agent-relay/user-directory": "2.0.21",
34
- "@agent-relay/wrapper": "2.0.21",
35
- "@agent-relay/telemetry": "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/policy": "2.0.22",
31
+ "@agent-relay/memory": "2.0.22",
32
+ "@agent-relay/resiliency": "2.0.22",
33
+ "@agent-relay/user-directory": "2.0.22",
34
+ "@agent-relay/wrapper": "2.0.22",
35
+ "@agent-relay/telemetry": "2.0.22",
36
36
  "ws": "^8.18.3",
37
37
  "better-sqlite3": "^12.6.2",
38
38
  "pg": "^8.16.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/dashboard",
3
- "version": "2.0.21",
3
+ "version": "2.0.22",
4
4
  "description": "Web dashboard for Agent Relay - optional package for visual agent coordination",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,18 +25,18 @@
25
25
  "test:watch": "vitest"
26
26
  },
27
27
  "dependencies": {
28
- "@agent-relay/protocol": "2.0.21",
29
- "@agent-relay/config": "2.0.21",
30
- "@agent-relay/storage": "2.0.21",
31
- "@agent-relay/bridge": "2.0.21",
32
- "@agent-relay/utils": "2.0.21",
33
- "@agent-relay/resiliency": "2.0.21",
34
- "@agent-relay/trajectory": "2.0.21",
35
- "@agent-relay/cloud": "2.0.21",
36
- "@agent-relay/daemon": "2.0.21",
37
- "@agent-relay/user-directory": "2.0.21",
38
- "@agent-relay/wrapper": "2.0.21",
39
- "@agent-relay/sdk": "2.0.21",
28
+ "@agent-relay/protocol": "2.0.22",
29
+ "@agent-relay/config": "2.0.22",
30
+ "@agent-relay/storage": "2.0.22",
31
+ "@agent-relay/bridge": "2.0.22",
32
+ "@agent-relay/utils": "2.0.22",
33
+ "@agent-relay/resiliency": "2.0.22",
34
+ "@agent-relay/trajectory": "2.0.22",
35
+ "@agent-relay/cloud": "2.0.22",
36
+ "@agent-relay/daemon": "2.0.22",
37
+ "@agent-relay/user-directory": "2.0.22",
38
+ "@agent-relay/wrapper": "2.0.22",
39
+ "@agent-relay/sdk": "2.0.22",
40
40
  "express": "^5.2.1",
41
41
  "ws": "^8.18.3"
42
42
  },
@@ -1 +1 @@
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><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Agent Relay Dashboard</title><meta name="description" content="Fleet control dashboard for Agent Relay"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></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[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"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\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"7MZPqYkVGw3EGzVBkVmY9\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"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.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"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\":\"$6\",\"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\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"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\"}]]\n3:null\n"])</script></body></html>
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><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Agent Relay Dashboard</title><meta name="description" content="Fleet control dashboard for Agent Relay"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>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)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></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[4707,[],\"\"]\n5:I[6423,[],\"\"]\nb:I[1060,[],\"\"]\n6:{\"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\"}\n7:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n8:{\"display\":\"inline-block\"}\n9:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nc:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"91mkGYq3qbG8WHE6VytQ8\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[[\"$\",\"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.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"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\":\"$6\",\"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\":\"$7\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$8\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$9\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$La\"],\"globalErrorComponent\":\"$b\",\"missingSlots\":\"$Wc\"}]\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"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\"}]]\n3:null\n"])</script></body></html>