diff --git a/server/index.ts b/server/index.ts index 32deafa..c5b53e3 100644 --- a/server/index.ts +++ b/server/index.ts @@ -3992,33 +3992,35 @@ const server = Bun.serve({ // ── Startup ── -// Call onInit for each module that defines it (schema registration, DB init, etc.) -(async () => { - for (const mod of getAllModules()) { - if (mod.onInit) { - try { - await mod.onInit({ syncServer }); - console.log(`[Init] ${mod.name} initialized`); - } catch (e) { - console.error(`[Init] ${mod.name} failed:`, e); - } - } - } - // Pass syncServer to OAuth handlers - setNotionOAuthSyncServer(syncServer); - setGoogleOAuthSyncServer(syncServer); - setClickUpOAuthSyncServer(syncServer); - setOAuthStatusSyncServer(syncServer); -})(); - // Ensure generated files directory exists import { mkdirSync } from "node:fs"; try { mkdirSync(resolve(process.env.FILES_DIR || "./data/files", "generated"), { recursive: true }); } catch {} -ensureDemoCommunity().then(() => console.log("[Demo] Demo community ready")).catch((e) => console.error("[Demo] Failed:", e)); import { initTokenService, seedCUSDC } from "./token-service"; + +// IMPORTANT: Load persisted docs FIRST, then run module onInit + seeding. +// Previously onInit ran before loadAllDocs, causing seed functions to see +// empty docs and re-create demo data that users had already deleted. +ensureDemoCommunity().then(() => console.log("[Demo] Demo community ready")).catch((e) => console.error("[Demo] Failed:", e)); loadAllDocs(syncServer) .then(async () => { + // Now that persisted docs are loaded, init modules (which may seed) + for (const mod of getAllModules()) { + if (mod.onInit) { + try { + await mod.onInit({ syncServer }); + console.log(`[Init] ${mod.name} initialized`); + } catch (e) { + console.error(`[Init] ${mod.name} failed:`, e); + } + } + } + // Pass syncServer to OAuth handlers + setNotionOAuthSyncServer(syncServer); + setGoogleOAuthSyncServer(syncServer); + setClickUpOAuthSyncServer(syncServer); + setOAuthStatusSyncServer(syncServer); + // Seed all modules' demo data so /demo routes always have content for (const mod of getAllModules()) { if (mod.seedTemplate) {