import * as plugins from '../plugins.js'; import { IterativeContextBuilder } from './iterative-context-builder.js'; import { ConfigManager } from './config-manager.js'; import type { IIterativeContextResult, TaskType } from './types.js'; /** * Factory class for creating task-specific context using iterative context building */ export class TaskContextFactory { private projectDir: string; private configManager: ConfigManager; private openaiInstance?: any; // OpenAI provider instance /** * Create a new TaskContextFactory * @param projectDirArg The project directory * @param openaiInstance Optional pre-configured OpenAI provider instance */ constructor(projectDirArg: string, openaiInstance?: any) { this.projectDir = projectDirArg; this.configManager = ConfigManager.getInstance(); this.openaiInstance = openaiInstance; } /** * Initialize the factory */ public async initialize(): Promise { await this.configManager.initialize(this.projectDir); } /** * Create context for README generation */ public async createContextForReadme(): Promise { const iterativeBuilder = new IterativeContextBuilder( this.projectDir, this.configManager.getIterativeConfig(), this.openaiInstance ); await iterativeBuilder.initialize(); return await iterativeBuilder.buildContextIteratively('readme'); } /** * Create context for description generation */ public async createContextForDescription(): Promise { const iterativeBuilder = new IterativeContextBuilder( this.projectDir, this.configManager.getIterativeConfig(), this.openaiInstance ); await iterativeBuilder.initialize(); return await iterativeBuilder.buildContextIteratively('description'); } /** * Create context for commit message generation * @param gitDiff Optional git diff to include in the context */ public async createContextForCommit(gitDiff?: string): Promise { const iterativeBuilder = new IterativeContextBuilder( this.projectDir, this.configManager.getIterativeConfig(), this.openaiInstance ); await iterativeBuilder.initialize(); return await iterativeBuilder.buildContextIteratively('commit', gitDiff); } /** * Create context for any task type * @param taskType The task type to create context for * @param additionalContent Optional additional content (currently not used) */ public async createContextForTask( taskType: TaskType, additionalContent?: string ): Promise { switch (taskType) { case 'readme': return this.createContextForReadme(); case 'description': return this.createContextForDescription(); case 'commit': return this.createContextForCommit(additionalContent); default: // Default to readme for unknown task types return this.createContextForReadme(); } } /** * Get token stats for all task types */ public async getTokenStats(): Promise> { const taskTypes: TaskType[] = ['readme', 'description', 'commit']; const stats: Record = {} as any; for (const taskType of taskTypes) { const result = await this.createContextForTask(taskType); stats[taskType] = { tokenCount: result.tokenCount, savings: result.tokenSavings, includedFiles: result.includedFiles.length, trimmedFiles: result.trimmedFiles.length, excludedFiles: result.excludedFiles.length }; } return stats; } }