diff --git a/apps/mana/apps/web/src/lib/modules/companion/engine.ts b/apps/mana/apps/web/src/lib/modules/companion/engine.ts index b43c0079e..4524815bc 100644 --- a/apps/mana/apps/web/src/lib/modules/companion/engine.ts +++ b/apps/mana/apps/web/src/lib/modules/companion/engine.ts @@ -88,26 +88,34 @@ Du hast Zugriff auf die Daten und Aktionen des Nutzers ueber verschiedene Module ${context} -## Verfuegbare Aktionen +## Verfuegbare Tools ${toolList} -## Tool-Aufruf Format +## Tool-Aufruf Format — WICHTIG -Wenn du eine Aktion ausfuehren willst, antworte mit einem JSON-Block: +**Du MUSST Tools nutzen wenn der Nutzer Daten sehen oder etwas tun will.** + +Wenn der Nutzer fragt: +- "Welche Tasks habe ich?" → \`list_tasks\` aufrufen +- "Wie viel Wasser?" → \`get_drink_progress\` aufrufen +- "Erstell mir einen Task X" → \`create_task\` aufrufen +- "Log 200ml Wasser" → \`log_drink\` aufrufen +- "Welche Termine heute?" → \`get_todays_events\` aufrufen + +Tool-Aufruf in genau diesem Format (NUR JSON, keine Erklaerung davor): \`\`\`tool {"name": "tool_name", "params": {"key": "value"}} \`\`\` -Du kannst pro Antwort EINEN Tool-Aufruf machen. Nach dem Ergebnis kannst du weiter antworten. -Wenn du keine Aktion ausfuehren willst, antworte einfach mit Text. +Nach dem Tool-Ergebnis bekommst du die Daten zurueck und kannst dem Nutzer antworten. ## Verhalten - Antworte auf Deutsch - Sei kurz und hilfreich -- Nutze die Kontext-Daten um relevante Vorschlaege zu machen -- Wenn der Nutzer etwas loggen will, nutze das passende Tool +- **Erfinde keine Daten** — wenn du Listen oder Werte brauchst, RUFE EIN TOOL AUF +- Wenn der Nutzer etwas loggen oder erstellen will, nutze das passende Tool - Ermutige den Nutzer bei Fortschritt und Streaks`; } diff --git a/apps/mana/apps/web/src/lib/modules/todo/tools.ts b/apps/mana/apps/web/src/lib/modules/todo/tools.ts index 5c8bd4757..19cd22da1 100644 --- a/apps/mana/apps/web/src/lib/modules/todo/tools.ts +++ b/apps/mana/apps/web/src/lib/modules/todo/tools.ts @@ -70,4 +70,63 @@ export const todoTools: ModuleTool[] = [ }; }, }, + { + name: 'list_tasks', + module: 'todo', + description: + 'Listet Tasks mit Titel, Faelligkeit und Prioritaet auf. Nutze diese, wenn der Nutzer fragt welche Tasks er hat oder eine Liste sehen will.', + parameters: [ + { + name: 'filter', + type: 'string', + description: 'Welche Tasks zeigen', + required: false, + enum: ['open', 'completed', 'overdue', 'today', 'all'], + }, + { + name: 'limit', + type: 'number', + description: 'Maximale Anzahl (default: 20)', + required: false, + }, + ], + async execute(params) { + const all = await taskTable.toArray(); + const active = all.filter((t) => !t.deletedAt); + const decrypted = await decryptRecords('tasks', active); + const tasks = decrypted.map(toTask); + + const filter = (params.filter as string) ?? 'open'; + const today = new Date().toISOString().split('T')[0]; + let filtered = tasks; + if (filter === 'open') filtered = tasks.filter((t) => !t.isCompleted); + else if (filter === 'completed') filtered = tasks.filter((t) => t.isCompleted); + else if (filter === 'overdue') + filtered = tasks.filter( + (t) => !t.isCompleted && t.dueDate != null && (t.dueDate as string) < today + ); + else if (filter === 'today') + filtered = tasks.filter((t) => !t.isCompleted && (t.dueDate as string) === today); + + const limit = (params.limit as number) ?? 20; + const list = filtered.slice(0, limit).map((t) => ({ + id: t.id, + title: t.title, + dueDate: t.dueDate, + priority: t.priority, + isCompleted: t.isCompleted, + })); + + return { + success: true, + data: list, + message: + list.length === 0 + ? `Keine ${filter} Tasks` + : list + .map((t) => `• ${t.title}${t.dueDate ? ` (faellig ${t.dueDate})` : ''}`) + .join('\n'), + }; + }, + }, ];