# 05 — Command System (`#nexa:*`) Nexa "hört" auf folgende Kommandos in Memos-Kommentaren oder als Memo-Inhalt mit Hashtag: ## 🔧 Konfigurations-Kommandos ### #nexa:config - **Beschreibung**: Triggert Autodiscovery aller Services (Nextcloud Listen/Kalender, Qdrant Collections, LiteLLM-Modelle, Mail-Konto). - **Läuft auch automatisch**: - Täglich (cron in n8n) — neue Listen / Kalender werden ohne manuelles Eingreifen aufgenommen. - Bei Cache-Miss — wenn ein Workflow eine Liste/ID nicht mehr findet, läuft Discovery einmal, dann Retry. - **Antwort**: Postet Report mit den aktuellen Konfigurationen als Memos-Kommentar. - **Speichert**: Konfiguration in der Qdrant `_config` Namespace (nicht in `.env`). ``` #nexa:config ``` **Beispiel-Response:** ``` ✅ Autodiscovery abgeschlossen (2026-05-04T23:59): - Nextcloud Listen: Persönlich (id=14), DLR (id=dlr-1), Einkaufsliste (id=…), Wunschliste (id=…) - Nextcloud Kalender: Persönlich, DLR, Einkaufsliste, Wunschliste - Mail-Konto: fkrebs@nucli.de (Posteingang, Archiv, Junk, Waiting) - Qdrant Collection: nexa_knowledge_text (1024 dims, Cosine, 0 Punkte) - LiteLLM-Modelle: nexa-chat, nexa-embed ``` ### #nexa:status - **Beschreibung**: Zeigt den aktuellen System-Status - **Antwort**: Uptime, verbundene Systeme, Memory-Stats ``` #nexa:status ``` ### #nexa:sync-obsidian - **Beschreibung**: Triggert sofortige Synchronisierung mit Obsidian Vault - **Optional Parameter**: `--vault=/path/to/vault` oder `--force` für Neuindexierung ``` #nexa:sync-obsidian --force ``` ## 📊 Memory & RAG Kommandos ### #nexa:ask [question] - **Beschreibung**: Semantische Suche in Qdrant (RAG) basierend auf Obsidian + Memos - **Antwort**: Top-3 Treffer mit Quellen ``` #nexa:ask Wie implementierten wir das JWT-Middleware-Pattern? ``` ### #nexa:learn [topic] - **Beschreibung**: Explizit neue Information in Qdrant speichern (mit Tags) - **Optional**: `--tag=architecture` `--source=obsidian/notes/arch.md` `--permanent` (überschreibt Default-TTL) ``` #nexa:learn Das Routing-Schema unterscheidet Work vs. Personal via SAIA-Kontext-Analyse --tag=architecture ``` ### #nexa:forget [query-or-iri] - **Beschreibung**: Löscht passende Einträge aus Qdrant + GraphDB sofort. - **Beispiel**: `#nexa:forget --source=rss --older-than=14d` ### #nexa:retain [source_type] [days] - **Beschreibung**: Setzt die Default-Retention für einen Source-Type (Default-Werte siehe [08 § Memory sources & retention](./08-graphrag-architecture.md#memory-sources--retention)). ### #nexa:ask [question] [--web] - **Beschreibung**: Semantische Suche in Qdrant. Mit `--web` erweitert Nexa die Suche um eine SearXNG-Abfrage (`redis-searxng`), holt die Top-3 Treffer via `crawl4ai-mcp` + `markitdown-mcp`, embedded sie und nutzt das gemeinsame Material für die Antwort. Geholte Seiten bleiben 90 Tage im Speicher (TTL siehe oben). ## 🎯 Workflow-Kommandos ### #nexa:route-test [text] - **Beschreibung**: Testet die Klassifizierung (Work/Personal) ohne Task zu erstellen ``` #nexa:route-test Muss morgen die Präsentation für den Client fertigstellen ``` **Response:** ``` 💬 Klassifizierung (Test-Mode): - Kontext: WORK - Vertrauen: 0.95 - Begründung: "Client-Präsentation → professioneller Kontext" ``` ### #nexa:email-digest - **Beschreibung**: Triggert sofortige Email-Zusammenfassung (sonst tägl. 7 Uhr) ``` #nexa:email-digest ``` ### #nexa:digest - **Beschreibung**: Tägliches Morgen-Digest. Läuft automatisch (07:00). Inhalt: 1. Kurze Mail-Zusammenfassung (siehe `#nexa:email-digest`). 2. Anstehende Tasks heute (DLR + Persönlich, nach Urgency). 3. Drift-Report aus Phase 6 (sobald aktiv). 4. **Re-ask Block** — siehe unten. Maximal 1 offene Frage pro Digest, nur wenn der Digest sonst kurz genug ist. #### Re-ask der offenen Fragen (`docs/11-open-questions.md`) Nexa führt im GraphDB pro offener Frage `nexa:askedCount`, `nexa:lastAskedAt`, `nexa:nextAskAt`. Backoff-Schema: | Mal | Wartezeit bis zur nächsten Frage | |-----|----------------------------------| | 1 → 2 | 3 Tage | | 2 → 3 | 7 Tage | | 3 → 4 | 21 Tage | | ≥ 5 | 60 Tage | Im Morgen-Digest wird **eine** offene Frage angehängt — und zwar nur wenn: - Der Digest sonst < 800 Zeichen lang wäre (Capacity-Guard, damit es nicht nervt). - `nextAskAt <= today`. - Bevorzugt die Frage mit dem **kleinsten** `askedCount` (zuerst neue Fragen, alte selten). Antwortet der User direkt unter dem Digest-Memo, parst Nexa die Antwort, markiert die Frage in `docs/11` als resolved (Phase 6.4 — Self-update of docs) und committet einen Diff zur Review. ### #nexa:remind - Manuelles Triggern einer Re-Ask, ignoriert Backoff. Nützlich für Rückfragen mitten im Tag. ### #nexa:answered - Beantwortet eine offene Frage explizit. Setzt `resolved` im GraphDB und schlägt einen `docs/11`-Diff vor. ## 🔐 Admin-Kommandos ### #nexa:reset-config - **Beschreibung**: Löscht gespeicherte Konfiguration, triggert neuen Autodiscovery - **Warnung**: Alle benutzerdefinierten Settings werden vergessen ``` #nexa:reset-config ``` ### #nexa:export-state - **Beschreibung**: Exportiert aktuellen State als JSON (für Backups) ``` #nexa:export-state ``` --- ## 📝 Implementierung in n8n Ein **Command Parser** läuft immer mit: 1. **Memos Webhook** empfängt alle Memos 2. **Regex Check**: Sucht nach `#nexa:command` 3. **Router**: Versendet an entsprechenden n8n-Workflow 4. **Antwort**: Postet Reply als Kommentar/Edit **Command Parser Regex:** ``` ^#nexa:(\w+)(?:\s+([^\n]*?))?(?:$|\s*--) ``` Extrahiert: `[command, parameters]` --- ## 🎛️ Dynamische Konfigurationsspeicherung Statt .env zu editieren: 1. **First Run**: `#nexa:config` speichert zu lokalen Metadata 2. **Speich-Ziel**: - **Primary**: Qdrant Metadata (als `_config` Namespace) - **Fallback**: `nexa-core/config/runtime_config.json` (gitignored) - **Notfall**: .env (nur initial) 3. **Reload-Logik**: Bei jedem Workflow-Start werden Settings aus Qdrant geladen Das macht Nexa vollständig selbstständig nach dem initialem Setup!