export type TraceEventKind = 'tool_call' | 'hook_decision' | 'subagent_lifecycle' | 'background_agent' | 'budget' | 'abort' | 'compaction' | 'closure' | 'claim' | 'browser_event' | 'queued_user_message' | 'session_phase' | 'session_sealed'; export interface ToolCallStartedPayload { phase: 'started'; toolUseId: string; name: string; inputBytes: number; argsFingerprint?: string; resourceFingerprint?: string; subagentId?: string; } export declare const TOOL_FAILURE_CLASSES: readonly ["policy-refusal", "timeout", "budget", "permission-denied", "hook-block", "abort", "elicitation-declined", "denial-breaker", "repeat-failure", "no-such-target"]; export type ToolFailureClass = (typeof TOOL_FAILURE_CLASSES)[number]; export declare const BENIGN_FAILURE_CLASSES: ReadonlySet; export interface ToolCallCompletedPayload { phase: 'completed'; toolUseId: string; name: string; resultBytes: number; isError: boolean; truncated: boolean; durationMs: number; incomplete?: boolean; incompleteReason?: string; circuitBreaker?: boolean; failureClass?: ToolFailureClass; batchIndex?: number; batchSize?: number; subagentId?: string; testResult?: import('../tools/handlers/test-runner-detector.js').TestResult; } export type ToolCallPayload = ToolCallStartedPayload | ToolCallCompletedPayload; export type HookEventName = 'PreToolUse' | 'PostToolUse' | 'PostToolUseFailure' | 'SessionStart' | 'SessionEnd' | 'SubagentStart' | 'SubagentStop'; export type AfkApprovalOutcome = 'carve-out' | 'approved' | 'denied' | 'unrecognised' | 'timeout' | 'decline' | 'cancel' | 'hard-block'; export interface HookDecisionPayload { hookEvent: HookEventName; decision?: 'block' | 'approve'; reason?: string; blockedTool?: string; subagentId?: string; injectedContextBytes?: number; durationMs?: number; approvalOutcome?: AfkApprovalOutcome; } export interface SubagentStartedPayload { transition: 'started'; subagentId: string; parentId: string; model: string; allowedTools?: readonly string[]; systemPromptHash?: string; promptHead?: string; agentType?: string; resolvedAgentType?: string; } export interface SubagentSucceededPayload { transition: 'succeeded'; subagentId: string; durationMs: number; turnCount: number; totalCostUsd?: number; outputBytes: number; stopReason?: string; } export interface SubagentFailedPayload { transition: 'failed'; subagentId: string; errorClass: string; errorMessage: string; partialOutputBytes: number; failureClass?: ToolFailureClass; } export interface SubagentCancelledPayload { transition: 'cancelled'; subagentId: string; source: 'cascade' | 'explicit'; timeout?: boolean; } export type SubagentLifecyclePayload = SubagentStartedPayload | SubagentSucceededPayload | SubagentFailedPayload | SubagentCancelledPayload; export type { BackgroundAgentStartedPayload, BackgroundAgentCompletedPayload, BackgroundAgentFailedPayload, BackgroundAgentCancelledPayload, BackgroundAgentJoinedPayload, BackgroundAgentDeliveredPayload, BackgroundAgentPayload, } from './background-agent-payloads.js'; import type { BackgroundAgentPayload } from './background-agent-payloads.js'; export interface BudgetPayload { kind: 'monetary'; runningCostUsd: number; maxBudgetUsd: number; lastTurnCostUsd: number; } export type AbortOrigin = 'user_signal' | 'cascade' | 'timeout' | 'budget' | 'hook_block'; export interface AbortPayload { origin: AbortOrigin; cascadedTo: readonly string[]; reason?: string; } export type CompactionTrigger = 'manual' | 'token_threshold' | 'turn_count'; export interface CompactionPayloadInput { trigger: CompactionTrigger; preCompactionMessages: unknown[]; summary: string; keptTailCount: number; keepLastNConfig: number; messagesBefore: number; messagesAfter: number; tokensSavedEstimate?: number; summarizationTokens?: { input: number; output: number; }; } export interface CompactionSidecarRef { path: string; sizeBytes: number; sha256: string; } export interface CompactionPayloadPersisted { trigger: CompactionTrigger; preCompactionMessagesRef: CompactionSidecarRef; summary: string; keptTailCount: number; keepLastNConfig: number; messagesBefore: number; messagesAfter: number; tokensSavedEstimate?: number; summarizationTokens?: { input: number; output: number; }; } export type ClosureReason = 'model_end_turn' | 'truncated' | 'iteration_cap' | 'abort' | 'timeout' | 'budget_exceeded' | 'hook_blocked' | 'max_turns_exceeded'; export interface ClosurePayload { reason: ClosureReason; finalTurnCount: number; finalCostUsd: number; finalTokens: { input?: number; output?: number; cacheRead?: number; cacheCreation?: number; }; lastStopReason?: string; guidance?: string; } export interface ClaimPayload { source: string; assertion: string; evidence: readonly string[]; confidence: number; dissent?: string; } export type BrowserEventTool = 'browser_open' | 'browser_observe' | 'browser_act' | 'browser_screenshot' | 'browser_extract' | 'browser_close'; export type BrowserActAction = 'click' | 'fill' | 'press' | 'select' | 'hover' | 'scroll_to' | 'wait_for'; export interface BrowserEventTarget { kind: 'semantic' | 'element_id' | 'selector'; text?: string; role?: string; elementId?: string; selectorHash?: string; } export interface QueuedUserMessagePayload { jobId: string; subagentId: string; byteLength: number; } export interface BrowserEventPayload { tool: BrowserEventTool; action?: BrowserActAction; toolUseId: string; backend?: 'playwright' | 'agent-browser'; backendReason?: string; target?: BrowserEventTarget; urlBefore: string | null; urlAfter: string | null; status: 'ok' | 'error' | 'ambiguous_target' | 'blocked_by_policy'; screenshotPath?: string; observationSummary?: string; error?: { reason: string; recoverable: boolean; }; durationMs: number; } export type SessionPhaseName = 'bootstrap_start' | 'bootstrap_done' | 'session_init_start' | 'session_init_done' | 'mcp_connect_start' | 'mcp_connect_done' | 'mcp_server_start' | 'mcp_server_done' | 'loop_start' | 'loop_end' | 'model_ttfb' | 'interrupt_halt' | 'rate_limit' | 'ttfb_timeout' | 'usage_limit_pause' | 'usage_limit_resume' | 'overload_pause' | 'overload_resume' | 'idle_watchdog_fired' | 'pause_extension_granted' | 'suspected_loop' | 'compaction_disabled' | 'boot_warning' | 'workspace_subscribed' | 'workspace_delivery' | 'gate_shape'; export interface SessionPhasePayload { phase: SessionPhaseName; durationMs?: number; metadata?: Record; model?: string; resolvedModel?: string; origin?: 'cli' | 'telegram' | 'daemon' | 'web' | 'unknown'; actor?: 'main' | 'subagent'; } export interface SessionSealedPayload { status: 'succeeded' | 'failed' | 'cancelled'; finalCostUsd: number; finalTurnCount: number; closedAt: string; incomplete?: boolean; subagentCount?: number; subagentTokens?: { input?: number; output?: number; cacheRead?: number; cacheCreation?: number; }; subagentCostUsd?: number; } export type TraceEventInput = { kind: 'tool_call'; payload: ToolCallPayload; } | { kind: 'hook_decision'; payload: HookDecisionPayload; } | { kind: 'subagent_lifecycle'; payload: SubagentLifecyclePayload; } | { kind: 'background_agent'; payload: BackgroundAgentPayload; } | { kind: 'budget'; payload: BudgetPayload; } | { kind: 'abort'; payload: AbortPayload; } | { kind: 'compaction'; payload: CompactionPayloadInput; } | { kind: 'closure'; payload: ClosurePayload; } | { kind: 'claim'; payload: ClaimPayload; } | { kind: 'browser_event'; payload: BrowserEventPayload; } | { kind: 'queued_user_message'; payload: QueuedUserMessagePayload; } | { kind: 'session_phase'; payload: SessionPhasePayload; }; export type TraceEvent = { ts: string; seq: number; kind: 'tool_call'; payload: ToolCallPayload; } | { ts: string; seq: number; kind: 'hook_decision'; payload: HookDecisionPayload; } | { ts: string; seq: number; kind: 'subagent_lifecycle'; payload: SubagentLifecyclePayload; } | { ts: string; seq: number; kind: 'background_agent'; payload: BackgroundAgentPayload; } | { ts: string; seq: number; kind: 'budget'; payload: BudgetPayload; } | { ts: string; seq: number; kind: 'abort'; payload: AbortPayload; } | { ts: string; seq: number; kind: 'compaction'; payload: CompactionPayloadPersisted; } | { ts: string; seq: number; kind: 'closure'; payload: ClosurePayload; } | { ts: string; seq: number; kind: 'claim'; payload: ClaimPayload; } | { ts: string; seq: number; kind: 'browser_event'; payload: BrowserEventPayload; } | { ts: string; seq: number; kind: 'queued_user_message'; payload: QueuedUserMessagePayload; } | { ts: string; seq: number; kind: 'session_phase'; payload: SessionPhasePayload; } | { ts: string; seq: number; kind: 'session_sealed'; payload: SessionSealedPayload; };