import type { OmegaOperationalTurnMemoryEntry } from "./operational-memory.js"; export type OmegaUtilityBreakdown = { taskProgressGain: number; uncertaintyReduction: number; futureFailureRiskReduction: number; tokenCost: number; wallTimeCost: number; disruptionCost: number; total: number; expectedUtility?: number; }; export type OmegaBudgetUsage = { observedTurns: number; estimatedLlmCalls: number; observedWallTimeMs: number; budgetPressure: number; turnPressure?: number; }; function clampUnit(value: number): number { return Math.max(0, Math.min(1, value)); } export function deriveOmegaBudgetUsage(params: { operationalSignals: OmegaOperationalTurnMemoryEntry[]; maxTurnsPerCycle: number; maxLlmCalls: number; maxWallTimeMs: number; }): OmegaBudgetUsage { const recentSignals = params.operationalSignals.slice(-3); const observedTurns = recentSignals.length; const estimatedLlmCalls = recentSignals.length; const observedWallTimeMs = recentSignals.reduce( (total, entry) => total + entry.latencyBreakdown.totalMs, 0, ); const turnPressure = params.maxTurnsPerCycle > 0 ? observedTurns / params.maxTurnsPerCycle : 1; const llmPressure = params.maxLlmCalls > 0 ? estimatedLlmCalls / params.maxLlmCalls : 1; const wallTimePressure = params.maxWallTimeMs > 0 ? observedWallTimeMs / params.maxWallTimeMs : 1; return { observedTurns, estimatedLlmCalls, observedWallTimeMs, budgetPressure: clampUnit(Math.max(turnPressure, llmPressure, wallTimePressure)), turnPressure, }; } export function computeOmegaUtilityBreakdown(params: { urgency: number; expectedUtility: number; uncertaintyReduction: number; estimatedCost: number; failureRisk: number; budgetPressure?: number; }): OmegaUtilityBreakdown { const taskProgressGain = clampUnit(params.urgency) * 0.35; const uncertaintyReduction = clampUnit(params.uncertaintyReduction) * 0.2; const futureFailureRiskReduction = clampUnit(params.expectedUtility) * 0.3; const tokenCost = clampUnit(params.estimatedCost) * 0.08; const wallTimeCost = clampUnit(params.estimatedCost) * 0.05; const disruptionCost = clampUnit(params.failureRisk) * 0.08 + clampUnit(params.budgetPressure ?? 0) * 0.06; return { taskProgressGain, uncertaintyReduction, futureFailureRiskReduction, tokenCost, wallTimeCost, disruptionCost, total: taskProgressGain + uncertaintyReduction + futureFailureRiskReduction - tokenCost - wallTimeCost - disruptionCost, expectedUtility: params.expectedUtility, }; }