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,394 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useAgentLogs Hook
|
|
3
|
-
*
|
|
4
|
-
* React hook for streaming live PTY output from agents via WebSocket.
|
|
5
|
-
* Connects to the agent log streaming endpoint and provides real-time updates.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
9
|
-
|
|
10
|
-
export interface LogLine {
|
|
11
|
-
id: string;
|
|
12
|
-
timestamp: number;
|
|
13
|
-
content: string;
|
|
14
|
-
type: 'stdout' | 'stderr' | 'system' | 'input';
|
|
15
|
-
agentName?: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface UseAgentLogsOptions {
|
|
19
|
-
agentName: string;
|
|
20
|
-
/** Maximum number of lines to keep in buffer */
|
|
21
|
-
maxLines?: number;
|
|
22
|
-
/** Auto-connect on mount */
|
|
23
|
-
autoConnect?: boolean;
|
|
24
|
-
/** Enable reconnection on disconnect */
|
|
25
|
-
reconnect?: boolean;
|
|
26
|
-
/** Maximum reconnection attempts */
|
|
27
|
-
maxReconnectAttempts?: number;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface UseAgentLogsReturn {
|
|
31
|
-
logs: LogLine[];
|
|
32
|
-
isConnected: boolean;
|
|
33
|
-
isConnecting: boolean;
|
|
34
|
-
error: Error | null;
|
|
35
|
-
connect: () => void;
|
|
36
|
-
disconnect: () => void;
|
|
37
|
-
clear: () => void;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Get WebSocket URL for agent log streaming
|
|
42
|
-
*/
|
|
43
|
-
function getLogStreamUrl(agentName: string): string {
|
|
44
|
-
const path = `/ws/logs/${encodeURIComponent(agentName)}`;
|
|
45
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
46
|
-
|
|
47
|
-
// Server-side / tests: assume dashboard server is running locally on dev port
|
|
48
|
-
if (typeof window === 'undefined') {
|
|
49
|
-
return `ws://localhost:3889${path}`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
53
|
-
const { hostname, port } = window.location;
|
|
54
|
-
|
|
55
|
-
// Next.js dev runs the UI on 3888 with the dashboard server on 3889 (rewrites
|
|
56
|
-
// don't support WS upgrades). Only reroute in development to avoid breaking
|
|
57
|
-
// production deployments that also bind to 3888.
|
|
58
|
-
if (isDev && port === '3888') {
|
|
59
|
-
const host = hostname || 'localhost';
|
|
60
|
-
return `${protocol}//${host}:3889${path}`;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return `${protocol}//${window.location.host}${path}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Generate a unique ID for log lines
|
|
68
|
-
*/
|
|
69
|
-
let logIdCounter = 0;
|
|
70
|
-
function generateLogId(): string {
|
|
71
|
-
return `log-${Date.now()}-${++logIdCounter}`;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function useAgentLogs(options: UseAgentLogsOptions): UseAgentLogsReturn {
|
|
75
|
-
const {
|
|
76
|
-
agentName,
|
|
77
|
-
maxLines = 5000,
|
|
78
|
-
autoConnect = true,
|
|
79
|
-
reconnect = true,
|
|
80
|
-
maxReconnectAttempts = Infinity,
|
|
81
|
-
} = options;
|
|
82
|
-
|
|
83
|
-
const [logs, setLogs] = useState<LogLine[]>([]);
|
|
84
|
-
const [isConnected, setIsConnected] = useState(false);
|
|
85
|
-
const [isConnecting, setIsConnecting] = useState(false);
|
|
86
|
-
const [error, setError] = useState<Error | null>(null);
|
|
87
|
-
|
|
88
|
-
const wsRef = useRef<WebSocket | null>(null);
|
|
89
|
-
const reconnectAttemptsRef = useRef(0);
|
|
90
|
-
const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
91
|
-
const agentNameRef = useRef(agentName);
|
|
92
|
-
const shouldReconnectRef = useRef(true);
|
|
93
|
-
const isConnectingRef = useRef(false);
|
|
94
|
-
// Track manual close state per-WebSocket instance to avoid race conditions
|
|
95
|
-
// when React remounts quickly (e.g., StrictMode). Using WeakMap ensures
|
|
96
|
-
// each WebSocket tracks its own "was this a manual close" state.
|
|
97
|
-
const manualCloseMapRef = useRef(new WeakMap<WebSocket, boolean>());
|
|
98
|
-
// Track if we've successfully received data per-WebSocket instance
|
|
99
|
-
const hasReceivedDataMapRef = useRef(new WeakMap<WebSocket, boolean>());
|
|
100
|
-
|
|
101
|
-
// Keep agent name ref updated
|
|
102
|
-
agentNameRef.current = agentName;
|
|
103
|
-
|
|
104
|
-
const connect = useCallback(() => {
|
|
105
|
-
// Ensure reconnects are allowed for this session
|
|
106
|
-
shouldReconnectRef.current = true;
|
|
107
|
-
|
|
108
|
-
// Prevent multiple connections - use ref to avoid dependency on state
|
|
109
|
-
if (wsRef.current?.readyState === WebSocket.OPEN ||
|
|
110
|
-
wsRef.current?.readyState === WebSocket.CONNECTING ||
|
|
111
|
-
isConnectingRef.current) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
isConnectingRef.current = true;
|
|
116
|
-
setIsConnecting(true);
|
|
117
|
-
setError(null);
|
|
118
|
-
|
|
119
|
-
const url = getLogStreamUrl(agentNameRef.current);
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
const ws = new WebSocket(url);
|
|
123
|
-
wsRef.current = ws;
|
|
124
|
-
// Initialize per-WebSocket state
|
|
125
|
-
manualCloseMapRef.current.set(ws, false);
|
|
126
|
-
hasReceivedDataMapRef.current.set(ws, false);
|
|
127
|
-
|
|
128
|
-
ws.onopen = () => {
|
|
129
|
-
isConnectingRef.current = false;
|
|
130
|
-
setIsConnected(true);
|
|
131
|
-
setIsConnecting(false);
|
|
132
|
-
setError(null);
|
|
133
|
-
reconnectAttemptsRef.current = 0;
|
|
134
|
-
|
|
135
|
-
// Add system message for connection
|
|
136
|
-
setLogs((prev) => [
|
|
137
|
-
...prev,
|
|
138
|
-
{
|
|
139
|
-
id: generateLogId(),
|
|
140
|
-
timestamp: Date.now(),
|
|
141
|
-
content: `Connected to ${agentNameRef.current} log stream`,
|
|
142
|
-
type: 'system',
|
|
143
|
-
agentName: agentNameRef.current,
|
|
144
|
-
},
|
|
145
|
-
]);
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
ws.onclose = (event) => {
|
|
149
|
-
// Read per-WebSocket state (isolated from other connections)
|
|
150
|
-
const wasManualClose = manualCloseMapRef.current.get(ws) ?? false;
|
|
151
|
-
const hadReceivedData = hasReceivedDataMapRef.current.get(ws) ?? false;
|
|
152
|
-
|
|
153
|
-
isConnectingRef.current = false;
|
|
154
|
-
setIsConnected(false);
|
|
155
|
-
setIsConnecting(false);
|
|
156
|
-
wsRef.current = null;
|
|
157
|
-
|
|
158
|
-
// Clear any pending reconnect when a close happens
|
|
159
|
-
if (reconnectTimeoutRef.current) {
|
|
160
|
-
clearTimeout(reconnectTimeoutRef.current);
|
|
161
|
-
reconnectTimeoutRef.current = null;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Skip logging/reconnecting for intentional disconnects (cleanup, user toggle)
|
|
165
|
-
if (wasManualClose) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Don't reconnect if agent was not found (custom close code 4404)
|
|
170
|
-
// This prevents infinite reconnect loops for non-existent agents
|
|
171
|
-
if (event.code === 4404) {
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Add system message for disconnection, but only if:
|
|
176
|
-
// 1. The close was not clean (code 1006 or similar)
|
|
177
|
-
// 2. We had actually received data (to avoid false positives from transient connection issues)
|
|
178
|
-
// Code 1006 is very common and happens during normal operations (React remounts,
|
|
179
|
-
// network hiccups, etc.) - only show error if we had an established data stream
|
|
180
|
-
if (!event.wasClean && hadReceivedData) {
|
|
181
|
-
const willReconnect =
|
|
182
|
-
shouldReconnectRef.current &&
|
|
183
|
-
reconnect &&
|
|
184
|
-
reconnectAttemptsRef.current < maxReconnectAttempts;
|
|
185
|
-
|
|
186
|
-
setLogs((prev) => [
|
|
187
|
-
...prev,
|
|
188
|
-
{
|
|
189
|
-
id: generateLogId(),
|
|
190
|
-
timestamp: Date.now(),
|
|
191
|
-
content: willReconnect
|
|
192
|
-
? `Lost connection to log stream (code: ${event.code}). Reconnecting...`
|
|
193
|
-
: `Disconnected from log stream (code: ${event.code})`,
|
|
194
|
-
type: 'system',
|
|
195
|
-
agentName: agentNameRef.current,
|
|
196
|
-
},
|
|
197
|
-
]);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Schedule reconnect if enabled
|
|
201
|
-
if (
|
|
202
|
-
shouldReconnectRef.current &&
|
|
203
|
-
reconnect &&
|
|
204
|
-
reconnectAttemptsRef.current < maxReconnectAttempts
|
|
205
|
-
) {
|
|
206
|
-
const delay = Math.min(
|
|
207
|
-
1000 * Math.pow(2, reconnectAttemptsRef.current),
|
|
208
|
-
30000
|
|
209
|
-
);
|
|
210
|
-
reconnectAttemptsRef.current++;
|
|
211
|
-
|
|
212
|
-
reconnectTimeoutRef.current = setTimeout(() => {
|
|
213
|
-
connect();
|
|
214
|
-
}, delay);
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
ws.onerror = () => {
|
|
219
|
-
isConnectingRef.current = false;
|
|
220
|
-
setError(new Error('WebSocket connection error'));
|
|
221
|
-
setIsConnecting(false);
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
ws.onmessage = (event) => {
|
|
225
|
-
try {
|
|
226
|
-
const data = JSON.parse(event.data);
|
|
227
|
-
|
|
228
|
-
// Handle error messages from server
|
|
229
|
-
if (data.type === 'error') {
|
|
230
|
-
setError(new Error(data.error || `Failed to stream logs for ${data.agent || agentNameRef.current}`));
|
|
231
|
-
setLogs((prev) => [
|
|
232
|
-
...prev,
|
|
233
|
-
{
|
|
234
|
-
id: generateLogId(),
|
|
235
|
-
timestamp: Date.now(),
|
|
236
|
-
content: `Error: ${data.error || 'Unknown error'}`,
|
|
237
|
-
type: 'system',
|
|
238
|
-
agentName: data.agent || agentNameRef.current,
|
|
239
|
-
},
|
|
240
|
-
]);
|
|
241
|
-
return;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Handle subscribed confirmation
|
|
245
|
-
if (data.type === 'subscribed') {
|
|
246
|
-
console.log(`[useAgentLogs] Subscribed to ${data.agent}`);
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Handle history (initial log dump)
|
|
251
|
-
if (data.type === 'history' && Array.isArray(data.lines)) {
|
|
252
|
-
// Mark as having received data - connection is established
|
|
253
|
-
if (data.lines.length > 0) {
|
|
254
|
-
hasReceivedDataMapRef.current.set(ws, true);
|
|
255
|
-
}
|
|
256
|
-
setLogs((prev) => {
|
|
257
|
-
const historyLines: LogLine[] = data.lines.map((line: string) => ({
|
|
258
|
-
id: generateLogId(),
|
|
259
|
-
timestamp: Date.now(),
|
|
260
|
-
content: line,
|
|
261
|
-
type: 'stdout' as const,
|
|
262
|
-
agentName: data.agent || agentNameRef.current,
|
|
263
|
-
}));
|
|
264
|
-
return [...prev, ...historyLines].slice(-maxLines);
|
|
265
|
-
});
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Handle different message formats - mark as having received data for all actual log messages
|
|
270
|
-
if (typeof data === 'string') {
|
|
271
|
-
// Simple string message
|
|
272
|
-
hasReceivedDataMapRef.current.set(ws, true);
|
|
273
|
-
setLogs((prev) => {
|
|
274
|
-
const newLogs = [
|
|
275
|
-
...prev,
|
|
276
|
-
{
|
|
277
|
-
id: generateLogId(),
|
|
278
|
-
timestamp: Date.now(),
|
|
279
|
-
content: data,
|
|
280
|
-
type: 'stdout' as const,
|
|
281
|
-
agentName: agentNameRef.current,
|
|
282
|
-
},
|
|
283
|
-
];
|
|
284
|
-
return newLogs.slice(-maxLines);
|
|
285
|
-
});
|
|
286
|
-
} else if (data.type === 'log' || data.type === 'output') {
|
|
287
|
-
// Structured log message
|
|
288
|
-
hasReceivedDataMapRef.current.set(ws, true);
|
|
289
|
-
setLogs((prev) => {
|
|
290
|
-
const logType: LogLine['type'] = data.stream === 'stderr' ? 'stderr' : 'stdout';
|
|
291
|
-
const newLogs: LogLine[] = [
|
|
292
|
-
...prev,
|
|
293
|
-
{
|
|
294
|
-
id: generateLogId(),
|
|
295
|
-
timestamp: data.timestamp || Date.now(),
|
|
296
|
-
content: data.content || data.data || data.message || '',
|
|
297
|
-
type: logType,
|
|
298
|
-
agentName: data.agentName || agentNameRef.current,
|
|
299
|
-
},
|
|
300
|
-
];
|
|
301
|
-
return newLogs.slice(-maxLines);
|
|
302
|
-
});
|
|
303
|
-
} else if (data.lines && Array.isArray(data.lines)) {
|
|
304
|
-
// Batch of lines
|
|
305
|
-
hasReceivedDataMapRef.current.set(ws, true);
|
|
306
|
-
setLogs((prev) => {
|
|
307
|
-
const newLines: LogLine[] = data.lines.map((line: string | { content: string; type?: string }) => {
|
|
308
|
-
const lineType: LogLine['type'] = (typeof line === 'object' && line.type === 'stderr') ? 'stderr' : 'stdout';
|
|
309
|
-
return {
|
|
310
|
-
id: generateLogId(),
|
|
311
|
-
timestamp: Date.now(),
|
|
312
|
-
content: typeof line === 'string' ? line : line.content,
|
|
313
|
-
type: lineType,
|
|
314
|
-
agentName: agentNameRef.current,
|
|
315
|
-
};
|
|
316
|
-
});
|
|
317
|
-
return [...prev, ...newLines].slice(-maxLines);
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
} catch {
|
|
321
|
-
// Handle plain text messages
|
|
322
|
-
if (typeof event.data === 'string') {
|
|
323
|
-
hasReceivedDataMapRef.current.set(ws, true);
|
|
324
|
-
setLogs((prev) => {
|
|
325
|
-
const newLogs = [
|
|
326
|
-
...prev,
|
|
327
|
-
{
|
|
328
|
-
id: generateLogId(),
|
|
329
|
-
timestamp: Date.now(),
|
|
330
|
-
content: event.data,
|
|
331
|
-
type: 'stdout' as const,
|
|
332
|
-
agentName: agentNameRef.current,
|
|
333
|
-
},
|
|
334
|
-
];
|
|
335
|
-
return newLogs.slice(-maxLines);
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
};
|
|
340
|
-
} catch (e) {
|
|
341
|
-
isConnectingRef.current = false;
|
|
342
|
-
setError(e instanceof Error ? e : new Error('Failed to create WebSocket'));
|
|
343
|
-
setIsConnecting(false);
|
|
344
|
-
}
|
|
345
|
-
}, [maxLines, reconnect, maxReconnectAttempts]);
|
|
346
|
-
|
|
347
|
-
const disconnect = useCallback(() => {
|
|
348
|
-
// Prevent reconnection attempts after an intentional disconnect
|
|
349
|
-
shouldReconnectRef.current = false;
|
|
350
|
-
|
|
351
|
-
// Clear any pending reconnect
|
|
352
|
-
if (reconnectTimeoutRef.current) {
|
|
353
|
-
clearTimeout(reconnectTimeoutRef.current);
|
|
354
|
-
reconnectTimeoutRef.current = null;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Mark this WebSocket as manually closed before closing it
|
|
358
|
-
// This prevents the false positive error message on close
|
|
359
|
-
if (wsRef.current) {
|
|
360
|
-
manualCloseMapRef.current.set(wsRef.current, true);
|
|
361
|
-
wsRef.current.close();
|
|
362
|
-
wsRef.current = null;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
isConnectingRef.current = false;
|
|
366
|
-
setIsConnected(false);
|
|
367
|
-
setIsConnecting(false);
|
|
368
|
-
}, []);
|
|
369
|
-
|
|
370
|
-
const clear = useCallback(() => {
|
|
371
|
-
setLogs([]);
|
|
372
|
-
}, []);
|
|
373
|
-
|
|
374
|
-
// Auto-connect on mount or agent change
|
|
375
|
-
useEffect(() => {
|
|
376
|
-
if (autoConnect && agentName) {
|
|
377
|
-
connect();
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
return () => {
|
|
381
|
-
disconnect();
|
|
382
|
-
};
|
|
383
|
-
}, [agentName, autoConnect, connect, disconnect]);
|
|
384
|
-
|
|
385
|
-
return {
|
|
386
|
-
logs,
|
|
387
|
-
isConnected,
|
|
388
|
-
isConnecting,
|
|
389
|
-
error,
|
|
390
|
-
connect,
|
|
391
|
-
disconnect,
|
|
392
|
-
clear,
|
|
393
|
-
};
|
|
394
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useAgents Hook
|
|
3
|
-
*
|
|
4
|
-
* React hook for managing agent state with hierarchical grouping,
|
|
5
|
-
* filtering, and selection.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useMemo, useCallback } from 'react';
|
|
9
|
-
import type { Agent } from '../../types';
|
|
10
|
-
import {
|
|
11
|
-
groupAgents,
|
|
12
|
-
filterAgents,
|
|
13
|
-
sortAgentsByHierarchy,
|
|
14
|
-
getGroupStats,
|
|
15
|
-
type AgentGroup,
|
|
16
|
-
} from '../../lib/hierarchy';
|
|
17
|
-
import { getAgentColor, type ColorScheme } from '../../lib/colors';
|
|
18
|
-
|
|
19
|
-
export interface UseAgentsOptions {
|
|
20
|
-
agents: Agent[];
|
|
21
|
-
initialSelected?: string;
|
|
22
|
-
initialSearchQuery?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface AgentWithColor extends Agent {
|
|
26
|
-
color: ColorScheme;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface UseAgentsReturn {
|
|
30
|
-
// Filtered and grouped agents
|
|
31
|
-
agents: Agent[];
|
|
32
|
-
groups: AgentGroup[];
|
|
33
|
-
sortedAgents: Agent[];
|
|
34
|
-
|
|
35
|
-
// Selection
|
|
36
|
-
selectedAgent: Agent | null;
|
|
37
|
-
selectAgent: (name: string | null) => void;
|
|
38
|
-
|
|
39
|
-
// Search/filter
|
|
40
|
-
searchQuery: string;
|
|
41
|
-
setSearchQuery: (query: string) => void;
|
|
42
|
-
|
|
43
|
-
// Stats
|
|
44
|
-
totalCount: number;
|
|
45
|
-
onlineCount: number;
|
|
46
|
-
needsAttentionCount: number;
|
|
47
|
-
|
|
48
|
-
// Utilities
|
|
49
|
-
getAgentByName: (name: string) => Agent | undefined;
|
|
50
|
-
getAgentWithColor: (agent: Agent) => AgentWithColor;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function useAgents({
|
|
54
|
-
agents,
|
|
55
|
-
initialSelected,
|
|
56
|
-
initialSearchQuery = '',
|
|
57
|
-
}: UseAgentsOptions): UseAgentsReturn {
|
|
58
|
-
const [selectedName, setSelectedName] = useState<string | null>(initialSelected ?? null);
|
|
59
|
-
const [searchQuery, setSearchQuery] = useState(initialSearchQuery);
|
|
60
|
-
|
|
61
|
-
// Filter agents by search query
|
|
62
|
-
const filteredAgents = useMemo(
|
|
63
|
-
() => filterAgents(agents, searchQuery),
|
|
64
|
-
[agents, searchQuery]
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
// Group agents by prefix
|
|
68
|
-
const groups = useMemo(
|
|
69
|
-
() => groupAgents(filteredAgents),
|
|
70
|
-
[filteredAgents]
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
// Sort agents for flat list display
|
|
74
|
-
const sortedAgents = useMemo(
|
|
75
|
-
() => sortAgentsByHierarchy(filteredAgents),
|
|
76
|
-
[filteredAgents]
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
// Get selected agent object
|
|
80
|
-
const selectedAgent = useMemo(
|
|
81
|
-
() => agents.find((a) => a.name === selectedName) ?? null,
|
|
82
|
-
[agents, selectedName]
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// Calculate stats
|
|
86
|
-
const stats = useMemo(() => {
|
|
87
|
-
const allStats = getGroupStats(agents);
|
|
88
|
-
return {
|
|
89
|
-
totalCount: allStats.total,
|
|
90
|
-
onlineCount: allStats.online,
|
|
91
|
-
needsAttentionCount: allStats.needsAttention,
|
|
92
|
-
};
|
|
93
|
-
}, [agents]);
|
|
94
|
-
|
|
95
|
-
// Selection handler
|
|
96
|
-
const selectAgent = useCallback((name: string | null) => {
|
|
97
|
-
setSelectedName(name);
|
|
98
|
-
}, []);
|
|
99
|
-
|
|
100
|
-
// Get agent by name
|
|
101
|
-
const getAgentByName = useCallback(
|
|
102
|
-
(name: string) => agents.find((a) => a.name === name),
|
|
103
|
-
[agents]
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
// Get agent with color scheme attached
|
|
107
|
-
const getAgentWithColor = useCallback(
|
|
108
|
-
(agent: Agent): AgentWithColor => ({
|
|
109
|
-
...agent,
|
|
110
|
-
color: getAgentColor(agent.name),
|
|
111
|
-
}),
|
|
112
|
-
[]
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
return {
|
|
116
|
-
agents: filteredAgents,
|
|
117
|
-
groups,
|
|
118
|
-
sortedAgents,
|
|
119
|
-
selectedAgent,
|
|
120
|
-
selectAgent,
|
|
121
|
-
searchQuery,
|
|
122
|
-
setSearchQuery,
|
|
123
|
-
...stats,
|
|
124
|
-
getAgentByName,
|
|
125
|
-
getAgentWithColor,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Broadcast message deduplication utilities
|
|
3
|
-
*
|
|
4
|
-
* When a broadcast is sent (to='*'), the backend delivers it to each
|
|
5
|
-
* recipient separately. Each delivery gets a unique ID and is stored separately.
|
|
6
|
-
* In #general channel, this causes the same message to appear multiple times
|
|
7
|
-
* (once per recipient).
|
|
8
|
-
*
|
|
9
|
-
* This module provides utilities to deduplicate broadcast messages by grouping
|
|
10
|
-
* those with the same sender, content, and approximate timestamp.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { useMemo } from 'react';
|
|
14
|
-
import type { Message } from '../../types';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Check if a message is a broadcast message.
|
|
18
|
-
* A message is considered a broadcast if:
|
|
19
|
-
* - isBroadcast flag is true, OR
|
|
20
|
-
* - to field is '*'
|
|
21
|
-
*/
|
|
22
|
-
function isBroadcastMessage(message: Message): boolean {
|
|
23
|
-
return message.isBroadcast === true || message.to === '*';
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Generate a deduplication key for broadcast messages.
|
|
28
|
-
* Uses sender + content + timestamp bucket (1-second window).
|
|
29
|
-
*
|
|
30
|
-
* @param message The message to generate a key for
|
|
31
|
-
* @returns A string key for deduplication
|
|
32
|
-
*/
|
|
33
|
-
export function getBroadcastKey(message: Message): string {
|
|
34
|
-
const timestampBucket = Math.floor(new Date(message.timestamp).getTime() / 1000);
|
|
35
|
-
return `${message.from}:${timestampBucket}:${message.content}`;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Deduplicate broadcast messages.
|
|
40
|
-
*
|
|
41
|
-
* When a broadcast is sent, it gets delivered to each recipient separately,
|
|
42
|
-
* resulting in multiple stored messages with the same content. This function
|
|
43
|
-
* deduplicates them by grouping broadcasts with the same:
|
|
44
|
-
* - from (sender)
|
|
45
|
-
* - content (message body)
|
|
46
|
-
* - timestamp (within 1 second window)
|
|
47
|
-
*
|
|
48
|
-
* Non-broadcast messages (direct messages) are preserved unchanged.
|
|
49
|
-
* Message order is maintained, keeping the first occurrence of each broadcast.
|
|
50
|
-
*
|
|
51
|
-
* @param messages Array of messages to deduplicate
|
|
52
|
-
* @returns Deduplicated array with broadcast duplicates removed
|
|
53
|
-
*/
|
|
54
|
-
export function deduplicateBroadcasts(messages: Message[]): Message[] {
|
|
55
|
-
const seenBroadcastKeys = new Set<string>();
|
|
56
|
-
const result: Message[] = [];
|
|
57
|
-
|
|
58
|
-
for (const message of messages) {
|
|
59
|
-
// Non-broadcast messages pass through unchanged
|
|
60
|
-
if (!isBroadcastMessage(message)) {
|
|
61
|
-
result.push(message);
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// For broadcasts, check if we've seen this key before
|
|
66
|
-
const key = getBroadcastKey(message);
|
|
67
|
-
if (!seenBroadcastKeys.has(key)) {
|
|
68
|
-
seenBroadcastKeys.add(key);
|
|
69
|
-
result.push(message);
|
|
70
|
-
}
|
|
71
|
-
// If key already seen, skip this duplicate
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Hook for using broadcast deduplication with React state.
|
|
79
|
-
* Uses useMemo to prevent unnecessary recalculations when messages haven't changed.
|
|
80
|
-
*
|
|
81
|
-
* @param messages Array of messages to deduplicate
|
|
82
|
-
* @returns Deduplicated messages
|
|
83
|
-
*/
|
|
84
|
-
export function useBroadcastDedup(messages: Message[]): Message[] {
|
|
85
|
-
return useMemo(() => deduplicateBroadcasts(messages), [messages]);
|
|
86
|
-
}
|