SPB Git

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 KB · 41 lines typescript
Raw Blame History
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