File size: 3,865 Bytes
ff36e71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d0d36d
 
 
 
ff36e71
 
 
9d0d36d
 
 
ff36e71
9d0d36d
ff36e71
 
 
9d0d36d
 
 
 
 
 
ff36e71
9d0d36d
ff36e71
9d0d36d
 
ff36e71
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import { gemini } from './gemini.js';
import { fsService } from '../services/file-system.js';
import { db } from '../db/database.js';
import { ICON_NAMES } from '../utils/icons.js?v=2';

export class FolderAgent {
  getGeminiKey() {
    return db.getSetting('gemini_api_key');
  }

  /**
   * Analysiert den Text und schlägt 3 passende Ordner vor, 
   * basierend auf der bestehenden Ordnerstruktur.
   */
  async suggestFolders(text) {
    // Hole alle existierenden Ordner im Root
    const files = await fsService.readDir('');
    const existingDirs = files.filter(f => f.type === 'directory').map(f => f.name);

    const prompt = `Du bist ein intelligenter Datei-Manager. 
Ich habe hier ein Dokument. Bitte analysiere den Inhalt und schlage mir 3 kurze, prägnante Ordnernamen (Kategorien/Fächer) vor, in denen dieses Dokument abgelegt werden sollte.

WICHTIGE REGEL ZU EXISTIERENDEN ORDNERN:
Hier sind die bereits in meinem System existierenden Ordner: [${existingDirs.length > 0 ? existingDirs.join(', ') : 'Noch keine Ordner vorhanden'}]
Zwingende Anweisung: Wenn das Dokument auch nur im Entferntesten in einen dieser existierenden Ordner passt, dann MUSST du exakt diesen Namen als Priorität 1 verwenden! Erfinde keine neuen Namen für bestehende Kategorien (z.B. nutze existierendes "Mathe" statt neuem "Mathematik").

REGELN:
- Antworte NUR mit einem JSON Array von genau 3 Strings. Keine Erklärungen.
- Die Namen sollten wie Schulfächer oder große Kategorien klingen (z.B. "Biologie", "Informatik", "Geschichte").
- Nutze keine Schrägstriche oder Sonderzeichen.

Dokumenten-Ausschnitt:
${text.substring(0, 1500)}`;

    try {
      const response = await gemini.generateContent(prompt, 'gemini-2.5-flash', this.getGeminiKey());
      const jsonMatch = response.match(/\[.*\]/s);
      if (jsonMatch) {
        return JSON.parse(jsonMatch[0]);
      }
      return ["Allgemein", "Dokumente", "Sonstiges"];
    } catch (e) {
      console.error('Folder Agent Error:', e);
      return ["Allgemein", "Dokumente", "Sonstiges"];
    }
  }

  async generateFilename(text) {
    const prompt = `Generiere einen sehr kurzen, passenden Dateinamen (max 3 Worte) für diesen Text. 
Antworte NUR mit dem Dateinamen. Keine Dateiendung, keine Sonderzeichen, Leerzeichen durch Unterstriche ersetzen.
Beispiel: Photosynthese_Zusammenfassung

Text:
${text.substring(0, 1000)}`;

    try {
      const response = await gemini.generateContent(prompt, 'gemini-2.5-flash', this.getGeminiKey());
      return response.trim().replace(/ /g, '_').replace(/[^a-zA-Z0-9_-]/g, '');
    } catch (e) {
      return "Dokument_" + Date.now();
    }
  }

  async generateVisualsForFolder(folderName) {
    const prompt = `Wähle das passendste Icon UND eine passende Farbe (als HEX Code) für einen Ordner namens "${folderName}".
Du musst als valides JSON antworten mit den Feldern "icon" und "color".
Für "icon" darfst du NUR exakt einen dieser Namen verwenden:
${ICON_NAMES.join(', ')}

Beispiel:
"Biologie" -> {"icon": "microscope", "color": "#4caf50"}
"Mathematik" -> {"icon": "calculator", "color": "#2196f3"}
"Feuerwehr" -> {"icon": "flame", "color": "#f44336"}

Antworte NUR mit dem JSON-Objekt.`;

    try {
      const response = await gemini.generateContent(prompt, 'gemini-2.5-flash', this.getGeminiKey());
      const jsonMatch = response.match(/\{.*\}/s);
      if (jsonMatch) {
        const data = JSON.parse(jsonMatch[0]);
        let iconName = (data.icon || '').trim().toLowerCase();
        if (!ICON_NAMES.includes(iconName)) iconName = 'folder';
        return { emoji: iconName, color: data.color || '#4285f4' };
      }
      return { emoji: 'folder', color: '#4285f4' };
    } catch (e) {
      console.error('Visuals Generation Error:', e);
      return { emoji: 'folder', color: '#4285f4' };
    }
  }
}

export const folderAgent = new FolderAgent();