diff --git a/frontend/src/app/[locale]/prototypes/ISSUE_COMMENTS.md b/frontend/src/app/[locale]/prototypes/ISSUE_COMMENTS.md
new file mode 100644
index 0000000..9005b5b
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/ISSUE_COMMENTS.md
@@ -0,0 +1,274 @@
+# Issue Comments for Design Prototypes
+
+This document contains the comments to be added to each Gitea issue for the design prototypes.
+
+---
+
+## Issue #36: [DESIGN] Project Dashboard Page
+
+**Comment to add:**
+
+```markdown
+## Design Prototype Ready for Review
+
+The Project Dashboard prototype has been created and is ready for review.
+
+### How to View
+1. Start the frontend dev server: `cd frontend && npm run dev`
+2. Navigate to: `http://localhost:3000/en/prototypes/project-dashboard`
+
+### What's Included
+
+**Header Section**
+- Project name with status badge (In Progress, Completed, Paused, Blocked)
+- Autonomy level indicator (Full Control, Milestone, Autonomous)
+- Quick action buttons (Pause Project, Run Sprint)
+
+**Agent Panel**
+- List of all project agents with avatars
+- Real-time status indicators (active = green, idle = yellow, pending = gray)
+- Current task description for each agent
+- Last activity timestamp
+
+**Sprint Overview**
+- Current sprint progress bar
+- Issue statistics grid (Completed, In Progress, Blocked, To Do)
+- Visual burndown chart with ideal vs actual lines
+- Sprint selector dropdown
+
+**Issue Summary Sidebar**
+- Count of issues by status with color-coded icons
+- Quick links to view all issues
+
+**Recent Activity Feed**
+- Chronological event list with type icons
+- Agent attribution
+- Highlighted approval requests with action buttons
+
+### Key Design Decisions
+- Three-column layout on desktop (2/3 main, 1/3 sidebar)
+- Agent status uses traffic light colors for intuitive understanding
+- Burndown chart is simplified for quick scanning
+- Activity feed limited to 5 items with "View All" link
+
+### Questions for Review
+1. Is the burndown chart detailed enough?
+2. Should agent cards be expandable for more details?
+3. Is the 5-item activity feed sufficient?
+
+**Please review and approve or provide feedback.**
+
+Files:
+- `/frontend/src/app/[locale]/prototypes/project-dashboard/page.tsx`
+- `/frontend/src/app/[locale]/prototypes/project-dashboard/README.md`
+```
+
+---
+
+## Issue #37: [DESIGN] Agent Configuration UI
+
+**Comment to add:**
+
+```markdown
+## Design Prototype Ready for Review
+
+The Agent Configuration UI prototype has been created and is ready for review.
+
+### How to View
+1. Start the frontend dev server: `cd frontend && npm run dev`
+2. Navigate to: `http://localhost:3000/en/prototypes/agent-configuration`
+
+### What's Included
+
+**Three View Architecture**
+
+1. **List View**
+ - Grid of agent type cards
+ - Search functionality
+ - Status filter (Active, Draft, Inactive)
+ - Card shows: name, description, expertise tags, model, instance count
+
+2. **Detail View**
+ - Full configuration display (read-only)
+ - Model configuration section
+ - MCP permissions with scopes
+ - Personality prompt display
+ - Duplicate, Edit, Delete actions
+
+3. **Editor View** (Tabbed Interface)
+ - **Basic Info Tab**: Name, description, status, expertise areas
+ - **Model Tab**: Primary/failover model selection, temperature, max tokens, top P
+ - **Permissions Tab**: MCP server toggles with granular scope checkboxes
+ - **Personality Tab**: Large textarea for personality prompt
+
+### Key Design Decisions
+- Separate views for browsing, viewing, and editing
+- Tabbed editor reduces cognitive load
+- MCP permissions show nested scopes when enabled
+- Model parameters have helpful descriptions
+
+### User Flows to Test
+1. Click any card to see detail view
+2. Click "Edit" to see editor view
+3. Click "Create Agent Type" for blank editor
+4. Navigate tabs in editor
+
+### Questions for Review
+1. Is the tabbed editor the right approach?
+2. Should expertise be free-form tags or predefined list?
+3. Should model parameters have "presets"?
+
+**Please review and approve or provide feedback.**
+
+Files:
+- `/frontend/src/app/[locale]/prototypes/agent-configuration/page.tsx`
+- `/frontend/src/app/[locale]/prototypes/agent-configuration/README.md`
+```
+
+---
+
+## Issue #38: [DESIGN] Issue List and Detail Views
+
+**Comment to add:**
+
+```markdown
+## Design Prototype Ready for Review
+
+The Issue List and Detail Views prototype has been created and is ready for review.
+
+### How to View
+1. Start the frontend dev server: `cd frontend && npm run dev`
+2. Navigate to: `http://localhost:3000/en/prototypes/issue-management`
+
+### What's Included
+
+**List View**
+- Filterable table with sortable columns
+- Quick status filter + expandable advanced filters
+- Bulk action bar (appears when selecting issues)
+- Sync status indicator per issue
+- Labels displayed as badges
+
+**Filter Options**
+- Status: Open, In Progress, In Review, Blocked, Done
+- Priority: High, Medium, Low
+- Sprint: Current sprints, Backlog
+- Assignee: All agents + Unassigned
+- Labels: Feature, Bug, Backend, Frontend, etc.
+
+**Detail View**
+- Full issue content (markdown-like display)
+- Status workflow panel (click to change status)
+- Assignment panel with agent avatar
+- Activity timeline with:
+ - Status changes
+ - Comments
+ - Assignment changes
+ - Label changes
+- Development section (branch, PR link)
+
+### Key Design Decisions
+- Table layout for density and scannability
+- Status workflow matches common issue tracker patterns
+- Sync status indicator shows data freshness
+- Activity timeline shows issue history
+
+### User Flows to Test
+1. Use search and filters
+2. Click checkboxes to see bulk actions
+3. Sort by clicking column headers
+4. Click a row to see detail view
+5. Click status buttons in detail view
+
+### Questions for Review
+1. Should we add Kanban view as alternative?
+2. Is the sync indicator clear enough?
+3. Should there be inline editing?
+
+**Please review and approve or provide feedback.**
+
+Files:
+- `/frontend/src/app/[locale]/prototypes/issue-management/page.tsx`
+- `/frontend/src/app/[locale]/prototypes/issue-management/README.md`
+```
+
+---
+
+## Issue #39: [DESIGN] Real-time Activity Feed
+
+**Comment to add:**
+
+```markdown
+## Design Prototype Ready for Review
+
+The Real-time Activity Feed prototype has been created and is ready for review.
+
+### How to View
+1. Start the frontend dev server: `cd frontend && npm run dev`
+2. Navigate to: `http://localhost:3000/en/prototypes/activity-feed`
+
+### What's Included
+
+**Event Types Displayed**
+- Agent Status: Started, paused, resumed, stopped
+- Agent Message: Updates, questions, progress reports
+- Issue Update: Status changes, assignments, creation
+- Sprint Event: Standup, retrospective, planning
+- Approval Request: Requires user action (highlighted)
+- Error: Agent or system errors
+- Milestone: Goals achieved, completions
+
+**Features**
+- Real-time connection indicator (pulsing green when connected)
+- Time-based event grouping (New, Earlier Today, Yesterday, etc.)
+- Search functionality
+- Filter panel with:
+ - Event type checkboxes
+ - Agent checkboxes
+ - "Action required only" toggle
+- Expandable event details
+- Inline approval/reject buttons for requests
+- Mark all read functionality
+
+### Key Design Decisions
+- Card-based layout for clear event separation
+- Orange left border highlights action-required items
+- Time grouping helps users orient in timeline
+- Expandable details keep feed scannable
+- Real-time indicator builds trust in data freshness
+
+### User Flows to Test
+1. Scroll through the event feed
+2. Click events to expand details
+3. Open filter panel and select filters
+4. Click "Approve" on approval request
+5. Click "Mark all read"
+
+### Questions for Review
+1. Should events be grouped by time or show flat?
+2. Should there be sound notifications for urgent items?
+3. Should users be able to "star" events?
+
+**Please review and approve or provide feedback.**
+
+Files:
+- `/frontend/src/app/[locale]/prototypes/activity-feed/page.tsx`
+- `/frontend/src/app/[locale]/prototypes/activity-feed/README.md`
+```
+
+---
+
+## How to Add These Comments
+
+The comments above should be added to the respective Gitea issues at:
+`https://gitea.pragmazest.com/cardosofelipe/syndarix/issues`
+
+- Issue #36: Project Dashboard
+- Issue #37: Agent Configuration UI
+- Issue #38: Issue List and Detail Views
+- Issue #39: Real-time Activity Feed
+
+After the user reviews each prototype and provides feedback:
+1. Iterate on the design based on feedback
+2. Get explicit approval
+3. Begin implementation
diff --git a/frontend/src/app/[locale]/prototypes/activity-feed/README.md b/frontend/src/app/[locale]/prototypes/activity-feed/README.md
new file mode 100644
index 0000000..55c4eb1
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/activity-feed/README.md
@@ -0,0 +1,248 @@
+# Real-time Activity Feed - Design Prototype
+
+## Overview
+The Activity Feed provides a real-time view of all events happening across Syndarix projects. It displays agent status changes, messages, issue updates, sprint events, approval requests, and errors. This is the central hub for monitoring autonomous agent activity and responding to approval requests.
+
+## User Stories
+- As a user, I want to see real-time updates from my projects so I stay informed
+- As a user, I want to filter events by type, agent, or project to focus on what matters
+- As a user, I want to quickly identify items requiring my action
+- As a user, I want to expand events to see more details
+- As a user, I want to approve or reject requests directly from the feed
+- As a user, I want to know if I'm connected to the real-time stream
+- As a user, I want to mark events as read to track what I've seen
+
+## Key Screens
+
+### Main Feed View
+
+**Header**
+- Page title with description
+- Action required count badge
+- Mark all read button
+- Real-time connection indicator
+
+**Search and Filters**
+- Full-text search input
+- Filter button (toggles filter panel)
+- Refresh button
+
+**Filter Panel** (expandable)
+- Event type checkboxes (with icons)
+- Agent checkboxes
+- "Action required only" toggle
+- Clear all / Apply buttons
+
+**Event Groups**
+- Grouped by time period: New, Earlier Today, Yesterday, This Week, Older
+- Group header with count badge
+- Separator line
+
+**Event Cards**
+- Event type icon (colored)
+- Title with New/Action Required badges
+- Description text
+- Metadata row (agent, project, type)
+- Expand/collapse button
+- Expanded details (conditional)
+- Action buttons (for approval requests)
+
+## Event Types
+
+| Type | Icon | Color | Description |
+|------|------|-------|-------------|
+| Agent Status | Bot | Blue | Agent started, paused, resumed, stopped |
+| Agent Message | MessageSquare | Purple | Agent communication, updates, questions |
+| Issue Update | CircleDot | Green | Status change, assignment, creation |
+| Sprint Event | Zap | Yellow | Standup, retrospective, planning |
+| Approval Request | AlertCircle | Orange | Requires user action |
+| Error | XCircle | Red | Agent or system errors |
+| Milestone | CheckCircle | Emerald | Goals achieved, completions |
+
+## User Flow
+
+### Monitoring Activity
+1. User lands on feed page
+2. Feed shows real-time updates (newest first)
+3. User scrolls through events
+4. User clicks event to expand details
+5. User navigates to related issue/PR if needed
+
+### Filtering Events
+1. User clicks Filter button
+2. Filter panel expands
+3. User selects event types, agents, etc.
+4. User clicks Apply
+5. Feed updates to show matching events
+
+### Handling Approval Request
+1. Approval request appears with orange badge
+2. User reads request details
+3. User clicks Approve or Request Changes
+4. Event updates to show completed
+5. Badge count decreases
+
+## Design Decisions
+
+### Card-Based Layout
+- Each event is a distinct card
+- Visual separation between events
+- Expandable for more details
+- Cards are self-contained
+
+### Time-Based Grouping
+- Events grouped by time period
+- Helps users orient in the timeline
+- "New" group highlights unread items
+- Clear visual hierarchy
+
+### Real-Time Indicator
+- Pulsing green dot when connected
+- Gray dot when disconnected
+- Builds trust in data freshness
+- Matches common patterns (Slack, Discord)
+
+### Action Required Emphasis
+- Orange left border on cards
+- Badge in header with count
+- Cannot be missed
+- Inline approval buttons
+
+### Expandable Details
+- Keeps feed scannable
+- Details available on demand
+- Consistent expand/collapse pattern
+- Metadata shown when expanded
+
+### Search and Filters
+- Combined search and filter approach
+- Quick search for specific events
+- Structured filters for browsing
+- Filter state indicator
+
+## States
+
+### Loading
+- Skeleton cards while loading
+- Connection indicator shows connecting
+
+### Empty
+- No events: "Activity will appear here" message
+- No matches: "Try adjusting filters" message
+
+### Disconnected
+- Gray indicator
+- Retry button available
+- Last known data shown
+
+### Action Completed
+- Card updates to remove action badge
+- Success toast notification
+
+## Responsive Breakpoints
+
+### Desktop (lg: 1024px+)
+- Centered content (max-w-3xl)
+- Full filter panel inline
+- Comfortable spacing
+
+### Tablet (md: 768px)
+- Full-width content
+- Filter panel still inline
+- Slightly tighter spacing
+
+### Mobile (< 768px)
+- Full-width cards
+- Filter panel stacks vertically
+- Touch-friendly buttons
+- Simplified metadata row
+
+## Accessibility Notes
+- Event type icons have text labels
+- Color is not only indicator (badges, icons)
+- Keyboard navigation for expand/collapse
+- Screen reader announces new events
+- Focus management on filter panel
+- Live region for real-time updates
+
+## Components Used
+- Card, CardContent
+- Button (default, outline, ghost variants)
+- Badge (default, secondary, outline, destructive variants)
+- Input (search)
+- Checkbox
+- Label
+- Separator
+- Lucide icons
+
+## Event Data Structure
+
+```typescript
+interface ActivityEvent {
+ id: string;
+ type: 'agent_status' | 'agent_message' | 'issue_update' |
+ 'sprint_event' | 'approval_request' | 'error' | 'milestone';
+ title: string;
+ description: string;
+ timestamp: string; // ISO 8601
+ agent: {
+ name: string;
+ avatar: string;
+ };
+ project: string;
+ metadata: {
+ issueNumber?: number;
+ pullRequest?: number;
+ documentUrl?: string;
+ progress?: number;
+ summary?: {
+ agents: number;
+ inProgress: number;
+ blocked: number;
+ };
+ importance?: 'low' | 'medium' | 'high';
+ // ... other type-specific fields
+ };
+ requiresAction: boolean;
+ isNew: boolean;
+}
+```
+
+## Real-Time Implementation Notes
+
+For production, the feed should:
+1. Connect via WebSocket or SSE
+2. Handle reconnection gracefully
+3. Queue events during disconnect
+4. Merge with existing events on reconnect
+5. Support pagination for history
+6. Implement optimistic updates for actions
+
+## Questions for Review
+1. Should events be grouped by time or show flat chronologically?
+2. How many events should load initially? (Currently showing 10)
+3. Should there be sound/browser notifications for urgent items?
+4. Should users be able to "star" or save important events?
+5. Should there be a compact view option?
+6. Should events support threading/replies?
+
+## How to View
+Navigate to: `/prototypes/activity-feed`
+
+Try the features:
+1. Scroll through the event feed
+2. Click events to expand details
+3. Open the filter panel
+4. Try the action buttons on approval requests
+5. Use the search to filter events
+
+## Next Steps
+After approval:
+1. Implement WebSocket connection for real-time updates
+2. Add browser notification support
+3. Implement event pagination (infinite scroll)
+4. Add optimistic updates for approve/dismiss
+5. Implement notification sound settings
+6. Add project-level filtering
+7. Implement event archiving
+8. Add keyboard shortcuts (j/k navigation)
diff --git a/frontend/src/app/[locale]/prototypes/activity-feed/page.tsx b/frontend/src/app/[locale]/prototypes/activity-feed/page.tsx
new file mode 100644
index 0000000..8c10042
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/activity-feed/page.tsx
@@ -0,0 +1,846 @@
+'use client';
+
+import { useState, useEffect } from 'react';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { Badge } from '@/components/ui/badge';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { Checkbox } from '@/components/ui/checkbox';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { Separator } from '@/components/ui/separator';
+import {
+ Activity,
+ Bot,
+ MessageSquare,
+ PlayCircle,
+ PauseCircle,
+ CheckCircle2,
+ AlertCircle,
+ Clock,
+ GitPullRequest,
+ GitBranch,
+ CircleDot,
+ XCircle,
+ Zap,
+ Users,
+ ChevronRight,
+ Settings,
+ Filter,
+ Bell,
+ BellOff,
+ RefreshCw,
+ ChevronDown,
+ ChevronUp,
+ ExternalLink,
+ Search,
+} from 'lucide-react';
+
+// Event type configurations
+const eventTypeConfig = {
+ agent_status: {
+ label: 'Agent Status',
+ icon: Bot,
+ color: 'text-blue-500',
+ bgColor: 'bg-blue-100 dark:bg-blue-900',
+ },
+ agent_message: {
+ label: 'Agent Message',
+ icon: MessageSquare,
+ color: 'text-purple-500',
+ bgColor: 'bg-purple-100 dark:bg-purple-900',
+ },
+ issue_update: {
+ label: 'Issue Update',
+ icon: CircleDot,
+ color: 'text-green-500',
+ bgColor: 'bg-green-100 dark:bg-green-900',
+ },
+ sprint_event: {
+ label: 'Sprint Event',
+ icon: Zap,
+ color: 'text-yellow-500',
+ bgColor: 'bg-yellow-100 dark:bg-yellow-900',
+ },
+ approval_request: {
+ label: 'Approval Request',
+ icon: AlertCircle,
+ color: 'text-orange-500',
+ bgColor: 'bg-orange-100 dark:bg-orange-900',
+ },
+ error: {
+ label: 'Error',
+ icon: XCircle,
+ color: 'text-red-500',
+ bgColor: 'bg-red-100 dark:bg-red-900',
+ },
+ milestone: {
+ label: 'Milestone',
+ icon: CheckCircle2,
+ color: 'text-emerald-500',
+ bgColor: 'bg-emerald-100 dark:bg-emerald-900',
+ },
+};
+
+// Mock activity events
+const mockEvents = [
+ {
+ id: 'evt-001',
+ type: 'approval_request',
+ title: 'Approval Required: Architecture Decision',
+ description: 'Architect is requesting approval for the API design document for the checkout flow.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 2).toISOString(), // 2 min ago
+ agent: { name: 'Architect', avatar: 'AR' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ documentUrl: '/docs/adr-015-checkout-api.md',
+ importance: 'high',
+ },
+ requiresAction: true,
+ isNew: true,
+ },
+ {
+ id: 'evt-002',
+ type: 'agent_message',
+ title: 'Implementation Update',
+ description: 'Completed JWT token generation and validation. Moving on to session management.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 8).toISOString(), // 8 min ago
+ agent: { name: 'Backend Engineer', avatar: 'BE' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ issueNumber: 42,
+ progress: 65,
+ },
+ requiresAction: false,
+ isNew: true,
+ },
+ {
+ id: 'evt-003',
+ type: 'agent_status',
+ title: 'Agent Started Work',
+ description: 'Frontend Engineer has started working on the product catalog component.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 15).toISOString(), // 15 min ago
+ agent: { name: 'Frontend Engineer', avatar: 'FE' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ previousStatus: 'idle',
+ newStatus: 'active',
+ issueNumber: 45,
+ },
+ requiresAction: false,
+ isNew: true,
+ },
+ {
+ id: 'evt-004',
+ type: 'issue_update',
+ title: 'Issue Status Changed',
+ description: 'Issue #38 "Implement user registration" moved from "In Progress" to "In Review".',
+ timestamp: new Date(Date.now() - 1000 * 60 * 25).toISOString(), // 25 min ago
+ agent: { name: 'Backend Engineer', avatar: 'BE' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ issueNumber: 38,
+ oldStatus: 'in_progress',
+ newStatus: 'in_review',
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+ {
+ id: 'evt-005',
+ type: 'sprint_event',
+ title: 'Daily Standup Completed',
+ description: 'Sprint 3 daily standup: 4 agents reported, 8 issues in progress, 1 blocked.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 60).toISOString(), // 1 hour ago
+ agent: { name: 'System', avatar: 'SY' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ sprintName: 'Sprint 3',
+ summary: {
+ agents: 4,
+ inProgress: 8,
+ blocked: 1,
+ },
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+ {
+ id: 'evt-006',
+ type: 'error',
+ title: 'Agent Error',
+ description: 'QA Engineer encountered an error while setting up the test framework. Retry attempted.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 90).toISOString(), // 1.5 hours ago
+ agent: { name: 'QA Engineer', avatar: 'QA' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ errorType: 'configuration',
+ retryCount: 1,
+ resolved: false,
+ },
+ requiresAction: true,
+ isNew: false,
+ },
+ {
+ id: 'evt-007',
+ type: 'milestone',
+ title: 'Sprint Goal Achieved',
+ description: 'Authentication module completed! All acceptance criteria met.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 120).toISOString(), // 2 hours ago
+ agent: { name: 'Product Owner', avatar: 'PO' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ milestone: 'Auth Module',
+ issuesCompleted: 5,
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+ {
+ id: 'evt-008',
+ type: 'agent_status',
+ title: 'Agent Paused',
+ description: 'DevOps Engineer paused pending infrastructure approval.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 180).toISOString(), // 3 hours ago
+ agent: { name: 'DevOps Engineer', avatar: 'DO' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ previousStatus: 'active',
+ newStatus: 'paused',
+ reason: 'Awaiting approval',
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+ {
+ id: 'evt-009',
+ type: 'agent_message',
+ title: 'Code Review Comment',
+ description: 'Found potential security issue in password hashing. Recommending bcrypt with higher rounds.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 240).toISOString(), // 4 hours ago
+ agent: { name: 'Architect', avatar: 'AR' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ issueNumber: 42,
+ pullRequest: 15,
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+ {
+ id: 'evt-010',
+ type: 'issue_update',
+ title: 'Issue Created',
+ description: 'New issue created: "Add rate limiting to API endpoints" - assigned to Backend Engineer.',
+ timestamp: new Date(Date.now() - 1000 * 60 * 300).toISOString(), // 5 hours ago
+ agent: { name: 'Product Owner', avatar: 'PO' },
+ project: 'E-Commerce Platform',
+ metadata: {
+ issueNumber: 50,
+ priority: 'medium',
+ },
+ requiresAction: false,
+ isNew: false,
+ },
+];
+
+// Format relative time
+function formatRelativeTime(timestamp: string): string {
+ const now = new Date();
+ const then = new Date(timestamp);
+ const diffMs = now.getTime() - then.getTime();
+ const diffMins = Math.floor(diffMs / (1000 * 60));
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
+
+ if (diffMins < 1) return 'Just now';
+ if (diffMins < 60) return `${diffMins} min ago`;
+ if (diffHours < 24) return `${diffHours} hour${diffHours > 1 ? 's' : ''} ago`;
+ return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;
+}
+
+// Group events by time period
+function groupEventsByPeriod(events: typeof mockEvents) {
+ const now = new Date();
+ const groups: { label: string; events: typeof mockEvents }[] = [
+ { label: 'New', events: [] },
+ { label: 'Earlier Today', events: [] },
+ { label: 'Yesterday', events: [] },
+ { label: 'This Week', events: [] },
+ { label: 'Older', events: [] },
+ ];
+
+ events.forEach((event) => {
+ const eventDate = new Date(event.timestamp);
+ const diffHours = (now.getTime() - eventDate.getTime()) / (1000 * 60 * 60);
+ const diffDays = diffHours / 24;
+
+ if (event.isNew) {
+ groups[0].events.push(event);
+ } else if (diffHours < 24 && eventDate.getDate() === now.getDate()) {
+ groups[1].events.push(event);
+ } else if (diffDays < 2) {
+ groups[2].events.push(event);
+ } else if (diffDays < 7) {
+ groups[3].events.push(event);
+ } else {
+ groups[4].events.push(event);
+ }
+ });
+
+ return groups.filter((g) => g.events.length > 0);
+}
+
+// Event card component
+function EventCard({
+ event,
+ expanded,
+ onToggle,
+ onApprove,
+ onDismiss,
+}: {
+ event: (typeof mockEvents)[0];
+ expanded: boolean;
+ onToggle: () => void;
+ onApprove: () => void;
+ onDismiss: () => void;
+}) {
+ const config = eventTypeConfig[event.type as keyof typeof eventTypeConfig];
+ const Icon = config.icon;
+
+ return (
+
+
+
+ {/* Icon */}
+
+
+
+
+ {/* Content */}
+
+
+
+
+
{event.title}
+ {event.isNew && (
+
+ New
+
+ )}
+ {event.requiresAction && (
+
+ Action Required
+
+ )}
+
+
+ {event.description}
+
+
+
+ {formatRelativeTime(event.timestamp)}
+
+ {expanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {/* Metadata row */}
+
+
+
+ {event.agent.name}
+
+
+
+ {config.label}
+
+
+
+ {/* Expanded details */}
+ {expanded && (
+
+ {event.metadata.issueNumber && (
+
+
+ Issue #{event.metadata.issueNumber}
+
+ View Issue
+
+
+ )}
+ {event.metadata.pullRequest && (
+
+
+ PR #{event.metadata.pullRequest}
+
+ View PR
+
+
+ )}
+ {event.metadata.documentUrl && (
+
+ )}
+ {event.metadata.summary && (
+
+
+
+ {event.metadata.summary.agents}
+
+
Agents
+
+
+
+ {event.metadata.summary.inProgress}
+
+
In Progress
+
+
+
+ {event.metadata.summary.blocked}
+
+
Blocked
+
+
+ )}
+ {event.metadata.progress !== undefined && (
+
+
+ Progress
+ {event.metadata.progress}%
+
+
+
+ )}
+
+ {new Date(event.timestamp).toLocaleString()}
+
+
+ )}
+
+ {/* Action buttons for approval requests */}
+ {event.requiresAction && (
+
+
+
+ Approve
+
+
+ Request Changes
+
+
+ View Details
+
+
+ )}
+
+
+
+
+ );
+}
+
+// Filter panel component
+function FilterPanel({
+ filters,
+ onFiltersChange,
+ onClose,
+}: {
+ filters: {
+ types: string[];
+ agents: string[];
+ projects: string[];
+ showActionRequired: boolean;
+ };
+ onFiltersChange: (filters: typeof filters) => void;
+ onClose: () => void;
+}) {
+ const eventTypes = Object.entries(eventTypeConfig);
+ const agents = ['Backend Engineer', 'Frontend Engineer', 'Architect', 'Product Owner', 'QA Engineer', 'DevOps Engineer'];
+ const projects = ['E-Commerce Platform', 'Mobile App', 'API Gateway'];
+
+ const toggleType = (type: string) => {
+ const newTypes = filters.types.includes(type)
+ ? filters.types.filter((t) => t !== type)
+ : [...filters.types, type];
+ onFiltersChange({ ...filters, types: newTypes });
+ };
+
+ const toggleAgent = (agent: string) => {
+ const newAgents = filters.agents.includes(agent)
+ ? filters.agents.filter((a) => a !== agent)
+ : [...filters.agents, agent];
+ onFiltersChange({ ...filters, agents: newAgents });
+ };
+
+ return (
+
+
+ {/* Event Types */}
+
+
Event Types
+
+ {eventTypes.map(([key, config]) => {
+ const Icon = config.icon;
+ return (
+
+ toggleType(key)}
+ />
+
+
+ {config.label}
+
+
+ );
+ })}
+
+
+
+ {/* Agents */}
+
+
Agents
+
+ {agents.map((agent) => (
+
+ toggleAgent(agent)}
+ />
+
+ {agent}
+
+
+ ))}
+
+
+
+ {/* Show action required only */}
+
+
+ onFiltersChange({ ...filters, showActionRequired: checked as boolean })
+ }
+ />
+
+ Show only items requiring action
+
+
+
+ {/* Actions */}
+
+
+ onFiltersChange({
+ types: [],
+ agents: [],
+ projects: [],
+ showActionRequired: false,
+ })
+ }
+ >
+ Clear All
+
+
+ Apply Filters
+
+
+
+
+ );
+}
+
+// Real-time indicator
+function RealTimeIndicator({ connected }: { connected: boolean }) {
+ return (
+
+
+
+ {connected ? 'Live' : 'Disconnected'}
+
+
+ );
+}
+
+export default function ActivityFeedPrototype() {
+ const [events, setEvents] = useState(mockEvents);
+ const [expandedEvents, setExpandedEvents] = useState([]);
+ const [showFilters, setShowFilters] = useState(false);
+ const [filters, setFilters] = useState({
+ types: [] as string[],
+ agents: [] as string[],
+ projects: [] as string[],
+ showActionRequired: false,
+ });
+ const [searchQuery, setSearchQuery] = useState('');
+ const [isConnected, setIsConnected] = useState(true);
+ const [notificationsEnabled, setNotificationsEnabled] = useState(true);
+
+ // Simulate real-time updates
+ useEffect(() => {
+ const interval = setInterval(() => {
+ // Randomly toggle connection status for demo
+ if (Math.random() > 0.95) {
+ setIsConnected((prev) => !prev);
+ }
+ }, 5000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ // Filter events
+ const filteredEvents = events.filter((event) => {
+ const matchesSearch =
+ searchQuery === '' ||
+ event.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ event.description.toLowerCase().includes(searchQuery.toLowerCase());
+ const matchesType =
+ filters.types.length === 0 || filters.types.includes(event.type);
+ const matchesAgent =
+ filters.agents.length === 0 || filters.agents.includes(event.agent.name);
+ const matchesActionRequired =
+ !filters.showActionRequired || event.requiresAction;
+ return matchesSearch && matchesType && matchesAgent && matchesActionRequired;
+ });
+
+ const groupedEvents = groupEventsByPeriod(filteredEvents);
+
+ const toggleExpanded = (eventId: string) => {
+ setExpandedEvents((prev) =>
+ prev.includes(eventId)
+ ? prev.filter((id) => id !== eventId)
+ : [...prev, eventId]
+ );
+ };
+
+ const handleApprove = (eventId: string) => {
+ setEvents((prev) =>
+ prev.map((e) =>
+ e.id === eventId ? { ...e, requiresAction: false, isNew: false } : e
+ )
+ );
+ };
+
+ const handleDismiss = (eventId: string) => {
+ // In real implementation, this would open a modal for feedback
+ console.log('Dismiss:', eventId);
+ };
+
+ const markAllRead = () => {
+ setEvents((prev) => prev.map((e) => ({ ...e, isNew: false })));
+ };
+
+ const actionRequiredCount = events.filter((e) => e.requiresAction).length;
+ const newCount = events.filter((e) => e.isNew).length;
+
+ return (
+
+ {/* Navigation Bar */}
+
+
+
+ Syndarix
+
+ Activity Feed
+
+
+
+ setNotificationsEnabled(!notificationsEnabled)}
+ >
+ {notificationsEnabled ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {/* Header */}
+
+
+
Activity Feed
+
+ Real-time updates from your projects
+
+
+
+ {actionRequiredCount > 0 && (
+
+
+ {actionRequiredCount} pending
+
+ )}
+ {newCount > 0 && (
+
+ Mark all read ({newCount})
+
+ )}
+
+
+
+ {/* Search and Filters */}
+
+
+
+ setSearchQuery(e.target.value)}
+ className="pl-9"
+ />
+
+
setShowFilters(!showFilters)}
+ className={showFilters ? 'bg-muted' : ''}
+ >
+
+ Filters
+ {(filters.types.length > 0 ||
+ filters.agents.length > 0 ||
+ filters.showActionRequired) && (
+
+ Active
+
+ )}
+
+
setIsConnected(true)}>
+
+
+
+
+ {/* Filter Panel */}
+ {showFilters && (
+
setShowFilters(false)}
+ />
+ )}
+
+ {/* Event Groups */}
+
+ {groupedEvents.map((group) => (
+
+
+
+ {group.label}
+
+
+ {group.events.length}
+
+
+
+
+ {group.events.map((event) => (
+ toggleExpanded(event.id)}
+ onApprove={() => handleApprove(event.id)}
+ onDismiss={() => handleDismiss(event.id)}
+ />
+ ))}
+
+
+ ))}
+
+
+ {filteredEvents.length === 0 && (
+
+
+ No activity found
+
+ {searchQuery || filters.types.length > 0
+ ? 'Try adjusting your search or filters'
+ : 'Activity will appear here as agents work on your projects'}
+
+
+ )}
+
+ {/* Load More */}
+ {filteredEvents.length > 0 && (
+
+ Load More Activity
+
+ )}
+
+
+
+ );
+}
diff --git a/frontend/src/app/[locale]/prototypes/agent-configuration/README.md b/frontend/src/app/[locale]/prototypes/agent-configuration/README.md
new file mode 100644
index 0000000..1960df3
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/agent-configuration/README.md
@@ -0,0 +1,213 @@
+# Agent Configuration UI - Design Prototype
+
+## Overview
+The Agent Configuration UI allows users to create, view, and manage Agent Types - the templates from which agent instances are spawned. This is a critical administrative interface for defining how AI agents behave, what models they use, and what permissions they have.
+
+## User Stories
+- As an admin, I want to create new agent types so I can define specialized AI agents for my projects
+- As an admin, I want to configure model selection and parameters to optimize agent performance
+- As an admin, I want to define MCP permissions to control what tools agents can access
+- As an admin, I want to craft personality prompts to shape agent behavior and communication style
+- As an admin, I want to view all agent types and their status at a glance
+- As an admin, I want to duplicate existing agent types as starting points for new ones
+
+## Key Screens
+
+### 1. Agent Type List View
+- Grid layout of agent type cards
+- Search functionality
+- Status filter (Active, Draft, Inactive)
+- Create new agent type button
+- Card shows: name, description, expertise tags, model, instance count, status
+
+### 2. Agent Type Detail View
+- Full configuration display (read-only)
+- Description and expertise areas
+- Model configuration (primary, failover, parameters)
+- MCP permissions with scopes
+- Personality prompt display
+- Instance count and quick actions
+- Duplicate, Edit, Delete buttons
+- Danger zone for destructive actions
+
+### 3. Agent Type Editor View
+- Tabbed interface for organized editing:
+ - **Basic Info**: Name, description, status, expertise areas
+ - **Model**: Primary/failover model selection, temperature, max tokens, top P
+ - **Permissions**: MCP server toggles with granular scope checkboxes
+ - **Personality**: Large textarea for personality prompt with character count
+
+## User Flow
+
+### Creating a New Agent Type
+1. User clicks "Create Agent Type" from list view
+2. Editor opens with blank form
+3. User fills in basic info (name, description, expertise)
+4. User selects model configuration
+5. User enables MCP permissions and selects scopes
+6. User writes personality prompt
+7. User saves (creates as Draft or Active)
+
+### Editing an Existing Agent Type
+1. User clicks agent type card in list
+2. Detail view shows full configuration
+3. User clicks "Edit" button
+4. Editor opens with pre-filled data
+5. User modifies settings across tabs
+6. User saves changes
+
+### Duplicating an Agent Type
+1. User opens detail view
+2. User clicks "Duplicate"
+3. Editor opens with copied data and new name
+4. User modifies as needed
+5. User saves as new agent type
+
+## Design Decisions
+
+### Three-View Architecture
+- **List**: Overview and discovery
+- **Detail**: Read-only inspection
+- **Editor**: Focused editing experience
+- Clear navigation between views with back button
+
+### Tabbed Editor
+- Logical grouping of related settings
+- Reduces cognitive load
+- Allows focused work on one aspect at a time
+- Icons on tabs for quick recognition
+
+### Card-Based List
+- Visual grid layout for quick scanning
+- Status badges for instant status recognition
+- Expertise tags show capabilities at a glance
+- Instance count indicates usage
+
+### MCP Permissions UI
+- Checkbox for enabling/disabling each server
+- Nested scopes only shown when server is enabled
+- Clear visual distinction between enabled/disabled
+- Granular control over what agents can access
+
+### Model Configuration
+- Primary + failover model selection
+- Common parameters exposed (temperature, max tokens, top P)
+- Helpful descriptions for each parameter
+- Sensible defaults pre-filled
+
+## States
+
+### Loading
+- Skeleton cards in list view
+- Skeleton placeholders in detail/editor views
+
+### Empty
+- No agent types: "Create your first agent type" CTA
+- No search results: "No agent types found" with suggestion
+
+### Error
+- Failed to load: Error card with retry button
+- Failed to save: Toast notification with error details
+
+### Validation
+- Required fields highlighted
+- Character limits enforced
+- Model parameter ranges validated
+
+## Responsive Breakpoints
+
+### Desktop (lg: 1024px+)
+- 3-column card grid in list view
+- 2/3 + 1/3 split in detail view
+- Full tab navigation visible
+
+### Tablet (md: 768px)
+- 2-column card grid
+- Stacked layout in detail view
+- Compact tab labels
+
+### Mobile (< 768px)
+- Single column card list
+- Full-width cards
+- Scrollable tab navigation
+- Stacked form fields
+
+## Accessibility Notes
+- Form labels properly associated with inputs
+- Tab panel navigation is keyboard accessible
+- Status badges have text (not just color)
+- Focus management when navigating between views
+- Screen reader announces view changes
+- Textarea has proper aria-labels
+
+## Components Used
+- Card, CardHeader, CardTitle, CardContent, CardDescription
+- Button (default, outline, ghost, destructive variants)
+- Badge (default, secondary, outline variants)
+- Input, Textarea, Label
+- Select, SelectContent, SelectItem, SelectTrigger, SelectValue
+- Tabs, TabsList, TabsTrigger, TabsContent
+- Checkbox
+- Separator
+- Lucide icons
+
+## Form Fields Reference
+
+### Basic Info
+| Field | Type | Required | Validation |
+|-------|------|----------|------------|
+| Name | Text | Yes | 3-50 characters |
+| Status | Select | Yes | active/draft/inactive |
+| Description | Textarea | Yes | 10-500 characters |
+| Expertise | Tags | No | Comma-separated |
+
+### Model Configuration
+| Field | Type | Required | Validation |
+|-------|------|----------|------------|
+| Primary Model | Select | Yes | From available models |
+| Failover Model | Select | No | From available models |
+| Temperature | Number | Yes | 0.0 - 2.0 |
+| Max Tokens | Number | Yes | 1024 - 32768 |
+| Top P | Number | Yes | 0.0 - 1.0 |
+
+### MCP Permissions
+| Server | Scopes |
+|--------|--------|
+| Gitea | read, write, issues, branches, prs |
+| Knowledge Base | read, write |
+| Filesystem | read, write |
+| Slack | read, write |
+| Jira | read, write, issues |
+
+### Personality Prompt
+- Large textarea (15 rows)
+- Character count display
+- Template insertion button
+- Preview functionality
+
+## Questions for Review
+1. Should we add a "Test Agent" feature to try the personality prompt?
+2. Is the tabbed editor the right approach or should all fields be on one page?
+3. Should expertise be free-form tags or a predefined list?
+4. Should model parameters have "presets" (conservative, balanced, creative)?
+5. How should we handle versioning of agent types?
+6. Should there be an approval workflow for activating agent types?
+
+## How to View
+Navigate to: `/prototypes/agent-configuration`
+
+Click through the views:
+1. Start on list view
+2. Click any card to see detail view
+3. Click "Edit" to see editor view
+4. Click "Create Agent Type" to see editor in create mode
+
+## Next Steps
+After approval:
+1. Implement form validation with react-hook-form and zod
+2. Connect to agent type CRUD API
+3. Add real model list from API
+4. Implement tag input component for expertise
+5. Add personality prompt templates
+6. Implement MCP permission verification
+7. Add loading skeletons and error states
diff --git a/frontend/src/app/[locale]/prototypes/agent-configuration/page.tsx b/frontend/src/app/[locale]/prototypes/agent-configuration/page.tsx
new file mode 100644
index 0000000..88b962b
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/agent-configuration/page.tsx
@@ -0,0 +1,940 @@
+'use client';
+
+import { useState } from 'react';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { Badge } from '@/components/ui/badge';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { Textarea } from '@/components/ui/textarea';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { Separator } from '@/components/ui/separator';
+import { Checkbox } from '@/components/ui/checkbox';
+import {
+ Bot,
+ Plus,
+ Search,
+ Settings,
+ ChevronRight,
+ ArrowLeft,
+ Copy,
+ Trash2,
+ Save,
+ Eye,
+ Edit,
+ Sliders,
+ Shield,
+ MessageSquare,
+ Cpu,
+ Zap,
+ Code,
+ FileText,
+ GitBranch,
+ CheckCircle2,
+ AlertTriangle,
+} from 'lucide-react';
+
+// Mock data for agent types
+const mockAgentTypes = [
+ {
+ id: 'type-001',
+ name: 'Product Owner',
+ description: 'Manages product backlog, defines user stories, and prioritizes features',
+ expertise: ['Requirements', 'User Stories', 'Prioritization', 'Stakeholder Management'],
+ model: 'claude-opus-4-5-20251101',
+ status: 'active',
+ instanceCount: 3,
+ lastModified: '2025-01-20',
+ },
+ {
+ id: 'type-002',
+ name: 'Software Architect',
+ description: 'Designs system architecture, makes technology decisions, and ensures scalability',
+ expertise: ['System Design', 'API Design', 'Database Architecture', 'Security'],
+ model: 'claude-opus-4-5-20251101',
+ status: 'active',
+ instanceCount: 2,
+ lastModified: '2025-01-18',
+ },
+ {
+ id: 'type-003',
+ name: 'Backend Engineer',
+ description: 'Implements server-side logic, APIs, and database interactions',
+ expertise: ['Python', 'FastAPI', 'PostgreSQL', 'Redis', 'Testing'],
+ model: 'claude-sonnet-4-20250514',
+ status: 'active',
+ instanceCount: 5,
+ lastModified: '2025-01-22',
+ },
+ {
+ id: 'type-004',
+ name: 'Frontend Engineer',
+ description: 'Builds user interfaces using modern React and Next.js',
+ expertise: ['React', 'Next.js', 'TypeScript', 'Tailwind CSS', 'Testing'],
+ model: 'claude-sonnet-4-20250514',
+ status: 'active',
+ instanceCount: 4,
+ lastModified: '2025-01-21',
+ },
+ {
+ id: 'type-005',
+ name: 'QA Engineer',
+ description: 'Creates test plans, writes automated tests, and ensures quality',
+ expertise: ['Test Planning', 'E2E Testing', 'Unit Testing', 'Bug Reporting'],
+ model: 'claude-sonnet-4-20250514',
+ status: 'draft',
+ instanceCount: 0,
+ lastModified: '2025-01-19',
+ },
+ {
+ id: 'type-006',
+ name: 'DevOps Engineer',
+ description: 'Manages infrastructure, CI/CD pipelines, and deployment processes',
+ expertise: ['Docker', 'Kubernetes', 'CI/CD', 'Monitoring', 'Security'],
+ model: 'claude-sonnet-4-20250514',
+ status: 'inactive',
+ instanceCount: 1,
+ lastModified: '2025-01-15',
+ },
+];
+
+// Full agent type detail for editor
+const mockAgentTypeDetail = {
+ id: 'type-002',
+ name: 'Software Architect',
+ description: 'Designs system architecture, makes technology decisions, and ensures scalability. Works closely with the Product Owner to understand requirements and with Engineers to implement solutions.',
+ expertise: ['System Design', 'API Design', 'Database Architecture', 'Security', 'Scalability'],
+ model: {
+ primary: 'claude-opus-4-5-20251101',
+ failover: 'claude-sonnet-4-20250514',
+ },
+ parameters: {
+ temperature: 0.7,
+ maxTokens: 8192,
+ topP: 0.95,
+ },
+ mcpPermissions: [
+ { id: 'gitea', name: 'Gitea', enabled: true, scopes: ['read', 'write', 'issues'] },
+ { id: 'knowledge', name: 'Knowledge Base', enabled: true, scopes: ['read', 'write'] },
+ { id: 'filesystem', name: 'Filesystem', enabled: true, scopes: ['read', 'write'] },
+ { id: 'slack', name: 'Slack', enabled: false, scopes: [] },
+ { id: 'jira', name: 'Jira', enabled: false, scopes: [] },
+ ],
+ personalityPrompt: `You are a Senior Software Architect with 15+ years of experience designing scalable, maintainable systems. Your approach is:
+
+1. **Pragmatic**: You favor proven solutions over cutting-edge unless there's a clear benefit
+2. **Security-minded**: Security is a first-class concern, not an afterthought
+3. **Documentation-focused**: You believe in architecture decision records (ADRs)
+4. **Collaborative**: You seek input from engineers and stakeholders before making major decisions
+
+When designing systems:
+- Start with requirements and constraints
+- Consider scalability, maintainability, and operational concerns
+- Document decisions and their rationale
+- Provide clear guidance for implementation teams
+
+Your communication style is clear, structured, and respectful. You explain complex concepts simply and always justify your recommendations.`,
+ status: 'active',
+ instanceCount: 2,
+ createdAt: '2025-01-10',
+ lastModified: '2025-01-18',
+};
+
+// View states
+type ViewState = 'list' | 'detail' | 'editor';
+
+// Status badge for agent types
+function AgentTypeStatusBadge({ status }: { status: string }) {
+ const variants: Record = {
+ active: {
+ label: 'Active',
+ className: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
+ },
+ draft: {
+ label: 'Draft',
+ className: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
+ },
+ inactive: {
+ label: 'Inactive',
+ className: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-200',
+ },
+ };
+
+ const variant = variants[status] || variants.inactive;
+
+ return (
+
+ {variant.label}
+
+ );
+}
+
+// Agent Type List View
+function AgentTypeListView({
+ onSelect,
+ onCreate,
+}: {
+ onSelect: (id: string) => void;
+ onCreate: () => void;
+}) {
+ const [searchQuery, setSearchQuery] = useState('');
+ const [statusFilter, setStatusFilter] = useState('all');
+
+ const filteredTypes = mockAgentTypes.filter((type) => {
+ const matchesSearch =
+ type.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ type.description.toLowerCase().includes(searchQuery.toLowerCase());
+ const matchesStatus = statusFilter === 'all' || type.status === statusFilter;
+ return matchesSearch && matchesStatus;
+ });
+
+ return (
+
+ {/* Header */}
+
+
+
Agent Types
+
+ Configure templates for spawning AI agent instances
+
+
+
+
+ Create Agent Type
+
+
+
+ {/* Filters */}
+
+
+
+ setSearchQuery(e.target.value)}
+ className="pl-9"
+ />
+
+
+
+
+
+
+ All Status
+ Active
+ Draft
+ Inactive
+
+
+
+
+ {/* Agent Type Grid */}
+
+ {filteredTypes.map((type) => (
+
onSelect(type.id)}
+ >
+
+
+ {type.name}
+ {type.description}
+
+
+
+ {/* Expertise tags */}
+
+ {type.expertise.slice(0, 3).map((skill) => (
+
+ {skill}
+
+ ))}
+ {type.expertise.length > 3 && (
+
+ +{type.expertise.length - 3}
+
+ )}
+
+
+
+
+ {/* Metadata */}
+
+
+
+ {type.model.split('-').slice(1, 2).join(' ')}
+
+
+
+ {type.instanceCount} instances
+
+
+
+
+
+ ))}
+
+
+ {filteredTypes.length === 0 && (
+
+
+
No agent types found
+
Try adjusting your search or filters
+
+ )}
+
+ );
+}
+
+// Agent Type Detail View
+function AgentTypeDetailView({
+ onBack,
+ onEdit,
+}: {
+ onBack: () => void;
+ onEdit: () => void;
+}) {
+ const type = mockAgentTypeDetail;
+
+ return (
+
+ {/* Header */}
+
+
+
+
+
+
+
Last modified: {type.lastModified}
+
+
+
+
+ Duplicate
+
+
+
+ Edit
+
+
+
+
+
+ {/* Main Content */}
+
+ {/* Description Card */}
+
+
+
+
+ Description
+
+
+
+ {type.description}
+
+
+
+ {/* Expertise Card */}
+
+
+
+
+ Expertise Areas
+
+
+
+
+ {type.expertise.map((skill) => (
+
+ {skill}
+
+ ))}
+
+
+
+
+ {/* Personality Prompt Card */}
+
+
+
+
+ Personality Prompt
+
+
+
+
+ {type.personalityPrompt}
+
+
+
+
+ {/* MCP Permissions Card */}
+
+
+
+
+ MCP Permissions
+
+
+ Model Context Protocol servers this agent can access
+
+
+
+
+ {type.mcpPermissions.map((perm) => (
+
+
+
+ {perm.enabled ? (
+
+ ) : (
+
+ )}
+
+
+
{perm.name}
+
+ {perm.enabled ? perm.scopes.join(', ') : 'Not enabled'}
+
+
+
+
+ {perm.enabled ? 'Enabled' : 'Disabled'}
+
+
+ ))}
+
+
+
+
+
+ {/* Sidebar */}
+
+ {/* Model Configuration */}
+
+
+
+
+ Model Configuration
+
+
+
+
+
Primary Model
+
{type.model.primary}
+
+
+
Failover Model
+
{type.model.failover}
+
+
+
+
+ Temperature
+ {type.parameters.temperature}
+
+
+ Max Tokens
+ {type.parameters.maxTokens.toLocaleString()}
+
+
+ Top P
+ {type.parameters.topP}
+
+
+
+
+
+ {/* Instance Stats */}
+
+
+
+
+ Instances
+
+
+
+
+
{type.instanceCount}
+
Active instances
+
+
+ View Instances
+
+
+
+
+ {/* Danger Zone */}
+
+
+
+
+ Danger Zone
+
+
+
+
+ Deactivate Type
+
+
+
+ Delete Type
+
+
+
+
+
+
+ );
+}
+
+// Agent Type Editor View
+function AgentTypeEditorView({
+ onBack,
+ onSave,
+ isNew = false,
+}: {
+ onBack: () => void;
+ onSave: () => void;
+ isNew?: boolean;
+}) {
+ const [activeTab, setActiveTab] = useState('basic');
+
+ return (
+
+ {/* Header */}
+
+
+
+
+
+
+ {isNew ? 'Create Agent Type' : 'Edit Agent Type'}
+
+
+ {isNew
+ ? 'Define a new agent type template'
+ : 'Modify agent type configuration'}
+
+
+
+
+ Cancel
+
+
+
+ {isNew ? 'Create' : 'Save Changes'}
+
+
+
+
+ {/* Editor Tabs */}
+
+
+
+
+ Basic Info
+
+
+
+ Model
+
+
+
+ Permissions
+
+
+
+ Personality
+
+
+
+ {/* Basic Info Tab */}
+
+
+
+ Basic Information
+
+ Define the agent type name, description, and expertise areas
+
+
+
+
+
+ Name
+
+
+
+ Status
+
+
+
+
+
+ Active
+ Draft
+ Inactive
+
+
+
+
+
+
+ Description
+
+
+
+
+
Expertise Areas
+
+ Add skills and areas of expertise (comma-separated)
+
+
+
+ {(!isNew ? mockAgentTypeDetail.expertise : []).map((skill) => (
+
+ {skill}
+
+ Remove {skill}
+ ×
+
+
+ ))}
+
+
+
+
+
+
+ {/* Model Configuration Tab */}
+
+
+
+ Model Selection
+
+ Choose the AI models that power this agent type
+
+
+
+
+
+
Primary Model
+
+
+
+
+
+
+ Claude Opus 4.5
+
+
+ Claude Sonnet 4
+
+
+ Claude 3.5 Sonnet
+
+
+
+
+ Main model used for this agent
+
+
+
+
Failover Model
+
+
+
+
+
+
+ Claude Opus 4.5
+
+
+ Claude Sonnet 4
+
+
+ Claude 3.5 Sonnet
+
+
+
+
+ Backup model if primary is unavailable
+
+
+
+
+
+
+
+
+
+
+ Model Parameters
+
+
+ Fine-tune the model behavior
+
+
+
+
+
+
Temperature
+
+
+ 0 = deterministic, 2 = creative
+
+
+
+
Max Tokens
+
+
+ Maximum response length
+
+
+
+
Top P
+
+
+ Nucleus sampling threshold
+
+
+
+
+
+
+
+ {/* MCP Permissions Tab */}
+
+
+
+ MCP Server Permissions
+
+ Configure which MCP servers this agent can access and with what permissions
+
+
+
+ {mockAgentTypeDetail.mcpPermissions.map((perm) => (
+
+
+
+
+
+ {perm.name}
+
+
+
+ {perm.enabled && (
+
+
Scopes:
+
+ {['read', 'write', 'issues', 'branches', 'prs'].map((scope) => (
+
+
+
+ {scope}
+
+
+ ))}
+
+
+ )}
+
+ ))}
+
+
+
+
+ {/* Personality Prompt Tab */}
+
+
+
+ Personality Prompt
+
+ Define the agent's personality, behavior, and communication style.
+ This prompt shapes how the agent approaches tasks and interacts.
+
+
+
+
+
+
+ Character count: {mockAgentTypeDetail.personalityPrompt.length}
+
+
+
+ Preview
+
+
+
+ Use Template
+
+
+
+
+
+
+
+
+ );
+}
+
+export default function AgentConfigurationPrototype() {
+ const [view, setView] = useState('list');
+ const [selectedId, setSelectedId] = useState(null);
+ const [isCreating, setIsCreating] = useState(false);
+
+ const handleSelectType = (id: string) => {
+ setSelectedId(id);
+ setView('detail');
+ };
+
+ const handleCreate = () => {
+ setIsCreating(true);
+ setView('editor');
+ };
+
+ const handleEdit = () => {
+ setIsCreating(false);
+ setView('editor');
+ };
+
+ const handleBack = () => {
+ if (view === 'editor') {
+ setView(isCreating ? 'list' : 'detail');
+ } else {
+ setView('list');
+ setSelectedId(null);
+ }
+ };
+
+ const handleSave = () => {
+ // In real implementation, this would save to API
+ setView('list');
+ setSelectedId(null);
+ setIsCreating(false);
+ };
+
+ return (
+
+ {/* Navigation Bar */}
+
+
+
+ Syndarix
+
+ Configuration
+
+ Agent Types
+
+
+
+
+
+
+
+
+
+
+ {view === 'list' && (
+
+ )}
+ {view === 'detail' && (
+
+ )}
+ {view === 'editor' && (
+
+ )}
+
+
+ );
+}
diff --git a/frontend/src/app/[locale]/prototypes/issue-management/README.md b/frontend/src/app/[locale]/prototypes/issue-management/README.md
new file mode 100644
index 0000000..a96b803
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/issue-management/README.md
@@ -0,0 +1,246 @@
+# Issue List and Detail Views - Design Prototype
+
+## Overview
+The Issue Management interface provides a comprehensive view of project issues synced from Gitea. Users can filter, sort, search, and manage issues. The detail view shows full issue content, status workflow, and activity timeline. Issues are the primary unit of work that agents execute.
+
+## User Stories
+- As a user, I want to see all issues in a filterable list so I can find specific work items
+- As a user, I want to filter by status, priority, sprint, and assignee to focus on relevant issues
+- As a user, I want to sort issues by different criteria to organize my view
+- As a user, I want to perform bulk actions on multiple issues efficiently
+- As a user, I want to see the sync status to know if issues are current with Gitea
+- As a user, I want to view full issue details including description (markdown)
+- As a user, I want to change issue status through a workflow UI
+- As a user, I want to see the activity timeline to understand issue history
+
+## Key Screens
+
+### 1. Issue List View
+**Header**
+- Page title with issue count
+- Sync button to trigger Gitea sync
+- Create new issue button
+
+**Search and Filters**
+- Full-text search input
+- Quick status filter dropdown
+- Expandable filter panel with:
+ - Priority filter
+ - Sprint filter
+ - Assignee filter
+ - Labels filter
+- Clear filters button
+
+**Bulk Actions Bar** (appears when issues selected)
+- Selection count
+- Change Status button
+- Assign button
+- Add Labels button
+- Delete button
+
+**Issue Table**
+- Checkbox column for selection
+- Issue number (sortable)
+- Title with label badges
+- Status with icon
+- Priority badge (sortable)
+- Assignee with agent/user indicator
+- Sprint badge or "Backlog"
+- Sync status indicator
+- Actions menu
+
+### 2. Issue Detail View
+**Header**
+- Back button
+- Issue number
+- Status and priority badges
+- Sync status
+- Title
+- Metadata (created, updated dates)
+- External link to Gitea
+- Edit and workflow action buttons
+
+**Main Content (2/3)**
+- Description card with markdown content
+- Activity timeline with:
+ - Status changes
+ - Comments
+ - Assignment changes
+ - Label changes
+ - Creation event
+ - Agent/user avatars
+
+**Sidebar (1/3)**
+- Status workflow panel (clickable status list)
+- Details panel:
+ - Assignee with avatar
+ - Reporter
+ - Sprint
+ - Story points
+ - Due date
+ - Labels
+- Development panel:
+ - Branch name
+ - Pull request link
+
+## User Flow
+
+### Finding and Filtering Issues
+1. User lands on issue list
+2. User types in search box to filter
+3. User selects status from dropdown
+4. User expands filter panel for more options
+5. User clears filters to reset
+
+### Bulk Operations
+1. User selects multiple issues via checkboxes
+2. Bulk action bar appears
+3. User clicks action (e.g., "Change Status")
+4. Modal appears for status selection
+5. Action applied to all selected issues
+
+### Viewing and Updating Issue
+1. User clicks issue row
+2. Detail view shows full issue
+3. User reviews description and activity
+4. User clicks status in sidebar to change
+5. Or clicks workflow button in header
+6. Status updates and syncs to Gitea
+
+## Design Decisions
+
+### Table vs Card Layout
+- Table chosen for density and scannability
+- Columns prioritize most important info
+- Sortable columns for user control
+- Compact row height with key data visible
+
+### Status Workflow
+- Visual status list in sidebar
+- Current status highlighted
+- Click any status to change
+- Workflow button in header for common transitions
+- Matches Gitea/common issue tracker patterns
+
+### Sync Status Indicator
+- Small icon per issue showing sync state
+- Synced (green check)
+- Syncing (yellow spinner)
+- Error (red alert)
+- Critical for understanding data freshness
+
+### Markdown Description
+- Full markdown support planned
+- Currently shows pre-formatted text
+- Checkboxes for acceptance criteria
+- Code blocks for technical details
+
+### Activity Timeline
+- Chronological (newest first option available)
+- Avatar indicates agent vs human
+- Grouped by type (status, comment, etc.)
+- Vertical line connects events
+
+## States
+
+### Loading
+- Skeleton rows in table
+- Loading spinner in header
+
+### Empty
+- No issues: "Create your first issue" CTA
+- No matches: "No issues found" with filter reset
+
+### Error
+- Failed to load: Error card with retry
+- Sync error: Warning banner with retry
+
+### Selected
+- Row highlight on hover
+- Checkbox checked state
+- Bulk action bar visible
+
+## Responsive Breakpoints
+
+### Desktop (lg: 1024px+)
+- Full table with all columns
+- 2/3 + 1/3 split in detail view
+- Extended filter panel inline
+
+### Tablet (md: 768px)
+- Table with key columns only
+- Stacked detail view
+- Collapsible filter panel
+
+### Mobile (< 768px)
+- Card-based list instead of table
+- Single column detail view
+- Bottom sheet for filters
+- Touch-friendly checkboxes
+
+## Accessibility Notes
+- Table has proper header associations
+- Checkbox has aria-label
+- Status icons have text labels
+- Sort direction announced
+- Focus management on view changes
+- Keyboard navigation for table rows
+
+## Components Used
+- Card, CardHeader, CardTitle, CardContent
+- Button (default, outline, ghost variants)
+- Badge (default, secondary, outline variants)
+- Input (search)
+- Select, SelectContent, SelectItem
+- Checkbox
+- Table, TableHeader, TableBody, TableRow, TableHead, TableCell
+- Separator
+- Lucide icons
+
+## Filter Fields Reference
+
+| Filter | Type | Options |
+|--------|------|---------|
+| Status | Select | All, Open, In Progress, In Review, Blocked, Done |
+| Priority | Select | All, High, Medium, Low |
+| Sprint | Select | All, Current sprints, Backlog |
+| Assignee | Select | All, Unassigned, Agent list |
+| Labels | Multi-select | Available labels |
+
+## Status Workflow
+
+```
+Open --> In Progress --> In Review --> Done
+ | | |
+ v v v
+Blocked <-- Blocked <---- Blocked
+```
+
+## Questions for Review
+1. Should the table support drag-and-drop for status changes (Kanban-style)?
+2. Is the sync status indicator clear enough?
+3. Should we add inline editing for priority and assignee?
+4. Should the activity timeline be collapsible for long histories?
+5. Should we add keyboard shortcuts for common actions?
+6. Should we show more columns or keep it minimal?
+
+## How to View
+Navigate to: `/prototypes/issue-management`
+
+Click through the views:
+1. Start on list view with sample issues
+2. Use search and filters
+3. Select checkboxes to see bulk actions
+4. Click a row to see detail view
+5. Click status buttons to see workflow
+
+## Next Steps
+After approval:
+1. Implement real-time sync with Gitea via MCP
+2. Add markdown rendering for descriptions
+3. Implement comment posting
+4. Add keyboard shortcuts
+5. Implement bulk action modals
+6. Add pagination for large issue lists
+7. Implement inline editing
+8. Add Kanban view as alternative
diff --git a/frontend/src/app/[locale]/prototypes/issue-management/page.tsx b/frontend/src/app/[locale]/prototypes/issue-management/page.tsx
new file mode 100644
index 0000000..f768625
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/issue-management/page.tsx
@@ -0,0 +1,960 @@
+'use client';
+
+import { useState } from 'react';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { Badge } from '@/components/ui/badge';
+import { Input } from '@/components/ui/input';
+import { Label } from '@/components/ui/label';
+import { Checkbox } from '@/components/ui/checkbox';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { Separator } from '@/components/ui/separator';
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from '@/components/ui/table';
+import {
+ Search,
+ Filter,
+ ChevronRight,
+ ArrowLeft,
+ ChevronUp,
+ ChevronDown,
+ MoreVertical,
+ CircleDot,
+ PlayCircle,
+ Clock,
+ CheckCircle2,
+ AlertCircle,
+ XCircle,
+ RefreshCw,
+ ExternalLink,
+ MessageSquare,
+ GitBranch,
+ GitPullRequest,
+ Bot,
+ User,
+ Calendar,
+ Tag,
+ Settings,
+ Download,
+ Upload,
+ Trash2,
+ Edit,
+ Plus,
+} from 'lucide-react';
+
+// Mock data for issues
+const mockIssues = [
+ {
+ id: 'ISS-001',
+ number: 42,
+ title: 'Implement user authentication flow',
+ description: 'Create complete authentication flow with login, register, and password reset.',
+ status: 'in_progress',
+ priority: 'high',
+ labels: ['feature', 'auth', 'backend'],
+ sprint: 'Sprint 3',
+ assignee: { name: 'Backend Engineer', type: 'agent' },
+ createdAt: '2025-01-15',
+ updatedAt: '2 hours ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-002',
+ number: 43,
+ title: 'Design product catalog component',
+ description: 'Create reusable product card and catalog grid components.',
+ status: 'in_review',
+ priority: 'medium',
+ labels: ['feature', 'frontend', 'ui'],
+ sprint: 'Sprint 3',
+ assignee: { name: 'Frontend Engineer', type: 'agent' },
+ createdAt: '2025-01-16',
+ updatedAt: '30 min ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-003',
+ number: 44,
+ title: 'Fix cart total calculation bug',
+ description: 'Cart total shows incorrect amount when discount is applied.',
+ status: 'blocked',
+ priority: 'high',
+ labels: ['bug', 'critical', 'backend'],
+ sprint: 'Sprint 3',
+ assignee: { name: 'Backend Engineer', type: 'agent' },
+ createdAt: '2025-01-17',
+ updatedAt: '1 hour ago',
+ syncStatus: 'pending',
+ blockedBy: 'Waiting for discount API specification',
+ },
+ {
+ id: 'ISS-004',
+ number: 45,
+ title: 'Add product search functionality',
+ description: 'Implement full-text search with filters for the product catalog.',
+ status: 'open',
+ priority: 'medium',
+ labels: ['feature', 'search', 'backend'],
+ sprint: 'Sprint 3',
+ assignee: null,
+ createdAt: '2025-01-18',
+ updatedAt: '3 hours ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-005',
+ number: 46,
+ title: 'Optimize database queries for product listing',
+ description: 'Performance optimization for product queries with pagination.',
+ status: 'done',
+ priority: 'low',
+ labels: ['performance', 'backend', 'database'],
+ sprint: 'Sprint 2',
+ assignee: { name: 'Backend Engineer', type: 'agent' },
+ createdAt: '2025-01-10',
+ updatedAt: '2 days ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-006',
+ number: 47,
+ title: 'Create checkout page wireframes',
+ description: 'Design wireframes for the checkout flow including payment selection.',
+ status: 'done',
+ priority: 'high',
+ labels: ['design', 'checkout', 'ui'],
+ sprint: 'Sprint 2',
+ assignee: { name: 'Product Owner', type: 'agent' },
+ createdAt: '2025-01-08',
+ updatedAt: '5 days ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-007',
+ number: 48,
+ title: 'Implement responsive navigation',
+ description: 'Create mobile-friendly navigation with hamburger menu.',
+ status: 'open',
+ priority: 'medium',
+ labels: ['feature', 'frontend', 'responsive'],
+ sprint: null,
+ assignee: null,
+ createdAt: '2025-01-19',
+ updatedAt: '1 day ago',
+ syncStatus: 'synced',
+ },
+ {
+ id: 'ISS-008',
+ number: 49,
+ title: 'Set up E2E test framework',
+ description: 'Configure Playwright for end-to-end testing.',
+ status: 'in_progress',
+ priority: 'medium',
+ labels: ['testing', 'infrastructure'],
+ sprint: 'Sprint 3',
+ assignee: { name: 'QA Engineer', type: 'agent' },
+ createdAt: '2025-01-20',
+ updatedAt: '4 hours ago',
+ syncStatus: 'synced',
+ },
+];
+
+// Detailed issue for detail view
+const mockIssueDetail = {
+ id: 'ISS-001',
+ number: 42,
+ title: 'Implement user authentication flow',
+ description: `## Overview
+Create a complete authentication flow for the e-commerce platform.
+
+## Requirements
+- Login with email/password
+- Registration with email verification
+- Password reset functionality
+- OAuth support (Google, GitHub)
+- JWT token management
+- Session handling
+
+## Acceptance Criteria
+- [ ] Users can register with email and password
+- [ ] Users receive email verification link
+- [ ] Users can log in with verified email
+- [ ] Password reset email is sent within 30 seconds
+- [ ] OAuth buttons redirect properly
+- [x] JWT tokens are stored securely
+- [x] Tokens refresh automatically
+
+## Technical Notes
+- Use FastAPI security utilities
+- Store sessions in Redis
+- Follow OWASP guidelines
+`,
+ status: 'in_progress',
+ priority: 'high',
+ labels: ['feature', 'auth', 'backend', 'security'],
+ sprint: 'Sprint 3',
+ milestone: 'MVP Launch',
+ storyPoints: 8,
+ assignee: { name: 'Backend Engineer', type: 'agent', avatar: 'BE' },
+ reporter: { name: 'Product Owner', type: 'agent', avatar: 'PO' },
+ createdAt: '2025-01-15T10:30:00Z',
+ updatedAt: '2025-01-20T14:22:00Z',
+ dueDate: '2025-02-01',
+ syncStatus: 'synced',
+ externalUrl: 'https://gitea.example.com/project/issues/42',
+ branch: 'feature/42-auth-flow',
+ pullRequest: 'PR #15',
+ activity: [
+ {
+ id: 'act-001',
+ type: 'status_change',
+ actor: { name: 'Backend Engineer', type: 'agent' },
+ message: 'moved issue from "Open" to "In Progress"',
+ timestamp: '2 hours ago',
+ },
+ {
+ id: 'act-002',
+ type: 'comment',
+ actor: { name: 'Backend Engineer', type: 'agent' },
+ message: 'Started implementing JWT token generation. Using HS256 algorithm as discussed in architecture meeting.',
+ timestamp: '3 hours ago',
+ },
+ {
+ id: 'act-003',
+ type: 'assignment',
+ actor: { name: 'Product Owner', type: 'agent' },
+ message: 'assigned this issue to Backend Engineer',
+ timestamp: '1 day ago',
+ },
+ {
+ id: 'act-004',
+ type: 'label',
+ actor: { name: 'Product Owner', type: 'agent' },
+ message: 'added labels: security, backend',
+ timestamp: '1 day ago',
+ },
+ {
+ id: 'act-005',
+ type: 'created',
+ actor: { name: 'Product Owner', type: 'agent' },
+ message: 'created this issue',
+ timestamp: '5 days ago',
+ },
+ ],
+};
+
+// Status config
+const statusConfig: Record = {
+ open: { label: 'Open', icon: CircleDot, color: 'text-blue-500' },
+ in_progress: { label: 'In Progress', icon: PlayCircle, color: 'text-yellow-500' },
+ in_review: { label: 'In Review', icon: Clock, color: 'text-purple-500' },
+ blocked: { label: 'Blocked', icon: AlertCircle, color: 'text-red-500' },
+ done: { label: 'Done', icon: CheckCircle2, color: 'text-green-500' },
+ closed: { label: 'Closed', icon: XCircle, color: 'text-gray-500' },
+};
+
+// Priority config
+const priorityConfig: Record = {
+ high: { label: 'High', color: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200' },
+ medium: { label: 'Medium', color: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200' },
+ low: { label: 'Low', color: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200' },
+};
+
+// Sync status indicator
+function SyncStatusIndicator({ status }: { status: string }) {
+ const configs: Record = {
+ synced: { icon: CheckCircle2, color: 'text-green-500', label: 'Synced' },
+ pending: { icon: RefreshCw, color: 'text-yellow-500 animate-spin', label: 'Syncing' },
+ error: { icon: AlertCircle, color: 'text-red-500', label: 'Sync Error' },
+ };
+ const config = configs[status] || configs.synced;
+ const Icon = config.icon;
+
+ return (
+
+
+
+ );
+}
+
+// Issue status badge
+function StatusBadge({ status }: { status: string }) {
+ const config = statusConfig[status] || statusConfig.open;
+ const Icon = config.icon;
+
+ return (
+
+
+ {config.label}
+
+ );
+}
+
+// Priority badge
+function PriorityBadge({ priority }: { priority: string }) {
+ const config = priorityConfig[priority] || priorityConfig.medium;
+ return (
+
+ {config.label}
+
+ );
+}
+
+// Issue List View
+function IssueListView({ onSelectIssue }: { onSelectIssue: (id: string) => void }) {
+ const [searchQuery, setSearchQuery] = useState('');
+ const [statusFilter, setStatusFilter] = useState('all');
+ const [priorityFilter, setPriorityFilter] = useState('all');
+ const [sprintFilter, setSprintFilter] = useState('all');
+ const [selectedIssues, setSelectedIssues] = useState([]);
+ const [sortField, setSortField] = useState<'number' | 'priority' | 'updatedAt'>('updatedAt');
+ const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc');
+ const [showFilters, setShowFilters] = useState(false);
+
+ const filteredIssues = mockIssues.filter((issue) => {
+ const matchesSearch =
+ issue.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ issue.description.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ issue.number.toString().includes(searchQuery);
+ const matchesStatus = statusFilter === 'all' || issue.status === statusFilter;
+ const matchesPriority = priorityFilter === 'all' || issue.priority === priorityFilter;
+ const matchesSprint =
+ sprintFilter === 'all' ||
+ (sprintFilter === 'backlog' && !issue.sprint) ||
+ issue.sprint === sprintFilter;
+ return matchesSearch && matchesStatus && matchesPriority && matchesSprint;
+ });
+
+ const sortedIssues = [...filteredIssues].sort((a, b) => {
+ const direction = sortDirection === 'asc' ? 1 : -1;
+ if (sortField === 'number') return (a.number - b.number) * direction;
+ if (sortField === 'priority') {
+ const priorityOrder = { high: 3, medium: 2, low: 1 };
+ return (priorityOrder[a.priority as keyof typeof priorityOrder] -
+ priorityOrder[b.priority as keyof typeof priorityOrder]) * direction;
+ }
+ return 0; // Default to original order for updatedAt
+ });
+
+ const handleSort = (field: 'number' | 'priority' | 'updatedAt') => {
+ if (sortField === field) {
+ setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc');
+ } else {
+ setSortField(field);
+ setSortDirection('desc');
+ }
+ };
+
+ const handleSelectAll = () => {
+ if (selectedIssues.length === sortedIssues.length) {
+ setSelectedIssues([]);
+ } else {
+ setSelectedIssues(sortedIssues.map((i) => i.id));
+ }
+ };
+
+ const handleSelectIssue = (id: string) => {
+ if (selectedIssues.includes(id)) {
+ setSelectedIssues(selectedIssues.filter((i) => i !== id));
+ } else {
+ setSelectedIssues([...selectedIssues, id]);
+ }
+ };
+
+ const SortIcon = ({ field }: { field: string }) => {
+ if (sortField !== field) return null;
+ return sortDirection === 'asc' ? (
+
+ ) : (
+
+ );
+ };
+
+ return (
+
+ {/* Header */}
+
+
+
Issues
+
+ {filteredIssues.length} issues found
+
+
+
+
+
+ Sync
+
+
+
+ New Issue
+
+
+
+
+ {/* Search and Quick Filters */}
+
+
+
+ setSearchQuery(e.target.value)}
+ className="pl-9"
+ />
+
+
+
+
+
+
+
+ All Status
+ Open
+ In Progress
+ In Review
+ Blocked
+ Done
+
+
+ setShowFilters(!showFilters)}
+ className={showFilters ? 'bg-muted' : ''}
+ >
+
+
+
+
+
+ {/* Extended Filters */}
+ {showFilters && (
+
+
+
+ Priority
+
+
+
+
+
+ All
+ High
+ Medium
+ Low
+
+
+
+
+ Sprint
+
+
+
+
+
+ All Sprints
+ Sprint 3
+ Sprint 2
+ Backlog
+
+
+
+
+ Assignee
+
+
+
+
+
+ All
+ Unassigned
+ Backend Engineer
+ Frontend Engineer
+ QA Engineer
+
+
+
+
+ Labels
+
+
+
+
+
+ All
+ Feature
+ Bug
+ Backend
+ Frontend
+
+
+
+
+
+ {
+ setStatusFilter('all');
+ setPriorityFilter('all');
+ setSprintFilter('all');
+ }}
+ >
+ Clear Filters
+
+
+
+ )}
+
+ {/* Bulk Actions */}
+ {selectedIssues.length > 0 && (
+
+
+ {selectedIssues.length} selected
+
+
+
+
+ Change Status
+
+
+ Assign
+
+
+ Add Labels
+
+
+
+ Delete
+
+
+
+ )}
+
+ {/* Issue Table */}
+
+
+
+
+
+ 0
+ }
+ onCheckedChange={handleSelectAll}
+ />
+
+ handleSort('number')}
+ >
+ #
+
+ Title
+ Status
+ handleSort('priority')}
+ >
+ Priority
+
+ Assignee
+ Sprint
+ Sync
+
+
+
+
+ {sortedIssues.map((issue) => (
+ onSelectIssue(issue.id)}
+ >
+ e.stopPropagation()}>
+ handleSelectIssue(issue.id)}
+ />
+
+
+ {issue.number}
+
+
+
+
{issue.title}
+
+ {issue.labels.slice(0, 3).map((label) => (
+
+ {label}
+
+ ))}
+ {issue.labels.length > 3 && (
+
+ +{issue.labels.length - 3}
+
+ )}
+
+
+
+
+
+
+
+
+
+
+ {issue.assignee ? (
+
+
+ {issue.assignee.type === 'agent' ? (
+
+ ) : (
+
+ )}
+
+
{issue.assignee.name}
+
+ ) : (
+ Unassigned
+ )}
+
+
+ {issue.sprint ? (
+
+ {issue.sprint}
+
+ ) : (
+ Backlog
+ )}
+
+
+
+
+ e.stopPropagation()}>
+
+
+
+
+
+ ))}
+
+
+
+ {sortedIssues.length === 0 && (
+
+
+
No issues found
+
Try adjusting your search or filters
+
+ )}
+
+
+ );
+}
+
+// Issue Detail View
+function IssueDetailView({ onBack }: { onBack: () => void }) {
+ const issue = mockIssueDetail;
+ const [currentStatus, setCurrentStatus] = useState(issue.status);
+
+ const workflowButtons = [
+ { from: 'open', to: 'in_progress', label: 'Start Work' },
+ { from: 'in_progress', to: 'in_review', label: 'Submit for Review' },
+ { from: 'in_review', to: 'done', label: 'Mark Done' },
+ { from: 'blocked', to: 'in_progress', label: 'Unblock' },
+ ];
+
+ const currentWorkflow = workflowButtons.find((w) => w.from === currentStatus);
+
+ return (
+
+ {/* Header */}
+
+
+
+
+
+
+
#{issue.number}
+
+
+
+
+
{issue.title}
+
+
+
+ Created {new Date(issue.createdAt).toLocaleDateString()}
+
+
+
+ Updated {new Date(issue.updatedAt).toLocaleDateString()}
+
+ {issue.externalUrl && (
+
+
+ View in Gitea
+
+ )}
+
+
+
+
+
+ Edit
+
+ {currentWorkflow && (
+ setCurrentStatus(currentWorkflow.to)}>
+ {currentWorkflow.label}
+
+ )}
+
+
+
+
+ {/* Main Content */}
+
+ {/* Description Card */}
+
+
+ Description
+
+
+
+
+ {issue.description}
+
+
+
+
+
+ {/* Activity Timeline */}
+
+
+
+
+
+ Activity
+
+
+ Add Comment
+
+
+
+
+
+ {issue.activity.map((item, index) => (
+
+
+
+ {item.actor.type === 'agent' ? (
+
+ ) : (
+
+ )}
+
+ {index < issue.activity.length - 1 && (
+
+ )}
+
+
+
+ {item.actor.name}
+
+ {item.message}
+
+
+
{item.timestamp}
+
+
+ ))}
+
+
+
+
+
+ {/* Sidebar */}
+
+ {/* Status Actions */}
+
+
+ Status Workflow
+
+
+
+ {Object.entries(statusConfig).map(([key, config]) => {
+ const Icon = config.icon;
+ const isActive = currentStatus === key;
+ return (
+ setCurrentStatus(key)}
+ >
+
+ {config.label}
+ {isActive && }
+
+ );
+ })}
+
+
+
+
+ {/* Assignment Panel */}
+
+
+ Details
+
+
+
+
Assignee
+
+
+ {issue.assignee.avatar}
+
+
+
{issue.assignee.name}
+
Agent
+
+
+
+
+
+
+
+
Reporter
+
+
+ {issue.reporter.avatar}
+
+
{issue.reporter.name}
+
+
+
+
+
+
+
Sprint
+
{issue.sprint}
+
+
+
+
Story Points
+
{issue.storyPoints}
+
+
+
+
Due Date
+
{new Date(issue.dueDate).toLocaleDateString()}
+
+
+
+
+
+
Labels
+
+ {issue.labels.map((label) => (
+
+
+ {label}
+
+ ))}
+
+
+
+
+
+ {/* Development */}
+
+
+ Development
+
+
+
+
+ {issue.branch}
+
+
+
+ {issue.pullRequest}
+ Open
+
+
+
+
+
+
+ );
+}
+
+export default function IssueManagementPrototype() {
+ const [view, setView] = useState<'list' | 'detail'>('list');
+ const [selectedIssueId, setSelectedIssueId] = useState(null);
+
+ const handleSelectIssue = (id: string) => {
+ setSelectedIssueId(id);
+ setView('detail');
+ };
+
+ const handleBack = () => {
+ setView('list');
+ setSelectedIssueId(null);
+ };
+
+ return (
+
+ {/* Navigation Bar */}
+
+
+
+ Syndarix
+
+ E-Commerce Platform
+
+ Issues
+
+
+
+
+
+
+
+
+
+
+ {view === 'list' && }
+ {view === 'detail' && }
+
+
+ );
+}
diff --git a/frontend/src/app/[locale]/prototypes/page.tsx b/frontend/src/app/[locale]/prototypes/page.tsx
new file mode 100644
index 0000000..b01870a
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/page.tsx
@@ -0,0 +1,184 @@
+'use client';
+
+import Link from 'next/link';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Badge } from '@/components/ui/badge';
+import {
+ LayoutDashboard,
+ Bot,
+ CircleDot,
+ Activity,
+ ChevronRight,
+} from 'lucide-react';
+
+const prototypes = [
+ {
+ id: 'project-dashboard',
+ title: 'Project Dashboard',
+ description: 'Comprehensive view of project status, agents, sprints, and activity',
+ icon: LayoutDashboard,
+ issue: '#36',
+ status: 'ready',
+ features: [
+ 'Project header with status badges',
+ 'Agent panel with status indicators',
+ 'Sprint progress and burndown chart',
+ 'Issue summary sidebar',
+ 'Recent activity feed',
+ ],
+ },
+ {
+ id: 'agent-configuration',
+ title: 'Agent Configuration',
+ description: 'Create and manage agent type templates with model and permission settings',
+ icon: Bot,
+ issue: '#37',
+ status: 'ready',
+ features: [
+ 'Agent type list view',
+ 'Agent type detail view',
+ 'Tabbed editor interface',
+ 'Model and parameter configuration',
+ 'MCP permission management',
+ 'Personality prompt editor',
+ ],
+ },
+ {
+ id: 'issue-management',
+ title: 'Issue Management',
+ description: 'List and detail views for project issues with filtering and workflow actions',
+ icon: CircleDot,
+ issue: '#38',
+ status: 'ready',
+ features: [
+ 'Filterable issue table',
+ 'Sortable columns',
+ 'Bulk action support',
+ 'Sync status indicators',
+ 'Status workflow buttons',
+ 'Activity timeline',
+ ],
+ },
+ {
+ id: 'activity-feed',
+ title: 'Activity Feed',
+ description: 'Real-time event feed with filtering, grouping, and action handling',
+ icon: Activity,
+ issue: '#39',
+ status: 'ready',
+ features: [
+ 'Real-time connection indicator',
+ 'Time-based event grouping',
+ 'Event type filtering',
+ 'Expandable event details',
+ 'Approval request handling',
+ 'Search functionality',
+ ],
+ },
+];
+
+export default function PrototypesIndex() {
+ return (
+
+
+
+ {/* Header */}
+
+
Syndarix UI Prototypes
+
+ Interactive design prototypes for Phase 1 features. Click a prototype to view and interact with it.
+
+
+ These prototypes are navigable demos - not production code. They demonstrate UI/UX concepts for approval before implementation.
+
+
+
+ {/* Prototype Cards */}
+
+ {prototypes.map((proto) => {
+ const Icon = proto.icon;
+ return (
+
+
+
+
+
+
+
+
+ {proto.issue}
+
+ {proto.status === 'ready' ? 'Ready for Review' : proto.status}
+
+
+
+ {proto.title}
+ {proto.description}
+
+
+
+
Key Features:
+
+ {proto.features.slice(0, 4).map((feature) => (
+
+
+ {feature}
+
+ ))}
+ {proto.features.length > 4 && (
+
+ +{proto.features.length - 4} more...
+
+ )}
+
+
+
+
+
+ );
+ })}
+
+
+ {/* Instructions */}
+
+
+ Reviewing Prototypes
+
+
+
+
What to Look For:
+
+ - Layout and visual hierarchy
+ - Information density and readability
+ - User flow and navigation patterns
+ - Interactive elements and feedback
+ - Responsive behavior (resize browser)
+
+
+
+
Providing Feedback:
+
+ - Comment on the related Gitea issue
+ - Specify what works and what needs changes
+ - Suggest alternatives where applicable
+ - Approve when ready for implementation
+
+
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/app/[locale]/prototypes/project-dashboard/README.md b/frontend/src/app/[locale]/prototypes/project-dashboard/README.md
new file mode 100644
index 0000000..9ff9a9a
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/project-dashboard/README.md
@@ -0,0 +1,151 @@
+# Project Dashboard - Design Prototype
+
+## Overview
+The Project Dashboard provides a comprehensive view of a Syndarix project, allowing users to monitor agent activity, sprint progress, and issue status at a glance. This is the primary interface users will see when managing an AI-driven software project.
+
+## User Stories
+- As a project owner, I want to see the current status of my project at a glance so I can quickly understand progress
+- As a project owner, I want to monitor which agents are active and what they're working on
+- As a project owner, I want to track sprint progress and identify blockers
+- As a project owner, I want to see recent activity to stay informed of project developments
+- As a project owner, I want to take quick actions (pause, run sprint) without navigating away
+
+## Key Screens
+
+### 1. Header Section
+- Project name with status badge (In Progress, Completed, Paused, Blocked)
+- Autonomy level indicator (Full Control, Milestone, Autonomous)
+- Quick action buttons (Pause Project, Run Sprint)
+- Breadcrumb navigation
+
+### 2. Agent Panel
+- List of all project agents with avatars
+- Real-time status indicators (active = green, idle = yellow, pending = gray)
+- Current task description for each agent
+- Last activity timestamp
+- Quick access to agent management
+
+### 3. Sprint Overview
+- Current sprint name and date range
+- Sprint progress bar with percentage
+- Issue statistics grid (Completed, In Progress, Blocked, To Do)
+- Visual burndown chart with ideal vs actual lines
+- Sprint selector dropdown for historical data
+
+### 4. Issue Summary (Right Sidebar)
+- Count of issues by status with color-coded icons
+- Quick links to view all issues
+- Compact vertical layout for easy scanning
+
+### 5. Recent Activity Feed
+- Chronological list of recent project events
+- Event type icons (messages, issue updates, status changes, approval requests)
+- Agent attribution for each event
+- Highlighted items requiring user action
+- Quick action buttons for approval requests
+
+## User Flow
+1. User navigates to project from project list
+2. Dashboard loads with current project state
+3. User can scan agent panel to see what's happening
+4. User reviews sprint progress and issue counts
+5. User checks activity feed for recent updates
+6. If approval request exists, user can review and respond
+7. User can pause/run sprint or navigate to detailed views
+
+## Design Decisions
+
+### Layout
+- Three-column layout on desktop: 2/3 for main content, 1/3 for sidebar
+- Main content prioritizes agent panel and sprint overview
+- Sidebar contains issue summary and activity feed
+- Responsive: stacks vertically on mobile
+
+### Visual Hierarchy
+- Project name and status badges are most prominent
+- Agent status indicators use traffic light colors (green/yellow/red)
+- Action buttons are clearly visible but not overwhelming
+- Activity feed uses subtle icons to indicate event types
+
+### Color System
+- Status colors follow intuitive patterns:
+ - Green: Completed, Active, Success
+ - Blue: In Progress, Primary actions
+ - Yellow/Orange: Idle, Warning, Pending approval
+ - Red: Blocked, Error, Critical
+- Uses design system semantic colors (primary, destructive, muted)
+
+### Spacing and Cards
+- Each major section is contained in a Card component
+- Consistent 24px (gap-6) spacing between cards
+- 16px (p-4) internal padding for compact elements
+- 24px (p-6) padding for card headers and content
+
+## States
+
+### Loading
+- Skeleton placeholders for agent list
+- Skeleton for sprint stats grid
+- Animated placeholder for burndown chart
+- Activity feed shows skeleton items
+
+### Empty
+- "No agents assigned" message in agent panel
+- "No sprint active" in sprint overview
+- "No recent activity" in activity feed
+
+### Error
+- Error alert with retry button for failed data loads
+- Graceful degradation showing last known state
+
+## Responsive Breakpoints
+
+### Desktop (lg: 1024px+)
+- Full three-column layout
+- Side-by-side agent cards
+- Full burndown chart
+
+### Tablet (md: 768px)
+- Two-column layout (main + sidebar stack)
+- Agent list in single column
+- Compact sprint stats
+
+### Mobile (< 768px)
+- Single column, vertical stack
+- Collapsible sections for agents
+- Simplified burndown (or hidden)
+- Touch-friendly action buttons
+
+## Accessibility Notes
+- All status indicators have aria-labels
+- Color is not the only indicator of status (also uses icons and text)
+- Keyboard navigation for all interactive elements
+- Focus visible indicators on all buttons
+- Screen reader announces activity feed updates
+
+## Components Used
+- Card, CardHeader, CardTitle, CardContent, CardDescription
+- Button (default, outline, ghost variants)
+- Badge (default, secondary, outline variants)
+- Tabs, TabsList, TabsTrigger, TabsContent
+- Select, SelectContent, SelectItem, SelectTrigger, SelectValue
+- Separator
+- Lucide icons for visual indicators
+
+## Questions for Review
+1. Should the burndown chart be more detailed or is the simplified version sufficient?
+2. Is the activity feed length appropriate (5 items) or should more be shown?
+3. Should agent cards be expandable to show more details?
+4. Is the autonomy level badge prominent enough?
+5. Should there be a global "stop all agents" emergency button?
+
+## How to View
+Navigate to: `/prototypes/project-dashboard`
+
+## Next Steps
+After approval:
+1. Implement real-time WebSocket updates for activity feed
+2. Connect to actual project and agent APIs
+3. Add loading skeletons
+4. Implement sprint selector functionality
+5. Add agent action dropdown menus
diff --git a/frontend/src/app/[locale]/prototypes/project-dashboard/page.tsx b/frontend/src/app/[locale]/prototypes/project-dashboard/page.tsx
new file mode 100644
index 0000000..11d8a9d
--- /dev/null
+++ b/frontend/src/app/[locale]/prototypes/project-dashboard/page.tsx
@@ -0,0 +1,587 @@
+'use client';
+
+import { useState } from 'react';
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { Badge } from '@/components/ui/badge';
+import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from '@/components/ui/select';
+import { Separator } from '@/components/ui/separator';
+import {
+ Bot,
+ Activity,
+ AlertCircle,
+ CheckCircle2,
+ Clock,
+ PlayCircle,
+ PauseCircle,
+ Settings,
+ MessageSquare,
+ GitPullRequest,
+ GitBranch,
+ MoreVertical,
+ TrendingUp,
+ Users,
+ CircleDot,
+ ChevronRight,
+} from 'lucide-react';
+
+// Mock data for the prototype
+const mockProject = {
+ id: 'proj-001',
+ name: 'E-Commerce Platform Redesign',
+ description: 'Complete redesign of the e-commerce platform with modern UI/UX',
+ status: 'in_progress',
+ autonomyLevel: 'milestone',
+ currentSprint: 'Sprint 3',
+ sprintProgress: 67,
+ startDate: '2025-01-15',
+ estimatedEnd: '2025-03-15',
+};
+
+const mockAgents = [
+ {
+ id: 'agent-001',
+ name: 'Product Owner',
+ type: 'product_owner',
+ status: 'active',
+ currentTask: 'Reviewing user story acceptance criteria',
+ lastActivity: '2 min ago',
+ avatar: 'PO',
+ },
+ {
+ id: 'agent-002',
+ name: 'Architect',
+ type: 'architect',
+ status: 'active',
+ currentTask: 'Designing API contract for checkout flow',
+ lastActivity: '5 min ago',
+ avatar: 'AR',
+ },
+ {
+ id: 'agent-003',
+ name: 'Backend Engineer',
+ type: 'engineer',
+ status: 'idle',
+ currentTask: 'Waiting for architecture review',
+ lastActivity: '15 min ago',
+ avatar: 'BE',
+ },
+ {
+ id: 'agent-004',
+ name: 'Frontend Engineer',
+ type: 'engineer',
+ status: 'active',
+ currentTask: 'Implementing product catalog component',
+ lastActivity: '1 min ago',
+ avatar: 'FE',
+ },
+ {
+ id: 'agent-005',
+ name: 'QA Engineer',
+ type: 'qa',
+ status: 'pending',
+ currentTask: 'Preparing test cases for Sprint 3',
+ lastActivity: '30 min ago',
+ avatar: 'QA',
+ },
+];
+
+const mockSprintData = {
+ name: 'Sprint 3',
+ startDate: '2025-01-27',
+ endDate: '2025-02-10',
+ totalIssues: 15,
+ completed: 8,
+ inProgress: 4,
+ blocked: 1,
+ todo: 2,
+ burndown: [
+ { day: 1, remaining: 45, ideal: 45 },
+ { day: 2, remaining: 42, ideal: 42 },
+ { day: 3, remaining: 38, ideal: 39 },
+ { day: 4, remaining: 35, ideal: 36 },
+ { day: 5, remaining: 30, ideal: 33 },
+ { day: 6, remaining: 28, ideal: 30 },
+ { day: 7, remaining: 25, ideal: 27 },
+ { day: 8, remaining: 20, ideal: 24 },
+ ],
+};
+
+const mockActivity = [
+ {
+ id: 'act-001',
+ type: 'agent_message',
+ agent: 'Product Owner',
+ message: 'Approved user story #42: Cart checkout flow',
+ timestamp: '2 min ago',
+ icon: MessageSquare,
+ },
+ {
+ id: 'act-002',
+ type: 'issue_update',
+ agent: 'Backend Engineer',
+ message: 'Moved issue #38 to "In Review"',
+ timestamp: '8 min ago',
+ icon: GitPullRequest,
+ },
+ {
+ id: 'act-003',
+ type: 'agent_status',
+ agent: 'Frontend Engineer',
+ message: 'Started working on issue #45',
+ timestamp: '15 min ago',
+ icon: PlayCircle,
+ },
+ {
+ id: 'act-004',
+ type: 'approval_request',
+ agent: 'Architect',
+ message: 'Requesting approval for API design document',
+ timestamp: '25 min ago',
+ icon: AlertCircle,
+ requiresAction: true,
+ },
+ {
+ id: 'act-005',
+ type: 'sprint_event',
+ agent: 'System',
+ message: 'Sprint 3 daily standup completed',
+ timestamp: '1 hour ago',
+ icon: Users,
+ },
+];
+
+const mockIssueSummary = {
+ open: 12,
+ inProgress: 8,
+ inReview: 3,
+ blocked: 2,
+ done: 45,
+ total: 70,
+};
+
+// Status badge component
+function StatusBadge({ status }: { status: string }) {
+ const variants: Record = {
+ in_progress: {
+ label: 'In Progress',
+ className: 'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200',
+ },
+ completed: {
+ label: 'Completed',
+ className: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-200',
+ },
+ paused: {
+ label: 'Paused',
+ className: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200',
+ },
+ blocked: {
+ label: 'Blocked',
+ className: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-200',
+ },
+ };
+
+ const variant = variants[status] || variants.in_progress;
+
+ return (
+
+ {variant.label}
+
+ );
+}
+
+// Autonomy level badge
+function AutonomyBadge({ level }: { level: string }) {
+ const variants: Record = {
+ full_control: { label: 'Full Control', description: 'Approve every action' },
+ milestone: { label: 'Milestone', description: 'Approve at sprint boundaries' },
+ autonomous: { label: 'Autonomous', description: 'Only major decisions' },
+ };
+
+ const variant = variants[level] || variants.milestone;
+
+ return (
+
+
+ {variant.label}
+
+ );
+}
+
+// Agent status indicator
+function AgentStatusIndicator({ status }: { status: string }) {
+ const colors: Record = {
+ active: 'bg-green-500',
+ idle: 'bg-yellow-500',
+ pending: 'bg-gray-400',
+ error: 'bg-red-500',
+ };
+
+ return (
+
+ );
+}
+
+// Simple burndown chart visualization
+function BurndownChart({ data }: { data: typeof mockSprintData.burndown }) {
+ const maxPoints = Math.max(...data.map((d) => Math.max(d.remaining, d.ideal)));
+ const chartHeight = 120;
+ const chartWidth = 100;
+
+ return (
+
+
+ {/* Ideal line */}
+
+ `${(i / (data.length - 1)) * chartWidth},${chartHeight - (d.ideal / maxPoints) * chartHeight}`
+ )
+ .join(' ')}
+ />
+ {/* Actual line */}
+
+ `${(i / (data.length - 1)) * chartWidth},${chartHeight - (d.remaining / maxPoints) * chartHeight}`
+ )
+ .join(' ')}
+ />
+
+
+ Day 1
+ Day {data.length}
+
+
+ );
+}
+
+// Progress bar component
+function ProgressBar({ value, className }: { value: number; className?: string }) {
+ return (
+
+ );
+}
+
+export default function ProjectDashboardPrototype() {
+ const [selectedView, setSelectedView] = useState('overview');
+
+ return (
+
+ {/* Navigation Bar - Prototype placeholder */}
+
+
+
+ Syndarix
+
+ Projects
+
+ {mockProject.name}
+
+
+
+
+
+
+
+
+
+
+
+ {/* Header Section */}
+
+
+
+
{mockProject.name}
+
+
+
+
{mockProject.description}
+
+
+
+
+ Pause Project
+
+
+
+ Run Sprint
+
+
+
+
+ {/* Main Content Grid */}
+
+ {/* Left Column - Agent Panel & Sprint Overview */}
+
+ {/* Agent Panel */}
+
+
+
+
+
+
+ Active Agents
+
+
+ {mockAgents.filter((a) => a.status === 'active').length} of{' '}
+ {mockAgents.length} agents working
+
+
+
+ Manage Agents
+
+
+
+
+
+ {mockAgents.map((agent) => (
+
+
+
+ {agent.avatar}
+
+
+
+
{agent.currentTask}
+
+
+
+ {agent.lastActivity}
+
+
+
+
+
+ ))}
+
+
+
+
+ {/* Sprint Overview */}
+
+
+
+
+
+
+ Sprint Overview
+
+
+ {mockSprintData.name} ({mockSprintData.startDate} - {mockSprintData.endDate})
+
+
+
+
+
+
+
+ Current
+ Sprint 2
+ Sprint 1
+
+
+
+
+
+
+ {/* Sprint Progress */}
+
+
+ Sprint Progress
+ {mockProject.sprintProgress}%
+
+
+
+
+ {/* Issue Stats Grid */}
+
+
+
{mockSprintData.completed}
+
Completed
+
+
+
{mockSprintData.inProgress}
+
In Progress
+
+
+
{mockSprintData.blocked}
+
Blocked
+
+
+
{mockSprintData.todo}
+
To Do
+
+
+
+ {/* Burndown Chart */}
+
+
Burndown Chart
+
+
+
+ Actual
+
+
+ {' '}
+ Ideal
+
+
+
+
+
+
+
+
+ {/* Right Column - Activity & Issue Summary */}
+
+ {/* Issue Summary */}
+
+
+
+
+ Issue Summary
+
+
+
+
+
+
+
+ Open
+
+
{mockIssueSummary.open}
+
+
+
+
{mockIssueSummary.inProgress}
+
+
+
+
+ In Review
+
+
{mockIssueSummary.inReview}
+
+
+
+
{mockIssueSummary.blocked}
+
+
+
+
+
+ Completed
+
+
{mockIssueSummary.done}
+
+
+
+ View All Issues
+
+
+
+
+
+
+ {/* Recent Activity */}
+
+
+
+
+
+ Recent Activity
+
+
+ View All
+
+
+
+
+
+ {mockActivity.map((activity) => {
+ const Icon = activity.icon;
+ return (
+
+
+
+
+
+
+ {activity.agent} {' '}
+ {activity.message}
+
+
{activity.timestamp}
+ {activity.requiresAction && (
+
+ Review Request
+
+ )}
+
+
+ );
+ })}
+
+
+
+
+
+
+
+
+ );
+}