ProcessPaths processa múltiplos caminhos baseado no modo
(ctx context.Context, paths []string, mode ProcessingMode)
| 28 | |
| 29 | // ProcessPaths processa múltiplos caminhos baseado no modo |
| 30 | func (p *Processor) ProcessPaths(ctx context.Context, paths []string, mode ProcessingMode) ([]utils.FileInfo, utils.DirectoryScanOptions, error) { |
| 31 | if len(paths) == 0 { |
| 32 | return nil, utils.DirectoryScanOptions{}, fmt.Errorf("nenhum caminho fornecido") |
| 33 | } |
| 34 | |
| 35 | scanOpts := utils.DefaultDirectoryScanOptions(p.logger) |
| 36 | |
| 37 | // Ajustar opções baseado no modo |
| 38 | switch mode { |
| 39 | case ModeFull: |
| 40 | scanOpts.MaxTotalSize = 50 * 1024 * 1024 // 50MB |
| 41 | scanOpts.MaxFilesToProcess = 500 |
| 42 | p.logger.Debug("Modo Full configurado", |
| 43 | zap.Int64("max_size", scanOpts.MaxTotalSize), |
| 44 | zap.Int("max_files", scanOpts.MaxFilesToProcess)) |
| 45 | |
| 46 | case ModeSummary: |
| 47 | // Apenas estrutura, sem conteúdo completo |
| 48 | scanOpts.MaxTotalSize = 5 * 1024 * 1024 // 5MB (metadados + previews) |
| 49 | scanOpts.MaxFilesToProcess = 1000 |
| 50 | p.logger.Debug("Modo Summary configurado", |
| 51 | zap.Int64("max_size", scanOpts.MaxTotalSize), |
| 52 | zap.Int("max_files", scanOpts.MaxFilesToProcess)) |
| 53 | |
| 54 | case ModeChunked: |
| 55 | scanOpts.MaxTotalSize = 100 * 1024 * 1024 // 100MB |
| 56 | scanOpts.MaxFilesToProcess = 1000 |
| 57 | p.logger.Debug("Modo Chunked configurado", |
| 58 | zap.Int64("max_size", scanOpts.MaxTotalSize), |
| 59 | zap.Int("max_files", scanOpts.MaxFilesToProcess)) |
| 60 | |
| 61 | case ModeSmart: |
| 62 | scanOpts.MaxTotalSize = 20 * 1024 * 1024 // 20MB |
| 63 | scanOpts.MaxFilesToProcess = 200 |
| 64 | p.logger.Debug("Modo Smart configurado", |
| 65 | zap.Int64("max_size", scanOpts.MaxTotalSize), |
| 66 | zap.Int("max_files", scanOpts.MaxFilesToProcess)) |
| 67 | |
| 68 | case ModeKnowledge: |
| 69 | // Retrieval-first: o conteúdo nunca é injetado inteiro, então o teto |
| 70 | // acompanha o modo chunked — o custo por turno é o digest + top-K. |
| 71 | scanOpts.MaxTotalSize = 100 * 1024 * 1024 // 100MB |
| 72 | scanOpts.MaxFilesToProcess = 5000 |
| 73 | p.logger.Debug("Modo Knowledge configurado", |
| 74 | zap.Int64("max_size", scanOpts.MaxTotalSize), |
| 75 | zap.Int("max_files", scanOpts.MaxFilesToProcess)) |
| 76 | |
| 77 | default: |
| 78 | return nil, scanOpts, fmt.Errorf("modo de processamento inválido: %s", mode) |
| 79 | } |
| 80 | |
| 81 | allFiles := make([]utils.FileInfo, 0) |
| 82 | processedPaths := make(map[string]bool) // Para evitar duplicatas |
| 83 | |
| 84 | for _, path := range paths { |
| 85 | // Expandir path |
| 86 | expandedPath, err := utils.ExpandPath(path) |
| 87 | if err != nil { |