@agent-relay/dashboard 2.0.80 → 2.0.82
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/out/404.html +1 -1
- package/out/_next/static/chunks/{118-4c8241b0218335de.js → 118-ae2b650136a5a5fc.js} +1 -1
- package/out/_next/static/chunks/407-0c82986cf79c8ecb.js +1 -0
- package/out/_next/static/chunks/app/app/[[...slug]]/{page-1e81c047cff17212.js → page-f7eca1b66fb4249b.js} +1 -1
- package/out/_next/static/chunks/app/{page-6892fe2dd07fb48b.js → page-0ee604f7070d14c0.js} +1 -1
- package/out/_next/static/css/8968d98ed4c4d33f.css +1 -0
- package/out/about.html +2 -2
- package/out/about.txt +1 -1
- package/out/app/onboarding.html +1 -1
- package/out/app/onboarding.txt +1 -1
- package/out/app.html +1 -1
- package/out/app.txt +2 -2
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +2 -2
- package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
- package/out/blog/let-them-cook-multi-agent-orchestration.html +2 -2
- package/out/blog/let-them-cook-multi-agent-orchestration.txt +2 -2
- package/out/blog.html +2 -2
- package/out/blog.txt +1 -1
- package/out/careers.html +2 -2
- package/out/careers.txt +1 -1
- package/out/changelog.html +2 -2
- package/out/changelog.txt +1 -1
- package/out/cloud/link.html +1 -1
- package/out/cloud/link.txt +2 -2
- package/out/complete-profile.html +2 -2
- package/out/complete-profile.txt +1 -1
- package/out/connect-repos.html +1 -1
- package/out/connect-repos.txt +1 -1
- package/out/contact.html +2 -2
- package/out/contact.txt +1 -1
- package/out/docs.html +2 -2
- package/out/docs.txt +1 -1
- package/out/history.html +1 -1
- package/out/history.txt +2 -2
- package/out/index.html +1 -1
- package/out/index.txt +2 -2
- package/out/login.html +2 -2
- package/out/login.txt +1 -1
- package/out/metrics.html +1 -1
- package/out/metrics.txt +2 -2
- package/out/pricing.html +2 -2
- package/out/pricing.txt +1 -1
- package/out/privacy.html +2 -2
- package/out/privacy.txt +1 -1
- package/out/providers/setup/claude.html +1 -1
- package/out/providers/setup/claude.txt +1 -1
- package/out/providers/setup/codex.html +1 -1
- package/out/providers/setup/codex.txt +1 -1
- package/out/providers/setup/cursor.html +1 -1
- package/out/providers/setup/cursor.txt +1 -1
- package/out/providers.html +1 -1
- package/out/providers.txt +1 -1
- package/out/security.html +2 -2
- package/out/security.txt +1 -1
- package/out/signup.html +2 -2
- package/out/signup.txt +1 -1
- package/out/terms.html +2 -2
- package/out/terms.txt +1 -1
- package/package.json +7 -1
- package/src/app/about/page.tsx +7 -0
- package/src/app/app/[[...slug]]/DashboardPageClient.tsx +853 -0
- package/src/app/app/[[...slug]]/page.tsx +23 -0
- package/src/app/app/onboarding/page.tsx +394 -0
- package/src/app/apple-icon.png +0 -0
- package/src/app/blog/go-to-bed-wake-up-to-a-finished-product/page.tsx +88 -0
- package/src/app/blog/let-them-cook-multi-agent-orchestration/page.tsx +93 -0
- package/src/app/blog/page.tsx +15 -0
- package/src/app/careers/page.tsx +7 -0
- package/src/app/changelog/page.tsx +7 -0
- package/src/app/cloud/link/page.tsx +464 -0
- package/src/app/complete-profile/page.tsx +204 -0
- package/src/app/connect-repos/page.tsx +410 -0
- package/src/app/contact/page.tsx +7 -0
- package/src/app/docs/page.tsx +7 -0
- package/src/app/favicon.png +0 -0
- package/src/app/globals.css +200 -0
- package/src/app/history/page.tsx +658 -0
- package/src/app/layout.tsx +25 -0
- package/src/app/login/page.tsx +424 -0
- package/src/app/metrics/page.tsx +781 -0
- package/src/app/page.tsx +59 -0
- package/src/app/pricing/page.tsx +7 -0
- package/src/app/privacy/page.tsx +7 -0
- package/src/app/providers/page.tsx +193 -0
- package/src/app/providers/setup/[provider]/ProviderSetupClient.tsx +197 -0
- package/src/app/providers/setup/[provider]/constants.ts +35 -0
- package/src/app/providers/setup/[provider]/page.tsx +42 -0
- package/src/app/security/page.tsx +7 -0
- package/src/app/signup/page.tsx +533 -0
- package/src/app/terms/page.tsx +7 -0
- package/src/components/ActivityFeed.tsx +216 -0
- package/src/components/AddWorkspaceModal.tsx +170 -0
- package/src/components/AgentCard.test.tsx +134 -0
- package/src/components/AgentCard.tsx +585 -0
- package/src/components/AgentList.test.tsx +147 -0
- package/src/components/AgentList.tsx +419 -0
- package/src/components/AgentLogPreview.tsx +173 -0
- package/src/components/AgentProfilePanel.tsx +569 -0
- package/src/components/App.tsx +3424 -0
- package/src/components/BillingPanel.tsx +922 -0
- package/src/components/BillingResult.tsx +447 -0
- package/src/components/BroadcastComposer.tsx +690 -0
- package/src/components/ChannelAdminPanel.tsx +773 -0
- package/src/components/ChannelBrowser.tsx +385 -0
- package/src/components/ChannelChat.tsx +261 -0
- package/src/components/ChannelSidebar.tsx +399 -0
- package/src/components/CloudSessionProvider.tsx +130 -0
- package/src/components/CommandPalette.tsx +815 -0
- package/src/components/ConfirmationDialog.tsx +133 -0
- package/src/components/ConversationHistory.tsx +518 -0
- package/src/components/CoordinatorPanel.tsx +956 -0
- package/src/components/DecisionQueue.tsx +717 -0
- package/src/components/DirectMessageView.tsx +164 -0
- package/src/components/FileAutocomplete.tsx +368 -0
- package/src/components/FleetOverview.tsx +278 -0
- package/src/components/LogViewer.tsx +310 -0
- package/src/components/LogViewerPanel.tsx +482 -0
- package/src/components/Logo.tsx +284 -0
- package/src/components/MentionAutocomplete.tsx +384 -0
- package/src/components/MessageComposer.tsx +473 -0
- package/src/components/MessageList.tsx +725 -0
- package/src/components/MessageSenderName.tsx +91 -0
- package/src/components/MessageStatusIndicator.tsx +142 -0
- package/src/components/NewConversationModal.tsx +400 -0
- package/src/components/NotificationToast.tsx +488 -0
- package/src/components/OnlineUsersIndicator.tsx +164 -0
- package/src/components/Pagination.tsx +124 -0
- package/src/components/PricingPlans.tsx +386 -0
- package/src/components/ProjectList.tsx +711 -0
- package/src/components/ProviderAuthFlow.tsx +343 -0
- package/src/components/ProviderConnectionList.tsx +375 -0
- package/src/components/ProvisioningProgress.tsx +730 -0
- package/src/components/ReactionChips.tsx +70 -0
- package/src/components/ReactionPicker.tsx +121 -0
- package/src/components/RepoAccessPanel.tsx +787 -0
- package/src/components/RepositoriesPanel.tsx +901 -0
- package/src/components/ServerCard.tsx +202 -0
- package/src/components/SessionExpiredModal.tsx +128 -0
- package/src/components/SpawnModal.test.tsx +190 -0
- package/src/components/SpawnModal.tsx +1001 -0
- package/src/components/TaskAssignmentUI.tsx +375 -0
- package/src/components/TerminalProviderSetup.tsx +517 -0
- package/src/components/ThemeProvider.tsx +159 -0
- package/src/components/ThinkingIndicator.tsx +231 -0
- package/src/components/ThreadList.tsx +198 -0
- package/src/components/ThreadPanel.tsx +405 -0
- package/src/components/TrajectoryViewer.tsx +698 -0
- package/src/components/TypingIndicator.tsx +69 -0
- package/src/components/UsageBanner.tsx +231 -0
- package/src/components/UserProfilePanel.tsx +233 -0
- package/src/components/WorkspaceContext.tsx +95 -0
- package/src/components/WorkspaceSelector.tsx +234 -0
- package/src/components/WorkspaceStatusIndicator.tsx +396 -0
- package/src/components/XTermInteractive.tsx +516 -0
- package/src/components/XTermLogViewer.tsx +719 -0
- package/src/components/channels/ChannelDialogs.tsx +1411 -0
- package/src/components/channels/ChannelHeader.tsx +317 -0
- package/src/components/channels/ChannelMessageList.tsx +463 -0
- package/src/components/channels/ChannelViewV1.tsx +146 -0
- package/src/components/channels/MessageInput.tsx +302 -0
- package/src/components/channels/SearchInput.tsx +172 -0
- package/src/components/channels/SearchResults.tsx +336 -0
- package/src/components/channels/api.test.ts +1527 -0
- package/src/components/channels/api.ts +703 -0
- package/src/components/channels/index.ts +76 -0
- package/src/components/channels/mockApi.ts +344 -0
- package/src/components/channels/types.ts +566 -0
- package/src/components/hooks/index.ts +58 -0
- package/src/components/hooks/useAgentLogs.ts +504 -0
- package/src/components/hooks/useAgents.ts +127 -0
- package/src/components/hooks/useBroadcastDedup.test.ts +371 -0
- package/src/components/hooks/useBroadcastDedup.ts +86 -0
- package/src/components/hooks/useChannelAdmin.ts +329 -0
- package/src/components/hooks/useChannelBrowser.ts +239 -0
- package/src/components/hooks/useChannelCommands.ts +138 -0
- package/src/components/hooks/useChannels.ts +367 -0
- package/src/components/hooks/useDebounce.ts +29 -0
- package/src/components/hooks/useDirectMessage.test.ts +952 -0
- package/src/components/hooks/useDirectMessage.ts +141 -0
- package/src/components/hooks/useMessages.ts +310 -0
- package/src/components/hooks/useOrchestrator.test.ts +165 -0
- package/src/components/hooks/useOrchestrator.ts +424 -0
- package/src/components/hooks/usePinnedAgents.test.ts +356 -0
- package/src/components/hooks/usePinnedAgents.ts +140 -0
- package/src/components/hooks/usePresence.test.ts +245 -0
- package/src/components/hooks/usePresence.ts +377 -0
- package/src/components/hooks/useRecentRepos.ts +130 -0
- package/src/components/hooks/useSession.ts +209 -0
- package/src/components/hooks/useThread.ts +138 -0
- package/src/components/hooks/useTrajectory.ts +265 -0
- package/src/components/hooks/useWebSocket.ts +290 -0
- package/src/components/hooks/useWorkspaceMembers.ts +132 -0
- package/src/components/hooks/useWorkspaceRepos.ts +73 -0
- package/src/components/hooks/useWorkspaceStatus.ts +237 -0
- package/src/components/index.ts +81 -0
- package/src/components/layout/Header.tsx +311 -0
- package/src/components/layout/RepoContextHeader.tsx +361 -0
- package/src/components/layout/Sidebar.archive.test.tsx +126 -0
- package/src/components/layout/Sidebar.test.tsx +691 -0
- package/src/components/layout/Sidebar.tsx +900 -0
- package/src/components/layout/index.ts +7 -0
- package/src/components/settings/BillingSettingsPanel.tsx +564 -0
- package/src/components/settings/SettingsPage.tsx +683 -0
- package/src/components/settings/TeamSettingsPanel.tsx +560 -0
- package/src/components/settings/WorkspaceSettingsPanel.tsx +1368 -0
- package/src/components/settings/index.ts +11 -0
- package/src/components/settings/types.ts +79 -0
- package/src/components/utils/messageFormatting.test.tsx +331 -0
- package/src/components/utils/messageFormatting.tsx +597 -0
- package/src/index.ts +63 -0
- package/src/landing/AboutPage.tsx +77 -0
- package/src/landing/BlogContent.tsx +187 -0
- package/src/landing/BlogPage.tsx +47 -0
- package/src/landing/CareersPage.tsx +53 -0
- package/src/landing/ChangelogPage.tsx +33 -0
- package/src/landing/ContactPage.tsx +41 -0
- package/src/landing/DocsPage.tsx +43 -0
- package/src/landing/LandingPage.tsx +702 -0
- package/src/landing/PricingPage.tsx +549 -0
- package/src/landing/PrivacyPage.tsx +117 -0
- package/src/landing/SecurityPage.tsx +42 -0
- package/src/landing/StaticPage.tsx +165 -0
- package/src/landing/TermsPage.tsx +125 -0
- package/src/landing/blogData.ts +312 -0
- package/src/landing/index.ts +18 -0
- package/src/landing/styles.css +3673 -0
- package/src/lib/agent-merge.test.ts +43 -0
- package/src/lib/agent-merge.ts +35 -0
- package/src/lib/api.ts +1294 -0
- package/src/lib/cloudApi.ts +893 -0
- package/src/lib/colors.test.ts +175 -0
- package/src/lib/colors.ts +218 -0
- package/src/lib/config.ts +109 -0
- package/src/lib/hierarchy.ts +242 -0
- package/src/lib/stuckDetection.ts +142 -0
- package/src/lib/useUrlRouting.ts +190 -0
- package/src/types/index.ts +317 -0
- package/src/types/threading.ts +7 -0
- package/out/_next/static/chunks/285-dc644487a8d6500d.js +0 -1
- package/out/_next/static/css/4c58d9cf493aa626.css +0 -1
- /package/out/_next/static/{AqelRhy1vr2nBUcU0Iqcp → IxfA6RZu4trcsEMYlkQra}/_buildManifest.js +0 -0
- /package/out/_next/static/{AqelRhy1vr2nBUcU0Iqcp → IxfA6RZu4trcsEMYlkQra}/_ssgManifest.js +0 -0
- /package/out/_next/static/chunks/{528-d375bc8b46912d2c.js → 528-f5f676996d613c25.js} +0 -0
- /package/out/_next/static/chunks/app/blog/let-them-cook-multi-agent-orchestration/{page-a58308f43557b908.js → page-b194f207fbd91862.js} +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for fetching and managing workspace repositories
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
6
|
+
|
|
7
|
+
export interface WorkspaceRepo {
|
|
8
|
+
id: string;
|
|
9
|
+
githubFullName: string;
|
|
10
|
+
defaultBranch: string;
|
|
11
|
+
isPrivate: boolean;
|
|
12
|
+
syncStatus: string;
|
|
13
|
+
lastSyncedAt: string | null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface UseWorkspaceReposOptions {
|
|
17
|
+
workspaceId?: string;
|
|
18
|
+
apiBaseUrl?: string;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface UseWorkspaceReposReturn {
|
|
23
|
+
repos: WorkspaceRepo[];
|
|
24
|
+
isLoading: boolean;
|
|
25
|
+
error: string | null;
|
|
26
|
+
refetch: () => Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function useWorkspaceRepos({
|
|
30
|
+
workspaceId,
|
|
31
|
+
apiBaseUrl = '/api',
|
|
32
|
+
enabled = true,
|
|
33
|
+
}: UseWorkspaceReposOptions): UseWorkspaceReposReturn {
|
|
34
|
+
const [repos, setRepos] = useState<WorkspaceRepo[]>([]);
|
|
35
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
36
|
+
const [error, setError] = useState<string | null>(null);
|
|
37
|
+
|
|
38
|
+
const fetchRepos = useCallback(async () => {
|
|
39
|
+
if (!workspaceId || !enabled) return;
|
|
40
|
+
|
|
41
|
+
setIsLoading(true);
|
|
42
|
+
setError(null);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const res = await fetch(`${apiBaseUrl}/workspaces/${workspaceId}/repos`, {
|
|
46
|
+
credentials: 'include',
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
throw new Error('Failed to fetch workspace repos');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const data = await res.json();
|
|
54
|
+
setRepos(data.repositories || []);
|
|
55
|
+
} catch (err) {
|
|
56
|
+
setError(err instanceof Error ? err.message : 'Failed to fetch repos');
|
|
57
|
+
console.error('Error fetching workspace repos:', err);
|
|
58
|
+
} finally {
|
|
59
|
+
setIsLoading(false);
|
|
60
|
+
}
|
|
61
|
+
}, [workspaceId, apiBaseUrl, enabled]);
|
|
62
|
+
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
fetchRepos();
|
|
65
|
+
}, [fetchRepos]);
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
repos,
|
|
69
|
+
isLoading,
|
|
70
|
+
error,
|
|
71
|
+
refetch: fetchRepos,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useWorkspaceStatus Hook
|
|
3
|
+
*
|
|
4
|
+
* React hook for monitoring workspace status with auto-wakeup capability.
|
|
5
|
+
* Polls for status updates and can automatically restart stopped workspaces.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
9
|
+
import { cloudApi } from '../../lib/cloudApi';
|
|
10
|
+
|
|
11
|
+
export interface WorkspaceStatus {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
status: string;
|
|
15
|
+
publicUrl?: string;
|
|
16
|
+
isStopped: boolean;
|
|
17
|
+
isRunning: boolean;
|
|
18
|
+
isProvisioning: boolean;
|
|
19
|
+
hasError: boolean;
|
|
20
|
+
config: {
|
|
21
|
+
providers: string[];
|
|
22
|
+
repositories: string[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface UseWorkspaceStatusOptions {
|
|
27
|
+
/** Poll for status updates (default: true) */
|
|
28
|
+
autoRefresh?: boolean;
|
|
29
|
+
/** Interval to poll for status in ms (default: 30000) */
|
|
30
|
+
refreshInterval?: number;
|
|
31
|
+
/** Auto-wakeup when workspace is stopped (default: false) */
|
|
32
|
+
autoWakeup?: boolean;
|
|
33
|
+
/** Callback when workspace status changes */
|
|
34
|
+
onStatusChange?: (status: string, wasRestarted: boolean) => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface UseWorkspaceStatusReturn {
|
|
38
|
+
/** Current workspace data (null if no workspace) */
|
|
39
|
+
workspace: WorkspaceStatus | null;
|
|
40
|
+
/** Whether workspace exists */
|
|
41
|
+
exists: boolean;
|
|
42
|
+
/** Whether the status check is in progress */
|
|
43
|
+
isLoading: boolean;
|
|
44
|
+
/** Whether a wakeup is in progress */
|
|
45
|
+
isWakingUp: boolean;
|
|
46
|
+
/** Status message for display */
|
|
47
|
+
statusMessage: string;
|
|
48
|
+
/** Action needed (wakeup, check_error, etc) */
|
|
49
|
+
actionNeeded: 'wakeup' | 'check_error' | null;
|
|
50
|
+
/** Error if any */
|
|
51
|
+
error: string | null;
|
|
52
|
+
/** Manually refresh status */
|
|
53
|
+
refresh: () => Promise<void>;
|
|
54
|
+
/** Manually wake up workspace */
|
|
55
|
+
wakeup: () => Promise<{ success: boolean; message: string }>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const DEFAULT_OPTIONS: Required<UseWorkspaceStatusOptions> = {
|
|
59
|
+
autoRefresh: true,
|
|
60
|
+
refreshInterval: 30000, // 30 seconds
|
|
61
|
+
autoWakeup: false,
|
|
62
|
+
onStatusChange: () => {},
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export function useWorkspaceStatus(
|
|
66
|
+
options: UseWorkspaceStatusOptions = {}
|
|
67
|
+
): UseWorkspaceStatusReturn {
|
|
68
|
+
// Stabilize options to prevent infinite re-renders
|
|
69
|
+
// Use refs for callbacks and useMemo for primitive values
|
|
70
|
+
const autoRefresh = options.autoRefresh ?? DEFAULT_OPTIONS.autoRefresh;
|
|
71
|
+
const refreshInterval = options.refreshInterval ?? DEFAULT_OPTIONS.refreshInterval;
|
|
72
|
+
const autoWakeup = options.autoWakeup ?? DEFAULT_OPTIONS.autoWakeup;
|
|
73
|
+
|
|
74
|
+
// Store callback in ref to avoid recreating refresh on every render
|
|
75
|
+
const onStatusChangeRef = useRef(options.onStatusChange ?? DEFAULT_OPTIONS.onStatusChange);
|
|
76
|
+
onStatusChangeRef.current = options.onStatusChange ?? DEFAULT_OPTIONS.onStatusChange;
|
|
77
|
+
|
|
78
|
+
const [workspace, setWorkspace] = useState<WorkspaceStatus | null>(null);
|
|
79
|
+
const [exists, setExists] = useState(false);
|
|
80
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
81
|
+
const [isWakingUp, setIsWakingUp] = useState(false);
|
|
82
|
+
const [statusMessage, setStatusMessage] = useState('');
|
|
83
|
+
const [actionNeeded, setActionNeeded] = useState<'wakeup' | 'check_error' | null>(null);
|
|
84
|
+
const [error, setError] = useState<string | null>(null);
|
|
85
|
+
|
|
86
|
+
const intervalRef = useRef<NodeJS.Timeout | null>(null);
|
|
87
|
+
const mountedRef = useRef(true);
|
|
88
|
+
const previousStatusRef = useRef<string | null>(null);
|
|
89
|
+
|
|
90
|
+
// Fetch workspace status
|
|
91
|
+
const refresh = useCallback(async () => {
|
|
92
|
+
try {
|
|
93
|
+
setIsLoading(true);
|
|
94
|
+
setError(null);
|
|
95
|
+
|
|
96
|
+
const result = await cloudApi.getPrimaryWorkspace();
|
|
97
|
+
|
|
98
|
+
if (!mountedRef.current) return;
|
|
99
|
+
|
|
100
|
+
if (result.success) {
|
|
101
|
+
setExists(result.data.exists);
|
|
102
|
+
setStatusMessage(result.data.statusMessage);
|
|
103
|
+
setActionNeeded(result.data.actionNeeded || null);
|
|
104
|
+
|
|
105
|
+
if (result.data.workspace) {
|
|
106
|
+
const ws = result.data.workspace;
|
|
107
|
+
setWorkspace(ws);
|
|
108
|
+
|
|
109
|
+
// Check for status change
|
|
110
|
+
if (previousStatusRef.current && previousStatusRef.current !== ws.status) {
|
|
111
|
+
onStatusChangeRef.current(ws.status, false);
|
|
112
|
+
}
|
|
113
|
+
previousStatusRef.current = ws.status;
|
|
114
|
+
} else {
|
|
115
|
+
setWorkspace(null);
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
setError(result.error);
|
|
119
|
+
}
|
|
120
|
+
} catch (_e) {
|
|
121
|
+
if (mountedRef.current) {
|
|
122
|
+
setError('Failed to fetch workspace status');
|
|
123
|
+
}
|
|
124
|
+
} finally {
|
|
125
|
+
if (mountedRef.current) {
|
|
126
|
+
setIsLoading(false);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}, []); // No dependencies - uses refs for callbacks
|
|
130
|
+
|
|
131
|
+
// Store refresh interval in ref for wakeup callback
|
|
132
|
+
const refreshIntervalRef = useRef(refreshInterval);
|
|
133
|
+
refreshIntervalRef.current = refreshInterval;
|
|
134
|
+
const autoRefreshRef = useRef(autoRefresh);
|
|
135
|
+
autoRefreshRef.current = autoRefresh;
|
|
136
|
+
|
|
137
|
+
// Wake up workspace
|
|
138
|
+
const wakeup = useCallback(async (): Promise<{ success: boolean; message: string }> => {
|
|
139
|
+
if (!workspace?.id) {
|
|
140
|
+
return { success: false, message: 'No workspace to wake up' };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
setIsWakingUp(true);
|
|
145
|
+
setError(null);
|
|
146
|
+
|
|
147
|
+
const result = await cloudApi.wakeupWorkspace(workspace.id);
|
|
148
|
+
|
|
149
|
+
if (!mountedRef.current) {
|
|
150
|
+
return { success: false, message: 'Component unmounted' };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (result.success) {
|
|
154
|
+
// Update local state
|
|
155
|
+
if (result.data.wasRestarted) {
|
|
156
|
+
setStatusMessage(result.data.message);
|
|
157
|
+
setActionNeeded(null);
|
|
158
|
+
onStatusChangeRef.current('starting', true);
|
|
159
|
+
|
|
160
|
+
// Start more frequent polling to catch when workspace is ready
|
|
161
|
+
if (intervalRef.current) {
|
|
162
|
+
clearInterval(intervalRef.current);
|
|
163
|
+
}
|
|
164
|
+
intervalRef.current = setInterval(refresh, 5000); // Poll every 5s during startup
|
|
165
|
+
|
|
166
|
+
// Reset to normal interval after 2 minutes
|
|
167
|
+
setTimeout(() => {
|
|
168
|
+
if (mountedRef.current && intervalRef.current) {
|
|
169
|
+
clearInterval(intervalRef.current);
|
|
170
|
+
if (autoRefreshRef.current) {
|
|
171
|
+
intervalRef.current = setInterval(refresh, refreshIntervalRef.current);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}, 120000);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return { success: true, message: result.data.message };
|
|
178
|
+
} else {
|
|
179
|
+
setError(result.error);
|
|
180
|
+
return { success: false, message: result.error };
|
|
181
|
+
}
|
|
182
|
+
} catch (e) {
|
|
183
|
+
const message = e instanceof Error ? e.message : 'Failed to wake up workspace';
|
|
184
|
+
if (mountedRef.current) {
|
|
185
|
+
setError(message);
|
|
186
|
+
}
|
|
187
|
+
return { success: false, message };
|
|
188
|
+
} finally {
|
|
189
|
+
if (mountedRef.current) {
|
|
190
|
+
setIsWakingUp(false);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}, [workspace?.id, refresh]);
|
|
194
|
+
|
|
195
|
+
// Initial fetch
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
mountedRef.current = true;
|
|
198
|
+
refresh();
|
|
199
|
+
|
|
200
|
+
return () => {
|
|
201
|
+
mountedRef.current = false;
|
|
202
|
+
};
|
|
203
|
+
}, [refresh]);
|
|
204
|
+
|
|
205
|
+
// Auto-refresh polling
|
|
206
|
+
useEffect(() => {
|
|
207
|
+
if (!autoRefresh) return;
|
|
208
|
+
|
|
209
|
+
intervalRef.current = setInterval(refresh, refreshInterval);
|
|
210
|
+
|
|
211
|
+
return () => {
|
|
212
|
+
if (intervalRef.current) {
|
|
213
|
+
clearInterval(intervalRef.current);
|
|
214
|
+
intervalRef.current = null;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}, [autoRefresh, refreshInterval, refresh]);
|
|
218
|
+
|
|
219
|
+
// Auto-wakeup when workspace is stopped
|
|
220
|
+
useEffect(() => {
|
|
221
|
+
if (autoWakeup && workspace?.isStopped && !isWakingUp) {
|
|
222
|
+
wakeup();
|
|
223
|
+
}
|
|
224
|
+
}, [autoWakeup, workspace?.isStopped, isWakingUp, wakeup]);
|
|
225
|
+
|
|
226
|
+
return {
|
|
227
|
+
workspace,
|
|
228
|
+
exists,
|
|
229
|
+
isLoading,
|
|
230
|
+
isWakingUp,
|
|
231
|
+
statusMessage,
|
|
232
|
+
actionNeeded,
|
|
233
|
+
error,
|
|
234
|
+
refresh,
|
|
235
|
+
wakeup,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard V2 React Components
|
|
3
|
+
*
|
|
4
|
+
* This module requires React to be installed.
|
|
5
|
+
* Components now use Tailwind CSS for styling.
|
|
6
|
+
* Install with: npm install react react-dom
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Core Components
|
|
10
|
+
export { AgentCard, type AgentCardProps } from './AgentCard';
|
|
11
|
+
export { AgentList, type AgentListProps } from './AgentList';
|
|
12
|
+
export { ThinkingIndicator, ThinkingDot, type ThinkingIndicatorProps } from './ThinkingIndicator';
|
|
13
|
+
export { MessageStatusIndicator, type MessageStatusIndicatorProps } from './MessageStatusIndicator';
|
|
14
|
+
export { MessageList, type MessageListProps } from './MessageList';
|
|
15
|
+
export { ThreadPanel, type ThreadPanelProps } from './ThreadPanel';
|
|
16
|
+
export { CommandPalette, type CommandPaletteProps, type Command } from './CommandPalette';
|
|
17
|
+
export { SpawnModal, type SpawnModalProps, type SpawnConfig, type SpeakOnTrigger } from './SpawnModal';
|
|
18
|
+
export { NewConversationModal, type NewConversationModalProps } from './NewConversationModal';
|
|
19
|
+
export { TrajectoryViewer, type TrajectoryViewerProps, type TrajectoryStep } from './TrajectoryViewer';
|
|
20
|
+
export { DecisionQueue, type DecisionQueueProps, type Decision } from './DecisionQueue';
|
|
21
|
+
export { ServerCard, type ServerCardProps, type ServerInfo } from './ServerCard';
|
|
22
|
+
export { FleetOverview, type FleetOverviewProps } from './FleetOverview';
|
|
23
|
+
export { BroadcastComposer, type BroadcastComposerProps, type BroadcastTarget } from './BroadcastComposer';
|
|
24
|
+
export { defaultSettings, type Settings } from './settings';
|
|
25
|
+
export { NotificationToast, useToasts, type NotificationToastProps, type Toast } from './NotificationToast';
|
|
26
|
+
export { ThemeProvider, ThemeToggle, useTheme, type ThemeProviderProps, type Theme, type ResolvedTheme } from './ThemeProvider';
|
|
27
|
+
export { App, appStyles, type AppProps } from './App';
|
|
28
|
+
export { MentionAutocomplete, useMentionAutocomplete, getMentionQuery, completeMentionInValue, type MentionAutocompleteProps } from './MentionAutocomplete';
|
|
29
|
+
export { ProjectList, type ProjectListProps } from './ProjectList';
|
|
30
|
+
export { WorkspaceSelector, type WorkspaceSelectorProps, type Workspace } from './WorkspaceSelector';
|
|
31
|
+
export { WorkspaceSettingsPanel, type WorkspaceSettingsPanelProps } from './settings/WorkspaceSettingsPanel';
|
|
32
|
+
export { AddWorkspaceModal, type AddWorkspaceModalProps } from './AddWorkspaceModal';
|
|
33
|
+
export { PricingPlans, type PricingPlansProps, type Plan } from './PricingPlans';
|
|
34
|
+
export { BillingPanel, type BillingPanelProps, type Subscription, type Invoice, type PaymentMethod } from './BillingPanel';
|
|
35
|
+
export { SessionExpiredModal, type SessionExpiredModalProps } from './SessionExpiredModal';
|
|
36
|
+
export { ProvisioningProgress, type ProvisioningProgressProps } from './ProvisioningProgress';
|
|
37
|
+
export {
|
|
38
|
+
CloudSessionProvider,
|
|
39
|
+
useCloudSession,
|
|
40
|
+
useCloudSessionOptional,
|
|
41
|
+
type CloudSessionProviderProps,
|
|
42
|
+
} from './CloudSessionProvider';
|
|
43
|
+
export {
|
|
44
|
+
WorkspaceProvider,
|
|
45
|
+
useWorkspace,
|
|
46
|
+
useWorkspaceWsUrl,
|
|
47
|
+
type WorkspaceProviderProps,
|
|
48
|
+
} from './WorkspaceContext';
|
|
49
|
+
|
|
50
|
+
// Terminal Components
|
|
51
|
+
export { XTermLogViewer, type XTermLogViewerProps } from './XTermLogViewer';
|
|
52
|
+
export { XTermInteractive, type XTermInteractiveProps } from './XTermInteractive';
|
|
53
|
+
|
|
54
|
+
// Layout Components
|
|
55
|
+
export { Sidebar, type SidebarProps } from './layout/Sidebar';
|
|
56
|
+
export { Header, type HeaderProps } from './layout/Header';
|
|
57
|
+
|
|
58
|
+
// Hooks
|
|
59
|
+
export {
|
|
60
|
+
useWebSocket,
|
|
61
|
+
useAgents,
|
|
62
|
+
useMessages,
|
|
63
|
+
useOrchestrator,
|
|
64
|
+
useSession,
|
|
65
|
+
type UseWebSocketOptions,
|
|
66
|
+
type UseWebSocketReturn,
|
|
67
|
+
type UseAgentsOptions,
|
|
68
|
+
type UseAgentsReturn,
|
|
69
|
+
type UseMessagesOptions,
|
|
70
|
+
type UseMessagesReturn,
|
|
71
|
+
type UseOrchestratorOptions,
|
|
72
|
+
type UseOrchestratorResult,
|
|
73
|
+
type UseSessionOptions,
|
|
74
|
+
type UseSessionReturn,
|
|
75
|
+
type DashboardData,
|
|
76
|
+
type AgentWithColor,
|
|
77
|
+
type OrchestratorAgent,
|
|
78
|
+
type OrchestratorEvent,
|
|
79
|
+
type SessionError,
|
|
80
|
+
type CloudUser,
|
|
81
|
+
} from './hooks';
|