autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
60 lines (59 loc) • 2.96 kB
JavaScript
/**
* AppModule — 应用层杂项服务注册
*
* 负责注册:
* - recipeParser, recipeCandidateValidator
* - qualityScorer, feedbackCollector, tokenUsageStore, recipeExtractor
* - moduleService, cursorDeliveryPipeline
* - primeSearchPipeline (for prime multi-query search — no DB dependency)
*/
import { resolveProjectRoot } from '#shared/resolveProjectRoot.js';
import { unwrapRawDb } from '../../repository/search/SearchRepoAdapter.js';
import { TokenUsageStore } from '../../repository/token/TokenUsageStore.js';
import { CursorDeliveryPipeline } from '../../service/delivery/CursorDeliveryPipeline.js';
import { RecipeExtractor } from '../../service/knowledge/RecipeExtractor.js';
import { ModuleService } from '../../service/module/ModuleService.js';
import { FeedbackCollector } from '../../service/quality/FeedbackCollector.js';
import { QualityScorer } from '../../service/quality/QualityScorer.js';
import { RecipeCandidateValidator } from '../../service/recipe/RecipeCandidateValidator.js';
import { RecipeParser } from '../../service/recipe/RecipeParser.js';
import { PrimeSearchPipeline } from '../../service/task/PrimeSearchPipeline.js';
export function register(c) {
// ═══ Quality + Recipe ═══
c.singleton('qualityScorer', () => new QualityScorer());
c.singleton('recipeParser', () => new RecipeParser());
c.singleton('recipeCandidateValidator', () => new RecipeCandidateValidator());
c.register('recipeExtractor', () => c.singletons._recipeExtractor || null);
c.singleton('feedbackCollector', (ct) => {
const projectRoot = resolveProjectRoot(ct);
return new FeedbackCollector(projectRoot);
});
c.singleton('tokenUsageStore', (ct) => {
const db = ct.get('database');
return new TokenUsageStore(unwrapRawDb(db), db.getDrizzle());
});
// ═══ Module ═══
c.singleton('moduleService', (ct) => {
const projectRoot = resolveProjectRoot(ct);
return new ModuleService(projectRoot, {
agentFactory: ct.get('agentFactory'),
container: ct,
qualityScorer: ct.get('qualityScorer'),
recipeExtractor: ct.singletons._recipeExtractor || null,
guardCheckEngine: ct.get('guardCheckEngine'),
violationsStore: ct.get('violationsStore'),
});
});
c.singleton('cursorDeliveryPipeline', (ct) => new CursorDeliveryPipeline({
knowledgeService: ct.get('knowledgeService'),
projectRoot: resolveProjectRoot(ct),
database: ct.get('database'),
logger: ct.logger,
}));
// ═══ PrimeSearchPipeline (for prime multi-query search) ═══
c.singleton('primeSearchPipeline', (ct) => new PrimeSearchPipeline(ct.get('searchEngine')));
}
/** 初始化 RecipeExtractor 实例 (在 initialize 期间调用) */
export function initRecipeExtractor(c) {
c.singletons._recipeExtractor = new RecipeExtractor();
}