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,209 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useSession Hook
|
|
3
|
-
*
|
|
4
|
-
* React hook for managing cloud session state.
|
|
5
|
-
* Automatically detects session expiration and triggers re-login flow.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
9
|
-
import {
|
|
10
|
-
cloudApi,
|
|
11
|
-
onSessionExpired,
|
|
12
|
-
getCsrfToken,
|
|
13
|
-
type CloudUser,
|
|
14
|
-
type SessionError,
|
|
15
|
-
type SessionStatus,
|
|
16
|
-
} from '../../lib/cloudApi';
|
|
17
|
-
|
|
18
|
-
export interface UseSessionOptions {
|
|
19
|
-
/** Check session on mount (default: true) */
|
|
20
|
-
checkOnMount?: boolean;
|
|
21
|
-
/** Interval to periodically check session in ms (default: 60000, set to 0 to disable) */
|
|
22
|
-
checkInterval?: number;
|
|
23
|
-
/** Callback when session expires */
|
|
24
|
-
onExpired?: (error: SessionError) => void;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface UseSessionReturn {
|
|
28
|
-
/** Current user data (null if not authenticated) */
|
|
29
|
-
user: CloudUser | null;
|
|
30
|
-
/** Whether the session check is in progress */
|
|
31
|
-
isLoading: boolean;
|
|
32
|
-
/** Whether user is authenticated */
|
|
33
|
-
isAuthenticated: boolean;
|
|
34
|
-
/** Whether session has expired (requires re-login) */
|
|
35
|
-
isExpired: boolean;
|
|
36
|
-
/** Session error if any */
|
|
37
|
-
error: SessionError | null;
|
|
38
|
-
/** CSRF token for API requests */
|
|
39
|
-
csrfToken: string | null;
|
|
40
|
-
/** Manually check session status */
|
|
41
|
-
checkSession: () => Promise<SessionStatus>;
|
|
42
|
-
/** Clear the expired state (e.g., after dismissing modal) */
|
|
43
|
-
clearExpired: () => void;
|
|
44
|
-
/** Redirect to login page */
|
|
45
|
-
redirectToLogin: () => void;
|
|
46
|
-
/** Logout the current user */
|
|
47
|
-
logout: () => Promise<void>;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const DEFAULT_OPTIONS: Required<UseSessionOptions> = {
|
|
51
|
-
checkOnMount: true,
|
|
52
|
-
checkInterval: 60000, // 1 minute
|
|
53
|
-
onExpired: () => {},
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
export function useSession(options: UseSessionOptions = {}): UseSessionReturn {
|
|
57
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
58
|
-
|
|
59
|
-
const [user, setUser] = useState<CloudUser | null>(null);
|
|
60
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
61
|
-
const [isExpired, setIsExpired] = useState(false);
|
|
62
|
-
const [error, setError] = useState<SessionError | null>(null);
|
|
63
|
-
|
|
64
|
-
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
65
|
-
const mountedRef = useRef(true);
|
|
66
|
-
|
|
67
|
-
// Check session status
|
|
68
|
-
const checkSession = useCallback(async (): Promise<SessionStatus> => {
|
|
69
|
-
try {
|
|
70
|
-
const status = await cloudApi.checkSession();
|
|
71
|
-
|
|
72
|
-
if (!mountedRef.current) return status;
|
|
73
|
-
|
|
74
|
-
if (!status.authenticated) {
|
|
75
|
-
setUser(null);
|
|
76
|
-
if (status.code) {
|
|
77
|
-
const sessionError: SessionError = {
|
|
78
|
-
error: 'Session expired',
|
|
79
|
-
code: status.code,
|
|
80
|
-
message: status.message || 'Your session has expired. Please log in again.',
|
|
81
|
-
};
|
|
82
|
-
setError(sessionError);
|
|
83
|
-
setIsExpired(true);
|
|
84
|
-
opts.onExpired(sessionError);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return status;
|
|
89
|
-
} catch (_e) {
|
|
90
|
-
return {
|
|
91
|
-
authenticated: false,
|
|
92
|
-
code: 'SESSION_ERROR',
|
|
93
|
-
message: 'Failed to check session',
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}, [opts]);
|
|
97
|
-
|
|
98
|
-
// Fetch user data
|
|
99
|
-
const fetchUser = useCallback(async () => {
|
|
100
|
-
setIsLoading(true);
|
|
101
|
-
try {
|
|
102
|
-
const result = await cloudApi.getMe();
|
|
103
|
-
|
|
104
|
-
if (!mountedRef.current) return;
|
|
105
|
-
|
|
106
|
-
if (result.success) {
|
|
107
|
-
setUser(result.data);
|
|
108
|
-
setIsExpired(false);
|
|
109
|
-
setError(null);
|
|
110
|
-
} else if (result.sessionExpired) {
|
|
111
|
-
setUser(null);
|
|
112
|
-
setIsExpired(true);
|
|
113
|
-
} else {
|
|
114
|
-
setError({
|
|
115
|
-
error: result.error,
|
|
116
|
-
code: 'SESSION_ERROR',
|
|
117
|
-
message: result.error,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
} finally {
|
|
121
|
-
if (mountedRef.current) {
|
|
122
|
-
setIsLoading(false);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}, []);
|
|
126
|
-
|
|
127
|
-
// Handle session expiration from any API call
|
|
128
|
-
useEffect(() => {
|
|
129
|
-
const unsubscribe = onSessionExpired((sessionError) => {
|
|
130
|
-
if (!mountedRef.current) return;
|
|
131
|
-
|
|
132
|
-
setUser(null);
|
|
133
|
-
setIsExpired(true);
|
|
134
|
-
setError(sessionError);
|
|
135
|
-
opts.onExpired(sessionError);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
return unsubscribe;
|
|
139
|
-
}, [opts]);
|
|
140
|
-
|
|
141
|
-
// Check session on mount
|
|
142
|
-
useEffect(() => {
|
|
143
|
-
mountedRef.current = true;
|
|
144
|
-
|
|
145
|
-
if (opts.checkOnMount) {
|
|
146
|
-
fetchUser();
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return () => {
|
|
150
|
-
mountedRef.current = false;
|
|
151
|
-
};
|
|
152
|
-
}, [opts.checkOnMount, fetchUser]);
|
|
153
|
-
|
|
154
|
-
// Periodic session check
|
|
155
|
-
useEffect(() => {
|
|
156
|
-
if (opts.checkInterval <= 0) return;
|
|
157
|
-
|
|
158
|
-
intervalRef.current = setInterval(() => {
|
|
159
|
-
// Only check if we think we're authenticated
|
|
160
|
-
if (user) {
|
|
161
|
-
checkSession();
|
|
162
|
-
}
|
|
163
|
-
}, opts.checkInterval);
|
|
164
|
-
|
|
165
|
-
return () => {
|
|
166
|
-
if (intervalRef.current) {
|
|
167
|
-
clearInterval(intervalRef.current);
|
|
168
|
-
intervalRef.current = null;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
}, [opts.checkInterval, user, checkSession]);
|
|
172
|
-
|
|
173
|
-
// Clear expired state
|
|
174
|
-
const clearExpired = useCallback(() => {
|
|
175
|
-
setIsExpired(false);
|
|
176
|
-
setError(null);
|
|
177
|
-
}, []);
|
|
178
|
-
|
|
179
|
-
// Redirect to login
|
|
180
|
-
const redirectToLogin = useCallback(() => {
|
|
181
|
-
// Preserve current path for redirect after login
|
|
182
|
-
const returnTo = encodeURIComponent(window.location.pathname + window.location.search);
|
|
183
|
-
window.location.href = `/login?returnTo=${returnTo}`;
|
|
184
|
-
}, []);
|
|
185
|
-
|
|
186
|
-
// Logout
|
|
187
|
-
const logout = useCallback(async () => {
|
|
188
|
-
await cloudApi.logout();
|
|
189
|
-
setUser(null);
|
|
190
|
-
setIsExpired(false);
|
|
191
|
-
setError(null);
|
|
192
|
-
window.location.href = '/login';
|
|
193
|
-
}, []);
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
user,
|
|
197
|
-
isLoading,
|
|
198
|
-
isAuthenticated: user !== null,
|
|
199
|
-
isExpired,
|
|
200
|
-
error,
|
|
201
|
-
csrfToken: getCsrfToken(),
|
|
202
|
-
checkSession,
|
|
203
|
-
clearExpired,
|
|
204
|
-
redirectToLogin,
|
|
205
|
-
logout,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
export type { SessionError, CloudUser };
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useTrajectory Hook
|
|
3
|
-
*
|
|
4
|
-
* Fetches and polls trajectory data from the API.
|
|
5
|
-
* Provides real-time updates on agent work progress.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
9
|
-
import type { TrajectoryStep } from '../TrajectoryViewer';
|
|
10
|
-
import { getApiUrl } from '../../lib/api';
|
|
11
|
-
|
|
12
|
-
interface TrajectoryStatus {
|
|
13
|
-
active: boolean;
|
|
14
|
-
trajectoryId?: string;
|
|
15
|
-
phase?: 'plan' | 'design' | 'execute' | 'review' | 'observe';
|
|
16
|
-
task?: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface TrajectoryHistoryEntry {
|
|
20
|
-
id: string;
|
|
21
|
-
title: string;
|
|
22
|
-
status: 'active' | 'completed' | 'abandoned';
|
|
23
|
-
startedAt: string;
|
|
24
|
-
completedAt?: string;
|
|
25
|
-
agents?: string[];
|
|
26
|
-
summary?: string;
|
|
27
|
-
confidence?: number;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface UseTrajectoryOptions {
|
|
31
|
-
/** Polling interval in ms (default: 2000) */
|
|
32
|
-
pollInterval?: number;
|
|
33
|
-
/** Whether to auto-poll (default: true) */
|
|
34
|
-
autoPoll?: boolean;
|
|
35
|
-
/** Specific trajectory ID to fetch */
|
|
36
|
-
trajectoryId?: string;
|
|
37
|
-
/** API base URL (for when running outside default context) */
|
|
38
|
-
apiBaseUrl?: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
interface UseTrajectoryResult {
|
|
42
|
-
steps: TrajectoryStep[];
|
|
43
|
-
status: TrajectoryStatus | null;
|
|
44
|
-
history: TrajectoryHistoryEntry[];
|
|
45
|
-
isLoading: boolean;
|
|
46
|
-
error: string | null;
|
|
47
|
-
refresh: () => Promise<void>;
|
|
48
|
-
selectTrajectory: (id: string | null) => void;
|
|
49
|
-
selectedTrajectoryId: string | null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export function useTrajectory(options: UseTrajectoryOptions = {}): UseTrajectoryResult {
|
|
53
|
-
const {
|
|
54
|
-
pollInterval = 2000,
|
|
55
|
-
autoPoll = true,
|
|
56
|
-
trajectoryId: initialTrajectoryId,
|
|
57
|
-
apiBaseUrl = '',
|
|
58
|
-
} = options;
|
|
59
|
-
|
|
60
|
-
const [steps, setSteps] = useState<TrajectoryStep[]>([]);
|
|
61
|
-
const [status, setStatus] = useState<TrajectoryStatus | null>(null);
|
|
62
|
-
const [history, setHistory] = useState<TrajectoryHistoryEntry[]>([]);
|
|
63
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
64
|
-
const [error, setError] = useState<string | null>(null);
|
|
65
|
-
const [selectedTrajectoryId, setSelectedTrajectoryId] = useState<string | null>(initialTrajectoryId || null);
|
|
66
|
-
const pollingRef = useRef<NodeJS.Timeout | null>(null);
|
|
67
|
-
const hasLoadedInitialStepsRef = useRef(false);
|
|
68
|
-
const hasInitializedRef = useRef(false);
|
|
69
|
-
// Track the latest selection to prevent stale fetches from overwriting data
|
|
70
|
-
const latestSelectionRef = useRef<string | null>(selectedTrajectoryId);
|
|
71
|
-
// Request counter to ensure only the most recent fetch updates state
|
|
72
|
-
// This is more robust than trajectory ID comparison for handling race conditions
|
|
73
|
-
const requestCounterRef = useRef(0);
|
|
74
|
-
|
|
75
|
-
// Fetch trajectory status
|
|
76
|
-
const fetchStatus = useCallback(async () => {
|
|
77
|
-
try {
|
|
78
|
-
// Use apiBaseUrl if provided, otherwise use getApiUrl for cloud mode routing
|
|
79
|
-
const url = apiBaseUrl
|
|
80
|
-
? `${apiBaseUrl}/api/trajectory`
|
|
81
|
-
: getApiUrl('/api/trajectory');
|
|
82
|
-
const response = await fetch(url, { credentials: 'include' });
|
|
83
|
-
const data = await response.json();
|
|
84
|
-
|
|
85
|
-
if (data.success !== false) {
|
|
86
|
-
setStatus({
|
|
87
|
-
active: data.active,
|
|
88
|
-
trajectoryId: data.trajectoryId,
|
|
89
|
-
phase: data.phase,
|
|
90
|
-
task: data.task,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
} catch (err: any) {
|
|
94
|
-
console.error('[useTrajectory] Status fetch error:', err);
|
|
95
|
-
}
|
|
96
|
-
}, [apiBaseUrl]);
|
|
97
|
-
|
|
98
|
-
// Fetch trajectory history
|
|
99
|
-
const fetchHistory = useCallback(async () => {
|
|
100
|
-
try {
|
|
101
|
-
const url = apiBaseUrl
|
|
102
|
-
? `${apiBaseUrl}/api/trajectory/history`
|
|
103
|
-
: getApiUrl('/api/trajectory/history');
|
|
104
|
-
const response = await fetch(url, { credentials: 'include' });
|
|
105
|
-
const data = await response.json();
|
|
106
|
-
|
|
107
|
-
if (data.success) {
|
|
108
|
-
setHistory(data.trajectories || []);
|
|
109
|
-
}
|
|
110
|
-
} catch (err: any) {
|
|
111
|
-
console.error('[useTrajectory] History fetch error:', err);
|
|
112
|
-
}
|
|
113
|
-
}, [apiBaseUrl]);
|
|
114
|
-
|
|
115
|
-
// Fetch trajectory steps
|
|
116
|
-
const fetchSteps = useCallback(async () => {
|
|
117
|
-
// Increment request counter and capture it for this request
|
|
118
|
-
// This ensures only the most recent request updates state
|
|
119
|
-
const requestId = ++requestCounterRef.current;
|
|
120
|
-
const trajectoryId = selectedTrajectoryId;
|
|
121
|
-
|
|
122
|
-
try {
|
|
123
|
-
const basePath = trajectoryId
|
|
124
|
-
? `/api/trajectory/steps?trajectoryId=${encodeURIComponent(trajectoryId)}`
|
|
125
|
-
: '/api/trajectory/steps';
|
|
126
|
-
const url = apiBaseUrl
|
|
127
|
-
? `${apiBaseUrl}${basePath}`
|
|
128
|
-
: getApiUrl(basePath);
|
|
129
|
-
|
|
130
|
-
const response = await fetch(url, { credentials: 'include' });
|
|
131
|
-
const data = await response.json();
|
|
132
|
-
|
|
133
|
-
// Only update state if this is still the most recent request
|
|
134
|
-
// Check both request counter AND trajectory ID for double protection
|
|
135
|
-
if (requestId !== requestCounterRef.current) {
|
|
136
|
-
console.log('[useTrajectory] Ignoring superseded fetch (request', requestId, 'current', requestCounterRef.current, ')');
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (trajectoryId !== latestSelectionRef.current) {
|
|
140
|
-
console.log('[useTrajectory] Ignoring stale fetch for', trajectoryId, 'current is', latestSelectionRef.current);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (data.success) {
|
|
145
|
-
setSteps(data.steps || []);
|
|
146
|
-
setError(null);
|
|
147
|
-
} else {
|
|
148
|
-
setError(data.error || 'Failed to fetch trajectory steps');
|
|
149
|
-
}
|
|
150
|
-
} catch (err: any) {
|
|
151
|
-
// Only update error state if this is still the current request
|
|
152
|
-
if (requestId === requestCounterRef.current && trajectoryId === latestSelectionRef.current) {
|
|
153
|
-
console.error('[useTrajectory] Steps fetch error:', err);
|
|
154
|
-
setError(err.message);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}, [apiBaseUrl, selectedTrajectoryId]);
|
|
158
|
-
|
|
159
|
-
// Select a specific trajectory
|
|
160
|
-
const selectTrajectory = useCallback((id: string | null) => {
|
|
161
|
-
// Normalize empty string to null for consistency
|
|
162
|
-
const normalizedId = id === '' ? null : id;
|
|
163
|
-
|
|
164
|
-
// Skip if already selected (prevents unnecessary re-fetches)
|
|
165
|
-
if (normalizedId === selectedTrajectoryId) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Increment request counter to invalidate any in-flight fetches immediately
|
|
170
|
-
// This is crucial - it ensures that even if an old fetch completes after this,
|
|
171
|
-
// its request ID won't match and it will be ignored
|
|
172
|
-
requestCounterRef.current++;
|
|
173
|
-
|
|
174
|
-
// Update the ref immediately so in-flight fetches for other trajectories are ignored
|
|
175
|
-
latestSelectionRef.current = normalizedId;
|
|
176
|
-
|
|
177
|
-
// Clear steps immediately when switching trajectories to prevent showing stale data
|
|
178
|
-
setSteps([]);
|
|
179
|
-
|
|
180
|
-
// Set loading immediately to avoid flash of empty state before effect runs
|
|
181
|
-
if (normalizedId !== null) {
|
|
182
|
-
setIsLoading(true);
|
|
183
|
-
}
|
|
184
|
-
setSelectedTrajectoryId(normalizedId);
|
|
185
|
-
}, [selectedTrajectoryId]);
|
|
186
|
-
|
|
187
|
-
// Combined refresh function
|
|
188
|
-
const refresh = useCallback(async () => {
|
|
189
|
-
setIsLoading(true);
|
|
190
|
-
await Promise.all([fetchStatus(), fetchSteps(), fetchHistory()]);
|
|
191
|
-
setIsLoading(false);
|
|
192
|
-
}, [fetchStatus, fetchSteps, fetchHistory]);
|
|
193
|
-
|
|
194
|
-
// Keep the latestSelectionRef in sync with state
|
|
195
|
-
// This handles the initial value and any external changes
|
|
196
|
-
// Note: selectedTrajectoryId is already normalized by selectTrajectory
|
|
197
|
-
useEffect(() => {
|
|
198
|
-
latestSelectionRef.current = selectedTrajectoryId;
|
|
199
|
-
}, [selectedTrajectoryId]);
|
|
200
|
-
|
|
201
|
-
// Initial fetch - only run once on mount
|
|
202
|
-
// Note: Empty deps array is intentional - we use hasInitializedRef to ensure single execution
|
|
203
|
-
useEffect(() => {
|
|
204
|
-
if (hasInitializedRef.current) return;
|
|
205
|
-
hasInitializedRef.current = true;
|
|
206
|
-
refresh();
|
|
207
|
-
}, [refresh]);
|
|
208
|
-
|
|
209
|
-
// Re-fetch steps when selected trajectory changes
|
|
210
|
-
// Note: Initial fetch is handled by the refresh() call in the mount effect
|
|
211
|
-
useEffect(() => {
|
|
212
|
-
// Skip the initial render - refresh() handles it
|
|
213
|
-
if (!hasLoadedInitialStepsRef.current) {
|
|
214
|
-
hasLoadedInitialStepsRef.current = true;
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// For subsequent selection changes, fetch with loading state management
|
|
219
|
-
let cancelled = false;
|
|
220
|
-
setIsLoading(true);
|
|
221
|
-
fetchSteps().finally(() => {
|
|
222
|
-
if (!cancelled) {
|
|
223
|
-
setIsLoading(false);
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
return () => {
|
|
228
|
-
cancelled = true;
|
|
229
|
-
};
|
|
230
|
-
}, [selectedTrajectoryId, fetchSteps]);
|
|
231
|
-
|
|
232
|
-
// Polling
|
|
233
|
-
useEffect(() => {
|
|
234
|
-
if (!autoPoll) return;
|
|
235
|
-
|
|
236
|
-
pollingRef.current = setInterval(() => {
|
|
237
|
-
fetchSteps();
|
|
238
|
-
fetchStatus();
|
|
239
|
-
// Poll history less frequently
|
|
240
|
-
}, pollInterval);
|
|
241
|
-
|
|
242
|
-
// Poll history every 10 seconds
|
|
243
|
-
const historyPollRef = setInterval(fetchHistory, 10000);
|
|
244
|
-
|
|
245
|
-
return () => {
|
|
246
|
-
if (pollingRef.current) {
|
|
247
|
-
clearInterval(pollingRef.current);
|
|
248
|
-
}
|
|
249
|
-
clearInterval(historyPollRef);
|
|
250
|
-
};
|
|
251
|
-
}, [autoPoll, pollInterval, fetchSteps, fetchStatus, fetchHistory]);
|
|
252
|
-
|
|
253
|
-
return {
|
|
254
|
-
steps,
|
|
255
|
-
status,
|
|
256
|
-
history,
|
|
257
|
-
isLoading,
|
|
258
|
-
error,
|
|
259
|
-
refresh,
|
|
260
|
-
selectTrajectory,
|
|
261
|
-
selectedTrajectoryId,
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
export default useTrajectory;
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useWebSocket Hook
|
|
3
|
-
*
|
|
4
|
-
* React hook for managing WebSocket connection to the dashboard server.
|
|
5
|
-
* Provides real-time updates for agents, messages, and fleet data.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
9
|
-
import type { Agent, Message, Session, AgentSummary, FleetData } from '../../types';
|
|
10
|
-
|
|
11
|
-
export interface DashboardData {
|
|
12
|
-
agents: Agent[];
|
|
13
|
-
users?: Agent[]; // Human users (cli === 'dashboard')
|
|
14
|
-
messages: Message[];
|
|
15
|
-
sessions?: Session[];
|
|
16
|
-
summaries?: AgentSummary[];
|
|
17
|
-
fleet?: FleetData;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface UseWebSocketOptions {
|
|
21
|
-
url?: string;
|
|
22
|
-
autoConnect?: boolean;
|
|
23
|
-
reconnect?: boolean;
|
|
24
|
-
maxReconnectAttempts?: number;
|
|
25
|
-
reconnectDelay?: number;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface UseWebSocketReturn {
|
|
29
|
-
data: DashboardData | null;
|
|
30
|
-
isConnected: boolean;
|
|
31
|
-
error: Error | null;
|
|
32
|
-
connect: () => void;
|
|
33
|
-
disconnect: () => void;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const DEFAULT_OPTIONS: Required<UseWebSocketOptions> = {
|
|
37
|
-
url: '',
|
|
38
|
-
autoConnect: true,
|
|
39
|
-
reconnect: true,
|
|
40
|
-
maxReconnectAttempts: 10,
|
|
41
|
-
reconnectDelay: 1000,
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Get the default WebSocket URL based on the current page location
|
|
46
|
-
*
|
|
47
|
-
* In dev mode (Next.js on 3888), WebSocket connects to dashboard server on 3889
|
|
48
|
-
* because Next.js rewrites don't support WebSocket upgrade requests.
|
|
49
|
-
*
|
|
50
|
-
* In production, everything runs on the same port.
|
|
51
|
-
*/
|
|
52
|
-
function getDefaultUrl(): string {
|
|
53
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
54
|
-
|
|
55
|
-
if (typeof window === 'undefined') {
|
|
56
|
-
return 'ws://localhost:3889/ws';
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Dev mode only: Next.js on 3888, dashboard server on 3889
|
|
60
|
-
// In production (static export), use same host regardless of port
|
|
61
|
-
if (isDev && window.location.port === '3888') {
|
|
62
|
-
const host = window.location.hostname || 'localhost';
|
|
63
|
-
return `ws://${host}:3889/ws`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
67
|
-
// Production: use the same host (works with tunnels/proxies)
|
|
68
|
-
return `${protocol}//${window.location.host}/ws`;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function useWebSocket(options: UseWebSocketOptions = {}): UseWebSocketReturn {
|
|
72
|
-
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
73
|
-
|
|
74
|
-
const [data, setData] = useState<DashboardData | null>(null);
|
|
75
|
-
const [isConnected, setIsConnected] = useState(false);
|
|
76
|
-
const [error, setError] = useState<Error | null>(null);
|
|
77
|
-
|
|
78
|
-
const wsRef = useRef<WebSocket | null>(null);
|
|
79
|
-
const reconnectAttemptsRef = useRef(0);
|
|
80
|
-
const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
|
81
|
-
|
|
82
|
-
const connect = useCallback(() => {
|
|
83
|
-
if (wsRef.current?.readyState === WebSocket.OPEN) {
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Compute URL at connection time (always on client)
|
|
88
|
-
const wsUrl = opts.url || getDefaultUrl();
|
|
89
|
-
|
|
90
|
-
try {
|
|
91
|
-
const ws = new WebSocket(wsUrl);
|
|
92
|
-
|
|
93
|
-
ws.onopen = () => {
|
|
94
|
-
setIsConnected(true);
|
|
95
|
-
setError(null);
|
|
96
|
-
reconnectAttemptsRef.current = 0;
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
ws.onclose = () => {
|
|
100
|
-
setIsConnected(false);
|
|
101
|
-
wsRef.current = null;
|
|
102
|
-
|
|
103
|
-
// Schedule reconnect if enabled
|
|
104
|
-
if (opts.reconnect && reconnectAttemptsRef.current < opts.maxReconnectAttempts) {
|
|
105
|
-
const delay = Math.min(
|
|
106
|
-
opts.reconnectDelay * Math.pow(2, reconnectAttemptsRef.current),
|
|
107
|
-
30000
|
|
108
|
-
);
|
|
109
|
-
reconnectAttemptsRef.current++;
|
|
110
|
-
|
|
111
|
-
reconnectTimeoutRef.current = setTimeout(() => {
|
|
112
|
-
connect();
|
|
113
|
-
}, delay);
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
ws.onerror = (event) => {
|
|
118
|
-
setError(new Error('WebSocket connection error'));
|
|
119
|
-
console.error('[useWebSocket] Error:', event);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
ws.onmessage = (event) => {
|
|
123
|
-
try {
|
|
124
|
-
const parsed = JSON.parse(event.data) as DashboardData;
|
|
125
|
-
setData(parsed);
|
|
126
|
-
} catch (e) {
|
|
127
|
-
console.error('[useWebSocket] Failed to parse message:', e);
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
wsRef.current = ws;
|
|
132
|
-
} catch (e) {
|
|
133
|
-
setError(e instanceof Error ? e : new Error('Failed to create WebSocket'));
|
|
134
|
-
}
|
|
135
|
-
}, [opts.url, opts.reconnect, opts.maxReconnectAttempts, opts.reconnectDelay]);
|
|
136
|
-
|
|
137
|
-
const disconnect = useCallback(() => {
|
|
138
|
-
if (reconnectTimeoutRef.current) {
|
|
139
|
-
clearTimeout(reconnectTimeoutRef.current);
|
|
140
|
-
reconnectTimeoutRef.current = null;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (wsRef.current) {
|
|
144
|
-
wsRef.current.close();
|
|
145
|
-
wsRef.current = null;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
setIsConnected(false);
|
|
149
|
-
}, []);
|
|
150
|
-
|
|
151
|
-
// Auto-connect on mount
|
|
152
|
-
useEffect(() => {
|
|
153
|
-
if (opts.autoConnect) {
|
|
154
|
-
connect();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return () => {
|
|
158
|
-
disconnect();
|
|
159
|
-
};
|
|
160
|
-
}, [opts.autoConnect, connect, disconnect]);
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
data,
|
|
164
|
-
isConnected,
|
|
165
|
-
error,
|
|
166
|
-
connect,
|
|
167
|
-
disconnect,
|
|
168
|
-
};
|
|
169
|
-
}
|