/** * Search-box.ai * Author: Simon-Pierre Boucher * Contact: contact@spboucher.ai * File: apps/web/lib/runner.ts * Description: In-process research runner — starts sessions and guards against double execution. */ import { migrate } from "@search-box/db"; import { createSession, runSession } from "@search-box/agent"; const globalStore = globalThis as unknown as { __searchboxRunning?: Set; __searchboxMigrated?: Promise; }; function running(): Set { if (!globalStore.__searchboxRunning) globalStore.__searchboxRunning = new Set(); return globalStore.__searchboxRunning; } export async function ensureMigrated(): Promise { if (!globalStore.__searchboxMigrated) globalStore.__searchboxMigrated = migrate(); await globalStore.__searchboxMigrated; } /** Creates a session and starts it in the background. Returns the session id immediately. */ export async function startResearch(question: string): Promise { await ensureMigrated(); const sessionId = await createSession(question); running().add(sessionId); void runSession(sessionId) .catch((err) => { console.error(`[research ${sessionId}] failed:`, err); }) .finally(() => { running().delete(sessionId); }); return sessionId; }