import { readFile as nodeReadFile } from 'node:fs/promises'; import { pack } from 'repomix'; import type { QueryService } from '../domain/query/queryService.js'; import { ImpactAnalyzer, type EnhancedImpactAnalysis } from './impactAnalyzer.js'; import { RelatedFilesScorer, type ScoredFile } from './relatedFilesScorer.js'; export interface ProjectServiceDependencies { pack: typeof pack; readFile: typeof nodeReadFile; query: QueryService; impactAnalyzer?: ImpactAnalyzer; relatedFilesScorer?: RelatedFilesScorer; } export interface GetStructureInput { projectPath: string; withComments?: boolean; maxDepth?: number; limit?: number; pathFilter?: string; } export interface ProjectStructureNode { name: string; path: string; type: 'directory' | 'file'; size: number; tokens: number; children?: ProjectStructureNode[]; commentsPreview?: string[]; } export interface ProjectFileMetadata { path: string; size: number; tokens: number; commentsPreview?: string[]; } export interface ProjectStructureResult { summary: { totalFiles: number; totalCharacters: number; totalTokens: number; commentsIncluded: boolean; }; files: ProjectFileMetadata[]; tree: ProjectStructureNode[]; } export interface AnalyzeImpactInput { projectPath: string; filePath?: string; functionName?: string; symbol?: string; type?: 'function' | 'class' | 'interface'; maxDepth?: number; limit: number; } export interface GraphFactOutput { subject: string; predicate: string; object: string; properties?: Record; } export interface AnalyzeImpactResult { callers: GraphFactOutput[]; fileMembership: GraphFactOutput[]; relations: GraphFactOutput[]; } export interface RelatedFile { file: string; score: number; reasons: GraphFactOutput[]; } export interface EnhancedRelatedFile extends ScoredFile { } export interface FindRelatedFilesInput { projectPath: string; filePath: string; limit: number; enhanced?: boolean; includeSharedDependencies?: boolean; minScoreThreshold?: number; } export interface FindRelatedFilesResult { related: RelatedFile[] | EnhancedRelatedFile[]; enhanced?: boolean; maxScore?: number; totalFilesAnalyzed?: number; } export declare class ProjectService { private readonly deps; private readonly impactAnalyzer; private readonly relatedFilesScorer; constructor(deps: Partial & { query: QueryService; }); getStructure(input: GetStructureInput): Promise; readFile(filePath: string): Promise; analyzeImpact(input: AnalyzeImpactInput): Promise; findRelatedFiles(input: FindRelatedFilesInput): Promise; }