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: packages/shared/src/budgets.ts6 * Description: Hard safety budgets for a research session.7 */89import { z } from "zod";1011export const BudgetsSchema = z.object({12 maxSearches: z.number().int().positive().default(12),13 maxScrapes: z.number().int().positive().default(16),14 maxToolCalls: z.number().int().positive().default(60),15 maxModelTurns: z.number().int().positive().default(40),16 deadlineMs: z.number().int().positive().default(8 * 60 * 1000)17});1819export type Budgets = z.infer<typeof BudgetsSchema>;2021export const DEFAULT_BUDGETS: Budgets = BudgetsSchema.parse({});2223export interface BudgetUsage {24 searches: number;25 scrapes: number;26 toolCalls: number;27 modelTurns: number;28 startedAt: number;29}3031export function newBudgetUsage(): BudgetUsage {32 return { searches: 0, scrapes: 0, toolCalls: 0, modelTurns: 0, startedAt: Date.now() };33}3435/** Returns a human-readable reason when a budget is exhausted, else null. */36export function budgetExceeded(b: Budgets, u: BudgetUsage): string | null {37 if (u.searches >= b.maxSearches) return "search budget exhausted";38 if (u.scrapes >= b.maxScrapes) return "scrape budget exhausted";39 if (u.toolCalls >= b.maxToolCalls) return "tool-call budget exhausted";40 if (u.modelTurns >= b.maxModelTurns) return "model-turn budget exhausted";41 if (Date.now() - u.startedAt >= b.deadlineMs) return "deadline reached";42 return null;43}44