use anyhow::Result;
use serde::{Deserialize, Serialize};
use tokio::time::Instant;
use crate::generator::preprocess::extractors::original_document_extractor;
use crate::generator::preprocess::memory::{MemoryScope, ScopedKeys};
use crate::types::original_document::OriginalDocument;
use crate::{
generator::{
context::GeneratorContext,
preprocess::{
agents::{code_analyze::CodeAnalyze, relationships_analyze::RelationshipsAnalyze},
extractors::structure_extractor::StructureExtractor,
},
types::Generator,
},
types::{
code::CodeInsight, code_releationship::RelationshipAnalysis,
project_structure::ProjectStructure,
},
};
pub mod agents;
pub mod extractors;
pub mod memory;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PreprocessingResult {
pub original_document: OriginalDocument,
pub project_structure: ProjectStructure,
pub core_code_insights: Vec<CodeInsight>,
pub relationships: RelationshipAnalysis,
pub processing_time: f64,
}
pub struct PreProcessAgent {}
impl PreProcessAgent {
pub fn new() -> Self {
Self {}
}
}
impl Generator<PreprocessingResult> for PreProcessAgent {
async fn execute(&self, context: GeneratorContext) -> Result<PreprocessingResult> {
let start_time = Instant::now();
let structure_extractor = StructureExtractor::new(context.clone());
let config = &context.config;
println!("🔍 开始项目预处理阶段...");
println!("📁 提取项目原始文档素材...");
let original_document = original_document_extractor::extract(&context).await?;
println!("📁 提取项目结构...");
let project_structure = structure_extractor
.extract_structure(&config.project_path)
.await?;
println!(
" 🔭 发现 {} 个文件,{} 个目录",
project_structure.total_files, project_structure.total_directories
);
println!("🎯 识别主要的源码文件...");
let important_codes = structure_extractor
.identify_core_codes(&project_structure)
.await?;
println!(" 识别出 {} 个主要的源码文件", important_codes.len());
println!("🤖 使用AI分析核心文件...");
let code_analyze = CodeAnalyze::new();
let core_code_insights = code_analyze
.execute(&context, &important_codes, &project_structure)
.await?;
println!("🔗 分析组件关系...");
let relationships_analyze = RelationshipsAnalyze::new();
let relationships = relationships_analyze
.execute(&context, &core_code_insights, &project_structure)
.await?;
let processing_time = start_time.elapsed().as_secs_f64();
println!("✅ 项目预处理完成,耗时 {:.2}秒", processing_time);
context
.store_to_memory(
MemoryScope::PREPROCESS,
ScopedKeys::PROJECT_STRUCTURE,
&project_structure,
)
.await?;
context
.store_to_memory(
MemoryScope::PREPROCESS,
ScopedKeys::CODE_INSIGHTS,
&core_code_insights,
)
.await?;
context
.store_to_memory(
MemoryScope::PREPROCESS,
ScopedKeys::RELATIONSHIPS,
&relationships,
)
.await?;
context
.store_to_memory(
MemoryScope::PREPROCESS,
ScopedKeys::ORIGINAL_DOCUMENT,
&original_document,
)
.await?;
Ok(PreprocessingResult {
original_document,
project_structure,
core_code_insights,
relationships,
processing_time,
})
}
}