agent-relay 2.0.22 → 2.0.23

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 (391) hide show
  1. package/bin/relay-pty-linux-arm64 +0 -0
  2. package/dist/src/cli/index.d.ts +3 -3
  3. package/dist/src/cli/index.js +31 -100
  4. package/package.json +22 -29
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/bridge/package.json +8 -8
  7. package/packages/cli-tester/package.json +1 -1
  8. package/packages/cloud/dist/server.js +25 -4
  9. package/packages/cloud/package.json +6 -6
  10. package/packages/config/package.json +2 -2
  11. package/packages/continuity/package.json +1 -1
  12. package/packages/daemon/dist/orchestrator.js +19 -1
  13. package/packages/daemon/package.json +12 -12
  14. package/packages/hooks/package.json +4 -4
  15. package/packages/mcp/package.json +2 -2
  16. package/packages/memory/package.json +2 -2
  17. package/packages/policy/package.json +2 -2
  18. package/packages/protocol/package.json +1 -1
  19. package/packages/resiliency/package.json +1 -1
  20. package/packages/sdk/package.json +2 -2
  21. package/packages/spawner/package.json +1 -1
  22. package/packages/state/package.json +1 -1
  23. package/packages/storage/package.json +2 -2
  24. package/packages/telemetry/package.json +1 -1
  25. package/packages/trajectory/package.json +2 -2
  26. package/packages/user-directory/package.json +2 -2
  27. package/packages/utils/dist/update-checker.js +4 -0
  28. package/packages/utils/package.json +1 -1
  29. package/packages/wrapper/package.json +6 -6
  30. package/deploy/workspace/codex.config.toml +0 -20
  31. package/deploy/workspace/entrypoint-browser.sh +0 -118
  32. package/deploy/workspace/entrypoint.sh +0 -612
  33. package/deploy/workspace/gh-credential-relay +0 -90
  34. package/deploy/workspace/gh-relay +0 -156
  35. package/deploy/workspace/git-credential-relay +0 -330
  36. package/deploy/workspace/git-credential-relay.test.sh +0 -230
  37. package/dist/dashboard/out/404.html +0 -1
  38. package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
  39. package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
  40. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  41. package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  42. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  43. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  44. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
  45. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  46. package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  47. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  48. package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  49. package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  50. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  51. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  52. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  53. package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  54. package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  55. package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  56. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  57. package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  58. package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  59. package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  60. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  61. package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  62. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  63. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  64. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  65. package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  66. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  67. package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  68. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  69. package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  70. package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  71. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  72. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  73. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  74. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  75. package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
  76. package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
  77. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  78. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  79. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  80. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  81. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  82. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
  83. package/dist/dashboard/out/alt-logos/logo.svg +0 -38
  84. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  85. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  86. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  87. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  88. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  89. package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
  90. package/dist/dashboard/out/app/onboarding.html +0 -1
  91. package/dist/dashboard/out/app/onboarding.txt +0 -7
  92. package/dist/dashboard/out/app.html +0 -1
  93. package/dist/dashboard/out/app.txt +0 -7
  94. package/dist/dashboard/out/apple-icon.png +0 -0
  95. package/dist/dashboard/out/cloud/link.html +0 -1
  96. package/dist/dashboard/out/cloud/link.txt +0 -7
  97. package/dist/dashboard/out/complete-profile.html +0 -5
  98. package/dist/dashboard/out/complete-profile.txt +0 -7
  99. package/dist/dashboard/out/connect-repos.html +0 -1
  100. package/dist/dashboard/out/connect-repos.txt +0 -7
  101. package/dist/dashboard/out/history.html +0 -1
  102. package/dist/dashboard/out/history.txt +0 -7
  103. package/dist/dashboard/out/index.html +0 -1
  104. package/dist/dashboard/out/index.txt +0 -7
  105. package/dist/dashboard/out/login.html +0 -5
  106. package/dist/dashboard/out/login.txt +0 -7
  107. package/dist/dashboard/out/metrics.html +0 -1
  108. package/dist/dashboard/out/metrics.txt +0 -7
  109. package/dist/dashboard/out/pricing.html +0 -13
  110. package/dist/dashboard/out/pricing.txt +0 -7
  111. package/dist/dashboard/out/providers/setup/claude.html +0 -1
  112. package/dist/dashboard/out/providers/setup/claude.txt +0 -8
  113. package/dist/dashboard/out/providers/setup/codex.html +0 -1
  114. package/dist/dashboard/out/providers/setup/codex.txt +0 -8
  115. package/dist/dashboard/out/providers/setup/cursor.html +0 -1
  116. package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
  117. package/dist/dashboard/out/providers.html +0 -1
  118. package/dist/dashboard/out/providers.txt +0 -7
  119. package/dist/dashboard/out/signup.html +0 -6
  120. package/dist/dashboard/out/signup.txt +0 -7
  121. package/dist/src/dashboard-server/index.d.ts +0 -8
  122. package/dist/src/dashboard-server/index.js +0 -8
  123. package/packages/dashboard/README.md +0 -48
  124. package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
  125. package/packages/dashboard/dist/health-worker-manager.js +0 -144
  126. package/packages/dashboard/dist/health-worker.d.ts +0 -9
  127. package/packages/dashboard/dist/health-worker.js +0 -79
  128. package/packages/dashboard/dist/index.d.ts +0 -20
  129. package/packages/dashboard/dist/index.js +0 -19
  130. package/packages/dashboard/dist/metrics.d.ts +0 -105
  131. package/packages/dashboard/dist/metrics.js +0 -193
  132. package/packages/dashboard/dist/needs-attention.d.ts +0 -24
  133. package/packages/dashboard/dist/needs-attention.js +0 -78
  134. package/packages/dashboard/dist/server.d.ts +0 -25
  135. package/packages/dashboard/dist/server.js +0 -5270
  136. package/packages/dashboard/dist/start.d.ts +0 -6
  137. package/packages/dashboard/dist/start.js +0 -13
  138. package/packages/dashboard/dist/types/threading.d.ts +0 -8
  139. package/packages/dashboard/dist/types/threading.js +0 -2
  140. package/packages/dashboard/dist/user-bridge.d.ts +0 -154
  141. package/packages/dashboard/dist/user-bridge.js +0 -372
  142. package/packages/dashboard/package.json +0 -65
  143. package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
  144. package/packages/dashboard/ui/app/app/page.tsx +0 -667
  145. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  146. package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
  147. package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
  148. package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
  149. package/packages/dashboard/ui/app/favicon.png +0 -0
  150. package/packages/dashboard/ui/app/globals.css +0 -59
  151. package/packages/dashboard/ui/app/history/page.tsx +0 -658
  152. package/packages/dashboard/ui/app/layout.tsx +0 -25
  153. package/packages/dashboard/ui/app/login/page.tsx +0 -424
  154. package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
  155. package/packages/dashboard/ui/app/page.tsx +0 -59
  156. package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
  157. package/packages/dashboard/ui/app/providers/page.tsx +0 -193
  158. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
  159. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
  160. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
  161. package/packages/dashboard/ui/app/signup/page.tsx +0 -533
  162. package/packages/dashboard/ui/index.ts +0 -49
  163. package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
  164. package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
  165. package/packages/dashboard/ui/landing/index.ts +0 -6
  166. package/packages/dashboard/ui/landing/styles.css +0 -2850
  167. package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
  168. package/packages/dashboard/ui/lib/api.ts +0 -1155
  169. package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
  170. package/packages/dashboard/ui/lib/colors.ts +0 -218
  171. package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
  172. package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
  173. package/packages/dashboard/ui/next-env.d.ts +0 -5
  174. package/packages/dashboard/ui/next.config.js +0 -41
  175. package/packages/dashboard/ui/package-lock.json +0 -2882
  176. package/packages/dashboard/ui/package.json +0 -33
  177. package/packages/dashboard/ui/postcss.config.js +0 -5
  178. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
  179. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
  180. package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
  181. package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
  182. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
  183. package/packages/dashboard/ui/react-components/App.tsx +0 -3033
  184. package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
  185. package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
  186. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
  187. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
  188. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
  189. package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
  190. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
  191. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
  192. package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
  193. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
  194. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
  195. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
  196. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
  197. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
  198. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
  199. package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
  200. package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
  201. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
  202. package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
  203. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
  204. package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
  205. package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
  206. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
  207. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
  208. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
  209. package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
  210. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
  211. package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
  212. package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
  213. package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
  214. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
  215. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
  216. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
  217. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
  218. package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
  219. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
  220. package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
  221. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
  222. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
  223. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
  224. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
  225. package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
  226. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
  227. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
  228. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
  229. package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
  230. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
  231. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
  232. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
  233. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
  234. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
  235. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
  236. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
  237. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
  238. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
  239. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
  240. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
  241. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
  242. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
  243. package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
  244. package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
  245. package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
  246. package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
  247. package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
  248. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
  249. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
  250. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
  251. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
  252. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
  253. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
  254. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
  255. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
  256. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
  257. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
  258. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
  259. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
  260. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
  261. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
  262. package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
  263. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
  264. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
  265. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
  266. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
  267. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
  268. package/packages/dashboard/ui/react-components/index.ts +0 -81
  269. package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
  270. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
  271. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
  272. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
  273. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
  274. package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
  275. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
  276. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
  277. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
  278. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
  279. package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
  280. package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
  281. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
  282. package/packages/dashboard/ui/tailwind.config.js +0 -148
  283. package/packages/dashboard/ui/types/index.ts +0 -304
  284. package/packages/dashboard/ui/types/threading.ts +0 -7
  285. package/packages/dashboard/ui-dist/404.html +0 -1
  286. package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
  287. package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
  288. package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_buildManifest.js +0 -1
  289. package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_ssgManifest.js +0 -1
  290. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  291. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  292. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  293. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  294. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
  295. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  296. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  297. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  298. package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  299. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  300. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  301. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  302. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  303. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  304. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  305. package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  306. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  307. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  308. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  309. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  310. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  311. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  312. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  313. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  314. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  315. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  316. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  317. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  318. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  319. package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  320. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  321. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  322. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  323. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  324. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  325. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
  326. package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
  327. package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_buildManifest.js +0 -1
  328. package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_ssgManifest.js +0 -1
  329. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  330. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  331. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  332. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  333. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  334. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
  335. package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
  336. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  337. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  338. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  339. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  340. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  341. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
  342. package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
  343. package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
  344. package/packages/dashboard/ui-dist/app.html +0 -1
  345. package/packages/dashboard/ui-dist/app.txt +0 -7
  346. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  347. package/packages/dashboard/ui-dist/cloud/link.html +0 -1
  348. package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
  349. package/packages/dashboard/ui-dist/complete-profile.html +0 -5
  350. package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
  351. package/packages/dashboard/ui-dist/connect-repos.html +0 -1
  352. package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
  353. package/packages/dashboard/ui-dist/history.html +0 -1
  354. package/packages/dashboard/ui-dist/history.txt +0 -7
  355. package/packages/dashboard/ui-dist/index.html +0 -1
  356. package/packages/dashboard/ui-dist/index.txt +0 -7
  357. package/packages/dashboard/ui-dist/login.html +0 -5
  358. package/packages/dashboard/ui-dist/login.txt +0 -7
  359. package/packages/dashboard/ui-dist/metrics.html +0 -1
  360. package/packages/dashboard/ui-dist/metrics.txt +0 -7
  361. package/packages/dashboard/ui-dist/pricing.html +0 -13
  362. package/packages/dashboard/ui-dist/pricing.txt +0 -7
  363. package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
  364. package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
  365. package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
  366. package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
  367. package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
  368. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
  369. package/packages/dashboard/ui-dist/providers.html +0 -1
  370. package/packages/dashboard/ui-dist/providers.txt +0 -7
  371. package/packages/dashboard/ui-dist/signup.html +0 -6
  372. package/packages/dashboard/ui-dist/signup.txt +0 -7
  373. package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
  374. package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
  375. package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
  376. package/packages/dashboard-server/dist/health-worker.js +0 -79
  377. package/packages/dashboard-server/dist/index.d.ts +0 -18
  378. package/packages/dashboard-server/dist/index.js +0 -17
  379. package/packages/dashboard-server/dist/metrics.d.ts +0 -105
  380. package/packages/dashboard-server/dist/metrics.js +0 -193
  381. package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
  382. package/packages/dashboard-server/dist/needs-attention.js +0 -78
  383. package/packages/dashboard-server/dist/server.d.ts +0 -25
  384. package/packages/dashboard-server/dist/server.js +0 -5158
  385. package/packages/dashboard-server/dist/start.d.ts +0 -6
  386. package/packages/dashboard-server/dist/start.js +0 -13
  387. package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
  388. package/packages/dashboard-server/dist/types/threading.js +0 -2
  389. package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
  390. package/packages/dashboard-server/dist/user-bridge.js +0 -390
  391. package/packages/dashboard-server/package.json +0 -55
@@ -1,69 +0,0 @@
1
- /**
2
- * TypingIndicator Component
3
- *
4
- * Shows animated typing indicator when other users are typing.
5
- * Displays user avatars and "X is typing..." text.
6
- */
7
-
8
- import React from 'react';
9
- import type { TypingIndicator as TypingIndicatorType } from './hooks/usePresence';
10
-
11
- export interface TypingIndicatorProps {
12
- /** List of users currently typing */
13
- typingUsers: TypingIndicatorType[];
14
- }
15
-
16
- export function TypingIndicator({ typingUsers }: TypingIndicatorProps) {
17
- if (typingUsers.length === 0) {
18
- return null;
19
- }
20
-
21
- // Format the typing text
22
- const formatTypingText = () => {
23
- if (typingUsers.length === 1) {
24
- return `${typingUsers[0].username} is typing`;
25
- } else if (typingUsers.length === 2) {
26
- return `${typingUsers[0].username} and ${typingUsers[1].username} are typing`;
27
- } else {
28
- return `${typingUsers[0].username} and ${typingUsers.length - 1} others are typing`;
29
- }
30
- };
31
-
32
- return (
33
- <div className="flex items-center gap-2 px-4 py-2 text-sm text-[#8d8d8e]">
34
- {/* Avatars */}
35
- <div className="flex -space-x-1.5">
36
- {typingUsers.slice(0, 3).map((user) => (
37
- <div
38
- key={user.username}
39
- className="relative"
40
- title={user.username}
41
- >
42
- {user.avatarUrl ? (
43
- <img
44
- src={user.avatarUrl}
45
- alt={user.username}
46
- className="w-5 h-5 rounded-full border border-[#1a1d21]"
47
- />
48
- ) : (
49
- <div className="w-5 h-5 rounded-full bg-[#a855f7] border border-[#1a1d21] flex items-center justify-center text-[9px] text-white font-medium">
50
- {user.username.charAt(0).toUpperCase()}
51
- </div>
52
- )}
53
- </div>
54
- ))}
55
- </div>
56
-
57
- {/* Typing text */}
58
- <span className="flex items-center gap-1">
59
- {formatTypingText()}
60
- {/* Animated dots */}
61
- <span className="flex gap-0.5">
62
- <span className="w-1 h-1 bg-[#8d8d8e] rounded-full animate-bounce" style={{ animationDelay: '0ms' }} />
63
- <span className="w-1 h-1 bg-[#8d8d8e] rounded-full animate-bounce" style={{ animationDelay: '150ms' }} />
64
- <span className="w-1 h-1 bg-[#8d8d8e] rounded-full animate-bounce" style={{ animationDelay: '300ms' }} />
65
- </span>
66
- </span>
67
- </div>
68
- );
69
- }
@@ -1,231 +0,0 @@
1
- /**
2
- * Usage Banner Component
3
- *
4
- * Displays remaining compute hours for free tier users.
5
- * Shows warning when approaching limit and upgrade CTA when exceeded.
6
- */
7
-
8
- import React, { useEffect, useState } from 'react';
9
-
10
- interface UsageData {
11
- plan: 'free' | 'pro' | 'team' | 'enterprise';
12
- limits: {
13
- computeHoursPerMonth: number;
14
- };
15
- usage: {
16
- computeHoursThisMonth: number;
17
- };
18
- percentUsed: {
19
- computeHours: number;
20
- };
21
- introBonus?: {
22
- isActive: boolean;
23
- daysRemaining: number;
24
- totalDays: number;
25
- expiresAt: string | null;
26
- resources: {
27
- cpus: number;
28
- memoryGb: number;
29
- description: string;
30
- };
31
- };
32
- }
33
-
34
- export interface UsageBannerProps {
35
- /** API base URL (default: '') */
36
- apiBaseUrl?: string;
37
- /** Callback when upgrade is clicked */
38
- onUpgradeClick?: () => void;
39
- }
40
-
41
- export function UsageBanner({ apiBaseUrl = '', onUpgradeClick }: UsageBannerProps) {
42
- const [usage, setUsage] = useState<UsageData | null>(null);
43
- const [loading, setLoading] = useState(true);
44
- const [error, setError] = useState<string | null>(null);
45
- const [dismissed, setDismissed] = useState(false);
46
-
47
- useEffect(() => {
48
- async function fetchUsage() {
49
- try {
50
- const response = await fetch(`${apiBaseUrl}/api/usage`, {
51
- credentials: 'include',
52
- });
53
-
54
- if (!response.ok) {
55
- if (response.status === 401) {
56
- // Not logged in, don't show banner
57
- setLoading(false);
58
- return;
59
- }
60
- throw new Error('Failed to fetch usage');
61
- }
62
-
63
- const data = await response.json();
64
- setUsage(data);
65
- } catch (err) {
66
- setError(err instanceof Error ? err.message : 'Unknown error');
67
- } finally {
68
- setLoading(false);
69
- }
70
- }
71
-
72
- fetchUsage();
73
-
74
- // Refresh every 5 minutes
75
- const interval = setInterval(fetchUsage, 5 * 60 * 1000);
76
- return () => clearInterval(interval);
77
- }, [apiBaseUrl]);
78
-
79
- // Don't show for non-free plans
80
- if (loading || error || !usage || usage.plan !== 'free' || dismissed) {
81
- return null;
82
- }
83
-
84
- const { computeHoursThisMonth } = usage.usage;
85
- const { computeHoursPerMonth } = usage.limits;
86
- const percentUsed = usage.percentUsed.computeHours;
87
- const remaining = Math.max(0, computeHoursPerMonth - computeHoursThisMonth);
88
- const isExceeded = remaining <= 0;
89
- const isWarning = percentUsed >= 80 && !isExceeded;
90
-
91
- // Intro bonus status
92
- const introBonus = usage.introBonus;
93
- const hasActiveIntro = introBonus?.isActive && introBonus.daysRemaining > 0;
94
-
95
- // Get current month name
96
- const monthName = new Date().toLocaleDateString('en-US', { month: 'long' });
97
-
98
- // Determine banner style
99
- let bgClass = 'bg-bg-tertiary border-border-subtle';
100
- let textClass = 'text-text-secondary';
101
- let iconColor = 'text-accent-cyan';
102
-
103
- if (isExceeded) {
104
- bgClass = 'bg-error/10 border-error/30';
105
- textClass = 'text-error';
106
- iconColor = 'text-error';
107
- } else if (isWarning) {
108
- bgClass = 'bg-warning/10 border-warning/30';
109
- textClass = 'text-warning';
110
- iconColor = 'text-warning';
111
- } else if (hasActiveIntro) {
112
- // Special styling for intro bonus - use brand cyan
113
- bgClass = 'bg-accent-cyan/10 border-accent-cyan/30';
114
- textClass = 'text-accent-cyan';
115
- iconColor = 'text-accent-cyan';
116
- }
117
-
118
- return (
119
- <div className={`flex items-center justify-between px-4 py-2 border-b ${bgClass}`}>
120
- <div className="flex items-center gap-3">
121
- {hasActiveIntro ? <RocketIcon className={iconColor} /> : <ClockIcon className={iconColor} />}
122
- <span className={`text-sm ${textClass}`}>
123
- {isExceeded ? (
124
- <>
125
- <strong>Compute limit reached</strong> — Your free tier compute hours for {monthName} have been used.
126
- Workspaces are paused until next month.
127
- </>
128
- ) : isWarning ? (
129
- <>
130
- <strong>{remaining.toFixed(1)}h remaining</strong> — You&apos;ve used {percentUsed}% of your
131
- free tier compute hours for {monthName}.
132
- </>
133
- ) : hasActiveIntro ? (
134
- <>
135
- <strong>Intro Bonus Active</strong> — {introBonus!.resources.cpus} CPU / {introBonus!.resources.memoryGb}GB RAM.{' '}
136
- <span className="text-text-secondary">
137
- {introBonus!.daysRemaining} day{introBonus!.daysRemaining !== 1 ? 's' : ''} remaining before auto-resize to 1 CPU / 2GB.
138
- </span>
139
- </>
140
- ) : (
141
- <>
142
- <strong>{remaining.toFixed(1)} of {computeHoursPerMonth}h</strong> compute hours remaining
143
- this month
144
- </>
145
- )}
146
- </span>
147
- </div>
148
-
149
- <div className="flex items-center gap-2">
150
- {(isExceeded || isWarning || hasActiveIntro) && (
151
- <button
152
- onClick={onUpgradeClick || (() => window.location.href = '/pricing')}
153
- className="px-3 py-1.5 bg-gradient-to-r from-accent-cyan to-[#00b8d9] text-bg-deep font-semibold border-none rounded-md text-xs cursor-pointer transition-all duration-150 hover:shadow-glow-cyan hover:-translate-y-0.5"
154
- >
155
- {hasActiveIntro ? 'Keep Pro Resources' : 'Upgrade Plan'}
156
- </button>
157
- )}
158
-
159
- {!isExceeded && (
160
- <button
161
- onClick={() => setDismissed(true)}
162
- className="p-1 text-text-muted hover:text-text-primary transition-colors"
163
- aria-label="Dismiss"
164
- >
165
- <CloseIcon />
166
- </button>
167
- )}
168
- </div>
169
- </div>
170
- );
171
- }
172
-
173
- function ClockIcon({ className }: { className?: string }) {
174
- return (
175
- <svg
176
- width="16"
177
- height="16"
178
- viewBox="0 0 24 24"
179
- fill="none"
180
- stroke="currentColor"
181
- strokeWidth="2"
182
- strokeLinecap="round"
183
- strokeLinejoin="round"
184
- className={className}
185
- >
186
- <circle cx="12" cy="12" r="10" />
187
- <polyline points="12 6 12 12 16 14" />
188
- </svg>
189
- );
190
- }
191
-
192
- function CloseIcon() {
193
- return (
194
- <svg
195
- width="14"
196
- height="14"
197
- viewBox="0 0 24 24"
198
- fill="none"
199
- stroke="currentColor"
200
- strokeWidth="2"
201
- strokeLinecap="round"
202
- strokeLinejoin="round"
203
- >
204
- <line x1="18" y1="6" x2="6" y2="18" />
205
- <line x1="6" y1="6" x2="18" y2="18" />
206
- </svg>
207
- );
208
- }
209
-
210
- function RocketIcon({ className }: { className?: string }) {
211
- return (
212
- <svg
213
- width="16"
214
- height="16"
215
- viewBox="0 0 24 24"
216
- fill="none"
217
- stroke="currentColor"
218
- strokeWidth="2"
219
- strokeLinecap="round"
220
- strokeLinejoin="round"
221
- className={className}
222
- >
223
- <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" />
224
- <path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" />
225
- <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" />
226
- <path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
227
- </svg>
228
- );
229
- }
230
-
231
- export default UsageBanner;
@@ -1,233 +0,0 @@
1
- /**
2
- * UserProfilePanel Component
3
- *
4
- * Slide-out panel showing user profile details.
5
- * Displays avatar, username, GitHub link, and action buttons.
6
- */
7
-
8
- import React, { useEffect, useRef } from 'react';
9
- import type { UserPresence } from './hooks/usePresence';
10
-
11
- export interface UserProfilePanelProps {
12
- /** User to display (null to hide panel) */
13
- user: UserPresence | null;
14
- /** Callback when panel should close */
15
- onClose: () => void;
16
- /** Callback when mention button is clicked */
17
- onMention?: (username: string) => void;
18
- /** Callback when send message button is clicked */
19
- onSendMessage?: (user: UserPresence) => void;
20
- }
21
-
22
- export function UserProfilePanel({ user, onClose, onMention, onSendMessage }: UserProfilePanelProps) {
23
- const panelRef = useRef<HTMLDivElement>(null);
24
-
25
- // Close on Escape key
26
- useEffect(() => {
27
- const handleKeyDown = (e: KeyboardEvent) => {
28
- if (e.key === 'Escape') {
29
- onClose();
30
- }
31
- };
32
-
33
- if (user) {
34
- window.addEventListener('keydown', handleKeyDown);
35
- }
36
- return () => window.removeEventListener('keydown', handleKeyDown);
37
- }, [user, onClose]);
38
-
39
- // Close on outside click
40
- // Use a ref to track if the panel just opened to avoid closing on the same click
41
- const justOpenedRef = useRef(false);
42
-
43
- useEffect(() => {
44
- if (user) {
45
- // Mark as just opened
46
- justOpenedRef.current = true;
47
- }
48
- }, [user]);
49
-
50
- useEffect(() => {
51
- const handleClickOutside = (e: MouseEvent) => {
52
- // Skip if panel just opened (same event loop tick that opened it)
53
- if (justOpenedRef.current) {
54
- justOpenedRef.current = false;
55
- return;
56
- }
57
-
58
- if (panelRef.current && !panelRef.current.contains(e.target as Node)) {
59
- onClose();
60
- }
61
- };
62
-
63
- if (user) {
64
- document.addEventListener('mousedown', handleClickOutside);
65
- return () => {
66
- document.removeEventListener('mousedown', handleClickOutside);
67
- };
68
- }
69
- }, [user, onClose]);
70
-
71
- if (!user) {
72
- return null;
73
- }
74
-
75
- const githubUrl = `https://github.com/${user.username}`;
76
-
77
- return (
78
- <>
79
- {/* Backdrop */}
80
- <div className="fixed inset-0 bg-black/50 z-40" />
81
-
82
- {/* Panel */}
83
- <div
84
- ref={panelRef}
85
- className="fixed right-0 top-0 h-full w-80 bg-[#1a1d21] border-l border-white/10 shadow-2xl z-50 flex flex-col animate-slide-in-right"
86
- >
87
- {/* Header */}
88
- <div className="flex items-center justify-between p-4 border-b border-white/10">
89
- <h2 className="text-lg font-semibold text-[#d1d2d3]">Profile</h2>
90
- <button
91
- onClick={onClose}
92
- className="p-1 hover:bg-white/10 rounded-md transition-colors"
93
- title="Close"
94
- >
95
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
96
- <path d="M18 6L6 18M6 6l12 12" />
97
- </svg>
98
- </button>
99
- </div>
100
-
101
- {/* User Info */}
102
- <div className="flex flex-col items-center p-6 border-b border-white/10">
103
- {/* Large Avatar */}
104
- <div className="relative mb-4">
105
- {user.avatarUrl ? (
106
- <img
107
- src={user.avatarUrl}
108
- alt={user.username}
109
- className="w-24 h-24 rounded-full object-cover border-4 border-[#a855f7]/30"
110
- />
111
- ) : (
112
- <div className="w-24 h-24 rounded-full bg-[#a855f7] flex items-center justify-center text-3xl text-white font-bold border-4 border-[#a855f7]/30">
113
- {user.username.charAt(0).toUpperCase()}
114
- </div>
115
- )}
116
- {/* Online indicator */}
117
- <div className="absolute bottom-1 right-1 w-5 h-5 bg-green-500 rounded-full border-4 border-[#1a1d21]" />
118
- </div>
119
-
120
- {/* Username */}
121
- <h3 className="text-xl font-semibold text-[#d1d2d3] mb-1">
122
- {user.username}
123
- </h3>
124
-
125
- {/* Status */}
126
- <span className="text-sm text-green-400 flex items-center gap-1.5">
127
- <div className="w-2 h-2 bg-green-500 rounded-full" />
128
- Online
129
- </span>
130
- </div>
131
-
132
- {/* Details */}
133
- <div className="flex-1 p-4 overflow-y-auto">
134
- <div className="space-y-4">
135
- {/* Online Since */}
136
- <div>
137
- <label className="text-xs text-[#8d8d8e] uppercase tracking-wide">Online Since</label>
138
- <p className="text-sm text-[#d1d2d3] mt-1">
139
- {formatDateTime(user.connectedAt)}
140
- </p>
141
- </div>
142
-
143
- {/* Last Active */}
144
- <div>
145
- <label className="text-xs text-[#8d8d8e] uppercase tracking-wide">Last Active</label>
146
- <p className="text-sm text-[#d1d2d3] mt-1">
147
- {formatDateTime(user.lastSeen)}
148
- </p>
149
- </div>
150
-
151
- {/* GitHub Link */}
152
- <div>
153
- <label className="text-xs text-[#8d8d8e] uppercase tracking-wide">GitHub</label>
154
- <a
155
- href={githubUrl}
156
- target="_blank"
157
- rel="noopener noreferrer"
158
- className="flex items-center gap-2 mt-1 text-sm text-[#a855f7] hover:text-[#c084fc] transition-colors"
159
- >
160
- <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
161
- <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
162
- </svg>
163
- @{user.username}
164
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
165
- <path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6M15 3h6v6M10 14L21 3" />
166
- </svg>
167
- </a>
168
- </div>
169
- </div>
170
- </div>
171
-
172
- {/* Actions */}
173
- <div className="p-4 border-t border-white/10 space-y-2">
174
- {/* Send Message Button */}
175
- <button
176
- onClick={() => {
177
- onSendMessage?.(user);
178
- onClose();
179
- }}
180
- className="w-full flex items-center justify-center gap-2 py-2.5 bg-[#00d4aa] hover:bg-[#00bfa0] text-[#0a0e14] font-medium rounded-lg transition-colors"
181
- >
182
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
183
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
184
- </svg>
185
- Send Message
186
- </button>
187
-
188
- {/* Mention Button */}
189
- <button
190
- onClick={() => {
191
- onMention?.(user.username);
192
- onClose();
193
- }}
194
- className="w-full flex items-center justify-center gap-2 py-2.5 bg-[#a855f7] hover:bg-[#9333ea] text-white font-medium rounded-lg transition-colors"
195
- >
196
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
197
- <circle cx="12" cy="12" r="4" />
198
- <path d="M16 8v5a3 3 0 006 0v-1a10 10 0 10-3.92 7.94" />
199
- </svg>
200
- Mention @{user.username}
201
- </button>
202
-
203
- {/* View on GitHub */}
204
- <a
205
- href={githubUrl}
206
- target="_blank"
207
- rel="noopener noreferrer"
208
- className="w-full flex items-center justify-center gap-2 py-2.5 border border-white/20 text-[#d1d2d3] hover:bg-white/5 font-medium rounded-lg transition-colors"
209
- >
210
- <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
211
- <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
212
- </svg>
213
- View on GitHub
214
- </a>
215
- </div>
216
- </div>
217
- </>
218
- );
219
- }
220
-
221
- /**
222
- * Format a timestamp to a readable date/time
223
- */
224
- function formatDateTime(timestamp: string): string {
225
- const date = new Date(timestamp);
226
- return date.toLocaleString([], {
227
- month: 'short',
228
- day: 'numeric',
229
- year: 'numeric',
230
- hour: '2-digit',
231
- minute: '2-digit',
232
- });
233
- }
@@ -1,107 +0,0 @@
1
- /**
2
- * Workspace Context
3
- *
4
- * Provides the current workspace's base URL for WebSocket connections.
5
- * Used by LogViewer and other components that need to connect to workspace-specific endpoints.
6
- */
7
-
8
- import React, { createContext, useContext, useMemo } from 'react';
9
-
10
- interface WorkspaceContextValue {
11
- /** Base WebSocket URL for the workspace (e.g., wss://workspace-abc.agentrelay.dev) */
12
- wsBaseUrl: string | null;
13
- /** Whether we're in cloud mode (workspace URL is different from page host) */
14
- isCloudMode: boolean;
15
- }
16
-
17
- const WorkspaceContext = createContext<WorkspaceContextValue>({
18
- wsBaseUrl: null,
19
- isCloudMode: false,
20
- });
21
-
22
- export interface WorkspaceProviderProps {
23
- children: React.ReactNode;
24
- /** The workspace WebSocket URL (e.g., wss://workspace-abc.agentrelay.dev/ws) */
25
- wsUrl?: string;
26
- }
27
-
28
- /**
29
- * Extract base URL from a WebSocket URL
30
- * e.g., wss://workspace-abc.agentrelay.dev/ws -> wss://workspace-abc.agentrelay.dev
31
- */
32
- function getBaseUrl(wsUrl: string): string {
33
- try {
34
- const url = new URL(wsUrl);
35
- return `${url.protocol}//${url.host}`;
36
- } catch {
37
- return wsUrl;
38
- }
39
- }
40
-
41
- export function WorkspaceProvider({ children, wsUrl }: WorkspaceProviderProps) {
42
- const value = useMemo(() => {
43
- if (!wsUrl) {
44
- return { wsBaseUrl: null, isCloudMode: false };
45
- }
46
-
47
- const wsBaseUrl = getBaseUrl(wsUrl);
48
-
49
- // Check if we're in cloud mode by comparing the workspace URL host with the current page host
50
- let isCloudMode = false;
51
- if (typeof window !== 'undefined') {
52
- try {
53
- const wsHost = new URL(wsUrl).host;
54
- isCloudMode = wsHost !== window.location.host;
55
- } catch {
56
- // Ignore parse errors
57
- }
58
- }
59
-
60
- return { wsBaseUrl, isCloudMode };
61
- }, [wsUrl]);
62
-
63
- return (
64
- <WorkspaceContext.Provider value={value}>
65
- {children}
66
- </WorkspaceContext.Provider>
67
- );
68
- }
69
-
70
- /**
71
- * Hook to access the workspace context
72
- */
73
- export function useWorkspace(): WorkspaceContextValue {
74
- return useContext(WorkspaceContext);
75
- }
76
-
77
- /**
78
- * Get the WebSocket URL for a specific path within the workspace
79
- * Falls back to current host if not in a workspace context
80
- */
81
- export function useWorkspaceWsUrl(path: string): string {
82
- const { wsBaseUrl } = useWorkspace();
83
-
84
- return useMemo(() => {
85
- if (wsBaseUrl) {
86
- return `${wsBaseUrl}${path}`;
87
- }
88
-
89
- // Fallback to current host
90
- if (typeof window === 'undefined') {
91
- return `ws://localhost:3889${path}`;
92
- }
93
-
94
- const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
95
- const isDev = process.env.NODE_ENV === 'development';
96
- const { hostname, port } = window.location;
97
-
98
- // Next.js dev runs on 3888, dashboard server on 3889
99
- if (isDev && port === '3888') {
100
- return `${protocol}//${hostname || 'localhost'}:3889${path}`;
101
- }
102
-
103
- return `${protocol}//${window.location.host}${path}`;
104
- }, [wsBaseUrl, path]);
105
- }
106
-
107
- export default WorkspaceContext;