Platform AI Training Center - Routing Architecture Improvement
Refactor monolithic component into properly routed Angular architecture
๐ฃ๏ธ Platform AI Training Center - Routing Architecture Improvement
Goal: Transform the monolithic MCP Control Center into a beautifully organized, properly routed Angular application that leverages Angular's routing system for maximum modularity and maintainability.
๐ฏ Current Architecture (Problems)
Current Implementation
MCP Control Center Component
โโโ Single component with mat-tab-group
โโโ Overview Tab
โโโ AI Agents Tab
โโโ Training Data Tab
โโโ Patterns Library Tab
โโโ Agent Testing Tab
Problems
- โ Single monolithic component (~1000 lines)
- โ All logic in one file
- โ No URL navigation between sections
- โ Can't deep-link to specific sections
- โ Browser back/forward doesn't work within tabs
- โ Difficult to lazy-load individual sections
- โ Hard to test individual sections in isolation
- โ Doesn't follow Angular routing best practices
- โ Doesn't leverage existing routing patterns in the codebase
โ Improved Architecture (Solution)
New Routing Structure
/space/{spaceSlug}/mcp
โโโ /overview (default redirect)
โโโ /agents
โ โโโ (list view)
โ โโโ /:agentId
โ โโโ /details
โ โโโ /train
โ โโโ /test
โโโ /training
โ โโโ /submit
โ โโโ /examples
โ โโโ /examples/:exampleId
โโโ /patterns
โ โโโ /library
โ โโโ /extract
โ โโโ /patterns/:patternId
โโโ /testing
โโโ /create
โโโ /results
โโโ /results/:testId
Component Structure
MCP/mcp-control-center/src/lib/
โโโ components/
โ โโโ mcp-shell/
โ โ โโโ mcp-shell.component.ts (Main container with navigation)
โ โ โโโ mcp-shell.component.html
โ โ โโโ mcp-shell.component.scss
โ โ
โ โโโ overview/
โ โ โโโ overview.component.ts
โ โ โโโ overview.component.html
โ โ โโโ overview.component.scss
โ โ
โ โโโ agents/
โ โ โโโ agents-list/
โ โ โ โโโ agents-list.component.ts
โ โ โ โโโ agents-list.component.html
โ โ โ โโโ agents-list.component.scss
โ โ โโโ agent-detail/
โ โ โ โโโ agent-detail.component.ts
โ โ โ โโโ agent-detail.component.html
โ โ โ โโโ agent-detail.component.scss
โ โ โโโ agent-train/
โ โ โ โโโ agent-train.component.ts
โ โ โโโ agent-test/
โ โ โโโ agent-test.component.ts
โ โ
โ โโโ training/
โ โ โโโ training-submit/
โ โ โ โโโ training-submit.component.ts
โ โ โ โโโ training-submit.component.html
โ โ โ โโโ training-submit.component.scss
โ โ โโโ training-examples/
โ โ โ โโโ training-examples.component.ts
โ โ โโโ example-detail/
โ โ โโโ example-detail.component.ts
โ โ
โ โโโ patterns/
โ โ โโโ patterns-library/
โ โ โ โโโ patterns-library.component.ts
โ โ โโโ pattern-extract/
โ โ โ โโโ pattern-extract.component.ts
โ โ โโโ pattern-detail/
โ โ โโโ pattern-detail.component.ts
โ โ
โ โโโ testing/
โ โโโ test-create/
โ โ โโโ test-create.component.ts
โ โโโ test-results/
โ โ โโโ test-results.component.ts
โ โโโ test-detail/
โ โโโ test-detail.component.ts
โ
โโโ routes/
โ โโโ mcp.routes.ts (Route definitions)
โ
โโโ services/
โโโ mcp.service.ts (Shared service)
๐ Implementation Plan
Phase 1: Create Route Definitions
File: MCP/mcp-control-center/src/lib/routes/mcp.routes.ts
import { Routes } from '@angular/router';
export const MCP_ROUTES: Routes = [
{
path: '',
loadComponent: () => import('../components/mcp-shell/mcp-shell.component').then(m => m.McpShellComponent),
children: [
{
path: '',
redirectTo: 'overview',
pathMatch: 'full'
},
{
path: 'overview',
loadComponent: () => import('../components/overview/overview.component').then(m => m.OverviewComponent),
title: 'Platform AI Overview',
data: {
icon: '๐',
description: 'Platform AI Training System Overview'
}
},
{
path: 'agents',
children: [
{
path: '',
loadComponent: () => import('../components/agents/agents-list/agents-list.component').then(m => m.AgentsListComponent),
title: 'AI Agents',
data: {
icon: '๐ค',
description: 'Manage Platform AI Agents'
}
},
{
path: ':agentId',
children: [
{
path: '',
redirectTo: 'details',
pathMatch: 'full'
},
{
path: 'details',
loadComponent: () => import('../components/agents/agent-detail/agent-detail.component').then(m => m.AgentDetailComponent),
title: 'Agent Details'
},
{
path: 'train',
loadComponent: () => import('../components/agents/agent-train/agent-train.component').then(m => m.AgentTrainComponent),
title: 'Train Agent'
},
{
path: 'test',
loadComponent: () => import('../components/agents/agent-test/agent-test.component').then(m => m.AgentTestComponent),
title: 'Test Agent'
}
]
}
]
},
{
path: 'training',
children: [
{
path: '',
redirectTo: 'submit',
pathMatch: 'full'
},
{
path: 'submit',
loadComponent: () => import('../components/training/training-submit/training-submit.component').then(m => m.TrainingSubmitComponent),
title: 'Submit Training Example',
data: {
icon: '๐',
description: 'Submit high-quality training examples'
}
},
{
path: 'examples',
loadComponent: () => import('../components/training/training-examples/training-examples.component').then(m => m.TrainingExamplesComponent),
title: 'Training Examples'
},
{
path: 'examples/:exampleId',
loadComponent: () => import('../components/training/example-detail/example-detail.component').then(m => m.ExampleDetailComponent),
title: 'Example Details'
}
]
},
{
path: 'patterns',
children: [
{
path: '',
redirectTo: 'library',
pathMatch: 'full'
},
{
path: 'library',
loadComponent: () => import('../components/patterns/patterns-library/patterns-library.component').then(m => m.PatternsLibraryComponent),
title: 'Patterns Library',
data: {
icon: '๐จ',
description: 'Proven platform patterns'
}
},
{
path: 'extract',
loadComponent: () => import('../components/patterns/pattern-extract/pattern-extract.component').then(m => m.PatternExtractComponent),
title: 'Extract Patterns'
},
{
path: ':patternId',
loadComponent: () => import('../components/patterns/pattern-detail/pattern-detail.component').then(m => m.PatternDetailComponent),
title: 'Pattern Details'
}
]
},
{
path: 'testing',
children: [
{
path: '',
redirectTo: 'create',
pathMatch: 'full'
},
{
path: 'create',
loadComponent: () => import('../components/testing/test-create/test-create.component').then(m => m.TestCreateComponent),
title: 'Create Agent Test',
data: {
icon: '๐งช',
description: 'Test agent performance'
}
},
{
path: 'results',
loadComponent: () => import('../components/testing/test-results/test-results.component').then(m => m.TestResultsComponent),
title: 'Test Results'
},
{
path: 'results/:testId',
loadComponent: () => import('../components/testing/test-detail/test-detail.component').then(m => m.TestDetailComponent),
title: 'Test Details'
}
]
}
]
}
];
Phase 2: Create Shell Component (Navigation Container)
File: MCP/mcp-control-center/src/lib/components/mcp-shell/mcp-shell.component.ts
import { Component, signal, computed } from '@angular/core';
import { RouterModule, Router, RouterOutlet } from '@angular/router';
import { CommonModule } from '@angular/common';
import { MatTabsModule } from '@angular/material/tabs';
interface NavItem {
path: string;
label: string;
icon: string;
description: string;
}
@Component({
selector: 'mcp-shell',
standalone: true,
imports: [CommonModule, RouterModule, RouterOutlet, MatTabsModule],
template: `
<div class="mcp-shell">
<!-- Header with gradient -->
<header class="mcp-header">
<div class="header-content">
<h1 class="title">
<span class="icon">๐ง </span>
Platform AI Training Center
</h1>
<p class="subtitle">Train superhuman AI agents for GoGrab Space</p>
</div>
<!-- Navigation -->
<nav class="mcp-nav">
@for (item of navItems(); track item.path) {
<a
[routerLink]="[item.path]"
routerLinkActive="active"
class="nav-item"
[title]="item.description">
<span class="nav-icon">{{ item.icon }}</span>
<span class="nav-label">{{ item.label }}</span>
</a>
}
</nav>
</header>
<!-- Main content area (router outlet) -->
<main class="mcp-content">
<router-outlet></router-outlet>
</main>
</div>
`,
styles: [`
.mcp-shell {
display: flex;
flex-direction: column;
height: 100%;
background: var(--ux-background);
}
.mcp-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
color: white;
padding: 2rem;
border-radius: 0 0 24px 24px;
}
.header-content {
margin-bottom: 1.5rem;
}
.title {
font-size: 2rem;
font-weight: 700;
margin: 0 0 0.5rem 0;
display: flex;
align-items: center;
gap: 1rem;
}
.subtitle {
font-size: 1rem;
opacity: 0.9;
margin: 0;
}
.mcp-nav {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.nav-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.75rem 1.5rem;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
color: white;
text-decoration: none;
font-weight: 600;
transition: all 0.3s ease;
backdrop-filter: blur(8px);
&:hover {
background: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
&.active {
background: rgba(255, 255, 255, 0.3);
border-color: rgba(255, 255, 255, 0.4);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
}
.nav-icon {
font-size: 1.25rem;
}
.mcp-content {
flex: 1;
padding: 2rem;
overflow-y: auto;
}
`]
})
export class McpShellComponent {
navItems = signal<NavItem[]>([
{
path: 'overview',
label: 'Overview',
icon: '๐',
description: 'System overview and statistics'
},
{
path: 'agents',
label: 'AI Agents',
icon: '๐ค',
description: 'Manage platform-specific agents'
},
{
path: 'training',
label: 'Training',
icon: '๐',
description: 'Submit and manage training data'
},
{
path: 'patterns',
label: 'Patterns',
icon: '๐จ',
description: 'Proven platform patterns library'
},
{
path: 'testing',
label: 'Testing',
icon: '๐งช',
description: 'Test agent performance'
}
]);
}
Phase 3: Break Down Existing Component into Child Components
Example: AgentsListComponent (from current agents tab)
// MCP/mcp-control-center/src/lib/components/agents/agents-list/agents-list.component.ts
import { Component, signal, inject, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { CommonModule } from '@angular/common';
import { McpService, PlatformAgent } from '../../../services/mcp.service';
import { forkJoin, finalize } from 'rxjs';
@Component({
selector: 'mcp-agents-list',
standalone: true,
imports: [CommonModule],
template: `
<div class="agents-list-container">
<header class="section-header">
<h2>Platform AI Agents</h2>
<p>Specialized agents for module generation, widget creation, and more</p>
</header>
@if (loading()) {
<div class="loading">Loading agents...</div>
} @else {
<div class="agents-grid">
@for (agent of agents(); track agent.id) {
<div class="agent-card" (click)="navigateToAgent(agent.id)">
<div class="agent-header">
<span class="agent-icon">{{ agent.icon }}</span>
<h3>{{ agent.name }}</h3>
</div>
<p class="agent-description">{{ agent.description }}</p>
<div class="agent-stats">
<div class="stat">
<span class="stat-label">Training Examples</span>
<span class="stat-value">{{ agent.trainingExamples }}</span>
</div>
<div class="stat">
<span class="stat-label">Success Rate</span>
<span class="stat-value">{{ agent.successRate * 100 }}%</span>
</div>
<div class="stat">
<span class="stat-label">Status</span>
<span class="stat-value" [class]="'status-' + agent.status">
{{ agent.status }}
</span>
</div>
</div>
<div class="agent-actions">
<button class="btn-primary" (click)="trainAgent(agent.id, $event)">
Train Agent
</button>
<button class="btn-secondary" (click)="testAgent(agent.id, $event)">
Test Agent
</button>
</div>
</div>
}
</div>
}
</div>
`,
styles: [`
// Use theme-system CSS vars and glassmorphism patterns
.agents-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
gap: 1.5rem;
}
.agent-card {
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(226, 232, 240, 0.8);
border-radius: 20px;
padding: 1.5rem;
cursor: pointer;
transition: all 0.3s ease;
&:hover {
transform: translateY(-4px);
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.12);
}
}
`]
})
export class AgentsListComponent implements OnInit {
private readonly mcpService = inject(McpService);
private readonly router = inject(Router);
agents = signal<PlatformAgent[]>([]);
loading = signal(true);
ngOnInit(): void {
this.loadAgents();
}
loadAgents(): void {
this.loading.set(true);
this.mcpService.getPlatformAgents()
.pipe(finalize(() => this.loading.set(false)))
.subscribe(response => {
this.agents.set(response.agents);
});
}
navigateToAgent(agentId: string): void {
this.router.navigate(['/space', 'current-space', 'mcp', 'agents', agentId]);
}
trainAgent(agentId: string, event: Event): void {
event.stopPropagation();
this.router.navigate(['/space', 'current-space', 'mcp', 'agents', agentId, 'train']);
}
testAgent(agentId: string, event: Event): void {
event.stopPropagation();
this.router.navigate(['/space', 'current-space', 'mcp', 'agents', agentId, 'test']);
}
}
Phase 4: Update Main App Routes
File: apps/gograb-space/src/app/app.routes.ts
// Update the MCP Control Center route to use child routes
{
path: 'mcp',
loadChildren: () => import('@MCP/mcp-control-center').then(m => m.MCP_ROUTES),
title: 'Platform AI Training Center',
data: {
tool: 'mcp',
icon: 'fas fa-brain',
description: 'Train superhuman AI agents for GoGrab Space',
category: 'ai',
order: 8
}
}
File: MCP/mcp-control-center/src/index.ts
// Export routes
export * from './lib/routes/mcp.routes';
// Export components
export * from './lib/components/mcp-shell/mcp-shell.component';
export * from './lib/components/overview/overview.component';
export * from './lib/components/agents/agents-list/agents-list.component';
// ... other exports
// Export services
export * from './lib/services/mcp.service';
โ Benefits of This Architecture
1. URL Navigation
Before: /space/my-space/mcp-control-center (single URL for everything)
After: /space/my-space/mcp/agents/module-generator/train (deep-linkable)
2. Browser Navigation
- โ Back/forward buttons work
- โ Bookmarkable URLs
- โ Shareable links to specific sections
3. Lazy Loading
- โ Each section loads only when needed
- โ Faster initial load
- โ Better performance
4. Component Organization
- โ Small, focused components (~100-200 lines each)
- โ Single responsibility
- โ Easy to test
- โ Easy to maintain
5. State Management
- โ Route params for IDs (agentId, exampleId, etc.)
- โ Query params for filters
- โ No need for complex state management
- โ URL is the source of truth
6. Code Reusability
- โ Shared service for all components
- โ Reusable UI patterns
- โ Consistent navigation
7. Developer Experience
- โ Clear file structure
- โ Easy to find code
- โ Follows Angular best practices
- โ Consistent with rest of codebase
๐ Implementation Checklist
Week 1: Foundation
- Create
mcp.routes.tswith route definitions - Create
McpShellComponent(navigation container) - Update
apps/gograb-space/src/app/app.routes.ts - Test routing navigation
Week 2: Break Down Components
- Extract Overview โ
OverviewComponent - Extract Agents List โ
AgentsListComponent - Create
AgentDetailComponent - Create
AgentTrainComponent - Create
AgentTestComponent
Week 3: Training & Patterns
- Create
TrainingSubmitComponent - Create
TrainingExamplesComponent - Create
ExampleDetailComponent - Create
PatternsLibraryComponent - Create
PatternExtractComponent - Create
PatternDetailComponent
Week 4: Testing & Polish
- Create
TestCreateComponent - Create
TestResultsComponent - Create
TestDetailComponent - Add route guards (if needed)
- Add route resolvers (if needed)
- Test all navigation flows
- Update documentation
๐ฏ Example User Flows
Flow 1: Train a Module Generator Agent
1. Navigate to: /space/my-space/mcp/agents
โ AgentsListComponent displays all agents
2. Click "Module Generator" card
โ Navigate to: /space/my-space/mcp/agents/module-generator/details
โ AgentDetailComponent shows detailed metrics
3. Click "Train Agent" button
โ Navigate to: /space/my-space/mcp/agents/module-generator/train
โ AgentTrainComponent shows training configuration
4. Start training
โ Stay on same URL, show progress
โ On completion, navigate to: /space/my-space/mcp/agents/module-generator/details
โ Shows updated metrics
Flow 2: Submit Training Example
1. Navigate to: /space/my-space/mcp/training/submit
โ TrainingSubmitComponent with form
2. Fill form, submit
โ On success, navigate to: /space/my-space/mcp/training/examples/{exampleId}
โ ExampleDetailComponent shows submitted example
3. Click "View All Examples"
โ Navigate to: /space/my-space/mcp/training/examples
โ TrainingExamplesComponent lists all examples
๐ Result
Before: Monolithic component, no URL navigation, difficult to maintain
After:
- โ Clean, organized component structure
- โ Full Angular routing integration
- โ Deep-linkable URLs
- โ Lazy-loaded sections
- โ Follows best practices
- โ Easy to test and maintain
- โ Professional, modern architecture
This is how you build world-class Angular applications. ๐
Last Updated: December 13, 2025 | Session: 8.2