MCPcopy Create free account
hub / github.com/diillson/chatcli / processFileCommand

Method processFileCommand

cli/cli_file_processing.go:28–196  ·  view source on GitHub ↗

20 MB

(ctx context.Context, userInput string)

Source from the content-addressed store, hash-verified

26const maxImageAttachmentBytes = 20 * 1024 * 1024 // 20 MB
27
28func (cli *ChatCLI) processFileCommand(ctx context.Context, userInput string) (string, string, []models.ImageContent) {
29 var additionalContext string
30 var images []models.ImageContent
31
32 if strings.Contains(strings.ToLower(userInput), "@file") {
33 // Removida a verificação especial para o OpenAI Assistant
34 // Agora, sempre usamos o mesmo processamento de arquivos, independentemente do modelo
35
36 paths, options, err := extractFileCommandOptions(userInput)
37 if err != nil {
38 cli.logger.Error("Erro ao processar os comandos @file", zap.Error(err))
39 return userInput, fmt.Sprintf("\nErro ao processar @file: %s\n", err.Error()), nil
40 }
41
42 // Usar o modo a partir das opções já extraídas
43 mode := config.ModeFull // Modo padrão
44 if modeVal, ok := options["mode"]; ok {
45 mode = modeVal
46 }
47
48 // Configurar estimador de tokens e obter limite máximo de tokens do LLM atual
49 tokenEstimator := cli.getTokenEstimatorForCurrentLLM()
50 maxTokens := cli.getMaxTokensForCurrentLLM()
51
52 // Processar cada caminho encontrado após @file
53 for _, path := range paths {
54 // Vision: se o caminho aponta para um único arquivo de imagem,
55 // anexa os bytes como ImageContent (entrada multimodal) em vez de
56 // inliná-lo como texto ilegível. Diretórios/globs seguem o fluxo
57 // de texto normal.
58 if img, ok := cli.loadImageAttachment(path); ok {
59 images = append(images, img)
60 continue
61 }
62
63 // Configurações de escaneamento
64 scanOptions := utils.DefaultDirectoryScanOptions(cli.logger)
65
66 // 1. Pré-escanear para obter a contagem total de arquivos
67 totalFiles, err := utils.CountMatchingFiles(path, scanOptions)
68 if err != nil {
69 cli.logger.Error("Erro ao contar arquivos", zap.String("path", path), zap.Error(err))
70 additionalContext += fmt.Sprintf("\nErro ao analisar o diretório '%s': %s\n", path, err.Error())
71 continue
72 }
73
74 // 2. Inicializar contador para os arquivos processados
75 var processedFiles int32 = 0
76
77 // 3. Definir o callback para atualizar a animação com progresso rico
78 scanOptions.OnFileProcessed = func(info utils.FileInfo) {
79 // Usar atomic para segurança em concorrência, embora o callback seja chamado em série aqui
80 atomic.AddInt32(&processedFiles, 1)
81 // Atualiza a mensagem da animação com o progresso
82 cli.animation.UpdateMessage(
83 fmt.Sprintf("Analisando... [%d/%d] %s", atomic.LoadInt32(&processedFiles), totalFiles, info.Path),
84 )
85 }

Callers 1

Calls 15

loadImageAttachmentMethod · 0.95
processDirectorySmartMethod · 0.95
CountMatchingFilesFunction · 0.92
TFunction · 0.92
ProcessDirectoryFunction · 0.92
FormatDirectoryContentFunction · 0.92

Tested by

no test coverage detected