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,877 +0,0 @@
1
- /**
2
- * Cloud API Client
3
- *
4
- * Handles authenticated requests to the Agent Relay Cloud API.
5
- * Includes automatic session expiration detection and handling.
6
- */
7
-
8
- import { setCsrfToken as setApiCsrfToken } from './api';
9
-
10
- // Session error codes from the backend
11
- export type SessionErrorCode = 'SESSION_EXPIRED' | 'USER_NOT_FOUND' | 'SESSION_ERROR';
12
-
13
- export interface SessionError {
14
- error: string;
15
- code: SessionErrorCode;
16
- message: string;
17
- }
18
-
19
- export interface SessionStatus {
20
- authenticated: boolean;
21
- code?: SessionErrorCode;
22
- message?: string;
23
- user?: {
24
- id: string;
25
- githubUsername: string;
26
- email?: string;
27
- avatarUrl?: string;
28
- plan: string;
29
- };
30
- }
31
-
32
- export interface CloudUser {
33
- id: string;
34
- githubUsername: string;
35
- email?: string;
36
- avatarUrl?: string;
37
- plan: string;
38
- connectedProviders: Array<{
39
- provider: string;
40
- email?: string;
41
- connectedAt: string;
42
- }>;
43
- pendingInvites: number;
44
- onboardingCompleted: boolean;
45
- displayName?: string;
46
- }
47
-
48
- export type SessionExpiredCallback = (error: SessionError) => void;
49
-
50
- // Global session expiration listeners
51
- const sessionExpiredListeners = new Set<SessionExpiredCallback>();
52
-
53
- // Global CSRF token storage
54
- let csrfToken: string | null = null;
55
-
56
- /**
57
- * Get the current CSRF token
58
- */
59
- export function getCsrfToken(): string | null {
60
- return csrfToken;
61
- }
62
-
63
- /**
64
- * Capture CSRF token from response headers
65
- * Also syncs with the api.ts library for dashboard requests
66
- */
67
- function captureCsrfToken(response: Response): void {
68
- const token = response.headers.get('X-CSRF-Token');
69
- if (token) {
70
- csrfToken = token;
71
- // Sync with api.ts for dashboard-to-workspace requests
72
- setApiCsrfToken(token);
73
- }
74
- }
75
-
76
- /**
77
- * Register a callback for when session expires
78
- */
79
- export function onSessionExpired(callback: SessionExpiredCallback): () => void {
80
- sessionExpiredListeners.add(callback);
81
- return () => sessionExpiredListeners.delete(callback);
82
- }
83
-
84
- /**
85
- * Notify all listeners that session has expired
86
- */
87
- function notifySessionExpired(error: SessionError): void {
88
- for (const listener of sessionExpiredListeners) {
89
- try {
90
- listener(error);
91
- } catch (e) {
92
- console.error('[cloudApi] Session expired listener error:', e);
93
- }
94
- }
95
- }
96
-
97
- /**
98
- * Check if response indicates session expiration
99
- */
100
- function isSessionError(response: Response, data: unknown): data is SessionError {
101
- if (response.status === 401) {
102
- return true;
103
- }
104
- if (typeof data === 'object' && data !== null) {
105
- const obj = data as Record<string, unknown>;
106
- return obj.code === 'SESSION_EXPIRED' || obj.code === 'USER_NOT_FOUND';
107
- }
108
- return false;
109
- }
110
-
111
- /**
112
- * Make an authenticated request to the cloud API
113
- */
114
- async function cloudFetch<T>(
115
- endpoint: string,
116
- options: RequestInit = {}
117
- ): Promise<{ success: true; data: T } | { success: false; error: string; sessionExpired?: boolean }> {
118
- try {
119
- // Build headers, including CSRF token for non-GET requests
120
- const headers: Record<string, string> = {
121
- 'Content-Type': 'application/json',
122
- ...(options.headers as Record<string, string>),
123
- };
124
-
125
- // Include CSRF token for state-changing requests
126
- if (options.method && options.method !== 'GET' && csrfToken) {
127
- headers['X-CSRF-Token'] = csrfToken;
128
- }
129
-
130
- const response = await fetch(endpoint, {
131
- ...options,
132
- credentials: 'include', // Include cookies for session
133
- headers,
134
- });
135
-
136
- // Capture CSRF token from response
137
- captureCsrfToken(response);
138
-
139
- const data = await response.json();
140
-
141
- if (isSessionError(response, data)) {
142
- const error: SessionError = {
143
- error: (data as SessionError).error || 'Session expired',
144
- code: (data as SessionError).code || 'SESSION_EXPIRED',
145
- message: (data as SessionError).message || 'Your session has expired. Please log in again.',
146
- };
147
- notifySessionExpired(error);
148
- return { success: false, error: error.message, sessionExpired: true };
149
- }
150
-
151
- if (!response.ok) {
152
- return {
153
- success: false,
154
- error: (data as { error?: string }).error || `Request failed with status ${response.status}`
155
- };
156
- }
157
-
158
- return { success: true, data: data as T };
159
- } catch (error) {
160
- return {
161
- success: false,
162
- error: error instanceof Error ? error.message : 'Network error'
163
- };
164
- }
165
- }
166
-
167
- /**
168
- * Cloud API methods
169
- */
170
- // ===== Nango Auth Types =====
171
-
172
- export interface NangoLoginSession {
173
- sessionToken: string;
174
- tempUserId: string;
175
- }
176
-
177
- export interface NangoLoginStatus {
178
- ready: boolean;
179
- user?: {
180
- id: string;
181
- githubUsername: string;
182
- email?: string;
183
- avatarUrl?: string;
184
- plan: string;
185
- };
186
- }
187
-
188
- export interface NangoRepoSession {
189
- sessionToken: string;
190
- }
191
-
192
- export interface NangoRepoStatus {
193
- ready: boolean;
194
- pendingApproval?: boolean;
195
- message?: string;
196
- repos?: Array<{
197
- id: string;
198
- fullName: string;
199
- isPrivate: boolean;
200
- defaultBranch: string;
201
- }>;
202
- }
203
-
204
- export const cloudApi = {
205
- // ===== Nango Auth =====
206
-
207
- /**
208
- * Get a Nango connect session for GitHub login
209
- */
210
- async getNangoLoginSession(): Promise<{ success: true; data: NangoLoginSession } | { success: false; error: string }> {
211
- try {
212
- const response = await fetch('/api/auth/nango/login-session', {
213
- credentials: 'include',
214
- });
215
- // Capture CSRF token from response
216
- captureCsrfToken(response);
217
- const data = await response.json();
218
- if (!response.ok) {
219
- return { success: false, error: data.error || 'Failed to create login session' };
220
- }
221
- return { success: true, data: data as NangoLoginSession };
222
- } catch (error) {
223
- return { success: false, error: error instanceof Error ? error.message : 'Network error' };
224
- }
225
- },
226
-
227
- /**
228
- * Poll for login completion after Nango connect UI
229
- */
230
- async checkNangoLoginStatus(connectionId: string): Promise<{ success: true; data: NangoLoginStatus } | { success: false; error: string }> {
231
- try {
232
- const response = await fetch(`/api/auth/nango/login-status/${encodeURIComponent(connectionId)}`, {
233
- credentials: 'include',
234
- });
235
- // Capture CSRF token from response
236
- captureCsrfToken(response);
237
- const data = await response.json();
238
- if (!response.ok) {
239
- return { success: false, error: data.error || 'Failed to check login status' };
240
- }
241
- return { success: true, data: data as NangoLoginStatus };
242
- } catch (error) {
243
- return { success: false, error: error instanceof Error ? error.message : 'Network error' };
244
- }
245
- },
246
-
247
- /**
248
- * Get a Nango connect session for GitHub App OAuth (repo access)
249
- */
250
- async getNangoRepoSession(): Promise<{ success: true; data: NangoRepoSession } | { success: false; error: string; sessionExpired?: boolean }> {
251
- return cloudFetch<NangoRepoSession>('/api/auth/nango/repo-session');
252
- },
253
-
254
- /**
255
- * Poll for repo sync completion after GitHub App OAuth
256
- */
257
- async checkNangoRepoStatus(connectionId: string): Promise<{ success: true; data: NangoRepoStatus } | { success: false; error: string; sessionExpired?: boolean }> {
258
- return cloudFetch<NangoRepoStatus>(`/api/auth/nango/repo-status/${encodeURIComponent(connectionId)}`);
259
- },
260
-
261
- /**
262
- * Check current session status
263
- */
264
- async checkSession(): Promise<SessionStatus> {
265
- try {
266
- const response = await fetch('/api/auth/session', {
267
- credentials: 'include',
268
- });
269
- // Capture CSRF token from response
270
- captureCsrfToken(response);
271
- const data = await response.json();
272
- return data as SessionStatus;
273
- } catch {
274
- return {
275
- authenticated: false,
276
- code: 'SESSION_ERROR',
277
- message: 'Failed to check session status',
278
- };
279
- }
280
- },
281
-
282
- /**
283
- * Get current user profile
284
- */
285
- async getMe() {
286
- return cloudFetch<CloudUser>('/api/auth/me');
287
- },
288
-
289
- /**
290
- * Logout current user
291
- */
292
- async logout(): Promise<{ success: boolean; error?: string }> {
293
- try {
294
- const headers: Record<string, string> = {};
295
- if (csrfToken) {
296
- headers['X-CSRF-Token'] = csrfToken;
297
- }
298
- const response = await fetch('/api/auth/logout', {
299
- method: 'POST',
300
- credentials: 'include',
301
- headers,
302
- });
303
- const data = await response.json();
304
- return data as { success: boolean; error?: string };
305
- } catch {
306
- return { success: false, error: 'Network error' };
307
- }
308
- },
309
-
310
- // ===== Workspace API =====
311
-
312
- /**
313
- * Get user's workspaces
314
- */
315
- async getWorkspaces() {
316
- return cloudFetch<{ workspaces: Array<{
317
- id: string;
318
- name: string;
319
- slug: string;
320
- repositories: number;
321
- members: number;
322
- plan: string;
323
- }> }>('/api/workspaces');
324
- },
325
-
326
- /**
327
- * Get workspace by ID
328
- */
329
- async getWorkspace(id: string) {
330
- return cloudFetch<{
331
- id: string;
332
- name: string;
333
- slug: string;
334
- config: Record<string, unknown>;
335
- createdAt: string;
336
- }>(`/api/workspaces/${encodeURIComponent(id)}`);
337
- },
338
-
339
- /**
340
- * Create workspace
341
- */
342
- async createWorkspace(data: { name: string; slug?: string }) {
343
- return cloudFetch<{ id: string; name: string; slug: string }>('/api/workspaces', {
344
- method: 'POST',
345
- body: JSON.stringify(data),
346
- });
347
- },
348
-
349
- /**
350
- * Get primary workspace with live status
351
- */
352
- async getPrimaryWorkspace() {
353
- return cloudFetch<{
354
- exists: boolean;
355
- message?: string;
356
- workspace?: {
357
- id: string;
358
- name: string;
359
- status: string;
360
- publicUrl?: string;
361
- isStopped: boolean;
362
- isRunning: boolean;
363
- isProvisioning: boolean;
364
- hasError: boolean;
365
- config: {
366
- providers: string[];
367
- repositories: string[];
368
- };
369
- };
370
- statusMessage: string;
371
- actionNeeded?: 'wakeup' | 'check_error' | null;
372
- }>('/api/workspaces/primary');
373
- },
374
-
375
- /**
376
- * Get workspace summary (all workspaces with status)
377
- */
378
- async getWorkspaceSummary() {
379
- return cloudFetch<{
380
- workspaces: Array<{
381
- id: string;
382
- name: string;
383
- status: string;
384
- publicUrl?: string;
385
- isStopped: boolean;
386
- isRunning: boolean;
387
- isProvisioning: boolean;
388
- hasError: boolean;
389
- }>;
390
- summary: {
391
- total: number;
392
- running: number;
393
- stopped: number;
394
- provisioning: number;
395
- error: number;
396
- };
397
- overallStatus: 'ready' | 'provisioning' | 'stopped' | 'none' | 'error';
398
- }>('/api/workspaces/summary');
399
- },
400
-
401
- /**
402
- * Get all accessible workspaces (owned + member + contributor via GitHub repos)
403
- * This is the preferred method for the workspace selector dropdown
404
- */
405
- async getAccessibleWorkspaces() {
406
- return cloudFetch<{
407
- workspaces: Array<{
408
- id: string;
409
- name: string;
410
- status: string;
411
- publicUrl?: string;
412
- providers?: string[];
413
- repositories?: string[];
414
- accessType: 'owner' | 'member' | 'contributor';
415
- permission: 'admin' | 'write' | 'read';
416
- createdAt: string;
417
- }>;
418
- summary: {
419
- owned: number;
420
- member: number;
421
- contributor: number;
422
- total: number;
423
- };
424
- }>('/api/workspaces/accessible');
425
- },
426
-
427
- /**
428
- * Get workspace status (live polling from compute provider)
429
- */
430
- async getWorkspaceStatus(id: string) {
431
- return cloudFetch<{ status: string }>(`/api/workspaces/${encodeURIComponent(id)}/status`);
432
- },
433
-
434
- /**
435
- * Wake up a stopped workspace
436
- */
437
- async wakeupWorkspace(id: string) {
438
- return cloudFetch<{
439
- status: string;
440
- wasRestarted: boolean;
441
- message: string;
442
- estimatedStartTime?: number;
443
- publicUrl?: string;
444
- }>(`/api/workspaces/${encodeURIComponent(id)}/wakeup`, {
445
- method: 'POST',
446
- });
447
- },
448
-
449
- /**
450
- * Restart a workspace
451
- */
452
- async restartWorkspace(id: string) {
453
- return cloudFetch<{ success: boolean; message: string }>(
454
- `/api/workspaces/${encodeURIComponent(id)}/restart`,
455
- { method: 'POST' }
456
- );
457
- },
458
-
459
- // ===== Provider API =====
460
-
461
- /**
462
- * Get connected providers for a workspace
463
- * @param workspaceId - Workspace to get providers for
464
- */
465
- async getProviders(workspaceId: string) {
466
- return cloudFetch<{ providers: Array<{
467
- id: string;
468
- name: string;
469
- displayName: string;
470
- description: string;
471
- color: string;
472
- authStrategy: string;
473
- cliCommand?: string;
474
- isConnected: boolean;
475
- connectedAs?: string;
476
- connectedAt?: string;
477
- }> }>(`/api/providers?workspaceId=${encodeURIComponent(workspaceId)}`);
478
- },
479
-
480
- /**
481
- * Disconnect a provider from a workspace
482
- * @param provider - Provider ID to disconnect
483
- * @param workspaceId - Workspace to disconnect from
484
- */
485
- async disconnectProvider(provider: string, workspaceId: string) {
486
- return cloudFetch<{ success: boolean }>(`/api/providers/${encodeURIComponent(provider)}?workspaceId=${encodeURIComponent(workspaceId)}`, {
487
- method: 'DELETE',
488
- });
489
- },
490
-
491
- // ===== Team API =====
492
-
493
- /**
494
- * Get workspace members
495
- */
496
- async getWorkspaceMembers(workspaceId: string) {
497
- return cloudFetch<{ members: Array<{
498
- id: string;
499
- userId: string;
500
- role: string;
501
- isPending: boolean;
502
- user?: {
503
- githubUsername: string;
504
- email?: string;
505
- avatarUrl?: string;
506
- };
507
- }> }>(`/api/workspaces/${encodeURIComponent(workspaceId)}/members`);
508
- },
509
-
510
- /**
511
- * Get repo collaborators (users with GitHub access who aren't workspace members)
512
- */
513
- async getRepoCollaborators(workspaceId: string) {
514
- return cloudFetch<{
515
- collaborators: Array<{
516
- id: number;
517
- login: string;
518
- avatarUrl: string;
519
- permission: 'admin' | 'write' | 'read' | 'none';
520
- repos: string[];
521
- }>;
522
- totalRepos: number;
523
- message?: string;
524
- }>(`/api/workspaces/${encodeURIComponent(workspaceId)}/repo-collaborators`);
525
- },
526
-
527
- /**
528
- * Invite user to workspace
529
- */
530
- async inviteMember(workspaceId: string, githubUsername: string, role = 'member') {
531
- return cloudFetch<{ success: boolean; member: unknown }>(
532
- `/api/workspaces/${encodeURIComponent(workspaceId)}/members`,
533
- {
534
- method: 'POST',
535
- body: JSON.stringify({ githubUsername, role }),
536
- }
537
- );
538
- },
539
-
540
- /**
541
- * Get pending invites for current user
542
- */
543
- async getPendingInvites() {
544
- return cloudFetch<{ invites: Array<{
545
- id: string;
546
- workspaceId: string;
547
- workspaceName: string;
548
- role: string;
549
- invitedAt: string;
550
- invitedBy: string;
551
- }> }>('/api/invites');
552
- },
553
-
554
- /**
555
- * Accept workspace invite
556
- */
557
- async acceptInvite(inviteId: string) {
558
- return cloudFetch<{ success: boolean; workspaceId: string }>(
559
- `/api/invites/${encodeURIComponent(inviteId)}/accept`,
560
- { method: 'POST' }
561
- );
562
- },
563
-
564
- /**
565
- * Decline workspace invite
566
- */
567
- async declineInvite(inviteId: string) {
568
- return cloudFetch<{ success: boolean }>(
569
- `/api/invites/${encodeURIComponent(inviteId)}/decline`,
570
- { method: 'POST' }
571
- );
572
- },
573
-
574
- /**
575
- * Update member role
576
- */
577
- async updateMemberRole(workspaceId: string, memberId: string, role: string) {
578
- return cloudFetch<{ success: boolean; role: string }>(
579
- `/api/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(memberId)}`,
580
- {
581
- method: 'PATCH',
582
- body: JSON.stringify({ role }),
583
- }
584
- );
585
- },
586
-
587
- /**
588
- * Remove member from workspace
589
- */
590
- async removeMember(workspaceId: string, memberId: string) {
591
- return cloudFetch<{ success: boolean }>(
592
- `/api/workspaces/${encodeURIComponent(workspaceId)}/members/${encodeURIComponent(memberId)}`,
593
- { method: 'DELETE' }
594
- );
595
- },
596
-
597
- // ===== Billing API =====
598
-
599
- /**
600
- * Get all billing plans
601
- */
602
- async getBillingPlans() {
603
- return cloudFetch<{
604
- plans: Array<{
605
- tier: string;
606
- name: string;
607
- description: string;
608
- price: { monthly: number; yearly: number };
609
- features: string[];
610
- limits: Record<string, number>;
611
- recommended?: boolean;
612
- }>;
613
- publishableKey: string;
614
- }>('/api/billing/plans');
615
- },
616
-
617
- /**
618
- * Get current subscription status
619
- */
620
- async getSubscription() {
621
- return cloudFetch<{
622
- tier: string;
623
- subscription: {
624
- id: string;
625
- tier: string;
626
- status: string;
627
- currentPeriodStart: string;
628
- currentPeriodEnd: string;
629
- cancelAtPeriodEnd: boolean;
630
- interval: 'month' | 'year';
631
- } | null;
632
- customer: {
633
- id: string;
634
- email: string;
635
- name?: string;
636
- paymentMethods: Array<{
637
- id: string;
638
- type: string;
639
- last4?: string;
640
- brand?: string;
641
- isDefault: boolean;
642
- }>;
643
- invoices: Array<{
644
- id: string;
645
- number: string;
646
- amount: number;
647
- status: string;
648
- date: string;
649
- pdfUrl?: string;
650
- }>;
651
- } | null;
652
- }>('/api/billing/subscription');
653
- },
654
-
655
- /**
656
- * Create checkout session for new subscription
657
- */
658
- async createCheckoutSession(tier: string, interval: 'month' | 'year' = 'month') {
659
- return cloudFetch<{
660
- sessionId: string;
661
- checkoutUrl: string;
662
- }>('/api/billing/checkout', {
663
- method: 'POST',
664
- body: JSON.stringify({ tier, interval }),
665
- });
666
- },
667
-
668
- /**
669
- * Create billing portal session
670
- */
671
- async createBillingPortal() {
672
- return cloudFetch<{
673
- sessionId: string;
674
- portalUrl: string;
675
- }>('/api/billing/portal', {
676
- method: 'POST',
677
- });
678
- },
679
-
680
- /**
681
- * Change subscription tier
682
- */
683
- async changeSubscription(tier: string, interval: 'month' | 'year' = 'month') {
684
- return cloudFetch<{
685
- subscription: {
686
- tier: string;
687
- status: string;
688
- };
689
- }>('/api/billing/change', {
690
- method: 'POST',
691
- body: JSON.stringify({ tier, interval }),
692
- });
693
- },
694
-
695
- /**
696
- * Cancel subscription at period end
697
- */
698
- async cancelSubscription() {
699
- return cloudFetch<{
700
- subscription: { cancelAtPeriodEnd: boolean; currentPeriodEnd: string };
701
- message: string;
702
- }>('/api/billing/cancel', {
703
- method: 'POST',
704
- });
705
- },
706
-
707
- /**
708
- * Resume cancelled subscription
709
- */
710
- async resumeSubscription() {
711
- return cloudFetch<{
712
- subscription: { cancelAtPeriodEnd: boolean };
713
- message: string;
714
- }>('/api/billing/resume', {
715
- method: 'POST',
716
- });
717
- },
718
-
719
- /**
720
- * Get invoices
721
- */
722
- async getInvoices() {
723
- return cloudFetch<{
724
- invoices: Array<{
725
- id: string;
726
- number: string;
727
- amount: number;
728
- status: string;
729
- date: string;
730
- pdfUrl?: string;
731
- }>;
732
- }>('/api/billing/invoices');
733
- },
734
-
735
- // ===== Workspace Management API =====
736
-
737
- /**
738
- * Stop workspace
739
- */
740
- async stopWorkspace(id: string) {
741
- return cloudFetch<{ success: boolean; message: string }>(
742
- `/api/workspaces/${encodeURIComponent(id)}/stop`,
743
- { method: 'POST' }
744
- );
745
- },
746
-
747
- /**
748
- * Delete workspace
749
- */
750
- async deleteWorkspace(id: string) {
751
- return cloudFetch<{ success: boolean; message: string }>(
752
- `/api/workspaces/${encodeURIComponent(id)}`,
753
- { method: 'DELETE' }
754
- );
755
- },
756
-
757
- /**
758
- * Add repositories to workspace
759
- */
760
- async addReposToWorkspace(workspaceId: string, repositoryIds: string[]) {
761
- return cloudFetch<{ success: boolean; message: string }>(
762
- `/api/workspaces/${encodeURIComponent(workspaceId)}/repos`,
763
- {
764
- method: 'POST',
765
- body: JSON.stringify({ repositoryIds }),
766
- }
767
- );
768
- },
769
-
770
- /**
771
- * Set custom domain for workspace
772
- */
773
- async setCustomDomain(workspaceId: string, domain: string) {
774
- return cloudFetch<{
775
- success: boolean;
776
- domain: string;
777
- status: string;
778
- instructions: {
779
- type: string;
780
- name: string;
781
- value: string;
782
- ttl: number;
783
- };
784
- verifyEndpoint: string;
785
- message: string;
786
- }>(`/api/workspaces/${encodeURIComponent(workspaceId)}/domain`, {
787
- method: 'POST',
788
- body: JSON.stringify({ domain }),
789
- });
790
- },
791
-
792
- /**
793
- * Verify custom domain
794
- */
795
- async verifyCustomDomain(workspaceId: string) {
796
- return cloudFetch<{
797
- success: boolean;
798
- status: string;
799
- domain?: string;
800
- message?: string;
801
- error?: string;
802
- }>(`/api/workspaces/${encodeURIComponent(workspaceId)}/domain/verify`, {
803
- method: 'POST',
804
- });
805
- },
806
-
807
- /**
808
- * Remove custom domain
809
- */
810
- async removeCustomDomain(workspaceId: string) {
811
- return cloudFetch<{ success: boolean; message: string }>(
812
- `/api/workspaces/${encodeURIComponent(workspaceId)}/domain`,
813
- { method: 'DELETE' }
814
- );
815
- },
816
-
817
- /**
818
- * Get detailed workspace info
819
- */
820
- async getWorkspaceDetails(id: string) {
821
- return cloudFetch<{
822
- id: string;
823
- name: string;
824
- status: string;
825
- publicUrl?: string;
826
- computeProvider: string;
827
- config: {
828
- providers: string[];
829
- repositories: string[];
830
- supervisorEnabled?: boolean;
831
- maxAgents?: number;
832
- };
833
- customDomain?: string;
834
- customDomainStatus?: string;
835
- errorMessage?: string;
836
- repositories: Array<{
837
- id: string;
838
- fullName: string;
839
- syncStatus: string;
840
- lastSyncedAt?: string;
841
- }>;
842
- createdAt: string;
843
- updatedAt: string;
844
- }>(`/api/workspaces/${encodeURIComponent(id)}`);
845
- },
846
-
847
- // ===== GitHub App API =====
848
-
849
- /**
850
- * Get user's connected repositories
851
- */
852
- async getRepos() {
853
- return cloudFetch<{ repositories: Array<{
854
- id: string;
855
- fullName: string;
856
- isPrivate: boolean;
857
- defaultBranch: string;
858
- syncStatus: string;
859
- hasNangoConnection: boolean;
860
- lastSyncedAt?: string;
861
- }> }>('/api/github-app/repos');
862
- },
863
-
864
- /**
865
- * Sync a repository to its workspace
866
- * Triggers clone/pull on the workspace container
867
- */
868
- async syncRepo(repoId: string) {
869
- return cloudFetch<{
870
- message: string;
871
- syncStatus: string;
872
- result?: unknown;
873
- }>(`/api/repos/${encodeURIComponent(repoId)}/sync`, {
874
- method: 'POST',
875
- });
876
- },
877
- };