From dac8afb3c110fc73c792462c7bb9dbb871d0529c Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Wed, 29 Jul 2026 21:36:42 +0200 Subject: [PATCH] =?UTF-8?q?fix(cli):=20Selbstheilung=20bevorzugt=20Loopbac?= =?UTF-8?q?k=20=E2=80=94=20sie=20heilte=20sich=20bisher=20in=20die=20insta?= =?UTF-8?q?bilere=20Adresse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vom CEO an codex' Log entdeckt: der CLI-Worker scheiterte mit "AgentHub server at http://192.168.178.52:3377 is not reachable" — obwohl die MCP-Bridge laengst auf 127.0.0.1 zeigte. Grund: die CLI nimmt die PROJEKT-Config, nicht die MCP-Umgebungsvariable. Und die Projekt-Config wurde immer wieder zurueckgeschrieben: antwortet die konfigurierte Adresse kurz nicht — bei JEDEM Hub-Neustart der Fall —, sucht resolveContext per mDNS, findet die LAN-IP und persistiert sie. Ein zuvor gesetztes Loopback ging dabei jedes Mal verloren. Die LAN-IP wiederum bricht beim naechsten Neustart oder Netzwechsel weg: das System heilte sich zuverlaessig in die instabilere Adresse hinein. `preferLoopback()` prueft jetzt, ob derselbe Hub auch auf 127.0.0.1 antwortet, und persistiert dann Loopback. Fuer Agenten auf derselben Maschine ist das strikt robuster — es kann weder durch mDNS-Neuankuendigung noch durch einen Netzwechsel ungueltig werden. Projekt-Config zusaetzlich zurueckgesetzt. Co-Authored-By: Claude Opus 5 (1M context) --- src/cli/index.ts | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/cli/index.ts b/src/cli/index.ts index 2c155d2..03a2ded 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -50,6 +50,36 @@ interface ResolvedContext { // exactly one command per process. let activeProjectCwd: string | undefined; + +/** + * Läuft der gefundene Hub auf DIESER Maschine, dann Loopback bevorzugen. + * + * Hintergrund (real erlebt, kostete Stunden): Die Selbstheilung unten sucht + * per mDNS, wenn die konfigurierte Adresse kurz nicht antwortet — das passiert + * bei JEDEM Hub-Neustart. Sie fand die LAN-IP und schrieb sie in die Config, + * womit ein zuvor gesetztes 127.0.0.1 verlorenging. Die LAN-IP wiederum bricht + * beim nächsten Netzwechsel oder Neustart weg, also heilte sich das System in + * die instabilere Adresse hinein. Loopback ist für Agenten auf derselben + * Maschine strikt robuster — es kann weder durch mDNS-Neuankündigung noch + * durch einen Netzwechsel ungültig werden. + */ +async function preferLoopback(url: string | undefined): Promise { + if (!url) return url; + let port: string; + try { + port = new URL(url).port || '3377'; + } catch { + return url; + } + const loopback = `http://127.0.0.1:${port}`; + if (url === loopback) return url; + try { + const res = await fetch(`${loopback}/status`, { signal: AbortSignal.timeout(1200) }); + if (res.ok) return loopback; + } catch { /* nicht lokal erreichbar — dann bleibt die gefundene Adresse */ } + return url; +} + async function resolveContext(program: Command, cwd: string): Promise { activeProjectCwd = cwd; const flag = (program.opts().server as string | undefined) || process.env.AGENTHUB_SERVER; @@ -86,7 +116,7 @@ async function resolveContext(program: Command, cwd: string): Promise