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


โœ… 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

3. Lazy Loading

4. Component Organization

5. State Management

6. Code Reusability

7. Developer Experience


๐Ÿ“‹ Implementation Checklist

Week 1: Foundation

Week 2: Break Down Components

Week 3: Training & Patterns

Week 4: Testing & Polish


๐ŸŽฏ 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:

This is how you build world-class Angular applications. ๐Ÿš€


Last Updated: December 13, 2025 | Session: 8.2