From 56171ff13b8e8113145e06366cc0651fa3ce7a11 Mon Sep 17 00:00:00 2001 From: Till JS Date: Thu, 16 Apr 2026 13:18:51 +0200 Subject: [PATCH] fix(ai): resolve tool name + parameter drift between catalog and webapp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8 mismatches fixed between AI_TOOL_CATALOG and webapp module tools: Tool name renames (webapp → catalog name): - record_visit → visit_place (places) - undo_last_drink → undo_drink (drink) - location_log → get_current_location (places, catalog side) Catalog parameter fixes (aligned to webapp execute functions): - create_event: startIso/endIso → startTime/endTime + isAllDay/location/description - create_note: title required→optional, content optional→required - complete_tasks_by_title: titleSubstring → titleMatch - create_place: add latitude/longitude (required) + category enum + address - create_journal_entry: English mood enum → German mood enum Webapp parameter additions: - create_contact: add company + notes params (store already accepts them) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../web/src/lib/modules/contacts/tools.ts | 13 +++- .../apps/web/src/lib/modules/drink/tools.ts | 4 +- .../apps/web/src/lib/modules/places/tools.ts | 4 +- packages/shared-ai/src/tools/schemas.ts | 70 +++++++++++++++---- 4 files changed, 70 insertions(+), 21 deletions(-) diff --git a/apps/mana/apps/web/src/lib/modules/contacts/tools.ts b/apps/mana/apps/web/src/lib/modules/contacts/tools.ts index 45068175c..0b8e681d9 100644 --- a/apps/mana/apps/web/src/lib/modules/contacts/tools.ts +++ b/apps/mana/apps/web/src/lib/modules/contacts/tools.ts @@ -13,8 +13,15 @@ export const contactsTools: ModuleTool[] = [ parameters: [ { name: 'firstName', type: 'string', description: 'Vorname', required: true }, { name: 'lastName', type: 'string', description: 'Nachname', required: false }, - { name: 'email', type: 'string', description: 'E-Mail', required: false }, - { name: 'phone', type: 'string', description: 'Telefon', required: false }, + { name: 'email', type: 'string', description: 'E-Mail-Adresse', required: false }, + { name: 'phone', type: 'string', description: 'Telefonnummer', required: false }, + { name: 'company', type: 'string', description: 'Firma / Organisation', required: false }, + { + name: 'notes', + type: 'string', + description: 'Freitext-Notizen zum Kontakt', + required: false, + }, ], async execute(params) { const contact = await contactsStore.createContact({ @@ -22,6 +29,8 @@ export const contactsTools: ModuleTool[] = [ lastName: params.lastName as string | undefined, email: params.email as string | undefined, phone: params.phone as string | undefined, + company: params.company as string | undefined, + notes: params.notes as string | undefined, }); return { success: true, data: contact, message: `Kontakt "${params.firstName}" erstellt` }; }, diff --git a/apps/mana/apps/web/src/lib/modules/drink/tools.ts b/apps/mana/apps/web/src/lib/modules/drink/tools.ts index 8eaf44327..54d9e73b9 100644 --- a/apps/mana/apps/web/src/lib/modules/drink/tools.ts +++ b/apps/mana/apps/web/src/lib/modules/drink/tools.ts @@ -83,9 +83,9 @@ export const drinkTools: ModuleTool[] = [ }, }, { - name: 'undo_last_drink', + name: 'undo_drink', module: 'drink', - description: 'Macht den letzten Getraenk-Eintrag rueckgaengig', + description: 'Macht den letzten Drink-Eintrag rückgängig', parameters: [], async execute() { await drinkStore.undoLastEntry(); diff --git a/apps/mana/apps/web/src/lib/modules/places/tools.ts b/apps/mana/apps/web/src/lib/modules/places/tools.ts index b2947392b..b4f439396 100644 --- a/apps/mana/apps/web/src/lib/modules/places/tools.ts +++ b/apps/mana/apps/web/src/lib/modules/places/tools.ts @@ -53,9 +53,9 @@ export const placesTools: ModuleTool[] = [ }, }, { - name: 'record_visit', + name: 'visit_place', module: 'places', - description: 'Registriert einen Besuch an einem bekannten Ort', + description: 'Vermerkt einen Besuch an einem bereits erfassten Ort', parameters: [{ name: 'placeId', type: 'string', description: 'ID des Ortes', required: true }], async execute(params) { await placesStore.recordVisit(params.placeId as string); diff --git a/packages/shared-ai/src/tools/schemas.ts b/packages/shared-ai/src/tools/schemas.ts index a145df40f..7c9956697 100644 --- a/packages/shared-ai/src/tools/schemas.ts +++ b/packages/shared-ai/src/tools/schemas.ts @@ -69,13 +69,14 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ { name: 'complete_tasks_by_title', module: 'todo', - description: 'Markiert alle Tasks deren Titel den Substring enthält (case-insensitive)', + description: + 'Markiert alle offenen Tasks mit dem gegebenen Titel als erledigt (case-insensitive Substring-Match). Nutze diese, wenn der Nutzer eine Task per Name erledigen will und du nicht ihre ID kennst.', defaultPolicy: 'propose', parameters: [ { - name: 'titleSubstring', + name: 'titleMatch', type: 'string', - description: 'Teil des Task-Titels', + description: 'Titel oder Teil davon', required: true, }, ], @@ -115,12 +116,20 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ { name: 'create_event', module: 'calendar', - description: 'Erstellt einen Kalender-Event', + description: 'Erstellt einen neuen Kalender-Termin', defaultPolicy: 'propose', parameters: [ - { name: 'title', type: 'string', description: 'Event-Titel', required: true }, - { name: 'startIso', type: 'string', description: 'Start (ISO)', required: true }, - { name: 'endIso', type: 'string', description: 'Ende (ISO)', required: false }, + { name: 'title', type: 'string', description: 'Titel des Termins', required: true }, + { + name: 'startTime', + type: 'string', + description: 'Startzeit (ISO 8601)', + required: true, + }, + { name: 'endTime', type: 'string', description: 'Endzeit (ISO 8601)', required: true }, + { name: 'isAllDay', type: 'boolean', description: 'Ganztaegig', required: false }, + { name: 'location', type: 'string', description: 'Ort', required: false }, + { name: 'description', type: 'string', description: 'Beschreibung', required: false }, ], }, { @@ -138,12 +147,12 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ description: 'Erstellt eine neue Notiz. Gibt die ID der angelegten Notiz zurueck.', defaultPolicy: 'propose', parameters: [ - { name: 'title', type: 'string', description: 'Titel der Notiz', required: true }, + { name: 'title', type: 'string', description: 'Titel der Notiz', required: false }, { name: 'content', type: 'string', description: 'Inhalt der Notiz (Markdown)', - required: false, + required: true, }, ], }, @@ -224,11 +233,33 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ { name: 'create_place', module: 'places', - description: 'Fügt einen neuen Ort hinzu', + description: 'Erstellt einen neuen Ort', defaultPolicy: 'propose', parameters: [ { name: 'name', type: 'string', description: 'Name des Ortes', required: true }, - { name: 'category', type: 'string', description: 'Kategorie', required: false }, + { name: 'latitude', type: 'number', description: 'Breitengrad', required: true }, + { name: 'longitude', type: 'number', description: 'Laengengrad', required: true }, + { + name: 'category', + type: 'string', + description: 'Kategorie', + required: false, + enum: [ + 'home', + 'work', + 'food', + 'shopping', + 'sport', + 'culture', + 'nature', + 'transport', + 'health', + 'education', + 'nightlife', + 'other', + ], + }, + { name: 'address', type: 'string', description: 'Adresse', required: false }, ], }, { @@ -246,7 +277,7 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ parameters: [], }, { - name: 'location_log', + name: 'get_current_location', module: 'places', description: 'Gibt die aktuelle GPS-Position zurueck (erfordert Standort-Berechtigung)', defaultPolicy: 'auto', @@ -387,13 +418,13 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ name: 'create_journal_entry', module: 'journal', description: - 'Erstellt einen neuen Tagebuch-Eintrag fuer den heutigen Tag. Gibt die ID zurueck.', + 'Erstellt einen neuen Journal-Eintrag mit optionaler Stimmung (dankbar, glücklich, zufrieden, neutral, nachdenklich, traurig, gestresst, wütend)', defaultPolicy: 'propose', parameters: [ { name: 'content', type: 'string', - description: 'Inhalt des Eintrags (Markdown)', + description: 'Inhalt des Eintrags', required: true, }, { name: 'title', type: 'string', description: 'Optionaler Titel', required: false }, @@ -402,7 +433,16 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [ type: 'string', description: 'Stimmung', required: false, - enum: ['great', 'good', 'neutral', 'bad', 'terrible'], + enum: [ + 'dankbar', + 'glücklich', + 'zufrieden', + 'neutral', + 'nachdenklich', + 'traurig', + 'gestresst', + 'wütend', + ], }, ], },