diff --git a/lib/folk-blender.ts b/lib/folk-blender.ts index 70a0cc53..1c47cd88 100644 --- a/lib/folk-blender.ts +++ b/lib/folk-blender.ts @@ -418,25 +418,17 @@ export class FolkBlender extends FolkShape { this.#renderResult(); } - // 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; } + // Health check — only disable if real error (sidecar starts on demand) + fetch("/api/blender-gen/health").then(r => r.json()).then((h: any) => { + if (this.#generateBtn) { + if (!h.available && h.issues?.length) { this.#generateBtn.disabled = true; - this.#generateBtn.title = (h.issues || []).join(", ") || "Blender service unavailable"; - } else if (h.warnings?.length && this.#generateBtn) { + this.#generateBtn.title = h.issues.join(", "); + } else if (h.warnings?.length) { 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(); + } + }).catch(() => {}); return root; } diff --git a/lib/folk-freecad.ts b/lib/folk-freecad.ts index 1ff03df9..0b2bde7e 100644 --- a/lib/folk-freecad.ts +++ b/lib/folk-freecad.ts @@ -311,23 +311,12 @@ export class FolkFreeCAD extends FolkShape { this.#renderResult(); } - // 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(); + // Health check — only disable if endpoint unreachable (sidecar starts on demand) + fetch("/api/freecad/health").then(r => r.json()).then((h: any) => { + if (this.#generateBtn && h.available === false && h.status && !h.status.includes("on demand")) { + this.#generateBtn.title = h.error || h.status || "FreeCAD MCP server unavailable"; + } + }).catch(() => {}); return root; } diff --git a/lib/folk-kicad.ts b/lib/folk-kicad.ts index 7b764834..9aad1e81 100644 --- a/lib/folk-kicad.ts +++ b/lib/folk-kicad.ts @@ -397,23 +397,12 @@ export class FolkKiCAD extends FolkShape { this.#showExports(); } - // 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(); + // Health check — only disable if endpoint unreachable (sidecar starts on demand) + fetch("/api/kicad/health").then(r => r.json()).then((h: any) => { + if (this.#generateBtn && h.available === false && h.status && !h.status.includes("on demand")) { + this.#generateBtn.title = h.error || h.status || "KiCAD MCP server unavailable"; + } + }).catch(() => {}); return root; }