import type { DaemonTelemetryRouteHandlers } from './context.js'; import { type AuthenticatedPrincipal } from './http-policy.js'; import type { RuntimeEventDomain } from '@pellux/goodvibes-contracts'; type TelemetrySeverity = 'debug' | 'info' | 'warn' | 'error'; type TelemetryViewMode = 'safe' | 'raw'; interface TelemetryFilter { readonly limit?: number | undefined; readonly since?: number | undefined; readonly until?: number | undefined; readonly domains?: readonly RuntimeEventDomain[] | undefined; readonly eventTypes?: readonly string[] | undefined; readonly severity?: TelemetrySeverity | undefined; readonly traceId?: string | undefined; readonly sessionId?: string | undefined; readonly turnId?: string | undefined; readonly agentId?: string | undefined; readonly taskId?: string | undefined; readonly cursor?: string | undefined; readonly view?: TelemetryViewMode | undefined; } interface TelemetryApiLike { getSnapshot(filter: TelemetryFilter, view: TelemetryViewMode, rawAccessible: boolean): { readonly generatedAt: number; readonly view: TelemetryViewMode; readonly rawAccessible: boolean; readonly runtime: unknown; readonly sessionMetrics: unknown; readonly aggregates: unknown; }; listEventPage(filter: TelemetryFilter, view: TelemetryViewMode, rawAccessible: boolean): unknown; listErrorPage(filter: TelemetryFilter, view: TelemetryViewMode, rawAccessible: boolean): unknown; listSpanPage(filter: TelemetryFilter, view: TelemetryViewMode, rawAccessible: boolean): unknown; createStream(req: Request, filter: TelemetryFilter, view: TelemetryViewMode, rawAccessible: boolean): Response; buildOtlpTraceDocument(filter: TelemetryFilter, view: TelemetryViewMode): unknown; buildOtlpLogDocument(filter: TelemetryFilter, view: TelemetryViewMode): unknown; buildOtlpMetricDocument(): unknown; } /** * Ingest sink, receives parsed OTLP records forwarded by the POST receivers. * When null (no ingest sink wired), the route still accepts and acknowledges * payloads (to keep client exporters happy) but discards the data. */ interface TelemetryIngestSink { /** Ingest a batch of log records from an OTLP ExportLogsServiceRequest. */ ingestLogs(payload: Record): void; /** Ingest a batch of trace spans from an OTLP ExportTraceServiceRequest. */ ingestTraces(payload: Record): void; /** Ingest a batch of metric data points from an OTLP ExportMetricsServiceRequest. */ ingestMetrics(payload: Record): void; } interface TelemetryRouteContext { readonly telemetryApi: TelemetryApiLike | null; readonly resolveAuthenticatedPrincipal: (req: Request) => AuthenticatedPrincipal | null; /** * Sink for OTLP POST receivers. Must be provided by the caller. * In production `DaemonHttpRouter` this is the `TelemetryApiService` instance * which stores ingested records in its bounded event buffer (default 500 * records) and makes them observable via GET /api/v1/telemetry/events. * Pass `null` only in test fixtures where ingestion is intentionally * a no-op, the receivers still return 200 to keep OTLP exporters happy but * discard the payload. */ readonly ingestSink: TelemetryIngestSink | null; } export declare function createDaemonTelemetryRouteHandlers(context: TelemetryRouteContext): DaemonTelemetryRouteHandlers; export {}; //# sourceMappingURL=telemetry-routes.d.ts.map