fix(admin-v2): Restore complete admin-v2 application
The admin-v2 application was incomplete in the repository. This commit restores all missing components: - Admin pages (76 pages): dashboard, ai, compliance, dsgvo, education, infrastructure, communication, development, onboarding, rbac - SDK pages (45 pages): tom, dsfa, vvt, loeschfristen, einwilligungen, vendor-compliance, tom-generator, dsr, and more - Developer portal (25 pages): API docs, SDK guides, frameworks - All components, lib files, hooks, and types - Updated package.json with all dependencies The issue was caused by incomplete initial repository state - the full admin-v2 codebase existed in backend/admin-v2 and docs-src/admin-v2 but was never fully synced to the main admin-v2 directory. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
240
admin-v2/app/api/admin/agents/sessions/route.ts
Normal file
240
admin-v2/app/api/admin/agents/sessions/route.ts
Normal file
@@ -0,0 +1,240 @@
|
||||
import { NextRequest, NextResponse } from 'next/server'
|
||||
|
||||
/**
|
||||
* Agent Sessions API
|
||||
*
|
||||
* GET - List all active agent sessions
|
||||
* POST - Create/start a new session (for testing)
|
||||
*/
|
||||
|
||||
interface AgentSession {
|
||||
id: string
|
||||
agentType: string
|
||||
agentId: string
|
||||
userId: string
|
||||
userName: string
|
||||
state: 'active' | 'paused' | 'completed' | 'failed'
|
||||
createdAt: string
|
||||
lastActivity: string
|
||||
checkpointCount: number
|
||||
messagesProcessed: number
|
||||
currentTask: string | null
|
||||
avgResponseTime: number
|
||||
}
|
||||
|
||||
// Mock sessions data (in production, query from PostgreSQL/Redis)
|
||||
function getMockSessions(): AgentSession[] {
|
||||
const now = new Date()
|
||||
return [
|
||||
{
|
||||
id: `session-${Date.now()}-001`,
|
||||
agentType: 'tutor-agent',
|
||||
agentId: 'tutor-1',
|
||||
userId: 'user-123',
|
||||
userName: 'Max Mustermann',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 75 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 37000).toISOString(),
|
||||
checkpointCount: 5,
|
||||
messagesProcessed: 23,
|
||||
currentTask: 'Erklaere Quadratische Funktionen',
|
||||
avgResponseTime: 245
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-002`,
|
||||
agentType: 'tutor-agent',
|
||||
agentId: 'tutor-2',
|
||||
userId: 'user-456',
|
||||
userName: 'Anna Schmidt',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 45 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 108000).toISOString(),
|
||||
checkpointCount: 3,
|
||||
messagesProcessed: 12,
|
||||
currentTask: 'Hilfe bei Gedichtanalyse',
|
||||
avgResponseTime: 312
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-003`,
|
||||
agentType: 'grader-agent',
|
||||
agentId: 'grader-1',
|
||||
userId: 'user-789',
|
||||
userName: 'Frau Mueller (Lehrerin)',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 105 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 180000).toISOString(),
|
||||
checkpointCount: 12,
|
||||
messagesProcessed: 45,
|
||||
currentTask: 'Korrektur Klausur 10b - Arbeit 7/24',
|
||||
avgResponseTime: 1205
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-004`,
|
||||
agentType: 'quality-judge',
|
||||
agentId: 'judge-1',
|
||||
userId: 'system',
|
||||
userName: 'System (BQAS)',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 465 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 1000).toISOString(),
|
||||
checkpointCount: 156,
|
||||
messagesProcessed: 892,
|
||||
currentTask: 'Quality Check Queue Processing',
|
||||
avgResponseTime: 89
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-005`,
|
||||
agentType: 'orchestrator',
|
||||
agentId: 'orchestrator-main',
|
||||
userId: 'system',
|
||||
userName: 'System',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 945 * 60000).toISOString(),
|
||||
lastActivity: now.toISOString(),
|
||||
checkpointCount: 2341,
|
||||
messagesProcessed: 8934,
|
||||
currentTask: 'Routing incoming requests',
|
||||
avgResponseTime: 12
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-006`,
|
||||
agentType: 'tutor-agent',
|
||||
agentId: 'tutor-3',
|
||||
userId: 'user-101',
|
||||
userName: 'Tim Berger',
|
||||
state: 'paused',
|
||||
createdAt: new Date(now.getTime() - 150 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 90 * 60000).toISOString(),
|
||||
checkpointCount: 8,
|
||||
messagesProcessed: 34,
|
||||
currentTask: null,
|
||||
avgResponseTime: 278
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-007`,
|
||||
agentType: 'grader-agent',
|
||||
agentId: 'grader-2',
|
||||
userId: 'user-202',
|
||||
userName: 'Herr Weber (Lehrer)',
|
||||
state: 'completed',
|
||||
createdAt: new Date(now.getTime() - 345 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 225 * 60000).toISOString(),
|
||||
checkpointCount: 24,
|
||||
messagesProcessed: 120,
|
||||
currentTask: null,
|
||||
avgResponseTime: 1102
|
||||
},
|
||||
{
|
||||
id: `session-${Date.now()}-008`,
|
||||
agentType: 'alert-agent',
|
||||
agentId: 'alert-1',
|
||||
userId: 'system',
|
||||
userName: 'System (Monitoring)',
|
||||
state: 'active',
|
||||
createdAt: new Date(now.getTime() - 945 * 60000).toISOString(),
|
||||
lastActivity: new Date(now.getTime() - 2000).toISOString(),
|
||||
checkpointCount: 48,
|
||||
messagesProcessed: 256,
|
||||
currentTask: 'Monitoring System Health',
|
||||
avgResponseTime: 45
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// GET - List all sessions
|
||||
export async function GET(request: NextRequest) {
|
||||
try {
|
||||
const url = new URL(request.url)
|
||||
const state = url.searchParams.get('state')
|
||||
const agentType = url.searchParams.get('agentType')
|
||||
const limit = parseInt(url.searchParams.get('limit') || '100')
|
||||
const offset = parseInt(url.searchParams.get('offset') || '0')
|
||||
|
||||
let sessions = getMockSessions()
|
||||
|
||||
// Apply filters
|
||||
if (state) {
|
||||
sessions = sessions.filter(s => s.state === state)
|
||||
}
|
||||
if (agentType) {
|
||||
sessions = sessions.filter(s => s.agentType === agentType)
|
||||
}
|
||||
|
||||
// Calculate stats
|
||||
const stats = {
|
||||
total: sessions.length,
|
||||
active: sessions.filter(s => s.state === 'active').length,
|
||||
paused: sessions.filter(s => s.state === 'paused').length,
|
||||
completed: sessions.filter(s => s.state === 'completed').length,
|
||||
failed: sessions.filter(s => s.state === 'failed').length,
|
||||
totalMessages: sessions.reduce((sum, s) => sum + s.messagesProcessed, 0),
|
||||
avgResponseTime: Math.round(
|
||||
sessions.reduce((sum, s) => sum + s.avgResponseTime, 0) / sessions.length
|
||||
)
|
||||
}
|
||||
|
||||
// Apply pagination
|
||||
const paginatedSessions = sessions.slice(offset, offset + limit)
|
||||
|
||||
return NextResponse.json({
|
||||
sessions: paginatedSessions,
|
||||
stats,
|
||||
pagination: {
|
||||
total: sessions.length,
|
||||
limit,
|
||||
offset,
|
||||
hasMore: offset + limit < sessions.length
|
||||
},
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('Error fetching sessions:', error)
|
||||
return NextResponse.json(
|
||||
{ error: error instanceof Error ? error.message : 'Failed to fetch sessions' },
|
||||
{ status: 500 }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// POST - Create new session (for testing)
|
||||
export async function POST(request: NextRequest) {
|
||||
try {
|
||||
const body = await request.json()
|
||||
const { agentType, userId, userName, context } = body
|
||||
|
||||
if (!agentType || !userId) {
|
||||
return NextResponse.json(
|
||||
{ error: 'agentType and userId are required' },
|
||||
{ status: 400 }
|
||||
)
|
||||
}
|
||||
|
||||
// In production, create session via agent-core SessionManager
|
||||
const newSession: AgentSession = {
|
||||
id: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
||||
agentType,
|
||||
agentId: `${agentType.replace('-agent', '')}-${Math.floor(Math.random() * 100)}`,
|
||||
userId,
|
||||
userName: userName || userId,
|
||||
state: 'active',
|
||||
createdAt: new Date().toISOString(),
|
||||
lastActivity: new Date().toISOString(),
|
||||
checkpointCount: 0,
|
||||
messagesProcessed: 0,
|
||||
currentTask: context?.task || null,
|
||||
avgResponseTime: 0
|
||||
}
|
||||
|
||||
return NextResponse.json({
|
||||
success: true,
|
||||
session: newSession,
|
||||
message: 'Session created successfully'
|
||||
}, { status: 201 })
|
||||
} catch (error) {
|
||||
console.error('Error creating session:', error)
|
||||
return NextResponse.json(
|
||||
{ error: error instanceof Error ? error.message : 'Failed to create session' },
|
||||
{ status: 500 }
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user