/** * LoggingRecorder — firehose-style structured logging of every event. * * Pattern: Facade over EventDispatcher's wildcard subscription. * Role: Tier 3 observability — the low-level helper behind * `attachLogging(dispatcher, {...})` (exported from * `agentfootprint/observe`). For the high-level, uniform path use * `agent.enable.observability({ strategy: consoleObservability() })`. * Developer debugging tool; production typically uses an OTEL * recorder instead. * Emits: Does NOT emit; READS the dispatcher and writes to the logger. * * Filtering: consumer picks DOMAINS by name — the same domain segment that * appears in event types (`agentfootprint..`). No internal * tier jargon leaks into the public API. */ import type { EventDispatcher, Unsubscribe } from '../../events/dispatcher.js'; import type { AgentfootprintEvent } from '../../events/registry.js'; /** * Minimal logger shape — structurally compatible with console, winston, * pino, etc. Consumers pass their existing logger. */ export interface LoggingLogger { log(message: string, data?: unknown): void; } /** * Domain constants — one per event-registry domain. Use these instead of * raw strings for autocomplete, typo protection, and rename safety. * * Raw strings still work (backed by the same literal union type below). * * @example * attachLogging(dispatcher, { domains: [LoggingDomains.CONTEXT, LoggingDomains.STREAM] }); * attachLogging(dispatcher, { domains: ['context', 'stream'] }); // equivalent */ export declare const LoggingDomains: { /** Context-engineering events (the 3-slot model). THE DEBUG CORE. */ readonly CONTEXT: "context"; /** LLM + tool request/response stream. */ readonly STREAM: "stream"; /** Composition control flow (Sequence / Parallel / Conditional / Loop). */ readonly COMPOSITION: "composition"; /** Agent lifecycle (turn · iteration · route_decided · handoff). */ readonly AGENT: "agent"; /** Memory strategy + store operations. */ readonly MEMORY: "memory"; /** Tool offered / activated / deactivated. */ readonly TOOLS: "tools"; /** Skill activation + deactivation. */ readonly SKILL: "skill"; /** Permission checks + gates. */ readonly PERMISSION: "permission"; /** Risk / guardrail detections. */ readonly RISK: "risk"; /** Provider / tool / skill fallback triggers. */ readonly FALLBACK: "fallback"; /** Cost + budget tracking. */ readonly COST: "cost"; /** Eval scores + threshold crossings. */ readonly EVAL: "eval"; /** Error retries + recoveries. */ readonly ERROR: "error"; /** Pause / resume requests. */ readonly PAUSE: "pause"; /** Embedding generation. */ readonly EMBEDDING: "embedding"; }; /** * Domain name — the middle segment of event types * (`agentfootprint..`). Consumers already see these in * the events they subscribe to; reusing them here avoids teaching a * new taxonomy. */ export type LoggingDomain = (typeof LoggingDomains)[keyof typeof LoggingDomains]; export interface LoggingOptions { /** Logger sink. Defaults to console. */ readonly logger?: LoggingLogger; /** * Domains to log. Pass `'all'` for firehose (including consumer custom * events). Default: `['context', 'stream']` — the core debugging lens * (what went into the LLM, what came out). */ readonly domains?: readonly LoggingDomain[] | 'all'; /** Custom formatter. Default: `[domain.action]`. */ readonly format?: (event: AgentfootprintEvent) => string; } /** * Attach a logging subscription to the event dispatcher. * Returns an Unsubscribe — call to detach. */ export declare function attachLogging(dispatcher: EventDispatcher, options?: LoggingOptions): Unsubscribe;