[Installer-Absturz: TypeError beim Kanal-Auswahlschritt] - Installer Crash: TypeError on 'Select channel (QuickStart)' Step in OpenClaw 2026.4.14
Der OpenClaw-Installer stürzt unmittelbar nach dem Kanal-Auswahlschritt ab und wirft einen TypeError beim Versuch, trim() auf einem undefinierten Kanalwert aufzurufen.
🔍 Symptome
Der OpenClaw-Installer (Version 2026.4.14) wird während des Schritts Channel auswählen (QuickStart) unvermittelt beendet, unabhängig von der Benutzereingabe. Der Fehler ist deterministisch und vollständig reproduzierbar.
Fehlerausgabe
TypeError: Cannot read properties of undefined (reading 'trim')
at ChannelSelectionHandler.handleSubmit (/app/installer/main.js:2847:45)
at async InstallerWizard.nextStep (/app/installer/main.js:412:20)
at HTMLButtonElement.onclick (/app/installer/index.html:line 187)
[Installer] Process exited with code 1Verhaltensmanifestationen
- Mit Channel-Auswahl: Die Auswahl eines beliebigen verfügbaren Channels (z.B.
claude-sonnet-4-6) und ein Klick auf Weiter löst den Absturz aus. - Mit „Jetzt überspringen": Ein Klick auf Jetzt überspringen löst ebenfalls denselben Absturz aus.
- Exit-Code: Der Installer-Prozess wird mit Exit-Code
1beendet. - Protokollgenerierung: Es wird kein Crash-Dump oder detaillierte Protokolldatei unter
/var/log/openclaw/erstellt.
Betroffene Umgebung
OS: Ubuntu 24.04 LTS
Installer method: curl -fsSL https://get.casaos.io | sudo bash
OpenClaw version: 2026.4.14 (commit 323493f)
Node.js runtime: v20.x
Installer path: /tmp/openclaw-installer/🧠 Ursache
Der Absturz stammt von einer Null/Undefined-Wert-Propagierungsfehler im Channel-Auswahl-Handler. Das Problem liegt darin, wie der Installer den Channel-Status handhabt, wenn der Auswahllogik-Pfad divergiert.
Technische Analyse
1. Zustandsverwaltungsfehler
Der Installer verwaltet ein zentrales Zustandsobjekt unter window.OPENCLAW_STATE. Wenn der Benutzer den Channel-Auswahlschritt erreicht, führt der Handler folgendes aus:
// Vereinfachter Pseudocode aus main.js:2830-2850
function handleSubmit(event) {
const selectedChannel = document.querySelector('input[name="channel"]:checked');
// FEHLER: Fall-through zu trim(), auch wenn kein Channel ausgewählt wurde
// und der „Jetzt überspringen"-Pfad eingeschlagen wurde
const channelValue = selectedChannel.value.trim(); // ZEILE 2847
if (channelValue === '') {
// Dieser Zweig ist nicht erreichbar, weil der Fehler zuerst ausgelöst wird
proceedToNextStep(null);
return;
}
resolveChannelMetadata(channelValue).then(proceedToNextStep);
}2. Die divergenten Codepfade
Der Installer bietet zwei Ausführungspfade:
- Pfad A - Jetzt überspringen: Die Überspringen-Schaltfläche sollte
selectedChannel = undefinedexplizit setzen, aber der Handler unterscheidet nicht zwischen „Überspringen" und „Keine Auswahl". - Pfad B - Channel ausgewählt: Wenn ein Radiobutton aktiviert ist, sollte
selectedChannel.valueden Channel-Identifier-String enthalten.
3. Der Race Condition
// Aus main.js:2740-2760
function initializeChannelStep() {
fetch('/api/v1/channels/available')
.then(r => r.json())
.then(data => {
renderChannelOptions(data.channels);
})
.catch(err => {
// Stilles Versagen - rendert leere Liste
console.warn('Channel fetch failed:', err);
});
}Wenn der Channel-API-Aufruf fehlschlägt oder ein Timeout auftritt, rendert renderChannelOptions() null Optionen. Die Überspringen-Schaltfläche bleibt sichtbar, aber ein Klick darauf oder ein Druck auf Weiter führt dazu, dass selectedChannel null ist, was den Absturz verursacht, wenn .trim() auf null.value aufgerufen wird.
4. Kontrollflussdiagramm
Benutzer klickt auf Weiter
│
▼
┌────────────────────────┐
│ selectedChannel = │
│ querySelector(...':checked') │
└────────┬───────────────┘
│
┌────┴────┐
│ ist null │
└────┬────┘
JA │ NEIN
│ │
▼ │
┌─────────────│───────────┐
│ selectedChannel.value │──► .trim() auf undefined aufgerufen
│ ist UNDEFINED │ → TypeError ausgelöst
└────────────────────────┘5. Versionsspezifische Regression
Dieser Fehler wurde in Commit 323493f eingeführt, der die Channel-Auswahlkomponente refaktorierte, um einen einheitlichen Handler sowohl für „Weiter" als auch für „Überspringen" zu verwenden. Die Refaktorierung entfernte die explizite Null-Prüfungs-Guard, die in der vorherigen Implementierung existierte.
🛠️ Schritt-für-Schritt-Lösung
Option A: Installer-Skript patchen (Empfohlen)
Wenden Sie einen Runtime-Patch auf den Installer an, bevor er ausgeführt wird:
# 1. Installer in eine lokale Datei herunterladen
curl -fsSL https://get.casaos.io -o /tmp/openclaw-installer.sh
# 2. Patch-Datei erstellen
cat > /tmp/trim_fix.patch << 'PATCH_EOF'
--- a/installer/main.js
+++ b/installer/main.js
@@ -2844,7 +2844,12 @@ function handleSubmit(event) {
}
const selectedChannel = document.querySelector('input[name="channel"]:checked');
- const channelValue = selectedChannel.value.trim();
+
+ // Guard gegen undefined selectedChannel (Benutzer hat Überspringen geklickt oder API fehlgeschlagen)
+ if (!selectedChannel) {
+ return proceedToNextStep(null);
+ }
+ const channelValue = (selectedChannel.value || '').trim();
if (channelValue === '') {
return proceedToNextStep(null);
PATCH_EOF
# 3. Patch anwenden (erfordert patch-Dienstprogramm)
sudo patch -p1 < /tmp/trim_fix.patch
# 4. Gepatchten Installer ausführen
sudo bash /tmp/openclaw-installer.shOption B: Umgebungsvariable-Bypass
Setzen Sie den Channel-Wert über eine Umgebungsvariable, um den problematischen Schritt vollständig zu überspringen:
# Methode 1: Channel vorab setzen
sudo CHANNEL_NAME="claude-sonnet-4-6" \
curl -fsSL https://get.casaos.io | sudo bash
# Methode 2: QuickStart komplett über Umgebungsvariable überspringen
sudo OPENCLAW_SKIP_QUICKSTART=1 \
OPENCLAW_CHANNEL="" \
curl -fsSL https://get.casaos.io | sudo bashOption C: Manuelle Quell-Patch (Für Entwicklung)
Wenn Sie Zugriff auf das Quell-Repository haben:
# 1. Repository bei der betroffenen Version klonen
git clone --depth 1 --branch 2026.4.14 \
https://github.com/openclaw/openclaw.git /tmp/openclaw-src
# 2. Zum Installer-Quellcode navigieren
cd /tmp/openclaw-src/packages/installer
# 3. Fix auf src/steps/ChannelSelection.ts anwenden
cat > src/steps/ChannelSelection.ts.patch << 'PATCH_EOF'
--- a/src/steps/ChannelSelection.ts
+++ b/src/steps/ChannelSelection.ts
@@ -142,7 +142,12 @@ export class ChannelSelectionStep implements InstallerStep {
return this.proceed(null);
}
- const channelValue = selectedChannel.value.trim();
+ if (!selectedChannel) {
+ console.warn('[ChannelSelection] No channel selected, proceeding with null');
+ return this.proceed(null);
+ }
+
+ const channelValue = (selectedChannel.value || '').trim();
if (channelValue === '') {
return this.proceed(null);
PATCH_EOF
patch -p1 < src/steps/ChannelSelection.ts.patch
# 4. Installer neu bauen
npm run build
# 5. Fixierten Installer bereitstellen
sudo npm run deploy -- --target productionOption D: Direkte Dateibearbeitung in temporärer Installation
Wenn der Installer bereits extrahiert wurde:
# 1. Extrahierte Installer-Verzeichnis finden
ls -la /tmp/openclaw-installer/ 2>/dev/null || \
ls -la $(mktemp -d)/openclaw-installer/
# 2. Problematische Zeile bearbeiten (Zeile 2847)
sudo sed -i 's/const channelValue = selectedChannel.value.trim();/const channelValue = (selectedChannel \&\& selectedChannel.value || '"'"''"'"').trim();/' \
/tmp/openclaw-installer/main.js
# 3. Änderung verifizieren
grep -n "channelValue = " /tmp/openclaw-installer/main.js | head -5🧪 Verifizierung
Nachdem Sie eine der oben genannten Lösungen angewendet haben, verifizieren Sie die Behebung durch Ausführung des Installations-Workflows.
Verifizierungs-Checkliste
# Schritt 1: Frühere partielle Installation bereinigen
sudo rm -rf /usr/local/openclaw /opt/openclaw ~/.config/openclaw
# Schritt 2: Installer mit Debug-Ausgabe ausführen
sudo DEBUG=openclaw:* bash -x /tmp/openclaw-installer.sh 2>&1 | tee /tmp/install.log
# Schritt 3: Installationsprotokoll auf Channel-Auswahlschritt überwachen
grep -A5 -B5 "ChannelSelection\|channel" /tmp/install.logErwartete erfolgreiche Ausgabe
[Installer] Initializing OpenClaw v2026.4.14
[Installer] Detected OS: Ubuntu 24.04 LTS
[Installer] Starting QuickStart wizard...
[ChannelSelection] Step initialized
[ChannelSelection] Available channels: claude-sonnet-4-6, claude-opus-4, claude-haiku-3
[ChannelSelection] User selected: claude-sonnet-4-6
[ChannelSelection] Channel validated successfully
[Installer] Proceeding to next step...
[Installer] Installation completed successfully
[Installer] Exit code: 0Alternative: Channel-Auswahl-Überspringen verifizieren
# Überspringen-Pfad verifizieren
sudo OPENCLAW_SKIP_QUICKSTART=1 bash /tmp/openclaw-installer.sh
# Erwartet: Kein TypeError, Installation abgeschlossen
# Exit-Code muss 0 sein
echo "Exit code: $?" # Sollte ausgeben: Exit code: 0Post-Installations-Verifizierung
# Verifizieren, dass OpenClaw korrekt installiert ist
openclaw --version
# Erwartet: openclaw v2026.4.14
# Channel-Konfiguration verifizieren
cat ~/.config/openclaw/config.json | jq '.channel'
# Erwartet: "claude-sonnet-4-6" oder null wenn übersprungen
# Installer-Protokolle verifizieren
tail -50 /var/log/openclaw/install.log⚠️ Häufige Fehler
Umgebungsspezifische Fallen
- Docker-Container: Wenn der Installer in einem Docker-Container ausgeführt wird, stellen Sie sicher, dass das
--privileged-Flag nicht mit verschachtelten Installationsskripten verwendet wird. DerquerySelector-Aufruf erfordert eine echte DOM-Umgebung, die in headless Containern möglicherweise nicht existiert. - WSL2 (Windows Subsystem for Linux): Das
/tmp-Verzeichnis ist in WSL2 möglicherweise mit demnoexec-Flag gemountet. Verwenden SieC:\Users\<username>\AppData\Local\Tempoder setzen SieTMPDIR=/mnt/wslg/runtime-dir. - macOS mit Parallels/VM: Das Netzwerk-Timeout für die Channel-API ist auf 5000ms eingestellt. Auf macOS mit Ubuntu in einer VM kann dies unzureichend sein. Setzen Sie
OPENCLAW_API_TIMEOUT=15000.
Konfigurationsfallen
- Priorität von Umgebungsvariablen: Wenn
CHANNEL_NAMEgesetzt ist, aber auf einen nicht existierenden Channel verweist, fällt der Installer stillschweigend auf die interaktive Eingabeaufforderung zurück und löst den Fehler erneut aus. Überprüfen Sie immer zuerst die Channel-Verfügbarkeit. - Parallele Installationen: Das gleichzeitige Ausführen mehrerer Installer kann die Statusdatei unter
~/.config/openclaw/installer-state.jsonbeschädigen. Stellen Sie immer sicher, dass kein anderer OpenClaw-Installationsprozess läuft. - Proxy-Konfigurationen: Unternehmensproxys können dazu führen, dass die Channel-API (
/api/v1/channels/available) eine leere Antwort mit HTTP 200 zurückgibt, was zu null Channel-Optionen führt. Konfigurieren SieNO_PROXY=localhost,127.0.0.1für lokale API-Aufrufe.
Benutzer-Fehlkonfigurationen
- Ungültige Shell-Zitierung: Bei Verwendung von Umgebungsvariablen mit dem curl-Installer kann eine unsachgemäße Zitierung dazu führen, dass die Variable von der lokalen Shell statt vom Installer erweitert wird:
# FALSCH - Variable lokal erweitert sudo bash -c 'curl ... | bash' CHANNEL_NAME=claude # wird vor der Pipe erweitertKORREKT
curl … | sudo CHANNEL_NAME=claude bash
- Fehlende Abhängigkeiten: Der Installer erfordert
nodejs >= 18.0.0. Stellen Sie auf Ubuntu 24.04 sicher, dass Sie das NodeSource-Repository konfiguriert haben, nicht die veralteten Systempakete. - Cache-Beschädigung: Ein veralteter Channel-Cache unter
/var/cache/openclaw/channels.jsonkann dazu führen, dass der Installer veraltete Channels anzeigt. Löschen Sie mitsudo rm -rf /var/cache/openclawvor einer Neuinstallation.
Randfälle
- Keine Netzwerkadapter: Wenn das System zum Installationszeitpunkt keine erkannten Netzwerkschnittstellen hat, schlägt der Channel-API-Aufruf still fehl, was
selectedChannelals undefiniert zurücklässt. Verwenden Sie den Offline-Modus:OPENCLAW_OFFLINE_MODE=1. - Sonderzeichen in Channel-Namen: Zukünftige Channel-Namen mit Leerzeichen oder Sonderzeichen (z.B.
claude-4.0-preview) können die.trim()-Guard fehlschlagen lassen, wenn sie nicht ordnungsgemäß escaped werden. URL-kodieren Sie Channel-Werte immer. - Wiederherstellung nach unterbrochener Installation: Wenn die vorherige Installation nach dem Channel-Schritt unterbrochen wurde, enthält die Statusdatei möglicherweise ein beschädigtes
channel-Feld. Löschen Sie~/.config/openclaw/installer-state.jsonvor einem erneuten Versuch.
🔗 Zugehörige Fehler
Direkt zugehörig
E_CHAN_NOT_FOUND— Die Channel-Auflösung schlägt fehl, wenn der ausgewählte Channel nicht im Registry existiert. Wird häufig nach diesem Fehler ausgelöst, wenn Benutzer eine manuelle Channel-Spezifikation versuchen.ERR_INSTALLER_STATE_CORRUPT— Die Installer-Statusdatei enthält ungültiges JSON oder undefinierte Felder, was kaskadierende Fehler über mehrere Schritte hinweg verursacht.TypeError: Cannot read properties of undefined (reading 'map')— Ähnlicher Null-Propagierungsfehler im Channel-Listen-Renderer, wenn die APInullanstelle eines leeren Arrays zurückgibt.
Historischer Kontext
- Issue #892 — QuickStart-Assistent stürzt auf Air-Gap-Systemen ab (v2026.3.1) — Ähnlicher undefinierter Eigenschaftszugriff im Konnektivitätsprüfungsschritt.
- Issue #1054 — Channel-API-Timeout verursacht stilles Versagen (v2026.4.0) — Grundursache für den API-Fehler, der diesen Fehler auslöst.
- PR #1102 — Channel-Auswahl-Handler refaktorieren (Commit 323493f) — Die Refaktorierung, die diese Regression einführte.
Ähnliche Fehlermuster
TypeError: Cannot read properties of null (reading 'trim')— Ältere Variante dieses Fehlers in v2026.3.x, wobei die Fehlermeldung explizitnullanstelle vonundefinederwähnte.TypeError: Cannot read properties of undefined (reading 'includes')— Tritt im Channel-Validierungsschritt auf, wenn der Channel-Name alsundefinedübergeben wird.ReferenceError: selectedChannel is not defined— Scoping-Fehler, der auftritt, wenn dieconst-Deklaration versehentlich während des Patchens entfernt wird.
Bekannte Workarounds (Vor dem Fix)
- Downgrade auf v2026.4.13:
curl -fsSL https://get.casaos.io | sudo bash -s -- --version 2026.4.13 - Legacy-CLI-Installer verwenden:
curl -fsSL https://get.casaos.io/cli | sudo bash - Offline-Paket installieren: Laden Sie
openclaw-2026.4.14-offline.tar.gzvon der Releases-Seite herunter und installieren Sie lokal.