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>
153 lines
5.3 KiB
TypeScript
153 lines
5.3 KiB
TypeScript
import React from 'react';
|
|
|
|
type ToastTypes = 'normal' | 'action' | 'success' | 'info' | 'warning' | 'error' | 'loading' | 'default';
|
|
type PromiseT<Data = any> = Promise<Data> | (() => Promise<Data>);
|
|
interface PromiseIExtendedResult extends ExternalToast {
|
|
message: React.ReactNode;
|
|
}
|
|
type PromiseTExtendedResult<Data = any> = PromiseIExtendedResult | ((data: Data) => PromiseIExtendedResult | Promise<PromiseIExtendedResult>);
|
|
type PromiseTResult<Data = any> = string | React.ReactNode | ((data: Data) => React.ReactNode | string | Promise<React.ReactNode | string>);
|
|
type PromiseExternalToast = Omit<ExternalToast, 'description'>;
|
|
type PromiseData<ToastData = any> = PromiseExternalToast & {
|
|
loading?: string | React.ReactNode;
|
|
success?: PromiseTResult<ToastData> | PromiseTExtendedResult<ToastData>;
|
|
error?: PromiseTResult | PromiseTExtendedResult;
|
|
description?: PromiseTResult;
|
|
finally?: () => void | Promise<void>;
|
|
};
|
|
interface ToastClassnames {
|
|
toast?: string;
|
|
title?: string;
|
|
description?: string;
|
|
loader?: string;
|
|
closeButton?: string;
|
|
cancelButton?: string;
|
|
actionButton?: string;
|
|
success?: string;
|
|
error?: string;
|
|
info?: string;
|
|
warning?: string;
|
|
loading?: string;
|
|
default?: string;
|
|
content?: string;
|
|
icon?: string;
|
|
}
|
|
interface ToastIcons {
|
|
success?: React.ReactNode;
|
|
info?: React.ReactNode;
|
|
warning?: React.ReactNode;
|
|
error?: React.ReactNode;
|
|
loading?: React.ReactNode;
|
|
close?: React.ReactNode;
|
|
}
|
|
interface Action {
|
|
label: React.ReactNode;
|
|
onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
actionButtonStyle?: React.CSSProperties;
|
|
}
|
|
interface ToastT {
|
|
id: number | string;
|
|
title?: (() => React.ReactNode) | React.ReactNode;
|
|
type?: ToastTypes;
|
|
icon?: React.ReactNode;
|
|
jsx?: React.ReactNode;
|
|
richColors?: boolean;
|
|
invert?: boolean;
|
|
closeButton?: boolean;
|
|
dismissible?: boolean;
|
|
description?: (() => React.ReactNode) | React.ReactNode;
|
|
duration?: number;
|
|
delete?: boolean;
|
|
action?: Action | React.ReactNode;
|
|
cancel?: Action | React.ReactNode;
|
|
onDismiss?: (toast: ToastT) => void;
|
|
onAutoClose?: (toast: ToastT) => void;
|
|
promise?: PromiseT;
|
|
cancelButtonStyle?: React.CSSProperties;
|
|
actionButtonStyle?: React.CSSProperties;
|
|
style?: React.CSSProperties;
|
|
unstyled?: boolean;
|
|
className?: string;
|
|
classNames?: ToastClassnames;
|
|
descriptionClassName?: string;
|
|
position?: Position;
|
|
}
|
|
type Position = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center';
|
|
interface ToastOptions {
|
|
className?: string;
|
|
closeButton?: boolean;
|
|
descriptionClassName?: string;
|
|
style?: React.CSSProperties;
|
|
cancelButtonStyle?: React.CSSProperties;
|
|
actionButtonStyle?: React.CSSProperties;
|
|
duration?: number;
|
|
unstyled?: boolean;
|
|
classNames?: ToastClassnames;
|
|
closeButtonAriaLabel?: string;
|
|
}
|
|
type Offset = {
|
|
top?: string | number;
|
|
right?: string | number;
|
|
bottom?: string | number;
|
|
left?: string | number;
|
|
} | string | number;
|
|
interface ToasterProps {
|
|
invert?: boolean;
|
|
theme?: 'light' | 'dark' | 'system';
|
|
position?: Position;
|
|
hotkey?: string[];
|
|
richColors?: boolean;
|
|
expand?: boolean;
|
|
duration?: number;
|
|
gap?: number;
|
|
visibleToasts?: number;
|
|
closeButton?: boolean;
|
|
toastOptions?: ToastOptions;
|
|
className?: string;
|
|
style?: React.CSSProperties;
|
|
offset?: Offset;
|
|
mobileOffset?: Offset;
|
|
dir?: 'rtl' | 'ltr' | 'auto';
|
|
swipeDirections?: SwipeDirection[];
|
|
icons?: ToastIcons;
|
|
containerAriaLabel?: string;
|
|
}
|
|
type SwipeDirection = 'top' | 'right' | 'bottom' | 'left';
|
|
interface ToastToDismiss {
|
|
id: number | string;
|
|
dismiss: boolean;
|
|
}
|
|
type ExternalToast = Omit<ToastT, 'id' | 'type' | 'title' | 'jsx' | 'delete' | 'promise'> & {
|
|
id?: number | string;
|
|
};
|
|
|
|
type titleT = (() => React.ReactNode) | React.ReactNode;
|
|
declare const toast: ((message: titleT, data?: ExternalToast) => string | number) & {
|
|
success: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
info: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
warning: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
error: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
custom: (jsx: (id: number | string) => React.ReactElement, data?: ExternalToast) => string | number;
|
|
message: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
promise: <ToastData>(promise: PromiseT<ToastData>, data?: PromiseData<ToastData>) => (string & {
|
|
unwrap: () => Promise<ToastData>;
|
|
}) | (number & {
|
|
unwrap: () => Promise<ToastData>;
|
|
}) | {
|
|
unwrap: () => Promise<ToastData>;
|
|
};
|
|
dismiss: (id?: number | string) => string | number;
|
|
loading: (message: titleT | React.ReactNode, data?: ExternalToast) => string | number;
|
|
} & {
|
|
getHistory: () => (ToastT | ToastToDismiss)[];
|
|
getToasts: () => (ToastT | ToastToDismiss)[];
|
|
};
|
|
|
|
declare function useSonner(): {
|
|
toasts: ToastT[];
|
|
};
|
|
declare const Toaster: React.ForwardRefExoticComponent<ToasterProps & React.RefAttributes<HTMLElement>>;
|
|
|
|
export { Toaster, toast, useSonner };
|
|
export type { Action, ExternalToast, ToastClassnames, ToastT, ToastToDismiss, ToasterProps };
|