diff --git a/modules/rcred/mod.ts b/modules/rcred/mod.ts index 2c4d3485..f99c9308 100644 --- a/modules/rcred/mod.ts +++ b/modules/rcred/mod.ts @@ -13,7 +13,7 @@ import { renderShell } from '../../server/shell'; import { getModuleInfoList } from '../../shared/module'; import type { RSpaceModule } from '../../shared/module'; import type { SyncServer } from '../../server/local-first/sync-server'; -import { graphSchema, scoresSchema, configSchema, configDocId } from './schemas'; +import { graphSchema, scoresSchema, configSchema, configDocId, scoresDocId } from './schemas'; import type { CredConfigDoc } from './schemas'; import { createCredRoutes } from './routes'; import { recomputeSpace, ensureConfigDoc } from './grain-engine'; @@ -83,6 +83,16 @@ export const credModule: RSpaceModule = { _syncServer = syncServer; startCredCron(); console.log('[rCred] Module initialized, cron started (6h interval)'); + + // Auto-seed demo space on startup (delayed to let docs load) + setTimeout(() => { + if (!_syncServer) return; + const scores = _syncServer.getDoc(scoresDocId('demo')); + if (!scores) { + console.log('[rCred] Seeding demo space scores...'); + recomputeSpace('demo', _syncServer); + } + }, 10_000); }, feeds: [ diff --git a/modules/rcred/routes.ts b/modules/rcred/routes.ts index 520a4e9a..6a8710bd 100644 --- a/modules/rcred/routes.ts +++ b/modules/rcred/routes.ts @@ -136,19 +136,22 @@ export function createCredRoutes(getSyncServer: () => SyncServer | null) { return c.json({ ok: true }); }); - // ── POST /api/recompute — trigger immediate recompute (auth required) ── + // ── POST /api/recompute — trigger immediate recompute ── + // Demo space: open access. Other spaces: require member+ auth. routes.post('/api/recompute', async (c) => { const space = c.req.param('space') || c.req.query('space') || ''; if (!space) return c.json({ error: 'space required' }, 400); - const token = extractToken(c.req.raw.headers); - if (!token) return c.json({ error: 'Auth required' }, 401); - const claims = await verifyToken(token); - if (!claims) return c.json({ error: 'Invalid token' }, 401); + if (space !== 'demo') { + const token = extractToken(c.req.raw.headers); + if (!token) return c.json({ error: 'Auth required' }, 401); + const claims = await verifyToken(token); + if (!claims) return c.json({ error: 'Invalid token' }, 401); - const resolved = await resolveCallerRole(space, claims); - if (!resolved || resolved.role === 'viewer') { - return c.json({ error: 'Membership required' }, 403); + const resolved = await resolveCallerRole(space, claims); + if (!resolved || resolved.role === 'viewer') { + return c.json({ error: 'Membership required' }, 403); + } } const result = recomputeSpace(space, ss());