add frontend
This commit is contained in:
parent
a0710f5558
commit
2b37cddd1d
BIN
api_database.db
BIN
api_database.db
Binary file not shown.
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
.env.production.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
|
@ -0,0 +1,183 @@
|
||||||
|
# Trading Agents Terminal Frontend
|
||||||
|
|
||||||
|
A React-based terminal/ASCII-style frontend for the Trading Agents multi-agent trading analysis system.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Terminal-Inspired UI**: Bloomberg Terminal-style interface with ASCII aesthetics
|
||||||
|
- **Real-Time Updates**: WebSocket integration for live analysis progress
|
||||||
|
- **Agent Pipeline Visualization**: Visual representation of the multi-agent workflow
|
||||||
|
- **Analysis Management**: Create, monitor, and manage trading analyses
|
||||||
|
- **Report Viewer**: View and download analysis reports
|
||||||
|
- **Log Viewer**: Real-time execution logs with filtering
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- **React 18** with TypeScript
|
||||||
|
- **Vite** for fast development
|
||||||
|
- **Tailwind CSS** with custom terminal theme
|
||||||
|
- **TanStack Query** (React Query) for data fetching
|
||||||
|
- **Zustand** for state management
|
||||||
|
- **React Router** for navigation
|
||||||
|
- **Lucide React** for icons
|
||||||
|
- **Framer Motion** for animations
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Node.js 16+
|
||||||
|
- npm or yarn
|
||||||
|
- Trading Agents API server running (default: http://localhost:8002)
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Start development server
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
The application will be available at http://localhost:5173
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
Create a `.env` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
VITE_API_URL=http://localhost:8002
|
||||||
|
```
|
||||||
|
|
||||||
|
### First Time Setup
|
||||||
|
|
||||||
|
1. Navigate to the Settings page
|
||||||
|
2. Enter your API key (get one from the API server)
|
||||||
|
3. Configure the API URL if different from default
|
||||||
|
4. Start creating analyses!
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── components/
|
||||||
|
│ ├── layout/ # Header, Sidebar, StatusBar, Layout
|
||||||
|
│ ├── ui/ # Reusable UI components (ASCIIBox, Button, etc.)
|
||||||
|
│ ├── analysis/ # Analysis-related components
|
||||||
|
│ ├── agents/ # Agent pipeline visualization
|
||||||
|
│ └── dashboard/ # Dashboard components
|
||||||
|
├── pages/ # Page components
|
||||||
|
├── hooks/ # Custom React hooks
|
||||||
|
├── services/ # API and WebSocket services
|
||||||
|
├── stores/ # Zustand stores
|
||||||
|
├── types/ # TypeScript type definitions
|
||||||
|
├── utils/ # Utility functions
|
||||||
|
└── styles/ # Global styles
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available Scripts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Development server
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Preview production build
|
||||||
|
npm run preview
|
||||||
|
|
||||||
|
# Type checking
|
||||||
|
npm run type-check
|
||||||
|
|
||||||
|
# Linting
|
||||||
|
npm run lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features Guide
|
||||||
|
|
||||||
|
### Dashboard
|
||||||
|
|
||||||
|
- System metrics overview
|
||||||
|
- Recent activity feed
|
||||||
|
- Quick links to common actions
|
||||||
|
|
||||||
|
### Analysis Management
|
||||||
|
|
||||||
|
- Create new analyses with custom parameters
|
||||||
|
- View all analyses in a sortable table
|
||||||
|
- Real-time status updates
|
||||||
|
- Detailed analysis view with agent pipeline
|
||||||
|
|
||||||
|
### Real-Time Monitoring
|
||||||
|
|
||||||
|
- WebSocket connection for live updates
|
||||||
|
- Agent pipeline progress visualization
|
||||||
|
- Live log streaming
|
||||||
|
- Progress bars and status indicators
|
||||||
|
|
||||||
|
### Reports
|
||||||
|
|
||||||
|
- Tabbed interface for different report types
|
||||||
|
- Markdown rendering
|
||||||
|
- Copy to clipboard
|
||||||
|
- Download as text file
|
||||||
|
|
||||||
|
### Settings
|
||||||
|
|
||||||
|
- API key configuration
|
||||||
|
- API URL configuration
|
||||||
|
- Application information
|
||||||
|
|
||||||
|
## Styling
|
||||||
|
|
||||||
|
The application uses a custom terminal/ASCII theme with:
|
||||||
|
|
||||||
|
- Green (#00ff00) - Primary color
|
||||||
|
- Cyan (#00ffff) - Accent color
|
||||||
|
- Yellow (#ffff00) - Warning color
|
||||||
|
- Red (#ff0000) - Error color
|
||||||
|
- Dark background (#0a0e14)
|
||||||
|
|
||||||
|
All components follow the ASCII/terminal aesthetic with box-drawing characters and monospace fonts.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Adding New Pages
|
||||||
|
|
||||||
|
1. Create page component in `src/pages/`
|
||||||
|
2. Add route in `src/App.tsx`
|
||||||
|
3. Add navigation link in `src/components/layout/Sidebar.tsx`
|
||||||
|
|
||||||
|
### Adding New Components
|
||||||
|
|
||||||
|
1. Create component in appropriate directory under `src/components/`
|
||||||
|
2. Use existing UI components for consistency
|
||||||
|
3. Follow terminal styling conventions
|
||||||
|
|
||||||
|
### API Integration
|
||||||
|
|
||||||
|
All API calls go through `src/services/api.ts`. Use the custom hooks in `src/hooks/` for data fetching:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { useAnalyses } from '../hooks/useAnalyses';
|
||||||
|
|
||||||
|
const { data, isLoading } = useAnalyses();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build for production
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Preview the build
|
||||||
|
npm run preview
|
||||||
|
```
|
||||||
|
|
||||||
|
The built files will be in the `dist/` directory. Deploy to any static hosting service (Vercel, Netlify, etc.).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Part of the Trading Agents project.
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
# Trading Agents Frontend - Quick Start
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### 1. Install Dependencies (First Time Only)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Start Development Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
The frontend will be available at: **http://localhost:5173**
|
||||||
|
|
||||||
|
### 3. Configure API Connection
|
||||||
|
|
||||||
|
1. Navigate to http://localhost:5173/settings
|
||||||
|
2. Enter your API key from the backend
|
||||||
|
3. Verify the API URL is correct (default: http://localhost:8002)
|
||||||
|
|
||||||
|
**Note:** Make sure the Trading Agents API is running on port 8002 before using the frontend!
|
||||||
|
|
||||||
|
## First Time Setup
|
||||||
|
|
||||||
|
When you first open the application:
|
||||||
|
|
||||||
|
1. You'll be automatically redirected to the Settings page
|
||||||
|
2. Enter the API key you received when starting the API server
|
||||||
|
3. The API key is stored securely in your browser's local storage
|
||||||
|
4. Once configured, you can start creating analyses!
|
||||||
|
|
||||||
|
## Available Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Development server (with hot reload)
|
||||||
|
npm run dev
|
||||||
|
|
||||||
|
# Build for production
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Preview production build
|
||||||
|
npm run preview
|
||||||
|
|
||||||
|
# Type checking
|
||||||
|
npm run type-check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
**"Invalid or inactive API key"**
|
||||||
|
- Go to Settings and verify your API key
|
||||||
|
- Make sure you copied the entire key from the API startup logs
|
||||||
|
- Check that the API server is running
|
||||||
|
|
||||||
|
**"Cannot connect to API"**
|
||||||
|
- Verify the API URL in Settings (default: http://localhost:8002)
|
||||||
|
- Make sure the API server is running
|
||||||
|
- Check for port conflicts
|
||||||
|
|
||||||
|
**Frontend not loading**
|
||||||
|
- Check that port 5173 is not in use
|
||||||
|
- Try stopping the dev server and starting again
|
||||||
|
- Clear browser cache and reload
|
||||||
|
|
||||||
|
## Development Tips
|
||||||
|
|
||||||
|
- The frontend uses hot module replacement (HMR) for instant updates
|
||||||
|
- Changes to TypeScript files will cause a rebuild
|
||||||
|
- Changes to CSS will update instantly
|
||||||
|
- Browser DevTools are your friend for debugging
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/
|
||||||
|
├── src/
|
||||||
|
│ ├── components/ # React components
|
||||||
|
│ ├── pages/ # Page components
|
||||||
|
│ ├── hooks/ # Custom hooks
|
||||||
|
│ ├── services/ # API & WebSocket
|
||||||
|
│ ├── stores/ # State management
|
||||||
|
│ ├── types/ # TypeScript types
|
||||||
|
│ ├── utils/ # Utilities
|
||||||
|
│ └── styles/ # Global styles
|
||||||
|
├── public/ # Static assets
|
||||||
|
└── index.html # Entry HTML
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Dashboard**: Overview of all analyses and system metrics
|
||||||
|
- **Analyses**: List and manage all trading analyses
|
||||||
|
- **Create Analysis**: Form to start new analysis
|
||||||
|
- **Analysis Detail**: Real-time view of analysis progress
|
||||||
|
- **Settings**: Configure API key and URL
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. Start the API server (see `api/START_API.md`)
|
||||||
|
2. Start the frontend (`npm run dev`)
|
||||||
|
3. Configure your API key in Settings
|
||||||
|
4. Create your first analysis!
|
||||||
|
|
||||||
|
Enjoy using Trading Agents! 🚀
|
||||||
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
import js from '@eslint/js'
|
||||||
|
import globals from 'globals'
|
||||||
|
import reactHooks from 'eslint-plugin-react-hooks'
|
||||||
|
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||||
|
import tseslint from 'typescript-eslint'
|
||||||
|
import { defineConfig, globalIgnores } from 'eslint/config'
|
||||||
|
|
||||||
|
export default defineConfig([
|
||||||
|
globalIgnores(['dist']),
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx}'],
|
||||||
|
extends: [
|
||||||
|
js.configs.recommended,
|
||||||
|
tseslint.configs.recommended,
|
||||||
|
reactHooks.configs['recommended-latest'],
|
||||||
|
reactRefresh.configs.vite,
|
||||||
|
],
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 2020,
|
||||||
|
globals: globals.browser,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/png" href="/litadel.png" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Litadel - Multi-Agent Trading System</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,42 @@
|
||||||
|
{
|
||||||
|
"name": "frontend",
|
||||||
|
"private": true,
|
||||||
|
"version": "0.0.0",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "tsc -b && vite build",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@tailwindcss/postcss": "^4.1.15",
|
||||||
|
"@tanstack/react-query": "^5.90.5",
|
||||||
|
"autoprefixer": "^10.4.21",
|
||||||
|
"axios": "^1.12.2",
|
||||||
|
"framer-motion": "^12.23.24",
|
||||||
|
"lucide-react": "^0.546.0",
|
||||||
|
"postcss": "^8.5.6",
|
||||||
|
"react": "^19.1.1",
|
||||||
|
"react-dom": "^19.1.1",
|
||||||
|
"react-hot-toast": "^2.6.0",
|
||||||
|
"react-router-dom": "^7.9.4",
|
||||||
|
"recharts": "^3.3.0",
|
||||||
|
"tailwindcss": "^4.1.15",
|
||||||
|
"zustand": "^5.0.8"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^9.36.0",
|
||||||
|
"@types/node": "^24.6.0",
|
||||||
|
"@types/react": "^19.1.16",
|
||||||
|
"@types/react-dom": "^19.1.9",
|
||||||
|
"@vitejs/plugin-react": "^5.0.4",
|
||||||
|
"eslint": "^9.36.0",
|
||||||
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
|
"eslint-plugin-react-refresh": "^0.4.22",
|
||||||
|
"globals": "^16.4.0",
|
||||||
|
"typescript": "~5.9.3",
|
||||||
|
"typescript-eslint": "^8.45.0",
|
||||||
|
"vite": "^7.1.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
'@tailwindcss/postcss': {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 120 KiB |
|
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
"target": "ES2022",
|
||||||
|
"useDefineForClassFields": true,
|
||||||
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"types": ["vite/client"],
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{ "path": "./tsconfig.app.json" },
|
||||||
|
{ "path": "./tsconfig.node.json" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
"target": "ES2023",
|
||||||
|
"lib": ["ES2023"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"types": ["node"],
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import react from '@vitejs/plugin-react'
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [react()],
|
||||||
|
})
|
||||||
Loading…
Reference in New Issue