{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-MVQWT7VO.cjs","../src/toolbox/fallback.ts","../src/toolbox/constants.ts","../src/toolbox/guard.ts","../src/toolbox/router.ts","../src/toolbox/tracker.ts","../src/toolbox/AIToolbox.ts"],"names":[],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-MVQWT7VO.cjs","sourcesContent":[null,"export type FallbackChain = {\n  primary: string;\n  fallbackChain: string[];\n  maxRetries?: number;\n};\n\ntype ProviderTrip = { failures: number; trippedUntil: number };\n\nexport interface Fallback {\n  execute<T>(chain: FallbackChain, fn: (model: string) => Promise<T>): Promise<T>;\n}\n\nfunction isRetriableError(error: unknown): boolean {\n  if (error && typeof error === \"object\") {\n    const e = error as { status?: number; code?: string };\n    if (typeof e.status === \"number\" && e.status >= 400) return true;\n    if (e.code === \"ECONNRESET\" || e.code === \"ETIMEDOUT\") return true;\n  }\n  if (error instanceof Error) {\n    return true;\n  }\n  return false;\n}\n\nexport function createFallback(onFallback?: (model: string) => void): Fallback {\n  const trips = new Map<string, ProviderTrip>();\n\n  const isTripped = (provider: string): boolean => {\n    const t = trips.get(provider);\n    if (!t) return false;\n    if (Date.now() < t.trippedUntil) return true;\n    trips.delete(provider);\n    return false;\n  };\n\n  const recordFailure = (provider: string) => {\n    const prev = trips.get(provider) ?? { failures: 0, trippedUntil: 0 };\n    const failures = prev.failures + 1;\n    if (failures >= 3) {\n      trips.set(provider, { failures, trippedUntil: Date.now() + 5 * 60 * 1000 });\n    } else {\n      trips.set(provider, { failures, trippedUntil: 0 });\n    }\n  };\n\n  const recordSuccess = (provider: string) => {\n    trips.delete(provider);\n  };\n\n  return {\n    async execute<T>(chain: FallbackChain, fn: (model: string) => Promise<T>): Promise<T> {\n      const models = [chain.primary, ...chain.fallbackChain];\n      const maxRetries = chain.maxRetries ?? 1;\n      let lastError: unknown;\n\n      for (let i = 0; i < models.length; i++) {\n        const model = models[i]!;\n        const provider = model.split(\"/\")[0] ?? model;\n\n        if (isTripped(provider)) {\n          continue;\n        }\n\n        for (let attempt = 0; attempt <= maxRetries; attempt++) {\n          try {\n            const result = await fn(model);\n            recordSuccess(provider);\n            if (i > 0) onFallback?.(model);\n            return result;\n          } catch (error) {\n            lastError = error;\n            if (!isRetriableError(error)) throw error;\n            recordFailure(provider);\n          }\n        }\n      }\n\n      throw lastError ?? new Error(\"All models in fallback chain failed\");\n    },\n  };\n}\n","/** Default profile/choice for toolbox router fallbacks. */\nexport const DEFAULT_TOOLBOX_MODEL = \"cheap/default\";\n","export type GuardConfig = {\n  jsonSchema?: object;\n  banPhrases?: string[];\n  minGroundingScore?: number;\n  sourceText?: string;\n};\n\nexport interface Guard {\n  verify(response: string, config: GuardConfig): { isValid: boolean; errors: string[] };\n}\n\nfunction repairJson(text: string): string {\n  let s = text.trim();\n  if (s.startsWith(\"```\")) {\n    s = s.replace(/^```(?:json)?\\s*/i, \"\").replace(/\\s*```$/, \"\");\n  }\n  s = s.replace(/,\\s*([}\\]])/g, \"$1\");\n  return s;\n}\n\nfunction tokenize(text: string): Set<string> {\n  return new Set(\n    text\n      .toLowerCase()\n      .split(/\\W+/)\n      .filter((t) => t.length > 2),\n  );\n}\n\nfunction groundingScore(response: string, source: string): number {\n  const resp = tokenize(response);\n  const src = tokenize(source);\n  if (resp.size === 0) return 0;\n  let overlap = 0;\n  for (const t of resp) {\n    if (src.has(t)) overlap++;\n  }\n  return overlap / resp.size;\n}\n\nfunction validateJsonSchema(value: unknown, schema: object): string[] {\n  const s = schema as { type?: string; required?: string[]; properties?: Record<string, unknown> };\n  const errors: string[] = [];\n\n  if (s.type === \"object\" && (value === null || typeof value !== \"object\" || Array.isArray(value))) {\n    errors.push(\"Expected object\");\n    return errors;\n  }\n\n  if (s.type === \"object\" && s.required) {\n    const obj = value as Record<string, unknown>;\n    for (const key of s.required) {\n      if (!(key in obj)) errors.push(`Missing required field: ${key}`);\n    }\n  }\n\n  return errors;\n}\n\nexport function createGuard(): Guard {\n  return {\n    verify(response: string, config: GuardConfig) {\n      const errors: string[] = [];\n\n      if (config.banPhrases?.length) {\n        const lower = response.toLowerCase();\n        for (const phrase of config.banPhrases) {\n          if (lower.includes(phrase.toLowerCase())) {\n            errors.push(`Response contains banned phrase: ${phrase}`);\n          }\n        }\n      }\n\n      if (config.jsonSchema) {\n        try {\n          const repaired = repairJson(response);\n          const parsed = JSON.parse(repaired);\n          errors.push(...validateJsonSchema(parsed, config.jsonSchema));\n        } catch {\n          errors.push(\"Response is not valid JSON\");\n        }\n      }\n\n      if (config.minGroundingScore !== undefined && config.sourceText) {\n        const score = groundingScore(response, config.sourceText);\n        if (score < config.minGroundingScore) {\n          errors.push(\n            `Grounding score ${score.toFixed(2)} below threshold ${config.minGroundingScore}`,\n          );\n        }\n      }\n\n      return { isValid: errors.length === 0, errors };\n    },\n  };\n}\n","import { DEFAULT_TOOLBOX_MODEL } from \"./constants.js\";\n\nexport type RouteRule = {\n  maxTokens?: number;\n  keywords?: string[];\n  complexity: \"low\" | \"medium\" | \"high\";\n  targetModel: string;\n};\n\nconst TECH_KEYWORDS = [\n  \"code\",\n  \"sql\",\n  \"diff\",\n  \"function\",\n  \"class\",\n  \"typescript\",\n  \"python\",\n  \"api\",\n  \"debug\",\n  \"refactor\",\n  \"algorithm\",\n];\n\nexport interface Router {\n  addRule(rule: RouteRule): void;\n  determineModel(prompt: string): Promise<{ model: string; reason: string }>;\n}\n\nexport function createRouter(defaultModel = DEFAULT_TOOLBOX_MODEL): Router {\n  const rules: RouteRule[] = [];\n\n  return {\n    addRule(rule: RouteRule) {\n      rules.push(rule);\n    },\n\n    async determineModel(prompt: string) {\n      let complexity: RouteRule[\"complexity\"] = \"medium\";\n\n      if (prompt.length < 200) {\n        complexity = \"low\";\n      } else if (TECH_KEYWORDS.some((kw) => prompt.toLowerCase().includes(kw))) {\n        complexity = \"high\";\n      }\n\n      const match =\n        rules.find((r) => r.complexity === complexity) ??\n        rules.find((r) => r.complexity === \"medium\");\n\n      if (match) {\n        return {\n          model: match.targetModel,\n          reason: `Matched ${complexity} complexity rule`,\n        };\n      }\n\n      return { model: defaultModel, reason: `Default model for ${complexity} complexity` };\n    },\n  };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\n\nexport type TrackResult = {\n  requestId: string;\n  durationMs: number;\n  promptTokens: number;\n  completionTokens: number;\n  estimatedCostUSD: number;\n  requestPayload: unknown;\n  responsePayload: unknown;\n};\n\nexport type TrackerStorage = \"memory\" | \"sqlite\";\n\nexport type TrackerOptions = {\n  storage?: TrackerStorage;\n  sqlitePath?: string;\n};\n\nfunction estimateTokens(text: string): number {\n  return Math.max(1, Math.ceil(text.length / 4));\n}\n\nfunction extractUsage(response: unknown): { prompt: number; completion: number } | null {\n  if (!response || typeof response !== \"object\") return null;\n  const r = response as Record<string, unknown>;\n  const usage = (r.usage ?? (r as { data?: { usage?: unknown } }).data) as\n    | Record<string, number>\n    | undefined;\n  if (!usage) return null;\n  const prompt = usage.prompt_tokens ?? usage.promptTokens ?? usage.input_tokens;\n  const completion =\n    usage.completion_tokens ?? usage.completionTokens ?? usage.output_tokens;\n  if (typeof prompt === \"number\" && typeof completion === \"number\") {\n    return { prompt, completion };\n  }\n  return null;\n}\n\nexport interface Tracker {\n  logExchange(request: unknown, response: unknown): Promise<TrackResult>;\n  wrap<T extends (...args: unknown[]) => Promise<unknown>>(fn: T): T;\n  on(event: \"exchange\", handler: (data: TrackResult) => void): void;\n}\n\nexport function createTracker(_options: TrackerOptions = {}): Tracker {\n  const emitter = new EventEmitter();\n  const memoryLogs: TrackResult[] = [];\n\n  const logExchange = async (request: unknown, response: unknown): Promise<TrackResult> => {\n    const start = Date.now();\n    const usage = extractUsage(response);\n    const reqText = JSON.stringify(request ?? \"\");\n    const promptTokens = usage?.prompt ?? estimateTokens(reqText);\n    const completionTokens =\n      usage?.completion ?? estimateTokens(JSON.stringify(response ?? \"\"));\n\n    const result: TrackResult = {\n      requestId: randomUUID(),\n      durationMs: Date.now() - start,\n      promptTokens,\n      completionTokens,\n      estimatedCostUSD: 0,\n      requestPayload: request,\n      responsePayload: response,\n    };\n\n    memoryLogs.push(result);\n    emitter.emit(\"exchange\", result);\n    return result;\n  };\n\n  return {\n    logExchange,\n    wrap<T extends (...args: unknown[]) => Promise<unknown>>(fn: T): T {\n      const wrapped = (async (...args: unknown[]) => {\n        const request = args[0];\n        const response = await fn(...args);\n        await logExchange(request, response);\n        return response;\n      }) as T;\n      return wrapped;\n    },\n    on(event: \"exchange\", handler: (data: TrackResult) => void) {\n      emitter.on(event, handler);\n    },\n  };\n}\n","import { createFallback, type Fallback } from \"./fallback.js\";\nimport { DEFAULT_TOOLBOX_MODEL } from \"./constants.js\";\nimport { createGuard, type Guard } from \"./guard.js\";\nimport { createRouter, type Router } from \"./router.js\";\nimport { createTracker, type Tracker, type TrackerOptions } from \"./tracker.js\";\n\nexport type AiToolboxOptions = {\n  /** Profile/choice or model id when no router rule matches. @default {@link DEFAULT_TOOLBOX_MODEL} */\n  defaultModel?: string;\n  apiKey?: string;\n  storage?: TrackerOptions[\"storage\"];\n  sqlitePath?: string;\n};\n\nexport class AIToolbox {\n  readonly tracker: Tracker;\n  readonly router: Router;\n  readonly guard: Guard;\n  readonly fallback: Fallback;\n\n  constructor(options: AiToolboxOptions = {}) {\n    this.tracker = createTracker({\n      storage: options.storage,\n      sqlitePath: options.sqlitePath,\n    });\n    this.router = createRouter(options.defaultModel ?? DEFAULT_TOOLBOX_MODEL);\n    this.guard = createGuard();\n    this.fallback = createFallback();\n  }\n}\n"]}