Skip to content

# 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).

### #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:
- Kurze Mail-Zusammenfassung (siehe `#nexa:email-digest`).
- Anstehende Tasks heute (DLR + Persönlich, nach Urgency).
- Drift-Report aus Phase 6 (sobald aktiv).
- 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 <text>

- 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:
3. Primary: Qdrant Metadata (als `_config` Namespace)
4. Fallback: `nexa-core/config/runtime_config.json` (gitignored)

5. Notfall: .env (nur initial)

6. Reload-Logik: Bei jedem Workflow-Start werden Settings aus Qdrant geladen

Das macht Nexa vollständig selbstständig nach dem initialem Setup!