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.18.1Routing
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 (30+ typed modules)
│ │ ├── client.ts # ApiClient (retry, timeout, error handling)
│ │ ├── request.ts # Shared request helpers
│ │ ├── index.ts # Re-exports
│ │ └── ... # One module per backend domain:
│ │ # auth, dashboard, messages, sessions, admin,
│ │ # analysis, remote, governance, tenant, sso,
│ │ # prompts, projects, toolAccounts, autonomous,
│ │ # compliance, encryptionKeys, featureFlags,
│ │ # feishuConfig, fs, insights, mappingRules,
│ │ # modelGateway, notificationChannels, policy,
│ │ # projectCategories, report, roi, smtpConfig,
│ │ # system, users, workspace, alerts,
│ │ # aiAgentSettings (plus colocated *.test.ts)
│ ├── components/
│ │ ├── common/ # 49 shared UI components
│ │ ├── layout/ # Layout shells (WorkLayout, ManageLayout)
│ │ ├── features/ # Page-level components
│ │ │ ├── analysis/ # TrendAnalysis, AnomalyDetection, ROIAnalysis, UsageForecast, EnterpriseReport
│ │ │ ├── management/ # Admin pages plus their modals/editors (UserManagement, TenantManagement, SecurityCenter, …)
│ │ │ ├── settings/ # SSOSettings, BrandingSettings, AiAgentSettings, NotificationIntegration, FeishuConfig
│ │ │ └── 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:19888)
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 19888.

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
/work/filesPersonalFilesPersonal file browser
/work/alertsUserAlertsPersonal alert center
/work/autonomousAutonomousDevAutonomous development workflows (feature-gated)
/work/workspace—Workspace iframe anchor

Manage Mode (/manage/*) — Admin only​

Sidebar navigation layout (ManageLayout)

RouteComponentDescription
/manage/dashboardDashboardAdmin overview
/manage/analysis—Redirects to /manage/analysis/trend
/manage/analysis/trendTrendAnalysisToken trends
/manage/analysis/request-dashboardRequestDashboardRequest-level usage dashboard
/manage/analysis/anomalyAnomalyDetectionUsage anomalies
/manage/analysis/roiROIAnalysisROI metrics
/manage/analysis/forecastUsageForecastUsage forecasting
/manage/analysis/enterprise-reportEnterpriseReportEnterprise usage report
/manage/analysis/conversation-historyConversationHistoryConversation history browser
/manage/messagesMessagesMessage browser
/manage/auditAuditCenterAudit log viewer
/manage/quotaQuotaAlertsQuota & alerts
/manage/complianceComplianceData retention
/manage/securitySecurityCenterSecurity settings
/manage/policy/rulesPolicyRouteGuardPolicy rules management
/manage/usersUserManagementUser CRUD
/manage/tenantsTenantManagementMulti-tenant
/manage/tenants/:idTenantDetailTenant detail
/manage/projectsProjectManagementProject CRUD
/manage/remote/machinesRemoteMachineManagementMachine management
/manage/settings/ssoSSOSettingsSSO configuration
/manage/settings/brandingBrandingSettingsBranding and appearance
/manage/settings/api-keysAPIKeyManagementAPI key proxy management
/manage/settings/encryption-keysEncryptionKeyManagementEncryption key management
/manage/settings/ai-agentAiAgentSettingsAI agent settings
/manage/settings/notification-integrationNotificationIntegrationNotification integrations
/manage/settings/smtpSmtpConfigSMTP configuration
/manage/settings/model-gatewayModelGatewayConfigModel gateway (LiteLLM-compatible)
/manage/settings/feishuFeishuConfigFeishu integration

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, /auth → http://localhost:19888
TargetES2020
Minifieresbuild (drops console.log in prod)

Path aliases: @ → src/, @api → src/api/, @components → src/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