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.
- package/bin/relay-pty-linux-arm64 +0 -0
- package/dist/src/cli/index.d.ts +3 -3
- package/dist/src/cli/index.js +31 -100
- package/package.json +22 -29
- package/packages/api-types/package.json +1 -1
- package/packages/bridge/package.json +8 -8
- package/packages/cli-tester/package.json +1 -1
- package/packages/cloud/dist/server.js +25 -4
- package/packages/cloud/package.json +6 -6
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +1 -1
- package/packages/daemon/dist/orchestrator.js +21 -1
- package/packages/daemon/dist/router.d.ts +5 -0
- package/packages/daemon/dist/router.js +31 -0
- package/packages/daemon/dist/server.d.ts +5 -0
- package/packages/daemon/dist/server.js +131 -1
- package/packages/daemon/package.json +12 -12
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/dist/client.d.ts +15 -0
- package/packages/mcp/dist/client.js +9 -0
- package/packages/mcp/dist/server.js +13 -1
- package/packages/mcp/dist/tools/index.d.ts +2 -0
- package/packages/mcp/dist/tools/index.js +2 -0
- package/packages/mcp/dist/tools/relay-connected.d.ts +17 -0
- package/packages/mcp/dist/tools/relay-connected.js +40 -0
- package/packages/mcp/dist/tools/relay-remove-agent.d.ts +20 -0
- package/packages/mcp/dist/tools/relay-remove-agent.js +50 -0
- package/packages/mcp/package.json +2 -2
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/dist/types.d.ts +46 -1
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/client.d.ts +22 -1
- package/packages/sdk/dist/client.js +31 -0
- package/packages/sdk/dist/protocol/index.d.ts +1 -1
- package/packages/sdk/dist/protocol/types.d.ts +35 -1
- package/packages/sdk/package.json +2 -2
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/dist/adapter.d.ts +4 -0
- package/packages/storage/dist/sqlite-adapter.d.ts +10 -0
- package/packages/storage/dist/sqlite-adapter.js +26 -0
- package/packages/storage/package.json +2 -2
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/dist/update-checker.js +4 -0
- package/packages/utils/package.json +1 -1
- package/packages/wrapper/package.json +6 -6
- package/deploy/workspace/codex.config.toml +0 -20
- package/deploy/workspace/entrypoint-browser.sh +0 -118
- package/deploy/workspace/entrypoint.sh +0 -612
- package/deploy/workspace/gh-credential-relay +0 -90
- package/deploy/workspace/gh-relay +0 -156
- package/deploy/workspace/git-credential-relay +0 -330
- package/deploy/workspace/git-credential-relay.test.sh +0 -230
- package/dist/dashboard/out/404.html +0 -1
- package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
- package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
- package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
- package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
- package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
- package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
- package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
- package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
- package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
- package/dist/dashboard/out/alt-logos/logo.svg +0 -38
- package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
- package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
- package/dist/dashboard/out/app/onboarding.html +0 -1
- package/dist/dashboard/out/app/onboarding.txt +0 -7
- package/dist/dashboard/out/app.html +0 -1
- package/dist/dashboard/out/app.txt +0 -7
- package/dist/dashboard/out/apple-icon.png +0 -0
- package/dist/dashboard/out/cloud/link.html +0 -1
- package/dist/dashboard/out/cloud/link.txt +0 -7
- package/dist/dashboard/out/complete-profile.html +0 -5
- package/dist/dashboard/out/complete-profile.txt +0 -7
- package/dist/dashboard/out/connect-repos.html +0 -1
- package/dist/dashboard/out/connect-repos.txt +0 -7
- package/dist/dashboard/out/history.html +0 -1
- package/dist/dashboard/out/history.txt +0 -7
- package/dist/dashboard/out/index.html +0 -1
- package/dist/dashboard/out/index.txt +0 -7
- package/dist/dashboard/out/login.html +0 -5
- package/dist/dashboard/out/login.txt +0 -7
- package/dist/dashboard/out/metrics.html +0 -1
- package/dist/dashboard/out/metrics.txt +0 -7
- package/dist/dashboard/out/pricing.html +0 -13
- package/dist/dashboard/out/pricing.txt +0 -7
- package/dist/dashboard/out/providers/setup/claude.html +0 -1
- package/dist/dashboard/out/providers/setup/claude.txt +0 -8
- package/dist/dashboard/out/providers/setup/codex.html +0 -1
- package/dist/dashboard/out/providers/setup/codex.txt +0 -8
- package/dist/dashboard/out/providers/setup/cursor.html +0 -1
- package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
- package/dist/dashboard/out/providers.html +0 -1
- package/dist/dashboard/out/providers.txt +0 -7
- package/dist/dashboard/out/signup.html +0 -6
- package/dist/dashboard/out/signup.txt +0 -7
- package/dist/src/dashboard-server/index.d.ts +0 -8
- package/dist/src/dashboard-server/index.js +0 -8
- package/packages/dashboard/README.md +0 -48
- package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
- package/packages/dashboard/dist/health-worker-manager.js +0 -144
- package/packages/dashboard/dist/health-worker.d.ts +0 -9
- package/packages/dashboard/dist/health-worker.js +0 -79
- package/packages/dashboard/dist/index.d.ts +0 -20
- package/packages/dashboard/dist/index.js +0 -19
- package/packages/dashboard/dist/metrics.d.ts +0 -105
- package/packages/dashboard/dist/metrics.js +0 -193
- package/packages/dashboard/dist/needs-attention.d.ts +0 -24
- package/packages/dashboard/dist/needs-attention.js +0 -78
- package/packages/dashboard/dist/server.d.ts +0 -25
- package/packages/dashboard/dist/server.js +0 -5270
- package/packages/dashboard/dist/start.d.ts +0 -6
- package/packages/dashboard/dist/start.js +0 -13
- package/packages/dashboard/dist/types/threading.d.ts +0 -8
- package/packages/dashboard/dist/types/threading.js +0 -2
- package/packages/dashboard/dist/user-bridge.d.ts +0 -154
- package/packages/dashboard/dist/user-bridge.js +0 -372
- package/packages/dashboard/package.json +0 -65
- package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
- package/packages/dashboard/ui/app/app/page.tsx +0 -667
- package/packages/dashboard/ui/app/apple-icon.png +0 -0
- package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
- package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
- package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
- package/packages/dashboard/ui/app/favicon.png +0 -0
- package/packages/dashboard/ui/app/globals.css +0 -59
- package/packages/dashboard/ui/app/history/page.tsx +0 -658
- package/packages/dashboard/ui/app/layout.tsx +0 -25
- package/packages/dashboard/ui/app/login/page.tsx +0 -424
- package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
- package/packages/dashboard/ui/app/page.tsx +0 -59
- package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
- package/packages/dashboard/ui/app/providers/page.tsx +0 -193
- package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
- package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
- package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
- package/packages/dashboard/ui/app/signup/page.tsx +0 -533
- package/packages/dashboard/ui/index.ts +0 -49
- package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
- package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
- package/packages/dashboard/ui/landing/index.ts +0 -6
- package/packages/dashboard/ui/landing/styles.css +0 -2850
- package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
- package/packages/dashboard/ui/lib/api.ts +0 -1155
- package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
- package/packages/dashboard/ui/lib/colors.ts +0 -218
- package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
- package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
- package/packages/dashboard/ui/next-env.d.ts +0 -5
- package/packages/dashboard/ui/next.config.js +0 -41
- package/packages/dashboard/ui/package-lock.json +0 -2882
- package/packages/dashboard/ui/package.json +0 -33
- package/packages/dashboard/ui/postcss.config.js +0 -5
- package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
- package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
- package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
- package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
- package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
- package/packages/dashboard/ui/react-components/App.tsx +0 -3033
- package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
- package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
- package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
- package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
- package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
- package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
- package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
- package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
- package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
- package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
- package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
- package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
- package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
- package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
- package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
- package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
- package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
- package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
- package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
- package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
- package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
- package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
- package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
- package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
- package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
- package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
- package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
- package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
- package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
- package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
- package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
- package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
- package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
- package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
- package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
- package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
- package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
- package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
- package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
- package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
- package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
- package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
- package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
- package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
- package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
- package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
- package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
- package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
- package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
- package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
- package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
- package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
- package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
- package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
- package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
- package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
- package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
- package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
- package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
- package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
- package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
- package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
- package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
- package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
- package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
- package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
- package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
- package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
- package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
- package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
- package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
- package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
- package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
- package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
- package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
- package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
- package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
- package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
- package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
- package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
- package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
- package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
- package/packages/dashboard/ui/react-components/index.ts +0 -81
- package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
- package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
- package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
- package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
- package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
- package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
- package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
- package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
- package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
- package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
- package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
- package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
- package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
- package/packages/dashboard/ui/tailwind.config.js +0 -148
- package/packages/dashboard/ui/types/index.ts +0 -304
- package/packages/dashboard/ui/types/threading.ts +0 -7
- package/packages/dashboard/ui-dist/404.html +0 -1
- package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
- package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
- package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
- package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
- package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
- package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_buildManifest.js +0 -1
- package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_ssgManifest.js +0 -1
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
- package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
- package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
- package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
- package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
- package/packages/dashboard/ui-dist/app.html +0 -1
- package/packages/dashboard/ui-dist/app.txt +0 -7
- package/packages/dashboard/ui-dist/apple-icon.png +0 -0
- package/packages/dashboard/ui-dist/cloud/link.html +0 -1
- package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
- package/packages/dashboard/ui-dist/complete-profile.html +0 -5
- package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
- package/packages/dashboard/ui-dist/connect-repos.html +0 -1
- package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
- package/packages/dashboard/ui-dist/history.html +0 -1
- package/packages/dashboard/ui-dist/history.txt +0 -7
- package/packages/dashboard/ui-dist/index.html +0 -1
- package/packages/dashboard/ui-dist/index.txt +0 -7
- package/packages/dashboard/ui-dist/login.html +0 -5
- package/packages/dashboard/ui-dist/login.txt +0 -7
- package/packages/dashboard/ui-dist/metrics.html +0 -1
- package/packages/dashboard/ui-dist/metrics.txt +0 -7
- package/packages/dashboard/ui-dist/pricing.html +0 -13
- package/packages/dashboard/ui-dist/pricing.txt +0 -7
- package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
- package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
- package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
- package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
- package/packages/dashboard/ui-dist/providers.html +0 -1
- package/packages/dashboard/ui-dist/providers.txt +0 -7
- package/packages/dashboard/ui-dist/signup.html +0 -6
- package/packages/dashboard/ui-dist/signup.txt +0 -7
- package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
- package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
- package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
- package/packages/dashboard-server/dist/health-worker.js +0 -79
- package/packages/dashboard-server/dist/index.d.ts +0 -18
- package/packages/dashboard-server/dist/index.js +0 -17
- package/packages/dashboard-server/dist/metrics.d.ts +0 -105
- package/packages/dashboard-server/dist/metrics.js +0 -193
- package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
- package/packages/dashboard-server/dist/needs-attention.js +0 -78
- package/packages/dashboard-server/dist/server.d.ts +0 -25
- package/packages/dashboard-server/dist/server.js +0 -5158
- package/packages/dashboard-server/dist/start.d.ts +0 -6
- package/packages/dashboard-server/dist/start.js +0 -13
- package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
- package/packages/dashboard-server/dist/types/threading.js +0 -2
- package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
- package/packages/dashboard-server/dist/user-bridge.js +0 -390
- 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
|
-
};
|