 85bf1341f3
			
		
	
	85bf1341f3
	
	
	
		
			
			Frontend Enhancements: - Complete React TypeScript frontend with modern UI components - Distributed workflows management interface with real-time updates - Socket.IO integration for live agent status monitoring - Agent management dashboard with cluster visualization - Project management interface with metrics and task tracking - Responsive design with proper error handling and loading states Backend Infrastructure: - Distributed coordinator for multi-agent workflow orchestration - Cluster management API with comprehensive agent operations - Enhanced database models for agents and projects - Project service for filesystem-based project discovery - Performance monitoring and metrics collection - Comprehensive API documentation and error handling Documentation: - Complete distributed development guide (README_DISTRIBUTED.md) - Comprehensive development report with architecture insights - System configuration templates and deployment guides The platform now provides a complete web interface for managing the distributed AI cluster with real-time monitoring, workflow orchestration, and agent coordination capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use client";
 | |
| 
 | |
| // src/useQueries.ts
 | |
| import * as React from "react";
 | |
| import {
 | |
|   QueriesObserver,
 | |
|   QueryObserver,
 | |
|   noop,
 | |
|   notifyManager
 | |
| } from "@tanstack/query-core";
 | |
| import { useQueryClient } from "./QueryClientProvider.js";
 | |
| import { useIsRestoring } from "./IsRestoringProvider.js";
 | |
| import { useQueryErrorResetBoundary } from "./QueryErrorResetBoundary.js";
 | |
| import {
 | |
|   ensurePreventErrorBoundaryRetry,
 | |
|   getHasError,
 | |
|   useClearResetErrorBoundary
 | |
| } from "./errorBoundaryUtils.js";
 | |
| import {
 | |
|   ensureSuspenseTimers,
 | |
|   fetchOptimistic,
 | |
|   shouldSuspend,
 | |
|   willFetch
 | |
| } from "./suspense.js";
 | |
| function useQueries({
 | |
|   queries,
 | |
|   ...options
 | |
| }, queryClient) {
 | |
|   const client = useQueryClient(queryClient);
 | |
|   const isRestoring = useIsRestoring();
 | |
|   const errorResetBoundary = useQueryErrorResetBoundary();
 | |
|   const defaultedQueries = React.useMemo(
 | |
|     () => queries.map((opts) => {
 | |
|       const defaultedOptions = client.defaultQueryOptions(
 | |
|         opts
 | |
|       );
 | |
|       defaultedOptions._optimisticResults = isRestoring ? "isRestoring" : "optimistic";
 | |
|       return defaultedOptions;
 | |
|     }),
 | |
|     [queries, client, isRestoring]
 | |
|   );
 | |
|   defaultedQueries.forEach((query) => {
 | |
|     ensureSuspenseTimers(query);
 | |
|     ensurePreventErrorBoundaryRetry(query, errorResetBoundary);
 | |
|   });
 | |
|   useClearResetErrorBoundary(errorResetBoundary);
 | |
|   const [observer] = React.useState(
 | |
|     () => new QueriesObserver(
 | |
|       client,
 | |
|       defaultedQueries,
 | |
|       options
 | |
|     )
 | |
|   );
 | |
|   const [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(
 | |
|     defaultedQueries,
 | |
|     options.combine
 | |
|   );
 | |
|   const shouldSubscribe = !isRestoring && options.subscribed !== false;
 | |
|   React.useSyncExternalStore(
 | |
|     React.useCallback(
 | |
|       (onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop,
 | |
|       [observer, shouldSubscribe]
 | |
|     ),
 | |
|     () => observer.getCurrentResult(),
 | |
|     () => observer.getCurrentResult()
 | |
|   );
 | |
|   React.useEffect(() => {
 | |
|     observer.setQueries(
 | |
|       defaultedQueries,
 | |
|       options
 | |
|     );
 | |
|   }, [defaultedQueries, options, observer]);
 | |
|   const shouldAtLeastOneSuspend = optimisticResult.some(
 | |
|     (result, index) => shouldSuspend(defaultedQueries[index], result)
 | |
|   );
 | |
|   const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {
 | |
|     const opts = defaultedQueries[index];
 | |
|     if (opts) {
 | |
|       const queryObserver = new QueryObserver(client, opts);
 | |
|       if (shouldSuspend(opts, result)) {
 | |
|         return fetchOptimistic(opts, queryObserver, errorResetBoundary);
 | |
|       } else if (willFetch(result, isRestoring)) {
 | |
|         void fetchOptimistic(opts, queryObserver, errorResetBoundary);
 | |
|       }
 | |
|     }
 | |
|     return [];
 | |
|   }) : [];
 | |
|   if (suspensePromises.length > 0) {
 | |
|     throw Promise.all(suspensePromises);
 | |
|   }
 | |
|   const firstSingleResultWhichShouldThrow = optimisticResult.find(
 | |
|     (result, index) => {
 | |
|       const query = defaultedQueries[index];
 | |
|       return query && getHasError({
 | |
|         result,
 | |
|         errorResetBoundary,
 | |
|         throwOnError: query.throwOnError,
 | |
|         query: client.getQueryCache().get(query.queryHash),
 | |
|         suspense: query.suspense
 | |
|       });
 | |
|     }
 | |
|   );
 | |
|   if (firstSingleResultWhichShouldThrow == null ? void 0 : firstSingleResultWhichShouldThrow.error) {
 | |
|     throw firstSingleResultWhichShouldThrow.error;
 | |
|   }
 | |
|   return getCombinedResult(trackResult());
 | |
| }
 | |
| export {
 | |
|   useQueries
 | |
| };
 | |
| //# sourceMappingURL=useQueries.js.map
 |