agent-relay 2.0.21 → 2.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/bin/relay-pty-linux-arm64 +0 -0
  2. package/dist/src/cli/index.d.ts +3 -3
  3. package/dist/src/cli/index.js +31 -100
  4. package/package.json +22 -29
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/bridge/package.json +8 -8
  7. package/packages/cli-tester/package.json +1 -1
  8. package/packages/cloud/dist/server.js +25 -4
  9. package/packages/cloud/package.json +6 -6
  10. package/packages/config/package.json +2 -2
  11. package/packages/continuity/package.json +1 -1
  12. package/packages/daemon/dist/orchestrator.js +21 -1
  13. package/packages/daemon/dist/router.d.ts +5 -0
  14. package/packages/daemon/dist/router.js +31 -0
  15. package/packages/daemon/dist/server.d.ts +5 -0
  16. package/packages/daemon/dist/server.js +131 -1
  17. package/packages/daemon/package.json +12 -12
  18. package/packages/hooks/package.json +4 -4
  19. package/packages/mcp/dist/client.d.ts +15 -0
  20. package/packages/mcp/dist/client.js +9 -0
  21. package/packages/mcp/dist/server.js +13 -1
  22. package/packages/mcp/dist/tools/index.d.ts +2 -0
  23. package/packages/mcp/dist/tools/index.js +2 -0
  24. package/packages/mcp/dist/tools/relay-connected.d.ts +17 -0
  25. package/packages/mcp/dist/tools/relay-connected.js +40 -0
  26. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +20 -0
  27. package/packages/mcp/dist/tools/relay-remove-agent.js +50 -0
  28. package/packages/mcp/package.json +2 -2
  29. package/packages/memory/package.json +2 -2
  30. package/packages/policy/package.json +2 -2
  31. package/packages/protocol/dist/types.d.ts +46 -1
  32. package/packages/protocol/package.json +1 -1
  33. package/packages/resiliency/package.json +1 -1
  34. package/packages/sdk/dist/client.d.ts +22 -1
  35. package/packages/sdk/dist/client.js +31 -0
  36. package/packages/sdk/dist/protocol/index.d.ts +1 -1
  37. package/packages/sdk/dist/protocol/types.d.ts +35 -1
  38. package/packages/sdk/package.json +2 -2
  39. package/packages/spawner/package.json +1 -1
  40. package/packages/state/package.json +1 -1
  41. package/packages/storage/dist/adapter.d.ts +4 -0
  42. package/packages/storage/dist/sqlite-adapter.d.ts +10 -0
  43. package/packages/storage/dist/sqlite-adapter.js +26 -0
  44. package/packages/storage/package.json +2 -2
  45. package/packages/telemetry/package.json +1 -1
  46. package/packages/trajectory/package.json +2 -2
  47. package/packages/user-directory/package.json +2 -2
  48. package/packages/utils/dist/update-checker.js +4 -0
  49. package/packages/utils/package.json +1 -1
  50. package/packages/wrapper/package.json +6 -6
  51. package/deploy/workspace/codex.config.toml +0 -20
  52. package/deploy/workspace/entrypoint-browser.sh +0 -118
  53. package/deploy/workspace/entrypoint.sh +0 -612
  54. package/deploy/workspace/gh-credential-relay +0 -90
  55. package/deploy/workspace/gh-relay +0 -156
  56. package/deploy/workspace/git-credential-relay +0 -330
  57. package/deploy/workspace/git-credential-relay.test.sh +0 -230
  58. package/dist/dashboard/out/404.html +0 -1
  59. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  60. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  61. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  62. package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  63. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  64. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  65. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
  66. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  67. package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  68. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  69. package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  70. package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  71. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  72. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  73. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  74. package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  75. package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  76. package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  77. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  78. package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  79. package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  80. package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  81. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  82. package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  83. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  84. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  85. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  86. package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  87. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  88. package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  89. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  90. package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  91. package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  92. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  93. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  94. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  95. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  96. package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
  97. package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
  98. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  99. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  100. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  101. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  102. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  103. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
  104. package/dist/dashboard/out/alt-logos/logo.svg +0 -38
  105. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  106. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  107. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  108. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  109. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  110. package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
  111. package/dist/dashboard/out/app/onboarding.html +0 -1
  112. package/dist/dashboard/out/app/onboarding.txt +0 -7
  113. package/dist/dashboard/out/app.html +0 -1
  114. package/dist/dashboard/out/app.txt +0 -7
  115. package/dist/dashboard/out/apple-icon.png +0 -0
  116. package/dist/dashboard/out/cloud/link.html +0 -1
  117. package/dist/dashboard/out/cloud/link.txt +0 -7
  118. package/dist/dashboard/out/complete-profile.html +0 -5
  119. package/dist/dashboard/out/complete-profile.txt +0 -7
  120. package/dist/dashboard/out/connect-repos.html +0 -1
  121. package/dist/dashboard/out/connect-repos.txt +0 -7
  122. package/dist/dashboard/out/history.html +0 -1
  123. package/dist/dashboard/out/history.txt +0 -7
  124. package/dist/dashboard/out/index.html +0 -1
  125. package/dist/dashboard/out/index.txt +0 -7
  126. package/dist/dashboard/out/login.html +0 -5
  127. package/dist/dashboard/out/login.txt +0 -7
  128. package/dist/dashboard/out/metrics.html +0 -1
  129. package/dist/dashboard/out/metrics.txt +0 -7
  130. package/dist/dashboard/out/pricing.html +0 -13
  131. package/dist/dashboard/out/pricing.txt +0 -7
  132. package/dist/dashboard/out/providers/setup/claude.html +0 -1
  133. package/dist/dashboard/out/providers/setup/claude.txt +0 -8
  134. package/dist/dashboard/out/providers/setup/codex.html +0 -1
  135. package/dist/dashboard/out/providers/setup/codex.txt +0 -8
  136. package/dist/dashboard/out/providers/setup/cursor.html +0 -1
  137. package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
  138. package/dist/dashboard/out/providers.html +0 -1
  139. package/dist/dashboard/out/providers.txt +0 -7
  140. package/dist/dashboard/out/signup.html +0 -6
  141. package/dist/dashboard/out/signup.txt +0 -7
  142. package/dist/src/dashboard-server/index.d.ts +0 -8
  143. package/dist/src/dashboard-server/index.js +0 -8
  144. package/packages/dashboard/README.md +0 -48
  145. package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
  146. package/packages/dashboard/dist/health-worker-manager.js +0 -144
  147. package/packages/dashboard/dist/health-worker.d.ts +0 -9
  148. package/packages/dashboard/dist/health-worker.js +0 -79
  149. package/packages/dashboard/dist/index.d.ts +0 -20
  150. package/packages/dashboard/dist/index.js +0 -19
  151. package/packages/dashboard/dist/metrics.d.ts +0 -105
  152. package/packages/dashboard/dist/metrics.js +0 -193
  153. package/packages/dashboard/dist/needs-attention.d.ts +0 -24
  154. package/packages/dashboard/dist/needs-attention.js +0 -78
  155. package/packages/dashboard/dist/server.d.ts +0 -25
  156. package/packages/dashboard/dist/server.js +0 -5270
  157. package/packages/dashboard/dist/start.d.ts +0 -6
  158. package/packages/dashboard/dist/start.js +0 -13
  159. package/packages/dashboard/dist/types/threading.d.ts +0 -8
  160. package/packages/dashboard/dist/types/threading.js +0 -2
  161. package/packages/dashboard/dist/user-bridge.d.ts +0 -154
  162. package/packages/dashboard/dist/user-bridge.js +0 -372
  163. package/packages/dashboard/package.json +0 -65
  164. package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
  165. package/packages/dashboard/ui/app/app/page.tsx +0 -667
  166. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  167. package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
  168. package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
  169. package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
  170. package/packages/dashboard/ui/app/favicon.png +0 -0
  171. package/packages/dashboard/ui/app/globals.css +0 -59
  172. package/packages/dashboard/ui/app/history/page.tsx +0 -658
  173. package/packages/dashboard/ui/app/layout.tsx +0 -25
  174. package/packages/dashboard/ui/app/login/page.tsx +0 -424
  175. package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
  176. package/packages/dashboard/ui/app/page.tsx +0 -59
  177. package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
  178. package/packages/dashboard/ui/app/providers/page.tsx +0 -193
  179. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
  180. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
  181. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
  182. package/packages/dashboard/ui/app/signup/page.tsx +0 -533
  183. package/packages/dashboard/ui/index.ts +0 -49
  184. package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
  185. package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
  186. package/packages/dashboard/ui/landing/index.ts +0 -6
  187. package/packages/dashboard/ui/landing/styles.css +0 -2850
  188. package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
  189. package/packages/dashboard/ui/lib/api.ts +0 -1155
  190. package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
  191. package/packages/dashboard/ui/lib/colors.ts +0 -218
  192. package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
  193. package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
  194. package/packages/dashboard/ui/next-env.d.ts +0 -5
  195. package/packages/dashboard/ui/next.config.js +0 -41
  196. package/packages/dashboard/ui/package-lock.json +0 -2882
  197. package/packages/dashboard/ui/package.json +0 -33
  198. package/packages/dashboard/ui/postcss.config.js +0 -5
  199. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
  200. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
  201. package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
  202. package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
  203. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
  204. package/packages/dashboard/ui/react-components/App.tsx +0 -3033
  205. package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
  206. package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
  207. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
  208. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
  209. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
  210. package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
  211. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
  212. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
  213. package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
  214. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
  215. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
  216. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
  217. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
  218. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
  219. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
  220. package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
  221. package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
  222. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
  223. package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
  224. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
  225. package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
  226. package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
  227. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
  228. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
  229. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
  230. package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
  231. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
  232. package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
  233. package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
  234. package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
  235. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
  236. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
  237. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
  238. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
  239. package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
  240. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
  241. package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
  242. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
  243. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
  244. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
  245. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
  246. package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
  247. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
  248. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
  249. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
  250. package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
  251. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
  252. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
  253. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
  254. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
  255. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
  256. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
  257. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
  258. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
  259. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
  260. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
  261. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
  262. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
  263. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
  264. package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
  265. package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
  266. package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
  267. package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
  268. package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
  269. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
  270. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
  271. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
  272. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
  273. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
  274. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
  275. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
  276. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
  277. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
  278. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
  279. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
  280. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
  281. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
  282. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
  283. package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
  284. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
  285. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
  286. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
  287. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
  288. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
  289. package/packages/dashboard/ui/react-components/index.ts +0 -81
  290. package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
  291. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
  292. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
  293. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
  294. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
  295. package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
  296. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
  297. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
  298. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
  299. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
  300. package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
  301. package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
  302. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
  303. package/packages/dashboard/ui/tailwind.config.js +0 -148
  304. package/packages/dashboard/ui/types/index.ts +0 -304
  305. package/packages/dashboard/ui/types/threading.ts +0 -7
  306. package/packages/dashboard/ui-dist/404.html +0 -1
  307. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  308. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  309. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  310. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  311. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  312. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  313. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
  314. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  315. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  316. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  317. package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  318. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  319. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  320. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  321. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  322. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  323. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  324. package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  325. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  326. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  327. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  328. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  329. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  330. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  331. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  332. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  333. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  334. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  335. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  336. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  337. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  338. package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  339. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  340. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  341. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  342. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  343. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  344. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
  345. package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
  346. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_buildManifest.js +0 -1
  347. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_ssgManifest.js +0 -1
  348. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_buildManifest.js +0 -1
  349. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_ssgManifest.js +0 -1
  350. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  351. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  352. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  353. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  354. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  355. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
  356. package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
  357. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  358. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  359. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  360. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  361. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  362. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
  363. package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
  364. package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
  365. package/packages/dashboard/ui-dist/app.html +0 -1
  366. package/packages/dashboard/ui-dist/app.txt +0 -7
  367. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  368. package/packages/dashboard/ui-dist/cloud/link.html +0 -1
  369. package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
  370. package/packages/dashboard/ui-dist/complete-profile.html +0 -5
  371. package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
  372. package/packages/dashboard/ui-dist/connect-repos.html +0 -1
  373. package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
  374. package/packages/dashboard/ui-dist/history.html +0 -1
  375. package/packages/dashboard/ui-dist/history.txt +0 -7
  376. package/packages/dashboard/ui-dist/index.html +0 -1
  377. package/packages/dashboard/ui-dist/index.txt +0 -7
  378. package/packages/dashboard/ui-dist/login.html +0 -5
  379. package/packages/dashboard/ui-dist/login.txt +0 -7
  380. package/packages/dashboard/ui-dist/metrics.html +0 -1
  381. package/packages/dashboard/ui-dist/metrics.txt +0 -7
  382. package/packages/dashboard/ui-dist/pricing.html +0 -13
  383. package/packages/dashboard/ui-dist/pricing.txt +0 -7
  384. package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
  385. package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
  386. package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
  387. package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
  388. package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
  389. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
  390. package/packages/dashboard/ui-dist/providers.html +0 -1
  391. package/packages/dashboard/ui-dist/providers.txt +0 -7
  392. package/packages/dashboard/ui-dist/signup.html +0 -6
  393. package/packages/dashboard/ui-dist/signup.txt +0 -7
  394. package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
  395. package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
  396. package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
  397. package/packages/dashboard-server/dist/health-worker.js +0 -79
  398. package/packages/dashboard-server/dist/index.d.ts +0 -18
  399. package/packages/dashboard-server/dist/index.js +0 -17
  400. package/packages/dashboard-server/dist/metrics.d.ts +0 -105
  401. package/packages/dashboard-server/dist/metrics.js +0 -193
  402. package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
  403. package/packages/dashboard-server/dist/needs-attention.js +0 -78
  404. package/packages/dashboard-server/dist/server.d.ts +0 -25
  405. package/packages/dashboard-server/dist/server.js +0 -5158
  406. package/packages/dashboard-server/dist/start.d.ts +0 -6
  407. package/packages/dashboard-server/dist/start.js +0 -13
  408. package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
  409. package/packages/dashboard-server/dist/types/threading.js +0 -2
  410. package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
  411. package/packages/dashboard-server/dist/user-bridge.js +0 -390
  412. package/packages/dashboard-server/package.json +0 -55
@@ -1,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
- };