feat(companion): add Electron presentation layer with React UI, IPC handlers, and automation POC
This commit is contained in:
316
docs/COMPANION_POC.md
Normal file
316
docs/COMPANION_POC.md
Normal file
@@ -0,0 +1,316 @@
|
||||
# GridPilot Companion App - POC Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The Electron companion app demonstrates the complete hosted session automation workflow with a visual interface, validating the Clean Architecture implementation through a functional proof-of-concept.
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Prerequisites
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
### Running the POC
|
||||
|
||||
```bash
|
||||
npm run companion:start
|
||||
```
|
||||
|
||||
This command:
|
||||
1. Compiles TypeScript main process → `dist/main/`
|
||||
2. Builds React renderer with Vite → `dist/renderer/`
|
||||
3. Launches the Electron application
|
||||
|
||||
## What You'll See
|
||||
|
||||
### Left Panel: Session Configuration Form
|
||||
|
||||
Pre-configured form with fields representing all 18 automation steps:
|
||||
- **Session Name** - Race session identifier
|
||||
- **Server Name** - Server configuration name
|
||||
- **Passwords** - Session and admin access credentials
|
||||
- **Max Drivers** - Capacity (1-60)
|
||||
- **Track** - Track selection (e.g., "watkins-glen")
|
||||
- **Cars** - Vehicle selection (e.g., "porsche-911-gt3-r")
|
||||
- **Weather Type** - Static or dynamic weather
|
||||
- **Time of Day** - Morning, afternoon, evening, or night
|
||||
- **Session Lengths** - Practice, qualifying, warmup, race durations
|
||||
- **Race Options** - Start type, restarts, damage model
|
||||
- **Track State** - Surface condition
|
||||
|
||||
**Action**: Click "Start Automation" to begin the workflow
|
||||
|
||||
### Right Panel: Live Progress Monitor
|
||||
|
||||
Real-time visualization showing:
|
||||
- **Session ID** - Generated UUID
|
||||
- **Current Status** - Running/Completed/Failed/Stopped
|
||||
- **Step-by-Step Progress** - Visual indicators for all 18 steps:
|
||||
- ✓ Green checkmark = Completed
|
||||
- Blue number = Current step (in progress)
|
||||
- Gray number = Pending
|
||||
- **Safety Notice** - Yellow warning at step 18 stop point
|
||||
- **Progress Counter** - "X / 18 steps" tracker
|
||||
|
||||
## Expected Behavior
|
||||
|
||||
### 1. Initial State
|
||||
- Form enabled with pre-filled POC defaults
|
||||
- Progress panel shows "Configure and start..." message
|
||||
|
||||
### 2. Automation Started
|
||||
- Form becomes disabled
|
||||
- Button changes to "Automation Running..."
|
||||
- Progress panel shows "Running" status
|
||||
- Steps begin progressing: 1 → 2 → 3 → ... → 18
|
||||
|
||||
### 3. Step Progression (Simulated)
|
||||
Each step takes ~500ms to complete:
|
||||
- **Step 1**: Navigate to Hosted Racing
|
||||
- **Step 2**: Click Create a Race
|
||||
- **Step 3**: Fill Race Information
|
||||
- **Step 4**: Configure Server Details
|
||||
- **Step 5**: Set Admins
|
||||
- **Step 6**: Add Admin (modal step)
|
||||
- **Step 7**: Set Time Limits
|
||||
- **Step 8**: Set Cars
|
||||
- **Step 9**: Add Car (modal step)
|
||||
- **Step 10**: Set Car Classes
|
||||
- **Step 11**: Set Track
|
||||
- **Step 12**: Add Track (modal step)
|
||||
- **Step 13**: Configure Track Options
|
||||
- **Step 14**: Set Time of Day
|
||||
- **Step 15**: Configure Weather
|
||||
- **Step 16**: Set Race Options
|
||||
- **Step 17**: Configure Team Driving
|
||||
- **Step 18**: Set Track Conditions → **STOPS HERE**
|
||||
|
||||
### 4. Step 18 Reached
|
||||
- Status changes to "Stopped at Step 18"
|
||||
- Yellow safety notice appears:
|
||||
```
|
||||
⚠️ Safety Stop
|
||||
Automation stopped at step 18 (Track Conditions) as configured.
|
||||
This prevents accidental session creation during POC demonstration.
|
||||
```
|
||||
- Form remains disabled
|
||||
- All 18 steps visible with completion status
|
||||
|
||||
## Technical Architecture
|
||||
|
||||
### Clean Architecture Validation
|
||||
|
||||
**Presentation Layer** (newly created):
|
||||
```
|
||||
src/apps/companion/
|
||||
├── main/
|
||||
│ ├── index.ts # Electron app initialization
|
||||
│ ├── di-container.ts # Dependency injection
|
||||
│ ├── ipc-handlers.ts # IPC request/response handlers
|
||||
│ └── preload.ts # Secure IPC bridge
|
||||
└── renderer/
|
||||
├── App.tsx # Main UI component
|
||||
├── main.tsx # React entry point
|
||||
├── index.html # HTML entry
|
||||
└── components/
|
||||
├── SessionCreationForm.tsx
|
||||
└── SessionProgressMonitor.tsx
|
||||
```
|
||||
|
||||
**Reused Layers** (100% unchanged):
|
||||
- **Domain**: [`AutomationSession`](../src/packages/domain/entities/AutomationSession.ts:1), [`SessionState`](../src/packages/domain/value-objects/SessionState.ts:1), [`StepId`](../src/packages/domain/value-objects/StepId.ts:1)
|
||||
- **Application**: [`StartAutomationSessionUseCase`](../src/packages/application/use-cases/StartAutomationSessionUseCase.ts:1)
|
||||
- **Infrastructure**: [`MockBrowserAutomationAdapter`](../src/infrastructure/adapters/automation/MockBrowserAutomationAdapter.ts:1), [`MockAutomationEngineAdapter`](../src/infrastructure/adapters/automation/MockAutomationEngineAdapter.ts:1), [`InMemorySessionRepository`](../src/infrastructure/repositories/InMemorySessionRepository.ts:1)
|
||||
|
||||
### IPC Communication Flow
|
||||
|
||||
```
|
||||
Renderer Process Main Process
|
||||
| |
|
||||
|-- start-automation -------->|
|
||||
| |-- Create session
|
||||
| |-- Start automation engine
|
||||
| |-- Begin step execution loop
|
||||
| |
|
||||
|<-- session-progress --------| (emitted every 100ms)
|
||||
|<-- session-progress --------|
|
||||
|<-- session-progress --------|
|
||||
| |
|
||||
```
|
||||
|
||||
### Dependency Chain
|
||||
|
||||
```
|
||||
UI Component (React)
|
||||
↓
|
||||
IPC Handler (Electron main)
|
||||
↓
|
||||
DI Container
|
||||
↓
|
||||
StartAutomationSessionUseCase
|
||||
↓
|
||||
MockAutomationEngineAdapter
|
||||
↓
|
||||
MockBrowserAutomationAdapter
|
||||
InMemorySessionRepository
|
||||
```
|
||||
|
||||
## POC Success Criteria
|
||||
|
||||
✅ **Clean Architecture Preserved**
|
||||
- Zero business logic in UI components
|
||||
- Complete separation of concerns
|
||||
- All 158 existing tests still passing
|
||||
- Domain/application/infrastructure layers unchanged
|
||||
|
||||
✅ **18-Step Workflow Visualized**
|
||||
- All steps from [`ROADMAP.md`](./ROADMAP.md:1) represented
|
||||
- Real-time progress updates every 100ms
|
||||
- State transitions validated by domain layer
|
||||
- Step execution tracked via domain entities
|
||||
|
||||
✅ **Mock Adapters Functional**
|
||||
- Browser automation simulated with realistic delays
|
||||
- Session state persisted in-memory
|
||||
- Dependency injection wiring complete
|
||||
- Automation engine orchestrates workflow
|
||||
|
||||
✅ **Electron Best Practices**
|
||||
- Context isolation enabled
|
||||
- Preload script for secure IPC
|
||||
- Main/renderer process separation
|
||||
- No node integration in renderer
|
||||
|
||||
✅ **Safety Stop Demonstrated**
|
||||
- Automation stops at step 18 as designed
|
||||
- `STOPPED_AT_STEP_18` state properly displayed
|
||||
- Clear user communication about safety measure
|
||||
- No accidental session creation possible
|
||||
|
||||
## Architecture Compliance
|
||||
|
||||
### Boundaries Respected
|
||||
|
||||
**Presentation Layer** (UI only):
|
||||
- React components render data
|
||||
- Electron IPC handles communication
|
||||
- No domain knowledge or business logic
|
||||
|
||||
**Application Layer** (orchestration):
|
||||
- Use cases coordinate workflow
|
||||
- Port interfaces define contracts
|
||||
- No UI or infrastructure concerns
|
||||
|
||||
**Domain Layer** (business rules):
|
||||
- Entities enforce invariants
|
||||
- Value objects validate states
|
||||
- Services implement domain logic
|
||||
- No dependencies on outer layers
|
||||
|
||||
**Infrastructure Layer** (adapters):
|
||||
- Mock implementations for POC
|
||||
- Repository handles persistence
|
||||
- Automation adapters simulate browser
|
||||
- Ready to swap with real implementations
|
||||
|
||||
### SOLID Principles Demonstrated
|
||||
|
||||
- **Single Responsibility**: Each component has one clear purpose
|
||||
- **Open/Closed**: New adapters can be added without changing domain
|
||||
- **Liskov Substitution**: Mock adapters fully implement port interfaces
|
||||
- **Interface Segregation**: Clean port definitions, no fat interfaces
|
||||
- **Dependency Inversion**: All dependencies point inward via abstractions
|
||||
|
||||
## Next Steps (Beyond POC)
|
||||
|
||||
This POC validates the technical approach. For production:
|
||||
|
||||
1. **Replace Mock Adapters**:
|
||||
- Swap [`MockBrowserAutomationAdapter`](../src/infrastructure/adapters/automation/MockBrowserAutomationAdapter.ts:1) with `PuppeteerAdapter` or `PlaywrightAdapter`
|
||||
- Replace [`InMemorySessionRepository`](../src/infrastructure/repositories/InMemorySessionRepository.ts:1) with `PostgreSQLSessionRepository`
|
||||
|
||||
2. **Implement Real Automation**:
|
||||
- Add actual browser control (Puppeteer/Playwright)
|
||||
- Implement iRacing website interaction
|
||||
- Handle real modals, forms, and navigation
|
||||
|
||||
3. **Add Pause/Resume**:
|
||||
- IPC handlers currently stubbed
|
||||
- Implement session state management
|
||||
- Add UI controls for pause/resume
|
||||
|
||||
4. **Polish UI/UX**:
|
||||
- Professional styling and branding
|
||||
- Error recovery flows
|
||||
- Better loading states
|
||||
|
||||
5. **Production Features**:
|
||||
- Auto-updater mechanism
|
||||
- Crash reporting
|
||||
- Logging and diagnostics
|
||||
- User preferences storage
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Build Fails
|
||||
|
||||
```bash
|
||||
# Clean and rebuild
|
||||
rm -rf dist node_modules
|
||||
npm install
|
||||
npm run companion:build
|
||||
```
|
||||
|
||||
### Electron Doesn't Start
|
||||
|
||||
```bash
|
||||
# Verify build output exists
|
||||
ls dist/main/index.js # Main process
|
||||
ls dist/renderer/index.html # Renderer
|
||||
|
||||
# Run directly
|
||||
electron dist/main/index.js
|
||||
```
|
||||
|
||||
### Progress Not Updating
|
||||
|
||||
- Open DevTools in Electron (View → Toggle Developer Tools)
|
||||
- Check browser console for errors
|
||||
- Verify IPC handlers registered
|
||||
- Check main process terminal output
|
||||
|
||||
### TypeScript Errors
|
||||
|
||||
```bash
|
||||
# Check configuration
|
||||
cat tsconfig.electron.json
|
||||
|
||||
# Verify include paths match your structure
|
||||
npm run typecheck
|
||||
```
|
||||
|
||||
## File Reference
|
||||
|
||||
| File | Purpose | Lines |
|
||||
|------|---------|-------|
|
||||
| [`main/index.ts`](../src/apps/companion/main/index.ts:1) | Electron app initialization | 39 |
|
||||
| [`main/di-container.ts`](../src/apps/companion/main/di-container.ts:1) | Dependency injection setup | 47 |
|
||||
| [`main/ipc-handlers.ts`](../src/apps/companion/main/ipc-handlers.ts:1) | Request/response handlers | 79 |
|
||||
| [`main/preload.ts`](../src/apps/companion/main/preload.ts:1) | Secure IPC bridge | 21 |
|
||||
| [`renderer/App.tsx`](../src/apps/companion/renderer/App.tsx:1) | Main UI component | 80 |
|
||||
| [`renderer/components/SessionCreationForm.tsx`](../src/apps/companion/renderer/components/SessionCreationForm.tsx:1) | Config form | 173 |
|
||||
| [`renderer/components/SessionProgressMonitor.tsx`](../src/apps/companion/renderer/components/SessionProgressMonitor.tsx:1) | Progress visualization | 213 |
|
||||
| [`MockAutomationEngineAdapter.ts`](../src/infrastructure/adapters/automation/MockAutomationEngineAdapter.ts:1) | Automation orchestrator | 85 |
|
||||
|
||||
## Conclusion
|
||||
|
||||
This POC successfully demonstrates:
|
||||
- Clean Architecture principles in practice
|
||||
- Separation of concerns across all layers
|
||||
- Real-time automation workflow visualization
|
||||
- Safety controls preventing accidental actions
|
||||
- Foundation for production implementation
|
||||
|
||||
All domain logic remains testable, maintainable, and independent of UI or infrastructure concerns. The 158 passing tests validate the core business rules remain intact.
|
||||
Reference in New Issue
Block a user