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,549 +0,0 @@
1
- /**
2
- * RepoAccessPanel - GitHub Repository Access Management
3
- *
4
- * Shows repositories the user has GitHub access to with permission levels.
5
- * Allows creating workspaces to enable dashboard/chat access per repo.
6
- *
7
- * Uses:
8
- * - GET /api/repos/accessible - List repos user can access via GitHub OAuth
9
- * - POST /api/workspaces/quick - Create workspace for a repo
10
- */
11
-
12
- import React, { useState, useEffect, useCallback, useRef } from 'react';
13
- import Nango from '@nangohq/frontend';
14
-
15
- interface AccessibleRepo {
16
- id: number;
17
- fullName: string;
18
- isPrivate: boolean;
19
- defaultBranch: string;
20
- permissions: {
21
- admin: boolean;
22
- push: boolean;
23
- pull: boolean;
24
- };
25
- }
26
-
27
- interface Workspace {
28
- id: string;
29
- name: string;
30
- repositoryFullName?: string;
31
- status: 'provisioning' | 'running' | 'stopped' | 'error';
32
- }
33
-
34
- export interface RepoAccessPanelProps {
35
- /** Existing workspaces to show which repos have dashboard access */
36
- workspaces?: Workspace[];
37
- /** Callback when a workspace is created */
38
- onWorkspaceCreated?: (workspaceId: string, repoFullName: string) => void;
39
- /** Callback when user wants to open a workspace */
40
- onOpenWorkspace?: (workspaceId: string) => void;
41
- /** CSRF token for mutations */
42
- csrfToken?: string;
43
- /** Custom class name */
44
- className?: string;
45
- }
46
-
47
- type LoadingState = 'idle' | 'loading' | 'loaded' | 'error';
48
-
49
- function getPermissionLevel(permissions: { admin: boolean; push: boolean; pull: boolean }): {
50
- level: 'admin' | 'write' | 'read';
51
- label: string;
52
- color: string;
53
- } {
54
- if (permissions.admin) {
55
- return { level: 'admin', label: 'Admin', color: 'text-accent-purple bg-accent-purple/10 border-accent-purple/30' };
56
- }
57
- if (permissions.push) {
58
- return { level: 'write', label: 'Write', color: 'text-accent-cyan bg-accent-cyan/10 border-accent-cyan/30' };
59
- }
60
- return { level: 'read', label: 'Read', color: 'text-text-muted bg-bg-tertiary border-border-subtle' };
61
- }
62
-
63
- export function RepoAccessPanel({
64
- workspaces = [],
65
- onWorkspaceCreated,
66
- onOpenWorkspace,
67
- csrfToken,
68
- className = '',
69
- }: RepoAccessPanelProps) {
70
- const [repos, setRepos] = useState<AccessibleRepo[]>([]);
71
- const [loadingState, setLoadingState] = useState<LoadingState>('idle');
72
- const [error, setError] = useState<string | null>(null);
73
- const [isGitHubNotConnected, setIsGitHubNotConnected] = useState(false);
74
- const [creatingWorkspace, setCreatingWorkspace] = useState<string | null>(null);
75
- const [searchQuery, setSearchQuery] = useState('');
76
- const [filterType, setFilterType] = useState<'all' | 'with-workspace' | 'without-workspace'>('all');
77
-
78
- // GitHub OAuth state
79
- const nangoRef = useRef<InstanceType<typeof Nango> | null>(null);
80
- const [isNangoReady, setIsNangoReady] = useState(false);
81
- const [isConnecting, setIsConnecting] = useState(false);
82
- const [connectError, setConnectError] = useState<string | null>(null);
83
-
84
- // Create a map of repo full names to workspace IDs for quick lookup
85
- const repoToWorkspace = new Map<string, Workspace>();
86
- workspaces.forEach(ws => {
87
- if (ws.repositoryFullName) {
88
- repoToWorkspace.set(ws.repositoryFullName, ws);
89
- }
90
- });
91
-
92
- // Fetch accessible repos
93
- const fetchRepos = useCallback(async () => {
94
- setLoadingState('loading');
95
- setError(null);
96
- setIsGitHubNotConnected(false);
97
-
98
- try {
99
- const response = await fetch('/api/repos/accessible?perPage=100', {
100
- credentials: 'include',
101
- });
102
-
103
- if (!response.ok) {
104
- const data = await response.json();
105
- if (data.code === 'NANGO_NOT_CONNECTED') {
106
- setIsGitHubNotConnected(true);
107
- throw new Error('GitHub not connected. Connect your GitHub account to see your repositories.');
108
- }
109
- throw new Error(data.error || 'Failed to fetch repositories');
110
- }
111
-
112
- const data = await response.json();
113
- setRepos(data.repositories || []);
114
- setLoadingState('loaded');
115
- } catch (err) {
116
- console.error('Error fetching accessible repos:', err);
117
- setError(err instanceof Error ? err.message : 'Failed to load repositories');
118
- setLoadingState('error');
119
- }
120
- }, []);
121
-
122
- useEffect(() => {
123
- fetchRepos();
124
- }, [fetchRepos]);
125
-
126
- // Initialize Nango when GitHub is not connected
127
- useEffect(() => {
128
- if (!isGitHubNotConnected) return;
129
-
130
- let mounted = true;
131
-
132
- const initNango = async () => {
133
- try {
134
- // Get Nango session token for GitHub login
135
- const response = await fetch('/api/auth/nango/login-session', {
136
- credentials: 'include',
137
- });
138
- const data = await response.json();
139
-
140
- if (!mounted) return;
141
-
142
- if (response.ok && data.sessionToken) {
143
- nangoRef.current = new Nango({ connectSessionToken: data.sessionToken });
144
- setIsNangoReady(true);
145
- }
146
- } catch (err) {
147
- console.error('Failed to initialize Nango:', err);
148
- }
149
- };
150
-
151
- initNango();
152
- return () => { mounted = false; };
153
- }, [isGitHubNotConnected]);
154
-
155
- // Handle GitHub OAuth connection
156
- const handleConnectGitHub = async () => {
157
- if (!nangoRef.current) {
158
- setConnectError('GitHub connection not available. Please refresh the page.');
159
- return;
160
- }
161
-
162
- setIsConnecting(true);
163
- setConnectError(null);
164
-
165
- try {
166
- const result = await nangoRef.current.auth('github');
167
- if (result && 'connectionId' in result) {
168
- // Poll for auth completion
169
- const pollForAuth = async (attempts = 0): Promise<void> => {
170
- if (attempts > 30) {
171
- throw new Error('Authentication timed out. Please try again.');
172
- }
173
-
174
- const statusRes = await fetch(`/api/auth/nango/login-status/${result.connectionId}`, {
175
- credentials: 'include',
176
- });
177
- const statusData = await statusRes.json();
178
-
179
- if (statusData.ready) {
180
- // Auth complete, refresh repos
181
- setIsConnecting(false);
182
- setIsGitHubNotConnected(false);
183
- fetchRepos();
184
- return;
185
- }
186
-
187
- await new Promise(resolve => setTimeout(resolve, 1000));
188
- return pollForAuth(attempts + 1);
189
- };
190
-
191
- await pollForAuth();
192
- } else {
193
- throw new Error('No connection ID returned');
194
- }
195
- } catch (err: unknown) {
196
- const error = err as Error & { type?: string };
197
- console.error('GitHub auth error:', error);
198
-
199
- // Don't show error for user-cancelled auth
200
- if (error.type === 'user_cancelled' || error.message?.includes('closed')) {
201
- setIsConnecting(false);
202
- // Re-initialize Nango for next attempt
203
- fetch('/api/auth/nango/login-session', { credentials: 'include' })
204
- .then(res => res.json())
205
- .then(data => {
206
- if (data.sessionToken) {
207
- nangoRef.current = new Nango({ connectSessionToken: data.sessionToken });
208
- }
209
- });
210
- return;
211
- }
212
-
213
- setConnectError(error.message || 'Failed to connect GitHub');
214
- setIsConnecting(false);
215
- }
216
- };
217
-
218
- // Create workspace for a repo
219
- const handleCreateWorkspace = useCallback(async (repoFullName: string) => {
220
- setCreatingWorkspace(repoFullName);
221
- setError(null);
222
-
223
- try {
224
- const headers: Record<string, string> = { 'Content-Type': 'application/json' };
225
- if (csrfToken) {
226
- headers['X-CSRF-Token'] = csrfToken;
227
- }
228
-
229
- const response = await fetch('/api/workspaces/quick', {
230
- method: 'POST',
231
- credentials: 'include',
232
- headers,
233
- body: JSON.stringify({ repositoryFullName: repoFullName }),
234
- });
235
-
236
- const data = await response.json();
237
-
238
- if (!response.ok) {
239
- throw new Error(data.error || 'Failed to create workspace');
240
- }
241
-
242
- onWorkspaceCreated?.(data.workspaceId, repoFullName);
243
- } catch (err) {
244
- console.error('Error creating workspace:', err);
245
- setError(err instanceof Error ? err.message : 'Failed to create workspace');
246
- } finally {
247
- setCreatingWorkspace(null);
248
- }
249
- }, [csrfToken, onWorkspaceCreated]);
250
-
251
- // Filter repos based on search and filter type
252
- const filteredRepos = repos.filter(repo => {
253
- // Search filter
254
- if (searchQuery && !repo.fullName.toLowerCase().includes(searchQuery.toLowerCase())) {
255
- return false;
256
- }
257
-
258
- // Workspace filter
259
- const hasWorkspace = repoToWorkspace.has(repo.fullName);
260
- if (filterType === 'with-workspace' && !hasWorkspace) return false;
261
- if (filterType === 'without-workspace' && hasWorkspace) return false;
262
-
263
- return true;
264
- });
265
-
266
- // Loading state
267
- if (loadingState === 'loading') {
268
- return (
269
- <div className={`flex items-center justify-center py-12 ${className}`}>
270
- <div className="text-center">
271
- <svg className="w-8 h-8 text-accent-cyan animate-spin mx-auto" fill="none" viewBox="0 0 24 24">
272
- <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
273
- <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
274
- </svg>
275
- <p className="mt-4 text-text-muted">Loading repositories...</p>
276
- </div>
277
- </div>
278
- );
279
- }
280
-
281
- // Error state - special handling for GitHub not connected
282
- if (loadingState === 'error') {
283
- if (isGitHubNotConnected) {
284
- return (
285
- <div className={`p-6 ${className}`}>
286
- <div className="bg-bg-tertiary border border-border-subtle rounded-xl p-8 text-center">
287
- <div className="w-16 h-16 mx-auto mb-4 bg-bg-hover rounded-full flex items-center justify-center">
288
- <GitHubIcon className="w-8 h-8 text-text-muted" />
289
- </div>
290
- <h3 className="text-lg font-semibold text-text-primary mb-2">Connect GitHub</h3>
291
- <p className="text-text-muted mb-6 max-w-md mx-auto">
292
- Connect your GitHub account to see your repositories and enable agent access to your code.
293
- </p>
294
- {connectError && (
295
- <p className="text-error text-sm mb-4">{connectError}</p>
296
- )}
297
- <button
298
- onClick={handleConnectGitHub}
299
- disabled={!isNangoReady || isConnecting}
300
- className="px-6 py-3 bg-gradient-to-r from-accent-cyan to-[#00b8d9] text-bg-deep font-medium rounded-lg hover:shadow-glow-cyan transition-all disabled:opacity-50 disabled:cursor-not-allowed"
301
- >
302
- {isConnecting ? (
303
- <span className="flex items-center gap-2">
304
- <svg className="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24">
305
- <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
306
- <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
307
- </svg>
308
- Connecting...
309
- </span>
310
- ) : !isNangoReady ? (
311
- <span className="flex items-center gap-2">
312
- <svg className="w-5 h-5 animate-spin" fill="none" viewBox="0 0 24 24">
313
- <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
314
- <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
315
- </svg>
316
- Loading...
317
- </span>
318
- ) : (
319
- <span className="flex items-center gap-2">
320
- <GitHubIcon className="w-5 h-5" />
321
- Connect GitHub Account
322
- </span>
323
- )}
324
- </button>
325
- </div>
326
- </div>
327
- );
328
- }
329
-
330
- return (
331
- <div className={`p-6 ${className}`}>
332
- <div className="bg-error/10 border border-error/20 rounded-xl p-4 text-center">
333
- <div className="w-12 h-12 mx-auto mb-3 bg-error/20 rounded-full flex items-center justify-center">
334
- <svg className="w-6 h-6 text-error" fill="none" viewBox="0 0 24 24" stroke="currentColor">
335
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
336
- </svg>
337
- </div>
338
- <p className="text-error mb-4">{error}</p>
339
- <button
340
- onClick={fetchRepos}
341
- className="px-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-text-primary hover:bg-bg-hover transition-colors"
342
- >
343
- Try Again
344
- </button>
345
- </div>
346
- </div>
347
- );
348
- }
349
-
350
- return (
351
- <div className={className}>
352
- {/* Header */}
353
- <div className="p-4 border-b border-border-subtle">
354
- <h2 className="text-lg font-semibold text-text-primary mb-1">Repository Access</h2>
355
- <p className="text-sm text-text-muted">
356
- Repositories you have access to on GitHub. Create workspaces to enable dashboard and chat access.
357
- </p>
358
- </div>
359
-
360
- {/* Error banner */}
361
- {error && (
362
- <div className="mx-4 mt-4 p-3 bg-error/10 border border-error/20 rounded-lg">
363
- <p className="text-error text-sm">{error}</p>
364
- </div>
365
- )}
366
-
367
- {/* Search and filters */}
368
- <div className="p-4 border-b border-border-subtle">
369
- <div className="flex flex-col sm:flex-row gap-3">
370
- {/* Search */}
371
- <div className="flex-1 relative">
372
- <SearchIcon className="absolute left-3 top-1/2 -translate-y-1/2 text-text-muted" />
373
- <input
374
- type="text"
375
- placeholder="Search repositories..."
376
- value={searchQuery}
377
- onChange={(e) => setSearchQuery(e.target.value)}
378
- className="w-full pl-10 pr-4 py-2 bg-bg-tertiary border border-border-subtle rounded-lg text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent-cyan/50 transition-colors"
379
- />
380
- </div>
381
-
382
- {/* Filter */}
383
- <div className="flex gap-2">
384
- <button
385
- onClick={() => setFilterType('all')}
386
- className={`px-3 py-2 text-sm rounded-lg border transition-colors ${
387
- filterType === 'all'
388
- ? 'bg-accent-cyan/10 border-accent-cyan/30 text-accent-cyan'
389
- : 'bg-bg-tertiary border-border-subtle text-text-muted hover:text-text-primary'
390
- }`}
391
- >
392
- All ({repos.length})
393
- </button>
394
- <button
395
- onClick={() => setFilterType('with-workspace')}
396
- className={`px-3 py-2 text-sm rounded-lg border transition-colors ${
397
- filterType === 'with-workspace'
398
- ? 'bg-success/10 border-success/30 text-success'
399
- : 'bg-bg-tertiary border-border-subtle text-text-muted hover:text-text-primary'
400
- }`}
401
- >
402
- With Access
403
- </button>
404
- <button
405
- onClick={() => setFilterType('without-workspace')}
406
- className={`px-3 py-2 text-sm rounded-lg border transition-colors ${
407
- filterType === 'without-workspace'
408
- ? 'bg-warning/10 border-warning/30 text-warning'
409
- : 'bg-bg-tertiary border-border-subtle text-text-muted hover:text-text-primary'
410
- }`}
411
- >
412
- No Access
413
- </button>
414
- </div>
415
- </div>
416
- </div>
417
-
418
- {/* Repo list */}
419
- <div className="max-h-[500px] overflow-y-auto">
420
- {filteredRepos.length === 0 ? (
421
- <div className="py-12 text-center text-text-muted">
422
- {searchQuery ? (
423
- <p>No repositories match "{searchQuery}"</p>
424
- ) : filterType !== 'all' ? (
425
- <p>No repositories in this category</p>
426
- ) : (
427
- <p>No repositories found. Connect your GitHub account to see your repos.</p>
428
- )}
429
- </div>
430
- ) : (
431
- <div className="divide-y divide-border-subtle">
432
- {filteredRepos.map((repo) => {
433
- const permission = getPermissionLevel(repo.permissions);
434
- const workspace = repoToWorkspace.get(repo.fullName);
435
- const isCreating = creatingWorkspace === repo.fullName;
436
-
437
- return (
438
- <div
439
- key={repo.id}
440
- className="flex items-center gap-4 p-4 hover:bg-bg-hover/50 transition-colors"
441
- >
442
- {/* Repo icon */}
443
- <div className="w-10 h-10 rounded-lg bg-bg-tertiary border border-border-subtle flex items-center justify-center flex-shrink-0">
444
- <RepoIcon className="text-text-muted" />
445
- </div>
446
-
447
- {/* Repo info */}
448
- <div className="flex-1 min-w-0">
449
- <div className="flex items-center gap-2 mb-0.5">
450
- <p className="font-medium text-text-primary truncate">{repo.fullName}</p>
451
- {repo.isPrivate && (
452
- <span className="px-1.5 py-0.5 text-xs bg-bg-tertiary border border-border-subtle rounded text-text-muted">
453
- Private
454
- </span>
455
- )}
456
- </div>
457
- <div className="flex items-center gap-2">
458
- <span className={`px-2 py-0.5 text-xs rounded-full border ${permission.color}`}>
459
- {permission.label}
460
- </span>
461
- <span className="text-xs text-text-muted">{repo.defaultBranch}</span>
462
- </div>
463
- </div>
464
-
465
- {/* Action button */}
466
- <div className="flex-shrink-0">
467
- {workspace ? (
468
- <button
469
- onClick={() => onOpenWorkspace?.(workspace.id)}
470
- className={`px-4 py-2 text-sm rounded-lg border transition-colors ${
471
- workspace.status === 'running'
472
- ? 'bg-success/10 border-success/30 text-success hover:bg-success/20'
473
- : workspace.status === 'provisioning'
474
- ? 'bg-accent-cyan/10 border-accent-cyan/30 text-accent-cyan'
475
- : 'bg-bg-tertiary border-border-subtle text-text-muted hover:bg-bg-hover'
476
- }`}
477
- >
478
- {workspace.status === 'running' ? 'Open Dashboard' :
479
- workspace.status === 'provisioning' ? 'Starting...' :
480
- workspace.status === 'stopped' ? 'Start' : 'View'}
481
- </button>
482
- ) : (
483
- <button
484
- onClick={() => handleCreateWorkspace(repo.fullName)}
485
- disabled={isCreating}
486
- className="px-4 py-2 text-sm bg-gradient-to-r from-accent-cyan to-[#00b8d9] text-bg-deep font-medium rounded-lg hover:shadow-glow-cyan transition-all disabled:opacity-50 disabled:cursor-not-allowed"
487
- >
488
- {isCreating ? (
489
- <span className="flex items-center gap-2">
490
- <svg className="w-4 h-4 animate-spin" fill="none" viewBox="0 0 24 24">
491
- <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
492
- <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
493
- </svg>
494
- Creating...
495
- </span>
496
- ) : (
497
- 'Enable Access'
498
- )}
499
- </button>
500
- )}
501
- </div>
502
- </div>
503
- );
504
- })}
505
- </div>
506
- )}
507
- </div>
508
-
509
- {/* Footer */}
510
- <div className="p-4 border-t border-border-subtle bg-bg-tertiary/50">
511
- <p className="text-xs text-text-muted text-center">
512
- Showing {filteredRepos.length} of {repos.length} repositories you have GitHub access to.
513
- <button
514
- onClick={fetchRepos}
515
- className="ml-2 text-accent-cyan hover:underline"
516
- >
517
- Refresh
518
- </button>
519
- </p>
520
- </div>
521
- </div>
522
- );
523
- }
524
-
525
- // Icons
526
- function SearchIcon({ className = '' }: { className?: string }) {
527
- return (
528
- <svg className={className} width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
529
- <circle cx="11" cy="11" r="8" />
530
- <line x1="21" y1="21" x2="16.65" y2="16.65" />
531
- </svg>
532
- );
533
- }
534
-
535
- function RepoIcon({ className = '' }: { className?: string }) {
536
- return (
537
- <svg className={className} width="18" height="18" viewBox="0 0 16 16" fill="currentColor">
538
- <path d="M2 2.5A2.5 2.5 0 014.5 0h8.75a.75.75 0 01.75.75v12.5a.75.75 0 01-.75.75h-2.5a.75.75 0 110-1.5h1.75v-2h-8a1 1 0 00-.714 1.7.75.75 0 01-1.072 1.05A2.495 2.495 0 012 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 011-1h8z" />
539
- </svg>
540
- );
541
- }
542
-
543
- function GitHubIcon({ className = '' }: { className?: string }) {
544
- return (
545
- <svg className={className} viewBox="0 0 24 24" fill="currentColor">
546
- <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
547
- </svg>
548
- );
549
- }