contaigents
Version:
Modular AI Content Ecosystem with Audio Generation
248 lines (247 loc) • 8.06 kB
JavaScript
import express from 'express';
import { AgentCLI } from '../agents/AgentCLI.js';
import { ProjectContextService } from '../services/ProjectContextService.js';
const router = express.Router();
const agentCLI = new AgentCLI();
const projectContextService = new ProjectContextService();
// GET /api/project-context - Get comprehensive project context
router.get('/project-context', async (req, res) => {
try {
const forceRefresh = req.query.refresh === 'true';
const projectContext = await agentCLI.buildProjectContext(forceRefresh);
res.json({
success: true,
data: projectContext,
metadata: {
timestamp: Date.now(),
forceRefresh
}
});
}
catch (error) {
console.error('Error getting project context:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// GET /api/project-context/summary - Get project context summary
router.get('/project-context/summary', async (req, res) => {
try {
const summary = await agentCLI.getProjectContextSummary();
res.json({
success: true,
data: summary,
metadata: {
timestamp: Date.now()
}
});
}
catch (error) {
console.error('Error getting project context summary:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// GET /api/project-context/related/:filePath - Get files related to a specific file
router.get('/project-context/related/*', async (req, res) => {
try {
const filePath = req.params[0]; // Get the full path after /related/
const maxResults = parseInt(req.query.maxResults) || 10;
if (!filePath) {
return res.status(400).json({
success: false,
error: 'File path is required'
});
}
const relatedFiles = await agentCLI.getRelatedFiles(filePath, maxResults);
res.json({
success: true,
data: relatedFiles,
metadata: {
filePath,
maxResults,
timestamp: Date.now()
}
});
}
catch (error) {
console.error('Error getting related files:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// POST /api/project-context/dependencies - Analyze project dependencies
router.post('/project-context/dependencies', async (req, res) => {
try {
const { files, includeTransitive = true, maxDepth = 5, analysisType = 'all' } = req.body;
const result = await agentCLI.analyzeProjectDependencies({
files,
includeTransitive,
maxDepth,
analysisType
});
res.json(result);
}
catch (error) {
console.error('Error analyzing dependencies:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// POST /api/project-context/semantic-relationships - Analyze semantic relationships
router.post('/project-context/semantic-relationships', async (req, res) => {
try {
const { files, relationshipTypes = ['conceptual', 'functional', 'hierarchical', 'temporal', 'thematic'], minConfidence = 0.3, maxRelationships = 100, includeKeywords = true } = req.body;
const result = await agentCLI.analyzeSemanticRelationships({
files,
relationshipTypes,
minConfidence,
maxRelationships,
includeKeywords
});
res.json(result);
}
catch (error) {
console.error('Error analyzing semantic relationships:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// GET /api/project-context/overview - Get enhanced project overview
router.get('/project-context/overview', async (req, res) => {
try {
const overview = await agentCLI.getProjectOverview();
res.json({
success: true,
data: overview,
metadata: {
timestamp: Date.now()
}
});
}
catch (error) {
console.error('Error getting project overview:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// DELETE /api/project-context/cache - Clear project context cache
router.delete('/project-context/cache', async (req, res) => {
try {
await agentCLI.clearProjectContextCache();
res.json({
success: true,
message: 'Project context cache cleared successfully',
metadata: {
timestamp: Date.now()
}
});
}
catch (error) {
console.error('Error clearing cache:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// POST /api/project-context/analyze-batch - Analyze multiple files with context
router.post('/project-context/analyze-batch', async (req, res) => {
try {
const { files, analysisType = 'general', includeContext = true } = req.body;
if (!files || !Array.isArray(files) || files.length === 0) {
return res.status(400).json({
success: false,
error: 'Files array is required and must not be empty'
});
}
// Get project context if requested
let projectContext = null;
if (includeContext) {
projectContext = await agentCLI.buildProjectContext();
}
// Analyze files
const analyses = await agentCLI.analyzeFiles(files, analysisType);
const classifications = await agentCLI.classifyFiles(files, true);
// Get related files for each analyzed file
const relatedFilesMap = {};
if (includeContext) {
for (const file of files) {
try {
relatedFilesMap[file] = await agentCLI.getRelatedFiles(file, 5);
}
catch (error) {
relatedFilesMap[file] = { error: error.message };
}
}
}
res.json({
success: true,
data: {
analyses,
classifications,
relatedFiles: relatedFilesMap,
projectContext: includeContext ? projectContext : null
},
metadata: {
analyzedFiles: files.length,
analysisType,
includeContext,
timestamp: Date.now()
}
});
}
catch (error) {
console.error('Error in batch analysis:', error);
res.status(500).json({
success: false,
error: error.message
});
}
});
// GET /api/project-context/health - Health check for project context services
router.get('/project-context/health', async (req, res) => {
try {
const summary = await agentCLI.getProjectContextSummary();
res.json({
success: true,
data: {
status: 'healthy',
services: {
projectContextService: 'operational',
agentCLI: 'operational',
llmProvider: 'configured' // Could be enhanced to check actual LLM status
},
summary
},
metadata: {
timestamp: Date.now()
}
});
}
catch (error) {
res.status(500).json({
success: false,
data: {
status: 'unhealthy',
error: error.message
},
metadata: {
timestamp: Date.now()
}
});
}
});
export default router;