diff --git a/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx b/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx index 054fd953..662d469a 100644 --- a/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx +++ b/ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx @@ -133,7 +133,7 @@ type DenFlowContextValue = { selectedStatusMeta: { label: string; bucket: WorkerStatusBucket }; isSelectedWorkerFailed: boolean; ownedWorkerCount: number; - refreshWorkers: (options?: { keepSelection?: boolean }) => Promise; + refreshWorkers: (options?: { keepSelection?: boolean; quiet?: boolean }) => Promise; launchWorker: (options?: { source?: "manual" | "signup_auto"; workerNameOverride?: string }) => Promise; checkWorkerStatus: (options?: { workerId?: string; quiet?: boolean; background?: boolean }) => Promise; generateWorkerToken: () => Promise; @@ -229,6 +229,7 @@ export function DenFlowProvider({ children }: { children: ReactNode }) { const [onboardingIntent, setOnboardingIntent] = useState(() => readLocalStorage(ONBOARDING_INTENT_STORAGE_KEY)); const onboardingAutoLaunchKeyRef = useRef(null); const socialSignupHandledRef = useRef(null); + const pendingWorkersRequestRef = useRef | null>(null); const selectedWorker = workers.find((item) => item.workerId === workerLookupId) ?? null; const activeWorker = @@ -583,10 +584,14 @@ export function DenFlowProvider({ children }: { children: ReactNode }) { } try { - const { response, payload } = await requestJson("/v1/workers?limit=20", { - method: "GET", - headers: authToken ? { Authorization: `Bearer ${authToken}` } : undefined - }); + if (!pendingWorkersRequestRef.current) { + pendingWorkersRequestRef.current = requestJson("/v1/workers?limit=20", { + method: "GET", + headers: authToken ? { Authorization: `Bearer ${authToken}` } : undefined + }); + } + + const { response, payload } = await pendingWorkersRequestRef.current; if (!response.ok) { if (!options.quiet) { @@ -640,6 +645,7 @@ export function DenFlowProvider({ children }: { children: ReactNode }) { } setWorkersLoadedOnce(true); } finally { + pendingWorkersRequestRef.current = null; if (!options.quiet) { setWorkersBusy(false); } @@ -1583,7 +1589,6 @@ export function DenFlowProvider({ children }: { children: ReactNode }) { setPendingRestoredWorkerId(null); setLaunchStatus("Worker is ready to connect."); appendEvent("success", "Owner token ready", `Worker ID ${id}`); - void refreshWorkers({ keepSelection: true }); } catch (error) { const message = error instanceof Error ? error.message : "Unknown network error"; setLaunchError(message); diff --git a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/background-agents-screen.tsx b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/background-agents-screen.tsx index 42a621f3..e4faeb68 100644 --- a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/background-agents-screen.tsx +++ b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_components/background-agents-screen.tsx @@ -197,13 +197,16 @@ export function BackgroundAgentsScreen() {
-

{workers.length > 0 ? "Current sandboxes" : "Example workflows"}

+
+

{workers.length > 0 ? "Current sandboxes" : "Example workflows"}

+ {workersLoadedOnce && workersBusy ? Refreshing... : null} +

Background workflows

- {!workersLoadedOnce || workersBusy ? ( + {!workersLoadedOnce ? (
Loading sandboxes...
) : workers.length > 0 ? ( workers.map((worker) => { diff --git a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_providers/org-dashboard-provider.tsx b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_providers/org-dashboard-provider.tsx index f9565ba0..196408bc 100644 --- a/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_providers/org-dashboard-provider.tsx +++ b/ee/apps/den-web/app/(den)/o/[orgSlug]/dashboard/_providers/org-dashboard-provider.tsx @@ -49,7 +49,7 @@ export function OrgDashboardProvider({ children: ReactNode; }) { const router = useRouter(); - const { user, sessionHydrated, signOut, refreshWorkers } = useDenFlow(); + const { user, sessionHydrated, signOut, refreshWorkers, workersLoadedOnce } = useDenFlow(); const [orgDirectory, setOrgDirectory] = useState([]); const [orgContext, setOrgContext] = useState(null); const [orgBusy, setOrgBusy] = useState(false); @@ -103,7 +103,7 @@ export function OrgDashboardProvider({ setOrgDirectory(directory.map((entry) => ({ ...entry, isActive: entry.slug === context.organization.slug }))); setOrgContext(context); - await refreshWorkers({ keepSelection: false }); + await refreshWorkers({ keepSelection: false, quiet: workersLoadedOnce }); } catch (error) { setOrgError(error instanceof Error ? error.message : "Failed to load organization details."); } finally {