Native Discord /status meldet 'discord/undefined' ohne Aktivität - Discord Native /status Reports 'discord/undefined' and No Activity for Active Channel Sessions
Der native Discord /status Befehl zeigt fälschlicherweise Model: discord/undefined, null Kontext und keine Aktivität an, selbst wenn eine gültige Kanal-Sitzung aktiv ist. Die Ursache liegt in einem fehlenden sessionEntry-Lookup im nativen Befehlsrouting-Pfad.
🔍 Symptome
Für Benutzer sichtbare Manifestationen
Bei der Ausführung des nativen Discord-Befehls /status in einem Guild-Kanal mit einer aktiven Sitzung wird die folgende fehlerhafte Ausgabe zurückgegeben:
🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: discord/undefined · 🔑 unknown
📚 Context: 0/200k (0%) · 🧹 Compactions: 0
🧵 Session: agent:main:discord:slash:332887877048598528 • no activity
📌 Tasks: 0 active · 5 total · agent-local
⚙️ Runtime: direct · Think: off · elevated
🪢 Queue: collect (depth 0)In einigen Beobachtungen zeigt der Sitzungsschlüssel die korrekte Kanal-ID, aber die Metadaten bleiben fehlerhaft:
🧵 Session: agent:main:discord:channel:1490775030236450876 • no activityKontrast zum funktionierenden Nachrichtenpfad-Status
Wenn die Sitzung desselben Kanals über den normalen Nachrichtenpfad abgefragt wird (durch Anhängen von /status innerhalb einer regulären Nachricht), ist die Ausgabe korrekt:
🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: openai-codex/gpt-5.4 · 🔑 oauth (...)
📚 Context: 50k/272k (18%)
🧵 Session: agent:main:discord:channel:1490775030236450876 • updated just nowWichtige diagnostische Indikatoren
- Modell-Feld zeigt den Literalstring
discord/undefinedanstelle des konfigurierten Modells (z.B.openai-codex/gpt-5.4) - Kontext-Feld zeigt
0/...anstelle der tatsächlichen Nutzungsprozentzahl - Sitzungs-Feld zeigt das Suffix
no activityanstelle vonupdated just now - Sitzungsschlüssel verweist möglicherweise auf
discord/slash:...anstelle vondiscord:channel:...mit der korrekten Kanal-ID
Umgebungsbedingungen
- OpenClaw-Version:
2026.4.5(Build3e72c03) - Installationsmethode: npm global
- Betriebssystem: Linux 5.15.0-171-generic (x64)
- Discord-Modus: Guild-Kanal mit aktivierten nativen Befehlen
- Standard-Agentenmodell:
openai-codex/gpt-5.4
🧠 Ursache
Architekturanalyse
Der Bug stammt aus einer fehlenden Sitzungseintragsauflösung in der nativen Discord-Befehlsrouting-Pipeline. Der Code-Pfad des nativen /status-Befehls versucht, routeState.sessionEntry zu lesen, um Status-Metadaten zu füllen, aber diese Eigenschaft wird von der upstream-Routenauflösungsfunktion nie bevölkert.
Code-Ablauf-Aufschlüsselung
1. Einstiegspunkt: Native Befehlsaufruf
Wenn ein Benutzer /status als nativen Discord-(Slash-)Befehl aufruft, tritt die Anfrage ein über:
provider-DR2mO1YM.js → commands.runtime-CVX5D6kT.js → pi-embedded-DWASRjxE.js → status-yaHSTeGo.js2. Sitzungsauflösungsfehler
In provider-DR2mO1YM.js referenziert der native /status-Zweig routeState.sessionEntry:
// Pseudocode-Darstellung des problematischen Code-Pfads
const routeState = resolveDiscordNativeInteractionRouteState(interaction);
const sessionEntry = routeState.sessionEntry; // ← DIES IST UNDEFINED
if (!sessionEntry) {
// Greift auf Slash-Payload-Metadaten zurück
displayStatus(slashPayloadMetadata);
}3. Lücke in der Routenstatus-Auflösung
Die Funktion resolveDiscordNativeInteractionRouteState() gibt zurück:
{
route: "...", // ✓ Bereitgestellt
effectiveRoute: "...", // ✓ Bereitgestellt
binding: {...}, // ✓ Bereitgestellt
sessionEntry: undefined // ✗ FEHLT
}Die Funktion stellt Routing-Metadaten (route, effectiveRoute, binding) bereit, bevölkert aber niemals sessionEntry, was es als undefined belässt.
4. Kontextaufbau mit fest kodierte Fallbacks
Wenn sessionEntry undefined ist, führt buildDiscordNativeCommandContext() mit fehlenden Daten aus. Diese Funktion:
- Hardcodiert den Provider als Literalstring
"discord" - Schlägt fehl beim Auflösen des tatsächlich konfigurierten Modells aus der Agent-Konfiguration
- Kann keinen Lookup durchführen für die aktive Kanalsitzung aus dem Sitzungsspeicher
5. Kaskadierender Fehler zur Statusanzeige
Die Status-Rendering-Engine empfängt:
{
provider: "discord",
model: undefined, // Resultiert in "discord/undefined"
contextUsage: 0, // Resultiert in "0/200k (0%)"
sessionKey: "discord/slash:..." // Falscher Sitzungstyp
}Warum der Nachrichtenpfad funktioniert
Der normale Nachrichtenpfad-Status-Lookup verwendet einen anderen Code-Pfad, der:
- Die Kanal-ID aus dem Nachrichtenkontekst auflöst
- Den Sitzungsspeicher direkt abfragt nach
agent:main:discord:channel:{channelId} - Das tatsächliche Modell, die Kontextnutzung und den letzten Aktivitätszeitstempel aus dem gespeicherten Sitzungseintrag extrahiert
Dieser Pfad umgeht die fehlerhafte Funktion resolveDiscordNativeInteractionRouteState() vollständig.
Erklärung der Sitzungsschlüssel-Diskrepanz
Der Sitzungsschlüssel zeigt discord/slash:{interactionId} anstelle von discord:channel:{channelId}, weil:
- Der Fallback-Pfad die Interaktions-ID des Befehls als Sitzungskennung verwendet
- Er niemals zum Sitzungseintrag des übergeordneten Kanals aufgelöst wird
- Der korrekte Pfad die Kanal-ID aus dem Interaktionskanalkontekst ableiten würde
🛠️ Schritt-für-Schritt-Lösung
Temporäre Problemumgehung (Sofortige)
Bis der Fix bereitgestellt wird, verwenden Sie die Nachrichtenpfad-Statusabfrage:
Vorher (Fehlerhaft - Nativer Befehl):
/status
Nachher (Funktionierend - Nachrichtenpfad):
Beliebige Nachricht /status
Dies erzwingt den Nachrichten-Routing-Pfad, der den Kanalsitzung korrekt auflöst.
Permanenter Fix (Für Maintainer)
Der Fix erfordert Änderungen an zwei Funktionen in der Discord-nativen Befehlspipeline:
Fix 1: sessionEntry in der Routenauflösung bevölkern
Datei: provider-DR2mO1YM.js (oder äquivalentes Bundle)
Vorher:
function resolveDiscordNativeInteractionRouteState(interaction) {
return {
route: determineRoute(interaction),
effectiveRoute: determineEffectiveRoute(interaction),
binding: resolveBinding(interaction)
// sessionEntry fehlt
};
}Nachher:
function resolveDiscordNativeInteractionRouteState(interaction) {
const channelId = interaction?.channel_id || interaction?.channelId;
const sessionKey = channelId
? `agent:main:discord:channel:${channelId}`
: null;
return {
route: determineRoute(interaction),
effectiveRoute: determineEffectiveRoute(interaction),
binding: resolveBinding(interaction),
sessionEntry: sessionKey ? sessionStore.get(sessionKey) : null
};
}Fix 2: Fehlendes Modell im Status-Kontext behandeln
Datei: buildDiscordNativeCommandContext-Funktion
Vorher:
function buildDiscordNativeCommandContext(sessionEntry) {
return {
provider: "discord",
model: sessionEntry?.model || undefined,
// ...
};
}Nachher:
function buildDiscordNativeCommandContext(sessionEntry, routeState) {
// Wenn sessionEntry aus routeState fehlt, versuche direkten Lookup
const resolvedSession = sessionEntry || (
routeState?.binding?.channelId
? sessionStore.get(`agent:main:discord:channel:${routeState.binding.channelId}`)
: null
);
return {
provider: resolvedSession?.provider || "discord",
model: resolvedSession?.model || getDefaultAgentModel(),
// ...
};
}Fix 3: Korrekten Sitzungsschlüssel für Statusanzeige ableiten
Datei: status-yaHSTeGo.js (Status-Rendering)
Vorher:
function resolveStatusSessionKey(routeState) {
if (routeState.sessionEntry) {
return routeState.sessionEntry.key;
}
return `discord/slash:${interaction.id}`;
}Nachher:
function resolveStatusSessionKey(routeState) {
if (routeState.sessionEntry) {
return routeState.sessionEntry.key;
}
// Fallback auf kanalbasierten Schlüssel, nicht Slash-Interaktions-ID
const channelId = routeState.binding?.channelId;
return channelId
? `agent:main:discord:channel:${channelId}`
: `discord/slash:${interaction.id}`;
}🧪 Verifizierung
Testfall 1: Nativer Befehlsstatus in aktiver Kanalsitzung
Einrichtung:
- Sicherstellen, dass eine Sitzung für eine bekannte Kanal-ID existiert (z.B.
1490775030236450876) - Überprüfen, dass die Sitzung eine Nicht-Null-Kontextnutzung hat
Ausführung:
/statusErwartete Ausgabe:
🦞 OpenClaw 2026.4.5 (3e72c03)
🧠 Model: openai-codex/gpt-5.4 · 🔑 oauth (...)
📚 Context: 50k/272k (18%)
🧵 Session: agent:main:discord:channel:1490775030236450876 • updated just now
📌 Tasks: 0 active · 5 total · agent-local
⚙️ Runtime: direct · Think: off · elevated
🪢 Queue: collect (depth 0)Erfolgsbedingungen:
- Modell-Feld zeigt
openai-codex/gpt-5.4(nichtdiscord/undefined) - Kontext zeigt Prozentsatz ungleich Null
- Sitzungsschlüssel referenziert
discord:channel:{channelId} - Sitzung zeigt
updated just now(nichtno activity)
Testfall 2: Vergleich mit Nachrichtenpfad-Status
Ausführung:
What's the current status? /statusVerifizierung: Die Ausgabe des nativen Befehls und des Nachrichtenpfads sollten identisch zeigen:
- Modellname
- Kontextprozentsatz
- Sitzungsschlüssel
- Letzten Aktivitätszeitstempel
Testfall 3: Neuer Sitzungsstatus (Keine aktive Kanalsitzung)
Einrichtung:
/status in einem Kanal ohne vorherige Sitzung aufrufen.
Erwartete Ausgabe:
🧵 Session: agent:main:discord:channel:{channelId} • no activityErfolgsbedingungen:
- Sitzungsschlüssel zeigt immer noch
discord:channel:{channelId}(nichtdiscord/slash:...) - Modell-Feld sollte das konfigurierte Standardmodell anzeigen (nicht
discord/undefined)
Testfall 4: Guild- vs. DM-Kanalverhalten
Ausführung:
/status sowohl in Guild-Textkanälen als auch in DM-Kanälen testen.
Erfolgsbedingungen: Beide Kanaltypen sollten ein konsistentes Sitzungsauflösungsverhalten mit korrekten kanalbasierten Sitzungsschlüsseln zeigen.
Automatisiertes Verifizierungsskript
#!/bin/bash
# Verify Discord native /status fix
EXPECTED_MODEL="openai-codex/gpt-5.4"
CHANNEL_ID="1490775030236450876"
EXPECTED_SESSION_PREFIX="agent:main:discord:channel:${CHANNEL_ID}"
# Capture /status output (requires Discord API or test harness)
STATUS_OUTPUT=$(get_discord_status_output)
# Check Model field
if echo "$STATUS_OUTPUT" | grep -q "Model: $EXPECTED_MODEL"; then
echo "✓ Model field correct"
else
echo "✗ Model field incorrect"
exit 1
fi
# Check Session key format
if echo "$STATUS_OUTPUT" | grep -q "Session: $EXPECTED_SESSION_PREFIX"; then
echo "✓ Session key correct"
else
echo "✗ Session key incorrect"
exit 1
fi
# Check for no-activity indicator should NOT be present
if echo "$STATUS_OUTPUT" | grep -q "• no activity"; then
echo "✗ Still showing 'no activity' for active session"
exit 1
else
echo "✓ Activity status correct"
fi
echo "All verifications passed"⚠️ Häufige Fehler
Umgebungsspezifische Fallen
1. DM-Kanäle vs. Guild-Kanäle
- Symptom: Fix funktioniert in Guild-Kanälen, aber DM-Sitzungen zeigen
discord/undefined - Ursache: DM-Kanäle haben möglicherweise unterschiedliche ID-Formate oder Sitzungsschlüsselstrukturen
- Gegenmaßnahme: Sicherstellen, dass die Sitzungsschlüsselableitung sowohl
channel- als auchdm-Präfixe verarbeitet
2. Mehrere Sitzungen pro Kanal
- Symptom: Status zeigt falsche Modelldaten für Multi-Agent-Setups
- Ursache: Kanal kann mehrere gleichzeitige Sitzungen mit verschiedenen Agenten haben
- Gegenmaßnahme: Der Fix sollte die
agent-Dimension in Sitzungsschlüsseln respektieren (z.B.agent:main:...)
3. Zwischengespeicherter Routenstatus
- Symptom: Fix scheint zu funktionieren, kehrt aber nach Bot-Neustart zurück
- Ursache: Alter Routenstatus kann im Speicher zwischengespeichert sein
- Gegenmaßnahme: Sitzungsspeicher-Cache leeren oder den OpenClaw-Prozess vollständig neu starten
4. Konflikt zwischen nativem Befehl und Nachrichtenbefehl
- Symptom: Sowohl nativer als auch Nachrichtenpfad-
/statuszeigen falsche Daten - Ursache: Der Sitzungsspeicher-Lookup schlägt möglicherweise unabhängig von der Routenauflösung fehl
- Debugging: Überprüfen, ob der Sitzungsspeicher zugänglich ist und Einträge für den Zielkanal enthält
Benutzer-Fehlkonfigurationen
5. Fehlende Agent-Konfiguration
- Symptom: Modell zeigt
discord/undefinedsogar nach dem Fix - Ursache: Kein Standard-Agentenmodell in
~/.openclaw/openclaw.jsonkonfiguriert - Lösung: Sicherstellen, dass
agents.default.modelgesetzt ist:
{
"agents": {
"default": {
"model": "openai-codex/gpt-5.4"
}
}
}6. Discord-native Befehle nicht aktiviert
- Symptom: Nativer
/statusführt niemals den nativen Befehlspfad aus - Ursache: Native Befehle im Discord Developer Portal oder in der OpenClaw-Konfiguration deaktiviert
- Lösung: Native Befehle sowohl in den Discord-App-Einstellungen als auch in der OpenClaw-Konfiguration aktivieren
7. Interaktions-Endpunkt-URL falsch konfiguriert
- Symptom: Native Befehle geben generische Fehler zurück oder fallen auf Nachrichten-Handler zurück
- Ursache: Falsche
INTERACTIONS_ENDPOINT_URL, die auf falsches Deployment zeigt - Lösung: Endpunkt-URL überprüfen, die mit der bereitgestellten OpenClaw-Instanz übereinstimmt
Versionsspezifische Überlegungen
8. Build-Hash-Abweichung
- Symptom: Der Fix referenziert Dateien mit anderen Hash-Suffixen als installierte Version
- Ursache: Version
2026.4.5kann mehrere Builds haben - Verifizierung: Build-Hash in Statusausgabe bestätigen, die mit dem erwarteten Fix-Ziel übereinstimmt
🔗 Zugehörige Fehler
Logisch verbundene Fehlermuster
discord/undefinedModellanzeige — Allgemeines Symptom eines Sitzungseintrags-Auflösungsfehlers über alle Befehlspfade, die auf Routenstatus angewiesen sindno activitySitzungsstatus — Zeigt an, dass Sitzungsspeicher-Lookup null oder veralteten Eintrag zurückgegeben hatunknownAPI-Schlüssel-Indikator — Korrelierendes Symptom, wenn Sitzungsmetadaten Provider-/Schlüsselinformationen fehlen- Slash-Befehl vs. Nachrichtenbefehl Abweichung — Bezieht sich auf inkonsistentes Routing zwischen Discord-Interaktionstypen
Historischer Kontext
- Sitzungsschlüsselformat-Änderungen (v2026.x) — Frühere Versionen könnten unterschiedliche Sitzungsschlüsselstrukturen verwendet haben, was zu Lookup-Fehlern führt, wenn Versionen gemischt werden
- Native Befehl Beta-Einschränkungen — Native Befehle-Funktion wurde als