import type { AgentStreamErrorCode } from './stream-events.js'; /** Payloads carried on each `agora:agent:*` channel. */ export interface AgentRunStarted { runId: string; threadId: string; actorId: string; persona?: string; } export interface AgentMessageEvent { runId: string; threadId: string; role: 'user' | 'assistant'; textLength: number; } export interface AgentToolCallEvent { runId: string; /** The call's id — the same on every publication of it, so an observer can deduplicate. */ toolCallId?: string; toolName: string; toolType: 'read' | 'action'; status: string; /** How long the tool ran, when this process ran it (absent for a decision or a replay). */ durationMs?: number; /** * The durable runtime replayed the call's checkpoint instead of running the tool: the call was * already published by the attempt that ran it. Observers that count calls skip these. */ replayed?: boolean; } export interface AgentQuotaExceeded { actorId: string; usedTokens: number; limitTokens: number; } /** * Who and what a run is, carried by the run's terminal events so an observer can attribute them * without reading the store. All optional: a run that has none of them (the default agent, no * tenant) carries none. */ export interface AgentRunContext { /** The agent that handled the run; absent for the default agent. */ agentName?: string; actorId?: string; tenantRef?: string; /** Set on a delegation's child run: the run that started it. Not a turn of its own. */ parentRunId?: string; } export interface AgentRunFinished extends AgentRunContext { runId: string; threadId: string; steps: number; inputTokens: number; outputTokens: number; /** From the turn's start in this process (a resumed run: its resume) to the end. */ durationMs?: number; /** From the turn's start to the first `text` frame on the stream; absent when no text went out. */ ttftMs?: number; /** The run's cost, from the steps whose cost is known; absent when none was. */ costUsd?: number; /** The model of the run's last model call. */ modelId?: string; } /** * A run that ended in an error (the loop threw). `code` is the stable code the stream's `error` * frame carries ({@link AgentStreamErrorCode}); the error itself is never on the event. */ export interface AgentRunFailed extends AgentRunContext { runId: string; threadId: string; code: AgentStreamErrorCode; /** From the turn's start in this process to the failure. */ durationMs: number; } /** A run someone stopped (its abort signal fired) before it finished. */ export interface AgentRunCancelled extends AgentRunContext { runId: string; threadId: string; durationMs: number; } export interface AgentDelegated { runId: string; fromAgent?: string; toAgent: string; /** The delegate was STARTED, not awaited — this run's turn ended without its answer. */ detached?: boolean; } export interface AgentRetrieved { runId: string; /** Length of the query (not the text) — same redaction posture as {@link AgentMessageEvent}. */ queryLength: number; count: number; } /** * A transient-classified tool error being retried in place (no new checkpoint) — see * `invokeWithTransientRetry`. Emitted once per retry (not for the final, non-retried outcome). */ export interface AgentToolRetry { runId: string; toolName: string; toolCallId: string; /** 1-based ordinal of the attempt that just failed and is about to be retried. */ attempt: number; /** The failed attempt's error message. */ message: string; } /** Maps each event name to its payload type, so {@link publishAgent} is checked at the call site. */ export interface AgentDiagnosticPayloads { 'run.started': AgentRunStarted; message: AgentMessageEvent; 'tool-call': AgentToolCallEvent; 'quota.exceeded': AgentQuotaExceeded; 'run.finished': AgentRunFinished; 'run.failed': AgentRunFailed; 'run.cancelled': AgentRunCancelled; delegated: AgentDelegated; retrieved: AgentRetrieved; 'tool.retry': AgentToolRetry; } export type AgentDiagnosticEvent = keyof AgentDiagnosticPayloads; /** * Publish an agent event on `agora:agent:` via the structural diagnostics slot. No-op when * diagnostics isn't installed (the slot is empty) — and it never throws back into the agent loop. */ export declare function publishAgent(event: E, payload: AgentDiagnosticPayloads[E]): void; export declare function publishAgentRunStarted(payload: AgentRunStarted): void; export declare function publishAgentMessage(payload: AgentMessageEvent): void; export declare function publishAgentToolCall(payload: AgentToolCallEvent): void; export declare function publishAgentQuotaExceeded(payload: AgentQuotaExceeded): void; export declare function publishAgentRunFailed(payload: AgentRunFailed): void; export declare function publishAgentRunCancelled(payload: AgentRunCancelled): void; export declare function publishAgentRunFinished(payload: AgentRunFinished): void; export declare function publishAgentDelegated(payload: AgentDelegated): void; export declare function publishAgentRetrieved(payload: AgentRetrieved): void; export declare function publishAgentToolRetry(payload: AgentToolRetry): void; /** The root span for a whole agent turn. `run.finished`-shaped summary rides its `asyncEnd`. */ export interface AgentTurnSpan { runId: string; } /** One model call. Summarized (never prompt/output text) with token counts + tool-call count. */ export interface AgentLlmTurnSpan { runId: string; step: number; } /** One tool invocation. Only the start payload's name/type ride the span — never the tool output. */ export interface AgentToolExecutionSpan { runId: string; toolCallId: string; toolName: string; toolType: 'read' | 'action' | 'agent'; } /** One inject-mode retrieval. Query LENGTH (not text) on start; passage `count` on end. */ export interface AgentRetrievalSpan { runId: string; queryLength: number; topK: number; } /** Maps each span event to its start payload, so {@link spannedAgent} is checked at the call site. */ export interface AgentSpanPayloads { turn: AgentTurnSpan; 'llm.turn': AgentLlmTurnSpan; 'tool.execution': AgentToolExecutionSpan; retrieval: AgentRetrievalSpan; } export type AgentSpanEvent = keyof AgentSpanPayloads; /** * Wrap a genuinely-executing async operation in an `agora:agent:` span correlated to its run * by `traceId = runId`, WITHOUT letting the operation's raw return value ride the span envelope: only * the (redaction-safe) `summarize`d metadata is published as the span `result`, while the real value * is handed straight back to the caller. Zero-cost when no span sub-channel has a subscriber (runs * `run()` directly). Never throws from the span machinery — only `run()`'s own rejection propagates. * * Mirrors the async lifecycle of `@adonis-agora/diagnostics`' `trace()`: `start` → `end` (sync * portion) → `asyncStart` → `asyncEnd` (with the summary) on success, or `error` on rejection. * * MUST be called from inside a `hooks.step` body (→ `ctx.localStep`) so durable replay — which skips * step bodies — never re-emits the span. See the module header. */ export declare function spannedAgent(event: E, traceId: string, payload: AgentSpanPayloads[E], run: () => Promise, summarize: (value: T) => Record): Promise; //# sourceMappingURL=diagnostics.d.ts.map