Merge branch 'dev'

This commit is contained in:
Jeff Emmett 2026-03-25 18:08:58 -07:00
commit 21b8a24267
4 changed files with 65 additions and 39 deletions

View File

@ -384,20 +384,25 @@ export class FolkBlender extends FolkShape {
this.#renderResult();
}
// Health check
// 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;
}

View File

@ -311,18 +311,23 @@ export class FolkFreeCAD extends FolkShape {
this.#renderResult();
}
// Health check
// 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;
}

View File

@ -397,18 +397,23 @@ export class FolkKiCAD extends FolkShape {
this.#showExports();
}
// Health check
// 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;
}

View File

@ -28,6 +28,7 @@ import {
cascadePermissions,
listCommunities,
deleteCommunity,
updateSpaceMeta,
} from "./community-store";
import type { NestPermissions, SpaceRefFilter } from "./community-store";
import { ensureDemoCommunity } from "./seed-demo";
@ -3696,7 +3697,7 @@ loadAllDocs(syncServer)
})
.catch((e) => console.error("[DocStore] Startup load failed:", e));
// Restore relay mode for encrypted spaces
// Restore relay mode for encrypted spaces + one-shot visibility fixes
(async () => {
try {
const slugs = await listCommunities();
@ -3712,6 +3713,16 @@ loadAllDocs(syncServer)
if (relayCount > 0) {
console.log(`[Encryption] ${relayCount} space(s) set to relay mode (encrypted)`);
}
// One-shot: fix spaces that should be permissioned
const fixPermissioned = ["clf", "bcrg"];
for (const slug of fixPermissioned) {
const data = getDocumentData(slug);
if (data && data.meta?.visibility !== "permissioned") {
updateSpaceMeta(slug, { visibility: "permissioned" });
console.log(`[VisFix] Set ${slug} to permissioned (was: ${data.meta?.visibility})`);
}
}
} catch (e) {
console.error("[Encryption] Failed to restore relay modes:", e);
}