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,697 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Channels API Service
|
|
3
|
-
*
|
|
4
|
-
* Channels are handled entirely by the daemon (not cloud).
|
|
5
|
-
* Real-time messaging uses the daemon's CHANNEL_* protocol while the HTTP API now reads from daemon storage.
|
|
6
|
-
*
|
|
7
|
-
* Cloud channels were removed because:
|
|
8
|
-
* - Daemon already has full channel protocol support (CHANNEL_JOIN, CHANNEL_MESSAGE, etc.)
|
|
9
|
-
* - Having two parallel implementations caused confusion
|
|
10
|
-
* - See trajectory traj_fnmapojrllau for architectural decision
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import type {
|
|
14
|
-
Channel,
|
|
15
|
-
ChannelMember,
|
|
16
|
-
ChannelMessage,
|
|
17
|
-
ListChannelsResponse,
|
|
18
|
-
GetChannelResponse,
|
|
19
|
-
GetMessagesResponse,
|
|
20
|
-
CreateChannelRequest,
|
|
21
|
-
CreateChannelResponse,
|
|
22
|
-
SendMessageRequest,
|
|
23
|
-
SendMessageResponse,
|
|
24
|
-
SearchResponse,
|
|
25
|
-
} from './types';
|
|
26
|
-
import { getCsrfToken, getApiUrl, initializeWorkspaceId } from '../../lib/api';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Get current username from localStorage or return default
|
|
30
|
-
*/
|
|
31
|
-
function getCurrentUsername(): string {
|
|
32
|
-
if (typeof window !== 'undefined') {
|
|
33
|
-
return localStorage.getItem('relay_username') || 'Dashboard';
|
|
34
|
-
}
|
|
35
|
-
return 'Dashboard';
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Custom error class for API errors
|
|
40
|
-
*/
|
|
41
|
-
export class ApiError extends Error {
|
|
42
|
-
constructor(
|
|
43
|
-
message: string,
|
|
44
|
-
public status: number,
|
|
45
|
-
public body?: string
|
|
46
|
-
) {
|
|
47
|
-
super(message);
|
|
48
|
-
this.name = 'ApiError';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// =============================================================================
|
|
53
|
-
// Channel API Functions - daemon-backed with minimal placeholders
|
|
54
|
-
// =============================================================================
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* List all channels for a workspace
|
|
58
|
-
* Channels are workspace-scoped, not user-scoped
|
|
59
|
-
*/
|
|
60
|
-
export async function listChannels(workspaceId?: string): Promise<ListChannelsResponse> {
|
|
61
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
62
|
-
initializeWorkspaceId();
|
|
63
|
-
const params = new URLSearchParams();
|
|
64
|
-
// workspaceId is required for cloud mode
|
|
65
|
-
if (workspaceId) {
|
|
66
|
-
params.set('workspaceId', workspaceId);
|
|
67
|
-
}
|
|
68
|
-
const url = getApiUrl(`/api/channels?${params.toString()}`);
|
|
69
|
-
|
|
70
|
-
try {
|
|
71
|
-
const res = await fetch(url, {
|
|
72
|
-
method: 'GET',
|
|
73
|
-
headers: { 'Content-Type': 'application/json' },
|
|
74
|
-
credentials: 'include',
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
if (!res.ok) {
|
|
78
|
-
throw new ApiError('Failed to fetch channels', res.status);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const json = await res.json() as { channels?: Channel[]; archivedChannels?: Channel[] };
|
|
82
|
-
return {
|
|
83
|
-
channels: json.channels ?? [],
|
|
84
|
-
archivedChannels: json.archivedChannels ?? [],
|
|
85
|
-
};
|
|
86
|
-
} catch (error) {
|
|
87
|
-
if (error instanceof ApiError) throw error;
|
|
88
|
-
throw new ApiError('Network error fetching channels', 0);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get channel details and members
|
|
94
|
-
*/
|
|
95
|
-
export async function getChannel(
|
|
96
|
-
_workspaceId: string,
|
|
97
|
-
channelId: string
|
|
98
|
-
): Promise<GetChannelResponse> {
|
|
99
|
-
// Minimal channel details until daemon exposes metadata
|
|
100
|
-
return {
|
|
101
|
-
channel: {
|
|
102
|
-
id: channelId,
|
|
103
|
-
name: channelId.startsWith('#') ? channelId.slice(1) : channelId,
|
|
104
|
-
visibility: 'public',
|
|
105
|
-
status: 'active',
|
|
106
|
-
createdAt: new Date().toISOString(),
|
|
107
|
-
createdBy: getCurrentUsername(),
|
|
108
|
-
memberCount: 0,
|
|
109
|
-
unreadCount: 0,
|
|
110
|
-
hasMentions: false,
|
|
111
|
-
isDm: channelId.startsWith('dm:'),
|
|
112
|
-
},
|
|
113
|
-
members: [],
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Get messages in a channel
|
|
119
|
-
*/
|
|
120
|
-
export async function getMessages(
|
|
121
|
-
workspaceId: string,
|
|
122
|
-
channelId: string,
|
|
123
|
-
options?: { before?: string; limit?: number; threadId?: string }
|
|
124
|
-
): Promise<GetMessagesResponse> {
|
|
125
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
126
|
-
initializeWorkspaceId();
|
|
127
|
-
const params = new URLSearchParams();
|
|
128
|
-
if (options?.limit) params.set('limit', String(options.limit));
|
|
129
|
-
if (options?.before) {
|
|
130
|
-
// convert ISO to timestamp for server query
|
|
131
|
-
const ts = Date.parse(options.before);
|
|
132
|
-
if (!Number.isNaN(ts)) params.set('before', String(ts));
|
|
133
|
-
}
|
|
134
|
-
if (workspaceId) {
|
|
135
|
-
params.set('workspaceId', workspaceId);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const url = `/api/channels/${encodeURIComponent(channelId)}/messages${params.toString() ? `?${params.toString()}` : ''}`;
|
|
139
|
-
const res = await fetch(getApiUrl(url), {
|
|
140
|
-
method: 'GET',
|
|
141
|
-
headers: { 'Content-Type': 'application/json' },
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
if (!res.ok) {
|
|
145
|
-
throw new ApiError('Failed to fetch channel messages', res.status);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const json = await res.json() as { messages: Array<ChannelMessage>; hasMore?: boolean };
|
|
149
|
-
return {
|
|
150
|
-
messages: json.messages ?? [],
|
|
151
|
-
hasMore: Boolean(json.hasMore),
|
|
152
|
-
unread: { count: 0 },
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Create a new channel
|
|
158
|
-
*/
|
|
159
|
-
export async function createChannel(
|
|
160
|
-
workspaceId: string,
|
|
161
|
-
request: CreateChannelRequest
|
|
162
|
-
): Promise<CreateChannelResponse> {
|
|
163
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
164
|
-
initializeWorkspaceId();
|
|
165
|
-
|
|
166
|
-
try {
|
|
167
|
-
const csrfToken = getCsrfToken();
|
|
168
|
-
const headers: Record<string, string> = { 'Content-Type': 'application/json' };
|
|
169
|
-
if (csrfToken) {
|
|
170
|
-
headers['X-CSRF-Token'] = csrfToken;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const response = await fetch(getApiUrl('/api/channels'), {
|
|
174
|
-
method: 'POST',
|
|
175
|
-
headers,
|
|
176
|
-
credentials: 'include',
|
|
177
|
-
body: JSON.stringify({
|
|
178
|
-
name: request.name,
|
|
179
|
-
description: request.description,
|
|
180
|
-
isPrivate: request.visibility === 'private',
|
|
181
|
-
invites: request.members, // Array of strings or {id, type} objects
|
|
182
|
-
workspaceId,
|
|
183
|
-
}),
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
if (!response.ok) {
|
|
187
|
-
const error = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
188
|
-
throw new ApiError(error.error || 'Failed to create channel', response.status);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const result = await response.json() as {
|
|
192
|
-
success: boolean;
|
|
193
|
-
channel: {
|
|
194
|
-
id: string;
|
|
195
|
-
name: string;
|
|
196
|
-
description?: string;
|
|
197
|
-
visibility: 'public' | 'private';
|
|
198
|
-
status: string;
|
|
199
|
-
createdAt: string;
|
|
200
|
-
createdBy: string;
|
|
201
|
-
};
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
return {
|
|
205
|
-
channel: {
|
|
206
|
-
id: result.channel.id,
|
|
207
|
-
name: result.channel.name,
|
|
208
|
-
description: result.channel.description,
|
|
209
|
-
visibility: result.channel.visibility,
|
|
210
|
-
status: result.channel.status as 'active' | 'archived',
|
|
211
|
-
createdAt: result.channel.createdAt,
|
|
212
|
-
createdBy: result.channel.createdBy,
|
|
213
|
-
memberCount: 1,
|
|
214
|
-
unreadCount: 0,
|
|
215
|
-
hasMentions: false,
|
|
216
|
-
isDm: false,
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
} catch (error) {
|
|
220
|
-
if (error instanceof ApiError) throw error;
|
|
221
|
-
throw new ApiError('Network error creating channel', 0);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Send a message to a channel via daemon API
|
|
227
|
-
*/
|
|
228
|
-
export async function sendMessage(
|
|
229
|
-
workspaceId: string,
|
|
230
|
-
channelId: string,
|
|
231
|
-
request: SendMessageRequest
|
|
232
|
-
): Promise<SendMessageResponse> {
|
|
233
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
234
|
-
initializeWorkspaceId();
|
|
235
|
-
const username = getCurrentUsername();
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
const response = await fetch(getApiUrl('/api/channels/message'), {
|
|
239
|
-
method: 'POST',
|
|
240
|
-
headers: { 'Content-Type': 'application/json' },
|
|
241
|
-
body: JSON.stringify({
|
|
242
|
-
username,
|
|
243
|
-
channel: channelId,
|
|
244
|
-
body: request.content,
|
|
245
|
-
thread: request.threadId,
|
|
246
|
-
workspaceId,
|
|
247
|
-
}),
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
if (!response.ok) {
|
|
251
|
-
const error = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
252
|
-
throw new ApiError(error.error || 'Failed to send message', response.status);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Return optimistic message for immediate UI update
|
|
256
|
-
// Real message will come via WebSocket
|
|
257
|
-
return {
|
|
258
|
-
message: {
|
|
259
|
-
id: `pending-${Date.now()}`,
|
|
260
|
-
channelId,
|
|
261
|
-
from: username,
|
|
262
|
-
fromEntityType: 'user',
|
|
263
|
-
content: request.content,
|
|
264
|
-
timestamp: new Date().toISOString(),
|
|
265
|
-
threadId: request.threadId,
|
|
266
|
-
isRead: true,
|
|
267
|
-
},
|
|
268
|
-
};
|
|
269
|
-
} catch (error) {
|
|
270
|
-
if (error instanceof ApiError) throw error;
|
|
271
|
-
throw new ApiError('Network error sending message', 0);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Join a channel via daemon API
|
|
277
|
-
*/
|
|
278
|
-
export async function joinChannel(
|
|
279
|
-
workspaceId: string,
|
|
280
|
-
channelId: string
|
|
281
|
-
): Promise<Channel> {
|
|
282
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
283
|
-
initializeWorkspaceId();
|
|
284
|
-
const username = getCurrentUsername();
|
|
285
|
-
|
|
286
|
-
try {
|
|
287
|
-
const response = await fetch(getApiUrl('/api/channels/join'), {
|
|
288
|
-
method: 'POST',
|
|
289
|
-
headers: { 'Content-Type': 'application/json' },
|
|
290
|
-
body: JSON.stringify({ username, channel: channelId, workspaceId }),
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
if (!response.ok) {
|
|
294
|
-
const error = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
295
|
-
throw new ApiError(error.error || 'Failed to join channel', response.status);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
return {
|
|
299
|
-
id: channelId,
|
|
300
|
-
name: channelId.startsWith('#') ? channelId.slice(1) : channelId,
|
|
301
|
-
visibility: 'public',
|
|
302
|
-
status: 'active',
|
|
303
|
-
createdAt: new Date().toISOString(),
|
|
304
|
-
createdBy: username,
|
|
305
|
-
memberCount: 1,
|
|
306
|
-
unreadCount: 0,
|
|
307
|
-
hasMentions: false,
|
|
308
|
-
isDm: channelId.startsWith('dm:'),
|
|
309
|
-
};
|
|
310
|
-
} catch (error) {
|
|
311
|
-
if (error instanceof ApiError) throw error;
|
|
312
|
-
throw new ApiError('Network error joining channel', 0);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Leave a channel via daemon API
|
|
318
|
-
*/
|
|
319
|
-
export async function leaveChannel(
|
|
320
|
-
workspaceId: string,
|
|
321
|
-
channelId: string
|
|
322
|
-
): Promise<void> {
|
|
323
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
324
|
-
initializeWorkspaceId();
|
|
325
|
-
const username = getCurrentUsername();
|
|
326
|
-
|
|
327
|
-
try {
|
|
328
|
-
const response = await fetch(getApiUrl('/api/channels/leave'), {
|
|
329
|
-
method: 'POST',
|
|
330
|
-
headers: { 'Content-Type': 'application/json' },
|
|
331
|
-
body: JSON.stringify({ username, channel: channelId, workspaceId }),
|
|
332
|
-
});
|
|
333
|
-
|
|
334
|
-
if (!response.ok) {
|
|
335
|
-
const error = await response.json().catch(() => ({ error: 'Unknown error' }));
|
|
336
|
-
throw new ApiError(error.error || 'Failed to leave channel', response.status);
|
|
337
|
-
}
|
|
338
|
-
} catch (error) {
|
|
339
|
-
if (error instanceof ApiError) throw error;
|
|
340
|
-
throw new ApiError('Network error leaving channel', 0);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Archive a channel
|
|
346
|
-
*/
|
|
347
|
-
export async function archiveChannel(
|
|
348
|
-
workspaceId: string,
|
|
349
|
-
channelId: string
|
|
350
|
-
): Promise<Channel> {
|
|
351
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
352
|
-
initializeWorkspaceId();
|
|
353
|
-
const res = await fetch(getApiUrl('/api/channels/archive'), {
|
|
354
|
-
method: 'POST',
|
|
355
|
-
headers: { 'Content-Type': 'application/json' },
|
|
356
|
-
body: JSON.stringify({ channel: channelId, workspaceId }),
|
|
357
|
-
});
|
|
358
|
-
if (!res.ok) {
|
|
359
|
-
throw new ApiError('Failed to archive channel', res.status);
|
|
360
|
-
}
|
|
361
|
-
return {
|
|
362
|
-
id: channelId,
|
|
363
|
-
name: channelId.startsWith('#') ? channelId.slice(1) : channelId,
|
|
364
|
-
visibility: 'public',
|
|
365
|
-
status: 'archived',
|
|
366
|
-
createdAt: new Date().toISOString(),
|
|
367
|
-
createdBy: getCurrentUsername(),
|
|
368
|
-
memberCount: 0,
|
|
369
|
-
unreadCount: 0,
|
|
370
|
-
hasMentions: false,
|
|
371
|
-
isDm: channelId.startsWith('dm:'),
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Unarchive a channel
|
|
377
|
-
*/
|
|
378
|
-
export async function unarchiveChannel(
|
|
379
|
-
workspaceId: string,
|
|
380
|
-
channelId: string
|
|
381
|
-
): Promise<Channel> {
|
|
382
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
383
|
-
initializeWorkspaceId();
|
|
384
|
-
const res = await fetch(getApiUrl('/api/channels/unarchive'), {
|
|
385
|
-
method: 'POST',
|
|
386
|
-
headers: { 'Content-Type': 'application/json' },
|
|
387
|
-
body: JSON.stringify({ channel: channelId, workspaceId }),
|
|
388
|
-
});
|
|
389
|
-
if (!res.ok) {
|
|
390
|
-
throw new ApiError('Failed to unarchive channel', res.status);
|
|
391
|
-
}
|
|
392
|
-
return {
|
|
393
|
-
id: channelId,
|
|
394
|
-
name: channelId.startsWith('#') ? channelId.slice(1) : channelId,
|
|
395
|
-
visibility: 'public',
|
|
396
|
-
status: 'active',
|
|
397
|
-
createdAt: new Date().toISOString(),
|
|
398
|
-
createdBy: getCurrentUsername(),
|
|
399
|
-
memberCount: 0,
|
|
400
|
-
unreadCount: 0,
|
|
401
|
-
hasMentions: false,
|
|
402
|
-
isDm: channelId.startsWith('dm:'),
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Delete a channel (permanent)
|
|
408
|
-
*/
|
|
409
|
-
export async function deleteChannel(
|
|
410
|
-
_workspaceId: string,
|
|
411
|
-
_channelId: string
|
|
412
|
-
): Promise<void> {
|
|
413
|
-
// Daemon deletes automatically when empty; nothing to do client-side
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* Mark messages as read
|
|
419
|
-
*/
|
|
420
|
-
export async function markRead(
|
|
421
|
-
_workspaceId: string,
|
|
422
|
-
_channelId: string,
|
|
423
|
-
_upToMessageId?: string
|
|
424
|
-
): Promise<void> {
|
|
425
|
-
// TODO: add mark-read to daemon; no-op for now
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Pin a message (no-op in daemon mode)
|
|
431
|
-
*/
|
|
432
|
-
export async function pinMessage(
|
|
433
|
-
_workspaceId: string,
|
|
434
|
-
_channelId: string,
|
|
435
|
-
_messageId: string
|
|
436
|
-
): Promise<void> {
|
|
437
|
-
// Pinning not supported in daemon mode
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Unpin a message (no-op in daemon mode)
|
|
443
|
-
*/
|
|
444
|
-
export async function unpinMessage(
|
|
445
|
-
_workspaceId: string,
|
|
446
|
-
_channelId: string,
|
|
447
|
-
_messageId: string
|
|
448
|
-
): Promise<void> {
|
|
449
|
-
// Unpinning not supported in daemon mode
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/**
|
|
454
|
-
* Get mention suggestions (online agents/users)
|
|
455
|
-
*/
|
|
456
|
-
export async function getMentionSuggestions(
|
|
457
|
-
_workspaceId?: string
|
|
458
|
-
): Promise<string[]> {
|
|
459
|
-
return ['lead', 'frontend', 'reviewer', 'ops', 'qa'];
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
/**
|
|
463
|
-
* Available member for channel invites
|
|
464
|
-
*/
|
|
465
|
-
export interface AvailableMember {
|
|
466
|
-
id: string;
|
|
467
|
-
displayName: string;
|
|
468
|
-
type: 'user' | 'agent';
|
|
469
|
-
avatarUrl?: string;
|
|
470
|
-
status?: string;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
/**
|
|
474
|
-
* Get available members for channel invites
|
|
475
|
-
* Returns workspace members (humans) and agents from linked daemons
|
|
476
|
-
*/
|
|
477
|
-
export async function getAvailableMembers(
|
|
478
|
-
workspaceId?: string
|
|
479
|
-
): Promise<{ members: AvailableMember[]; agents: AvailableMember[] }> {
|
|
480
|
-
// Ensure workspace ID is initialized for proper URL routing
|
|
481
|
-
initializeWorkspaceId();
|
|
482
|
-
const params = new URLSearchParams();
|
|
483
|
-
if (workspaceId) {
|
|
484
|
-
params.set('workspaceId', workspaceId);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
try {
|
|
488
|
-
const url = getApiUrl(`/api/channels/available-members?${params.toString()}`);
|
|
489
|
-
const res = await fetch(url, {
|
|
490
|
-
method: 'GET',
|
|
491
|
-
headers: { 'Content-Type': 'application/json' },
|
|
492
|
-
credentials: 'include',
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
if (!res.ok) {
|
|
496
|
-
console.error('[ChannelsAPI] Failed to fetch available members:', res.status);
|
|
497
|
-
return { members: [], agents: [] };
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
const json = await res.json() as { members?: AvailableMember[]; agents?: AvailableMember[] };
|
|
501
|
-
return {
|
|
502
|
-
members: json.members ?? [],
|
|
503
|
-
agents: json.agents ?? [],
|
|
504
|
-
};
|
|
505
|
-
} catch (error) {
|
|
506
|
-
console.error('[ChannelsAPI] Error fetching available members:', error);
|
|
507
|
-
return { members: [], agents: [] };
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// =============================================================================
|
|
512
|
-
// Search API Functions
|
|
513
|
-
// =============================================================================
|
|
514
|
-
|
|
515
|
-
/**
|
|
516
|
-
* Search messages (returns empty in daemon mode - search via relay)
|
|
517
|
-
*/
|
|
518
|
-
export async function searchMessages(
|
|
519
|
-
_workspaceId: string,
|
|
520
|
-
query: string,
|
|
521
|
-
_options?: { channelId?: string; limit?: number; offset?: number }
|
|
522
|
-
): Promise<SearchResponse> {
|
|
523
|
-
// Search not implemented in daemon mode
|
|
524
|
-
return {
|
|
525
|
-
results: [],
|
|
526
|
-
total: 0,
|
|
527
|
-
hasMore: false,
|
|
528
|
-
query,
|
|
529
|
-
};
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
/**
|
|
533
|
-
* Search within a specific channel
|
|
534
|
-
*/
|
|
535
|
-
export async function searchChannel(
|
|
536
|
-
workspaceId: string,
|
|
537
|
-
channelId: string,
|
|
538
|
-
query: string,
|
|
539
|
-
options?: { limit?: number; offset?: number }
|
|
540
|
-
): Promise<SearchResponse> {
|
|
541
|
-
return searchMessages(workspaceId, query, { ...options, channelId });
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
// =============================================================================
|
|
545
|
-
// Admin API Functions
|
|
546
|
-
// =============================================================================
|
|
547
|
-
|
|
548
|
-
/**
|
|
549
|
-
* Update channel settings
|
|
550
|
-
*/
|
|
551
|
-
export async function updateChannel(
|
|
552
|
-
_workspaceId: string,
|
|
553
|
-
channelId: string,
|
|
554
|
-
updates: { name?: string; description?: string; isPrivate?: boolean }
|
|
555
|
-
): Promise<Channel> {
|
|
556
|
-
const channel: Channel = {
|
|
557
|
-
id: channelId,
|
|
558
|
-
name: channelId.startsWith('#') ? channelId.slice(1) : channelId,
|
|
559
|
-
description: updates.description,
|
|
560
|
-
visibility: updates.isPrivate ? 'private' : 'public',
|
|
561
|
-
status: 'active',
|
|
562
|
-
createdAt: new Date().toISOString(),
|
|
563
|
-
createdBy: getCurrentUsername(),
|
|
564
|
-
memberCount: 0,
|
|
565
|
-
unreadCount: 0,
|
|
566
|
-
hasMentions: false,
|
|
567
|
-
isDm: channelId.startsWith('dm:'),
|
|
568
|
-
};
|
|
569
|
-
return {
|
|
570
|
-
...channel,
|
|
571
|
-
name: updates.name ?? channel.name,
|
|
572
|
-
};
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
/**
|
|
576
|
-
* Add a member to a channel
|
|
577
|
-
*/
|
|
578
|
-
export async function addMember(
|
|
579
|
-
_workspaceId: string,
|
|
580
|
-
_channelId: string,
|
|
581
|
-
request: { memberId: string; memberType: 'user' | 'agent'; role?: 'admin' | 'member' | 'read_only' }
|
|
582
|
-
): Promise<ChannelMember> {
|
|
583
|
-
return {
|
|
584
|
-
id: request.memberId,
|
|
585
|
-
displayName: request.memberId,
|
|
586
|
-
entityType: request.memberType,
|
|
587
|
-
role: request.role === 'admin' ? 'admin' : 'member',
|
|
588
|
-
status: 'offline',
|
|
589
|
-
joinedAt: new Date().toISOString(),
|
|
590
|
-
};
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
/**
|
|
594
|
-
* Remove a member from a channel
|
|
595
|
-
*/
|
|
596
|
-
export async function removeMember(
|
|
597
|
-
_workspaceId: string,
|
|
598
|
-
channelId: string,
|
|
599
|
-
memberId: string,
|
|
600
|
-
_memberType: 'user' | 'agent'
|
|
601
|
-
): Promise<void> {
|
|
602
|
-
const url = getApiUrl('/api/channels/admin-remove');
|
|
603
|
-
const response = await fetch(url, {
|
|
604
|
-
method: 'POST',
|
|
605
|
-
headers: { 'Content-Type': 'application/json' },
|
|
606
|
-
body: JSON.stringify({
|
|
607
|
-
channel: channelId.startsWith('#') ? channelId : `#${channelId}`,
|
|
608
|
-
member: memberId,
|
|
609
|
-
}),
|
|
610
|
-
});
|
|
611
|
-
if (!response.ok) {
|
|
612
|
-
const error = await response.json().catch(() => ({}));
|
|
613
|
-
throw new ApiError(error.error || 'Failed to remove member', response.status);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
/**
|
|
618
|
-
* Update a member's role
|
|
619
|
-
*/
|
|
620
|
-
export async function updateMemberRole(
|
|
621
|
-
_workspaceId: string,
|
|
622
|
-
_channelId: string,
|
|
623
|
-
memberId: string,
|
|
624
|
-
request: { role: 'admin' | 'member' | 'read_only'; memberType: 'user' | 'agent' }
|
|
625
|
-
): Promise<ChannelMember> {
|
|
626
|
-
return {
|
|
627
|
-
id: memberId,
|
|
628
|
-
displayName: memberId,
|
|
629
|
-
entityType: request.memberType,
|
|
630
|
-
role: request.role === 'admin' ? 'admin' : 'member',
|
|
631
|
-
status: 'offline',
|
|
632
|
-
joinedAt: new Date().toISOString(),
|
|
633
|
-
};
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
/**
|
|
637
|
-
* Get all members of a channel
|
|
638
|
-
*/
|
|
639
|
-
export async function getChannelMembers(
|
|
640
|
-
_workspaceId: string,
|
|
641
|
-
channelId: string
|
|
642
|
-
): Promise<ChannelMember[]> {
|
|
643
|
-
try {
|
|
644
|
-
const url = getApiUrl(`/api/channels/${encodeURIComponent(channelId)}/members`);
|
|
645
|
-
const response = await fetch(url, {
|
|
646
|
-
method: 'GET',
|
|
647
|
-
headers: { 'Content-Type': 'application/json' },
|
|
648
|
-
});
|
|
649
|
-
if (!response.ok) {
|
|
650
|
-
console.warn('[ChannelsAPI] Failed to get channel members:', response.statusText);
|
|
651
|
-
// Fall back to just returning current user
|
|
652
|
-
return [{
|
|
653
|
-
id: getCurrentUsername(),
|
|
654
|
-
displayName: getCurrentUsername(),
|
|
655
|
-
entityType: 'user',
|
|
656
|
-
role: 'owner',
|
|
657
|
-
status: 'online',
|
|
658
|
-
joinedAt: new Date().toISOString(),
|
|
659
|
-
}];
|
|
660
|
-
}
|
|
661
|
-
const data = await response.json();
|
|
662
|
-
return data.members || [];
|
|
663
|
-
} catch (error) {
|
|
664
|
-
console.error('[ChannelsAPI] Error getting channel members:', error);
|
|
665
|
-
// Fall back to just returning current user
|
|
666
|
-
return [{
|
|
667
|
-
id: getCurrentUsername(),
|
|
668
|
-
displayName: getCurrentUsername(),
|
|
669
|
-
entityType: 'user',
|
|
670
|
-
role: 'owner',
|
|
671
|
-
status: 'online',
|
|
672
|
-
joinedAt: new Date().toISOString(),
|
|
673
|
-
}];
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// =============================================================================
|
|
678
|
-
// Feature Flag Utilities (kept for API compatibility)
|
|
679
|
-
// =============================================================================
|
|
680
|
-
|
|
681
|
-
/**
|
|
682
|
-
* Always returns true - channels now only use daemon/relay
|
|
683
|
-
*/
|
|
684
|
-
export function isRealApiEnabled(): boolean {
|
|
685
|
-
return true;
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
/**
|
|
689
|
-
* No-op - API mode is fixed to daemon/local
|
|
690
|
-
*/
|
|
691
|
-
export function setApiMode(_useReal: boolean): void {
|
|
692
|
-
console.log('[ChannelsAPI] Mode is fixed to daemon-based implementation');
|
|
693
|
-
}
|
|
694
|
-
|
|
695
|
-
export function getApiMode(): 'real' | 'mock' {
|
|
696
|
-
return 'real';
|
|
697
|
-
}
|