diff --git a/lib/folk-blender.ts b/lib/folk-blender.ts index 08766e3..f9b9772 100644 --- a/lib/folk-blender.ts +++ b/lib/folk-blender.ts @@ -384,20 +384,25 @@ export class FolkBlender extends FolkShape { this.#renderResult(); } - // Health check - fetch("/api/blender-gen/health").then(r => r.json()).then((h: any) => { - if (!h.available && this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = (h.issues || []).join(", ") || "Blender service unavailable"; - } else if (h.warnings?.length && this.#generateBtn) { - this.#generateBtn.title = h.warnings.join(", "); - } - }).catch(() => { - if (this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = "Cannot reach Blender health endpoint"; - } - }); + // Health check with retry (container may still be starting) + const checkHealth = (attempt = 0) => { + fetch("/api/blender-gen/health").then(r => r.json()).then((h: any) => { + if (!h.available && this.#generateBtn) { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + this.#generateBtn.disabled = true; + this.#generateBtn.title = (h.issues || []).join(", ") || "Blender service unavailable"; + } else if (h.warnings?.length && this.#generateBtn) { + this.#generateBtn.title = h.warnings.join(", "); + } + }).catch(() => { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + if (this.#generateBtn) { + this.#generateBtn.disabled = true; + this.#generateBtn.title = "Cannot reach Blender health endpoint"; + } + }); + }; + checkHealth(); return root; } diff --git a/lib/folk-freecad.ts b/lib/folk-freecad.ts index b2ad8d5..1ff03df 100644 --- a/lib/folk-freecad.ts +++ b/lib/folk-freecad.ts @@ -311,18 +311,23 @@ export class FolkFreeCAD extends FolkShape { this.#renderResult(); } - // Health check - fetch("/api/freecad/health").then(r => r.json()).then((h: any) => { - if (!h.available && this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = h.error || "FreeCAD MCP server unavailable"; - } - }).catch(() => { - if (this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = "Cannot reach FreeCAD health endpoint"; - } - }); + // Health check with retry (container may still be starting) + const checkHealth = (attempt = 0) => { + fetch("/api/freecad/health").then(r => r.json()).then((h: any) => { + if (!h.available && this.#generateBtn) { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + this.#generateBtn.disabled = true; + this.#generateBtn.title = h.error || "FreeCAD MCP server unavailable"; + } + }).catch(() => { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + if (this.#generateBtn) { + this.#generateBtn.disabled = true; + this.#generateBtn.title = "Cannot reach FreeCAD health endpoint"; + } + }); + }; + checkHealth(); return root; } diff --git a/lib/folk-kicad.ts b/lib/folk-kicad.ts index 12baaab..7b76483 100644 --- a/lib/folk-kicad.ts +++ b/lib/folk-kicad.ts @@ -397,18 +397,23 @@ export class FolkKiCAD extends FolkShape { this.#showExports(); } - // Health check - fetch("/api/kicad/health").then(r => r.json()).then((h: any) => { - if (!h.available && this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = h.error || "KiCAD MCP server unavailable"; - } - }).catch(() => { - if (this.#generateBtn) { - this.#generateBtn.disabled = true; - this.#generateBtn.title = "Cannot reach KiCAD health endpoint"; - } - }); + // Health check with retry (container may still be starting) + const checkHealth = (attempt = 0) => { + fetch("/api/kicad/health").then(r => r.json()).then((h: any) => { + if (!h.available && this.#generateBtn) { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + this.#generateBtn.disabled = true; + this.#generateBtn.title = h.error || "KiCAD MCP server unavailable"; + } + }).catch(() => { + if (attempt < 2) { setTimeout(() => checkHealth(attempt + 1), 3000); return; } + if (this.#generateBtn) { + this.#generateBtn.disabled = true; + this.#generateBtn.title = "Cannot reach KiCAD health endpoint"; + } + }); + }; + checkHealth(); return root; }