/** * sim/metrics.ts — the single derivation point for time/cost accounting, * ported from mirofish `engine/metrics.py`. Pure functions, zero I/O, * computed on demand and never stored. * * Inputs tolerate both live objects and their JSON dumps; missing fields * (older records) degrade to 0 — the derivation layer only widens, never * throws. The report card carries `v` for forward evolution. */ import type { ModelUsage, SessionFrame, StepRecord } from "./models.ts"; type AnyRec = Record; /** Per-model total + global in/out split (lists and result pages read this). */ export declare function tokenSummary(cost: ModelUsage | null | undefined): { tokens: Record; tokens_in: number; tokens_out: number; }; /** One step's grounding (executor) cost = Σ operate_log[].cost. */ export declare function groundingCost(record: StepRecord | AnyRec): ModelUsage; /** Per-kind wall clock of one step's trace: {llm_ms, device_ms, process_ms}. * "phase" spans are grouping containers and never counted (llm/device/process * never nest into each other by collection convention, so plain sums are true). */ export declare function traceTime(record: StepRecord | AnyRec): { llm_ms: number; device_ms: number; process_ms: number; }; /** One step's time/cost breakdown (planning = decide; grounding = Σ operate * spans; llm/device/process = the trace's per-kind split, one level finer). */ export declare function stepMetrics(record: StepRecord | AnyRec): { planning_ms: number; grounding_ms: number; llm_ms: number; device_ms: number; process_ms: number; tokens_total: number; tokens_planning: number; tokens_grounding: number; n_actions: number; n_operates: number; silent: boolean; error: boolean; }; export interface ReportCard { v: 1; agents: number; statuses: Record; super_steps: number | null; steps: { total: number; silent: number; error: number; operates: number; }; tokens: { by_model: Record; input: number; output: number; total: number; planning: number; grounding: number; }; time_ms: { wall: number | null; planning: number; grounding: number; llm: number; device: number; process: number; }; status?: string; } /** Run-level report card: total time/cost/step accounting over N frames. */ export declare function reportCard(frames: Array | Record, opts?: { wallMs?: number | null; superSteps?: number | null; }): ReportCard; /** Single-agent session accounting (= a one-frame report card + status). */ export declare function frameMetrics(frame: SessionFrame | AnyRec): ReportCard; export {};