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.4 KB · 44 lines typescript
Raw Blame History
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