agent-relay 2.0.21 → 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 (412) 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 +21 -1
  13. package/packages/daemon/dist/router.d.ts +5 -0
  14. package/packages/daemon/dist/router.js +31 -0
  15. package/packages/daemon/dist/server.d.ts +5 -0
  16. package/packages/daemon/dist/server.js +131 -1
  17. package/packages/daemon/package.json +12 -12
  18. package/packages/hooks/package.json +4 -4
  19. package/packages/mcp/dist/client.d.ts +15 -0
  20. package/packages/mcp/dist/client.js +9 -0
  21. package/packages/mcp/dist/server.js +13 -1
  22. package/packages/mcp/dist/tools/index.d.ts +2 -0
  23. package/packages/mcp/dist/tools/index.js +2 -0
  24. package/packages/mcp/dist/tools/relay-connected.d.ts +17 -0
  25. package/packages/mcp/dist/tools/relay-connected.js +40 -0
  26. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +20 -0
  27. package/packages/mcp/dist/tools/relay-remove-agent.js +50 -0
  28. package/packages/mcp/package.json +2 -2
  29. package/packages/memory/package.json +2 -2
  30. package/packages/policy/package.json +2 -2
  31. package/packages/protocol/dist/types.d.ts +46 -1
  32. package/packages/protocol/package.json +1 -1
  33. package/packages/resiliency/package.json +1 -1
  34. package/packages/sdk/dist/client.d.ts +22 -1
  35. package/packages/sdk/dist/client.js +31 -0
  36. package/packages/sdk/dist/protocol/index.d.ts +1 -1
  37. package/packages/sdk/dist/protocol/types.d.ts +35 -1
  38. package/packages/sdk/package.json +2 -2
  39. package/packages/spawner/package.json +1 -1
  40. package/packages/state/package.json +1 -1
  41. package/packages/storage/dist/adapter.d.ts +4 -0
  42. package/packages/storage/dist/sqlite-adapter.d.ts +10 -0
  43. package/packages/storage/dist/sqlite-adapter.js +26 -0
  44. package/packages/storage/package.json +2 -2
  45. package/packages/telemetry/package.json +1 -1
  46. package/packages/trajectory/package.json +2 -2
  47. package/packages/user-directory/package.json +2 -2
  48. package/packages/utils/dist/update-checker.js +4 -0
  49. package/packages/utils/package.json +1 -1
  50. package/packages/wrapper/package.json +6 -6
  51. package/deploy/workspace/codex.config.toml +0 -20
  52. package/deploy/workspace/entrypoint-browser.sh +0 -118
  53. package/deploy/workspace/entrypoint.sh +0 -612
  54. package/deploy/workspace/gh-credential-relay +0 -90
  55. package/deploy/workspace/gh-relay +0 -156
  56. package/deploy/workspace/git-credential-relay +0 -330
  57. package/deploy/workspace/git-credential-relay.test.sh +0 -230
  58. package/dist/dashboard/out/404.html +0 -1
  59. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  60. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  61. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  62. package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  63. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  64. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  65. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
  66. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  67. package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  68. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  69. package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  70. package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  71. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  72. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  73. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  74. package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  75. package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  76. package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  77. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  78. package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  79. package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  80. package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  81. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  82. package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  83. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  84. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  85. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  86. package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  87. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  88. package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  89. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  90. package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  91. package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  92. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  93. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  94. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  95. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  96. package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
  97. package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
  98. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  99. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  100. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  101. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  102. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  103. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
  104. package/dist/dashboard/out/alt-logos/logo.svg +0 -38
  105. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  106. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  107. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  108. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  109. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  110. package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
  111. package/dist/dashboard/out/app/onboarding.html +0 -1
  112. package/dist/dashboard/out/app/onboarding.txt +0 -7
  113. package/dist/dashboard/out/app.html +0 -1
  114. package/dist/dashboard/out/app.txt +0 -7
  115. package/dist/dashboard/out/apple-icon.png +0 -0
  116. package/dist/dashboard/out/cloud/link.html +0 -1
  117. package/dist/dashboard/out/cloud/link.txt +0 -7
  118. package/dist/dashboard/out/complete-profile.html +0 -5
  119. package/dist/dashboard/out/complete-profile.txt +0 -7
  120. package/dist/dashboard/out/connect-repos.html +0 -1
  121. package/dist/dashboard/out/connect-repos.txt +0 -7
  122. package/dist/dashboard/out/history.html +0 -1
  123. package/dist/dashboard/out/history.txt +0 -7
  124. package/dist/dashboard/out/index.html +0 -1
  125. package/dist/dashboard/out/index.txt +0 -7
  126. package/dist/dashboard/out/login.html +0 -5
  127. package/dist/dashboard/out/login.txt +0 -7
  128. package/dist/dashboard/out/metrics.html +0 -1
  129. package/dist/dashboard/out/metrics.txt +0 -7
  130. package/dist/dashboard/out/pricing.html +0 -13
  131. package/dist/dashboard/out/pricing.txt +0 -7
  132. package/dist/dashboard/out/providers/setup/claude.html +0 -1
  133. package/dist/dashboard/out/providers/setup/claude.txt +0 -8
  134. package/dist/dashboard/out/providers/setup/codex.html +0 -1
  135. package/dist/dashboard/out/providers/setup/codex.txt +0 -8
  136. package/dist/dashboard/out/providers/setup/cursor.html +0 -1
  137. package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
  138. package/dist/dashboard/out/providers.html +0 -1
  139. package/dist/dashboard/out/providers.txt +0 -7
  140. package/dist/dashboard/out/signup.html +0 -6
  141. package/dist/dashboard/out/signup.txt +0 -7
  142. package/dist/src/dashboard-server/index.d.ts +0 -8
  143. package/dist/src/dashboard-server/index.js +0 -8
  144. package/packages/dashboard/README.md +0 -48
  145. package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
  146. package/packages/dashboard/dist/health-worker-manager.js +0 -144
  147. package/packages/dashboard/dist/health-worker.d.ts +0 -9
  148. package/packages/dashboard/dist/health-worker.js +0 -79
  149. package/packages/dashboard/dist/index.d.ts +0 -20
  150. package/packages/dashboard/dist/index.js +0 -19
  151. package/packages/dashboard/dist/metrics.d.ts +0 -105
  152. package/packages/dashboard/dist/metrics.js +0 -193
  153. package/packages/dashboard/dist/needs-attention.d.ts +0 -24
  154. package/packages/dashboard/dist/needs-attention.js +0 -78
  155. package/packages/dashboard/dist/server.d.ts +0 -25
  156. package/packages/dashboard/dist/server.js +0 -5270
  157. package/packages/dashboard/dist/start.d.ts +0 -6
  158. package/packages/dashboard/dist/start.js +0 -13
  159. package/packages/dashboard/dist/types/threading.d.ts +0 -8
  160. package/packages/dashboard/dist/types/threading.js +0 -2
  161. package/packages/dashboard/dist/user-bridge.d.ts +0 -154
  162. package/packages/dashboard/dist/user-bridge.js +0 -372
  163. package/packages/dashboard/package.json +0 -65
  164. package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
  165. package/packages/dashboard/ui/app/app/page.tsx +0 -667
  166. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  167. package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
  168. package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
  169. package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
  170. package/packages/dashboard/ui/app/favicon.png +0 -0
  171. package/packages/dashboard/ui/app/globals.css +0 -59
  172. package/packages/dashboard/ui/app/history/page.tsx +0 -658
  173. package/packages/dashboard/ui/app/layout.tsx +0 -25
  174. package/packages/dashboard/ui/app/login/page.tsx +0 -424
  175. package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
  176. package/packages/dashboard/ui/app/page.tsx +0 -59
  177. package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
  178. package/packages/dashboard/ui/app/providers/page.tsx +0 -193
  179. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
  180. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
  181. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
  182. package/packages/dashboard/ui/app/signup/page.tsx +0 -533
  183. package/packages/dashboard/ui/index.ts +0 -49
  184. package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
  185. package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
  186. package/packages/dashboard/ui/landing/index.ts +0 -6
  187. package/packages/dashboard/ui/landing/styles.css +0 -2850
  188. package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
  189. package/packages/dashboard/ui/lib/api.ts +0 -1155
  190. package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
  191. package/packages/dashboard/ui/lib/colors.ts +0 -218
  192. package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
  193. package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
  194. package/packages/dashboard/ui/next-env.d.ts +0 -5
  195. package/packages/dashboard/ui/next.config.js +0 -41
  196. package/packages/dashboard/ui/package-lock.json +0 -2882
  197. package/packages/dashboard/ui/package.json +0 -33
  198. package/packages/dashboard/ui/postcss.config.js +0 -5
  199. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
  200. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
  201. package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
  202. package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
  203. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
  204. package/packages/dashboard/ui/react-components/App.tsx +0 -3033
  205. package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
  206. package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
  207. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
  208. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
  209. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
  210. package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
  211. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
  212. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
  213. package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
  214. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
  215. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
  216. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
  217. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
  218. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
  219. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
  220. package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
  221. package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
  222. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
  223. package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
  224. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
  225. package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
  226. package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
  227. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
  228. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
  229. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
  230. package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
  231. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
  232. package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
  233. package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
  234. package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
  235. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
  236. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
  237. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
  238. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
  239. package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
  240. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
  241. package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
  242. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
  243. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
  244. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
  245. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
  246. package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
  247. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
  248. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
  249. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
  250. package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
  251. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
  252. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
  253. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
  254. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
  255. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
  256. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
  257. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
  258. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
  259. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
  260. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
  261. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
  262. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
  263. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
  264. package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
  265. package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
  266. package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
  267. package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
  268. package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
  269. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
  270. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
  271. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
  272. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
  273. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
  274. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
  275. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
  276. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
  277. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
  278. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
  279. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
  280. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
  281. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
  282. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
  283. package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
  284. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
  285. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
  286. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
  287. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
  288. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
  289. package/packages/dashboard/ui/react-components/index.ts +0 -81
  290. package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
  291. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
  292. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
  293. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
  294. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
  295. package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
  296. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
  297. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
  298. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
  299. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
  300. package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
  301. package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
  302. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
  303. package/packages/dashboard/ui/tailwind.config.js +0 -148
  304. package/packages/dashboard/ui/types/index.ts +0 -304
  305. package/packages/dashboard/ui/types/threading.ts +0 -7
  306. package/packages/dashboard/ui-dist/404.html +0 -1
  307. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  308. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  309. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  310. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  311. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  312. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  313. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
  314. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  315. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  316. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  317. package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  318. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  319. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  320. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  321. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  322. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  323. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  324. package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  325. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  326. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  327. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  328. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  329. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  330. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  331. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  332. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  333. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  334. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  335. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  336. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  337. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  338. package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  339. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  340. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  341. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  342. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  343. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  344. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
  345. package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
  346. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_buildManifest.js +0 -1
  347. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_ssgManifest.js +0 -1
  348. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_buildManifest.js +0 -1
  349. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_ssgManifest.js +0 -1
  350. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  351. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  352. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  353. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  354. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  355. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
  356. package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
  357. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  358. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  359. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  360. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  361. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  362. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
  363. package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
  364. package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
  365. package/packages/dashboard/ui-dist/app.html +0 -1
  366. package/packages/dashboard/ui-dist/app.txt +0 -7
  367. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  368. package/packages/dashboard/ui-dist/cloud/link.html +0 -1
  369. package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
  370. package/packages/dashboard/ui-dist/complete-profile.html +0 -5
  371. package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
  372. package/packages/dashboard/ui-dist/connect-repos.html +0 -1
  373. package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
  374. package/packages/dashboard/ui-dist/history.html +0 -1
  375. package/packages/dashboard/ui-dist/history.txt +0 -7
  376. package/packages/dashboard/ui-dist/index.html +0 -1
  377. package/packages/dashboard/ui-dist/index.txt +0 -7
  378. package/packages/dashboard/ui-dist/login.html +0 -5
  379. package/packages/dashboard/ui-dist/login.txt +0 -7
  380. package/packages/dashboard/ui-dist/metrics.html +0 -1
  381. package/packages/dashboard/ui-dist/metrics.txt +0 -7
  382. package/packages/dashboard/ui-dist/pricing.html +0 -13
  383. package/packages/dashboard/ui-dist/pricing.txt +0 -7
  384. package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
  385. package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
  386. package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
  387. package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
  388. package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
  389. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
  390. package/packages/dashboard/ui-dist/providers.html +0 -1
  391. package/packages/dashboard/ui-dist/providers.txt +0 -7
  392. package/packages/dashboard/ui-dist/signup.html +0 -6
  393. package/packages/dashboard/ui-dist/signup.txt +0 -7
  394. package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
  395. package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
  396. package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
  397. package/packages/dashboard-server/dist/health-worker.js +0 -79
  398. package/packages/dashboard-server/dist/index.d.ts +0 -18
  399. package/packages/dashboard-server/dist/index.js +0 -17
  400. package/packages/dashboard-server/dist/metrics.d.ts +0 -105
  401. package/packages/dashboard-server/dist/metrics.js +0 -193
  402. package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
  403. package/packages/dashboard-server/dist/needs-attention.js +0 -78
  404. package/packages/dashboard-server/dist/server.d.ts +0 -25
  405. package/packages/dashboard-server/dist/server.js +0 -5158
  406. package/packages/dashboard-server/dist/start.d.ts +0 -6
  407. package/packages/dashboard-server/dist/start.js +0 -13
  408. package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
  409. package/packages/dashboard-server/dist/types/threading.js +0 -2
  410. package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
  411. package/packages/dashboard-server/dist/user-bridge.js +0 -390
  412. package/packages/dashboard-server/package.json +0 -55
@@ -1,488 +0,0 @@
1
- /**
2
- * NotificationToast Component
3
- *
4
- * Toast notifications for alerts, messages, and system events.
5
- * Supports multiple toast types and auto-dismiss.
6
- */
7
-
8
- import React, { useEffect, useState, useCallback } from 'react';
9
- import { getAgentColor, getAgentInitials } from '../lib/colors';
10
-
11
- export interface Toast {
12
- id: string;
13
- type: 'info' | 'success' | 'warning' | 'error' | 'message';
14
- title: string;
15
- message?: string;
16
- agentName?: string;
17
- duration?: number;
18
- action?: {
19
- label: string;
20
- onClick: () => void;
21
- };
22
- }
23
-
24
- export interface NotificationToastProps {
25
- toasts: Toast[];
26
- onDismiss: (id: string) => void;
27
- position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
28
- maxVisible?: number;
29
- }
30
-
31
- export function NotificationToast({
32
- toasts,
33
- onDismiss,
34
- position = 'top-right',
35
- maxVisible = 5,
36
- }: NotificationToastProps) {
37
- const visibleToasts = toasts.slice(0, maxVisible);
38
-
39
- return (
40
- <div className={`toast-container toast-${position}`}>
41
- {visibleToasts.map((toast) => (
42
- <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />
43
- ))}
44
- </div>
45
- );
46
- }
47
-
48
- interface ToastItemProps {
49
- toast: Toast;
50
- onDismiss: (id: string) => void;
51
- }
52
-
53
- function ToastItem({ toast, onDismiss }: ToastItemProps) {
54
- const [isExiting, setIsExiting] = useState(false);
55
-
56
- const handleDismiss = useCallback(() => {
57
- setIsExiting(true);
58
- setTimeout(() => onDismiss(toast.id), 200);
59
- }, [toast.id, onDismiss]);
60
-
61
- // Auto-dismiss
62
- useEffect(() => {
63
- if (toast.duration === 0) return;
64
-
65
- const duration = toast.duration || 5000;
66
- const timer = setTimeout(handleDismiss, duration);
67
- return () => clearTimeout(timer);
68
- }, [toast.duration, handleDismiss]);
69
-
70
- const colors = toast.agentName ? getAgentColor(toast.agentName) : null;
71
- const Icon = getToastIcon(toast.type);
72
-
73
- return (
74
- <div
75
- className={`toast toast-${toast.type} ${isExiting ? 'toast-exit' : ''}`}
76
- role="alert"
77
- >
78
- <div className="toast-icon-wrapper">
79
- {toast.agentName ? (
80
- <div
81
- className="toast-agent-avatar"
82
- style={{ backgroundColor: colors?.primary, color: colors?.text }}
83
- >
84
- {getAgentInitials(toast.agentName)}
85
- </div>
86
- ) : (
87
- <div className={`toast-icon toast-icon-${toast.type}`}>
88
- <Icon />
89
- </div>
90
- )}
91
- </div>
92
-
93
- <div className="toast-content">
94
- <div className="toast-header">
95
- <span className="toast-title">{toast.title}</span>
96
- {toast.agentName && <span className="toast-agent">@{toast.agentName}</span>}
97
- </div>
98
- {toast.message && <p className="toast-message">{toast.message}</p>}
99
- {toast.action && (
100
- <button
101
- className="toast-action"
102
- onClick={() => {
103
- toast.action?.onClick();
104
- handleDismiss();
105
- }}
106
- >
107
- {toast.action.label}
108
- </button>
109
- )}
110
- </div>
111
-
112
- <button className="toast-close" onClick={handleDismiss} aria-label="Dismiss">
113
- <CloseIcon />
114
- </button>
115
-
116
- {toast.duration !== 0 && (
117
- <div
118
- className="toast-progress"
119
- style={{ animationDuration: `${toast.duration || 5000}ms` }}
120
- />
121
- )}
122
- </div>
123
- );
124
- }
125
-
126
- // Hook for managing toasts
127
- export function useToasts() {
128
- const [toasts, setToasts] = useState<Toast[]>([]);
129
-
130
- const addToast = useCallback((toast: Omit<Toast, 'id'>) => {
131
- const id = Math.random().toString(36).substring(2, 9);
132
- setToasts((prev) => [...prev, { ...toast, id }]);
133
- return id;
134
- }, []);
135
-
136
- const dismissToast = useCallback((id: string) => {
137
- setToasts((prev) => prev.filter((t) => t.id !== id));
138
- }, []);
139
-
140
- const clearToasts = useCallback(() => {
141
- setToasts([]);
142
- }, []);
143
-
144
- // Convenience methods
145
- const info = useCallback(
146
- (title: string, message?: string) => addToast({ type: 'info', title, message }),
147
- [addToast]
148
- );
149
-
150
- const success = useCallback(
151
- (title: string, message?: string) => addToast({ type: 'success', title, message }),
152
- [addToast]
153
- );
154
-
155
- const warning = useCallback(
156
- (title: string, message?: string) => addToast({ type: 'warning', title, message }),
157
- [addToast]
158
- );
159
-
160
- const error = useCallback(
161
- (title: string, message?: string) => addToast({ type: 'error', title, message }),
162
- [addToast]
163
- );
164
-
165
- const message = useCallback(
166
- (agentName: string, content: string, action?: Toast['action']) =>
167
- addToast({ type: 'message', title: 'New Message', message: content, agentName, action }),
168
- [addToast]
169
- );
170
-
171
- return {
172
- toasts,
173
- addToast,
174
- dismissToast,
175
- clearToasts,
176
- info,
177
- success,
178
- warning,
179
- error,
180
- message,
181
- };
182
- }
183
-
184
- // Helper function
185
- function getToastIcon(type: Toast['type']) {
186
- switch (type) {
187
- case 'success':
188
- return CheckIcon;
189
- case 'warning':
190
- return WarningIcon;
191
- case 'error':
192
- return ErrorIcon;
193
- case 'message':
194
- return MessageIcon;
195
- default:
196
- return InfoIcon;
197
- }
198
- }
199
-
200
- // Icon components
201
- function InfoIcon() {
202
- return (
203
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
204
- <circle cx="12" cy="12" r="10" />
205
- <line x1="12" y1="16" x2="12" y2="12" />
206
- <line x1="12" y1="8" x2="12.01" y2="8" />
207
- </svg>
208
- );
209
- }
210
-
211
- function CheckIcon() {
212
- return (
213
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
214
- <polyline points="20 6 9 17 4 12" />
215
- </svg>
216
- );
217
- }
218
-
219
- function WarningIcon() {
220
- return (
221
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
222
- <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
223
- <line x1="12" y1="9" x2="12" y2="13" />
224
- <line x1="12" y1="17" x2="12.01" y2="17" />
225
- </svg>
226
- );
227
- }
228
-
229
- function ErrorIcon() {
230
- return (
231
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
232
- <circle cx="12" cy="12" r="10" />
233
- <line x1="15" y1="9" x2="9" y2="15" />
234
- <line x1="9" y1="9" x2="15" y2="15" />
235
- </svg>
236
- );
237
- }
238
-
239
- function MessageIcon() {
240
- return (
241
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
242
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
243
- </svg>
244
- );
245
- }
246
-
247
- function CloseIcon() {
248
- return (
249
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
250
- <line x1="18" y1="6" x2="6" y2="18" />
251
- <line x1="6" y1="6" x2="18" y2="18" />
252
- </svg>
253
- );
254
- }
255
-
256
- /**
257
- * CSS styles for the notification toast
258
- */
259
- export const notificationToastStyles = `
260
- .toast-container {
261
- position: fixed;
262
- z-index: 1100;
263
- display: flex;
264
- flex-direction: column;
265
- gap: 8px;
266
- pointer-events: none;
267
- }
268
-
269
- .toast-top-right {
270
- top: 16px;
271
- right: 16px;
272
- }
273
-
274
- .toast-top-left {
275
- top: 16px;
276
- left: 16px;
277
- }
278
-
279
- .toast-bottom-right {
280
- bottom: 16px;
281
- right: 16px;
282
- }
283
-
284
- .toast-bottom-left {
285
- bottom: 16px;
286
- left: 16px;
287
- }
288
-
289
- .toast {
290
- display: flex;
291
- align-items: flex-start;
292
- gap: 12px;
293
- width: 360px;
294
- padding: 14px 16px;
295
- background: #ffffff;
296
- border-radius: 8px;
297
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
298
- pointer-events: auto;
299
- animation: toastEnter 0.2s ease;
300
- position: relative;
301
- overflow: hidden;
302
- }
303
-
304
- .toast-exit {
305
- animation: toastExit 0.2s ease forwards;
306
- }
307
-
308
- .toast-icon-wrapper {
309
- flex-shrink: 0;
310
- }
311
-
312
- .toast-icon {
313
- width: 32px;
314
- height: 32px;
315
- border-radius: 50%;
316
- display: flex;
317
- align-items: center;
318
- justify-content: center;
319
- }
320
-
321
- .toast-icon-info {
322
- background: #dbeafe;
323
- color: #2563eb;
324
- }
325
-
326
- .toast-icon-success {
327
- background: #dcfce7;
328
- color: #16a34a;
329
- }
330
-
331
- .toast-icon-warning {
332
- background: #fef3c7;
333
- color: #d97706;
334
- }
335
-
336
- .toast-icon-error {
337
- background: #fee2e2;
338
- color: #dc2626;
339
- }
340
-
341
- .toast-icon-message {
342
- background: #f3e8ff;
343
- color: #7c3aed;
344
- }
345
-
346
- .toast-agent-avatar {
347
- width: 32px;
348
- height: 32px;
349
- border-radius: 8px;
350
- display: flex;
351
- align-items: center;
352
- justify-content: center;
353
- font-size: 11px;
354
- font-weight: 600;
355
- }
356
-
357
- .toast-content {
358
- flex: 1;
359
- min-width: 0;
360
- }
361
-
362
- .toast-header {
363
- display: flex;
364
- align-items: center;
365
- gap: 8px;
366
- }
367
-
368
- .toast-title {
369
- font-size: 14px;
370
- font-weight: 600;
371
- color: #1a1a1a;
372
- }
373
-
374
- .toast-agent {
375
- font-size: 12px;
376
- color: #888;
377
- }
378
-
379
- .toast-message {
380
- margin: 4px 0 0;
381
- font-size: 13px;
382
- color: #555;
383
- line-height: 1.4;
384
- display: -webkit-box;
385
- -webkit-line-clamp: 2;
386
- -webkit-box-orient: vertical;
387
- overflow: hidden;
388
- }
389
-
390
- .toast-action {
391
- margin-top: 8px;
392
- padding: 6px 12px;
393
- background: #f5f5f5;
394
- border: none;
395
- border-radius: 4px;
396
- font-size: 12px;
397
- font-weight: 500;
398
- color: #333;
399
- cursor: pointer;
400
- font-family: inherit;
401
- transition: background 0.15s;
402
- }
403
-
404
- .toast-action:hover {
405
- background: #e8e8e8;
406
- }
407
-
408
- .toast-close {
409
- flex-shrink: 0;
410
- display: flex;
411
- align-items: center;
412
- justify-content: center;
413
- width: 24px;
414
- height: 24px;
415
- background: transparent;
416
- border: none;
417
- border-radius: 4px;
418
- color: #888;
419
- cursor: pointer;
420
- transition: all 0.15s;
421
- }
422
-
423
- .toast-close:hover {
424
- background: #f5f5f5;
425
- color: #333;
426
- }
427
-
428
- .toast-progress {
429
- position: absolute;
430
- bottom: 0;
431
- left: 0;
432
- height: 3px;
433
- background: currentColor;
434
- opacity: 0.3;
435
- animation: toastProgress linear forwards;
436
- }
437
-
438
- .toast-info .toast-progress {
439
- color: #2563eb;
440
- }
441
-
442
- .toast-success .toast-progress {
443
- color: #16a34a;
444
- }
445
-
446
- .toast-warning .toast-progress {
447
- color: #d97706;
448
- }
449
-
450
- .toast-error .toast-progress {
451
- color: #dc2626;
452
- }
453
-
454
- .toast-message .toast-progress {
455
- color: #7c3aed;
456
- }
457
-
458
- @keyframes toastEnter {
459
- from {
460
- opacity: 0;
461
- transform: translateX(100%);
462
- }
463
- to {
464
- opacity: 1;
465
- transform: translateX(0);
466
- }
467
- }
468
-
469
- @keyframes toastExit {
470
- from {
471
- opacity: 1;
472
- transform: translateX(0);
473
- }
474
- to {
475
- opacity: 0;
476
- transform: translateX(100%);
477
- }
478
- }
479
-
480
- @keyframes toastProgress {
481
- from {
482
- width: 100%;
483
- }
484
- to {
485
- width: 0%;
486
- }
487
- }
488
- `;
@@ -1,164 +0,0 @@
1
- /**
2
- * OnlineUsersIndicator Component
3
- *
4
- * Shows a row of avatars for online users with a count indicator.
5
- * Clicking reveals a dropdown list with all online users.
6
- */
7
-
8
- import React, { useState, useRef, useEffect } from 'react';
9
- import type { UserPresence } from './hooks/usePresence';
10
-
11
- export interface OnlineUsersIndicatorProps {
12
- /** List of online users */
13
- onlineUsers: UserPresence[];
14
- /** Callback when a user is clicked (for profile viewing) */
15
- onUserClick?: (user: UserPresence) => void;
16
- /** Maximum avatars to show before "+N" */
17
- maxAvatars?: number;
18
- }
19
-
20
- export function OnlineUsersIndicator({
21
- onlineUsers,
22
- onUserClick,
23
- maxAvatars = 4,
24
- }: OnlineUsersIndicatorProps) {
25
- const [isOpen, setIsOpen] = useState(false);
26
- const dropdownRef = useRef<HTMLDivElement>(null);
27
-
28
- // Close dropdown when clicking outside
29
- useEffect(() => {
30
- const handleClickOutside = (event: MouseEvent) => {
31
- if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
32
- setIsOpen(false);
33
- }
34
- };
35
-
36
- if (isOpen) {
37
- document.addEventListener('mousedown', handleClickOutside);
38
- }
39
- return () => document.removeEventListener('mousedown', handleClickOutside);
40
- }, [isOpen]);
41
-
42
- if (onlineUsers.length === 0) {
43
- return null;
44
- }
45
-
46
- const displayedUsers = onlineUsers.slice(0, maxAvatars);
47
- const remainingCount = Math.max(0, onlineUsers.length - maxAvatars);
48
-
49
- return (
50
- <div className="relative" ref={dropdownRef}>
51
- {/* Compact avatar row */}
52
- <button
53
- onClick={() => setIsOpen(!isOpen)}
54
- className="flex items-center gap-1.5 px-2 py-1 rounded-md hover:bg-white/[0.05] transition-colors"
55
- title={`${onlineUsers.length} user${onlineUsers.length !== 1 ? 's' : ''} online`}
56
- >
57
- {/* Green online indicator */}
58
- <div className="w-2 h-2 bg-green-500 rounded-full" />
59
-
60
- {/* Stacked avatars */}
61
- <div className="flex -space-x-1.5">
62
- {displayedUsers.map((user) => (
63
- <div
64
- key={user.username}
65
- className="relative ring-2 ring-[#1a1d21] rounded-full"
66
- title={user.username}
67
- >
68
- {user.avatarUrl ? (
69
- <img
70
- src={user.avatarUrl}
71
- alt={user.username}
72
- className="w-6 h-6 rounded-full object-cover"
73
- />
74
- ) : (
75
- <div className="w-6 h-6 rounded-full bg-[#a855f7] flex items-center justify-center text-[10px] text-white font-medium">
76
- {user.username.charAt(0).toUpperCase()}
77
- </div>
78
- )}
79
- </div>
80
- ))}
81
- {remainingCount > 0 && (
82
- <div className="w-6 h-6 rounded-full bg-[#3d4043] ring-2 ring-[#1a1d21] flex items-center justify-center text-[10px] text-[#d1d2d3] font-medium">
83
- +{remainingCount}
84
- </div>
85
- )}
86
- </div>
87
-
88
- {/* Count text */}
89
- <span className="text-xs text-[#8d8d8e]">
90
- {onlineUsers.length} online
91
- </span>
92
- </button>
93
-
94
- {/* Dropdown list */}
95
- {isOpen && (
96
- <div className="absolute right-0 top-full mt-1 w-64 bg-[#1a1d21] border border-white/10 rounded-lg shadow-xl z-50 max-h-[300px] overflow-y-auto">
97
- <div className="p-2 border-b border-white/10">
98
- <h3 className="text-sm font-medium text-[#d1d2d3]">Online Users</h3>
99
- </div>
100
- <div className="py-1">
101
- {onlineUsers.map((user) => (
102
- <button
103
- key={user.username}
104
- onClick={() => {
105
- onUserClick?.(user);
106
- setIsOpen(false);
107
- }}
108
- className="w-full flex items-center gap-3 px-3 py-2 hover:bg-white/[0.05] transition-colors text-left"
109
- >
110
- {/* Avatar with online indicator */}
111
- <div className="relative">
112
- {user.avatarUrl ? (
113
- <img
114
- src={user.avatarUrl}
115
- alt={user.username}
116
- className="w-8 h-8 rounded-full object-cover"
117
- />
118
- ) : (
119
- <div className="w-8 h-8 rounded-full bg-[#a855f7] flex items-center justify-center text-xs text-white font-medium">
120
- {user.username.charAt(0).toUpperCase()}
121
- </div>
122
- )}
123
- {/* Green online dot */}
124
- <div className="absolute -bottom-0.5 -right-0.5 w-3 h-3 bg-green-500 rounded-full border-2 border-[#1a1d21]" />
125
- </div>
126
-
127
- {/* User info */}
128
- <div className="flex-1 min-w-0">
129
- <div className="text-sm font-medium text-[#d1d2d3] truncate">
130
- {user.username}
131
- </div>
132
- <div className="text-xs text-[#8d8d8e]">
133
- Online since {formatTime(user.connectedAt)}
134
- </div>
135
- </div>
136
- </button>
137
- ))}
138
- </div>
139
- </div>
140
- )}
141
- </div>
142
- );
143
- }
144
-
145
- /**
146
- * Format a timestamp to a readable time
147
- */
148
- function formatTime(timestamp: string): string {
149
- const date = new Date(timestamp);
150
- const now = new Date();
151
-
152
- // If same day, show time only
153
- if (date.toDateString() === now.toDateString()) {
154
- return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
155
- }
156
-
157
- // Otherwise show date and time
158
- return date.toLocaleDateString([], {
159
- month: 'short',
160
- day: 'numeric',
161
- hour: '2-digit',
162
- minute: '2-digit',
163
- });
164
- }