eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
55 lines (54 loc) • 2.81 kB
TypeScript
/**
* Span-level detail rendering and trace-level usage aggregation for
* `eve traces`. Kept separate from the command module: the tree renderer
* stays compact while these helpers answer "what does this span carry" —
* inline metric chips for tree rows, the `--verbose` per-span block, and
* the usage/cost totals summarized in the trace header.
*/
import type { LocalTraceSpan } from "#tracing/local-trace-reader.js";
/** Usage and cost totals aggregated over a trace's `agent.step` spans. */
export interface LocalTraceSummary {
readonly cacheReadTokens: number;
readonly cacheWriteTokens: number;
/** Total gateway cost in USD; undefined when no span reported cost. */
readonly costUsd?: number;
readonly errorCount: number;
readonly inputTokens: number;
/** Distinct model ids seen on any span, first-seen order. */
readonly models: readonly string[];
readonly outputTokens: number;
}
/**
* Compact metrics for one tree row: token chips (`↑1.4K`/`↓213`), cost
* (`$0.0031`). Only chips whose attributes the span actually carries — rows
* without usage stay clean. Tool names belong to eve's durable `agent.action`
* label instead of the AI SDK's child span.
* Raw values: callers sanitize for their output surface.
*/
export declare function spanMetricChips(span: LocalTraceSpan): string[];
/**
* Aggregates usage, cost, models, and errors across one trace. Only
* `agent.step` spans contribute usage: model spans carry the same counters
* and a subagent's totals already appear as its own step spans in the same
* trace, so summing anything else would double-count.
*/
export declare function summarizeLocalTrace(spans: readonly LocalTraceSpan[]): LocalTraceSummary;
/** One-line `Tokens` header value: `↑1.2K in · ↓340 out · 1.1K cached`. */
export declare function formatTokenSummary(summary: LocalTraceSummary): string;
/** Formats a USD cost: `$1.50` at scale, `$0.0031` for typical spans. */
export declare function formatCostUsd(costUsd: number): string;
/**
* The `--verbose` block for one span: facts (status, timing, ids), every
* attribute sorted with payloads rendered as transcripts/pretty JSON, then
* every event with its offset from span start, rendered as `tree(1)`-style
* entries: each fact, attribute key, and event is an entry with a connector
* beneath the span's row, so the rails never break. Payload content wraps
* under its key on a plain margin. `childrenFollow` decides whether the last
* entry closes the branch — child span rows come after the detail entries.
*/
export declare function renderSpanDetailTree(span: LocalTraceSpan, options: {
readonly childrenFollow: boolean;
readonly margin: string;
readonly mute: (text: string) => string;
readonly width: number;
}): string[];