File size: 2,854 Bytes
529090e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { Router } from 'express';
import type { Request, Response } from 'express';

const router = Router();

interface Message {
  id: string;
  role: 'user' | 'agent';
  content: string;
  timestamp: Date;
  personas?: string[];
  confidence?: number;
}

interface AgentQueryRequest {
  query: string;
  userId?: string;
  context?: {
    activePersonas: string[];
    conversationHistory: Message[];
  };
}

interface AgentQueryResponse {
  response: string;
  personas_used: string[];
  confidence: number;
}

// L1 Director Agent Query Endpoint
router.post('/query', async (req: Request<object, object, AgentQueryRequest>, res: Response) => {
  try {
    const { query, userId, context } = req.body;

    if (!query || query.trim().length === 0) {
      return res.status(400).json({
        error: 'Query is required',
        message: 'Please provide a valid query string'
      });
    }

    // Log the incoming request
    console.log('Agent query received:', {
      userId: userId || 'anonymous',
      query: query.substring(0, 100),
      activePersonas: context?.activePersonas || [],
      historyLength: context?.conversationHistory?.length || 0
    });

    // TODO: Integrate with CGentCore L1 Director Agent
    // For now, return a mock response based on active personas
    const activePersonas = context?.activePersonas || [];
    const personasUsed = activePersonas.length > 0 ? activePersonas : ['architect'];

    // Simulate agent processing
    const responses: Record<string, string> = {
      architect: 'Fra et arkitektur-perspektiv anbefaler jeg at fokusere på modulær design og skalerbarhed.',
      security: 'Sikkerhedsmæssigt skal du være opmærksom på validering af input og autentificering.',
      backend: 'Backend-optimering bør fokusere på database-queries og API performance.',
      frontend: 'Frontend bør prioritere brugeroplevelse, tilgængelighed og responsive design.'
    };

    const personaResponses = personasUsed
      .map(p => responses[p] || '')
      .filter(Boolean);

    const response: AgentQueryResponse = {
      response: personaResponses.length > 0
        ? `${personaResponses.join('\n\n')}\n\nBaseret på din forespørgsel: "${query}"`
        : `Jeg har modtaget din forespørgsel: "${query}". Hvordan kan jeg hjælpe dig videre?`,
      personas_used: personasUsed,
      confidence: 0.85
    };

    res.json(response);
  } catch (error) {
    console.error('Agent query error:', error);
    res.status(500).json({
      error: 'Internal server error',
      message: error instanceof Error ? error.message : 'Unknown error occurred'
    });
  }
});

// Health check endpoint
router.get('/health', (_req: Request, res: Response) => {
  res.json({
    status: 'ok',
    service: 'agent',
    timestamp: new Date().toISOString()
  });
});

export { router as agentRouter };