spb/search-box Public
Agentic web research engine — hypotheses, verbatim evidence, contradictions, sourced answers streamed live. Claude Opus 5 + Firecrawl + PostgreSQL.
TypeScript 76.9%
CSS 18.7%
SQL 2.1%
JavaScript 1.8%
Shell 0.5%
1/**2 * Search-box.ai3 * Author: Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 * File: apps/web/lib/runner.ts6 * Description: In-process research runner — starts sessions and guards against double execution.7 */89import { migrate } from "@search-box/db";10import { createSession, runSession } from "@search-box/agent";1112const globalStore = globalThis as unknown as {13 __searchboxRunning?: Set<string>;14 __searchboxMigrated?: Promise<void>;15};1617function running(): Set<string> {18 if (!globalStore.__searchboxRunning) globalStore.__searchboxRunning = new Set();19 return globalStore.__searchboxRunning;20}2122export async function ensureMigrated(): Promise<void> {23 if (!globalStore.__searchboxMigrated) globalStore.__searchboxMigrated = migrate();24 await globalStore.__searchboxMigrated;25}2627/** Creates a session and starts it in the background. Returns the session id immediately. */28export async function startResearch(question: string): Promise<string> {29 await ensureMigrated();30 const sessionId = await createSession(question);31 running().add(sessionId);32 void runSession(sessionId)33 .catch((err) => {34 console.error(`[research ${sessionId}] failed:`, err);35 })36 .finally(() => {37 running().delete(sessionId);38 });39 return sessionId;40}41