Skip to main content

Frontend Development Guide

Tech Stack

TechnologyVersionPurpose
React18.3.1UI framework
TypeScript~5.7.2Type safety
Vite6.0.3Build tool and dev server
TanStack React Query5.62.0Data fetching and caching
Zustand5.0.2Client state management
react-router-dom7.0.2Routing
Bootstrap5.3.8CSS framework
Chart.js4.4.7Data visualization
xterm.js6.0.0Terminal emulation
react-markdown10.1.0Markdown rendering

Project Structure

frontend/
├── public/ # Static assets
├── src/
│ ├── main.tsx # Entry point
│ ├── App.tsx # Root component with routing
│ ├── api/ # API client layer
│ │ ├── client.ts # ApiClient (retry, timeout, error handling)
│ │ ├── auth.ts # Authentication APIs
│ │ ├── dashboard.ts # Dashboard data
│ │ ├── messages.ts # Message browsing
│ │ ├── sessions.ts # Session management
│ │ ├── admin.ts # User management
│ │ ├── analysis.ts # Analytics
│ │ ├── remote.ts # Remote machines & sessions
│ │ ├── governance.ts # Audit, content filter, security
│ │ ├── tenant.ts # Multi-tenant management
│ │ ├── sso.ts # SSO provider management
│ │ ├── prompts.ts # Prompt templates
│ │ ├── projects.ts # Project management
│ │ ├── toolAccounts.ts # Tool account mapping
│ │ └── index.ts # Re-exports
│ ├── components/
│ │ ├── common/ # 28 shared UI components
│ │ ├── layout/ # Layout shells (WorkLayout, ManageLayout)
│ │ ├── features/ # Page-level components
│ │ │ ├── analysis/ # TrendAnalysis, AnomalyDetection, ROIAnalysis
│ │ │ ├── management/ # 14 admin pages
│ │ │ ├── settings/ # SSOSettings
│ │ │ └── compliance/ # DataRetention, ComplianceReport
│ │ └── work/ # Work-mode specific components
│ ├── hooks/ # React Query hooks
│ ├── store/ # Zustand global store
│ ├── i18n/ # Translations (en/zh/ja/ko)
│ ├── types/ # TypeScript interfaces
│ ├── utils/ # Formatters, helpers
│ └── styles/ # CSS (Bootstrap overrides)
├── vite.config.ts # Build configuration
├── tsconfig.json
└── package.json

Development Workflow

# Install dependencies
npm install

# Start dev server (port 3000, proxies API to localhost:5000)
npm run dev

# Build for production (outputs to ../static/js/dist/)
npm run build

# Run tests
npm run test

# Lint
npm run lint

The dev server runs on port 3000 with /api and /auth requests proxied to the Flask backend on port 5000.

Routing

Work Mode (/work/*) — All authenticated users

3-panel layout (WorkLayout): session list | workspace (iframe) | assist panel

RouteComponentDescription
/workWorkspaceMain AI coding environment
/work/sessionsSessionListSession history
/work/promptsPromptsPrompt templates
/work/usageUsageOverviewPersonal usage stats
/work/insightsInsightsReportAI-generated insights

Manage Mode (/manage/*) — Admin only

Sidebar navigation layout (ManageLayout)

RouteComponentDescription
/manage/dashboardDashboardAdmin overview
/manage/analysis/trendTrendAnalysisToken trends
/manage/analysis/anomalyAnomalyDetectionUsage anomalies
/manage/analysis/roiROIAnalysisROI metrics
/manage/messagesMessagesMessage browser
/manage/auditAuditCenterAudit log viewer
/manage/quotaQuotaManagementQuota & alerts
/manage/complianceComplianceData retention
/manage/securitySecurityCenterSecurity settings
/manage/usersUserManagementUser CRUD
/manage/tenantsTenantManagementMulti-tenant
/manage/projectsProjectManagementProject CRUD
/manage/remote/machinesRemoteMachinesMachine management
/manage/remote/api-keysApiKeyManagementAPI key proxy
/manage/settings/ssoSSOSettingsSSO configuration

Legacy routes (/dashboard, /messages, etc.) redirect admins to /manage/... and non-admins to /work/....

Data Flow

API Client (src/api/client.ts)
→ React Query hooks (src/hooks/)
→ Page components (src/components/features/)

The ApiClient class wraps fetch with:

  • Automatic retry (up to 3 attempts with exponential backoff)
  • 30-second timeout
  • Credential inclusion (credentials: 'include')
  • Friendly error messages per HTTP status code

React Query is configured with 1-minute stale time and single retry.

State Management

Zustand store (src/store/index.ts) with localStorage persistence (key: open-ace-store):

Persisted:

  • theme (light/dark), language (en/zh/ja/ko)
  • appMode (work/manage), sidebarCollapsed
  • workspaceTabs — multi-tab workspace state (type, sessionId, machineId, etc.)

Non-persisted:

  • user, isAuthenticated, authLoading
  • workspaceFullscreen

Selectors are exported for granular subscriptions (useUser, useTheme, useAppMode).

Internationalization

Custom lightweight i18n in src/i18n/index.ts:

import { t } from '@/i18n'

// Usage
t('common.save', language)

Supports 4 languages: en (default), zh, ja, ko. ~800+ keys per language.

Help documents also exist per language in src/components/work/docs/.

Build Configuration

vite.config.ts key settings:

SettingValue
Base path/static/js/dist/
Output../static/js/dist
Dev server port3000
API proxy/api, /authhttp://localhost:5000
TargetES2020
Minifieresbuild (drops console.log in prod)

Path aliases: @src/, @apisrc/api/, @componentssrc/components/, etc.

Chunk splitting: react-vendor, router, query, zustand, charts, date-fns, api, components, hooks, store, utils, i18n, plus auto-chunks for each lazy-loaded page.

Common Components

All in src/components/common/:

ComponentDescription
ButtonConfigurable button with variants, sizes, loading state
Card, StatCardContent cards and stat display
Modal, ConfirmModalDialog modals with size variants
Select, SearchableSelectDropdown selects
Tabs, TabList, Tab, TabPanelsTab navigation
Loading, Skeleton, SkeletonCardLoading indicators
Error, EmptyStateError and empty states
Badge, StatusBadge, CountBadgeStatus indicators
Progress, CircularProgressProgress indicators
TextInput, Textarea, CheckboxForm inputs
Dropdown, SplitButtonDropdown menus
Avatar, AvatarUploaderUser avatars
TooltipTooltips
ToastContainer, useToastToast notifications
ModeSwitcherWork/Manage mode toggle
SessionDetailContentSession detail viewer
LazyChartsLazy-loaded chart components

Adding a New Feature

  1. API layer — Create src/api/myFeature.ts with typed API calls
  2. Hooks — Create src/hooks/useMyFeature.ts with React Query hooks
  3. Component — Create src/components/features/MyFeature.tsx (lazy-loaded)
  4. Route — Add route in App.tsx under WorkRoutes or ManageRoutes
  5. i18n — Add keys to all 4 languages in src/i18n/index.ts
  6. Types — Add interfaces to src/types/index.ts