localgreenchain/pages/api/agents/lineage/[plantId].ts
Claude 27cfad5d18
Deploy PlantLineageAgent with API endpoints and tests
Add REST API endpoints for the PlantLineageAgent:
- GET /api/agents/lineage - Agent status and network statistics
- POST /api/agents/lineage - Start/stop/pause/resume agent
- GET /api/agents/lineage/[plantId] - Lineage analysis for specific plant
- GET /api/agents/lineage/anomalies - List detected lineage anomalies

Includes comprehensive test suite with 25 passing tests.
2025-11-23 00:25:42 +00:00

85 lines
2.6 KiB
TypeScript

/**
* API Route: Get lineage analysis for a specific plant
* GET /api/agents/lineage/[plantId]
*/
import type { NextApiRequest, NextApiResponse } from 'next';
import { getPlantLineageAgent } from '../../../../lib/agents';
import { getBlockchain } from '../../../../lib/blockchain/manager';
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method !== 'GET') {
return res.status(405).json({ success: false, error: 'Method not allowed' });
}
try {
const { plantId } = req.query;
if (!plantId || typeof plantId !== 'string') {
return res.status(400).json({ success: false, error: 'Invalid plant ID' });
}
// Check if plant exists in blockchain
const blockchain = getBlockchain();
const plant = blockchain.findPlant(plantId);
if (!plant) {
return res.status(404).json({ success: false, error: 'Plant not found' });
}
const agent = getPlantLineageAgent();
// Get cached lineage analysis from agent
let analysis = agent.getLineageAnalysis(plantId);
// If not cached, the agent hasn't scanned this plant yet
// Return basic info with a note that full analysis is pending
if (!analysis) {
return res.status(200).json({
success: true,
plantId,
cached: false,
message: 'Lineage analysis pending. Agent will analyze on next scan cycle.',
plant: {
id: plant.id,
species: plant.species,
generation: plant.generation,
status: plant.status,
parentPlantId: plant.parentPlantId,
childPlants: plant.childPlants || [],
},
});
}
res.status(200).json({
success: true,
plantId,
cached: true,
analysis: {
generation: analysis.generation,
ancestors: analysis.ancestors,
descendants: analysis.descendants,
totalLineageSize: analysis.totalLineageSize,
propagationChain: analysis.propagationChain,
geographicSpread: analysis.geographicSpread,
oldestAncestorDate: analysis.oldestAncestorDate,
healthScore: analysis.healthScore,
},
plant: {
id: plant.id,
species: plant.species,
generation: plant.generation,
status: plant.status,
propagationType: plant.propagationType,
location: plant.location,
dateAcquired: plant.dateAcquired,
},
});
} catch (error: any) {
console.error('Error getting lineage analysis:', error);
res.status(500).json({ success: false, error: error.message || 'Internal server error' });
}
}