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,922 +0,0 @@
1
- /**
2
- * Billing Panel Component
3
- *
4
- * Shows current subscription status, usage, and billing management options.
5
- */
6
-
7
- import React, { useState, useEffect, useCallback } from 'react';
8
- import { PricingPlans, type Plan } from './PricingPlans';
9
-
10
- export interface Subscription {
11
- id: string;
12
- tier: string;
13
- status: string;
14
- currentPeriodStart: Date;
15
- currentPeriodEnd: Date;
16
- cancelAtPeriodEnd: boolean;
17
- billingInterval: 'month' | 'year';
18
- }
19
-
20
- export interface Invoice {
21
- id: string;
22
- amountDue: number;
23
- amountPaid: number;
24
- status: string;
25
- invoicePdf?: string;
26
- hostedInvoiceUrl?: string;
27
- periodStart: Date;
28
- periodEnd: Date;
29
- createdAt: Date;
30
- }
31
-
32
- export interface PaymentMethod {
33
- id: string;
34
- type: string;
35
- isDefault: boolean;
36
- card?: {
37
- brand: string;
38
- last4: string;
39
- expMonth: number;
40
- expYear: number;
41
- };
42
- }
43
-
44
- export interface BillingPanelProps {
45
- apiUrl?: string;
46
- onClose?: () => void;
47
- }
48
-
49
- export function BillingPanel({ apiUrl = '/api/billing', onClose }: BillingPanelProps) {
50
- const [activeTab, setActiveTab] = useState<'overview' | 'plans' | 'invoices'>('overview');
51
- const [subscription, setSubscription] = useState<Subscription | null>(null);
52
- const [plans, setPlans] = useState<Plan[]>([]);
53
- const [invoices, setInvoices] = useState<Invoice[]>([]);
54
- const [paymentMethods, setPaymentMethods] = useState<PaymentMethod[]>([]);
55
- const [isLoading, setIsLoading] = useState(true);
56
- const [isProcessing, setIsProcessing] = useState(false);
57
- const [error, setError] = useState<string | null>(null);
58
-
59
- // Fetch billing data
60
- const fetchBillingData = useCallback(async () => {
61
- setIsLoading(true);
62
- setError(null);
63
-
64
- try {
65
- // Fetch plans
66
- const plansResponse = await fetch(`${apiUrl}/plans`);
67
- const plansData = await plansResponse.json();
68
- setPlans(plansData.plans);
69
-
70
- // Fetch subscription
71
- const subResponse = await fetch(`${apiUrl}/subscription`);
72
- const subData = await subResponse.json();
73
- if (subData.subscription) {
74
- setSubscription({
75
- ...subData.subscription,
76
- currentPeriodStart: new Date(subData.subscription.currentPeriodStart),
77
- currentPeriodEnd: new Date(subData.subscription.currentPeriodEnd),
78
- });
79
- }
80
- if (subData.customer?.paymentMethods) {
81
- setPaymentMethods(subData.customer.paymentMethods);
82
- }
83
- if (subData.customer?.invoices) {
84
- setInvoices(
85
- subData.customer.invoices.map((inv: Invoice) => ({
86
- ...inv,
87
- periodStart: new Date(inv.periodStart),
88
- periodEnd: new Date(inv.periodEnd),
89
- createdAt: new Date(inv.createdAt),
90
- }))
91
- );
92
- }
93
- } catch (err) {
94
- setError(err instanceof Error ? err.message : 'Failed to load billing data');
95
- } finally {
96
- setIsLoading(false);
97
- }
98
- }, [apiUrl]);
99
-
100
- useEffect(() => {
101
- fetchBillingData();
102
- }, [fetchBillingData]);
103
-
104
- // Handle plan selection
105
- const handleSelectPlan = async (planId: string, interval: 'month' | 'year') => {
106
- if (planId === 'enterprise') {
107
- // Redirect to contact sales
108
- window.open('mailto:sales@agent-relay.com?subject=Enterprise%20Plan%20Inquiry', '_blank');
109
- return;
110
- }
111
-
112
- setIsProcessing(true);
113
- setError(null);
114
-
115
- try {
116
- // Check if upgrading or changing plan
117
- if (subscription && planId !== 'free') {
118
- // Change existing subscription
119
- const response = await fetch(`${apiUrl}/change`, {
120
- method: 'POST',
121
- headers: { 'Content-Type': 'application/json' },
122
- body: JSON.stringify({ tier: planId, interval }),
123
- });
124
-
125
- if (!response.ok) {
126
- const data = await response.json();
127
- throw new Error(data.error || 'Failed to change subscription');
128
- }
129
-
130
- await fetchBillingData();
131
- } else if (planId === 'free' && subscription) {
132
- // Cancel subscription
133
- const response = await fetch(`${apiUrl}/cancel`, {
134
- method: 'POST',
135
- });
136
-
137
- if (!response.ok) {
138
- const data = await response.json();
139
- throw new Error(data.error || 'Failed to cancel subscription');
140
- }
141
-
142
- await fetchBillingData();
143
- } else {
144
- // Create new subscription via checkout
145
- const response = await fetch(`${apiUrl}/checkout`, {
146
- method: 'POST',
147
- headers: { 'Content-Type': 'application/json' },
148
- body: JSON.stringify({ tier: planId, interval }),
149
- });
150
-
151
- if (!response.ok) {
152
- const data = await response.json();
153
- throw new Error(data.error || 'Failed to create checkout session');
154
- }
155
-
156
- const { url } = await response.json();
157
- window.location.href = url;
158
- }
159
- } catch (err) {
160
- setError(err instanceof Error ? err.message : 'An error occurred');
161
- } finally {
162
- setIsProcessing(false);
163
- }
164
- };
165
-
166
- // Handle resume subscription
167
- const handleResumeSubscription = async () => {
168
- setIsProcessing(true);
169
- setError(null);
170
-
171
- try {
172
- const response = await fetch(`${apiUrl}/resume`, {
173
- method: 'POST',
174
- });
175
-
176
- if (!response.ok) {
177
- const data = await response.json();
178
- throw new Error(data.error || 'Failed to resume subscription');
179
- }
180
-
181
- await fetchBillingData();
182
- } catch (err) {
183
- setError(err instanceof Error ? err.message : 'An error occurred');
184
- } finally {
185
- setIsProcessing(false);
186
- }
187
- };
188
-
189
- // Handle open billing portal
190
- const handleOpenPortal = async () => {
191
- setIsProcessing(true);
192
- setError(null);
193
-
194
- try {
195
- const response = await fetch(`${apiUrl}/portal`, {
196
- method: 'POST',
197
- });
198
-
199
- if (!response.ok) {
200
- const data = await response.json();
201
- throw new Error(data.error || 'Failed to open billing portal');
202
- }
203
-
204
- const { url } = await response.json();
205
- window.open(url, '_blank');
206
- } catch (err) {
207
- setError(err instanceof Error ? err.message : 'An error occurred');
208
- } finally {
209
- setIsProcessing(false);
210
- }
211
- };
212
-
213
- const currentTier = subscription?.tier || 'free';
214
- const currentPlan = plans.find((p) => p.id === currentTier);
215
-
216
- const formatDate = (date: Date) => {
217
- return date.toLocaleDateString('en-US', {
218
- year: 'numeric',
219
- month: 'long',
220
- day: 'numeric',
221
- });
222
- };
223
-
224
- const formatAmount = (cents: number) => {
225
- return `$${(cents / 100).toFixed(2)}`;
226
- };
227
-
228
- if (isLoading) {
229
- return (
230
- <div className="billing-panel">
231
- <div className="billing-loading">
232
- <LoadingSpinner />
233
- <p>Loading billing information...</p>
234
- </div>
235
- </div>
236
- );
237
- }
238
-
239
- return (
240
- <div className="billing-panel">
241
- {/* Header */}
242
- <div className="billing-header">
243
- <h2>Billing & Subscription</h2>
244
- {onClose && (
245
- <button className="billing-close" onClick={onClose}>
246
- <CloseIcon />
247
- </button>
248
- )}
249
- </div>
250
-
251
- {/* Error */}
252
- {error && (
253
- <div className="billing-error">
254
- <span>{error}</span>
255
- <button onClick={() => setError(null)}>&times;</button>
256
- </div>
257
- )}
258
-
259
- {/* Tabs */}
260
- <div className="billing-tabs">
261
- <button
262
- className={`billing-tab ${activeTab === 'overview' ? 'active' : ''}`}
263
- onClick={() => setActiveTab('overview')}
264
- >
265
- Overview
266
- </button>
267
- <button
268
- className={`billing-tab ${activeTab === 'plans' ? 'active' : ''}`}
269
- onClick={() => setActiveTab('plans')}
270
- >
271
- Plans
272
- </button>
273
- <button
274
- className={`billing-tab ${activeTab === 'invoices' ? 'active' : ''}`}
275
- onClick={() => setActiveTab('invoices')}
276
- >
277
- Invoices
278
- </button>
279
- </div>
280
-
281
- {/* Tab Content */}
282
- <div className="billing-content">
283
- {activeTab === 'overview' && (
284
- <div className="billing-overview">
285
- {/* Current Plan */}
286
- <div className="overview-section">
287
- <h3>Current Plan</h3>
288
- <div className="current-plan-card">
289
- <div className="plan-info">
290
- <span className="plan-name">{currentPlan?.name || 'Free'}</span>
291
- <span className="plan-tier-badge">{currentTier}</span>
292
- </div>
293
- {subscription && (
294
- <div className="plan-details">
295
- <p>
296
- <strong>Status:</strong>{' '}
297
- <span className={`status-${subscription.status}`}>
298
- {subscription.status}
299
- </span>
300
- </p>
301
- <p>
302
- <strong>Billing:</strong> {subscription.billingInterval === 'year' ? 'Annual' : 'Monthly'}
303
- </p>
304
- <p>
305
- <strong>Current Period:</strong>{' '}
306
- {formatDate(subscription.currentPeriodStart)} - {formatDate(subscription.currentPeriodEnd)}
307
- </p>
308
- {subscription.cancelAtPeriodEnd && (
309
- <div className="cancel-notice">
310
- <p>Your subscription will be canceled on {formatDate(subscription.currentPeriodEnd)}</p>
311
- <button
312
- className="btn-resume"
313
- onClick={handleResumeSubscription}
314
- disabled={isProcessing}
315
- >
316
- {isProcessing ? 'Processing...' : 'Resume Subscription'}
317
- </button>
318
- </div>
319
- )}
320
- </div>
321
- )}
322
- {!subscription && (
323
- <p className="free-notice">
324
- You're on the free plan. Upgrade to unlock more features!
325
- </p>
326
- )}
327
- </div>
328
- </div>
329
-
330
- {/* Usage */}
331
- {currentPlan && (
332
- <div className="overview-section">
333
- <h3>Usage & Limits</h3>
334
- <div className="usage-grid">
335
- <UsageItem
336
- label="Workspaces"
337
- current={0}
338
- limit={currentPlan.limits.maxWorkspaces}
339
- />
340
- <UsageItem
341
- label="Agents per Workspace"
342
- current={0}
343
- limit={currentPlan.limits.maxAgentsPerWorkspace}
344
- />
345
- <UsageItem
346
- label="Team Members"
347
- current={1}
348
- limit={currentPlan.limits.maxTeamMembers}
349
- />
350
- <UsageItem
351
- label="Storage"
352
- current={0}
353
- limit={currentPlan.limits.maxStorageGB}
354
- unit="GB"
355
- />
356
- <UsageItem
357
- label="Compute Hours"
358
- current={0}
359
- limit={currentPlan.limits.maxComputeHoursPerMonth}
360
- unit="hrs/mo"
361
- />
362
- </div>
363
- </div>
364
- )}
365
-
366
- {/* Payment Method */}
367
- {paymentMethods.length > 0 && (
368
- <div className="overview-section">
369
- <h3>Payment Method</h3>
370
- <div className="payment-methods">
371
- {paymentMethods.map((pm) => (
372
- <div key={pm.id} className={`payment-method ${pm.isDefault ? 'default' : ''}`}>
373
- {pm.card && (
374
- <>
375
- <CardIcon brand={pm.card.brand} />
376
- <span className="card-info">
377
- {pm.card.brand.charAt(0).toUpperCase() + pm.card.brand.slice(1)} •••• {pm.card.last4}
378
- </span>
379
- <span className="card-expiry">
380
- Expires {pm.card.expMonth}/{pm.card.expYear}
381
- </span>
382
- {pm.isDefault && <span className="default-badge">Default</span>}
383
- </>
384
- )}
385
- </div>
386
- ))}
387
- </div>
388
- <button className="btn-manage-billing" onClick={handleOpenPortal} disabled={isProcessing}>
389
- {isProcessing ? 'Opening...' : 'Manage Payment Methods'}
390
- </button>
391
- </div>
392
- )}
393
- </div>
394
- )}
395
-
396
- {activeTab === 'plans' && (
397
- <PricingPlans
398
- plans={plans}
399
- currentPlan={currentTier}
400
- onSelectPlan={handleSelectPlan}
401
- isLoading={isProcessing}
402
- />
403
- )}
404
-
405
- {activeTab === 'invoices' && (
406
- <div className="billing-invoices">
407
- {invoices.length === 0 ? (
408
- <div className="no-invoices">
409
- <p>No invoices yet</p>
410
- </div>
411
- ) : (
412
- <table className="invoices-table">
413
- <thead>
414
- <tr>
415
- <th>Date</th>
416
- <th>Period</th>
417
- <th>Amount</th>
418
- <th>Status</th>
419
- <th>Actions</th>
420
- </tr>
421
- </thead>
422
- <tbody>
423
- {invoices.map((invoice) => (
424
- <tr key={invoice.id}>
425
- <td>{formatDate(invoice.createdAt)}</td>
426
- <td>
427
- {formatDate(invoice.periodStart)} - {formatDate(invoice.periodEnd)}
428
- </td>
429
- <td>{formatAmount(invoice.amountPaid || invoice.amountDue)}</td>
430
- <td>
431
- <span className={`invoice-status status-${invoice.status}`}>
432
- {invoice.status}
433
- </span>
434
- </td>
435
- <td>
436
- {invoice.invoicePdf && (
437
- <a href={invoice.invoicePdf} target="_blank" rel="noopener noreferrer">
438
- PDF
439
- </a>
440
- )}
441
- {invoice.hostedInvoiceUrl && (
442
- <a href={invoice.hostedInvoiceUrl} target="_blank" rel="noopener noreferrer">
443
- View
444
- </a>
445
- )}
446
- </td>
447
- </tr>
448
- ))}
449
- </tbody>
450
- </table>
451
- )}
452
- </div>
453
- )}
454
- </div>
455
- </div>
456
- );
457
- }
458
-
459
- // Helper components
460
- function UsageItem({
461
- label,
462
- current,
463
- limit,
464
- unit,
465
- }: {
466
- label: string;
467
- current: number;
468
- limit: number;
469
- unit?: string;
470
- }) {
471
- const isUnlimited = limit === -1;
472
- const percentage = isUnlimited ? 0 : (current / limit) * 100;
473
-
474
- return (
475
- <div className="usage-item">
476
- <div className="usage-header">
477
- <span className="usage-label">{label}</span>
478
- <span className="usage-value">
479
- {current}{unit ? ` ${unit}` : ''} / {isUnlimited ? 'Unlimited' : `${limit}${unit ? ` ${unit}` : ''}`}
480
- </span>
481
- </div>
482
- <div className="usage-bar">
483
- <div
484
- className={`usage-fill ${percentage > 80 ? 'warning' : ''} ${percentage > 95 ? 'critical' : ''}`}
485
- style={{ width: `${Math.min(percentage, 100)}%` }}
486
- />
487
- </div>
488
- </div>
489
- );
490
- }
491
-
492
- function CardIcon({ brand }: { brand: string }) {
493
- return (
494
- <svg width="32" height="24" viewBox="0 0 32 24" fill="none" className="card-icon">
495
- <rect width="32" height="24" rx="4" fill="#2a2a3e" />
496
- <text x="16" y="14" textAnchor="middle" fill="#8d8d8e" fontSize="8">
497
- {brand.toUpperCase()}
498
- </text>
499
- </svg>
500
- );
501
- }
502
-
503
- function LoadingSpinner() {
504
- return (
505
- <svg className="spinner" width="24" height="24" viewBox="0 0 24 24">
506
- <circle
507
- cx="12"
508
- cy="12"
509
- r="10"
510
- stroke="currentColor"
511
- strokeWidth="2"
512
- fill="none"
513
- strokeDasharray="32"
514
- strokeLinecap="round"
515
- />
516
- </svg>
517
- );
518
- }
519
-
520
- function CloseIcon() {
521
- return (
522
- <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
523
- <line x1="18" y1="6" x2="6" y2="18" />
524
- <line x1="6" y1="6" x2="18" y2="18" />
525
- </svg>
526
- );
527
- }
528
-
529
- export const billingPanelStyles = `
530
- .billing-panel {
531
- background: #1a1a2e;
532
- border: 1px solid #2a2a3e;
533
- border-radius: 12px;
534
- max-width: 1000px;
535
- margin: 0 auto;
536
- overflow: hidden;
537
- }
538
-
539
- .billing-header {
540
- display: flex;
541
- align-items: center;
542
- justify-content: space-between;
543
- padding: 20px 24px;
544
- border-bottom: 1px solid #2a2a3e;
545
- }
546
-
547
- .billing-header h2 {
548
- margin: 0;
549
- font-size: 18px;
550
- font-weight: 600;
551
- color: #e8e8e8;
552
- }
553
-
554
- .billing-close {
555
- background: transparent;
556
- border: none;
557
- color: #666;
558
- cursor: pointer;
559
- padding: 4px;
560
- display: flex;
561
- border-radius: 4px;
562
- transition: all 0.2s;
563
- }
564
-
565
- .billing-close:hover {
566
- background: rgba(255, 255, 255, 0.1);
567
- color: #e8e8e8;
568
- }
569
-
570
- .billing-loading {
571
- display: flex;
572
- flex-direction: column;
573
- align-items: center;
574
- justify-content: center;
575
- padding: 60px 24px;
576
- color: #8d8d8e;
577
- }
578
-
579
- .billing-loading .spinner {
580
- animation: spin 1s linear infinite;
581
- margin-bottom: 16px;
582
- color: #00c896;
583
- }
584
-
585
- @keyframes spin {
586
- from { transform: rotate(0deg); }
587
- to { transform: rotate(360deg); }
588
- }
589
-
590
- .billing-error {
591
- display: flex;
592
- align-items: center;
593
- justify-content: space-between;
594
- padding: 12px 24px;
595
- background: rgba(239, 68, 68, 0.1);
596
- border-bottom: 1px solid rgba(239, 68, 68, 0.3);
597
- color: #ef4444;
598
- font-size: 14px;
599
- }
600
-
601
- .billing-error button {
602
- background: none;
603
- border: none;
604
- color: #ef4444;
605
- cursor: pointer;
606
- font-size: 18px;
607
- }
608
-
609
- .billing-tabs {
610
- display: flex;
611
- border-bottom: 1px solid #2a2a3e;
612
- }
613
-
614
- .billing-tab {
615
- flex: 1;
616
- padding: 14px 20px;
617
- background: transparent;
618
- border: none;
619
- border-bottom: 2px solid transparent;
620
- color: #8d8d8e;
621
- font-size: 14px;
622
- cursor: pointer;
623
- transition: all 0.2s;
624
- }
625
-
626
- .billing-tab:hover {
627
- color: #e8e8e8;
628
- background: rgba(255, 255, 255, 0.02);
629
- }
630
-
631
- .billing-tab.active {
632
- color: #00c896;
633
- border-bottom-color: #00c896;
634
- }
635
-
636
- .billing-content {
637
- padding: 24px;
638
- }
639
-
640
- .billing-overview {
641
- display: flex;
642
- flex-direction: column;
643
- gap: 32px;
644
- }
645
-
646
- .overview-section h3 {
647
- margin: 0 0 16px;
648
- font-size: 16px;
649
- font-weight: 600;
650
- color: #e8e8e8;
651
- }
652
-
653
- .current-plan-card {
654
- background: #222234;
655
- border: 1px solid #2a2a3e;
656
- border-radius: 8px;
657
- padding: 20px;
658
- }
659
-
660
- .plan-info {
661
- display: flex;
662
- align-items: center;
663
- gap: 12px;
664
- margin-bottom: 16px;
665
- }
666
-
667
- .plan-info .plan-name {
668
- font-size: 20px;
669
- font-weight: 600;
670
- color: #e8e8e8;
671
- }
672
-
673
- .plan-tier-badge {
674
- padding: 4px 10px;
675
- background: #00c896;
676
- color: #1a1a2e;
677
- border-radius: 4px;
678
- font-size: 12px;
679
- font-weight: 500;
680
- text-transform: capitalize;
681
- }
682
-
683
- .plan-details p {
684
- margin: 8px 0;
685
- font-size: 14px;
686
- color: #b8b8b8;
687
- }
688
-
689
- .plan-details strong {
690
- color: #e8e8e8;
691
- }
692
-
693
- .status-active { color: #00c896; }
694
- .status-past_due { color: #f59e0b; }
695
- .status-canceled { color: #ef4444; }
696
- .status-trialing { color: #3b82f6; }
697
-
698
- .cancel-notice {
699
- margin-top: 16px;
700
- padding: 12px;
701
- background: rgba(239, 68, 68, 0.1);
702
- border: 1px solid rgba(239, 68, 68, 0.3);
703
- border-radius: 6px;
704
- }
705
-
706
- .cancel-notice p {
707
- color: #ef4444;
708
- margin-bottom: 12px;
709
- }
710
-
711
- .btn-resume {
712
- padding: 8px 16px;
713
- background: #00c896;
714
- color: #1a1a2e;
715
- border: none;
716
- border-radius: 6px;
717
- font-size: 14px;
718
- cursor: pointer;
719
- transition: all 0.2s;
720
- }
721
-
722
- .btn-resume:hover:not(:disabled) {
723
- background: #00a87d;
724
- }
725
-
726
- .btn-resume:disabled {
727
- opacity: 0.6;
728
- cursor: not-allowed;
729
- }
730
-
731
- .free-notice {
732
- color: #8d8d8e;
733
- font-size: 14px;
734
- }
735
-
736
- .usage-grid {
737
- display: grid;
738
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
739
- gap: 16px;
740
- }
741
-
742
- .usage-item {
743
- background: #222234;
744
- border: 1px solid #2a2a3e;
745
- border-radius: 8px;
746
- padding: 16px;
747
- }
748
-
749
- .usage-header {
750
- display: flex;
751
- justify-content: space-between;
752
- margin-bottom: 8px;
753
- }
754
-
755
- .usage-label {
756
- font-size: 13px;
757
- color: #8d8d8e;
758
- }
759
-
760
- .usage-value {
761
- font-size: 13px;
762
- color: #e8e8e8;
763
- font-weight: 500;
764
- }
765
-
766
- .usage-bar {
767
- height: 6px;
768
- background: #2a2a3e;
769
- border-radius: 3px;
770
- overflow: hidden;
771
- }
772
-
773
- .usage-fill {
774
- height: 100%;
775
- background: #00c896;
776
- border-radius: 3px;
777
- transition: width 0.3s;
778
- }
779
-
780
- .usage-fill.warning {
781
- background: #f59e0b;
782
- }
783
-
784
- .usage-fill.critical {
785
- background: #ef4444;
786
- }
787
-
788
- .payment-methods {
789
- display: flex;
790
- flex-direction: column;
791
- gap: 12px;
792
- margin-bottom: 16px;
793
- }
794
-
795
- .payment-method {
796
- display: flex;
797
- align-items: center;
798
- gap: 12px;
799
- padding: 12px 16px;
800
- background: #222234;
801
- border: 1px solid #2a2a3e;
802
- border-radius: 8px;
803
- }
804
-
805
- .payment-method.default {
806
- border-color: #00c896;
807
- }
808
-
809
- .card-icon {
810
- flex-shrink: 0;
811
- }
812
-
813
- .card-info {
814
- font-size: 14px;
815
- color: #e8e8e8;
816
- }
817
-
818
- .card-expiry {
819
- font-size: 12px;
820
- color: #8d8d8e;
821
- margin-left: auto;
822
- }
823
-
824
- .default-badge {
825
- padding: 2px 8px;
826
- background: #00c896;
827
- color: #1a1a2e;
828
- border-radius: 4px;
829
- font-size: 11px;
830
- font-weight: 500;
831
- }
832
-
833
- .btn-manage-billing {
834
- padding: 10px 16px;
835
- background: transparent;
836
- border: 1px solid #3a3a4e;
837
- border-radius: 6px;
838
- color: #e8e8e8;
839
- font-size: 14px;
840
- cursor: pointer;
841
- transition: all 0.2s;
842
- }
843
-
844
- .btn-manage-billing:hover:not(:disabled) {
845
- background: rgba(255, 255, 255, 0.05);
846
- border-color: #4a4a5e;
847
- }
848
-
849
- .btn-manage-billing:disabled {
850
- opacity: 0.6;
851
- cursor: not-allowed;
852
- }
853
-
854
- .billing-invoices {
855
- min-height: 200px;
856
- }
857
-
858
- .no-invoices {
859
- display: flex;
860
- align-items: center;
861
- justify-content: center;
862
- padding: 60px;
863
- color: #8d8d8e;
864
- }
865
-
866
- .invoices-table {
867
- width: 100%;
868
- border-collapse: collapse;
869
- }
870
-
871
- .invoices-table th,
872
- .invoices-table td {
873
- padding: 12px 16px;
874
- text-align: left;
875
- border-bottom: 1px solid #2a2a3e;
876
- }
877
-
878
- .invoices-table th {
879
- font-size: 12px;
880
- font-weight: 500;
881
- color: #8d8d8e;
882
- text-transform: uppercase;
883
- letter-spacing: 0.5px;
884
- }
885
-
886
- .invoices-table td {
887
- font-size: 14px;
888
- color: #e8e8e8;
889
- }
890
-
891
- .invoice-status {
892
- padding: 4px 8px;
893
- border-radius: 4px;
894
- font-size: 12px;
895
- text-transform: capitalize;
896
- }
897
-
898
- .invoice-status.status-paid {
899
- background: rgba(0, 200, 150, 0.1);
900
- color: #00c896;
901
- }
902
-
903
- .invoice-status.status-open {
904
- background: rgba(59, 130, 246, 0.1);
905
- color: #3b82f6;
906
- }
907
-
908
- .invoice-status.status-void {
909
- background: rgba(107, 114, 128, 0.1);
910
- color: #6b7280;
911
- }
912
-
913
- .invoices-table a {
914
- color: #00c896;
915
- text-decoration: none;
916
- margin-right: 12px;
917
- }
918
-
919
- .invoices-table a:hover {
920
- text-decoration: underline;
921
- }
922
- `;