agent-relay 2.0.4 → 2.0.6

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 (131) 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/connect-repos.html +1 -1
  9. package/dist/dashboard/out/connect-repos.txt +1 -1
  10. package/dist/dashboard/out/history.html +1 -1
  11. package/dist/dashboard/out/history.txt +1 -1
  12. package/dist/dashboard/out/index.html +1 -1
  13. package/dist/dashboard/out/index.txt +1 -1
  14. package/dist/dashboard/out/login.html +1 -1
  15. package/dist/dashboard/out/login.txt +1 -1
  16. package/dist/dashboard/out/metrics.html +1 -1
  17. package/dist/dashboard/out/metrics.txt +1 -1
  18. package/dist/dashboard/out/pricing.html +1 -1
  19. package/dist/dashboard/out/pricing.txt +1 -1
  20. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  21. package/dist/dashboard/out/providers/setup/claude.txt +1 -1
  22. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  23. package/dist/dashboard/out/providers/setup/codex.txt +1 -1
  24. package/dist/dashboard/out/providers/setup/cursor.html +1 -1
  25. package/dist/dashboard/out/providers/setup/cursor.txt +1 -1
  26. package/dist/dashboard/out/providers.html +1 -1
  27. package/dist/dashboard/out/providers.txt +1 -1
  28. package/dist/dashboard/out/signup.html +1 -1
  29. package/dist/dashboard/out/signup.txt +1 -1
  30. package/dist/src/cli/index.js +61 -3
  31. package/package.json +14 -12
  32. package/packages/api-types/package.json +1 -1
  33. package/packages/bridge/dist/spawner.d.ts +2 -0
  34. package/packages/bridge/dist/spawner.js +24 -6
  35. package/packages/bridge/dist/types.d.ts +2 -0
  36. package/packages/bridge/package.json +7 -7
  37. package/packages/cloud/package.json +6 -6
  38. package/packages/config/package.json +2 -2
  39. package/packages/continuity/package.json +1 -1
  40. package/packages/daemon/dist/router.d.ts +2 -1
  41. package/packages/daemon/dist/router.js +142 -52
  42. package/packages/daemon/dist/server.d.ts +3 -0
  43. package/packages/daemon/dist/server.js +31 -1
  44. package/packages/daemon/dist/spawn-manager.d.ts +5 -0
  45. package/packages/daemon/dist/spawn-manager.js +44 -1
  46. package/packages/daemon/package.json +12 -11
  47. package/packages/dashboard/dist/server.js +2 -0
  48. package/packages/dashboard/package.json +12 -12
  49. package/packages/dashboard/ui-dist/404.html +1 -1
  50. package/packages/dashboard/ui-dist/app/onboarding.html +1 -1
  51. package/packages/dashboard/ui-dist/app/onboarding.txt +1 -1
  52. package/packages/dashboard/ui-dist/app.html +1 -1
  53. package/packages/dashboard/ui-dist/app.txt +1 -1
  54. package/packages/dashboard/ui-dist/cloud/link.html +1 -1
  55. package/packages/dashboard/ui-dist/cloud/link.txt +1 -1
  56. package/packages/dashboard/ui-dist/connect-repos.html +1 -1
  57. package/packages/dashboard/ui-dist/connect-repos.txt +1 -1
  58. package/packages/dashboard/ui-dist/history.html +1 -1
  59. package/packages/dashboard/ui-dist/history.txt +1 -1
  60. package/packages/dashboard/ui-dist/index.html +1 -1
  61. package/packages/dashboard/ui-dist/index.txt +1 -1
  62. package/packages/dashboard/ui-dist/login.html +1 -1
  63. package/packages/dashboard/ui-dist/login.txt +1 -1
  64. package/packages/dashboard/ui-dist/metrics.html +1 -1
  65. package/packages/dashboard/ui-dist/metrics.txt +1 -1
  66. package/packages/dashboard/ui-dist/pricing.html +1 -1
  67. package/packages/dashboard/ui-dist/pricing.txt +1 -1
  68. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -1
  69. package/packages/dashboard/ui-dist/providers/setup/claude.txt +1 -1
  70. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -1
  71. package/packages/dashboard/ui-dist/providers/setup/codex.txt +1 -1
  72. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -1
  73. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +1 -1
  74. package/packages/dashboard/ui-dist/providers.html +1 -1
  75. package/packages/dashboard/ui-dist/providers.txt +1 -1
  76. package/packages/dashboard/ui-dist/signup.html +1 -1
  77. package/packages/dashboard/ui-dist/signup.txt +1 -1
  78. package/packages/dashboard-server/dist/server.js +2 -0
  79. package/packages/dashboard-server/dist/user-bridge.d.ts +7 -3
  80. package/packages/dashboard-server/dist/user-bridge.js +48 -30
  81. package/packages/dashboard-server/package.json +12 -12
  82. package/packages/hooks/package.json +4 -4
  83. package/packages/mcp/README.md +19 -135
  84. package/packages/mcp/dist/client.js +67 -27
  85. package/packages/mcp/dist/cloud.js +1 -18
  86. package/packages/mcp/dist/prompts/protocol.d.ts +1 -1
  87. package/packages/mcp/dist/prompts/protocol.js +6 -14
  88. package/packages/mcp/package.json +2 -1
  89. package/packages/memory/package.json +2 -2
  90. package/packages/policy/package.json +2 -2
  91. package/packages/protocol/dist/types.d.ts +2 -0
  92. package/packages/protocol/package.json +1 -1
  93. package/packages/resiliency/package.json +1 -1
  94. package/packages/sdk/README.md +43 -160
  95. package/packages/sdk/dist/client.d.ts +3 -99
  96. package/packages/sdk/dist/client.js +6 -113
  97. package/packages/sdk/dist/index.d.ts +0 -1
  98. package/packages/sdk/dist/index.js +0 -2
  99. package/packages/sdk/dist/standalone.js +0 -1
  100. package/packages/sdk/package.json +2 -2
  101. package/packages/spawner/package.json +1 -1
  102. package/packages/state/package.json +1 -1
  103. package/packages/storage/package.json +2 -2
  104. package/packages/telemetry/dist/client.d.ts +19 -0
  105. package/packages/telemetry/dist/client.js +126 -0
  106. package/packages/telemetry/dist/config.d.ts +29 -0
  107. package/packages/telemetry/dist/config.js +88 -0
  108. package/packages/telemetry/dist/events.d.ts +106 -0
  109. package/packages/telemetry/dist/events.js +10 -0
  110. package/packages/telemetry/dist/index.d.ts +8 -0
  111. package/packages/telemetry/dist/index.js +7 -0
  112. package/packages/telemetry/dist/machine-id.d.ts +12 -0
  113. package/packages/telemetry/dist/machine-id.js +58 -0
  114. package/packages/telemetry/dist/posthog-config.d.ts +16 -0
  115. package/packages/telemetry/dist/posthog-config.js +33 -0
  116. package/packages/telemetry/package.json +41 -0
  117. package/packages/trajectory/package.json +2 -2
  118. package/packages/user-directory/package.json +2 -2
  119. package/packages/utils/package.json +1 -1
  120. package/packages/wrapper/dist/relay-pty-orchestrator.js +38 -29
  121. package/packages/wrapper/package.json +6 -6
  122. package/packages/sdk/dist/discovery.d.ts +0 -29
  123. package/packages/sdk/dist/discovery.js +0 -126
  124. /package/dist/dashboard/out/_next/static/{72btMIJ64BCAB4UgVkpaq → lIJs7zSKBaI58kpqegulQ}/_buildManifest.js +0 -0
  125. /package/dist/dashboard/out/_next/static/{72btMIJ64BCAB4UgVkpaq → lIJs7zSKBaI58kpqegulQ}/_ssgManifest.js +0 -0
  126. /package/packages/dashboard/ui-dist/_next/static/{0AsOfRemPXJmtynCKT-rx → KIxE0Ds_zdGuDJDQu7_sb}/_buildManifest.js +0 -0
  127. /package/packages/dashboard/ui-dist/_next/static/{0AsOfRemPXJmtynCKT-rx → KIxE0Ds_zdGuDJDQu7_sb}/_ssgManifest.js +0 -0
  128. /package/packages/dashboard/ui-dist/_next/static/{72btMIJ64BCAB4UgVkpaq → SoK46dEi3IsNBVWXD9x0L}/_buildManifest.js +0 -0
  129. /package/packages/dashboard/ui-dist/_next/static/{72btMIJ64BCAB4UgVkpaq → SoK46dEi3IsNBVWXD9x0L}/_ssgManifest.js +0 -0
  130. /package/packages/dashboard/ui-dist/_next/static/{clUN2n0bz9HCjKI0qlOxU → lIJs7zSKBaI58kpqegulQ}/_buildManifest.js +0 -0
  131. /package/packages/dashboard/ui-dist/_next/static/{clUN2n0bz9HCjKI0qlOxU → lIJs7zSKBaI58kpqegulQ}/_ssgManifest.js +0 -0
@@ -3,4 +3,4 @@
3
3
  transition-all duration-300
4
4
  drop-shadow-[0_0_8px_rgba(0,217,255,0.3)]
5
5
 
6
- " aria-label="Agent Relay Logo" role="img"><path d="M30 80 L 50 20 L 70 80" stroke="#00d9ff" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill="none"></path><line x1="40" y1="50" x2="60" y2="50" stroke="#00d9ff" stroke-width="5" stroke-linecap="round"></line><path d="M50 20 L 50 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" opacity="0.7"></path><path d="M50 20 C 80 20 80 50 50 50 L 80 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"></path></svg><h1 class="mt-4 text-3xl font-bold text-white">Get Started</h1><p class="mt-2 text-text-muted text-center">Create your account and start orchestrating AI agents</p></div><div class="bg-bg-primary/80 backdrop-blur-sm border border-border-subtle rounded-2xl p-8 shadow-xl"><div><div class="mb-6 space-y-3"><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-accent-cyan/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-accent-cyan" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg></div><span>Deploy AI agents in seconds</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#00ffc8]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#00ffc8]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg></div><span>Real-time agent collaboration</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#0891b2]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#0891b2]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><span>Secure credential management</span></div></div><button type="button" disabled="" class="w-full py-4 px-6 bg-[#24292e] hover:bg-[#2f363d] border border-[#444d56] rounded-xl text-white font-medium flex items-center justify-center gap-3 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"><svg class="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg><span>Loading...</span></button><p class="mt-6 text-center text-text-muted text-sm">By signing up, you agree to our<!-- --> <a href="/terms" class="text-accent-cyan hover:underline">Terms of Service</a> <!-- -->and<!-- --> <a href="/privacy" class="text-accent-cyan hover:underline">Privacy Policy</a></p></div></div><div class="mt-6 text-center"><p class="text-text-muted">Already have an account?<!-- --> <a href="/login" class="text-accent-cyan hover:underline font-medium">Sign in</a></p></div><div class="mt-4 text-center"><a href="/" class="text-text-muted hover:text-white transition-colors text-sm">Back to home</a></div></div></div><script src="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/99c2552394077586.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[4665,[\"282\",\"static/chunks/282-980c2eb8fff20123.js\",\"966\",\"static/chunks/app/signup/page-18a4665665f6be11.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"72btMIJ64BCAB4UgVkpaq\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"signup\"],\"initialTree\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"signup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/99c2552394077586.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Agent Relay Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Fleet control dashboard for Agent Relay\"}],[\"$\",\"link\",\"4\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?9e7a840704165ca6\",\"type\":\"image/png\",\"sizes\":\"256x256\"}]]\n3:null\n"])</script></body></html>
6
+ " aria-label="Agent Relay Logo" role="img"><path d="M30 80 L 50 20 L 70 80" stroke="#00d9ff" stroke-width="5" stroke-linejoin="round" stroke-linecap="round" fill="none"></path><line x1="40" y1="50" x2="60" y2="50" stroke="#00d9ff" stroke-width="5" stroke-linecap="round"></line><path d="M50 20 L 50 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" opacity="0.7"></path><path d="M50 20 C 80 20 80 50 50 50 L 80 80" stroke="#00ffc8" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" fill="none" opacity="0.7"></path></svg><h1 class="mt-4 text-3xl font-bold text-white">Get Started</h1><p class="mt-2 text-text-muted text-center">Create your account and start orchestrating AI agents</p></div><div class="bg-bg-primary/80 backdrop-blur-sm border border-border-subtle rounded-2xl p-8 shadow-xl"><div><div class="mb-6 space-y-3"><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-accent-cyan/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-accent-cyan" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg></div><span>Deploy AI agents in seconds</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#00ffc8]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#00ffc8]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg></div><span>Real-time agent collaboration</span></div><div class="flex items-center gap-3 text-sm text-text-secondary"><div class="w-8 h-8 rounded-lg bg-[#0891b2]/10 flex items-center justify-center flex-shrink-0"><svg class="w-4 h-4 text-[#0891b2]" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path></svg></div><span>Secure credential management</span></div></div><button type="button" disabled="" class="w-full py-4 px-6 bg-[#24292e] hover:bg-[#2f363d] border border-[#444d56] rounded-xl text-white font-medium flex items-center justify-center gap-3 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"><svg class="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg><span>Loading...</span></button><p class="mt-6 text-center text-text-muted text-sm">By signing up, you agree to our<!-- --> <a href="/terms" class="text-accent-cyan hover:underline">Terms of Service</a> <!-- -->and<!-- --> <a href="/privacy" class="text-accent-cyan hover:underline">Privacy Policy</a></p></div></div><div class="mt-6 text-center"><p class="text-text-muted">Already have an account?<!-- --> <a href="/login" class="text-accent-cyan hover:underline font-medium">Sign in</a></p></div><div class="mt-4 text-center"><a href="/" class="text-text-muted hover:text-white transition-colors text-sm">Back to home</a></div></div></div><script src="/_next/static/chunks/webpack-1cdd8ed57114d5e1.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/99c2552394077586.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n4:I[9107,[],\"ClientPageRoot\"]\n5:I[4665,[\"282\",\"static/chunks/282-980c2eb8fff20123.js\",\"966\",\"static/chunks/app/signup/page-18a4665665f6be11.js\"],\"default\",1]\n6:I[4707,[],\"\"]\n7:I[6423,[],\"\"]\n9:I[1060,[],\"\"]\na:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"lIJs7zSKBaI58kpqegulQ\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"signup\"],\"initialTree\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"signup\",{\"children\":[\"__PAGE__\",{},[[\"$L3\",[\"$\",\"$L4\",null,{\"props\":{\"params\":{},\"searchParams\":{}},\"Component\":\"$5\"}],null],null],null]},[null,[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"signup\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/99c2552394077586.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L6\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L8\"],\"globalErrorComponent\":\"$9\",\"missingSlots\":\"$Wa\"}]\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Agent Relay Dashboard\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Fleet control dashboard for Agent Relay\"}],[\"$\",\"link\",\"4\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-icon.png?9e7a840704165ca6\",\"type\":\"image/png\",\"sizes\":\"256x256\"}]]\n3:null\n"])</script></body></html>
@@ -2,6 +2,6 @@
2
2
  3:I[4665,["282","static/chunks/282-980c2eb8fff20123.js","966","static/chunks/app/signup/page-18a4665665f6be11.js"],"default",1]
3
3
  4:I[4707,[],""]
4
4
  5:I[6423,[],""]
5
- 0:["72btMIJ64BCAB4UgVkpaq",[[["",{"children":["signup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["signup",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","signup","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/99c2552394077586.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
5
+ 0:["lIJs7zSKBaI58kpqegulQ",[[["",{"children":["signup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["signup",{"children":["__PAGE__",{},[["$L1",["$","$L2",null,{"props":{"params":{},"searchParams":{}},"Component":"$3"}],null],null],null]},[null,["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","signup","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/99c2552394077586.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$L6",null]]]]
6
6
  6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Agent Relay Dashboard"}],["$","meta","3",{"name":"description","content":"Fleet control dashboard for Agent Relay"}],["$","link","4",{"rel":"apple-touch-icon","href":"/apple-icon.png?9e7a840704165ca6","type":"image/png","sizes":"256x256"}]]
7
7
  1:null
@@ -20,6 +20,7 @@ import { RelayPtyOrchestrator, getTmuxPath } from '@agent-relay/wrapper';
20
20
  import { AgentSpawner, readWorkersMetadata, getWorkerLogsDir, selectShadowCli } from '@agent-relay/bridge';
21
21
  import { generateAgentName, checkForUpdatesInBackground, checkForUpdates } from '@agent-relay/utils';
22
22
  import { getShadowForAgent } from '@agent-relay/config';
23
+ import { initTelemetry, track, enableTelemetry, disableTelemetry, getStatus, isDisabledByEnv, } from '@agent-relay/telemetry';
23
24
  import fs from 'node:fs';
24
25
  import path from 'node:path';
25
26
  import { promisify } from 'node:util';
@@ -49,12 +50,24 @@ const VERSION = packageJson.version;
49
50
  const execAsync = promisify(exec);
50
51
  // Check for updates in background (non-blocking)
51
52
  // Only show notification for interactive commands, not when wrapping agents or running update
52
- const interactiveCommands = ['up', 'down', 'status', 'agents', 'who', 'version', '--version', '-V', '--help', '-h', 'create-agent', 'claude', 'codex'];
53
+ const interactiveCommands = ['up', 'down', 'status', 'agents', 'who', 'version', '--version', '-V', '--help', '-h', 'create-agent', 'claude', 'codex', 'telemetry'];
53
54
  const shouldCheckUpdates = process.argv.length > 2 &&
54
55
  interactiveCommands.includes(process.argv[2]);
55
56
  if (shouldCheckUpdates) {
56
57
  checkForUpdatesInBackground(VERSION);
57
58
  }
59
+ // Initialize telemetry for interactive commands (shows first-run notice)
60
+ const shouldInitTelemetry = process.argv.length > 2 &&
61
+ interactiveCommands.includes(process.argv[2]) &&
62
+ process.argv[2] !== 'telemetry'; // Don't show notice for telemetry command itself
63
+ if (shouldInitTelemetry) {
64
+ initTelemetry({ showNotice: true });
65
+ // Track CLI command usage
66
+ const commandName = process.argv[2];
67
+ if (commandName && !commandName.startsWith('-')) {
68
+ track('cli_command_run', { command_name: commandName });
69
+ }
70
+ }
58
71
  const program = new Command();
59
72
  function pidFilePathForSocket(socketPath) {
60
73
  return `${socketPath}.pid`;
@@ -335,8 +348,11 @@ program
335
348
  pidFilePath,
336
349
  storagePath: dbPath,
337
350
  teamDir: paths.teamDir,
338
- // TODO: Add daemon-based spawning support when SDK extraction is complete
339
- // See: docs/SDK-MIGRATION-PLAN.md
351
+ // Enable protocol-based spawning via SPAWN/RELEASE messages
352
+ spawnManager: {
353
+ projectRoot: paths.projectRoot,
354
+ socketPath,
355
+ },
340
356
  });
341
357
  // Create spawner for auto-spawn (will be initialized after dashboard starts)
342
358
  let spawner = null;
@@ -3048,6 +3064,48 @@ program
3048
3064
  .option('--skip-daemon', 'Skip daemon startup')
3049
3065
  .option('--skip-mcp', 'Skip MCP installation')
3050
3066
  .action(runInit);
3067
+ // telemetry - Manage anonymous telemetry
3068
+ program
3069
+ .command('telemetry')
3070
+ .description('Manage anonymous telemetry (enable/disable/status)')
3071
+ .argument('[action]', 'Action: enable, disable, or status (default: status)')
3072
+ .action((action) => {
3073
+ if (action === 'enable') {
3074
+ if (isDisabledByEnv()) {
3075
+ console.log('Cannot enable: AGENT_RELAY_TELEMETRY_DISABLED is set');
3076
+ console.log('Remove the environment variable to enable telemetry.');
3077
+ return;
3078
+ }
3079
+ enableTelemetry();
3080
+ console.log('Telemetry enabled');
3081
+ console.log('Anonymous usage data will be collected to improve Agent Relay.');
3082
+ }
3083
+ else if (action === 'disable') {
3084
+ disableTelemetry();
3085
+ console.log('Telemetry disabled');
3086
+ console.log('No usage data will be collected.');
3087
+ }
3088
+ else {
3089
+ // Default: show status
3090
+ const status = getStatus();
3091
+ console.log('Telemetry Status');
3092
+ console.log('================');
3093
+ console.log(`Enabled: ${status.enabled ? 'Yes' : 'No'}`);
3094
+ if (status.disabledByEnv) {
3095
+ console.log('(Disabled via AGENT_RELAY_TELEMETRY_DISABLED environment variable)');
3096
+ }
3097
+ console.log(`Anonymous ID: ${status.anonymousId}`);
3098
+ if (status.notifiedAt) {
3099
+ console.log(`First run notice shown: ${new Date(status.notifiedAt).toLocaleString()}`);
3100
+ }
3101
+ console.log('');
3102
+ console.log('Commands:');
3103
+ console.log(' agent-relay telemetry enable - Opt in to telemetry');
3104
+ console.log(' agent-relay telemetry disable - Opt out of telemetry');
3105
+ console.log('');
3106
+ console.log('Learn more: https://agent-relay.com/telemetry');
3107
+ }
3108
+ });
3051
3109
  // mcp - MCP server management
3052
3110
  program
3053
3111
  .command('mcp')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -17,8 +17,8 @@
17
17
  "scripts": {
18
18
  "postinstall": "npm rebuild better-sqlite3 && node scripts/postinstall.js",
19
19
  "build": "npm run clean && turbo run build --filter='./packages/*' && tsc && npm run build:dashboard",
20
- "build:sequential": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc && npm run build:dashboard",
21
- "build:workspace": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc",
20
+ "build:sequential": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc && npm run build:dashboard",
21
+ "build:workspace": "npm run clean && npm run build:protocol && npm run build:config && npm run build:storage && npm run build:state && npm run build:policy && npm run build:trajectory && npm run build:hooks && npm run build:memory && npm run build:utils && npm run build:continuity && npm run build:resiliency && npm run build:user-directory && npm run build:wrapper && npm run build:bridge && npm run build:telemetry && npm run build:cloud && npm run build:daemon && npm run build:sdk && npm run build:dashboard-server && npm run build:dashboard-pkg && npm run build:api-types && npm run build:spawner && npm run build:mcp && tsc",
22
22
  "build:packages": "turbo run build --filter='./packages/*'",
23
23
  "build:packages:watch": "turbo run build --filter='./packages/*' --watch",
24
24
  "build:mcp": "cd packages/mcp && npm run build",
@@ -43,6 +43,7 @@
43
43
  "build:sdk": "cd packages/sdk && npm run build",
44
44
  "build:api-types": "cd packages/api-types && npm run build",
45
45
  "build:spawner": "cd packages/spawner && npm run build",
46
+ "build:telemetry": "cd packages/telemetry && npm run build",
46
47
  "build:dashboard": "cd src/dashboard && npm run build",
47
48
  "postbuild": "chmod +x dist/src/cli/index.js && mkdir -p dist/dashboard && cp -r src/dashboard/out dist/dashboard/ && mkdir -p packages/dashboard/ui-dist && cp -r src/dashboard/out/* packages/dashboard/ui-dist/",
48
49
  "dev:watch": "tsc -w",
@@ -106,15 +107,16 @@
106
107
  },
107
108
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
108
109
  "dependencies": {
109
- "@agent-relay/sdk": "2.0.4",
110
- "@agent-relay/config": "2.0.4",
111
- "@agent-relay/protocol": "2.0.4",
112
- "@agent-relay/storage": "2.0.4",
113
- "@agent-relay/continuity": "2.0.4",
114
- "@agent-relay/trajectory": "2.0.4",
115
- "@agent-relay/hooks": "2.0.4",
116
- "@agent-relay/resiliency": "2.0.4",
117
- "@agent-relay/user-directory": "2.0.4",
110
+ "@agent-relay/sdk": "2.0.6",
111
+ "@agent-relay/config": "2.0.6",
112
+ "@agent-relay/protocol": "2.0.6",
113
+ "@agent-relay/storage": "2.0.6",
114
+ "@agent-relay/continuity": "2.0.6",
115
+ "@agent-relay/trajectory": "2.0.6",
116
+ "@agent-relay/hooks": "2.0.6",
117
+ "@agent-relay/resiliency": "2.0.6",
118
+ "@agent-relay/user-directory": "2.0.6",
119
+ "@agent-relay/telemetry": "2.0.6",
118
120
  "@nangohq/node": "^0.69.20",
119
121
  "@types/jsonwebtoken": "^9.0.10",
120
122
  "agent-trajectories": "^0.2.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/api-types",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Shared API types and Zod schemas for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -41,6 +41,8 @@ export type OnAgentDeathCallback = (info: {
41
41
  /** Options for AgentSpawner constructor */
42
42
  export interface AgentSpawnerOptions {
43
43
  projectRoot: string;
44
+ /** Explicit socket path for daemon connection (if not provided, derived from projectRoot) */
45
+ socketPath?: string;
44
46
  tmuxSession?: string;
45
47
  dashboardPort?: number;
46
48
  /**
@@ -153,9 +153,12 @@ function getMcpToolsReference() {
153
153
  * This keeps agent instructions simple while supporting workspace isolation.
154
154
  *
155
155
  * @param agentName - Name of the agent
156
- * @param hasMcp - Whether MCP tools are available (based on .mcp.json existence)
156
+ * @param options - Configuration options
157
+ * @param options.hasMcp - Whether MCP tools are available (based on .mcp.json existence)
158
+ * @param options.includeWorkflowConventions - Include ACK/DONE workflow conventions (default: false)
157
159
  */
158
- function getRelayInstructions(agentName, hasMcp = false) {
160
+ function getRelayInstructions(agentName, options = {}) {
161
+ const { hasMcp = false, includeWorkflowConventions = false } = options;
159
162
  // Get the outbox path template and replace variable with actual agent name
160
163
  const outboxBase = getAgentOutboxTemplate(agentName);
161
164
  const parts = [
@@ -168,7 +171,12 @@ function getRelayInstructions(agentName, hasMcp = false) {
168
171
  if (hasMcp) {
169
172
  parts.push(getMcpToolsReference());
170
173
  }
171
- parts.push('## Sending Messages', '', 'Write a file to your outbox, then output the trigger:', '', '```bash', `cat > ${outboxBase}/msg << 'EOF'`, 'TO: TargetAgent', '', 'Your message here.', 'EOF', '```', '', 'Then output: `->relay-file:msg`', '', '## Communication Rules', '', '1. **ACK immediately** - When you receive a task:', '```bash', `cat > ${outboxBase}/ack << 'EOF'`, 'TO: Sender', '', 'ACK: Brief description of task received', 'EOF', '```', 'Then: `->relay-file:ack`', '', '2. **Report completion** - When done:', '```bash', `cat > ${outboxBase}/done << 'EOF'`, 'TO: Sender', '', 'DONE: Brief summary of what was completed', 'EOF', '```', 'Then: `->relay-file:done`', '', '## Message Format', '', '```', 'TO: Target', 'THREAD: optional-thread', '', 'Message body (everything after blank line)', '```', '', '| TO Value | Behavior |', '|----------|----------|', '| `AgentName` | Direct message |', '| `*` | Broadcast to all |', '| `#channel` | Channel message |');
174
+ parts.push('## Sending Messages', '', 'Write a file to your outbox, then output the trigger:', '', '```bash', `cat > ${outboxBase}/msg << 'EOF'`, 'TO: TargetAgent', '', 'Your message here.', 'EOF', '```', '', 'Then output: `->relay-file:msg`');
175
+ // Only include ACK/DONE workflow conventions if explicitly requested
176
+ if (includeWorkflowConventions) {
177
+ parts.push('', '## Communication Rules', '', '1. **ACK immediately** - When you receive a task:', '```bash', `cat > ${outboxBase}/ack << 'EOF'`, 'TO: Sender', '', 'ACK: Brief description of task received', 'EOF', '```', 'Then: `->relay-file:ack`', '', '2. **Report completion** - When done:', '```bash', `cat > ${outboxBase}/done << 'EOF'`, 'TO: Sender', '', 'DONE: Brief summary of what was completed', 'EOF', '```', 'Then: `->relay-file:done`');
178
+ }
179
+ parts.push('', '## Message Format', '', '```', 'TO: Target', 'THREAD: optional-thread', '', 'Message body (everything after blank line)', '```', '', '| TO Value | Behavior |', '|----------|----------|', '| `AgentName` | Direct message |', '| `*` | Broadcast to all |', '| `#channel` | Channel message |');
172
180
  return parts.join('\n');
173
181
  }
174
182
  /**
@@ -253,7 +261,9 @@ export class AgentSpawner {
253
261
  // This ensures spawned agents have actual daemon connections for channel message delivery
254
262
  this.agentsPath = path.join(paths.teamDir, 'connected-agents.json');
255
263
  this.registryPath = path.join(paths.teamDir, 'agents.json');
256
- this.socketPath = paths.socketPath;
264
+ // Use explicit socketPath if provided (ensures spawned agents connect to same daemon)
265
+ // Otherwise derive from project paths
266
+ this.socketPath = options.socketPath ?? paths.socketPath;
257
267
  this.logsDir = path.join(paths.teamDir, 'worker-logs');
258
268
  this.workersPath = path.join(paths.teamDir, 'workers.json');
259
269
  this.dashboardPort = options.dashboardPort;
@@ -488,8 +498,16 @@ export class AgentSpawner {
488
498
  * Spawn a new worker agent using relay-pty
489
499
  */
490
500
  async spawn(request) {
491
- const { name, cli, task, team, spawnerName, userId } = request;
501
+ const { name, cli, task, team, spawnerName, userId, includeWorkflowConventions } = request;
492
502
  const debug = process.env.DEBUG_SPAWN === '1';
503
+ // Validate agent name to prevent path traversal attacks
504
+ if (name.includes('..') || name.includes('/') || name.includes('\\')) {
505
+ return {
506
+ success: false,
507
+ name,
508
+ error: `Invalid agent name: "${name}" contains path traversal characters`,
509
+ };
510
+ }
493
511
  // Check if worker already exists in this spawner
494
512
  if (this.activeWorkers.has(name)) {
495
513
  return {
@@ -621,7 +639,7 @@ export class AgentSpawner {
621
639
  if (debug && hasMcp)
622
640
  log.debug(`MCP tools available for ${name} (found ${mcpConfigPath} and socket ${relaySocket})`);
623
641
  // Inject relay protocol instructions via CLI-specific system prompt
624
- let relayInstructions = getRelayInstructions(name, hasMcp);
642
+ let relayInstructions = getRelayInstructions(name, { hasMcp, includeWorkflowConventions });
625
643
  // Compose role-specific prompts if agent has a role defined in .claude/agents/
626
644
  const agentConfigForRole = isClaudeCli ? findAgentConfig(name, this.projectRoot) : null;
627
645
  if (agentConfigForRole?.role) {
@@ -55,6 +55,8 @@ export interface SpawnRequest {
55
55
  shadowSpeakOn?: Array<'SESSION_END' | 'CODE_WRITTEN' | 'REVIEW_REQUEST' | 'EXPLICIT_ASK' | 'ALL_MESSAGES'>;
56
56
  /** User ID for per-user credential storage in shared workspaces */
57
57
  userId?: string;
58
+ /** Include ACK/DONE workflow conventions in agent instructions (default: false) */
59
+ includeWorkflowConventions?: boolean;
58
60
  }
59
61
  /** Policy decision details */
60
62
  export interface PolicyDecision {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/bridge",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Multi-project bridge client utilities for Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,12 +22,12 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/protocol": "2.0.4",
26
- "@agent-relay/config": "2.0.4",
27
- "@agent-relay/utils": "2.0.4",
28
- "@agent-relay/policy": "2.0.4",
29
- "@agent-relay/user-directory": "2.0.4",
30
- "@agent-relay/wrapper": "2.0.4"
25
+ "@agent-relay/protocol": "2.0.6",
26
+ "@agent-relay/config": "2.0.6",
27
+ "@agent-relay/utils": "2.0.6",
28
+ "@agent-relay/policy": "2.0.6",
29
+ "@agent-relay/user-directory": "2.0.6",
30
+ "@agent-relay/wrapper": "2.0.6"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/cloud",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
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.4",
42
- "@agent-relay/config": "2.0.4",
43
- "@agent-relay/resiliency": "2.0.4",
44
- "@agent-relay/storage": "2.0.4",
45
- "@agent-relay/protocol": "2.0.4"
41
+ "@agent-relay/wrapper": "2.0.6",
42
+ "@agent-relay/config": "2.0.6",
43
+ "@agent-relay/resiliency": "2.0.6",
44
+ "@agent-relay/storage": "2.0.6",
45
+ "@agent-relay/protocol": "2.0.6"
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.4",
3
+ "version": "2.0.6",
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.4",
86
+ "@agent-relay/protocol": "2.0.6",
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.4",
3
+ "version": "2.0.6",
4
4
  "description": "Session continuity manager for Relay (ledgers, handoffs, resume)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -57,7 +57,7 @@ export declare class Router {
57
57
  private primaryByShadow;
58
58
  /** Channel membership: channel -> Set of member names */
59
59
  private channels;
60
- /** User entities (human users, not agents) */
60
+ /** User entities (human users, not agents) - supports multiple connections per user (multi-tab) */
61
61
  private users;
62
62
  /** Reverse lookup: member name -> Set of channels they're in */
63
63
  private memberChannels;
@@ -331,6 +331,7 @@ export declare class Router {
331
331
  /**
332
332
  * Get a connection by name (checks both agents and users).
333
333
  * Uses case-insensitive lookup to handle mismatched casing.
334
+ * For users with multiple connections, returns the first connection.
334
335
  */
335
336
  private getConnectionByName;
336
337
  /**