@agent-relay/dashboard 2.0.81 → 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.
Files changed (244) hide show
  1. package/out/404.html +1 -1
  2. package/out/_next/static/chunks/{118-4c8241b0218335de.js → 118-ae2b650136a5a5fc.js} +1 -1
  3. package/out/_next/static/chunks/407-0c82986cf79c8ecb.js +1 -0
  4. package/out/_next/static/chunks/app/app/[[...slug]]/{page-1e81c047cff17212.js → page-f7eca1b66fb4249b.js} +1 -1
  5. package/out/_next/static/chunks/app/{page-6892fe2dd07fb48b.js → page-0ee604f7070d14c0.js} +1 -1
  6. package/out/_next/static/css/8968d98ed4c4d33f.css +1 -0
  7. package/out/about.html +2 -2
  8. package/out/about.txt +1 -1
  9. package/out/app/onboarding.html +1 -1
  10. package/out/app/onboarding.txt +1 -1
  11. package/out/app.html +1 -1
  12. package/out/app.txt +2 -2
  13. package/out/blog/go-to-bed-wake-up-to-a-finished-product.html +2 -2
  14. package/out/blog/go-to-bed-wake-up-to-a-finished-product.txt +1 -1
  15. package/out/blog/let-them-cook-multi-agent-orchestration.html +2 -2
  16. package/out/blog/let-them-cook-multi-agent-orchestration.txt +2 -2
  17. package/out/blog.html +2 -2
  18. package/out/blog.txt +1 -1
  19. package/out/careers.html +2 -2
  20. package/out/careers.txt +1 -1
  21. package/out/changelog.html +2 -2
  22. package/out/changelog.txt +1 -1
  23. package/out/cloud/link.html +1 -1
  24. package/out/cloud/link.txt +2 -2
  25. package/out/complete-profile.html +2 -2
  26. package/out/complete-profile.txt +1 -1
  27. package/out/connect-repos.html +1 -1
  28. package/out/connect-repos.txt +1 -1
  29. package/out/contact.html +2 -2
  30. package/out/contact.txt +1 -1
  31. package/out/docs.html +2 -2
  32. package/out/docs.txt +1 -1
  33. package/out/history.html +1 -1
  34. package/out/history.txt +2 -2
  35. package/out/index.html +1 -1
  36. package/out/index.txt +2 -2
  37. package/out/login.html +2 -2
  38. package/out/login.txt +1 -1
  39. package/out/metrics.html +1 -1
  40. package/out/metrics.txt +2 -2
  41. package/out/pricing.html +2 -2
  42. package/out/pricing.txt +1 -1
  43. package/out/privacy.html +2 -2
  44. package/out/privacy.txt +1 -1
  45. package/out/providers/setup/claude.html +1 -1
  46. package/out/providers/setup/claude.txt +1 -1
  47. package/out/providers/setup/codex.html +1 -1
  48. package/out/providers/setup/codex.txt +1 -1
  49. package/out/providers/setup/cursor.html +1 -1
  50. package/out/providers/setup/cursor.txt +1 -1
  51. package/out/providers.html +1 -1
  52. package/out/providers.txt +1 -1
  53. package/out/security.html +2 -2
  54. package/out/security.txt +1 -1
  55. package/out/signup.html +2 -2
  56. package/out/signup.txt +1 -1
  57. package/out/terms.html +2 -2
  58. package/out/terms.txt +1 -1
  59. package/package.json +7 -1
  60. package/src/app/about/page.tsx +7 -0
  61. package/src/app/app/[[...slug]]/DashboardPageClient.tsx +853 -0
  62. package/src/app/app/[[...slug]]/page.tsx +23 -0
  63. package/src/app/app/onboarding/page.tsx +394 -0
  64. package/src/app/apple-icon.png +0 -0
  65. package/src/app/blog/go-to-bed-wake-up-to-a-finished-product/page.tsx +88 -0
  66. package/src/app/blog/let-them-cook-multi-agent-orchestration/page.tsx +93 -0
  67. package/src/app/blog/page.tsx +15 -0
  68. package/src/app/careers/page.tsx +7 -0
  69. package/src/app/changelog/page.tsx +7 -0
  70. package/src/app/cloud/link/page.tsx +464 -0
  71. package/src/app/complete-profile/page.tsx +204 -0
  72. package/src/app/connect-repos/page.tsx +410 -0
  73. package/src/app/contact/page.tsx +7 -0
  74. package/src/app/docs/page.tsx +7 -0
  75. package/src/app/favicon.png +0 -0
  76. package/src/app/globals.css +200 -0
  77. package/src/app/history/page.tsx +658 -0
  78. package/src/app/layout.tsx +25 -0
  79. package/src/app/login/page.tsx +424 -0
  80. package/src/app/metrics/page.tsx +781 -0
  81. package/src/app/page.tsx +59 -0
  82. package/src/app/pricing/page.tsx +7 -0
  83. package/src/app/privacy/page.tsx +7 -0
  84. package/src/app/providers/page.tsx +193 -0
  85. package/src/app/providers/setup/[provider]/ProviderSetupClient.tsx +197 -0
  86. package/src/app/providers/setup/[provider]/constants.ts +35 -0
  87. package/src/app/providers/setup/[provider]/page.tsx +42 -0
  88. package/src/app/security/page.tsx +7 -0
  89. package/src/app/signup/page.tsx +533 -0
  90. package/src/app/terms/page.tsx +7 -0
  91. package/src/components/ActivityFeed.tsx +216 -0
  92. package/src/components/AddWorkspaceModal.tsx +170 -0
  93. package/src/components/AgentCard.test.tsx +134 -0
  94. package/src/components/AgentCard.tsx +585 -0
  95. package/src/components/AgentList.test.tsx +147 -0
  96. package/src/components/AgentList.tsx +419 -0
  97. package/src/components/AgentLogPreview.tsx +173 -0
  98. package/src/components/AgentProfilePanel.tsx +569 -0
  99. package/src/components/App.tsx +3424 -0
  100. package/src/components/BillingPanel.tsx +922 -0
  101. package/src/components/BillingResult.tsx +447 -0
  102. package/src/components/BroadcastComposer.tsx +690 -0
  103. package/src/components/ChannelAdminPanel.tsx +773 -0
  104. package/src/components/ChannelBrowser.tsx +385 -0
  105. package/src/components/ChannelChat.tsx +261 -0
  106. package/src/components/ChannelSidebar.tsx +399 -0
  107. package/src/components/CloudSessionProvider.tsx +130 -0
  108. package/src/components/CommandPalette.tsx +815 -0
  109. package/src/components/ConfirmationDialog.tsx +133 -0
  110. package/src/components/ConversationHistory.tsx +518 -0
  111. package/src/components/CoordinatorPanel.tsx +956 -0
  112. package/src/components/DecisionQueue.tsx +717 -0
  113. package/src/components/DirectMessageView.tsx +164 -0
  114. package/src/components/FileAutocomplete.tsx +368 -0
  115. package/src/components/FleetOverview.tsx +278 -0
  116. package/src/components/LogViewer.tsx +310 -0
  117. package/src/components/LogViewerPanel.tsx +482 -0
  118. package/src/components/Logo.tsx +284 -0
  119. package/src/components/MentionAutocomplete.tsx +384 -0
  120. package/src/components/MessageComposer.tsx +473 -0
  121. package/src/components/MessageList.tsx +725 -0
  122. package/src/components/MessageSenderName.tsx +91 -0
  123. package/src/components/MessageStatusIndicator.tsx +142 -0
  124. package/src/components/NewConversationModal.tsx +400 -0
  125. package/src/components/NotificationToast.tsx +488 -0
  126. package/src/components/OnlineUsersIndicator.tsx +164 -0
  127. package/src/components/Pagination.tsx +124 -0
  128. package/src/components/PricingPlans.tsx +386 -0
  129. package/src/components/ProjectList.tsx +711 -0
  130. package/src/components/ProviderAuthFlow.tsx +343 -0
  131. package/src/components/ProviderConnectionList.tsx +375 -0
  132. package/src/components/ProvisioningProgress.tsx +730 -0
  133. package/src/components/ReactionChips.tsx +70 -0
  134. package/src/components/ReactionPicker.tsx +121 -0
  135. package/src/components/RepoAccessPanel.tsx +787 -0
  136. package/src/components/RepositoriesPanel.tsx +901 -0
  137. package/src/components/ServerCard.tsx +202 -0
  138. package/src/components/SessionExpiredModal.tsx +128 -0
  139. package/src/components/SpawnModal.test.tsx +190 -0
  140. package/src/components/SpawnModal.tsx +1001 -0
  141. package/src/components/TaskAssignmentUI.tsx +375 -0
  142. package/src/components/TerminalProviderSetup.tsx +517 -0
  143. package/src/components/ThemeProvider.tsx +159 -0
  144. package/src/components/ThinkingIndicator.tsx +231 -0
  145. package/src/components/ThreadList.tsx +198 -0
  146. package/src/components/ThreadPanel.tsx +405 -0
  147. package/src/components/TrajectoryViewer.tsx +698 -0
  148. package/src/components/TypingIndicator.tsx +69 -0
  149. package/src/components/UsageBanner.tsx +231 -0
  150. package/src/components/UserProfilePanel.tsx +233 -0
  151. package/src/components/WorkspaceContext.tsx +95 -0
  152. package/src/components/WorkspaceSelector.tsx +234 -0
  153. package/src/components/WorkspaceStatusIndicator.tsx +396 -0
  154. package/src/components/XTermInteractive.tsx +516 -0
  155. package/src/components/XTermLogViewer.tsx +719 -0
  156. package/src/components/channels/ChannelDialogs.tsx +1411 -0
  157. package/src/components/channels/ChannelHeader.tsx +317 -0
  158. package/src/components/channels/ChannelMessageList.tsx +463 -0
  159. package/src/components/channels/ChannelViewV1.tsx +146 -0
  160. package/src/components/channels/MessageInput.tsx +302 -0
  161. package/src/components/channels/SearchInput.tsx +172 -0
  162. package/src/components/channels/SearchResults.tsx +336 -0
  163. package/src/components/channels/api.test.ts +1527 -0
  164. package/src/components/channels/api.ts +703 -0
  165. package/src/components/channels/index.ts +76 -0
  166. package/src/components/channels/mockApi.ts +344 -0
  167. package/src/components/channels/types.ts +566 -0
  168. package/src/components/hooks/index.ts +58 -0
  169. package/src/components/hooks/useAgentLogs.ts +504 -0
  170. package/src/components/hooks/useAgents.ts +127 -0
  171. package/src/components/hooks/useBroadcastDedup.test.ts +371 -0
  172. package/src/components/hooks/useBroadcastDedup.ts +86 -0
  173. package/src/components/hooks/useChannelAdmin.ts +329 -0
  174. package/src/components/hooks/useChannelBrowser.ts +239 -0
  175. package/src/components/hooks/useChannelCommands.ts +138 -0
  176. package/src/components/hooks/useChannels.ts +367 -0
  177. package/src/components/hooks/useDebounce.ts +29 -0
  178. package/src/components/hooks/useDirectMessage.test.ts +952 -0
  179. package/src/components/hooks/useDirectMessage.ts +141 -0
  180. package/src/components/hooks/useMessages.ts +310 -0
  181. package/src/components/hooks/useOrchestrator.test.ts +165 -0
  182. package/src/components/hooks/useOrchestrator.ts +424 -0
  183. package/src/components/hooks/usePinnedAgents.test.ts +356 -0
  184. package/src/components/hooks/usePinnedAgents.ts +140 -0
  185. package/src/components/hooks/usePresence.test.ts +245 -0
  186. package/src/components/hooks/usePresence.ts +377 -0
  187. package/src/components/hooks/useRecentRepos.ts +130 -0
  188. package/src/components/hooks/useSession.ts +209 -0
  189. package/src/components/hooks/useThread.ts +138 -0
  190. package/src/components/hooks/useTrajectory.ts +265 -0
  191. package/src/components/hooks/useWebSocket.ts +290 -0
  192. package/src/components/hooks/useWorkspaceMembers.ts +132 -0
  193. package/src/components/hooks/useWorkspaceRepos.ts +73 -0
  194. package/src/components/hooks/useWorkspaceStatus.ts +237 -0
  195. package/src/components/index.ts +81 -0
  196. package/src/components/layout/Header.tsx +311 -0
  197. package/src/components/layout/RepoContextHeader.tsx +361 -0
  198. package/src/components/layout/Sidebar.archive.test.tsx +126 -0
  199. package/src/components/layout/Sidebar.test.tsx +691 -0
  200. package/src/components/layout/Sidebar.tsx +900 -0
  201. package/src/components/layout/index.ts +7 -0
  202. package/src/components/settings/BillingSettingsPanel.tsx +564 -0
  203. package/src/components/settings/SettingsPage.tsx +683 -0
  204. package/src/components/settings/TeamSettingsPanel.tsx +560 -0
  205. package/src/components/settings/WorkspaceSettingsPanel.tsx +1368 -0
  206. package/src/components/settings/index.ts +11 -0
  207. package/src/components/settings/types.ts +79 -0
  208. package/src/components/utils/messageFormatting.test.tsx +331 -0
  209. package/src/components/utils/messageFormatting.tsx +597 -0
  210. package/src/index.ts +63 -0
  211. package/src/landing/AboutPage.tsx +77 -0
  212. package/src/landing/BlogContent.tsx +187 -0
  213. package/src/landing/BlogPage.tsx +47 -0
  214. package/src/landing/CareersPage.tsx +53 -0
  215. package/src/landing/ChangelogPage.tsx +33 -0
  216. package/src/landing/ContactPage.tsx +41 -0
  217. package/src/landing/DocsPage.tsx +43 -0
  218. package/src/landing/LandingPage.tsx +702 -0
  219. package/src/landing/PricingPage.tsx +549 -0
  220. package/src/landing/PrivacyPage.tsx +117 -0
  221. package/src/landing/SecurityPage.tsx +42 -0
  222. package/src/landing/StaticPage.tsx +165 -0
  223. package/src/landing/TermsPage.tsx +125 -0
  224. package/src/landing/blogData.ts +312 -0
  225. package/src/landing/index.ts +18 -0
  226. package/src/landing/styles.css +3673 -0
  227. package/src/lib/agent-merge.test.ts +43 -0
  228. package/src/lib/agent-merge.ts +35 -0
  229. package/src/lib/api.ts +1294 -0
  230. package/src/lib/cloudApi.ts +893 -0
  231. package/src/lib/colors.test.ts +175 -0
  232. package/src/lib/colors.ts +218 -0
  233. package/src/lib/config.ts +109 -0
  234. package/src/lib/hierarchy.ts +242 -0
  235. package/src/lib/stuckDetection.ts +142 -0
  236. package/src/lib/useUrlRouting.ts +190 -0
  237. package/src/types/index.ts +317 -0
  238. package/src/types/threading.ts +7 -0
  239. package/out/_next/static/chunks/285-dc644487a8d6500d.js +0 -1
  240. package/out/_next/static/css/4c58d9cf493aa626.css +0 -1
  241. /package/out/_next/static/{dYlczDQI12PIQ3tqq3N4Y → IxfA6RZu4trcsEMYlkQra}/_buildManifest.js +0 -0
  242. /package/out/_next/static/{dYlczDQI12PIQ3tqq3N4Y → IxfA6RZu4trcsEMYlkQra}/_ssgManifest.js +0 -0
  243. /package/out/_next/static/chunks/{528-d375bc8b46912d2c.js → 528-f5f676996d613c25.js} +0 -0
  244. /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';