autotel-terminal 22.0.1 → 23.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/streaming-processor.ts","../src/span-stream.ts","../src/lib/trace-model.ts","../src/lib/format.ts","../src/lib/service-colors.ts","../src/lib/log-model.ts","../src/log-stream.ts","../src/lib/stats-model.ts","../src/lib/filters.ts","../src/lib/error-model.ts","../src/lib/topology-model.ts","../src/lib/topology-render.ts","../src/lib/export-model.ts","../src/ai/provider.ts","../src/ai/system-prompt.ts","../src/ai/tools.ts","../src/ai/stream.ts","../src/index.tsx","../src/listen.ts","../src/cli-stream.ts","../src/otlp-http-json.ts","../src/cli.ts"],"names":["SpanStatusCode","SpanKind","t","getServiceName","standardComponentDefinitions","tool","z","validateSpec","mod","useState","useRef","useEffect","useMemo","useStdin","useInput","jsxs","Box","jsx","Text","Fragment","InkRenderer","render","getAutotelTracerProvider","createServer","mapStatus","mapKind","path","readFileSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * Streaming Span Processor\n *\n * A span processor that emits ReadableSpan objects to subscribers.\n * This allows real-time streaming of spans to terminal dashboards and other consumers.\n *\n * @example Basic usage\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { BatchSpanProcessor } from 'autotel/processors'\n * import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\n *\n * const exporter = new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces' })\n * const baseProcessor = new BatchSpanProcessor(exporter)\n * const streamingProcessor = new StreamingSpanProcessor(baseProcessor)\n *\n * // Subscribe to spans\n * const unsubscribe = streamingProcessor.subscribe((span) => {\n * console.log('Span ended:', span.name)\n * })\n *\n * // Later, unsubscribe\n * unsubscribe()\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Span processor that wraps another processor and emits spans to subscribers\n *\n * This processor forwards all span operations to a wrapped processor while\n * also emitting completed spans to registered subscribers. This enables\n * real-time streaming of spans to terminal dashboards, loggers, or other\n * consumers without interfering with normal span processing.\n */\nexport class StreamingSpanProcessor implements SpanProcessor {\n private wrappedProcessor: SpanProcessor | null;\n private subscribers = new Set<(span: ReadableSpan) => void>();\n\n /**\n * Create a new streaming span processor\n *\n * @param wrappedProcessor - The processor to wrap and forward spans to.\n * If null, spans are only emitted to subscribers (no forwarding).\n */\n constructor(wrappedProcessor: SpanProcessor | null = null) {\n this.wrappedProcessor = wrappedProcessor;\n }\n\n onStart(span: Span, parentContext: Context): void {\n if (this.wrappedProcessor) {\n this.wrappedProcessor.onStart(span, parentContext);\n }\n }\n\n onEnd(span: ReadableSpan): void {\n // Emit to all subscribers first\n for (const subscriber of this.subscribers) {\n try {\n subscriber(span);\n } catch (error) {\n // Don't let subscriber errors break span processing\n console.error('[autotel-terminal] Subscriber error:', error);\n }\n }\n\n // Forward to wrapped processor\n if (this.wrappedProcessor) {\n this.wrappedProcessor.onEnd(span);\n }\n }\n\n /**\n * Subscribe to span end events\n *\n * @param callback - Function called when a span ends\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = processor.subscribe((span) => {\n * console.log('Span ended:', span.name)\n * })\n *\n * // Later, unsubscribe\n * unsubscribe()\n * ```\n */\n subscribe(callback: (span: ReadableSpan) => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n async forceFlush(): Promise<void> {\n if (this.wrappedProcessor) {\n return this.wrappedProcessor.forceFlush();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear subscribers\n this.subscribers.clear();\n if (this.wrappedProcessor) {\n return this.wrappedProcessor.shutdown();\n }\n }\n}\n","/**\n * Terminal Span Stream\n *\n * Converts OpenTelemetry ReadableSpan objects to TerminalSpanEvent format\n * for consumption by the terminal dashboard.\n */\n\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { SpanStatusCode, SpanKind } from 'autotel';\nimport type { StreamingSpanProcessor } from './streaming-processor';\n\n/** Span event (e.g. exception, log annotation) */\nexport interface SpanEvent {\n /** Event name */\n name: string;\n /** Time in milliseconds since epoch */\n timeMs: number;\n /** Event attributes */\n attributes?: Record<string, unknown>;\n}\n\n/** Span link (cross-trace reference) */\nexport interface SpanLink {\n /** Linked trace ID */\n traceId: string;\n /** Linked span ID */\n spanId: string;\n /** Link attributes */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Span event format for terminal dashboard consumption\n */\nexport interface TerminalSpanEvent {\n /** Span name */\n name: string;\n /** Span ID (hex string) */\n spanId: string;\n /** Trace ID (hex string) */\n traceId: string;\n /** Parent span ID (hex string, optional) */\n parentSpanId?: string;\n /** Start time in milliseconds since epoch */\n startTime: number;\n /** End time in milliseconds since epoch */\n endTime: number;\n /** Duration in milliseconds */\n durationMs: number;\n /** Span status */\n status: 'OK' | 'ERROR' | 'UNSET';\n /** Span kind (INTERNAL, SERVER, CLIENT, etc.) */\n kind?: string;\n /** Span attributes */\n attributes?: Record<string, unknown>;\n /** Span events (exceptions, annotations) */\n events?: SpanEvent[];\n /** Span links (cross-trace references) */\n links?: SpanLink[];\n}\n\n/**\n * Stream interface for terminal dashboard\n */\nexport interface TerminalSpanStream {\n /**\n * Subscribe to span end events\n *\n * @param callback - Called when a span ends\n * @returns Unsubscribe function\n */\n onSpanEnd(callback: (event: TerminalSpanEvent) => void): () => void;\n}\n\n/**\n * Convert OpenTelemetry time tuple to milliseconds\n */\nfunction timeToMs([seconds, nanoseconds]: [number, number]): number {\n return seconds * 1000 + nanoseconds / 1_000_000;\n}\n\n/**\n * Map SpanStatusCode to string\n */\nfunction mapStatus(code: SpanStatusCode): 'OK' | 'ERROR' | 'UNSET' {\n if (code === SpanStatusCode.OK) {\n return 'OK';\n }\n if (code === SpanStatusCode.ERROR) {\n return 'ERROR';\n }\n return 'UNSET';\n}\n\n/**\n * Map SpanKind number to string\n */\nfunction mapKind(kind: SpanKind): string {\n const kindMap: Record<number, string> = {\n [SpanKind.INTERNAL]: 'INTERNAL',\n [SpanKind.SERVER]: 'SERVER',\n [SpanKind.CLIENT]: 'CLIENT',\n [SpanKind.PRODUCER]: 'PRODUCER',\n [SpanKind.CONSUMER]: 'CONSUMER',\n };\n return kindMap[kind] ?? 'UNKNOWN';\n}\n\n/**\n * Create a terminal span stream from a streaming processor\n *\n * @param processor - The streaming span processor to subscribe to\n * @returns Terminal span stream interface\n *\n * @example\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n *\n * const processor = new StreamingSpanProcessor(baseProcessor)\n * const stream = createTerminalSpanStream(processor)\n *\n * stream.onSpanEnd((event) => {\n * console.log('Span:', event.name, event.durationMs + 'ms')\n * })\n * ```\n */\nexport function createTerminalSpanStream(\n processor: StreamingSpanProcessor,\n): TerminalSpanStream {\n return {\n onSpanEnd(callback) {\n return processor.subscribe((span: ReadableSpan) => {\n const spanContext = span.spanContext();\n // parentSpanId is not part of the standard ReadableSpan interface\n // but some implementations (like Node.js SDK) include it\n const parentSpanId =\n 'parentSpanId' in span && typeof span.parentSpanId === 'string'\n ? span.parentSpanId\n : undefined;\n\n // Convert time tuples to milliseconds\n const startTime = timeToMs(span.startTime);\n const endTime = timeToMs(span.endTime);\n const durationMs = endTime - startTime;\n\n // Merge resource attributes (e.g. service.name) with span attributes\n const resourceAttrs = (span.resource?.attributes ?? {}) as Record<\n string,\n unknown\n >;\n const spanAttrs = span.attributes as Record<string, unknown>;\n const mergedAttrs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(resourceAttrs)) {\n mergedAttrs[k] = v;\n }\n for (const [k, v] of Object.entries(spanAttrs)) {\n mergedAttrs[k] = v;\n }\n\n const spanEvents: SpanEvent[] | undefined = span.events?.length\n ? span.events.map((e) => ({\n name: e.name,\n timeMs: timeToMs(e.time),\n attributes: e.attributes as Record<string, unknown> | undefined,\n }))\n : undefined;\n\n const spanLinks: SpanLink[] | undefined = span.links?.length\n ? span.links.map((l) => ({\n traceId: l.context.traceId,\n spanId: l.context.spanId,\n attributes: l.attributes as Record<string, unknown> | undefined,\n }))\n : undefined;\n\n // Create terminal event\n const event: TerminalSpanEvent = {\n name: span.name,\n spanId: spanContext.spanId,\n traceId: spanContext.traceId,\n parentSpanId,\n startTime,\n endTime,\n durationMs,\n status: mapStatus(span.status.code),\n kind: mapKind(span.kind),\n attributes: mergedAttrs,\n ...(spanEvents ? { events: spanEvents } : {}),\n ...(spanLinks ? { links: spanLinks } : {}),\n };\n\n callback(event);\n });\n },\n };\n}\n","/**\n * Trace model utilities - pure logic for trace grouping, tree building, and filtering.\n * Kept in lib/ for testability; no React or Ink.\n */\n\nimport type { TerminalSpanEvent } from '../span-stream';\n\n/** Extract service name from span attributes */\nexport function spanServiceName(span: TerminalSpanEvent): string {\n const svc = span.attributes?.['service.name'];\n return typeof svc === 'string' ? svc : 'unknown';\n}\n\n/** Trace summary for the \"Recent traces\" list */\nexport interface TraceSummary {\n traceId: string;\n rootName: string;\n durationMs: number;\n hasError: boolean;\n spanCount: number;\n lastEndTime: number;\n spans: TerminalSpanEvent[];\n services: string[];\n}\n\n/** Tree node for indented span tree (parent/child) */\nexport interface SpanTreeNode {\n span: TerminalSpanEvent;\n depth: number;\n children: SpanTreeNode[];\n}\n\n/** Span with depth for waterfall (sorted by startTime, then depth) */\nexport interface SpanWithDepth {\n span: TerminalSpanEvent;\n depth: number;\n}\n\n/** Aggregate stats over spans */\nexport interface SpanStats {\n total: number;\n errors: number;\n avg: number;\n p95: number;\n}\n\n/** Per-span-name stats for \"3x slower than average\" */\nexport interface PerSpanNameStats {\n byName: Map<string, { count: number; totalMs: number; avgMs: number }>;\n}\n\n/**\n * Build a map traceId -> spans[] from a flat list of spans.\n * Traces are ordered by most recent span end time (latest first).\n */\nexport function buildTraceMap(\n spans: TerminalSpanEvent[],\n maxTraces = 50,\n): Map<string, TerminalSpanEvent[]> {\n const byTrace = new Map<string, TerminalSpanEvent[]>();\n for (const s of spans) {\n const list = byTrace.get(s.traceId) ?? [];\n list.push(s);\n byTrace.set(s.traceId, list);\n }\n // Sort traces by latest span end time (desc)\n const entries = [...byTrace.entries()].toSorted((a, b) => {\n const maxA = Math.max(...a[1].map((x) => x.endTime));\n const maxB = Math.max(...b[1].map((x) => x.endTime));\n return maxB - maxA;\n });\n const limited = entries.slice(0, maxTraces);\n return new Map(limited);\n}\n\n/**\n * Build a trace summary for the \"Recent traces\" list.\n * Root = span with no parentSpanId or parent not in this trace; duration = root duration or max end - min start.\n */\nexport function buildTraceSummaries(\n traceMap: Map<string, TerminalSpanEvent[]>,\n): TraceSummary[] {\n const summaries: TraceSummary[] = [];\n for (const [traceId, traceSpans] of traceMap) {\n const spanIds = new Set(traceSpans.map((s) => s.spanId));\n const root =\n traceSpans.find((s) => !s.parentSpanId || !spanIds.has(s.parentSpanId)) ??\n traceSpans[0];\n const durationMs = root ? root.durationMs : 0;\n const hasError = traceSpans.some((s) => s.status === 'ERROR');\n const lastEndTime = Math.max(...traceSpans.map((s) => s.endTime));\n const services = [...new Set(traceSpans.map((s) => spanServiceName(s)))];\n summaries.push({\n traceId,\n rootName: root?.name ?? 'unknown',\n durationMs,\n hasError,\n spanCount: traceSpans.length,\n lastEndTime,\n spans: traceSpans,\n services,\n });\n }\n return summaries;\n}\n\n/**\n * Build a parent-child tree from spans of one trace.\n * Root = span with no parentSpanId (or parent not in list); children by parentSpanId.\n */\nexport function buildTraceTree(spans: TerminalSpanEvent[]): SpanTreeNode[] {\n const byId = new Map<string, TerminalSpanEvent>();\n for (const s of spans) {\n byId.set(s.spanId, s);\n }\n const roots: SpanTreeNode[] = [];\n\n function addNode(span: TerminalSpanEvent, depth: number): SpanTreeNode {\n const children = spans\n .filter((s) => s.parentSpanId === span.spanId)\n .map((s) => addNode(s, depth + 1));\n return { span, depth, children };\n }\n\n const rootSpans = spans.filter(\n (s) => !s.parentSpanId || !byId.has(s.parentSpanId),\n );\n for (const s of rootSpans) {\n roots.push(addNode(s, 0));\n }\n return roots;\n}\n\n/**\n * Flatten tree to list for display (pre-order: root, then children).\n */\nexport function flattenTraceTree(nodes: SpanTreeNode[]): SpanTreeNode[] {\n const out: SpanTreeNode[] = [];\n function walk(n: SpanTreeNode) {\n out.push(n);\n for (const c of n.children) walk(c);\n }\n for (const n of nodes) walk(n);\n return out;\n}\n\n/**\n * Sort spans for waterfall: by startTime, then by depth (parent before children at same time).\n */\nexport function sortSpansForWaterfall(\n spans: TerminalSpanEvent[],\n): SpanWithDepth[] {\n const byId = new Map<string, TerminalSpanEvent>();\n for (const s of spans) byId.set(s.spanId, s);\n\n function depth(s: TerminalSpanEvent): number {\n if (!s.parentSpanId || !byId.has(s.parentSpanId)) return 0;\n const parent = byId.get(s.parentSpanId)!;\n return 1 + depth(parent);\n }\n\n const withDepth = spans.map((s) => ({ span: s, depth: depth(s) }));\n withDepth.sort((a, b) => {\n if (a.span.startTime !== b.span.startTime)\n return a.span.startTime - b.span.startTime;\n return a.depth - b.depth;\n });\n return withDepth;\n}\n\n/**\n * Filter spans by search query (substring match on name) and optional errors-only.\n */\nexport function filterBySearch(\n spans: TerminalSpanEvent[],\n searchQuery: string,\n errorsOnly: boolean,\n): TerminalSpanEvent[] {\n let list = spans;\n if (errorsOnly) list = list.filter((s) => s.status === 'ERROR');\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n return list.filter((s) => s.name.toLowerCase().includes(q));\n}\n\n/**\n * Filter trace summaries: include trace if any span name matches search (or search empty) and optionally has error.\n */\nexport function filterTraceSummaries(\n summaries: TraceSummary[],\n searchQuery: string,\n errorsOnly: boolean,\n): TraceSummary[] {\n let list = summaries;\n if (errorsOnly) list = list.filter((s) => s.hasError);\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n return list.filter((s) =>\n s.spans.some((sp) => sp.name.toLowerCase().includes(q)),\n );\n}\n\n/**\n * Compute aggregate stats over spans.\n */\nexport function computeStats(spans: TerminalSpanEvent[]): SpanStats {\n const total = spans.length;\n const errors = spans.filter((s) => s.status === 'ERROR').length;\n const avg = total ? spans.reduce((a, s) => a + s.durationMs, 0) / total : 0;\n const p95 = total\n ? (() => {\n const sorted = spans.map((s) => s.durationMs).toSorted((a, b) => a - b);\n return sorted[Math.floor(sorted.length * 0.95)] ?? 0;\n })()\n : 0;\n return { total, errors, avg, p95 };\n}\n\n/**\n * Compute per-span-name stats for \"Nx slower than average\".\n */\nexport function computePerSpanNameStats(\n spans: TerminalSpanEvent[],\n): PerSpanNameStats {\n const byName = new Map<string, { count: number; totalMs: number }>();\n for (const s of spans) {\n const cur = byName.get(s.name) ?? { count: 0, totalMs: 0 };\n cur.count += 1;\n cur.totalMs += s.durationMs;\n byName.set(s.name, cur);\n }\n const result = new Map<\n string,\n { count: number; totalMs: number; avgMs: number }\n >();\n for (const [name, { count, totalMs }] of byName) {\n result.set(name, { count, totalMs, avgMs: totalMs / count });\n }\n return { byName: result };\n}\n","/**\n * Format utilities - duration, relative time, truncation.\n * Pure functions for testability.\n */\n\n/**\n * Format duration: ms or seconds with 2 decimals.\n */\nexport function formatDurationMs(n: number): string {\n if (n < 1000) return `${n.toFixed(0)}ms`;\n return `${(n / 1000).toFixed(2)}s`;\n}\n\n/**\n * Format relative time: \"just now\" | \"Ns ago\" | \"Nm ago\" | \"Nh ago\".\n */\nexport function formatRelative(epochMs: number): string {\n const now = Date.now();\n const diffMs = now - epochMs;\n if (diffMs < 0) return 'just now';\n if (diffMs < 1000) return 'just now';\n if (diffMs < 60_000) return `${Math.floor(diffMs / 1000)}s ago`;\n if (diffMs < 3_600_000) return `${Math.floor(diffMs / 60_000)}m ago`;\n return `${Math.floor(diffMs / 3_600_000)}h ago`;\n}\n\n/**\n * Truncate string with ellipsis.\n */\nexport function truncate(s: string, width: number): string {\n if (s.length <= width) return s;\n return s.slice(0, Math.max(0, width - 1)) + '…';\n}\n\n/**\n * Build a fixed-width waterfall bar string.\n * The bar is positioned proportionally within the total width\n * based on the span's start offset and duration relative to the trace.\n */\nexport function buildWaterfallBar(\n spanStart: number,\n spanDuration: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): string {\n if (width <= 0) return '';\n if (traceDuration <= 0) return ' '.repeat(width);\n const offsetRatio = (spanStart - traceStart) / traceDuration;\n const widthRatio = spanDuration / traceDuration;\n const barStart = Math.max(0, Math.floor(offsetRatio * width));\n const barLen = Math.max(1, Math.round(widthRatio * width));\n const clampedStart = Math.min(barStart, width - 1);\n const clampedLen = Math.min(barLen, width - clampedStart);\n const trailing = Math.max(0, width - clampedStart - clampedLen);\n return (\n ' '.repeat(clampedStart) + '█'.repeat(clampedLen) + ' '.repeat(trailing)\n );\n}\n\n/**\n * Build a fixed-width time ruler string.\n * Format: \"0ms 500ms 1000ms\"\n */\nexport function buildTimeRuler(totalMs: number, width: number): string {\n if (width <= 0) return '';\n if (width < 10) return ' '.repeat(width);\n const left = '0ms';\n const right = formatDurationMs(totalMs);\n const mid = formatDurationMs(totalMs / 2);\n const midPos = Math.floor(width / 2) - Math.floor(mid.length / 2);\n const rightPos = width - right.length;\n\n const chars = Array.from<string>({ length: width }).fill(' ');\n // place left\n for (let i = 0; i < left.length && i < width; i++) chars[i] = left[i];\n // place mid (if room)\n if (midPos > left.length + 1 && midPos + mid.length < rightPos - 1) {\n for (let i = 0; i < mid.length; i++) chars[midPos + i] = mid[i];\n }\n // place right\n for (let i = 0; i < right.length; i++) chars[rightPos + i] = right[i];\n return chars.join('');\n}\n\n/**\n * Compute marker column positions for event times on a waterfall bar.\n */\nexport function computeMarkerPositions(\n markerTimesMs: number[],\n spanStart: number,\n spanEnd: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): number[] {\n if (width <= 0 || traceDuration <= 0 || markerTimesMs.length === 0) return [];\n return markerTimesMs.map((t) => {\n const ratio = (t - traceStart) / traceDuration;\n const col = Math.floor(ratio * width);\n return Math.max(0, Math.min(col, width - 1));\n });\n}\n\n/**\n * Build a waterfall bar string with event markers overlaid as ◆.\n */\nexport function buildWaterfallBarWithMarkers(\n markerTimesMs: number[],\n spanStart: number,\n spanDuration: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): string {\n const bar = buildWaterfallBar(\n spanStart,\n spanDuration,\n traceStart,\n traceDuration,\n width,\n );\n if (markerTimesMs.length === 0 || width <= 0) return bar;\n const positions = computeMarkerPositions(\n markerTimesMs,\n spanStart,\n spanStart + spanDuration,\n traceStart,\n traceDuration,\n width,\n );\n const chars = [...bar];\n for (const pos of positions) {\n chars[pos] = '◆';\n }\n return chars.join('');\n}\n\n/**\n * Adjust a panel split percentage by a delta, clamped to [20, 80].\n */\nexport function adjustPanelSplit(\n current: number,\n delta: number,\n min = 20,\n max = 80,\n): number {\n return Math.max(min, Math.min(max, current + delta));\n}\n","/**\n * Deterministic service-name → terminal color mapping.\n * Hash the name, pick from a palette. Same service always gets same color.\n */\n\nexport const SERVICE_COLORS = [\n 'cyan',\n 'magenta',\n 'blue',\n 'yellow',\n 'green',\n 'redBright',\n 'cyanBright',\n 'magentaBright',\n 'blueBright',\n 'yellowBright',\n 'greenBright',\n] as const;\n\nexport type ServiceColor = (typeof SERVICE_COLORS)[number];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = Math.trunc((hash << 5) - hash + s.codePointAt(i)!);\n }\n return Math.abs(hash);\n}\n\nexport function getServiceColor(serviceName: string): ServiceColor {\n return SERVICE_COLORS[hashString(serviceName) % SERVICE_COLORS.length];\n}\n","/**\n * Log model utilities - pure logic for log grouping, filtering, and timelines.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Log event format for terminal dashboard consumption.\n * Designed to align with Autotel canonical log lines / request-logger output.\n */\nexport interface TerminalLogEvent {\n /** Log timestamp in milliseconds since epoch */\n time: number;\n /** Log level */\n level: LogLevel;\n /** Short message */\n message: string;\n /** Optional trace correlation */\n traceId?: string;\n /** Optional span correlation */\n spanId?: string;\n /** Structured attributes / fields */\n attributes?: Record<string, unknown>;\n}\n\n/** Aggregate stats over logs */\nexport interface LogStats {\n total: number;\n errors: number;\n}\n\n/** Combined span/log timeline item for a single trace */\nexport type TimelineItemType = 'span' | 'log';\n\nexport interface TimelineItem<TSpan> {\n type: TimelineItemType;\n time: number;\n span?: TSpan;\n log?: TerminalLogEvent;\n}\n\n/**\n * Filter logs by search query and optional level threshold.\n * Search matches message and flattened stringified attributes.\n */\nexport function filterLogsBySearch(\n logs: TerminalLogEvent[],\n searchQuery: string,\n minLevel: LogLevel | null,\n): TerminalLogEvent[] {\n let list = logs;\n\n if (minLevel) {\n const order: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minIdx = order.indexOf(minLevel);\n list =\n minIdx === -1\n ? list\n : list.filter((log) => order.indexOf(log.level) >= minIdx);\n }\n\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n\n return list.filter((log) => {\n if (log.message.toLowerCase().includes(q)) return true;\n if (log.attributes) {\n for (const [k, v] of Object.entries(log.attributes)) {\n const s = `${k}:${String(v)}`.toLowerCase();\n if (s.includes(q)) return true;\n }\n }\n return false;\n });\n}\n\n/**\n * Compute simple aggregate stats over logs.\n */\nexport function computeLogStats(logs: TerminalLogEvent[]): LogStats {\n const total = logs.length;\n const errors = logs.filter((l) => l.level === 'error').length;\n return { total, errors };\n}\n\n/**\n * Build a combined span/log timeline for a single trace.\n * Spans must include { startTime, endTime }; logs are positioned by time.\n */\nexport function buildTraceTimeline<\n TSpan extends { startTime: number; endTime: number },\n>(spans: TSpan[], logs: TerminalLogEvent[]): TimelineItem<TSpan>[] {\n const items: TimelineItem<TSpan>[] = [];\n\n for (const span of spans) {\n items.push({\n type: 'span',\n time: span.startTime,\n span,\n });\n }\n\n for (const log of logs) {\n items.push({\n type: 'log',\n time: log.time,\n log,\n });\n }\n\n items.sort((a, b) => a.time - b.time);\n return items;\n}\n","import type { TerminalLogEvent } from './lib/log-model';\n\n/**\n * Stream interface for terminal log events.\n */\nexport interface TerminalLogStream {\n /**\n * Subscribe to log events.\n *\n * @param callback - Called when a log event is emitted\n * @returns Unsubscribe function\n */\n onLog(callback: (event: TerminalLogEvent) => void): () => void;\n}\n\n/**\n * Internal in-memory implementation used for the global log stream.\n */\nclass InMemoryTerminalLogStream implements TerminalLogStream {\n private subscribers = new Set<(event: TerminalLogEvent) => void>();\n\n onLog(callback: (event: TerminalLogEvent) => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n emit(event: TerminalLogEvent): void {\n for (const subscriber of this.subscribers) {\n try {\n subscriber(event);\n } catch (error) {\n console.error('[autotel-terminal] Log subscriber error:', error);\n }\n }\n }\n}\n\nlet globalLogStream: InMemoryTerminalLogStream | null = null;\n\n/**\n * Get or create the global terminal log stream.\n *\n * This is intended to be used from Autotel canonical log line drains\n * or request logger hooks:\n *\n * ```ts\n * import { getTerminalLogStream } from 'autotel-terminal';\n *\n * const logStream = getTerminalLogStream();\n * logStream.emit({\n * time: Date.now(),\n * level: 'info',\n * message: 'request completed',\n * traceId,\n * spanId,\n * attributes: { route: '/users/:id', status: 200 },\n * });\n * ```\n */\nexport function getTerminalLogStream(): InMemoryTerminalLogStream {\n if (!globalLogStream) {\n globalLogStream = new InMemoryTerminalLogStream();\n }\n return globalLogStream;\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface ServiceStats {\n serviceName: string;\n total: number;\n errors: number;\n avgMs: number;\n p95Ms: number;\n}\n\nexport interface HotSpan {\n name: string;\n avgMs: number;\n p95Ms: number;\n count: number;\n}\n\nexport interface RouteStats {\n route: string;\n total: number;\n errors: number;\n avgMs: number;\n p95Ms: number;\n}\n\nexport function computeServiceStats(\n spans: TerminalSpanEvent[],\n): ServiceStats[] {\n const byService = new Map<\n string,\n { durations: number[]; total: number; errors: number }\n >();\n\n for (const span of spans) {\n const attrs = span.attributes ?? {};\n const serviceName =\n (attrs['service.name'] as string | undefined) ?? 'unknown';\n const entry = byService.get(serviceName) ?? {\n durations: [],\n total: 0,\n errors: 0,\n };\n entry.total += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errors += 1;\n byService.set(serviceName, entry);\n }\n\n const stats: ServiceStats[] = [];\n for (const [serviceName, { durations, total, errors }] of byService) {\n if (total === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n stats.push({ serviceName, total, errors, avgMs, p95Ms });\n }\n\n stats.sort((a, b) => b.total - a.total);\n return stats;\n}\n\nexport function computeRouteStats(spans: TerminalSpanEvent[]): RouteStats[] {\n const byRoute = new Map<\n string,\n { durations: number[]; total: number; errors: number }\n >();\n\n for (const span of spans) {\n const attrs = span.attributes ?? {};\n const route = (attrs['http.route'] as string | undefined) ?? null;\n if (!route) continue;\n\n const entry = byRoute.get(route) ?? {\n durations: [],\n total: 0,\n errors: 0,\n };\n entry.total += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errors += 1;\n byRoute.set(route, entry);\n }\n\n const stats: RouteStats[] = [];\n for (const [route, { durations, total, errors }] of byRoute) {\n if (total === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n stats.push({ route, total, errors, avgMs, p95Ms });\n }\n\n stats.sort((a, b) => b.total - a.total);\n return stats;\n}\n\nexport function findHotSpanNames(\n spans: TerminalSpanEvent[],\n topN: number,\n): HotSpan[] {\n const byName = new Map<string, number[]>();\n for (const span of spans) {\n const list = byName.get(span.name) ?? [];\n list.push(span.durationMs);\n byName.set(span.name, list);\n }\n\n const hot: HotSpan[] = [];\n for (const [name, durations] of byName) {\n if (durations.length === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n hot.push({ name, avgMs, p95Ms, count: durations.length });\n }\n\n hot.sort((a, b) => b.p95Ms - a.p95Ms);\n return hot.slice(0, topN);\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface AvailableFilters {\n serviceNames: string[];\n routes: string[];\n statusCodes: number[];\n}\n\nexport interface SpanFilterState {\n serviceName?: string;\n route?: string;\n statusGroup?: 'all' | '2xx' | '4xx' | '5xx';\n errorsOnly?: boolean;\n searchQuery?: string;\n traceId?: string;\n}\n\nfunction getServiceName(span: TerminalSpanEvent): string | undefined {\n const attrs = span.attributes ?? {};\n return (attrs['service.name'] as string | undefined) ?? undefined;\n}\n\nfunction getRoute(span: TerminalSpanEvent): string | undefined {\n const attrs = span.attributes ?? {};\n return (attrs['http.route'] as string | undefined) ?? undefined;\n}\n\nfunction getStatusCode(span: TerminalSpanEvent): number | undefined {\n const attrs = span.attributes ?? {};\n const code = attrs['http.status_code'];\n if (typeof code === 'number') return code;\n if (typeof code === 'string') {\n const n = Number(code);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\nexport function deriveAvailableFilters(\n spans: TerminalSpanEvent[],\n): AvailableFilters {\n const serviceSet = new Set<string>();\n const routeSet = new Set<string>();\n const statusSet = new Set<number>();\n\n for (const span of spans) {\n const svc = getServiceName(span);\n if (svc) serviceSet.add(svc);\n const route = getRoute(span);\n if (route) routeSet.add(route);\n const status = getStatusCode(span);\n if (typeof status === 'number') statusSet.add(status);\n }\n\n return {\n serviceNames: [...serviceSet].toSorted(),\n routes: [...routeSet].toSorted(),\n statusCodes: [...statusSet].toSorted((a, b) => a - b),\n };\n}\n\nexport function applySpanFilters(\n spans: TerminalSpanEvent[],\n state: SpanFilterState,\n): TerminalSpanEvent[] {\n const { serviceName, route, statusGroup, errorsOnly, searchQuery, traceId } =\n state;\n const q = searchQuery?.trim().toLowerCase() ?? '';\n\n return spans.filter((span) => {\n const attrs = span.attributes ?? {};\n\n if (traceId && span.traceId !== traceId) return false;\n\n if (errorsOnly && span.status !== 'ERROR') return false;\n\n if (serviceName) {\n const svc = getServiceName(span);\n if (svc !== serviceName) return false;\n }\n\n if (route) {\n const r = getRoute(span);\n if (r !== route) return false;\n }\n\n if (statusGroup && statusGroup !== 'all') {\n const code = getStatusCode(span);\n if (!code) return false;\n if (statusGroup === '2xx' && (code < 200 || code >= 300)) return false;\n if (statusGroup === '4xx' && (code < 400 || code >= 500)) return false;\n if (statusGroup === '5xx' && (code < 500 || code >= 600)) return false;\n }\n\n if (q) {\n const nameMatch = span.name.toLowerCase().includes(q);\n const attrMatch = Object.entries(attrs).some(([k, v]) =>\n `${k}:${String(v)}`.toLowerCase().includes(q),\n );\n if (!nameMatch && !attrMatch) return false;\n }\n\n return true;\n });\n}\n","import type { TerminalSpanEvent } from '../span-stream';\nimport type { TraceSummary } from './trace-model';\n\nexport interface ErrorSummary {\n traceId: string;\n rootName: string;\n serviceName: string;\n route?: string;\n statusCode?: number;\n errorCount: number;\n lastEndTime: number;\n}\n\nfunction getServiceNameFromSpans(spans: TerminalSpanEvent[]): string {\n for (const span of spans) {\n const svc = span.attributes?.['service.name'];\n if (typeof svc === 'string' && svc.trim()) return svc;\n }\n return 'unknown';\n}\n\nfunction getRouteFromSpans(spans: TerminalSpanEvent[]): string | undefined {\n for (const span of spans) {\n const route = span.attributes?.['http.route'];\n if (typeof route === 'string' && route.trim()) return route;\n }\n return undefined;\n}\n\nfunction getStatusCodeFromSpans(\n spans: TerminalSpanEvent[],\n): number | undefined {\n for (const span of spans) {\n const code = span.attributes?.['http.status_code'];\n if (typeof code === 'number') return code;\n if (typeof code === 'string') {\n const n = Number(code);\n if (Number.isFinite(n)) return n;\n }\n }\n return undefined;\n}\n\nexport function buildErrorSummaries(\n traceSummaries: TraceSummary[],\n): ErrorSummary[] {\n const out: ErrorSummary[] = [];\n\n for (const t of traceSummaries) {\n const errorSpans = t.spans.filter((s) => s.status === 'ERROR');\n if (errorSpans.length === 0) continue;\n\n out.push({\n traceId: t.traceId,\n rootName: t.rootName,\n serviceName: getServiceNameFromSpans(t.spans),\n route: getRouteFromSpans(t.spans),\n statusCode: getStatusCodeFromSpans(t.spans),\n errorCount: errorSpans.length,\n lastEndTime: t.lastEndTime,\n });\n }\n\n out.sort((a, b) => b.lastEndTime - a.lastEndTime);\n return out;\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface ServiceNode {\n serviceName: string;\n spanCount: number;\n errorCount: number;\n avgDurationMs: number;\n p95DurationMs: number;\n}\n\nexport interface ServiceEdge {\n fromService: string;\n toService: string;\n spanCount: number;\n errorCount: number;\n}\n\nexport interface ServiceGraph {\n services: ServiceNode[];\n edges: ServiceEdge[];\n}\n\nfunction getServiceName(span: TerminalSpanEvent): string {\n const attrs = span.attributes ?? {};\n const serviceName =\n (attrs['service.name'] as string | undefined) ??\n (attrs['resource.service.name'] as string | undefined);\n return serviceName || 'unknown';\n}\n\nfunction getPeerService(span: TerminalSpanEvent): string | null {\n const attrs = span.attributes ?? {};\n const peerService =\n (attrs['peer.service'] as string | undefined) ??\n (attrs['db.system'] as string | undefined) ??\n (attrs['messaging.system'] as string | undefined) ??\n (attrs['http.host'] as string | undefined);\n return peerService ?? null;\n}\n\nexport function buildServiceGraph(spans: TerminalSpanEvent[]): ServiceGraph {\n const byService = new Map<\n string,\n { durations: number[]; spanCount: number; errorCount: number }\n >();\n\n for (const span of spans) {\n const svc = getServiceName(span);\n const entry = byService.get(svc) ?? {\n durations: [],\n spanCount: 0,\n errorCount: 0,\n };\n entry.spanCount += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errorCount += 1;\n byService.set(svc, entry);\n }\n\n const services: ServiceNode[] = [];\n for (const [serviceName, { durations, spanCount, errorCount }] of byService) {\n if (spanCount === 0) continue;\n const avgDurationMs =\n durations.reduce((acc, d) => acc + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95DurationMs = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n services.push({\n serviceName,\n spanCount,\n errorCount,\n avgDurationMs,\n p95DurationMs,\n });\n }\n\n const byEdge = new Map<string, { spanCount: number; errorCount: number }>();\n\n for (const span of spans) {\n const to = getPeerService(span);\n if (!to) continue;\n const from = getServiceName(span);\n const key = `${from}→${to}`;\n const entry = byEdge.get(key) ?? { spanCount: 0, errorCount: 0 };\n entry.spanCount += 1;\n if (span.status === 'ERROR') entry.errorCount += 1;\n byEdge.set(key, entry);\n }\n\n const edges: ServiceEdge[] = [];\n for (const [key, { spanCount, errorCount }] of byEdge) {\n const [fromService, toService] = key.split('→');\n edges.push({ fromService, toService, spanCount, errorCount });\n }\n\n services.sort((a, b) => b.spanCount - a.spanCount);\n edges.sort((a, b) => b.spanCount - a.spanCount);\n\n return { services, edges };\n}\n","import type { ServiceGraph, ServiceEdge } from './topology-model';\nimport { formatDurationMs } from './format';\n\n/**\n * Render a service graph as ASCII lines for terminal display.\n *\n * Layout: root services at top, downstream services below with edges.\n * Recursively traverses the full dependency tree.\n * Each service shows: name, span count, error rate, p95 latency.\n * Each edge shows: call count and error count.\n */\nexport function renderTopologyAscii(graph: ServiceGraph): string[] {\n if (graph.services.length === 0) {\n return [' No services detected yet.'];\n }\n\n // Find root services (not a target of any edge)\n const targetServices = new Set(graph.edges.map((e) => e.toService));\n const roots = graph.services.filter(\n (s) => !targetServices.has(s.serviceName),\n );\n // If no clear roots (cycle), use all services sorted by span count\n const rootList = roots.length > 0 ? roots : [...graph.services];\n\n const lines: string[] = [];\n\n for (const root of rootList) {\n renderNode(graph, root.serviceName, '', true, lines, new Set());\n }\n\n return lines;\n}\n\nfunction renderNode(\n graph: ServiceGraph,\n serviceName: string,\n prefix: string,\n isRoot: boolean,\n lines: string[],\n ancestors: Set<string>,\n): void {\n const svc = graph.services.find((s) => s.serviceName === serviceName);\n const label = svc ? formatServiceLine(svc) : `[${serviceName}]`;\n\n if (isRoot) {\n lines.push(label);\n }\n\n // Don't recurse into ancestors on the current path (cycle protection)\n if (ancestors.has(serviceName)) return;\n const pathAncestors = new Set(ancestors);\n pathAncestors.add(serviceName);\n\n const outgoing = graph.edges.filter((e) => e.fromService === serviceName);\n\n for (let i = 0; i < outgoing.length; i++) {\n const edge = outgoing[i];\n const isLast = i === outgoing.length - 1;\n const connector = isLast ? '└' : '├';\n const childPrefix = isLast ? ' ' : '│ ';\n const downstream = graph.services.find(\n (s) => s.serviceName === edge.toService,\n );\n const edgeLabel = formatEdgeLabel(edge);\n const downstreamLabel = downstream\n ? formatServiceLine(downstream)\n : `[${edge.toService}]`;\n\n lines.push(`${prefix} ${connector}──${edgeLabel}──→ ${downstreamLabel}`);\n\n // Recurse into downstream service\n renderNode(\n graph,\n edge.toService,\n prefix + ' ' + childPrefix,\n false,\n lines,\n pathAncestors,\n );\n }\n}\n\nfunction formatServiceLine(svc: {\n serviceName: string;\n spanCount: number;\n errorCount: number;\n p95DurationMs: number;\n}): string {\n const errPart = svc.errorCount > 0 ? ` · ${svc.errorCount} err` : '';\n return `[${svc.serviceName}] ${svc.spanCount} spans${errPart} · p95 ${formatDurationMs(svc.p95DurationMs)}`;\n}\n\nfunction formatEdgeLabel(edge: ServiceEdge): string {\n const errPart = edge.errorCount > 0 ? `, ${edge.errorCount} err` : '';\n return `(${edge.spanCount}${errPart})`;\n}\n","import type { TraceSummary } from './trace-model';\nimport type { TerminalLogEvent } from './log-model';\n\nexport interface ExportedTrace {\n traceId: string;\n rootName: string;\n durationMs: number;\n lastEndTime: number;\n spans: Array<{\n name: string;\n spanId: string;\n parentSpanId?: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n status: string;\n kind?: string;\n attributes?: Record<string, unknown>;\n }>;\n logs: Array<{\n time: number;\n level: string;\n message: string;\n traceId?: string;\n spanId?: string;\n attributes?: Record<string, unknown>;\n }>;\n}\n\nexport function exportTraceToJson(\n trace: TraceSummary,\n logs: TerminalLogEvent[],\n): string {\n const exported: ExportedTrace = {\n traceId: trace.traceId,\n rootName: trace.rootName,\n durationMs: trace.durationMs,\n lastEndTime: trace.lastEndTime,\n spans: trace.spans.map((s) => ({\n name: s.name,\n spanId: s.spanId,\n parentSpanId: s.parentSpanId,\n startTime: s.startTime,\n endTime: s.endTime,\n durationMs: s.durationMs,\n status: s.status,\n kind: s.kind,\n attributes: s.attributes,\n })),\n logs: logs.map((l) => ({\n time: l.time,\n level: l.level,\n message: l.message,\n traceId: l.traceId,\n spanId: l.spanId,\n attributes: l.attributes,\n })),\n };\n\n return JSON.stringify(exported, null, 2);\n}\n","import type { LanguageModel } from 'ai';\nimport type { AIConfig, AIProviderType } from './types';\n\nexport async function detectOllama(\n baseUrl = 'http://127.0.0.1:11434',\n): Promise<boolean> {\n try {\n const res = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(1000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function resolveConfig(\n options: Partial<AIConfig> = {},\n): AIConfig | null {\n const provider: AIProviderType | undefined =\n options.provider ??\n (process.env.AI_PROVIDER as AIProviderType | undefined) ??\n undefined;\n\n const model = options.model ?? process.env.AI_MODEL;\n const apiKey =\n options.apiKey ??\n process.env.AI_API_KEY ??\n (provider === 'openai' ? process.env.OPENAI_API_KEY : undefined);\n const baseUrl = options.baseUrl ?? process.env.AI_BASE_URL;\n\n if (provider) {\n return {\n provider,\n model: model ?? (provider === 'ollama' ? 'granite4' : 'gpt-4o'),\n apiKey,\n baseUrl,\n };\n }\n\n // Will be resolved async in resolveConfigWithAutoDetect\n return null;\n}\n\nconst defaultAutoDetectDeps = { detectOllama };\n\nexport async function resolveConfigWithAutoDetect(\n options: Partial<AIConfig> = {},\n deps: { detectOllama: typeof detectOllama } = defaultAutoDetectDeps,\n): Promise<AIConfig | null> {\n const config = resolveConfig(options);\n if (config) return config;\n\n // Auto-detect: check Ollama first\n const ollamaUrl =\n options.baseUrl ?? process.env.AI_BASE_URL ?? 'http://127.0.0.1:11434';\n if (await deps.detectOllama(ollamaUrl)) {\n return {\n provider: 'ollama',\n model: options.model ?? process.env.AI_MODEL ?? 'granite4',\n baseUrl: ollamaUrl,\n };\n }\n\n // Check for OpenAI key\n const openaiKey =\n options.apiKey ?? process.env.AI_API_KEY ?? process.env.OPENAI_API_KEY;\n if (openaiKey) {\n return {\n provider: 'openai',\n model: options.model ?? process.env.AI_MODEL ?? 'gpt-4o',\n apiKey: openaiKey,\n };\n }\n\n return null;\n}\n\nexport type AIModelResult = {\n model: LanguageModel;\n providerType: AIProviderType;\n config: AIConfig;\n};\n\nexport async function createAIModel(config: AIConfig): Promise<AIModelResult> {\n switch (config.provider) {\n case 'ollama': {\n const { createOllama } = await import('ai-sdk-ollama');\n const ollama = createOllama({\n baseURL: config.baseUrl ?? 'http://127.0.0.1:11434',\n });\n return { model: ollama(config.model), providerType: 'ollama', config };\n }\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n const openai = createOpenAI({\n apiKey: config.apiKey,\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n return { model: openai(config.model), providerType: 'openai', config };\n }\n case 'openai-compatible': {\n const { createOpenAICompatible } =\n await import('@ai-sdk/openai-compatible');\n const provider = createOpenAICompatible({\n baseURL: config.baseUrl ?? 'http://127.0.0.1:11434/v1',\n name: 'custom',\n ...(config.apiKey\n ? { headers: { Authorization: `Bearer ${config.apiKey}` } }\n : {}),\n });\n return {\n model: provider(config.model),\n providerType: 'openai-compatible',\n config,\n };\n }\n default: {\n throw new Error(\n `Unsupported provider: \"${config.provider}\". Expected \"ollama\", \"openai\", or \"openai-compatible\".`,\n );\n }\n }\n}\n","export function buildSystemPrompt(\n viewMode: string,\n contextJson: string,\n): string {\n return `You are an OpenTelemetry expert assistant analyzing live telemetry data from a running application.\nThe user is viewing their ${viewMode} dashboard in a terminal TUI.\n\nYou have tools to query the telemetry data precisely. Use them to answer questions:\n- getOverviewStats: high-level stats (spans, errors, latency)\n- listServices: all services with error rates and p95\n- findSlowestSpans: find slow spans, optionally by service\n- findErrorTraces: find traces with errors\n- getTraceDetail: deep dive into a specific trace\n- searchSpans: search spans by name\n- searchLogs: search logs by message content\n- renderUI: display rich terminal UI (tables, charts, badges)\n\n## Workflow\n1. Use data tools first to gather data\n2. Use renderUI to display structured results as tables, charts, or cards\n3. Add a brief text explanation after the rendered UI\n\n## When to use renderUI\nUse renderUI for tables, comparisons, and metrics. Do NOT use it for short text answers.\n\nrenderUI spec format: { root: \"id\", elements: { \"id\": { type: \"ComponentName\", props: {...}, children: [] } } }\n\nComponents: Table (columns, rows), KeyValue (label, value), Badge (label, variant: success/error/warning/info), BarChart (data: [{label,value}]), Card (title, children), Heading (text), Divider, Text (text, color, bold), Box (flexDirection, children).\n\nTable example: { type: \"Table\", props: { columns: [{ header: \"Name\", key: \"name\" }], rows: [{ name: \"api\" }] }, children: [] }\n\nKeep text responses under 300 words.\nUse specific span names, durations, and attribute values from the data.\n\nCurrent dashboard summary:\n${contextJson}`;\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { TerminalSpanEvent } from '../span-stream';\nimport type { TerminalLogEvent } from '../lib/log-model';\nimport type { TraceSummary, SpanStats } from '../lib/trace-model';\nimport type { ServiceStats } from '../lib/stats-model';\nimport type { ErrorSummary } from '../lib/error-model';\nimport type { InkSpec } from './types';\nimport { validateSpec } from '@json-render/core';\nimport { standardComponentDefinitions } from '@json-render/ink/catalog';\n\n/** Valid component names from the Ink catalog */\nconst COMPONENT_NAMES = Object.keys(standardComponentDefinitions) as [\n string,\n ...string[],\n];\n\n// Helper: zod v4 schemas need to be cast for ai SDK v6's tool() which expects zod v3 types\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst t: (...args: any[]) => any = tool;\n\n/**\n * Snapshot of dashboard state passed to tools at query time.\n * Tools read from this — they don't mutate dashboard state.\n */\nexport type ToolContext = {\n spans: TerminalSpanEvent[];\n logs: TerminalLogEvent[];\n traces: TraceSummary[];\n stats: SpanStats;\n serviceStats: ServiceStats[];\n errorSummaries: ErrorSummary[];\n};\n\nexport function createTelemetryTools(\n ctx: ToolContext,\n onRenderUI?: (spec: InkSpec) => void,\n) {\n return {\n getOverviewStats: t({\n description:\n 'Get high-level stats: total spans, error count, average duration, p95 duration, and service count.',\n parameters: z.object({}),\n execute: async () => ({\n totalSpans: ctx.stats.total,\n errors: ctx.stats.errors,\n avgMs: Math.round(ctx.stats.avg),\n p95Ms: Math.round(ctx.stats.p95),\n serviceCount: ctx.serviceStats.length,\n traceCount: ctx.traces.length,\n }),\n }),\n\n listServices: t({\n description:\n 'List all services with their span counts, error counts, and p95 latencies.',\n parameters: z.object({}),\n execute: async () =>\n ctx.serviceStats.map((s) => ({\n serviceName: s.serviceName,\n total: s.total,\n errors: s.errors,\n avgMs: Math.round(s.avgMs),\n p95Ms: Math.round(s.p95Ms),\n })),\n }),\n\n findSlowestSpans: t({\n description:\n 'Find the slowest spans, optionally filtered by service name. Returns span name, duration, status, and key attributes.',\n parameters: z.object({\n service: z.string().optional().describe('Filter by service name'),\n limit: z.number().optional().describe('Max results (default 10)'),\n }),\n execute: async ({\n service,\n limit,\n }: {\n service?: string;\n limit?: number;\n }) => {\n const max = limit ?? 10;\n let filtered = ctx.spans;\n if (service) {\n filtered = filtered.filter(\n (s) => (s.attributes?.['service.name'] as string) === service,\n );\n }\n return filtered\n .toSorted((a, b) => b.durationMs - a.durationMs)\n .slice(0, max)\n .map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n service: (s.attributes?.['service.name'] as string) ?? 'unknown',\n route: s.attributes?.['http.route'] as string | undefined,\n traceId: s.traceId.slice(0, 8),\n }));\n },\n }),\n\n findErrorTraces: t({\n description:\n 'Find traces that contain errors, with root span name, service, route, and error count.',\n parameters: z.object({\n service: z.string().optional().describe('Filter by service name'),\n limit: z.number().optional().describe('Max results (default 10)'),\n }),\n execute: async ({\n service,\n limit,\n }: {\n service?: string;\n limit?: number;\n }) => {\n const max = limit ?? 10;\n let errors = ctx.errorSummaries;\n if (service) {\n errors = errors.filter((e) => e.serviceName === service);\n }\n return errors.slice(0, max).map((e) => ({\n traceId: e.traceId.slice(0, 8),\n rootName: e.rootName,\n serviceName: e.serviceName,\n route: e.route,\n errorCount: e.errorCount,\n }));\n },\n }),\n\n getTraceDetail: t({\n description:\n 'Get full detail of a specific trace by trace ID prefix. Returns all spans with their parent relationships, durations, and attributes.',\n parameters: z.object({\n traceIdPrefix: z\n .string()\n .describe('First 8+ characters of the trace ID'),\n }),\n execute: async ({ traceIdPrefix }: { traceIdPrefix: string }) => {\n const trace = ctx.traces.find((t) =>\n t.traceId.startsWith(traceIdPrefix),\n );\n if (!trace) {\n return { error: `No trace found matching ${traceIdPrefix}` };\n }\n const traceLogs = ctx.logs.filter((l) => l.traceId === trace.traceId);\n return {\n traceId: trace.traceId.slice(0, 16),\n rootName: trace.rootName,\n durationMs: Math.round(trace.durationMs),\n hasError: trace.hasError,\n spanCount: trace.spanCount,\n spans: trace.spans.map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n kind: s.kind,\n parentSpanId: s.parentSpanId?.slice(0, 8),\n attrs: Object.fromEntries(\n Object.entries(s.attributes ?? {}).filter(([k]) =>\n [\n 'http.method',\n 'http.route',\n 'http.status_code',\n 'db.operation',\n 'db.system',\n 'service.name',\n 'error.message',\n 'error.type',\n ].includes(k),\n ),\n ),\n })),\n logs: traceLogs.slice(0, 10).map((l) => ({\n level: l.level,\n message: l.message.slice(0, 100),\n })),\n };\n },\n }),\n\n searchSpans: t({\n description:\n 'Search spans by name pattern (case-insensitive substring match). Returns matching spans with details.',\n parameters: z.object({\n query: z.string().describe('Search string to match against span names'),\n limit: z.number().optional().describe('Max results (default 20)'),\n }),\n execute: async ({ query, limit }: { query: string; limit?: number }) => {\n const max = limit ?? 20;\n const q = query.toLowerCase();\n return ctx.spans\n .filter((s) => s.name.toLowerCase().includes(q))\n .slice(0, max)\n .map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n traceId: s.traceId.slice(0, 8),\n service: (s.attributes?.['service.name'] as string) ?? 'unknown',\n }));\n },\n }),\n\n searchLogs: t({\n description:\n 'Search logs by message content (case-insensitive). Returns matching log entries.',\n parameters: z.object({\n query: z\n .string()\n .describe('Search string to match against log messages'),\n level: z\n .enum(['debug', 'info', 'warn', 'error'])\n .optional()\n .describe('Filter by log level'),\n limit: z.number().optional().describe('Max results (default 20)'),\n }),\n execute: async ({\n query,\n level,\n limit,\n }: {\n query: string;\n level?: string;\n limit?: number;\n }) => {\n const max = limit ?? 20;\n const q = query.toLowerCase();\n let filtered = ctx.logs.filter((l) =>\n l.message.toLowerCase().includes(q),\n );\n if (level) {\n filtered = filtered.filter((l) => l.level === level);\n }\n return filtered.slice(0, max).map((l) => ({\n level: l.level,\n message: l.message.slice(0, 200),\n traceId: l.traceId?.slice(0, 8),\n attrs: l.attributes,\n }));\n },\n }),\n\n renderUI: t({\n description:\n 'Render rich terminal UI (tables, charts, badges) to display structured data. Use this when showing tabular data, comparisons, or metrics — not for short text answers. Available components: Table (columns + rows), KeyValue (key-value pairs), Badge (status labels: default/info/success/warning/error), BarChart (horizontal bars with labels), Card (grouped content with title), Heading (section title), Divider (separator), Text (styled text), Box (layout container).',\n parameters: z.object({\n spec: z\n .object({\n root: z.string().describe('ID of the root element'),\n elements: z\n .record(\n z.string(),\n z.object({\n type: z.enum(COMPONENT_NAMES).describe('Component name'),\n props: z.record(z.string(), z.unknown()).optional(),\n children: z.array(z.string()).describe('Child element keys'),\n }),\n )\n .describe('Map of element ID to component definition'),\n })\n .describe('json-render spec defining the UI to display'),\n }),\n execute: async ({ spec }: { spec: InkSpec }) => {\n const validation = validateSpec(spec);\n if (!validation.valid) {\n return {\n rendered: false,\n error: validation.issues.map((i) => i.message).join('; '),\n };\n }\n onRenderUI?.(spec);\n return { rendered: true };\n },\n }),\n };\n}\n","/**\n * Provider-aware streamText wrapper.\n *\n * When the provider is Ollama, uses ai-sdk-ollama's streamText which has\n * enhanced response synthesis for tool calling (Ollama models often return\n * empty text after tool execution — the enhanced version detects this and\n * synthesizes a response from tool results).\n *\n * For all other providers, uses the standard ai SDK streamText.\n */\nimport type { LanguageModel } from 'ai';\nimport type { AIProviderType } from './types';\n\ntype StreamTextParams = {\n model: LanguageModel;\n system?: string;\n messages: Array<{ role: 'user' | 'assistant'; content: string }>;\n tools?: Record<string, unknown>;\n maxSteps?: number;\n abortSignal?: AbortSignal;\n};\n\ntype StreamResult = {\n textStream: AsyncIterable<string>;\n};\n\nexport async function providerStreamText(\n providerType: AIProviderType,\n params: StreamTextParams,\n): Promise<StreamResult> {\n if (providerType === 'ollama') {\n const mod = await import('ai-sdk-ollama');\n // ai-sdk-ollama's streamText has enhanced synthesis for tool calling\n const result = await mod.streamText(\n params as Parameters<typeof mod.streamText>[0],\n );\n return result as unknown as StreamResult;\n }\n\n const mod = await import('ai');\n return mod.streamText(\n params as Parameters<typeof mod.streamText>[0],\n ) as unknown as StreamResult;\n}\n","/**\n * Terminal Dashboard for Autotel\n *\n * Beautiful react-ink powered dashboard for viewing traces in real-time.\n *\n * @example Basic usage (auto-wire)\n * ```typescript\n * import { init } from 'autotel'\n * import { renderTerminal } from 'autotel-terminal'\n *\n * init({ service: 'my-app' })\n * renderTerminal() // Automatically creates stream from current tracer provider\n * ```\n *\n * @example With options\n * ```typescript\n * renderTerminal({\n * title: 'My App Traces',\n * showStats: true,\n * maxSpans: 200,\n * })\n * ```\n *\n * @example Manual stream (advanced)\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n * import { BatchSpanProcessor } from 'autotel/processors'\n *\n * const processor = new StreamingSpanProcessor(new BatchSpanProcessor(exporter))\n * const stream = createTerminalSpanStream(processor)\n * renderTerminal({}, stream)\n * ```\n *\n * @module autotel-terminal\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { render, Box, Text, useInput, useStdin } from 'ink';\nimport type { TerminalSpanEvent, TerminalSpanStream } from './span-stream';\nimport { StreamingSpanProcessor } from './streaming-processor';\nimport { createTerminalSpanStream } from './span-stream';\nimport { getAutotelTracerProvider } from 'autotel/tracer-provider';\nimport type { TracerProvider } from '@opentelemetry/api';\nimport {\n buildTraceMap,\n buildTraceSummaries,\n buildTraceTree,\n flattenTraceTree,\n filterBySearch,\n filterTraceSummaries,\n computeStats,\n computePerSpanNameStats,\n sortSpansForWaterfall,\n spanServiceName,\n} from './lib/trace-model';\nimport { formatDurationMs, formatRelative, truncate, buildWaterfallBar, buildTimeRuler } from './lib/format';\nimport { getServiceColor } from './lib/service-colors';\nimport type { SpanTreeNode } from './lib/trace-model';\nimport type { TerminalLogEvent, LogStats } from './lib/log-model';\nimport {\n filterLogsBySearch,\n computeLogStats,\n buildTraceTimeline,\n} from './lib/log-model';\nimport { getTerminalLogStream, type TerminalLogStream } from './log-stream';\nimport {\n computeServiceStats,\n computeRouteStats,\n findHotSpanNames,\n} from './lib/stats-model';\nimport { applySpanFilters, type SpanFilterState } from './lib/filters';\nimport type { ViewMode } from './lib/dashboard-keymap';\nimport { buildErrorSummaries } from './lib/error-model';\nimport { buildServiceGraph } from './lib/topology-model';\nimport { renderTopologyAscii } from './lib/topology-render';\nimport { exportTraceToJson } from './lib/export-model';\nimport type { AIConfig, ChatMessage, AIState } from './ai/types';\nimport {\n resolveConfigWithAutoDetect,\n createAIModel,\n type AIModelResult,\n} from './ai/provider';\nimport { buildSystemPrompt } from './ai/system-prompt';\nimport { createTelemetryTools, type ToolContext } from './ai/tools';\nimport { providerStreamText } from './ai/stream';\nimport { Renderer as InkRenderer } from '@json-render/ink';\nimport type { InkSpec } from './ai/types';\n\n/** Key attribute keys to show first (autotel / OTel conventions) */\nconst KEY_ATTR_KEYS = new Set([\n 'http.route',\n 'http.method',\n 'db.operation',\n 'db.statement',\n 'db.system',\n 'code.function',\n 'code.filepath',\n 'code.lineno',\n 'user.id',\n 'order.id',\n]);\n\n/**\n * Terminal dashboard options\n */\nexport interface TerminalOptions {\n /**\n * Dashboard title\n * @default 'Autotel Trace Inspector'\n */\n title?: string;\n\n /**\n * Show statistics bar (span count, error rate, avg duration)\n * @default true\n */\n showStats?: boolean;\n\n /**\n * Maximum number of spans to display\n * @default 100\n */\n maxSpans?: number;\n\n /**\n * Enable colors (auto-detect by default)\n * @default true if TTY\n */\n colors?: boolean;\n\n /**\n * AI assistant configuration. Auto-detects Ollama/OpenAI if not provided.\n */\n ai?: Partial<AIConfig>;\n}\n\nconst THROTTLE_MS = 50;\nconst MAX_TRACES = 50;\nconst NEW_ERROR_DISPLAY_MS = 2000;\nconst RECORD_LIMIT_DEFAULT = 200;\nconst LIST_HEIGHT = 20;\n\ninterface DashboardProps {\n title: string;\n showStats: boolean;\n maxSpans: number;\n colors: boolean;\n stream: TerminalSpanStream;\n logStream?: TerminalLogStream | null;\n aiConfig?: Partial<AIConfig>;\n}\n\nfunction Dashboard({\n title,\n showStats,\n maxSpans,\n colors,\n stream,\n logStream,\n aiConfig,\n}: DashboardProps): React.ReactElement {\n const [paused, setPaused] = useState(false);\n const [recording, setRecording] = useState(false);\n const [spans, setSpans] = useState<TerminalSpanEvent[]>([]);\n const [selected, setSelected] = useState(0);\n const [filterErrorsOnly, setFilterErrorsOnly] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [showHelp, setShowHelp] = useState(false);\n const [viewMode, setViewMode] = useState<ViewMode>('trace');\n const [spanFilters, setSpanFilters] = useState<SpanFilterState>({\n statusGroup: 'all',\n });\n const [drilldownTraceId, setDrilldownTraceId] = useState<string | null>(null);\n const [drilldownSelectedIndex, setDrilldownSelectedIndex] = useState(0);\n const [drilldownScrollOffset, setDrilldownScrollOffset] = useState(0);\n const [drilldownTab, setDrilldownTab] = useState<\n 'timeline' | 'spans' | 'logs'\n >('timeline');\n const [newErrorCount, setNewErrorCount] = useState(0);\n const [searchMode, setSearchMode] = useState(false);\n const [traceIdMode, setTraceIdMode] = useState(false);\n const [traceIdInput, setTraceIdInput] = useState('');\n const throttleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingSpansRef = useRef<TerminalSpanEvent[]>([]);\n const [logs, setLogs] = useState<TerminalLogEvent[]>([]);\n\n // AI state\n const [aiMessages, setAiMessages] = useState<ChatMessage[]>([]);\n const [aiInput, setAiInput] = useState('');\n const [aiState, setAiState] = useState<AIState>({ status: 'unconfigured' });\n const [aiInputMode, setAiInputMode] = useState(false);\n const [aiSpec, setAiSpec] = useState<InkSpec | null>(null);\n const aiModelRef = useRef<AIModelResult | null>(null);\n const aiAbortRef = useRef<AbortController | null>(null);\n\n // Initialize AI model on mount\n useEffect(() => {\n let cancelled = false;\n resolveConfigWithAutoDetect(aiConfig).then(async (config) => {\n if (cancelled || !config) return;\n try {\n const result = await createAIModel(config);\n aiModelRef.current = result;\n setAiState({ status: 'idle' });\n } catch {\n setAiState({\n status: 'error',\n message: 'Failed to initialize AI model',\n });\n }\n });\n return () => {\n cancelled = true;\n };\n }, [aiConfig]);\n\n // Subscribe to log stream if provided\n useEffect(() => {\n if (!logStream) return;\n const unsubscribe = logStream.onLog((event) => {\n if (paused) return;\n if (recording) {\n setLogs((prev) => {\n const next = [event, ...prev];\n if (next.length >= RECORD_LIMIT_DEFAULT) {\n setRecording(false);\n setPaused(true);\n }\n return next.slice(0, RECORD_LIMIT_DEFAULT);\n });\n return;\n }\n setLogs((prev) => [event, ...prev].slice(0, maxSpans));\n });\n return () => {\n unsubscribe();\n };\n }, [logStream, paused, maxSpans, recording]);\n\n useEffect(() => {\n const flush = () => {\n const batch = pendingSpansRef.current;\n pendingSpansRef.current = [];\n if (batch.length === 0) return;\n setSpans((prev) => {\n const next = [...batch, ...prev];\n return next.slice(0, maxSpans);\n });\n setSelected(0);\n setDrilldownTraceId(null);\n };\n const unsubscribe = stream.onSpanEnd((span) => {\n if (paused) return;\n if (span.status === 'ERROR') {\n setNewErrorCount((n) => n + 1);\n setTimeout(\n () => setNewErrorCount((n) => Math.max(0, n - 1)),\n NEW_ERROR_DISPLAY_MS,\n );\n }\n if (recording) {\n setSpans((prev) => {\n const next = [span, ...prev];\n if (next.length >= RECORD_LIMIT_DEFAULT) {\n setRecording(false);\n setPaused(true);\n }\n return next.slice(0, RECORD_LIMIT_DEFAULT);\n });\n setSelected(0);\n setDrilldownTraceId(null);\n return;\n }\n pendingSpansRef.current = [span, ...pendingSpansRef.current];\n if (throttleRef.current) return;\n throttleRef.current = setTimeout(() => {\n throttleRef.current = null;\n flush();\n }, THROTTLE_MS);\n });\n return () => {\n if (throttleRef.current) clearTimeout(throttleRef.current);\n unsubscribe();\n };\n }, [stream, paused, maxSpans, recording]);\n\n const filteredSpanBuffer = useMemo(\n () =>\n applySpanFilters(spans, {\n ...spanFilters,\n errorsOnly: filterErrorsOnly,\n searchQuery,\n }),\n [spans, spanFilters, filterErrorsOnly, searchQuery],\n );\n\n const traceMap = useMemo(\n () => buildTraceMap(filteredSpanBuffer, MAX_TRACES),\n [filteredSpanBuffer],\n );\n const traceSummaries = useMemo(\n () => buildTraceSummaries(traceMap),\n [traceMap],\n );\n const filteredSummaries = useMemo(() => {\n const base = filterTraceSummaries(traceSummaries, '', false);\n return spanFilters.traceId\n ? base.filter((t) => t.traceId === spanFilters.traceId)\n : base;\n }, [traceSummaries, spanFilters.traceId]);\n const filteredSpans = useMemo(\n () => filterBySearch(filteredSpanBuffer, '', false),\n [filteredSpanBuffer],\n );\n\n const stats = useMemo(() => computeStats(spans), [spans]);\n const perSpanNameStats = useMemo(\n () => computePerSpanNameStats(spans),\n [spans],\n );\n const logStats: LogStats = useMemo(() => computeLogStats(logs), [logs]);\n const filteredLogs = useMemo(() => {\n const traceFilteredLogs = spanFilters.traceId\n ? logs.filter((l) => l.traceId === spanFilters.traceId)\n : logs;\n return filterLogsBySearch(traceFilteredLogs, searchQuery, null);\n }, [logs, searchQuery, spanFilters.traceId]);\n\n const serviceStats = useMemo(() => computeServiceStats(spans), [spans]);\n const selectedServiceName = serviceStats[selected]?.serviceName ?? null;\n const spansForSelectedService = useMemo(() => {\n if (!selectedServiceName) return spans;\n return spans.filter(\n (s) =>\n (s.attributes?.['service.name'] as string | undefined) ===\n selectedServiceName,\n );\n }, [spans, selectedServiceName]);\n const selectedServiceRouteStats = useMemo(\n () => computeRouteStats(spansForSelectedService).slice(0, 8),\n [spansForSelectedService],\n );\n const selectedServiceHotSpans = useMemo(\n () => findHotSpanNames(spansForSelectedService, 8),\n [spansForSelectedService],\n );\n\n const selectedTraceSummary =\n drilldownTraceId == null\n ? (filteredSummaries[selected] ?? null)\n : (filteredSummaries.find((t) => t.traceId === drilldownTraceId) ?? null);\n const serviceGraph = useMemo(() => buildServiceGraph(spans), [spans]);\n const topologyLines = useMemo(() => renderTopologyAscii(serviceGraph), [serviceGraph]);\n const errorSummaries = useMemo(\n () => buildErrorSummaries(traceSummaries),\n [traceSummaries],\n );\n const filteredErrorSummaries = spanFilters.traceId\n ? errorSummaries.filter((e) => e.traceId === spanFilters.traceId)\n : errorSummaries;\n const traceTree =\n selectedTraceSummary == null\n ? []\n : flattenTraceTree(buildTraceTree(selectedTraceSummary.spans));\n const waterfallSpans =\n selectedTraceSummary == null\n ? []\n : sortSpansForWaterfall(selectedTraceSummary.spans);\n\n const currentSpanInTrace = traceTree[drilldownSelectedIndex] ?? null;\n const currentSpanInFlat = filteredSpans[selected] ?? null;\n const selectedTraceSummaryForDetails =\n viewMode === 'trace' &&\n drilldownTraceId == null &&\n filteredSummaries[selected]\n ? filteredSummaries[selected]!\n : null;\n const rootSpanOfSelectedTrace =\n selectedTraceSummaryForDetails != null &&\n selectedTraceSummaryForDetails.spans.length > 0\n ? (selectedTraceSummaryForDetails.spans.find(\n (s) =>\n !selectedTraceSummaryForDetails.spans.some(\n (p) => p.spanId === s.parentSpanId,\n ),\n ) ?? selectedTraceSummaryForDetails.spans[0])\n : null;\n const currentSpan =\n viewMode === 'trace'\n ? drilldownTraceId == null\n ? (rootSpanOfSelectedTrace ?? null)\n : (currentSpanInTrace?.span ?? null)\n : viewMode === 'span'\n ? currentSpanInFlat\n : null;\n\n const selectedTraceLogs =\n selectedTraceSummary?.traceId && logs.length > 0\n ? logs.filter((l) => l.traceId === selectedTraceSummary.traceId)\n : [];\n\n const timelineItems =\n selectedTraceSummary &&\n (selectedTraceSummary.spans.length > 0 || selectedTraceLogs.length > 0)\n ? buildTraceTimeline(selectedTraceSummary.spans, selectedTraceLogs)\n : [];\n\n /** Spans belonging to the drilled-down trace */\n const drilldownSpans = useMemo(\n () =>\n drilldownTraceId\n ? spans.filter((s) => s.traceId === drilldownTraceId)\n : [],\n [spans, drilldownTraceId],\n );\n\n /** Span tree for drill-down */\n const drilldownTree = useMemo(\n () =>\n drilldownSpans.length > 0\n ? flattenTraceTree(buildTraceTree(drilldownSpans))\n : [],\n [drilldownSpans],\n );\n\n /** Logs for the drilled-down trace */\n const drilldownLogs = useMemo(\n () =>\n drilldownTraceId\n ? logs.filter((l) => l.traceId === drilldownTraceId)\n : [],\n [logs, drilldownTraceId],\n );\n\n /** Combined timeline for drill-down (spans + logs interleaved by time) */\n const drilldownTimeline = useMemo(\n () =>\n drilldownSpans.length > 0 || drilldownLogs.length > 0\n ? buildTraceTimeline(drilldownSpans, drilldownLogs)\n : [],\n [drilldownSpans, drilldownLogs],\n );\n\n /** Summary for the drilled-down trace (for header display) */\n const drilldownSummary = useMemo(\n () =>\n drilldownTraceId\n ? (traceSummaries.find((t) => t.traceId === drilldownTraceId) ?? null)\n : null,\n [traceSummaries, drilldownTraceId],\n );\n\n /** Currently selected item in the drill-down view */\n const drilldownSelectedItem = useMemo(() => {\n if (!drilldownTraceId) return null;\n if (drilldownTab === 'timeline') {\n const item = drilldownTimeline[drilldownSelectedIndex];\n if (!item) return null;\n return item;\n }\n if (drilldownTab === 'spans') {\n return drilldownTree[drilldownSelectedIndex]\n ? {\n type: 'span' as const,\n span: drilldownTree[drilldownSelectedIndex]!.span,\n }\n : null;\n }\n if (drilldownTab === 'logs') {\n return drilldownLogs[drilldownSelectedIndex]\n ? { type: 'log' as const, log: drilldownLogs[drilldownSelectedIndex] }\n : null;\n }\n return null;\n }, [\n drilldownTraceId,\n drilldownTab,\n drilldownSelectedIndex,\n drilldownTimeline,\n drilldownTree,\n drilldownLogs,\n ]);\n\n // AI query sender — uses tools for precise telemetry queries\n const sendAIQuery = async (question: string) => {\n const aiResult = aiModelRef.current;\n if (!aiResult || aiState.status === 'streaming') return;\n\n const userMsg: ChatMessage = { role: 'user', content: question };\n setAiMessages((prev) => [...prev, userMsg]);\n setAiInput('');\n\n const abort = new AbortController();\n aiAbortRef.current = abort;\n setAiSpec(null);\n setAiState({ status: 'streaming', abortController: abort });\n\n // Build tool context from current dashboard state\n const toolCtx: ToolContext = {\n spans,\n logs,\n traces: traceSummaries,\n stats,\n serviceStats,\n errorSummaries,\n };\n const tools = createTelemetryTools(toolCtx, (spec) => setAiSpec(spec));\n\n // Compact stats for system prompt (tools provide the detailed data)\n const statsContext = JSON.stringify({\n viewMode,\n stats: {\n totalSpans: stats.total,\n errors: stats.errors,\n avgMs: Math.round(stats.avg),\n p95Ms: Math.round(stats.p95),\n },\n services: serviceStats.length,\n traces: traceSummaries.length,\n });\n const drilldownContext = drilldownTraceId\n ? `\\n\\nCurrently viewing trace ${drilldownTraceId}. This trace has ${drilldownSpans.length} spans and ${drilldownLogs.length} logs. The root span is \"${drilldownSummary?.rootName ?? 'unknown'}\" with duration ${drilldownSummary ? formatDurationMs(drilldownSummary.durationMs) : 'unknown'}.`\n : '';\n const systemPrompt =\n buildSystemPrompt(viewMode, statsContext) + drilldownContext;\n\n try {\n // Add empty assistant message for streaming\n setAiMessages((prev) => [...prev, { role: 'assistant', content: '' }]);\n\n const result = await providerStreamText(aiResult.providerType, {\n model: aiResult.model,\n system: systemPrompt,\n messages: [...aiMessages, userMsg].map((m) => ({\n role: m.role,\n content: m.content,\n })),\n tools,\n maxSteps: 10,\n abortSignal: abort.signal,\n });\n\n let fullText = '';\n\n for await (const chunk of result.textStream) {\n if (abort.signal.aborted) break;\n fullText += chunk;\n const captured = fullText;\n setAiMessages((prev) => {\n const updated = [...prev];\n const lastMsg = updated.at(-1);\n if (lastMsg?.role === 'assistant') {\n updated[updated.length - 1] = {\n role: 'assistant',\n content: captured,\n };\n }\n return updated;\n });\n }\n\n // If model returned no text (common with small models after tool calls),\n // show a fallback message\n if (!fullText.trim()) {\n setAiMessages((prev) => {\n const updated = [...prev];\n const lastMsg = updated.at(-1);\n if (lastMsg?.role === 'assistant' && !lastMsg.content.trim()) {\n updated[updated.length - 1] = {\n role: 'assistant',\n content: '(No response from model — try a simpler question or a larger model)',\n };\n }\n return updated;\n });\n }\n\n setAiState({ status: 'idle' });\n } catch (error: unknown) {\n if (abort.signal.aborted) {\n setAiState({ status: 'idle' });\n return;\n }\n const errorMsg = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[autotel-terminal] AI error: ${errorMsg}\\n`);\n setAiState({\n status: 'error',\n message: errorMsg,\n });\n } finally {\n aiAbortRef.current = null;\n }\n };\n\n const { isRawModeSupported } = useStdin();\n\n useInput(\n (input, key) => {\n if (showHelp && input !== '?') {\n if (input === '?') setShowHelp(false);\n return;\n }\n if (input === '?') {\n setShowHelp((h) => !h);\n return;\n }\n if (input === '/') {\n setSearchMode((m) => !m);\n if (searchMode) setSearchQuery('');\n return;\n }\n if (searchMode) {\n if (key.escape || key.return) {\n setSearchMode(false);\n } else if (key.backspace || key.delete) {\n setSearchQuery((q) => q.slice(0, -1));\n } else if (key.tab) {\n // Autocomplete: find first matching traceId and apply it\n if (searchQuery.length >= 4) {\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(searchQuery.toLowerCase()),\n );\n if (match) {\n setSpanFilters((prev) => ({ ...prev, traceId: match.traceId }));\n setSearchMode(false);\n setSearchQuery('');\n }\n }\n } else if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setSearchQuery((q) => q + input);\n }\n return;\n }\n if (traceIdMode) {\n if (key.escape) {\n setTraceIdMode(false);\n setTraceIdInput('');\n } else if (key.return) {\n if (traceIdInput.trim()) {\n // Find matching traceId (prefix match)\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n );\n if (match) {\n setSpanFilters((prev) => ({ ...prev, traceId: match.traceId }));\n }\n } else {\n // Empty input — clear traceId filter\n setSpanFilters((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { traceId: _, ...rest } = prev;\n return rest;\n });\n }\n setTraceIdMode(false);\n setTraceIdInput('');\n } else if (key.tab) {\n // Autocomplete: fill in first matching traceId\n if (traceIdInput.length >= 2) {\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n );\n if (match) {\n setTraceIdInput(match.traceId);\n }\n }\n } else if (key.backspace || key.delete) {\n setTraceIdInput((q) => q.slice(0, -1));\n } else if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setTraceIdInput((q) => q + input);\n }\n return;\n }\n // AI input mode — intercepts all input when typing a question\n if (aiInputMode) {\n if (key.escape) {\n if (aiState.status === 'streaming') {\n aiAbortRef.current?.abort();\n } else {\n setAiInputMode(false);\n setViewMode('trace');\n }\n return;\n }\n if (key.backspace || key.delete) {\n setAiInput((q) => q.slice(0, -1));\n return;\n }\n if (key.return) {\n if (aiInput.trim()) {\n sendAIQuery(aiInput.trim());\n }\n return;\n }\n if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setAiInput((q) => q + input);\n }\n return;\n }\n if (input === 'a') {\n if (viewMode === 'ai') {\n setViewMode('trace');\n setAiInputMode(false);\n } else {\n setViewMode('ai');\n if (aiState.status !== 'unconfigured') {\n setAiInputMode(true);\n }\n }\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n return;\n }\n if (key.escape) {\n if (drilldownTraceId == null) {\n setSearchMode(false);\n } else {\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (key.tab && drilldownTraceId != null) {\n const tabs: Array<'timeline' | 'spans' | 'logs'> = [\n 'timeline',\n 'spans',\n 'logs',\n ];\n const currentIdx = tabs.indexOf(drilldownTab);\n const nextIdx = key.shift\n ? (currentIdx - 1 + tabs.length) % tabs.length\n : (currentIdx + 1) % tabs.length;\n setDrilldownTab(tabs[nextIdx]!);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n return;\n }\n if (key.return && drilldownTraceId == null) {\n let targetTraceId: string | undefined;\n let preSelectIndex = 0;\n if (viewMode === 'trace' && filteredSummaries[selected]) {\n targetTraceId = filteredSummaries[selected]!.traceId;\n } else if (viewMode === 'log' && filteredLogs[selected]?.traceId) {\n targetTraceId = filteredLogs[selected]!.traceId;\n const originLog = filteredLogs[selected]!;\n const traceSpans = spans.filter((s) => s.traceId === targetTraceId);\n const traceLogs = logs.filter((l) => l.traceId === targetTraceId);\n const timeline = buildTraceTimeline(traceSpans, traceLogs);\n preSelectIndex = timeline.findIndex(\n (item) => item.type === 'log' && item.log === originLog,\n );\n if (preSelectIndex < 0) preSelectIndex = 0;\n } else if (viewMode === 'span' && filteredSpans[selected]?.traceId) {\n targetTraceId = filteredSpans[selected]!.traceId;\n const originSpan = filteredSpans[selected]!;\n const traceSpans = spans.filter((s) => s.traceId === targetTraceId);\n const traceLogs = logs.filter((l) => l.traceId === targetTraceId);\n const timeline = buildTraceTimeline(traceSpans, traceLogs);\n preSelectIndex = timeline.findIndex(\n (item) =>\n item.type === 'span' && item.span?.spanId === originSpan.spanId,\n );\n if (preSelectIndex < 0) preSelectIndex = 0;\n }\n if (targetTraceId) {\n setDrilldownTraceId(targetTraceId);\n setDrilldownSelectedIndex(preSelectIndex);\n setDrilldownScrollOffset(Math.max(0, preSelectIndex - LIST_HEIGHT + 1));\n setDrilldownTab('timeline');\n return;\n }\n }\n if (key.upArrow || key.downArrow) {\n if (drilldownTraceId != null) {\n // In drill-down mode — navigate within the active tab's list\n const listLength =\n drilldownTab === 'timeline'\n ? drilldownTimeline.length\n : drilldownTab === 'spans'\n ? drilldownTree.length\n : drilldownLogs.length;\n if (key.upArrow) {\n setDrilldownSelectedIndex((prev) => {\n const next = Math.max(0, prev - 1);\n setDrilldownScrollOffset((off) => Math.min(next, off));\n return next;\n });\n } else {\n setDrilldownSelectedIndex((prev) => {\n const next = Math.min(listLength - 1, prev + 1);\n setDrilldownScrollOffset((off) =>\n next >= off + LIST_HEIGHT ? next - LIST_HEIGHT + 1 : off,\n );\n return next;\n });\n }\n return;\n }\n switch (viewMode) {\n case 'trace': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n setDrilldownSelectedIndex(0);\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredSummaries.length - 1, i + 1));\n setDrilldownSelectedIndex(0);\n }\n break;\n }\n case 'span': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredSpans.length - 1, i + 1));\n }\n break;\n }\n case 'log': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredLogs.length - 1, i + 1));\n }\n break;\n }\n case 'service-summary': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(serviceStats.length - 1, i + 1));\n }\n break;\n }\n case 'errors': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) =>\n Math.min(filteredErrorSummaries.length - 1, i + 1),\n );\n }\n break;\n }\n }\n }\n if (input === 'p') setPaused((p) => !p);\n if (input === 'e') setFilterErrorsOnly((v) => !v);\n if (input === 't') {\n setViewMode((m) => (m === 'trace' ? 'span' : 'trace'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'l') {\n setViewMode((m) => (m === 'log' ? 'trace' : 'log'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'v') {\n setViewMode((m) =>\n m === 'service-summary' ? 'trace' : 'service-summary',\n );\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'E') {\n setViewMode((m) => (m === 'errors' ? 'trace' : 'errors'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'G') {\n setViewMode((m) => (m === 'topology' ? 'trace' : 'topology'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'c') {\n setSpans([]);\n setLogs([]);\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setNewErrorCount(0);\n setSpanFilters({ statusGroup: 'all' });\n setRecording(false);\n setPaused(false);\n }\n if (input === 'r') {\n setSpans([]);\n setLogs([]);\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setNewErrorCount(0);\n setSpanFilters({ statusGroup: 'all' });\n setPaused(false);\n setRecording(true);\n }\n if (input === 'x') {\n setSpanFilters({ statusGroup: 'all' });\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'f') {\n setTraceIdMode(true);\n setTraceIdInput(spanFilters.traceId ?? '');\n return;\n }\n if (input === 'H') {\n setSpanFilters((prev) => {\n const next =\n prev.statusGroup === 'all'\n ? '2xx'\n : prev.statusGroup === '2xx'\n ? '4xx'\n : prev.statusGroup === '4xx'\n ? '5xx'\n : 'all';\n return { ...prev, statusGroup: next };\n });\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'S') {\n const svc = currentSpan?.attributes?.['service.name'];\n if (typeof svc === 'string' && svc.trim()) {\n setSpanFilters((prev) => ({ ...prev, serviceName: svc }));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n }\n if (input === 'R') {\n const route = currentSpan?.attributes?.['http.route'];\n if (typeof route === 'string' && route.trim()) {\n setSpanFilters((prev) => ({ ...prev, route }));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n }\n if (input === 'T') {\n // Jump to trace view with traceId filter from current item\n let traceId: string | undefined;\n if (drilldownTraceId) {\n traceId = drilldownTraceId;\n } else {\n switch (viewMode) {\n case 'log': {\n traceId = filteredLogs[selected]?.traceId;\n break;\n }\n case 'span': {\n traceId = filteredSpans[selected]?.traceId;\n break;\n }\n case 'errors': {\n traceId = filteredErrorSummaries[selected]?.traceId;\n break;\n }\n }\n }\n if (traceId && viewMode !== 'trace') {\n setSpanFilters((prev) => ({ ...prev, traceId }));\n setViewMode('trace');\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (input === 'L') {\n // Jump to log view with traceId filter from current item\n let traceId: string | undefined;\n if (drilldownTraceId) {\n traceId = drilldownTraceId;\n } else {\n switch (viewMode) {\n case 'trace': {\n traceId = filteredSummaries[selected]?.traceId;\n break;\n }\n case 'span': {\n traceId = filteredSpans[selected]?.traceId;\n break;\n }\n case 'errors': {\n traceId = filteredErrorSummaries[selected]?.traceId;\n break;\n }\n }\n }\n if (traceId && viewMode !== 'log') {\n setSpanFilters((prev) => ({ ...prev, traceId }));\n setViewMode('log');\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (input === 'J') {\n const t = selectedTraceSummary;\n if (!t) return;\n const json = exportTraceToJson(t, selectedTraceLogs);\n process.stdout.write(`\\n[autotel-terminal] trace export\\n${json}\\n`);\n }\n },\n { isActive: isRawModeSupported },\n );\n\n const headerRight = recording\n ? '[Recording]'\n : paused\n ? '[Paused]'\n : '[Live]';\n const headerModeLabel =\n viewMode === 'trace'\n ? 'traces'\n : viewMode === 'span'\n ? 'spans'\n : viewMode === 'log'\n ? 'logs'\n : viewMode === 'service-summary'\n ? 'services'\n : viewMode === 'topology'\n ? 'topology'\n : viewMode === 'ai'\n ? 'AI'\n : 'errors';\n const showNewError = newErrorCount > 0;\n\n function renderTreeRow(\n node: SpanTreeNode,\n index: number,\n ): React.ReactElement {\n const isSel = drilldownTraceId != null && index === drilldownSelectedIndex;\n const prefix =\n node.depth === 0\n ? ''\n : ' '.repeat(node.depth) +\n (node.children.length > 0 ? '├── ' : '└── ');\n const svcName = spanServiceName(node.span);\n const svcColor = getServiceColor(svcName);\n const statusColor =\n node.span.status === 'ERROR'\n ? 'red'\n : node.span.durationMs > 500\n ? 'yellow'\n : 'green';\n return (\n <Box\n key={`${node.span.spanId}-${node.span.startTime}`}\n flexDirection=\"row\"\n >\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>{isSel ? '▸ ' : ' '}</Text>\n <Text color={node.span.status === 'ERROR' ? 'red' : undefined}>{node.span.status === 'ERROR' ? '✗' : ' '}</Text>\n <Text dimColor>{prefix}</Text>\n <Text color={colors ? statusColor : undefined}>\n {truncate(node.span.name, 23)}\n </Text>\n <Text color={svcColor}> {truncate(svcName, 10)}</Text>\n <Text dimColor> {node.span.kind ?? ''}</Text>\n <Text dimColor> {formatDurationMs(node.span.durationMs)}</Text>\n </Box>\n );\n }\n\n function keyAttrsAndRest(attrs: Record<string, unknown> | undefined) {\n if (!attrs || Object.keys(attrs).length === 0)\n return {\n key: [] as [string, unknown][],\n rest: [] as [string, unknown][],\n };\n const entries = Object.entries(attrs);\n const key = entries.filter(([k]) => KEY_ATTR_KEYS.has(k));\n const rest = entries.filter(([k]) => !KEY_ATTR_KEYS.has(k));\n return { key, rest };\n }\n\n const waterfallMaxMs =\n waterfallSpans.length > 0\n ? Math.max(...waterfallSpans.map((w) => w.span.durationMs))\n : 1;\n const barWidth = 30;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text key=\"title\" bold>\n 🔭 {title} — {headerModeLabel}\n </Text>\n <Box flexDirection=\"row\" gap={1}>\n {showNewError && (\n <Text key=\"newError\" color=\"red\">\n 1 new error\n </Text>\n )}\n <Text key=\"status\" color={paused ? 'yellow' : 'green'}>\n {headerRight}\n </Text>\n </Box>\n </Box>\n\n {/* Controls bar — always exactly 2 lines */}\n <Box marginBottom={0} flexDirection=\"column\">\n {searchMode ? (\n <Text color=\"cyan\">\n Search: {searchQuery || '(type to filter)'}\n <Text dimColor> (Tab: match traceId, Esc: cancel)</Text>\n </Text>\n ) : traceIdMode ? (\n <Text color=\"yellow\">\n TraceId: {traceIdInput || '(type prefix, Tab to complete)'}\n {traceIdInput.length >= 2 && (\n <Text dimColor>\n {' → '}\n {traceSummaries\n .find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n )\n ?.traceId.slice(0, 16) ?? 'no match'}…\n </Text>\n )}\n </Text>\n ) : (\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Text dimColor>\n {drilldownTraceId == null\n ? '↑/↓ select • Enter open • Tab cycle tabs • Esc back • t trace • l logs • a AI • ? help'\n : '↑/↓ select • Tab cycle tabs • Esc back • t trace • l logs • a AI • ? help'}\n </Text>\n <Text dimColor>\n {viewMode === 'trace'\n ? `traces ${filteredSummaries.length}/${traceSummaries.length}`\n : viewMode === 'span'\n ? `spans ${filteredSpans.length}/${spans.length}`\n : viewMode === 'service-summary'\n ? `services ${serviceStats.length}`\n : viewMode === 'errors'\n ? `errors ${filteredErrorSummaries.length}/${errorSummaries.length}`\n : viewMode === 'topology'\n ? `services ${serviceGraph.services.length} · edges ${serviceGraph.edges.length}`\n : viewMode === 'ai'\n ? `messages ${aiMessages.length}`\n : `logs ${filteredLogs.length}/${logs.length}`}\n </Text>\n </Box>\n )}\n {showHelp && (\n <Text dimColor>\n Views: t/l/v/E/G/a • Search: / • Filters: e/S/R/H/f/x • Capture: p/r/J • Clear: c\n </Text>\n )}\n </Box>\n\n <Box marginBottom={0}>\n <Text dimColor>\n {spanFilters.serviceName || spanFilters.route || spanFilters.statusGroup !== 'all' || spanFilters.traceId\n ? `filters:${spanFilters.serviceName ? ` service=${spanFilters.serviceName}` : ''}${spanFilters.route ? ` route=${spanFilters.route}` : ''}${spanFilters.statusGroup && spanFilters.statusGroup !== 'all' ? ` status=${spanFilters.statusGroup}` : ''}${spanFilters.traceId ? ` trace=${spanFilters.traceId.slice(0, 8)}…` : ''}`\n : 'filters: none'}\n </Text>\n </Box>\n\n {viewMode === 'topology' && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text bold>Service Topology</Text>\n <Text dimColor>Press G to toggle · Shows service dependencies from span data</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {topologyLines.map((line, i) => {\n const hasErr = line.includes(' err');\n return (\n <Text key={`topo-${i}`} color={hasErr ? 'red' : undefined}>\n {line}\n </Text>\n );\n })}\n </Box>\n </Box>\n )}\n\n {viewMode === 'ai' && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1} paddingY={0}>\n <Box marginBottom={1} justifyContent=\"space-between\">\n <Text bold>AI Assistant</Text>\n <Text dimColor>\n {aiState.status === 'streaming'\n ? '(streaming...)'\n : aiState.status === 'unconfigured'\n ? '(no provider)'\n : aiState.status === 'error'\n ? '(error)'\n : ''}\n </Text>\n </Box>\n\n {aiState.status === 'unconfigured' ? (\n <Box flexDirection=\"column\">\n <Text dimColor>No AI provider configured.</Text>\n <Text dimColor>Set AI_PROVIDER and AI_MODEL env vars, or start Ollama locally.</Text>\n <Text dimColor>Press a to close this view.</Text>\n </Box>\n ) : (\n <>\n {aiMessages.length === 0 && aiState.status !== 'error' && (\n <Text dimColor>Ask a question about your telemetry data. Press Enter to send.</Text>\n )}\n {aiMessages.slice(-10).map((msg, i) => (\n <Box key={`ai-msg-${i}`} flexDirection=\"column\" marginBottom={msg.role === 'assistant' ? 1 : 0}>\n <Text color={msg.role === 'user' ? 'cyan' : undefined}>\n {msg.role === 'user' ? '> ' : ''}\n {msg.content.slice(0, 1000)}\n {msg.content.length > 1000 ? '...' : ''}\n </Text>\n </Box>\n ))}\n {aiSpec && (\n <Box flexDirection=\"column\" marginBottom={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <InkRenderer spec={aiSpec} />\n </Box>\n )}\n {aiState.status === 'error' && (\n <Text color=\"red\">Error: {aiState.message}</Text>\n )}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">&gt; </Text>\n <Text>\n {aiInput || (aiInputMode ? '(type your question)' : '(press a to focus)')}\n </Text>\n </Box>\n </>\n )}\n </Box>\n )}\n\n {/* eslint-disable unicorn/no-negated-condition */}\n {viewMode !== 'topology' && viewMode !== 'ai' && (drilldownTraceId != null ? (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1} paddingY={0}>\n {/* Trace header — otel-gui style */}\n <Box marginBottom={0} flexDirection=\"column\">\n <Text bold>Trace {drilldownTraceId.slice(0, 16)}…</Text>\n <Box flexDirection=\"row\" gap={1}>\n {drilldownSummary?.services?.map((svc) => (\n <Text key={svc} color={getServiceColor(svc)}>{svc}</Text>\n ))}\n <Text dimColor>·</Text>\n <Text>{drilldownSummary?.rootName ?? 'unknown'}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>{drilldownSpans.length} spans</Text>\n <Text dimColor>·</Text>\n <Text dimColor>{drilldownSummary?.services?.length ?? 0} services</Text>\n {drilldownSummary?.hasError && <Text color=\"red\">{' '}ERROR</Text>}\n </Box>\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Duration: </Text>\n <Text color=\"green\">{formatDurationMs(drilldownSummary?.durationMs ?? 0)}</Text>\n </Box>\n </Box>\n {/* Tabs — blue active */}\n <Box marginBottom={0} flexDirection=\"row\" gap={2}>\n <Text\n color={drilldownTab === 'timeline' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'timeline'}\n bold={drilldownTab === 'timeline'}\n >\n Timeline\n </Text>\n <Text\n color={drilldownTab === 'spans' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'spans'}\n bold={drilldownTab === 'spans'}\n >\n Spans ({drilldownSpans.length})\n </Text>\n <Text\n color={drilldownTab === 'logs' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'logs'}\n bold={drilldownTab === 'logs'}\n >\n Logs ({drilldownLogs.length})\n </Text>\n </Box>\n\n {drilldownTab === 'timeline' &&\n (() => {\n const NAME_COL = 28;\n const SERVICE_COL = 12;\n const KIND_COL = 10;\n let traceStartMs = Infinity;\n for (const s of drilldownSummary?.spans ?? []) {\n if (s.startTime < traceStartMs) traceStartMs = s.startTime;\n }\n if (traceStartMs === Infinity) traceStartMs = 0;\n const traceDurMs = drilldownSummary?.durationMs ?? 1;\n const WATERFALL_WIDTH = 44;\n const items = drilldownTimeline.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT);\n\n return (\n <>\n {/* Time ruler */}\n <Box flexDirection=\"row\">\n <Text dimColor>{''.padEnd(NAME_COL + SERVICE_COL + KIND_COL + 2)}</Text>\n <Text dimColor>{buildTimeRuler(traceDurMs, WATERFALL_WIDTH)}</Text>\n </Box>\n {items.map((item, i) => {\n const isSel = i + drilldownScrollOffset === drilldownSelectedIndex;\n if (item.type === 'span' && item.span) {\n const s = item.span;\n const node = drilldownTree.find(\n (n) => n.span.spanId === s.spanId,\n );\n const depth = node?.depth ?? 0;\n const indent = ' '.repeat(Math.min(depth, 4));\n const nameWidth = NAME_COL - Math.min(depth, 4) * 2 - 1;\n const svcName = spanServiceName(s);\n const svcColor = getServiceColor(svcName);\n const kindStr = (s.kind ?? '').padEnd(KIND_COL);\n const svcStr = truncate(svcName, SERVICE_COL - 2).padEnd(SERVICE_COL);\n const errorMark = s.status === 'ERROR' ? '✗' : ' ';\n const namePart = `${indent}${truncate(s.name, nameWidth - 1)}`.padEnd(NAME_COL - 1);\n const bar = buildWaterfallBar(\n s.startTime, s.durationMs,\n traceStartMs, traceDurMs,\n WATERFALL_WIDTH,\n );\n return (\n <Box key={`${s.spanId}-${i}`} flexDirection=\"row\">\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>\n {isSel ? '▸' : ' '}<Text color={s.status === 'ERROR' ? 'red' : undefined}>{errorMark}</Text>{namePart}\n </Text>\n <Text color={svcColor}> {svcStr}</Text>\n <Text dimColor>{kindStr}</Text>\n <Text color={s.status === 'ERROR' ? 'red' : svcColor}>{bar}</Text>\n <Text color={s.status === 'ERROR' ? 'red' : svcColor}>\n {' '}{formatDurationMs(s.durationMs)}\n </Text>\n </Box>\n );\n } else if (item.type === 'log' && item.log) {\n const l = item.log;\n const levelColor =\n l.level === 'error' ? 'red' : l.level === 'warn' ? 'yellow' : 'blue';\n const relTime = drilldownSummary\n ? `+${formatDurationMs(l.time - traceStartMs)}`\n : '';\n const logName = ` ${l.level.toUpperCase()} ${truncate(l.message, NAME_COL - 8)}`.padEnd(NAME_COL);\n const logOffset = drilldownSummary\n ? Math.floor(((l.time - traceStartMs) / traceDurMs) * WATERFALL_WIDTH)\n : 0;\n const clampedOffset = Math.max(0, Math.min(logOffset, WATERFALL_WIDTH - 1));\n const logBar = ' '.repeat(clampedOffset) + '·' + ' '.repeat(WATERFALL_WIDTH - clampedOffset - 1);\n return (\n <Box key={`log-${i}`} flexDirection=\"row\">\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>\n {isSel ? '▸' : ' '}<Text color={levelColor}>{logName}</Text>\n </Text>\n <Text dimColor>{' '.padEnd(SERVICE_COL + KIND_COL + 1)}</Text>\n <Text dimColor>{logBar}</Text>\n <Text dimColor> {relTime}</Text>\n </Box>\n );\n }\n return null;\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - items.length) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n );\n })()}\n\n {drilldownTab === 'spans' &&\n drilldownTree.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT).map((node, i) => renderTreeRow(node, i + drilldownScrollOffset))}\n {drilldownTab === 'spans' &&\n Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(drilldownTree.length, LIST_HEIGHT)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n\n {drilldownTab === 'logs' &&\n drilldownLogs.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT).map((log, i) => {\n const isSel = i + drilldownScrollOffset === drilldownSelectedIndex;\n const levelColor =\n log.level === 'error'\n ? 'red'\n : log.level === 'warn'\n ? 'yellow'\n : log.level === 'info'\n ? 'green'\n : undefined;\n return (\n <Box key={`log-${i}`}>\n <Text\n backgroundColor={isSel ? 'blue' : undefined}\n color={isSel ? 'white' : undefined}\n >\n {isSel ? '▸' : ' '}\n <Text color={levelColor}>\n {' '}\n {log.level.toUpperCase()}\n </Text>{' '}\n <Text dimColor>[{truncate(log.message, 50)}]</Text>\n </Text>\n </Box>\n );\n })}\n {drilldownTab === 'logs' &&\n Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(drilldownLogs.length, LIST_HEIGHT)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n\n {/* Inline detail for selected span */}\n {drilldownSelectedItem?.type === 'span' && drilldownSelectedItem.span && (\n (() => {\n const span = drilldownSelectedItem.span;\n const { key: keyAttrs, rest: restAttrs } = keyAttrsAndRest(span.attributes);\n return (\n <Box marginTop={1} flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Box flexDirection=\"row\" gap={2}>\n <Text bold>{span.name}</Text>\n <Text color={getServiceColor(spanServiceName(span))}>{spanServiceName(span)}</Text>\n <Text dimColor>{span.kind ?? ''}</Text>\n <Text color={span.status === 'ERROR' ? 'red' : 'green'}>{span.status}</Text>\n <Text>{formatDurationMs(span.durationMs)}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Trace: {span.traceId}</Text>\n <Text dimColor>Span: {span.spanId}</Text>\n {span.parentSpanId && <Text dimColor>Parent: {span.parentSpanId}</Text>}\n </Box>\n {keyAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Key attributes</Text>\n {keyAttrs.slice(0, 6).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {restAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {restAttrs.slice(0, 8).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {/* Span Events */}\n {span.events && span.events.length > 0 && (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold dimColor>Events ({span.events.length})</Text>\n {span.events.slice(0, 5).map((ev, i) => (\n <Box key={`ev-${i}`} flexDirection=\"row\">\n <Text color={ev.name === 'exception' ? 'red' : 'yellow'}>\n {' '}{'\\u25C6'} {truncate(ev.name, 20)}\n </Text>\n <Text dimColor>\n {' '}+{formatDurationMs(ev.timeMs - span.startTime)}\n </Text>\n {ev.attributes && Object.keys(ev.attributes).length > 0 && (\n <Text dimColor>\n {' '}{Object.entries(ev.attributes).slice(0, 2).map(([k, v]) => `${k}=${String(v)}`).join(' ')}\n </Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n {/* Span Links */}\n {span.links && span.links.length > 0 && (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold dimColor>Links ({span.links.length})</Text>\n {span.links.slice(0, 5).map((lnk, i) => (\n <Box key={`lnk-${i}`} flexDirection=\"row\">\n <Text color=\"cyan\">\n {' '}{'\\u2192'} trace:{lnk.traceId.slice(0, 8)}{'\\u2026'} span:{lnk.spanId.slice(0, 8)}{'\\u2026'}\n </Text>\n {lnk.attributes && Object.keys(lnk.attributes).length > 0 && (\n <Text dimColor>\n {' '}{Object.entries(lnk.attributes).slice(0, 2).map(([k, v]) => `${k}=${String(v)}`).join(' ')}\n </Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n })()\n )}\n {/* Inline detail for selected log */}\n {drilldownSelectedItem?.type === 'log' && drilldownSelectedItem.log && (\n (() => {\n const log = drilldownSelectedItem.log;\n return (\n <Box marginTop={1} flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Box flexDirection=\"row\" gap={2}>\n <Text bold>{log.level.toUpperCase()}</Text>\n <Text>{log.message}</Text>\n </Box>\n <Text>\n <Text dimColor>Time: </Text>\n <Text>{new Date(log.time).toISOString()}</Text>\n </Text>\n {log.traceId && <Text dimColor>Trace: {log.traceId}</Text>}\n {log.spanId && <Text dimColor>Span: {log.spanId}</Text>}\n {log.attributes && Object.keys(log.attributes).length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {Object.entries(log.attributes).slice(0, 10).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 40)}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n })()\n )}\n </Box>\n ) : (\n <Box flexDirection=\"row\" gap={2}>\n <Box\n flexDirection=\"column\"\n width=\"55%\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={0}\n >\n <Box marginTop={0} marginBottom={1}>\n <Text key=\"list-title\" bold>\n {viewMode === 'trace'\n ? 'Recent traces'\n : viewMode === 'span'\n ? 'Recent spans'\n : viewMode === 'service-summary'\n ? 'Service summary'\n : viewMode === 'errors'\n ? 'Recent errors'\n : 'Recent logs'}\n </Text>\n {filterErrorsOnly && (\n <Text key=\"errors-only-label\" color=\"red\">\n {' '}\n (errors only)\n </Text>\n )}\n {searchQuery && (\n <Text key=\"search-label\" dimColor>\n {' '}\n /{searchQuery}\n </Text>\n )}\n </Box>\n\n <>\n {viewMode === 'trace' ? (\n filteredSummaries.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No traces yet. Call a traced function or hit an endpoint\n to see them here.\n </Text>\n <Text dimColor>\n Tip: trace() your handlers with autotel to get spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredSummaries.slice(0, 20).map((t, i) => {\n const isSel = i === selected;\n return (\n <Box key={t.traceId} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '▸ ' : ' '}\n </Text>\n <Text color={t.hasError ? 'red' : 'yellow'} bold={isSel}>\n {truncate(t.rootName, 28)}\n </Text>\n <Text dimColor>\n {' '}{t.spans.length} spans\n </Text>\n <Text color=\"green\">\n {' '}{formatDurationMs(t.durationMs)}\n </Text>\n <Text dimColor>\n {' '}{formatRelative(t.lastEndTime)}\n </Text>\n <Text dimColor>{' '}{t.traceId.slice(0, 12)}…</Text>\n {t.hasError && <Text color=\"red\"> ●</Text>}\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredSummaries.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'span' ? (\n filteredSpans.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No spans yet. Call a traced function or hit an endpoint to\n see them here.\n </Text>\n <Text dimColor>\n Tip: trace() your handlers with autotel to get spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredSpans.slice(0, 20).map((s, i) => {\n const isSel = i === selected;\n const svcName = spanServiceName(s);\n const svcColor = getServiceColor(svcName);\n const statusColor =\n s.status === 'ERROR'\n ? 'red'\n : s.durationMs > 500\n ? 'yellow'\n : 'green';\n return (\n <Box\n key={`${s.spanId}-${s.startTime}`}\n flexDirection=\"row\"\n >\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color={colors ? statusColor : undefined}>\n {truncate(s.name, 26)}\n </Text>\n <Text color={svcColor}> {truncate(svcName, 10)}</Text>\n <Text dimColor> {formatDurationMs(s.durationMs)}</Text>\n <Text dimColor> {formatRelative(s.endTime)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredSpans.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'service-summary' ? (\n serviceStats.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No service stats yet. Add `service.name` attributes to\n spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 1) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {serviceStats.slice(0, 20).map((svc, i) => {\n const isSel = i === selected;\n const errorRate = svc.total\n ? (svc.errors / svc.total) * 100\n : 0;\n return (\n <Box key={svc.serviceName} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text>{truncate(svc.serviceName, 16)}</Text>\n <Text dimColor>\n {' '}\n {svc.errors}/{svc.total}\n </Text>\n <Text dimColor> {errorRate.toFixed(0)}%</Text>\n <Text dimColor> p95 {formatDurationMs(svc.p95Ms)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(serviceStats.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'errors' ? (\n filteredErrorSummaries.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>No errors yet.</Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 1) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredErrorSummaries.slice(0, 20).map((e, i) => {\n const isSel = i === selected;\n return (\n <Box key={e.traceId} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color=\"red\">{truncate(e.rootName, 16)}</Text>\n <Text dimColor> {truncate(e.serviceName, 10)}</Text>\n {e.route && (\n <Text dimColor> {truncate(e.route, 14)}</Text>\n )}\n {typeof e.statusCode === 'number' && (\n <Text dimColor> {e.statusCode}</Text>\n )}\n <Text dimColor> ({e.errorCount})</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredErrorSummaries.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : filteredLogs.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No logs yet. Emit request logs or canonical log lines to see\n them here.\n </Text>\n <Text dimColor>\n Tip: hook getTerminalLogStream() into your canonical log\n line drain.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredLogs.slice(0, 20).map((log, i) => {\n const isSel = i === selected;\n const levelColor =\n log.level === 'error'\n ? 'red'\n : log.level === 'warn'\n ? 'yellow'\n : log.level === 'debug'\n ? 'gray'\n : 'green';\n return (\n <Box key={`${log.time}-${i}`} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color={colors ? levelColor : undefined}>\n {truncate(log.level.toUpperCase(), 5)}\n </Text>\n <Text> </Text>\n <Text>{truncate(log.message, 32)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredLogs.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )}\n </>\n </Box>\n\n <Box\n flexDirection=\"column\"\n width=\"45%\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={0}\n >\n <>\n <Box marginBottom={1}>\n <Text bold>Details</Text>\n </Box>\n\n {viewMode === 'errors' ? (\n (() => {\n const e = filteredErrorSummaries[selected] ?? null;\n if (!e)\n return (\n <Text dimColor>Select an error to view details.</Text>\n );\n return (\n <>\n <Text>\n <Text dimColor>Trace: </Text>\n <Text>{e.traceId}</Text>\n </Text>\n <Text dimColor>\n Service: {e.serviceName}\n {e.route ? ` • Route: ${e.route}` : ''}\n {typeof e.statusCode === 'number'\n ? ` • Status: ${e.statusCode}`\n : ''}\n </Text>\n <Text dimColor>Errors: {e.errorCount}</Text>\n <Text dimColor>\n Press T to jump to trace view for this trace.\n </Text>\n </>\n );\n })()\n ) : viewMode === 'service-summary' ? (\n (() => {\n const svc = serviceStats[selected] ?? null;\n if (!svc)\n return (\n <Text dimColor>Select a service to view details.</Text>\n );\n return (\n <>\n <Text>\n <Text dimColor>Service: </Text>\n <Text>{svc.serviceName}</Text>\n </Text>\n <Text dimColor>\n Spans: {svc.total} | Errors: {svc.errors} | Avg:{' '}\n {formatDurationMs(svc.avgMs)} | P95:{' '}\n {formatDurationMs(svc.p95Ms)}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Top routes</Text>\n {selectedServiceRouteStats.length === 0 ? (\n <Text dimColor>(no http.route)</Text>\n ) : (\n selectedServiceRouteStats.map((r) => (\n <Text key={r.route} dimColor>\n {truncate(r.route, 20)} {r.errors}/{r.total} p95{' '}\n {formatDurationMs(r.p95Ms)}\n </Text>\n ))\n )}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Hot spans</Text>\n {selectedServiceHotSpans.length === 0 ? (\n <Text dimColor>(no spans)</Text>\n ) : (\n selectedServiceHotSpans.map((h) => (\n <Text key={h.name} dimColor>\n {truncate(h.name, 20)} p95{' '}\n {formatDurationMs(h.p95Ms)} ({h.count}x)\n </Text>\n ))\n )}\n </Box>\n </>\n );\n })()\n ) : viewMode === 'log' ? (\n (() => {\n const log = filteredLogs[selected] ?? null;\n if (!log) {\n return (\n <Text dimColor>Select a log to view details.</Text>\n );\n }\n return (\n <>\n <Text>\n <Text dimColor>Level: </Text>\n <Text>{log.level.toUpperCase()}</Text>\n </Text>\n <Text>\n <Text dimColor>Time: </Text>\n <Text>{new Date(log.time).toISOString()}</Text>\n </Text>\n <Text>\n <Text dimColor>Message: </Text>\n <Text>{log.message}</Text>\n </Text>\n {log.traceId && (\n <Text dimColor>Trace: {log.traceId}</Text>\n )}\n {log.spanId && <Text dimColor>Span: {log.spanId}</Text>}\n {log.attributes &&\n Object.keys(log.attributes).length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {Object.entries(log.attributes)\n .slice(0, 10)\n .map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 40)}\n </Text>\n ))}\n </Box>\n )}\n {timelineItems.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Timeline (trace)</Text>\n {timelineItems.slice(0, 10).map((item, idx) => {\n const relMs =\n item.time -\n (selectedTraceSummary?.spans[0]?.startTime ??\n item.time);\n if (item.type === 'span' && item.span) {\n return (\n <Text key={`span-${idx}`} dimColor>\n +{relMs}ms span{' '}\n {truncate(item.span.name, 20)}\n </Text>\n );\n }\n if (item.type === 'log' && item.log) {\n return (\n <Text key={`log-${idx}`}>\n +{relMs}ms log{' '}\n {truncate(item.log.message, 24)}\n </Text>\n );\n }\n return null;\n })}\n </Box>\n )}\n </>\n );\n })()\n ) : currentSpan ? (\n <>\n <Text>\n <Text dimColor>Name: </Text>\n <Text>{currentSpan.name}</Text>\n </Text>\n <Text>\n <Text dimColor>Status: </Text>\n <Text\n color={currentSpan.status === 'ERROR' ? 'red' : 'green'}\n >\n {currentSpan.status}\n </Text>\n </Text>\n <Text>\n <Text dimColor>Duration: </Text>\n <Text>\n {formatDurationMs(currentSpan.durationMs)}\n {perSpanNameStats.byName.has(currentSpan.name) &&\n (() => {\n const p = perSpanNameStats.byName.get(\n currentSpan.name,\n )!;\n const ratio =\n p.avgMs > 0\n ? currentSpan.durationMs / p.avgMs\n : 1;\n if (ratio >= 1.5)\n return ` (${ratio.toFixed(1)}x avg)`;\n return '';\n })()}\n </Text>\n </Text>\n <Text dimColor>Trace: {currentSpan.traceId}</Text>\n <Text dimColor>Span: {currentSpan.spanId}</Text>\n {currentSpan.parentSpanId && (\n <Text dimColor>Parent: {currentSpan.parentSpanId}</Text>\n )}\n {currentSpan.kind && (\n <Text dimColor>Kind: {currentSpan.kind}</Text>\n )}\n\n {(() => {\n const { key: keyAttrs, rest: restAttrs } =\n keyAttrsAndRest(currentSpan.attributes);\n return (\n <>\n {keyAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Key attributes</Text>\n {keyAttrs.slice(0, 6).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {restAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {restAttrs.slice(0, 8).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {keyAttrs.length === 0 && restAttrs.length === 0 && (\n <Text dimColor>(no attributes)</Text>\n )}\n </>\n );\n })()}\n\n {waterfallSpans.length > 0 && drilldownTraceId != null && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Waterfall</Text>\n {waterfallSpans.slice(0, 10).map((w) => {\n const barLen =\n Math.round(\n (w.span.durationMs / waterfallMaxMs) * barWidth,\n ) || 1;\n const bar = '█'.repeat(barLen);\n const indent = ' '.repeat(w.depth);\n return (\n <Box key={w.span.spanId} flexDirection=\"row\">\n <Text dimColor>{indent}</Text>\n <Text>{truncate(w.span.name, 12)}</Text>\n <Text dimColor> {bar}</Text>\n <Text dimColor>\n {' '}\n {formatDurationMs(w.span.durationMs)}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n </>\n ) : (\n <Text dimColor>Select a trace or span to view details.</Text>\n )}\n </>\n </Box>\n </Box>\n ))}\n\n {showStats && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n Spans: {stats.total} | Span errors: {stats.errors} | Logs:{' '}\n {logStats.total} | Log errors: {logStats.errors} | Avg:{' '}\n {formatDurationMs(stats.avg)} | P95: {formatDurationMs(stats.p95)}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n// Global streaming processor for auto-wiring\nlet globalStreamingProcessor: StreamingSpanProcessor | null = null;\n\n/**\n * Check if a TracerProvider has an addSpanProcessor method\n * (Node.js SDK providers have this, but API-level providers don't)\n */\nfunction canAddSpanProcessor(\n provider: TracerProvider,\n): provider is TracerProvider & {\n addSpanProcessor: (processor: unknown) => void;\n} {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'addSpanProcessor' in provider &&\n typeof (provider as { addSpanProcessor?: unknown }).addSpanProcessor ===\n 'function'\n );\n}\n\n/**\n * Render the terminal dashboard\n *\n * Automatically wires up a streaming processor from the current tracer provider\n * if no stream is provided. Otherwise uses the provided stream.\n *\n * @param options - Dashboard configuration options\n * @param stream - Optional manual stream (for advanced use cases)\n *\n * @example Auto-wire (recommended)\n * ```typescript\n * import { init } from 'autotel'\n * import { renderTerminal } from 'autotel-terminal'\n *\n * init({ service: 'my-app' })\n * renderTerminal() // Automatically creates stream from current tracer provider\n * ```\n *\n * @example Manual stream\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n *\n * const processor = new StreamingSpanProcessor(baseProcessor)\n * const stream = createTerminalSpanStream(processor)\n * renderTerminal({}, stream)\n * ```\n */\nexport function renderTerminal(\n options: TerminalOptions = {},\n stream?: TerminalSpanStream,\n): void {\n const title = options.title ?? 'Autotel Trace Inspector';\n const showStats = options.showStats !== false;\n const maxSpans = options.maxSpans ?? 100;\n const colors = options.colors ?? Boolean(process.stdout.isTTY);\n const aiConfig = options.ai;\n\n // Check if stdin supports raw mode (needed for keyboard input)\n // If not, we disable stdin to prevent Ink from throwing an error\n const stdinOption = process.stdin.isTTY ? process.stdin : undefined;\n\n // If stream provided, use it directly\n if (stream) {\n try {\n render(\n <Dashboard\n title={title}\n showStats={showStats}\n maxSpans={maxSpans}\n colors={colors}\n stream={stream}\n logStream={getTerminalLogStream()}\n aiConfig={aiConfig}\n />,\n { stdin: stdinOption },\n );\n } catch (error) {\n console.error('[autotel-terminal] Failed to render dashboard:', error);\n }\n return;\n }\n\n // Otherwise, auto-wire from current tracer provider\n let provider: TracerProvider;\n try {\n provider = getAutotelTracerProvider();\n } catch (error) {\n console.error(\n '[autotel-terminal] Failed to get tracer provider. Call init() first or provide a stream.',\n error,\n );\n return;\n }\n\n if (!provider) {\n console.error(\n '[autotel-terminal] No tracer provider found. Call init() first or provide a stream.',\n );\n return;\n }\n\n // Check if provider supports addSpanProcessor (Node.js SDK providers do)\n if (!canAddSpanProcessor(provider)) {\n console.error(\n '[autotel-terminal] TracerProvider does not support addSpanProcessor. Provide a stream manually.',\n );\n return;\n }\n\n // Create streaming processor that doesn't wrap anything (just streams)\n // This way it doesn't interfere with existing processors\n globalStreamingProcessor = new StreamingSpanProcessor(null);\n const terminalStream = createTerminalSpanStream(globalStreamingProcessor);\n\n // Add streaming processor to provider\n provider.addSpanProcessor(globalStreamingProcessor);\n\n try {\n render(\n <Dashboard\n title={title}\n showStats={showStats}\n maxSpans={maxSpans}\n colors={colors}\n stream={terminalStream}\n logStream={getTerminalLogStream()}\n />,\n { stdin: stdinOption },\n );\n } catch (error) {\n console.error('[autotel-terminal] Failed to render dashboard:', error);\n }\n}\n\n// Re-export types and utilities\nexport type { TerminalSpanEvent, TerminalSpanStream, SpanEvent, SpanLink } from './span-stream';\nexport { StreamingSpanProcessor } from './streaming-processor';\nexport { createTerminalSpanStream } from './span-stream';\nexport { getTerminalLogStream } from './log-stream';\nexport type { TerminalLogStream } from './log-stream';\nexport type { TerminalLogEvent } from './lib/log-model';\n\n// Re-export OpenTelemetry types for advanced users\nexport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nexport { SpanStatusCode, SpanKind } from 'autotel';\n\n// Re-export PrettyConsoleExporter for convenience\nexport {\n PrettyConsoleExporter,\n type PrettyConsoleExporterOptions,\n} from 'autotel/exporters';\n","import { createServer, type Server } from 'node:http';\n\nconst LOOPBACK = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface LoopbackListeners {\n /** Resolves once the primary and (attempted) sibling listeners are up. */\n ready: Promise<{ addresses: string[]; warnings: string[] }>;\n /** Close the sibling listener (the primary server is owned by the caller). */\n closeSibling: () => Promise<void>;\n}\n\n/** Format host:port, bracketing IPv6 literals (e.g. `[::1]:4319`). */\nexport function formatAddress(host: string, port: number): string {\n return host.includes(':') ? `[${host}]:${port}` : `${host}:${port}`;\n}\n\n/**\n * Listen on `host:port`, and when `host` is a loopback literal, ALSO listen on\n * the sibling loopback family (IPv4 ⟷ IPv6) so a client reaches the collector\n * whether the OS resolves `localhost` to `127.0.0.1` or `::1`.\n *\n * Kills a silent footgun: a dev-server proxy targeting `http://localhost:PORT`\n * on macOS resolves `localhost` to `::1`, but a collector bound only to\n * `127.0.0.1` never receives the request — spans vanish with no error. If the\n * sibling family cannot bind, it is surfaced as a warning, never fatal.\n */\nexport function listenLoopbackDualStack(args: {\n primary: Server;\n port: number;\n host: string;\n attachSecondary: (server: Server) => void;\n}): LoopbackListeners {\n const { primary, port, host, attachSecondary } = args;\n let sibling: Server | undefined;\n\n const ready = new Promise<{ addresses: string[]; warnings: string[] }>(\n (resolve) => {\n const addresses: string[] = [];\n const warnings: string[] = [];\n const primaryHost = host === 'localhost' ? '127.0.0.1' : host;\n\n primary.listen(port, primaryHost, () => {\n const addr = primary.address();\n const resolvedPort =\n addr && typeof addr === 'object' ? addr.port : port;\n addresses.push(formatAddress(primaryHost, resolvedPort));\n\n if (!LOOPBACK.has(host)) {\n resolve({ addresses, warnings });\n return;\n }\n\n const siblingHost = primaryHost === '::1' ? '127.0.0.1' : '::1';\n const s = createServer();\n attachSecondary(s);\n\n const onError = (e: Error) => {\n s.close();\n warnings.push(\n `could not also bind ${formatAddress(siblingHost, resolvedPort)} (${e.message}); ` +\n `clients using the ${siblingHost === '::1' ? 'IPv6' : 'IPv4'} form of \"localhost\" may not connect.`,\n );\n resolve({ addresses, warnings });\n };\n s.once('error', onError);\n s.listen(resolvedPort, siblingHost, () => {\n s.off('error', onError);\n sibling = s;\n addresses.push(formatAddress(siblingHost, resolvedPort));\n resolve({ addresses, warnings });\n });\n });\n },\n );\n\n return {\n ready,\n closeSibling: () =>\n new Promise<void>((res) => {\n if (!sibling) return res();\n sibling.close(() => res());\n }),\n };\n}\n","import type { TerminalSpanEvent, TerminalSpanStream } from './span-stream';\n\ntype Subscriber = (event: TerminalSpanEvent) => void;\n\n/**\n * In-memory stream implementation for standalone CLI ingestion.\n */\nexport class CliTerminalSpanStream implements TerminalSpanStream {\n #subscribers = new Set<Subscriber>();\n\n onSpanEnd(callback: Subscriber): () => void {\n this.#subscribers.add(callback);\n return () => {\n this.#subscribers.delete(callback);\n };\n }\n\n push(event: TerminalSpanEvent): void {\n for (const subscriber of this.#subscribers) {\n subscriber(event);\n }\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { TerminalSpanEvent, SpanEvent, SpanLink } from './span-stream';\nimport type { TerminalLogEvent, LogLevel } from './lib/log-model';\n\nconst MAX_BODY_BYTES = 10 * 1024 * 1024; // 10 MB\n\ntype OtlpAnyValue = {\n stringValue?: string;\n boolValue?: boolean;\n intValue?: string | number;\n doubleValue?: number;\n bytesValue?: string;\n};\n\ntype OtlpKeyValue = {\n key: string;\n value?: OtlpAnyValue;\n};\n\ntype OtlpSpan = {\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n name?: string;\n kind?: number | string;\n startTimeUnixNano?: string;\n endTimeUnixNano?: string;\n attributes?: OtlpKeyValue[];\n status?: {\n code?: number | string;\n };\n events?: {\n timeUnixNano?: string;\n name?: string;\n attributes?: OtlpKeyValue[];\n }[];\n links?: {\n traceId?: string;\n spanId?: string;\n attributes?: OtlpKeyValue[];\n }[];\n};\n\nfunction anyValueToPrimitive(value: OtlpAnyValue | undefined): unknown {\n if (!value) return undefined;\n if (value.stringValue !== undefined) return value.stringValue;\n if (value.boolValue !== undefined) return value.boolValue;\n if (value.intValue !== undefined) {\n const num = Number(value.intValue);\n return Number.isNaN(num) ? value.intValue : num;\n }\n if (value.doubleValue !== undefined) return value.doubleValue;\n if (value.bytesValue !== undefined) return value.bytesValue;\n return undefined;\n}\n\nfunction attrsToRecord(\n attributes: OtlpKeyValue[] | undefined,\n): Record<string, unknown> {\n if (!attributes || attributes.length === 0) return {};\n const out: Record<string, unknown> = {};\n for (const attribute of attributes) {\n out[attribute.key] = anyValueToPrimitive(attribute.value);\n }\n return out;\n}\n\nfunction normalizeHexId(\n id: string | undefined,\n expectedHexLength: number,\n): string {\n if (!id) return ''.padStart(expectedHexLength, '0');\n const trimmed = id.trim();\n if (/^[a-fA-F0-9]+$/.test(trimmed)) {\n return trimmed\n .toLowerCase()\n .padStart(expectedHexLength, '0')\n .slice(-expectedHexLength);\n }\n try {\n const decoded = Buffer.from(trimmed, 'base64').toString('hex');\n if (decoded.length > 0) {\n return decoded\n .toLowerCase()\n .padStart(expectedHexLength, '0')\n .slice(-expectedHexLength);\n }\n } catch {\n // ignore and fall through\n }\n return ''.padStart(expectedHexLength, '0');\n}\n\nfunction toMs(unixNano: string | undefined): number {\n if (!unixNano) return Date.now();\n const parsed = Number(unixNano);\n if (Number.isNaN(parsed)) return Date.now();\n return parsed / 1_000_000;\n}\n\nfunction mapStatus(\n code: number | string | undefined,\n): 'OK' | 'ERROR' | 'UNSET' {\n const normalized = typeof code === 'string' ? code.toUpperCase() : code;\n if (\n normalized === 1 ||\n normalized === 'STATUS_CODE_OK' ||\n normalized === 'OK'\n )\n return 'OK';\n if (\n normalized === 2 ||\n normalized === 'STATUS_CODE_ERROR' ||\n normalized === 'ERROR'\n ) {\n return 'ERROR';\n }\n return 'UNSET';\n}\n\nfunction mapKind(kind: number | string | undefined): string {\n if (typeof kind === 'string') return kind.toUpperCase();\n switch (kind) {\n case 1: {\n return 'INTERNAL';\n }\n case 2: {\n return 'SERVER';\n }\n case 3: {\n return 'CLIENT';\n }\n case 4: {\n return 'PRODUCER';\n }\n case 5: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n}\n\nfunction* extractSpans(\n payload: unknown,\n): Generator<{ span: OtlpSpan; resourceAttrs: Record<string, unknown> }> {\n if (!payload || typeof payload !== 'object') return;\n const resourceSpans = (payload as { resourceSpans?: unknown[] })\n .resourceSpans;\n if (!Array.isArray(resourceSpans)) return;\n for (const resourceSpan of resourceSpans) {\n if (!resourceSpan || typeof resourceSpan !== 'object') continue;\n const resource = (resourceSpan as { resource?: { attributes?: OtlpKeyValue[] } }).resource;\n const resourceAttrs = attrsToRecord(resource?.attributes);\n const scopeSpans = (resourceSpan as { scopeSpans?: unknown[] }).scopeSpans;\n if (!Array.isArray(scopeSpans)) continue;\n for (const scopeSpan of scopeSpans) {\n if (!scopeSpan || typeof scopeSpan !== 'object') continue;\n const spans = (scopeSpan as { spans?: unknown[] }).spans;\n if (!Array.isArray(spans)) continue;\n for (const span of spans) {\n if (span && typeof span === 'object') {\n yield { span: span as OtlpSpan, resourceAttrs };\n }\n }\n }\n }\n}\n\nexport function otlpSpanToTerminalEvent(\n span: OtlpSpan,\n resourceAttrs: Record<string, unknown> = {},\n): TerminalSpanEvent {\n const startTime = toMs(span.startTimeUnixNano);\n const endTime = toMs(span.endTimeUnixNano);\n const spanAttrs = attrsToRecord(span.attributes);\n // Merge resource attributes (e.g. service.name) under span attributes,\n // with span-level attributes taking precedence\n const mergedAttrs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(resourceAttrs)) {\n mergedAttrs[k] = v;\n }\n for (const [k, v] of Object.entries(spanAttrs)) {\n mergedAttrs[k] = v;\n }\n const parsedEvents: SpanEvent[] | undefined = span.events?.length\n ? span.events.map((e) => ({\n name: e.name || '',\n timeMs: toMs(e.timeUnixNano),\n attributes: attrsToRecord(e.attributes),\n }))\n : undefined;\n\n const parsedLinks: SpanLink[] | undefined = span.links?.length\n ? span.links.map((l) => ({\n traceId: normalizeHexId(l.traceId, 32),\n spanId: normalizeHexId(l.spanId, 16),\n attributes: attrsToRecord(l.attributes),\n }))\n : undefined;\n\n return {\n name: span.name || 'unnamed',\n spanId: normalizeHexId(span.spanId, 16),\n traceId: normalizeHexId(span.traceId, 32),\n parentSpanId: span.parentSpanId\n ? normalizeHexId(span.parentSpanId, 16)\n : undefined,\n startTime,\n endTime,\n durationMs: Math.max(0, endTime - startTime),\n status: mapStatus(span.status?.code),\n kind: mapKind(span.kind),\n attributes: mergedAttrs,\n ...(parsedEvents ? { events: parsedEvents } : {}),\n ...(parsedLinks ? { links: parsedLinks } : {}),\n };\n}\n\nexport async function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n let totalLength = 0;\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalLength += buf.length;\n if (totalLength > MAX_BODY_BYTES) {\n throw new Error(`Body exceeds ${MAX_BODY_BYTES} byte limit`);\n }\n chunks.push(buf);\n }\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) return {};\n return JSON.parse(raw);\n}\n\nexport function sendJson(\n res: ServerResponse,\n status: number,\n data: Record<string, unknown>,\n): void {\n res.statusCode = status;\n res.setHeader('content-type', 'application/json');\n res.end(JSON.stringify(data));\n}\n\nexport function parseOtlpEvents(payload: unknown): TerminalSpanEvent[] {\n const events: TerminalSpanEvent[] = [];\n for (const { span, resourceAttrs } of extractSpans(payload)) {\n events.push(otlpSpanToTerminalEvent(span, resourceAttrs));\n }\n return events;\n}\n\n// --- OTLP Log parsing ---\n\ntype OtlpLogRecord = {\n timeUnixNano?: string;\n observedTimeUnixNano?: string;\n severityNumber?: number;\n severityText?: string;\n body?: OtlpAnyValue;\n attributes?: OtlpKeyValue[];\n traceId?: string;\n spanId?: string;\n};\n\nfunction mapSeverityToLevel(\n severityNumber?: number,\n severityText?: string,\n): LogLevel {\n if (severityText) {\n const lower = severityText.toLowerCase();\n if (lower.startsWith('debug') || lower === 'trace') return 'debug';\n if (lower.startsWith('info')) return 'info';\n if (lower.startsWith('warn')) return 'warn';\n if (lower.startsWith('error') || lower.startsWith('fatal')) return 'error';\n }\n if (severityNumber !== undefined) {\n if (severityNumber <= 4) return 'debug';\n if (severityNumber <= 8) return 'debug';\n if (severityNumber <= 12) return 'info';\n if (severityNumber <= 16) return 'warn';\n return 'error';\n }\n return 'info';\n}\n\nfunction bodyToMessage(body: OtlpAnyValue | undefined): string {\n if (!body) return '';\n const value = anyValueToPrimitive(body);\n return value === undefined ? '' : String(value);\n}\n\nfunction* extractLogRecords(payload: unknown): Generator<OtlpLogRecord> {\n if (!payload || typeof payload !== 'object') return;\n const resourceLogs = (payload as { resourceLogs?: unknown[] }).resourceLogs;\n if (!Array.isArray(resourceLogs)) return;\n for (const resourceLog of resourceLogs) {\n if (!resourceLog || typeof resourceLog !== 'object') continue;\n const scopeLogs = (resourceLog as { scopeLogs?: unknown[] }).scopeLogs;\n if (!Array.isArray(scopeLogs)) continue;\n for (const scopeLog of scopeLogs) {\n if (!scopeLog || typeof scopeLog !== 'object') continue;\n const logRecords = (scopeLog as { logRecords?: unknown[] }).logRecords;\n if (!Array.isArray(logRecords)) continue;\n for (const record of logRecords) {\n if (record && typeof record === 'object') {\n yield record as OtlpLogRecord;\n }\n }\n }\n }\n}\n\nexport function parseOtlpLogEvents(payload: unknown): TerminalLogEvent[] {\n const events: TerminalLogEvent[] = [];\n for (const record of extractLogRecords(payload)) {\n const time = toMs(record.timeUnixNano || record.observedTimeUnixNano);\n events.push({\n time,\n level: mapSeverityToLevel(record.severityNumber, record.severityText),\n message: bodyToMessage(record.body),\n traceId: record.traceId ? normalizeHexId(record.traceId, 32) : undefined,\n spanId: record.spanId ? normalizeHexId(record.spanId, 16) : undefined,\n attributes: attrsToRecord(record.attributes),\n });\n }\n return events;\n}\n\n// --- OTLP Metrics parsing (accept and count) ---\n\nexport function countOtlpMetrics(payload: unknown): number {\n if (!payload || typeof payload !== 'object') return 0;\n let count = 0;\n const resourceMetrics = (payload as { resourceMetrics?: unknown[] })\n .resourceMetrics;\n if (!Array.isArray(resourceMetrics)) return 0;\n for (const resourceMetric of resourceMetrics) {\n if (!resourceMetric || typeof resourceMetric !== 'object') continue;\n const scopeMetrics = (resourceMetric as { scopeMetrics?: unknown[] })\n .scopeMetrics;\n if (!Array.isArray(scopeMetrics)) continue;\n for (const scopeMetric of scopeMetrics) {\n if (!scopeMetric || typeof scopeMetric !== 'object') continue;\n const metrics = (scopeMetric as { metrics?: unknown[] }).metrics;\n if (Array.isArray(metrics)) {\n count += metrics.length;\n }\n }\n }\n return count;\n}\n","#!/usr/bin/env node\nimport { readFileSync } from 'node:fs';\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport { renderTerminal } from './index';\nimport { listenLoopbackDualStack } from './listen';\nimport { getTerminalLogStream } from './log-stream';\nimport { CliTerminalSpanStream } from './cli-stream';\nimport {\n countOtlpMetrics,\n parseOtlpEvents,\n parseOtlpLogEvents,\n readJsonBody,\n sendJson,\n} from './otlp-http-json';\n\nimport type { AIConfig, AIProviderType } from './ai/types';\n\ntype CliOptions = {\n port: number;\n host: string;\n title?: string;\n ai: Partial<AIConfig>;\n};\n\nfunction printHelp(): void {\n process.stdout.write(\n String.raw`autotel-terminal - Standalone OTLP receiver with terminal dashboard\n\nUsage: autotel-terminal [options]\n\nOptions:\n -p, --port <port> Port to listen on (default: 4319, env: AUTOTEL_TERMINAL_PORT)\n -H, --host <host> Host to bind to (default: 127.0.0.1, env: AUTOTEL_TERMINAL_HOST)\n -t, --title <title> Dashboard title (env: AUTOTEL_TERMINAL_TITLE)\n -h, --help Show this help message\n -v, --version Show version number\n\nAI Options:\n --ai-provider <provider> AI provider: ollama, openai, openai-compatible (env: AI_PROVIDER)\n --ai-model <model> AI model name (env: AI_MODEL)\n --ai-api-key <key> API key for cloud providers (env: AI_API_KEY)\n --ai-base-url <url> Custom AI endpoint URL (env: AI_BASE_URL)\n\n Auto-detection: if Ollama is running locally, it is used automatically.\n If OPENAI_API_KEY is set, OpenAI is used. Press 'a' in the dashboard to toggle AI.\n\nEndpoints:\n POST /v1/traces Receive OTLP JSON trace data\n POST /v1/logs Receive OTLP JSON log data\n POST /v1/metrics Receive OTLP JSON metric data (accepted and counted)\n GET /healthz Health check\n\nExamples:\n npx autotel-terminal\n npx autotel-terminal --ai-provider ollama --ai-model granite4\n AI_API_KEY=sk-... npx autotel-terminal --ai-provider openai --ai-model gpt-4o\n` + '\\n',\n );\n}\n\nfunction printVersion(): void {\n try {\n const dir = import.meta.dirname ?? new URL('.', import.meta.url).pathname;\n const pkgPath = path.resolve(dir, '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n process.stdout.write(`${pkg.version}\\n`);\n } catch {\n process.stdout.write('unknown\\n');\n }\n}\n\nfunction parseArgs(argv: string[]): CliOptions | null {\n const options: CliOptions = {\n port: Number(process.env.AUTOTEL_TERMINAL_PORT || 4319),\n host: process.env.AUTOTEL_TERMINAL_HOST || '127.0.0.1',\n title: process.env.AUTOTEL_TERMINAL_TITLE,\n ai: {},\n };\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n const next = argv[i + 1];\n\n if (arg === '--help' || arg === '-h') {\n printHelp();\n return null;\n }\n if (arg === '--version' || arg === '-v') {\n printVersion();\n return null;\n }\n if ((arg === '--port' || arg === '-p') && next) {\n options.port = Number(next);\n i++;\n continue;\n }\n if ((arg === '--host' || arg === '-H') && next) {\n options.host = next;\n i++;\n continue;\n }\n if ((arg === '--title' || arg === '-t') && next) {\n options.title = next;\n i++;\n continue;\n }\n if (arg === '--ai-provider' && next) {\n options.ai.provider = next as AIProviderType;\n i++;\n continue;\n }\n if (arg === '--ai-model' && next) {\n options.ai.model = next;\n i++;\n continue;\n }\n if (arg === '--ai-api-key' && next) {\n options.ai.apiKey = next;\n i++;\n continue;\n }\n if (arg === '--ai-base-url' && next) {\n options.ai.baseUrl = next;\n i++;\n }\n }\n\n return options;\n}\n\nconst OTLP_ROUTES = new Set(['/v1/traces', '/v1/logs', '/v1/metrics']);\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n if (!options) {\n process.exit(0);\n }\n\n const spanStream = new CliTerminalSpanStream();\n const logStream = getTerminalLogStream();\n\n renderTerminal(\n {\n title:\n options.title || `Autotel Terminal (${options.host}:${options.port})`,\n ai: options.ai,\n },\n spanStream,\n );\n\n const requestHandler = async (\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> => {\n if (req.method === 'GET' && req.url === '/healthz') {\n sendJson(res, 200, { ok: true });\n return;\n }\n\n if (req.method !== 'POST' || !OTLP_ROUTES.has(req.url ?? '')) {\n sendJson(res, 404, { error: 'Not found' });\n return;\n }\n\n try {\n const payload = await readJsonBody(req);\n\n if (req.url === '/v1/traces') {\n const events = parseOtlpEvents(payload);\n for (const event of events) {\n spanStream.push(event);\n }\n sendJson(res, 200, { acceptedSpans: events.length });\n return;\n }\n\n if (req.url === '/v1/logs') {\n const events = parseOtlpLogEvents(payload);\n for (const event of events) {\n logStream.emit(event);\n }\n sendJson(res, 200, { acceptedLogs: events.length });\n return;\n }\n\n if (req.url === '/v1/metrics') {\n const count = countOtlpMetrics(payload);\n sendJson(res, 200, { acceptedMetrics: count });\n return;\n }\n } catch (error) {\n sendJson(res, 400, {\n error: 'Invalid OTLP JSON payload',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const server = createServer(requestHandler);\n\n // Bind both loopback families when host is loopback, so a `localhost` proxy\n // reaches us whether it resolves to 127.0.0.1 or ::1 (the macOS IPv6 footgun).\n const listeners = listenLoopbackDualStack({\n primary: server,\n port: options.port,\n host: options.host,\n attachSecondary: (s) => s.on('request', requestHandler),\n });\n\n const { addresses, warnings } = await listeners.ready;\n process.stdout.write(\n `[autotel-terminal] listening on ${addresses.join(' + ')}\\n`,\n );\n process.stdout.write(\n '[autotel-terminal] endpoints: /v1/traces, /v1/logs, /v1/metrics\\n',\n );\n process.stdout.write(\n '[autotel-terminal] set OTEL_EXPORTER_OTLP_PROTOCOL=http/json and OTEL_EXPORTER_OTLP_ENDPOINT to this host/port\\n',\n );\n for (const w of warnings) {\n process.stdout.write(`[autotel-terminal] ⚠ ${w}\\n`);\n }\n\n const shutdown = () => {\n Promise.all([\n new Promise<void>((r) => server.close(() => r())),\n listeners.closeSibling(),\n ]).then(() => process.exit(0));\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nmain().catch((error) => {\n process.stderr.write(\n `[autotel-terminal] failed to start: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/streaming-processor.ts","../src/span-stream.ts","../src/lib/trace-model.ts","../src/lib/format.ts","../src/lib/service-colors.ts","../src/lib/log-model.ts","../src/log-stream.ts","../src/lib/stats-model.ts","../src/lib/filters.ts","../src/lib/error-model.ts","../src/lib/topology-model.ts","../src/lib/topology-render.ts","../src/lib/export-model.ts","../src/ai/provider.ts","../src/ai/system-prompt.ts","../src/ai/tools.ts","../src/ai/stream.ts","../src/index.tsx","../src/listen.ts","../src/cli-stream.ts","../src/otlp-http-json.ts","../src/cli.ts"],"names":["SpanStatusCode","SpanKind","t","getServiceName","standardComponentDefinitions","tool","z","validateSpec","mod","useState","useRef","useEffect","useMemo","useStdin","useInput","jsxs","Box","jsx","Text","Fragment","InkRenderer","render","getAutotelTracerProvider","createServer","mapStatus","mapKind","path","readFileSync"],"mappings":"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","file":"cli.cjs","sourcesContent":["/**\n * Streaming Span Processor\n *\n * A span processor that emits ReadableSpan objects to subscribers.\n * This allows real-time streaming of spans to terminal dashboards and other consumers.\n *\n * @example Basic usage\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { BatchSpanProcessor } from 'autotel/processors'\n * import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\n *\n * const exporter = new OTLPTraceExporter({ url: 'http://localhost:4318/v1/traces' })\n * const baseProcessor = new BatchSpanProcessor(exporter)\n * const streamingProcessor = new StreamingSpanProcessor(baseProcessor)\n *\n * // Subscribe to spans\n * const unsubscribe = streamingProcessor.subscribe((span) => {\n * console.log('Span ended:', span.name)\n * })\n *\n * // Later, unsubscribe\n * unsubscribe()\n * ```\n */\n\nimport type {\n SpanProcessor,\n ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\nimport type { Context } from '@opentelemetry/api';\nimport type { Span } from '@opentelemetry/sdk-trace-base';\n\n/**\n * Span processor that wraps another processor and emits spans to subscribers\n *\n * This processor forwards all span operations to a wrapped processor while\n * also emitting completed spans to registered subscribers. This enables\n * real-time streaming of spans to terminal dashboards, loggers, or other\n * consumers without interfering with normal span processing.\n */\nexport class StreamingSpanProcessor implements SpanProcessor {\n private wrappedProcessor: SpanProcessor | null;\n private subscribers = new Set<(span: ReadableSpan) => void>();\n\n /**\n * Create a new streaming span processor\n *\n * @param wrappedProcessor - The processor to wrap and forward spans to.\n * If null, spans are only emitted to subscribers (no forwarding).\n */\n constructor(wrappedProcessor: SpanProcessor | null = null) {\n this.wrappedProcessor = wrappedProcessor;\n }\n\n onStart(span: Span, parentContext: Context): void {\n if (this.wrappedProcessor) {\n this.wrappedProcessor.onStart(span, parentContext);\n }\n }\n\n onEnd(span: ReadableSpan): void {\n // Emit to all subscribers first\n for (const subscriber of this.subscribers) {\n try {\n subscriber(span);\n } catch (error) {\n // Don't let subscriber errors break span processing\n console.error('[autotel-terminal] Subscriber error:', error);\n }\n }\n\n // Forward to wrapped processor\n if (this.wrappedProcessor) {\n this.wrappedProcessor.onEnd(span);\n }\n }\n\n /**\n * Subscribe to span end events\n *\n * @param callback - Function called when a span ends\n * @returns Unsubscribe function\n *\n * @example\n * ```typescript\n * const unsubscribe = processor.subscribe((span) => {\n * console.log('Span ended:', span.name)\n * })\n *\n * // Later, unsubscribe\n * unsubscribe()\n * ```\n */\n subscribe(callback: (span: ReadableSpan) => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n async forceFlush(): Promise<void> {\n if (this.wrappedProcessor) {\n return this.wrappedProcessor.forceFlush();\n }\n }\n\n async shutdown(): Promise<void> {\n // Clear subscribers\n this.subscribers.clear();\n if (this.wrappedProcessor) {\n return this.wrappedProcessor.shutdown();\n }\n }\n}\n","/**\n * Terminal Span Stream\n *\n * Converts OpenTelemetry ReadableSpan objects to TerminalSpanEvent format\n * for consumption by the terminal dashboard.\n */\n\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nimport { SpanStatusCode, SpanKind } from 'autotel';\nimport type { StreamingSpanProcessor } from './streaming-processor';\n\n/** Span event (e.g. exception, log annotation) */\nexport interface SpanEvent {\n /** Event name */\n name: string;\n /** Time in milliseconds since epoch */\n timeMs: number;\n /** Event attributes */\n attributes?: Record<string, unknown>;\n}\n\n/** Span link (cross-trace reference) */\nexport interface SpanLink {\n /** Linked trace ID */\n traceId: string;\n /** Linked span ID */\n spanId: string;\n /** Link attributes */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Span event format for terminal dashboard consumption\n */\nexport interface TerminalSpanEvent {\n /** Span name */\n name: string;\n /** Span ID (hex string) */\n spanId: string;\n /** Trace ID (hex string) */\n traceId: string;\n /** Parent span ID (hex string, optional) */\n parentSpanId?: string;\n /** Start time in milliseconds since epoch */\n startTime: number;\n /** End time in milliseconds since epoch */\n endTime: number;\n /** Duration in milliseconds */\n durationMs: number;\n /** Span status */\n status: 'OK' | 'ERROR' | 'UNSET';\n /** Span kind (INTERNAL, SERVER, CLIENT, etc.) */\n kind?: string;\n /** Span attributes */\n attributes?: Record<string, unknown>;\n /** Span events (exceptions, annotations) */\n events?: SpanEvent[];\n /** Span links (cross-trace references) */\n links?: SpanLink[];\n}\n\n/**\n * Stream interface for terminal dashboard\n */\nexport interface TerminalSpanStream {\n /**\n * Subscribe to span end events\n *\n * @param callback - Called when a span ends\n * @returns Unsubscribe function\n */\n onSpanEnd(callback: (event: TerminalSpanEvent) => void): () => void;\n}\n\n/**\n * Convert OpenTelemetry time tuple to milliseconds\n */\nfunction timeToMs([seconds, nanoseconds]: [number, number]): number {\n return seconds * 1000 + nanoseconds / 1_000_000;\n}\n\n/**\n * Map SpanStatusCode to string\n */\nfunction mapStatus(code: SpanStatusCode): 'OK' | 'ERROR' | 'UNSET' {\n if (code === SpanStatusCode.OK) {\n return 'OK';\n }\n if (code === SpanStatusCode.ERROR) {\n return 'ERROR';\n }\n return 'UNSET';\n}\n\n/**\n * Map SpanKind number to string\n */\nfunction mapKind(kind: SpanKind): string {\n const kindMap: Record<number, string> = {\n [SpanKind.INTERNAL]: 'INTERNAL',\n [SpanKind.SERVER]: 'SERVER',\n [SpanKind.CLIENT]: 'CLIENT',\n [SpanKind.PRODUCER]: 'PRODUCER',\n [SpanKind.CONSUMER]: 'CONSUMER',\n };\n return kindMap[kind] ?? 'UNKNOWN';\n}\n\n/**\n * Create a terminal span stream from a streaming processor\n *\n * @param processor - The streaming span processor to subscribe to\n * @returns Terminal span stream interface\n *\n * @example\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n *\n * const processor = new StreamingSpanProcessor(baseProcessor)\n * const stream = createTerminalSpanStream(processor)\n *\n * stream.onSpanEnd((event) => {\n * console.log('Span:', event.name, event.durationMs + 'ms')\n * })\n * ```\n */\nexport function createTerminalSpanStream(\n processor: StreamingSpanProcessor,\n): TerminalSpanStream {\n return {\n onSpanEnd(callback) {\n return processor.subscribe((span: ReadableSpan) => {\n const spanContext = span.spanContext();\n // parentSpanId is not part of the standard ReadableSpan interface\n // but some implementations (like Node.js SDK) include it\n const parentSpanId =\n 'parentSpanId' in span && typeof span.parentSpanId === 'string'\n ? span.parentSpanId\n : undefined;\n\n // Convert time tuples to milliseconds\n const startTime = timeToMs(span.startTime);\n const endTime = timeToMs(span.endTime);\n const durationMs = endTime - startTime;\n\n // Merge resource attributes (e.g. service.name) with span attributes\n const resourceAttrs = (span.resource?.attributes ?? {}) as Record<\n string,\n unknown\n >;\n const spanAttrs = span.attributes as Record<string, unknown>;\n const mergedAttrs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(resourceAttrs)) {\n mergedAttrs[k] = v;\n }\n for (const [k, v] of Object.entries(spanAttrs)) {\n mergedAttrs[k] = v;\n }\n\n const spanEvents: SpanEvent[] | undefined = span.events?.length\n ? span.events.map((e) => ({\n name: e.name,\n timeMs: timeToMs(e.time),\n attributes: e.attributes as Record<string, unknown> | undefined,\n }))\n : undefined;\n\n const spanLinks: SpanLink[] | undefined = span.links?.length\n ? span.links.map((l) => ({\n traceId: l.context.traceId,\n spanId: l.context.spanId,\n attributes: l.attributes as Record<string, unknown> | undefined,\n }))\n : undefined;\n\n // Create terminal event\n const event: TerminalSpanEvent = {\n name: span.name,\n spanId: spanContext.spanId,\n traceId: spanContext.traceId,\n parentSpanId,\n startTime,\n endTime,\n durationMs,\n status: mapStatus(span.status.code),\n kind: mapKind(span.kind),\n attributes: mergedAttrs,\n ...(spanEvents ? { events: spanEvents } : {}),\n ...(spanLinks ? { links: spanLinks } : {}),\n };\n\n callback(event);\n });\n },\n };\n}\n","/**\n * Trace model utilities - pure logic for trace grouping, tree building, and filtering.\n * Kept in lib/ for testability; no React or Ink.\n */\n\nimport type { TerminalSpanEvent } from '../span-stream';\n\n/** Extract service name from span attributes */\nexport function spanServiceName(span: TerminalSpanEvent): string {\n const svc = span.attributes?.['service.name'];\n return typeof svc === 'string' ? svc : 'unknown';\n}\n\n/** Trace summary for the \"Recent traces\" list */\nexport interface TraceSummary {\n traceId: string;\n rootName: string;\n durationMs: number;\n hasError: boolean;\n spanCount: number;\n lastEndTime: number;\n spans: TerminalSpanEvent[];\n services: string[];\n}\n\n/** Tree node for indented span tree (parent/child) */\nexport interface SpanTreeNode {\n span: TerminalSpanEvent;\n depth: number;\n children: SpanTreeNode[];\n}\n\n/** Span with depth for waterfall (sorted by startTime, then depth) */\nexport interface SpanWithDepth {\n span: TerminalSpanEvent;\n depth: number;\n}\n\n/** Aggregate stats over spans */\nexport interface SpanStats {\n total: number;\n errors: number;\n avg: number;\n p95: number;\n}\n\n/** Per-span-name stats for \"3x slower than average\" */\nexport interface PerSpanNameStats {\n byName: Map<string, { count: number; totalMs: number; avgMs: number }>;\n}\n\n/**\n * Build a map traceId -> spans[] from a flat list of spans.\n * Traces are ordered by most recent span end time (latest first).\n */\nexport function buildTraceMap(\n spans: TerminalSpanEvent[],\n maxTraces = 50,\n): Map<string, TerminalSpanEvent[]> {\n const byTrace = new Map<string, TerminalSpanEvent[]>();\n for (const s of spans) {\n const list = byTrace.get(s.traceId) ?? [];\n list.push(s);\n byTrace.set(s.traceId, list);\n }\n // Sort traces by latest span end time (desc)\n const entries = [...byTrace.entries()].toSorted((a, b) => {\n const maxA = Math.max(...a[1].map((x) => x.endTime));\n const maxB = Math.max(...b[1].map((x) => x.endTime));\n return maxB - maxA;\n });\n const limited = entries.slice(0, maxTraces);\n return new Map(limited);\n}\n\n/**\n * Build a trace summary for the \"Recent traces\" list.\n * Root = span with no parentSpanId or parent not in this trace; duration = root duration or max end - min start.\n */\nexport function buildTraceSummaries(\n traceMap: Map<string, TerminalSpanEvent[]>,\n): TraceSummary[] {\n const summaries: TraceSummary[] = [];\n for (const [traceId, traceSpans] of traceMap) {\n const spanIds = new Set(traceSpans.map((s) => s.spanId));\n const root =\n traceSpans.find((s) => !s.parentSpanId || !spanIds.has(s.parentSpanId)) ??\n traceSpans[0];\n const durationMs = root ? root.durationMs : 0;\n const hasError = traceSpans.some((s) => s.status === 'ERROR');\n const lastEndTime = Math.max(...traceSpans.map((s) => s.endTime));\n const services = [...new Set(traceSpans.map((s) => spanServiceName(s)))];\n summaries.push({\n traceId,\n rootName: root?.name ?? 'unknown',\n durationMs,\n hasError,\n spanCount: traceSpans.length,\n lastEndTime,\n spans: traceSpans,\n services,\n });\n }\n return summaries;\n}\n\n/**\n * Build a parent-child tree from spans of one trace.\n * Root = span with no parentSpanId (or parent not in list); children by parentSpanId.\n */\nexport function buildTraceTree(spans: TerminalSpanEvent[]): SpanTreeNode[] {\n const byId = new Map<string, TerminalSpanEvent>();\n for (const s of spans) {\n byId.set(s.spanId, s);\n }\n const roots: SpanTreeNode[] = [];\n\n function addNode(span: TerminalSpanEvent, depth: number): SpanTreeNode {\n const children = spans\n .filter((s) => s.parentSpanId === span.spanId)\n .map((s) => addNode(s, depth + 1));\n return { span, depth, children };\n }\n\n const rootSpans = spans.filter(\n (s) => !s.parentSpanId || !byId.has(s.parentSpanId),\n );\n for (const s of rootSpans) {\n roots.push(addNode(s, 0));\n }\n return roots;\n}\n\n/**\n * Flatten tree to list for display (pre-order: root, then children).\n */\nexport function flattenTraceTree(nodes: SpanTreeNode[]): SpanTreeNode[] {\n const out: SpanTreeNode[] = [];\n function walk(n: SpanTreeNode) {\n out.push(n);\n for (const c of n.children) walk(c);\n }\n for (const n of nodes) walk(n);\n return out;\n}\n\n/**\n * Sort spans for waterfall: by startTime, then by depth (parent before children at same time).\n */\nexport function sortSpansForWaterfall(\n spans: TerminalSpanEvent[],\n): SpanWithDepth[] {\n const byId = new Map<string, TerminalSpanEvent>();\n for (const s of spans) byId.set(s.spanId, s);\n\n function depth(s: TerminalSpanEvent): number {\n if (!s.parentSpanId || !byId.has(s.parentSpanId)) return 0;\n const parent = byId.get(s.parentSpanId)!;\n return 1 + depth(parent);\n }\n\n const withDepth = spans.map((s) => ({ span: s, depth: depth(s) }));\n withDepth.sort((a, b) => {\n if (a.span.startTime !== b.span.startTime)\n return a.span.startTime - b.span.startTime;\n return a.depth - b.depth;\n });\n return withDepth;\n}\n\n/**\n * Filter spans by search query (substring match on name) and optional errors-only.\n */\nexport function filterBySearch(\n spans: TerminalSpanEvent[],\n searchQuery: string,\n errorsOnly: boolean,\n): TerminalSpanEvent[] {\n let list = spans;\n if (errorsOnly) list = list.filter((s) => s.status === 'ERROR');\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n return list.filter((s) => s.name.toLowerCase().includes(q));\n}\n\n/**\n * Filter trace summaries: include trace if any span name matches search (or search empty) and optionally has error.\n */\nexport function filterTraceSummaries(\n summaries: TraceSummary[],\n searchQuery: string,\n errorsOnly: boolean,\n): TraceSummary[] {\n let list = summaries;\n if (errorsOnly) list = list.filter((s) => s.hasError);\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n return list.filter((s) =>\n s.spans.some((sp) => sp.name.toLowerCase().includes(q)),\n );\n}\n\n/**\n * Compute aggregate stats over spans.\n */\nexport function computeStats(spans: TerminalSpanEvent[]): SpanStats {\n const total = spans.length;\n const errors = spans.filter((s) => s.status === 'ERROR').length;\n const avg = total ? spans.reduce((a, s) => a + s.durationMs, 0) / total : 0;\n const p95 = total\n ? (() => {\n const sorted = spans.map((s) => s.durationMs).toSorted((a, b) => a - b);\n return sorted[Math.floor(sorted.length * 0.95)] ?? 0;\n })()\n : 0;\n return { total, errors, avg, p95 };\n}\n\n/**\n * Compute per-span-name stats for \"Nx slower than average\".\n */\nexport function computePerSpanNameStats(\n spans: TerminalSpanEvent[],\n): PerSpanNameStats {\n const byName = new Map<string, { count: number; totalMs: number }>();\n for (const s of spans) {\n const cur = byName.get(s.name) ?? { count: 0, totalMs: 0 };\n cur.count += 1;\n cur.totalMs += s.durationMs;\n byName.set(s.name, cur);\n }\n const result = new Map<\n string,\n { count: number; totalMs: number; avgMs: number }\n >();\n for (const [name, { count, totalMs }] of byName) {\n result.set(name, { count, totalMs, avgMs: totalMs / count });\n }\n return { byName: result };\n}\n","/**\n * Format utilities - duration, relative time, truncation.\n * Pure functions for testability.\n */\n\n/**\n * Format duration: ms or seconds with 2 decimals.\n */\nexport function formatDurationMs(n: number): string {\n if (n < 1000) return `${n.toFixed(0)}ms`;\n return `${(n / 1000).toFixed(2)}s`;\n}\n\n/**\n * Format relative time: \"just now\" | \"Ns ago\" | \"Nm ago\" | \"Nh ago\".\n */\nexport function formatRelative(epochMs: number): string {\n const now = Date.now();\n const diffMs = now - epochMs;\n if (diffMs < 0) return 'just now';\n if (diffMs < 1000) return 'just now';\n if (diffMs < 60_000) return `${Math.floor(diffMs / 1000)}s ago`;\n if (diffMs < 3_600_000) return `${Math.floor(diffMs / 60_000)}m ago`;\n return `${Math.floor(diffMs / 3_600_000)}h ago`;\n}\n\n/**\n * Truncate string with ellipsis.\n */\nexport function truncate(s: string, width: number): string {\n if (s.length <= width) return s;\n return s.slice(0, Math.max(0, width - 1)) + '…';\n}\n\n/**\n * Build a fixed-width waterfall bar string.\n * The bar is positioned proportionally within the total width\n * based on the span's start offset and duration relative to the trace.\n */\nexport function buildWaterfallBar(\n spanStart: number,\n spanDuration: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): string {\n if (width <= 0) return '';\n if (traceDuration <= 0) return ' '.repeat(width);\n const offsetRatio = (spanStart - traceStart) / traceDuration;\n const widthRatio = spanDuration / traceDuration;\n const barStart = Math.max(0, Math.floor(offsetRatio * width));\n const barLen = Math.max(1, Math.round(widthRatio * width));\n const clampedStart = Math.min(barStart, width - 1);\n const clampedLen = Math.min(barLen, width - clampedStart);\n const trailing = Math.max(0, width - clampedStart - clampedLen);\n return (\n ' '.repeat(clampedStart) + '█'.repeat(clampedLen) + ' '.repeat(trailing)\n );\n}\n\n/**\n * Build a fixed-width time ruler string.\n * Format: \"0ms 500ms 1000ms\"\n */\nexport function buildTimeRuler(totalMs: number, width: number): string {\n if (width <= 0) return '';\n if (width < 10) return ' '.repeat(width);\n const left = '0ms';\n const right = formatDurationMs(totalMs);\n const mid = formatDurationMs(totalMs / 2);\n const midPos = Math.floor(width / 2) - Math.floor(mid.length / 2);\n const rightPos = width - right.length;\n\n const chars = Array.from<string>({ length: width }).fill(' ');\n // place left\n for (let i = 0; i < left.length && i < width; i++) chars[i] = left[i];\n // place mid (if room)\n if (midPos > left.length + 1 && midPos + mid.length < rightPos - 1) {\n for (let i = 0; i < mid.length; i++) chars[midPos + i] = mid[i];\n }\n // place right\n for (let i = 0; i < right.length; i++) chars[rightPos + i] = right[i];\n return chars.join('');\n}\n\n/**\n * Compute marker column positions for event times on a waterfall bar.\n */\nexport function computeMarkerPositions(\n markerTimesMs: number[],\n spanStart: number,\n spanEnd: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): number[] {\n if (width <= 0 || traceDuration <= 0 || markerTimesMs.length === 0) return [];\n return markerTimesMs.map((t) => {\n const ratio = (t - traceStart) / traceDuration;\n const col = Math.floor(ratio * width);\n return Math.max(0, Math.min(col, width - 1));\n });\n}\n\n/**\n * Build a waterfall bar string with event markers overlaid as ◆.\n */\nexport function buildWaterfallBarWithMarkers(\n markerTimesMs: number[],\n spanStart: number,\n spanDuration: number,\n traceStart: number,\n traceDuration: number,\n width: number,\n): string {\n const bar = buildWaterfallBar(\n spanStart,\n spanDuration,\n traceStart,\n traceDuration,\n width,\n );\n if (markerTimesMs.length === 0 || width <= 0) return bar;\n const positions = computeMarkerPositions(\n markerTimesMs,\n spanStart,\n spanStart + spanDuration,\n traceStart,\n traceDuration,\n width,\n );\n const chars = [...bar];\n for (const pos of positions) {\n chars[pos] = '◆';\n }\n return chars.join('');\n}\n\n/**\n * Adjust a panel split percentage by a delta, clamped to [20, 80].\n */\nexport function adjustPanelSplit(\n current: number,\n delta: number,\n min = 20,\n max = 80,\n): number {\n return Math.max(min, Math.min(max, current + delta));\n}\n","/**\n * Deterministic service-name → terminal color mapping.\n * Hash the name, pick from a palette. Same service always gets same color.\n */\n\nexport const SERVICE_COLORS = [\n 'cyan',\n 'magenta',\n 'blue',\n 'yellow',\n 'green',\n 'redBright',\n 'cyanBright',\n 'magentaBright',\n 'blueBright',\n 'yellowBright',\n 'greenBright',\n] as const;\n\nexport type ServiceColor = (typeof SERVICE_COLORS)[number];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = Math.trunc((hash << 5) - hash + s.codePointAt(i)!);\n }\n return Math.abs(hash);\n}\n\nexport function getServiceColor(serviceName: string): ServiceColor {\n return SERVICE_COLORS[hashString(serviceName) % SERVICE_COLORS.length];\n}\n","/**\n * Log model utilities - pure logic for log grouping, filtering, and timelines.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\n/**\n * Log event format for terminal dashboard consumption.\n * Designed to align with Autotel canonical log lines / request-logger output.\n */\nexport interface TerminalLogEvent {\n /** Log timestamp in milliseconds since epoch */\n time: number;\n /** Log level */\n level: LogLevel;\n /** Short message */\n message: string;\n /** Optional trace correlation */\n traceId?: string;\n /** Optional span correlation */\n spanId?: string;\n /** Structured attributes / fields */\n attributes?: Record<string, unknown>;\n}\n\n/** Aggregate stats over logs */\nexport interface LogStats {\n total: number;\n errors: number;\n}\n\n/** Combined span/log timeline item for a single trace */\nexport type TimelineItemType = 'span' | 'log';\n\nexport interface TimelineItem<TSpan> {\n type: TimelineItemType;\n time: number;\n span?: TSpan;\n log?: TerminalLogEvent;\n}\n\n/**\n * Filter logs by search query and optional level threshold.\n * Search matches message and flattened stringified attributes.\n */\nexport function filterLogsBySearch(\n logs: TerminalLogEvent[],\n searchQuery: string,\n minLevel: LogLevel | null,\n): TerminalLogEvent[] {\n let list = logs;\n\n if (minLevel) {\n const order: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minIdx = order.indexOf(minLevel);\n list =\n minIdx === -1\n ? list\n : list.filter((log) => order.indexOf(log.level) >= minIdx);\n }\n\n if (searchQuery.trim() === '') return list;\n const q = searchQuery.toLowerCase();\n\n return list.filter((log) => {\n if (log.message.toLowerCase().includes(q)) return true;\n if (log.attributes) {\n for (const [k, v] of Object.entries(log.attributes)) {\n const s = `${k}:${String(v)}`.toLowerCase();\n if (s.includes(q)) return true;\n }\n }\n return false;\n });\n}\n\n/**\n * Compute simple aggregate stats over logs.\n */\nexport function computeLogStats(logs: TerminalLogEvent[]): LogStats {\n const total = logs.length;\n const errors = logs.filter((l) => l.level === 'error').length;\n return { total, errors };\n}\n\n/**\n * Build a combined span/log timeline for a single trace.\n * Spans must include { startTime, endTime }; logs are positioned by time.\n */\nexport function buildTraceTimeline<\n TSpan extends { startTime: number; endTime: number },\n>(spans: TSpan[], logs: TerminalLogEvent[]): TimelineItem<TSpan>[] {\n const items: TimelineItem<TSpan>[] = [];\n\n for (const span of spans) {\n items.push({\n type: 'span',\n time: span.startTime,\n span,\n });\n }\n\n for (const log of logs) {\n items.push({\n type: 'log',\n time: log.time,\n log,\n });\n }\n\n items.sort((a, b) => a.time - b.time);\n return items;\n}\n","import type { TerminalLogEvent } from './lib/log-model';\n\n/**\n * Stream interface for terminal log events.\n */\nexport interface TerminalLogStream {\n /**\n * Subscribe to log events.\n *\n * @param callback - Called when a log event is emitted\n * @returns Unsubscribe function\n */\n onLog(callback: (event: TerminalLogEvent) => void): () => void;\n}\n\n/**\n * Internal in-memory implementation used for the global log stream.\n */\nclass InMemoryTerminalLogStream implements TerminalLogStream {\n private subscribers = new Set<(event: TerminalLogEvent) => void>();\n\n onLog(callback: (event: TerminalLogEvent) => void): () => void {\n this.subscribers.add(callback);\n return () => this.subscribers.delete(callback);\n }\n\n emit(event: TerminalLogEvent): void {\n for (const subscriber of this.subscribers) {\n try {\n subscriber(event);\n } catch (error) {\n console.error('[autotel-terminal] Log subscriber error:', error);\n }\n }\n }\n}\n\nlet globalLogStream: InMemoryTerminalLogStream | null = null;\n\n/**\n * Get or create the global terminal log stream.\n *\n * This is intended to be used from Autotel canonical log line drains\n * or request logger hooks:\n *\n * ```ts\n * import { getTerminalLogStream } from 'autotel-terminal';\n *\n * const logStream = getTerminalLogStream();\n * logStream.emit({\n * time: Date.now(),\n * level: 'info',\n * message: 'request completed',\n * traceId,\n * spanId,\n * attributes: { route: '/users/:id', status: 200 },\n * });\n * ```\n */\nexport function getTerminalLogStream(): InMemoryTerminalLogStream {\n if (!globalLogStream) {\n globalLogStream = new InMemoryTerminalLogStream();\n }\n return globalLogStream;\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface ServiceStats {\n serviceName: string;\n total: number;\n errors: number;\n avgMs: number;\n p95Ms: number;\n}\n\nexport interface HotSpan {\n name: string;\n avgMs: number;\n p95Ms: number;\n count: number;\n}\n\nexport interface RouteStats {\n route: string;\n total: number;\n errors: number;\n avgMs: number;\n p95Ms: number;\n}\n\nexport function computeServiceStats(\n spans: TerminalSpanEvent[],\n): ServiceStats[] {\n const byService = new Map<\n string,\n { durations: number[]; total: number; errors: number }\n >();\n\n for (const span of spans) {\n const attrs = span.attributes ?? {};\n const serviceName =\n (attrs['service.name'] as string | undefined) ?? 'unknown';\n const entry = byService.get(serviceName) ?? {\n durations: [],\n total: 0,\n errors: 0,\n };\n entry.total += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errors += 1;\n byService.set(serviceName, entry);\n }\n\n const stats: ServiceStats[] = [];\n for (const [serviceName, { durations, total, errors }] of byService) {\n if (total === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n stats.push({ serviceName, total, errors, avgMs, p95Ms });\n }\n\n stats.sort((a, b) => b.total - a.total);\n return stats;\n}\n\nexport function computeRouteStats(spans: TerminalSpanEvent[]): RouteStats[] {\n const byRoute = new Map<\n string,\n { durations: number[]; total: number; errors: number }\n >();\n\n for (const span of spans) {\n const attrs = span.attributes ?? {};\n const route = (attrs['http.route'] as string | undefined) ?? null;\n if (!route) continue;\n\n const entry = byRoute.get(route) ?? {\n durations: [],\n total: 0,\n errors: 0,\n };\n entry.total += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errors += 1;\n byRoute.set(route, entry);\n }\n\n const stats: RouteStats[] = [];\n for (const [route, { durations, total, errors }] of byRoute) {\n if (total === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n stats.push({ route, total, errors, avgMs, p95Ms });\n }\n\n stats.sort((a, b) => b.total - a.total);\n return stats;\n}\n\nexport function findHotSpanNames(\n spans: TerminalSpanEvent[],\n topN: number,\n): HotSpan[] {\n const byName = new Map<string, number[]>();\n for (const span of spans) {\n const list = byName.get(span.name) ?? [];\n list.push(span.durationMs);\n byName.set(span.name, list);\n }\n\n const hot: HotSpan[] = [];\n for (const [name, durations] of byName) {\n if (durations.length === 0) continue;\n const avgMs = durations.reduce((a, d) => a + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95Ms = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n hot.push({ name, avgMs, p95Ms, count: durations.length });\n }\n\n hot.sort((a, b) => b.p95Ms - a.p95Ms);\n return hot.slice(0, topN);\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface AvailableFilters {\n serviceNames: string[];\n routes: string[];\n statusCodes: number[];\n}\n\nexport interface SpanFilterState {\n serviceName?: string;\n route?: string;\n statusGroup?: 'all' | '2xx' | '4xx' | '5xx';\n errorsOnly?: boolean;\n searchQuery?: string;\n traceId?: string;\n}\n\nfunction getServiceName(span: TerminalSpanEvent): string | undefined {\n const attrs = span.attributes ?? {};\n return (attrs['service.name'] as string | undefined) ?? undefined;\n}\n\nfunction getRoute(span: TerminalSpanEvent): string | undefined {\n const attrs = span.attributes ?? {};\n return (attrs['http.route'] as string | undefined) ?? undefined;\n}\n\nfunction getStatusCode(span: TerminalSpanEvent): number | undefined {\n const attrs = span.attributes ?? {};\n const code = attrs['http.status_code'];\n if (typeof code === 'number') return code;\n if (typeof code === 'string') {\n const n = Number(code);\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\nexport function deriveAvailableFilters(\n spans: TerminalSpanEvent[],\n): AvailableFilters {\n const serviceSet = new Set<string>();\n const routeSet = new Set<string>();\n const statusSet = new Set<number>();\n\n for (const span of spans) {\n const svc = getServiceName(span);\n if (svc) serviceSet.add(svc);\n const route = getRoute(span);\n if (route) routeSet.add(route);\n const status = getStatusCode(span);\n if (typeof status === 'number') statusSet.add(status);\n }\n\n return {\n serviceNames: [...serviceSet].toSorted(),\n routes: [...routeSet].toSorted(),\n statusCodes: [...statusSet].toSorted((a, b) => a - b),\n };\n}\n\nexport function applySpanFilters(\n spans: TerminalSpanEvent[],\n state: SpanFilterState,\n): TerminalSpanEvent[] {\n const { serviceName, route, statusGroup, errorsOnly, searchQuery, traceId } =\n state;\n const q = searchQuery?.trim().toLowerCase() ?? '';\n\n return spans.filter((span) => {\n const attrs = span.attributes ?? {};\n\n if (traceId && span.traceId !== traceId) return false;\n\n if (errorsOnly && span.status !== 'ERROR') return false;\n\n if (serviceName) {\n const svc = getServiceName(span);\n if (svc !== serviceName) return false;\n }\n\n if (route) {\n const r = getRoute(span);\n if (r !== route) return false;\n }\n\n if (statusGroup && statusGroup !== 'all') {\n const code = getStatusCode(span);\n if (!code) return false;\n if (statusGroup === '2xx' && (code < 200 || code >= 300)) return false;\n if (statusGroup === '4xx' && (code < 400 || code >= 500)) return false;\n if (statusGroup === '5xx' && (code < 500 || code >= 600)) return false;\n }\n\n if (q) {\n const nameMatch = span.name.toLowerCase().includes(q);\n const attrMatch = Object.entries(attrs).some(([k, v]) =>\n `${k}:${String(v)}`.toLowerCase().includes(q),\n );\n if (!nameMatch && !attrMatch) return false;\n }\n\n return true;\n });\n}\n","import type { TerminalSpanEvent } from '../span-stream';\nimport type { TraceSummary } from './trace-model';\n\nexport interface ErrorSummary {\n traceId: string;\n rootName: string;\n serviceName: string;\n route?: string;\n statusCode?: number;\n errorCount: number;\n lastEndTime: number;\n}\n\nfunction getServiceNameFromSpans(spans: TerminalSpanEvent[]): string {\n for (const span of spans) {\n const svc = span.attributes?.['service.name'];\n if (typeof svc === 'string' && svc.trim()) return svc;\n }\n return 'unknown';\n}\n\nfunction getRouteFromSpans(spans: TerminalSpanEvent[]): string | undefined {\n for (const span of spans) {\n const route = span.attributes?.['http.route'];\n if (typeof route === 'string' && route.trim()) return route;\n }\n return undefined;\n}\n\nfunction getStatusCodeFromSpans(\n spans: TerminalSpanEvent[],\n): number | undefined {\n for (const span of spans) {\n const code = span.attributes?.['http.status_code'];\n if (typeof code === 'number') return code;\n if (typeof code === 'string') {\n const n = Number(code);\n if (Number.isFinite(n)) return n;\n }\n }\n return undefined;\n}\n\nexport function buildErrorSummaries(\n traceSummaries: TraceSummary[],\n): ErrorSummary[] {\n const out: ErrorSummary[] = [];\n\n for (const t of traceSummaries) {\n const errorSpans = t.spans.filter((s) => s.status === 'ERROR');\n if (errorSpans.length === 0) continue;\n\n out.push({\n traceId: t.traceId,\n rootName: t.rootName,\n serviceName: getServiceNameFromSpans(t.spans),\n route: getRouteFromSpans(t.spans),\n statusCode: getStatusCodeFromSpans(t.spans),\n errorCount: errorSpans.length,\n lastEndTime: t.lastEndTime,\n });\n }\n\n out.sort((a, b) => b.lastEndTime - a.lastEndTime);\n return out;\n}\n","import type { TerminalSpanEvent } from '../span-stream';\n\nexport interface ServiceNode {\n serviceName: string;\n spanCount: number;\n errorCount: number;\n avgDurationMs: number;\n p95DurationMs: number;\n}\n\nexport interface ServiceEdge {\n fromService: string;\n toService: string;\n spanCount: number;\n errorCount: number;\n}\n\nexport interface ServiceGraph {\n services: ServiceNode[];\n edges: ServiceEdge[];\n}\n\nfunction getServiceName(span: TerminalSpanEvent): string {\n const attrs = span.attributes ?? {};\n const serviceName =\n (attrs['service.name'] as string | undefined) ??\n (attrs['resource.service.name'] as string | undefined);\n return serviceName || 'unknown';\n}\n\nfunction getPeerService(span: TerminalSpanEvent): string | null {\n const attrs = span.attributes ?? {};\n const peerService =\n (attrs['peer.service'] as string | undefined) ??\n (attrs['db.system'] as string | undefined) ??\n (attrs['messaging.system'] as string | undefined) ??\n (attrs['http.host'] as string | undefined);\n return peerService ?? null;\n}\n\nexport function buildServiceGraph(spans: TerminalSpanEvent[]): ServiceGraph {\n const byService = new Map<\n string,\n { durations: number[]; spanCount: number; errorCount: number }\n >();\n\n for (const span of spans) {\n const svc = getServiceName(span);\n const entry = byService.get(svc) ?? {\n durations: [],\n spanCount: 0,\n errorCount: 0,\n };\n entry.spanCount += 1;\n entry.durations.push(span.durationMs);\n if (span.status === 'ERROR') entry.errorCount += 1;\n byService.set(svc, entry);\n }\n\n const services: ServiceNode[] = [];\n for (const [serviceName, { durations, spanCount, errorCount }] of byService) {\n if (spanCount === 0) continue;\n const avgDurationMs =\n durations.reduce((acc, d) => acc + d, 0) / durations.length;\n const sorted = durations.toSorted((a, b) => a - b);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p95DurationMs = sorted[p95Index] ?? sorted.at(-1) ?? 0;\n services.push({\n serviceName,\n spanCount,\n errorCount,\n avgDurationMs,\n p95DurationMs,\n });\n }\n\n const byEdge = new Map<string, { spanCount: number; errorCount: number }>();\n\n for (const span of spans) {\n const to = getPeerService(span);\n if (!to) continue;\n const from = getServiceName(span);\n const key = `${from}→${to}`;\n const entry = byEdge.get(key) ?? { spanCount: 0, errorCount: 0 };\n entry.spanCount += 1;\n if (span.status === 'ERROR') entry.errorCount += 1;\n byEdge.set(key, entry);\n }\n\n const edges: ServiceEdge[] = [];\n for (const [key, { spanCount, errorCount }] of byEdge) {\n const [fromService, toService] = key.split('→');\n edges.push({ fromService, toService, spanCount, errorCount });\n }\n\n services.sort((a, b) => b.spanCount - a.spanCount);\n edges.sort((a, b) => b.spanCount - a.spanCount);\n\n return { services, edges };\n}\n","import type { ServiceGraph, ServiceEdge } from './topology-model';\nimport { formatDurationMs } from './format';\n\n/**\n * Render a service graph as ASCII lines for terminal display.\n *\n * Layout: root services at top, downstream services below with edges.\n * Recursively traverses the full dependency tree.\n * Each service shows: name, span count, error rate, p95 latency.\n * Each edge shows: call count and error count.\n */\nexport function renderTopologyAscii(graph: ServiceGraph): string[] {\n if (graph.services.length === 0) {\n return [' No services detected yet.'];\n }\n\n // Find root services (not a target of any edge)\n const targetServices = new Set(graph.edges.map((e) => e.toService));\n const roots = graph.services.filter(\n (s) => !targetServices.has(s.serviceName),\n );\n // If no clear roots (cycle), use all services sorted by span count\n const rootList = roots.length > 0 ? roots : [...graph.services];\n\n const lines: string[] = [];\n\n for (const root of rootList) {\n renderNode(graph, root.serviceName, '', true, lines, new Set());\n }\n\n return lines;\n}\n\nfunction renderNode(\n graph: ServiceGraph,\n serviceName: string,\n prefix: string,\n isRoot: boolean,\n lines: string[],\n ancestors: Set<string>,\n): void {\n const svc = graph.services.find((s) => s.serviceName === serviceName);\n const label = svc ? formatServiceLine(svc) : `[${serviceName}]`;\n\n if (isRoot) {\n lines.push(label);\n }\n\n // Don't recurse into ancestors on the current path (cycle protection)\n if (ancestors.has(serviceName)) return;\n const pathAncestors = new Set(ancestors);\n pathAncestors.add(serviceName);\n\n const outgoing = graph.edges.filter((e) => e.fromService === serviceName);\n\n for (let i = 0; i < outgoing.length; i++) {\n const edge = outgoing[i];\n const isLast = i === outgoing.length - 1;\n const connector = isLast ? '└' : '├';\n const childPrefix = isLast ? ' ' : '│ ';\n const downstream = graph.services.find(\n (s) => s.serviceName === edge.toService,\n );\n const edgeLabel = formatEdgeLabel(edge);\n const downstreamLabel = downstream\n ? formatServiceLine(downstream)\n : `[${edge.toService}]`;\n\n lines.push(`${prefix} ${connector}──${edgeLabel}──→ ${downstreamLabel}`);\n\n // Recurse into downstream service\n renderNode(\n graph,\n edge.toService,\n prefix + ' ' + childPrefix,\n false,\n lines,\n pathAncestors,\n );\n }\n}\n\nfunction formatServiceLine(svc: {\n serviceName: string;\n spanCount: number;\n errorCount: number;\n p95DurationMs: number;\n}): string {\n const errPart = svc.errorCount > 0 ? ` · ${svc.errorCount} err` : '';\n return `[${svc.serviceName}] ${svc.spanCount} spans${errPart} · p95 ${formatDurationMs(svc.p95DurationMs)}`;\n}\n\nfunction formatEdgeLabel(edge: ServiceEdge): string {\n const errPart = edge.errorCount > 0 ? `, ${edge.errorCount} err` : '';\n return `(${edge.spanCount}${errPart})`;\n}\n","import type { TraceSummary } from './trace-model';\nimport type { TerminalLogEvent } from './log-model';\n\nexport interface ExportedTrace {\n traceId: string;\n rootName: string;\n durationMs: number;\n lastEndTime: number;\n spans: Array<{\n name: string;\n spanId: string;\n parentSpanId?: string;\n startTime: number;\n endTime: number;\n durationMs: number;\n status: string;\n kind?: string;\n attributes?: Record<string, unknown>;\n }>;\n logs: Array<{\n time: number;\n level: string;\n message: string;\n traceId?: string;\n spanId?: string;\n attributes?: Record<string, unknown>;\n }>;\n}\n\nexport function exportTraceToJson(\n trace: TraceSummary,\n logs: TerminalLogEvent[],\n): string {\n const exported: ExportedTrace = {\n traceId: trace.traceId,\n rootName: trace.rootName,\n durationMs: trace.durationMs,\n lastEndTime: trace.lastEndTime,\n spans: trace.spans.map((s) => ({\n name: s.name,\n spanId: s.spanId,\n parentSpanId: s.parentSpanId,\n startTime: s.startTime,\n endTime: s.endTime,\n durationMs: s.durationMs,\n status: s.status,\n kind: s.kind,\n attributes: s.attributes,\n })),\n logs: logs.map((l) => ({\n time: l.time,\n level: l.level,\n message: l.message,\n traceId: l.traceId,\n spanId: l.spanId,\n attributes: l.attributes,\n })),\n };\n\n return JSON.stringify(exported, null, 2);\n}\n","import type { LanguageModel } from 'ai';\nimport type { AIConfig, AIProviderType } from './types';\n\nexport async function detectOllama(\n baseUrl = 'http://127.0.0.1:11434',\n): Promise<boolean> {\n try {\n const res = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(1000),\n });\n return res.ok;\n } catch {\n return false;\n }\n}\n\nexport function resolveConfig(\n options: Partial<AIConfig> = {},\n): AIConfig | null {\n const provider: AIProviderType | undefined =\n options.provider ??\n (process.env.AI_PROVIDER as AIProviderType | undefined) ??\n undefined;\n\n const model = options.model ?? process.env.AI_MODEL;\n const apiKey =\n options.apiKey ??\n process.env.AI_API_KEY ??\n (provider === 'openai' ? process.env.OPENAI_API_KEY : undefined);\n const baseUrl = options.baseUrl ?? process.env.AI_BASE_URL;\n\n if (provider) {\n return {\n provider,\n model: model ?? (provider === 'ollama' ? 'granite4' : 'gpt-4o'),\n apiKey,\n baseUrl,\n };\n }\n\n // Will be resolved async in resolveConfigWithAutoDetect\n return null;\n}\n\nconst defaultAutoDetectDeps = { detectOllama };\n\nexport async function resolveConfigWithAutoDetect(\n options: Partial<AIConfig> = {},\n deps: { detectOllama: typeof detectOllama } = defaultAutoDetectDeps,\n): Promise<AIConfig | null> {\n const config = resolveConfig(options);\n if (config) return config;\n\n // Auto-detect: check Ollama first\n const ollamaUrl =\n options.baseUrl ?? process.env.AI_BASE_URL ?? 'http://127.0.0.1:11434';\n if (await deps.detectOllama(ollamaUrl)) {\n return {\n provider: 'ollama',\n model: options.model ?? process.env.AI_MODEL ?? 'granite4',\n baseUrl: ollamaUrl,\n };\n }\n\n // Check for OpenAI key\n const openaiKey =\n options.apiKey ?? process.env.AI_API_KEY ?? process.env.OPENAI_API_KEY;\n if (openaiKey) {\n return {\n provider: 'openai',\n model: options.model ?? process.env.AI_MODEL ?? 'gpt-4o',\n apiKey: openaiKey,\n };\n }\n\n return null;\n}\n\nexport type AIModelResult = {\n model: LanguageModel;\n providerType: AIProviderType;\n config: AIConfig;\n};\n\nexport async function createAIModel(config: AIConfig): Promise<AIModelResult> {\n switch (config.provider) {\n case 'ollama': {\n const { createOllama } = await import('ai-sdk-ollama');\n const ollama = createOllama({\n baseURL: config.baseUrl ?? 'http://127.0.0.1:11434',\n });\n return { model: ollama(config.model), providerType: 'ollama', config };\n }\n case 'openai': {\n const { createOpenAI } = await import('@ai-sdk/openai');\n const openai = createOpenAI({\n apiKey: config.apiKey,\n ...(config.baseUrl ? { baseURL: config.baseUrl } : {}),\n });\n return { model: openai(config.model), providerType: 'openai', config };\n }\n case 'openai-compatible': {\n const { createOpenAICompatible } =\n await import('@ai-sdk/openai-compatible');\n const provider = createOpenAICompatible({\n baseURL: config.baseUrl ?? 'http://127.0.0.1:11434/v1',\n name: 'custom',\n ...(config.apiKey\n ? { headers: { Authorization: `Bearer ${config.apiKey}` } }\n : {}),\n });\n return {\n model: provider(config.model),\n providerType: 'openai-compatible',\n config,\n };\n }\n default: {\n throw new Error(\n `Unsupported provider: \"${config.provider}\". Expected \"ollama\", \"openai\", or \"openai-compatible\".`,\n );\n }\n }\n}\n","export function buildSystemPrompt(\n viewMode: string,\n contextJson: string,\n): string {\n return `You are an OpenTelemetry expert assistant analyzing live telemetry data from a running application.\nThe user is viewing their ${viewMode} dashboard in a terminal TUI.\n\nYou have tools to query the telemetry data precisely. Use them to answer questions:\n- getOverviewStats: high-level stats (spans, errors, latency)\n- listServices: all services with error rates and p95\n- findSlowestSpans: find slow spans, optionally by service\n- findErrorTraces: find traces with errors\n- getTraceDetail: deep dive into a specific trace\n- searchSpans: search spans by name\n- searchLogs: search logs by message content\n- renderUI: display rich terminal UI (tables, charts, badges)\n\n## Workflow\n1. Use data tools first to gather data\n2. Use renderUI to display structured results as tables, charts, or cards\n3. Add a brief text explanation after the rendered UI\n\n## When to use renderUI\nUse renderUI for tables, comparisons, and metrics. Do NOT use it for short text answers.\n\nrenderUI spec format: { root: \"id\", elements: { \"id\": { type: \"ComponentName\", props: {...}, children: [] } } }\n\nComponents: Table (columns, rows), KeyValue (label, value), Badge (label, variant: success/error/warning/info), BarChart (data: [{label,value}]), Card (title, children), Heading (text), Divider, Text (text, color, bold), Box (flexDirection, children).\n\nTable example: { type: \"Table\", props: { columns: [{ header: \"Name\", key: \"name\" }], rows: [{ name: \"api\" }] }, children: [] }\n\nKeep text responses under 300 words.\nUse specific span names, durations, and attribute values from the data.\n\nCurrent dashboard summary:\n${contextJson}`;\n}\n","import { tool } from 'ai';\nimport { z } from 'zod';\nimport type { TerminalSpanEvent } from '../span-stream';\nimport type { TerminalLogEvent } from '../lib/log-model';\nimport type { TraceSummary, SpanStats } from '../lib/trace-model';\nimport type { ServiceStats } from '../lib/stats-model';\nimport type { ErrorSummary } from '../lib/error-model';\nimport type { InkSpec } from './types';\nimport { validateSpec } from '@json-render/core';\nimport { standardComponentDefinitions } from '@json-render/ink/catalog';\n\n/** Valid component names from the Ink catalog */\nconst COMPONENT_NAMES = Object.keys(standardComponentDefinitions) as [\n string,\n ...string[],\n];\n\n// Helper: zod v4 schemas need to be cast for ai SDK v6's tool() which expects zod v3 types\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst t: (...args: any[]) => any = tool;\n\n/**\n * Snapshot of dashboard state passed to tools at query time.\n * Tools read from this — they don't mutate dashboard state.\n */\nexport type ToolContext = {\n spans: TerminalSpanEvent[];\n logs: TerminalLogEvent[];\n traces: TraceSummary[];\n stats: SpanStats;\n serviceStats: ServiceStats[];\n errorSummaries: ErrorSummary[];\n};\n\nexport function createTelemetryTools(\n ctx: ToolContext,\n onRenderUI?: (spec: InkSpec) => void,\n) {\n return {\n getOverviewStats: t({\n description:\n 'Get high-level stats: total spans, error count, average duration, p95 duration, and service count.',\n parameters: z.object({}),\n execute: async () => ({\n totalSpans: ctx.stats.total,\n errors: ctx.stats.errors,\n avgMs: Math.round(ctx.stats.avg),\n p95Ms: Math.round(ctx.stats.p95),\n serviceCount: ctx.serviceStats.length,\n traceCount: ctx.traces.length,\n }),\n }),\n\n listServices: t({\n description:\n 'List all services with their span counts, error counts, and p95 latencies.',\n parameters: z.object({}),\n execute: async () =>\n ctx.serviceStats.map((s) => ({\n serviceName: s.serviceName,\n total: s.total,\n errors: s.errors,\n avgMs: Math.round(s.avgMs),\n p95Ms: Math.round(s.p95Ms),\n })),\n }),\n\n findSlowestSpans: t({\n description:\n 'Find the slowest spans, optionally filtered by service name. Returns span name, duration, status, and key attributes.',\n parameters: z.object({\n service: z.string().optional().describe('Filter by service name'),\n limit: z.number().optional().describe('Max results (default 10)'),\n }),\n execute: async ({\n service,\n limit,\n }: {\n service?: string;\n limit?: number;\n }) => {\n const max = limit ?? 10;\n let filtered = ctx.spans;\n if (service) {\n filtered = filtered.filter(\n (s) => (s.attributes?.['service.name'] as string) === service,\n );\n }\n return filtered\n .toSorted((a, b) => b.durationMs - a.durationMs)\n .slice(0, max)\n .map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n service: (s.attributes?.['service.name'] as string) ?? 'unknown',\n route: s.attributes?.['http.route'] as string | undefined,\n traceId: s.traceId.slice(0, 8),\n }));\n },\n }),\n\n findErrorTraces: t({\n description:\n 'Find traces that contain errors, with root span name, service, route, and error count.',\n parameters: z.object({\n service: z.string().optional().describe('Filter by service name'),\n limit: z.number().optional().describe('Max results (default 10)'),\n }),\n execute: async ({\n service,\n limit,\n }: {\n service?: string;\n limit?: number;\n }) => {\n const max = limit ?? 10;\n let errors = ctx.errorSummaries;\n if (service) {\n errors = errors.filter((e) => e.serviceName === service);\n }\n return errors.slice(0, max).map((e) => ({\n traceId: e.traceId.slice(0, 8),\n rootName: e.rootName,\n serviceName: e.serviceName,\n route: e.route,\n errorCount: e.errorCount,\n }));\n },\n }),\n\n getTraceDetail: t({\n description:\n 'Get full detail of a specific trace by trace ID prefix. Returns all spans with their parent relationships, durations, and attributes.',\n parameters: z.object({\n traceIdPrefix: z\n .string()\n .describe('First 8+ characters of the trace ID'),\n }),\n execute: async ({ traceIdPrefix }: { traceIdPrefix: string }) => {\n const trace = ctx.traces.find((t) =>\n t.traceId.startsWith(traceIdPrefix),\n );\n if (!trace) {\n return { error: `No trace found matching ${traceIdPrefix}` };\n }\n const traceLogs = ctx.logs.filter((l) => l.traceId === trace.traceId);\n return {\n traceId: trace.traceId.slice(0, 16),\n rootName: trace.rootName,\n durationMs: Math.round(trace.durationMs),\n hasError: trace.hasError,\n spanCount: trace.spanCount,\n spans: trace.spans.map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n kind: s.kind,\n parentSpanId: s.parentSpanId?.slice(0, 8),\n attrs: Object.fromEntries(\n Object.entries(s.attributes ?? {}).filter(([k]) =>\n [\n 'http.method',\n 'http.route',\n 'http.status_code',\n 'db.operation',\n 'db.system',\n 'service.name',\n 'error.message',\n 'error.type',\n ].includes(k),\n ),\n ),\n })),\n logs: traceLogs.slice(0, 10).map((l) => ({\n level: l.level,\n message: l.message.slice(0, 100),\n })),\n };\n },\n }),\n\n searchSpans: t({\n description:\n 'Search spans by name pattern (case-insensitive substring match). Returns matching spans with details.',\n parameters: z.object({\n query: z.string().describe('Search string to match against span names'),\n limit: z.number().optional().describe('Max results (default 20)'),\n }),\n execute: async ({ query, limit }: { query: string; limit?: number }) => {\n const max = limit ?? 20;\n const q = query.toLowerCase();\n return ctx.spans\n .filter((s) => s.name.toLowerCase().includes(q))\n .slice(0, max)\n .map((s) => ({\n name: s.name,\n durationMs: Math.round(s.durationMs),\n status: s.status,\n traceId: s.traceId.slice(0, 8),\n service: (s.attributes?.['service.name'] as string) ?? 'unknown',\n }));\n },\n }),\n\n searchLogs: t({\n description:\n 'Search logs by message content (case-insensitive). Returns matching log entries.',\n parameters: z.object({\n query: z\n .string()\n .describe('Search string to match against log messages'),\n level: z\n .enum(['debug', 'info', 'warn', 'error'])\n .optional()\n .describe('Filter by log level'),\n limit: z.number().optional().describe('Max results (default 20)'),\n }),\n execute: async ({\n query,\n level,\n limit,\n }: {\n query: string;\n level?: string;\n limit?: number;\n }) => {\n const max = limit ?? 20;\n const q = query.toLowerCase();\n let filtered = ctx.logs.filter((l) =>\n l.message.toLowerCase().includes(q),\n );\n if (level) {\n filtered = filtered.filter((l) => l.level === level);\n }\n return filtered.slice(0, max).map((l) => ({\n level: l.level,\n message: l.message.slice(0, 200),\n traceId: l.traceId?.slice(0, 8),\n attrs: l.attributes,\n }));\n },\n }),\n\n renderUI: t({\n description:\n 'Render rich terminal UI (tables, charts, badges) to display structured data. Use this when showing tabular data, comparisons, or metrics — not for short text answers. Available components: Table (columns + rows), KeyValue (key-value pairs), Badge (status labels: default/info/success/warning/error), BarChart (horizontal bars with labels), Card (grouped content with title), Heading (section title), Divider (separator), Text (styled text), Box (layout container).',\n parameters: z.object({\n spec: z\n .object({\n root: z.string().describe('ID of the root element'),\n elements: z\n .record(\n z.string(),\n z.object({\n type: z.enum(COMPONENT_NAMES).describe('Component name'),\n props: z.record(z.string(), z.unknown()).optional(),\n children: z.array(z.string()).describe('Child element keys'),\n }),\n )\n .describe('Map of element ID to component definition'),\n })\n .describe('json-render spec defining the UI to display'),\n }),\n execute: async ({ spec }: { spec: InkSpec }) => {\n const validation = validateSpec(spec);\n if (!validation.valid) {\n return {\n rendered: false,\n error: validation.issues.map((i) => i.message).join('; '),\n };\n }\n onRenderUI?.(spec);\n return { rendered: true };\n },\n }),\n };\n}\n","/**\n * Provider-aware streamText wrapper.\n *\n * When the provider is Ollama, uses ai-sdk-ollama's streamText which has\n * enhanced response synthesis for tool calling (Ollama models often return\n * empty text after tool execution — the enhanced version detects this and\n * synthesizes a response from tool results).\n *\n * For all other providers, uses the standard ai SDK streamText.\n */\nimport type { LanguageModel } from 'ai';\nimport type { AIProviderType } from './types';\n\ntype StreamTextParams = {\n model: LanguageModel;\n system?: string;\n messages: Array<{ role: 'user' | 'assistant'; content: string }>;\n tools?: Record<string, unknown>;\n maxSteps?: number;\n abortSignal?: AbortSignal;\n};\n\ntype StreamResult = {\n textStream: AsyncIterable<string>;\n};\n\nexport async function providerStreamText(\n providerType: AIProviderType,\n params: StreamTextParams,\n): Promise<StreamResult> {\n if (providerType === 'ollama') {\n const mod = await import('ai-sdk-ollama');\n // ai-sdk-ollama's streamText has enhanced synthesis for tool calling\n const result = await mod.streamText(\n params as Parameters<typeof mod.streamText>[0],\n );\n return result as unknown as StreamResult;\n }\n\n const mod = await import('ai');\n return mod.streamText(\n params as Parameters<typeof mod.streamText>[0],\n ) as unknown as StreamResult;\n}\n","/**\n * Terminal Dashboard for Autotel\n *\n * Beautiful react-ink powered dashboard for viewing traces in real-time.\n *\n * @example Basic usage (auto-wire)\n * ```typescript\n * import { init } from 'autotel'\n * import { renderTerminal } from 'autotel-terminal'\n *\n * init({ service: 'my-app' })\n * renderTerminal() // Automatically creates stream from current tracer provider\n * ```\n *\n * @example With options\n * ```typescript\n * renderTerminal({\n * title: 'My App Traces',\n * showStats: true,\n * maxSpans: 200,\n * })\n * ```\n *\n * @example Manual stream (advanced)\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n * import { BatchSpanProcessor } from 'autotel/processors'\n *\n * const processor = new StreamingSpanProcessor(new BatchSpanProcessor(exporter))\n * const stream = createTerminalSpanStream(processor)\n * renderTerminal({}, stream)\n * ```\n *\n * @module autotel-terminal\n */\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { render, Box, Text, useInput, useStdin } from 'ink';\nimport type { TerminalSpanEvent, TerminalSpanStream } from './span-stream';\nimport { StreamingSpanProcessor } from './streaming-processor';\nimport { createTerminalSpanStream } from './span-stream';\nimport { getAutotelTracerProvider } from 'autotel/tracer-provider';\nimport type { TracerProvider } from '@opentelemetry/api';\nimport {\n buildTraceMap,\n buildTraceSummaries,\n buildTraceTree,\n flattenTraceTree,\n filterBySearch,\n filterTraceSummaries,\n computeStats,\n computePerSpanNameStats,\n sortSpansForWaterfall,\n spanServiceName,\n} from './lib/trace-model';\nimport { formatDurationMs, formatRelative, truncate, buildWaterfallBar, buildTimeRuler } from './lib/format';\nimport { getServiceColor } from './lib/service-colors';\nimport type { SpanTreeNode } from './lib/trace-model';\nimport type { TerminalLogEvent, LogStats } from './lib/log-model';\nimport {\n filterLogsBySearch,\n computeLogStats,\n buildTraceTimeline,\n} from './lib/log-model';\nimport { getTerminalLogStream, type TerminalLogStream } from './log-stream';\nimport {\n computeServiceStats,\n computeRouteStats,\n findHotSpanNames,\n} from './lib/stats-model';\nimport { applySpanFilters, type SpanFilterState } from './lib/filters';\nimport type { ViewMode } from './lib/dashboard-keymap';\nimport { buildErrorSummaries } from './lib/error-model';\nimport { buildServiceGraph } from './lib/topology-model';\nimport { renderTopologyAscii } from './lib/topology-render';\nimport { exportTraceToJson } from './lib/export-model';\nimport type { AIConfig, ChatMessage, AIState } from './ai/types';\nimport {\n resolveConfigWithAutoDetect,\n createAIModel,\n type AIModelResult,\n} from './ai/provider';\nimport { buildSystemPrompt } from './ai/system-prompt';\nimport { createTelemetryTools, type ToolContext } from './ai/tools';\nimport { providerStreamText } from './ai/stream';\nimport { Renderer as InkRenderer } from '@json-render/ink';\nimport type { InkSpec } from './ai/types';\n\n/** Key attribute keys to show first (autotel / OTel conventions) */\nconst KEY_ATTR_KEYS = new Set([\n 'http.route',\n 'http.method',\n 'db.operation',\n 'db.statement',\n 'db.system',\n 'code.function',\n 'code.filepath',\n 'code.lineno',\n 'user.id',\n 'order.id',\n]);\n\n/**\n * Terminal dashboard options\n */\nexport interface TerminalOptions {\n /**\n * Dashboard title\n * @default 'Autotel Trace Inspector'\n */\n title?: string;\n\n /**\n * Show statistics bar (span count, error rate, avg duration)\n * @default true\n */\n showStats?: boolean;\n\n /**\n * Maximum number of spans to display\n * @default 100\n */\n maxSpans?: number;\n\n /**\n * Enable colors (auto-detect by default)\n * @default true if TTY\n */\n colors?: boolean;\n\n /**\n * AI assistant configuration. Auto-detects Ollama/OpenAI if not provided.\n */\n ai?: Partial<AIConfig>;\n}\n\nconst THROTTLE_MS = 50;\nconst MAX_TRACES = 50;\nconst NEW_ERROR_DISPLAY_MS = 2000;\nconst RECORD_LIMIT_DEFAULT = 200;\nconst LIST_HEIGHT = 20;\n\ninterface DashboardProps {\n title: string;\n showStats: boolean;\n maxSpans: number;\n colors: boolean;\n stream: TerminalSpanStream;\n logStream?: TerminalLogStream | null;\n aiConfig?: Partial<AIConfig>;\n}\n\nfunction Dashboard({\n title,\n showStats,\n maxSpans,\n colors,\n stream,\n logStream,\n aiConfig,\n}: DashboardProps): React.ReactElement {\n const [paused, setPaused] = useState(false);\n const [recording, setRecording] = useState(false);\n const [spans, setSpans] = useState<TerminalSpanEvent[]>([]);\n const [selected, setSelected] = useState(0);\n const [filterErrorsOnly, setFilterErrorsOnly] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [showHelp, setShowHelp] = useState(false);\n const [viewMode, setViewMode] = useState<ViewMode>('trace');\n const [spanFilters, setSpanFilters] = useState<SpanFilterState>({\n statusGroup: 'all',\n });\n const [drilldownTraceId, setDrilldownTraceId] = useState<string | null>(null);\n const [drilldownSelectedIndex, setDrilldownSelectedIndex] = useState(0);\n const [drilldownScrollOffset, setDrilldownScrollOffset] = useState(0);\n const [drilldownTab, setDrilldownTab] = useState<\n 'timeline' | 'spans' | 'logs'\n >('timeline');\n const [newErrorCount, setNewErrorCount] = useState(0);\n const [searchMode, setSearchMode] = useState(false);\n const [traceIdMode, setTraceIdMode] = useState(false);\n const [traceIdInput, setTraceIdInput] = useState('');\n const throttleRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingSpansRef = useRef<TerminalSpanEvent[]>([]);\n const [logs, setLogs] = useState<TerminalLogEvent[]>([]);\n\n // AI state\n const [aiMessages, setAiMessages] = useState<ChatMessage[]>([]);\n const [aiInput, setAiInput] = useState('');\n const [aiState, setAiState] = useState<AIState>({ status: 'unconfigured' });\n const [aiInputMode, setAiInputMode] = useState(false);\n const [aiSpec, setAiSpec] = useState<InkSpec | null>(null);\n const aiModelRef = useRef<AIModelResult | null>(null);\n const aiAbortRef = useRef<AbortController | null>(null);\n\n // Initialize AI model on mount\n useEffect(() => {\n let cancelled = false;\n resolveConfigWithAutoDetect(aiConfig).then(async (config) => {\n if (cancelled || !config) return;\n try {\n const result = await createAIModel(config);\n aiModelRef.current = result;\n setAiState({ status: 'idle' });\n } catch {\n setAiState({\n status: 'error',\n message: 'Failed to initialize AI model',\n });\n }\n });\n return () => {\n cancelled = true;\n };\n }, [aiConfig]);\n\n // Subscribe to log stream if provided\n useEffect(() => {\n if (!logStream) return;\n const unsubscribe = logStream.onLog((event) => {\n if (paused) return;\n if (recording) {\n setLogs((prev) => {\n const next = [event, ...prev];\n if (next.length >= RECORD_LIMIT_DEFAULT) {\n setRecording(false);\n setPaused(true);\n }\n return next.slice(0, RECORD_LIMIT_DEFAULT);\n });\n return;\n }\n setLogs((prev) => [event, ...prev].slice(0, maxSpans));\n });\n return () => {\n unsubscribe();\n };\n }, [logStream, paused, maxSpans, recording]);\n\n useEffect(() => {\n const flush = () => {\n const batch = pendingSpansRef.current;\n pendingSpansRef.current = [];\n if (batch.length === 0) return;\n setSpans((prev) => {\n const next = [...batch, ...prev];\n return next.slice(0, maxSpans);\n });\n setSelected(0);\n setDrilldownTraceId(null);\n };\n const unsubscribe = stream.onSpanEnd((span) => {\n if (paused) return;\n if (span.status === 'ERROR') {\n setNewErrorCount((n) => n + 1);\n setTimeout(\n () => setNewErrorCount((n) => Math.max(0, n - 1)),\n NEW_ERROR_DISPLAY_MS,\n );\n }\n if (recording) {\n setSpans((prev) => {\n const next = [span, ...prev];\n if (next.length >= RECORD_LIMIT_DEFAULT) {\n setRecording(false);\n setPaused(true);\n }\n return next.slice(0, RECORD_LIMIT_DEFAULT);\n });\n setSelected(0);\n setDrilldownTraceId(null);\n return;\n }\n pendingSpansRef.current = [span, ...pendingSpansRef.current];\n if (throttleRef.current) return;\n throttleRef.current = setTimeout(() => {\n throttleRef.current = null;\n flush();\n }, THROTTLE_MS);\n });\n return () => {\n if (throttleRef.current) clearTimeout(throttleRef.current);\n unsubscribe();\n };\n }, [stream, paused, maxSpans, recording]);\n\n const filteredSpanBuffer = useMemo(\n () =>\n applySpanFilters(spans, {\n ...spanFilters,\n errorsOnly: filterErrorsOnly,\n searchQuery,\n }),\n [spans, spanFilters, filterErrorsOnly, searchQuery],\n );\n\n const traceMap = useMemo(\n () => buildTraceMap(filteredSpanBuffer, MAX_TRACES),\n [filteredSpanBuffer],\n );\n const traceSummaries = useMemo(\n () => buildTraceSummaries(traceMap),\n [traceMap],\n );\n const filteredSummaries = useMemo(() => {\n const base = filterTraceSummaries(traceSummaries, '', false);\n return spanFilters.traceId\n ? base.filter((t) => t.traceId === spanFilters.traceId)\n : base;\n }, [traceSummaries, spanFilters.traceId]);\n const filteredSpans = useMemo(\n () => filterBySearch(filteredSpanBuffer, '', false),\n [filteredSpanBuffer],\n );\n\n const stats = useMemo(() => computeStats(spans), [spans]);\n const perSpanNameStats = useMemo(\n () => computePerSpanNameStats(spans),\n [spans],\n );\n const logStats: LogStats = useMemo(() => computeLogStats(logs), [logs]);\n const filteredLogs = useMemo(() => {\n const traceFilteredLogs = spanFilters.traceId\n ? logs.filter((l) => l.traceId === spanFilters.traceId)\n : logs;\n return filterLogsBySearch(traceFilteredLogs, searchQuery, null);\n }, [logs, searchQuery, spanFilters.traceId]);\n\n const serviceStats = useMemo(() => computeServiceStats(spans), [spans]);\n const selectedServiceName = serviceStats[selected]?.serviceName ?? null;\n const spansForSelectedService = useMemo(() => {\n if (!selectedServiceName) return spans;\n return spans.filter(\n (s) =>\n (s.attributes?.['service.name'] as string | undefined) ===\n selectedServiceName,\n );\n }, [spans, selectedServiceName]);\n const selectedServiceRouteStats = useMemo(\n () => computeRouteStats(spansForSelectedService).slice(0, 8),\n [spansForSelectedService],\n );\n const selectedServiceHotSpans = useMemo(\n () => findHotSpanNames(spansForSelectedService, 8),\n [spansForSelectedService],\n );\n\n const selectedTraceSummary =\n drilldownTraceId == null\n ? (filteredSummaries[selected] ?? null)\n : (filteredSummaries.find((t) => t.traceId === drilldownTraceId) ?? null);\n const serviceGraph = useMemo(() => buildServiceGraph(spans), [spans]);\n const topologyLines = useMemo(() => renderTopologyAscii(serviceGraph), [serviceGraph]);\n const errorSummaries = useMemo(\n () => buildErrorSummaries(traceSummaries),\n [traceSummaries],\n );\n const filteredErrorSummaries = spanFilters.traceId\n ? errorSummaries.filter((e) => e.traceId === spanFilters.traceId)\n : errorSummaries;\n const traceTree =\n selectedTraceSummary == null\n ? []\n : flattenTraceTree(buildTraceTree(selectedTraceSummary.spans));\n const waterfallSpans =\n selectedTraceSummary == null\n ? []\n : sortSpansForWaterfall(selectedTraceSummary.spans);\n\n const currentSpanInTrace = traceTree[drilldownSelectedIndex] ?? null;\n const currentSpanInFlat = filteredSpans[selected] ?? null;\n const selectedTraceSummaryForDetails =\n viewMode === 'trace' &&\n drilldownTraceId == null &&\n filteredSummaries[selected]\n ? filteredSummaries[selected]!\n : null;\n const rootSpanOfSelectedTrace =\n selectedTraceSummaryForDetails != null &&\n selectedTraceSummaryForDetails.spans.length > 0\n ? (selectedTraceSummaryForDetails.spans.find(\n (s) =>\n !selectedTraceSummaryForDetails.spans.some(\n (p) => p.spanId === s.parentSpanId,\n ),\n ) ?? selectedTraceSummaryForDetails.spans[0])\n : null;\n const currentSpan =\n viewMode === 'trace'\n ? drilldownTraceId == null\n ? (rootSpanOfSelectedTrace ?? null)\n : (currentSpanInTrace?.span ?? null)\n : viewMode === 'span'\n ? currentSpanInFlat\n : null;\n\n const selectedTraceLogs =\n selectedTraceSummary?.traceId && logs.length > 0\n ? logs.filter((l) => l.traceId === selectedTraceSummary.traceId)\n : [];\n\n const timelineItems =\n selectedTraceSummary &&\n (selectedTraceSummary.spans.length > 0 || selectedTraceLogs.length > 0)\n ? buildTraceTimeline(selectedTraceSummary.spans, selectedTraceLogs)\n : [];\n\n /** Spans belonging to the drilled-down trace */\n const drilldownSpans = useMemo(\n () =>\n drilldownTraceId\n ? spans.filter((s) => s.traceId === drilldownTraceId)\n : [],\n [spans, drilldownTraceId],\n );\n\n /** Span tree for drill-down */\n const drilldownTree = useMemo(\n () =>\n drilldownSpans.length > 0\n ? flattenTraceTree(buildTraceTree(drilldownSpans))\n : [],\n [drilldownSpans],\n );\n\n /** Logs for the drilled-down trace */\n const drilldownLogs = useMemo(\n () =>\n drilldownTraceId\n ? logs.filter((l) => l.traceId === drilldownTraceId)\n : [],\n [logs, drilldownTraceId],\n );\n\n /** Combined timeline for drill-down (spans + logs interleaved by time) */\n const drilldownTimeline = useMemo(\n () =>\n drilldownSpans.length > 0 || drilldownLogs.length > 0\n ? buildTraceTimeline(drilldownSpans, drilldownLogs)\n : [],\n [drilldownSpans, drilldownLogs],\n );\n\n /** Summary for the drilled-down trace (for header display) */\n const drilldownSummary = useMemo(\n () =>\n drilldownTraceId\n ? (traceSummaries.find((t) => t.traceId === drilldownTraceId) ?? null)\n : null,\n [traceSummaries, drilldownTraceId],\n );\n\n /** Currently selected item in the drill-down view */\n const drilldownSelectedItem = useMemo(() => {\n if (!drilldownTraceId) return null;\n if (drilldownTab === 'timeline') {\n const item = drilldownTimeline[drilldownSelectedIndex];\n if (!item) return null;\n return item;\n }\n if (drilldownTab === 'spans') {\n return drilldownTree[drilldownSelectedIndex]\n ? {\n type: 'span' as const,\n span: drilldownTree[drilldownSelectedIndex]!.span,\n }\n : null;\n }\n if (drilldownTab === 'logs') {\n return drilldownLogs[drilldownSelectedIndex]\n ? { type: 'log' as const, log: drilldownLogs[drilldownSelectedIndex] }\n : null;\n }\n return null;\n }, [\n drilldownTraceId,\n drilldownTab,\n drilldownSelectedIndex,\n drilldownTimeline,\n drilldownTree,\n drilldownLogs,\n ]);\n\n // AI query sender — uses tools for precise telemetry queries\n const sendAIQuery = async (question: string) => {\n const aiResult = aiModelRef.current;\n if (!aiResult || aiState.status === 'streaming') return;\n\n const userMsg: ChatMessage = { role: 'user', content: question };\n setAiMessages((prev) => [...prev, userMsg]);\n setAiInput('');\n\n const abort = new AbortController();\n aiAbortRef.current = abort;\n setAiSpec(null);\n setAiState({ status: 'streaming', abortController: abort });\n\n // Build tool context from current dashboard state\n const toolCtx: ToolContext = {\n spans,\n logs,\n traces: traceSummaries,\n stats,\n serviceStats,\n errorSummaries,\n };\n const tools = createTelemetryTools(toolCtx, (spec) => setAiSpec(spec));\n\n // Compact stats for system prompt (tools provide the detailed data)\n const statsContext = JSON.stringify({\n viewMode,\n stats: {\n totalSpans: stats.total,\n errors: stats.errors,\n avgMs: Math.round(stats.avg),\n p95Ms: Math.round(stats.p95),\n },\n services: serviceStats.length,\n traces: traceSummaries.length,\n });\n const drilldownContext = drilldownTraceId\n ? `\\n\\nCurrently viewing trace ${drilldownTraceId}. This trace has ${drilldownSpans.length} spans and ${drilldownLogs.length} logs. The root span is \"${drilldownSummary?.rootName ?? 'unknown'}\" with duration ${drilldownSummary ? formatDurationMs(drilldownSummary.durationMs) : 'unknown'}.`\n : '';\n const systemPrompt =\n buildSystemPrompt(viewMode, statsContext) + drilldownContext;\n\n try {\n // Add empty assistant message for streaming\n setAiMessages((prev) => [...prev, { role: 'assistant', content: '' }]);\n\n const result = await providerStreamText(aiResult.providerType, {\n model: aiResult.model,\n system: systemPrompt,\n messages: [...aiMessages, userMsg].map((m) => ({\n role: m.role,\n content: m.content,\n })),\n tools,\n maxSteps: 10,\n abortSignal: abort.signal,\n });\n\n let fullText = '';\n\n for await (const chunk of result.textStream) {\n if (abort.signal.aborted) break;\n fullText += chunk;\n const captured = fullText;\n setAiMessages((prev) => {\n const updated = [...prev];\n const lastMsg = updated.at(-1);\n if (lastMsg?.role === 'assistant') {\n updated[updated.length - 1] = {\n role: 'assistant',\n content: captured,\n };\n }\n return updated;\n });\n }\n\n // If model returned no text (common with small models after tool calls),\n // show a fallback message\n if (!fullText.trim()) {\n setAiMessages((prev) => {\n const updated = [...prev];\n const lastMsg = updated.at(-1);\n if (lastMsg?.role === 'assistant' && !lastMsg.content.trim()) {\n updated[updated.length - 1] = {\n role: 'assistant',\n content: '(No response from model — try a simpler question or a larger model)',\n };\n }\n return updated;\n });\n }\n\n setAiState({ status: 'idle' });\n } catch (error: unknown) {\n if (abort.signal.aborted) {\n setAiState({ status: 'idle' });\n return;\n }\n const errorMsg = error instanceof Error ? error.message : String(error);\n process.stderr.write(`[autotel-terminal] AI error: ${errorMsg}\\n`);\n setAiState({\n status: 'error',\n message: errorMsg,\n });\n } finally {\n aiAbortRef.current = null;\n }\n };\n\n const { isRawModeSupported } = useStdin();\n\n useInput(\n (input, key) => {\n if (showHelp && input !== '?') {\n if (input === '?') setShowHelp(false);\n return;\n }\n if (input === '?') {\n setShowHelp((h) => !h);\n return;\n }\n if (input === '/') {\n setSearchMode((m) => !m);\n if (searchMode) setSearchQuery('');\n return;\n }\n if (searchMode) {\n if (key.escape || key.return) {\n setSearchMode(false);\n } else if (key.backspace || key.delete) {\n setSearchQuery((q) => q.slice(0, -1));\n } else if (key.tab) {\n // Autocomplete: find first matching traceId and apply it\n if (searchQuery.length >= 4) {\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(searchQuery.toLowerCase()),\n );\n if (match) {\n setSpanFilters((prev) => ({ ...prev, traceId: match.traceId }));\n setSearchMode(false);\n setSearchQuery('');\n }\n }\n } else if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setSearchQuery((q) => q + input);\n }\n return;\n }\n if (traceIdMode) {\n if (key.escape) {\n setTraceIdMode(false);\n setTraceIdInput('');\n } else if (key.return) {\n if (traceIdInput.trim()) {\n // Find matching traceId (prefix match)\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n );\n if (match) {\n setSpanFilters((prev) => ({ ...prev, traceId: match.traceId }));\n }\n } else {\n // Empty input — clear traceId filter\n setSpanFilters((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { traceId: _, ...rest } = prev;\n return rest;\n });\n }\n setTraceIdMode(false);\n setTraceIdInput('');\n } else if (key.tab) {\n // Autocomplete: fill in first matching traceId\n if (traceIdInput.length >= 2) {\n const match = traceSummaries.find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n );\n if (match) {\n setTraceIdInput(match.traceId);\n }\n }\n } else if (key.backspace || key.delete) {\n setTraceIdInput((q) => q.slice(0, -1));\n } else if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setTraceIdInput((q) => q + input);\n }\n return;\n }\n // AI input mode — intercepts all input when typing a question\n if (aiInputMode) {\n if (key.escape) {\n if (aiState.status === 'streaming') {\n aiAbortRef.current?.abort();\n } else {\n setAiInputMode(false);\n setViewMode('trace');\n }\n return;\n }\n if (key.backspace || key.delete) {\n setAiInput((q) => q.slice(0, -1));\n return;\n }\n if (key.return) {\n if (aiInput.trim()) {\n sendAIQuery(aiInput.trim());\n }\n return;\n }\n if (input && input.length === 1 && !key.ctrl && !key.meta) {\n setAiInput((q) => q + input);\n }\n return;\n }\n if (input === 'a') {\n if (viewMode === 'ai') {\n setViewMode('trace');\n setAiInputMode(false);\n } else {\n setViewMode('ai');\n if (aiState.status !== 'unconfigured') {\n setAiInputMode(true);\n }\n }\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n return;\n }\n if (key.escape) {\n if (drilldownTraceId == null) {\n setSearchMode(false);\n } else {\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (key.tab && drilldownTraceId != null) {\n const tabs: Array<'timeline' | 'spans' | 'logs'> = [\n 'timeline',\n 'spans',\n 'logs',\n ];\n const currentIdx = tabs.indexOf(drilldownTab);\n const nextIdx = key.shift\n ? (currentIdx - 1 + tabs.length) % tabs.length\n : (currentIdx + 1) % tabs.length;\n setDrilldownTab(tabs[nextIdx]!);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n return;\n }\n if (key.return && drilldownTraceId == null) {\n let targetTraceId: string | undefined;\n let preSelectIndex = 0;\n if (viewMode === 'trace' && filteredSummaries[selected]) {\n targetTraceId = filteredSummaries[selected]!.traceId;\n } else if (viewMode === 'log' && filteredLogs[selected]?.traceId) {\n targetTraceId = filteredLogs[selected]!.traceId;\n const originLog = filteredLogs[selected]!;\n const traceSpans = spans.filter((s) => s.traceId === targetTraceId);\n const traceLogs = logs.filter((l) => l.traceId === targetTraceId);\n const timeline = buildTraceTimeline(traceSpans, traceLogs);\n preSelectIndex = timeline.findIndex(\n (item) => item.type === 'log' && item.log === originLog,\n );\n if (preSelectIndex < 0) preSelectIndex = 0;\n } else if (viewMode === 'span' && filteredSpans[selected]?.traceId) {\n targetTraceId = filteredSpans[selected]!.traceId;\n const originSpan = filteredSpans[selected]!;\n const traceSpans = spans.filter((s) => s.traceId === targetTraceId);\n const traceLogs = logs.filter((l) => l.traceId === targetTraceId);\n const timeline = buildTraceTimeline(traceSpans, traceLogs);\n preSelectIndex = timeline.findIndex(\n (item) =>\n item.type === 'span' && item.span?.spanId === originSpan.spanId,\n );\n if (preSelectIndex < 0) preSelectIndex = 0;\n }\n if (targetTraceId) {\n setDrilldownTraceId(targetTraceId);\n setDrilldownSelectedIndex(preSelectIndex);\n setDrilldownScrollOffset(Math.max(0, preSelectIndex - LIST_HEIGHT + 1));\n setDrilldownTab('timeline');\n return;\n }\n }\n if (key.upArrow || key.downArrow) {\n if (drilldownTraceId != null) {\n // In drill-down mode — navigate within the active tab's list\n const listLength =\n drilldownTab === 'timeline'\n ? drilldownTimeline.length\n : drilldownTab === 'spans'\n ? drilldownTree.length\n : drilldownLogs.length;\n if (key.upArrow) {\n setDrilldownSelectedIndex((prev) => {\n const next = Math.max(0, prev - 1);\n setDrilldownScrollOffset((off) => Math.min(next, off));\n return next;\n });\n } else {\n setDrilldownSelectedIndex((prev) => {\n const next = Math.min(listLength - 1, prev + 1);\n setDrilldownScrollOffset((off) =>\n next >= off + LIST_HEIGHT ? next - LIST_HEIGHT + 1 : off,\n );\n return next;\n });\n }\n return;\n }\n switch (viewMode) {\n case 'trace': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n setDrilldownSelectedIndex(0);\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredSummaries.length - 1, i + 1));\n setDrilldownSelectedIndex(0);\n }\n break;\n }\n case 'span': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredSpans.length - 1, i + 1));\n }\n break;\n }\n case 'log': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(filteredLogs.length - 1, i + 1));\n }\n break;\n }\n case 'service-summary': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) => Math.min(serviceStats.length - 1, i + 1));\n }\n break;\n }\n case 'errors': {\n if (key.upArrow) {\n setSelected((i) => Math.max(0, i - 1));\n } else if (key.downArrow) {\n setSelected((i) =>\n Math.min(filteredErrorSummaries.length - 1, i + 1),\n );\n }\n break;\n }\n }\n }\n if (input === 'p') setPaused((p) => !p);\n if (input === 'e') setFilterErrorsOnly((v) => !v);\n if (input === 't') {\n setViewMode((m) => (m === 'trace' ? 'span' : 'trace'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'l') {\n setViewMode((m) => (m === 'log' ? 'trace' : 'log'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'v') {\n setViewMode((m) =>\n m === 'service-summary' ? 'trace' : 'service-summary',\n );\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'E') {\n setViewMode((m) => (m === 'errors' ? 'trace' : 'errors'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'G') {\n setViewMode((m) => (m === 'topology' ? 'trace' : 'topology'));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'c') {\n setSpans([]);\n setLogs([]);\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setNewErrorCount(0);\n setSpanFilters({ statusGroup: 'all' });\n setRecording(false);\n setPaused(false);\n }\n if (input === 'r') {\n setSpans([]);\n setLogs([]);\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setNewErrorCount(0);\n setSpanFilters({ statusGroup: 'all' });\n setPaused(false);\n setRecording(true);\n }\n if (input === 'x') {\n setSpanFilters({ statusGroup: 'all' });\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'f') {\n setTraceIdMode(true);\n setTraceIdInput(spanFilters.traceId ?? '');\n return;\n }\n if (input === 'H') {\n setSpanFilters((prev) => {\n const next =\n prev.statusGroup === 'all'\n ? '2xx'\n : prev.statusGroup === '2xx'\n ? '4xx'\n : prev.statusGroup === '4xx'\n ? '5xx'\n : 'all';\n return { ...prev, statusGroup: next };\n });\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n if (input === 'S') {\n const svc = currentSpan?.attributes?.['service.name'];\n if (typeof svc === 'string' && svc.trim()) {\n setSpanFilters((prev) => ({ ...prev, serviceName: svc }));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n }\n if (input === 'R') {\n const route = currentSpan?.attributes?.['http.route'];\n if (typeof route === 'string' && route.trim()) {\n setSpanFilters((prev) => ({ ...prev, route }));\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n }\n }\n if (input === 'T') {\n // Jump to trace view with traceId filter from current item\n let traceId: string | undefined;\n if (drilldownTraceId) {\n traceId = drilldownTraceId;\n } else {\n switch (viewMode) {\n case 'log': {\n traceId = filteredLogs[selected]?.traceId;\n break;\n }\n case 'span': {\n traceId = filteredSpans[selected]?.traceId;\n break;\n }\n case 'errors': {\n traceId = filteredErrorSummaries[selected]?.traceId;\n break;\n }\n }\n }\n if (traceId && viewMode !== 'trace') {\n setSpanFilters((prev) => ({ ...prev, traceId }));\n setViewMode('trace');\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (input === 'L') {\n // Jump to log view with traceId filter from current item\n let traceId: string | undefined;\n if (drilldownTraceId) {\n traceId = drilldownTraceId;\n } else {\n switch (viewMode) {\n case 'trace': {\n traceId = filteredSummaries[selected]?.traceId;\n break;\n }\n case 'span': {\n traceId = filteredSpans[selected]?.traceId;\n break;\n }\n case 'errors': {\n traceId = filteredErrorSummaries[selected]?.traceId;\n break;\n }\n }\n }\n if (traceId && viewMode !== 'log') {\n setSpanFilters((prev) => ({ ...prev, traceId }));\n setViewMode('log');\n setSelected(0);\n setDrilldownTraceId(null);\n setDrilldownSelectedIndex(0);\n setDrilldownScrollOffset(0);\n setDrilldownTab('timeline');\n }\n return;\n }\n if (input === 'J') {\n const t = selectedTraceSummary;\n if (!t) return;\n const json = exportTraceToJson(t, selectedTraceLogs);\n process.stdout.write(`\\n[autotel-terminal] trace export\\n${json}\\n`);\n }\n },\n { isActive: isRawModeSupported },\n );\n\n const headerRight = recording\n ? '[Recording]'\n : paused\n ? '[Paused]'\n : '[Live]';\n const headerModeLabel =\n viewMode === 'trace'\n ? 'traces'\n : viewMode === 'span'\n ? 'spans'\n : viewMode === 'log'\n ? 'logs'\n : viewMode === 'service-summary'\n ? 'services'\n : viewMode === 'topology'\n ? 'topology'\n : viewMode === 'ai'\n ? 'AI'\n : 'errors';\n const showNewError = newErrorCount > 0;\n\n function renderTreeRow(\n node: SpanTreeNode,\n index: number,\n ): React.ReactElement {\n const isSel = drilldownTraceId != null && index === drilldownSelectedIndex;\n const prefix =\n node.depth === 0\n ? ''\n : ' '.repeat(node.depth) +\n (node.children.length > 0 ? '├── ' : '└── ');\n const svcName = spanServiceName(node.span);\n const svcColor = getServiceColor(svcName);\n const statusColor =\n node.span.status === 'ERROR'\n ? 'red'\n : node.span.durationMs > 500\n ? 'yellow'\n : 'green';\n return (\n <Box\n key={`${node.span.spanId}-${node.span.startTime}`}\n flexDirection=\"row\"\n >\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>{isSel ? '▸ ' : ' '}</Text>\n <Text color={node.span.status === 'ERROR' ? 'red' : undefined}>{node.span.status === 'ERROR' ? '✗' : ' '}</Text>\n <Text dimColor>{prefix}</Text>\n <Text color={colors ? statusColor : undefined}>\n {truncate(node.span.name, 23)}\n </Text>\n <Text color={svcColor}> {truncate(svcName, 10)}</Text>\n <Text dimColor> {node.span.kind ?? ''}</Text>\n <Text dimColor> {formatDurationMs(node.span.durationMs)}</Text>\n </Box>\n );\n }\n\n function keyAttrsAndRest(attrs: Record<string, unknown> | undefined) {\n if (!attrs || Object.keys(attrs).length === 0)\n return {\n key: [] as [string, unknown][],\n rest: [] as [string, unknown][],\n };\n const entries = Object.entries(attrs);\n const key = entries.filter(([k]) => KEY_ATTR_KEYS.has(k));\n const rest = entries.filter(([k]) => !KEY_ATTR_KEYS.has(k));\n return { key, rest };\n }\n\n const waterfallMaxMs =\n waterfallSpans.length > 0\n ? Math.max(...waterfallSpans.map((w) => w.span.durationMs))\n : 1;\n const barWidth = 30;\n\n return (\n <Box\n flexDirection=\"column\"\n paddingX={1}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Text key=\"title\" bold>\n 🔭 {title} — {headerModeLabel}\n </Text>\n <Box flexDirection=\"row\" gap={1}>\n {showNewError && (\n <Text key=\"newError\" color=\"red\">\n 1 new error\n </Text>\n )}\n <Text key=\"status\" color={paused ? 'yellow' : 'green'}>\n {headerRight}\n </Text>\n </Box>\n </Box>\n\n {/* Controls bar — always exactly 2 lines */}\n <Box marginBottom={0} flexDirection=\"column\">\n {searchMode ? (\n <Text color=\"cyan\">\n Search: {searchQuery || '(type to filter)'}\n <Text dimColor> (Tab: match traceId, Esc: cancel)</Text>\n </Text>\n ) : traceIdMode ? (\n <Text color=\"yellow\">\n TraceId: {traceIdInput || '(type prefix, Tab to complete)'}\n {traceIdInput.length >= 2 && (\n <Text dimColor>\n {' → '}\n {traceSummaries\n .find((t) =>\n t.traceId.toLowerCase().startsWith(traceIdInput.toLowerCase()),\n )\n ?.traceId.slice(0, 16) ?? 'no match'}…\n </Text>\n )}\n </Text>\n ) : (\n <Box flexDirection=\"row\" justifyContent=\"space-between\">\n <Text dimColor>\n {drilldownTraceId == null\n ? '↑/↓ select • Enter open • Tab cycle tabs • Esc back • t trace • l logs • a AI • ? help'\n : '↑/↓ select • Tab cycle tabs • Esc back • t trace • l logs • a AI • ? help'}\n </Text>\n <Text dimColor>\n {viewMode === 'trace'\n ? `traces ${filteredSummaries.length}/${traceSummaries.length}`\n : viewMode === 'span'\n ? `spans ${filteredSpans.length}/${spans.length}`\n : viewMode === 'service-summary'\n ? `services ${serviceStats.length}`\n : viewMode === 'errors'\n ? `errors ${filteredErrorSummaries.length}/${errorSummaries.length}`\n : viewMode === 'topology'\n ? `services ${serviceGraph.services.length} · edges ${serviceGraph.edges.length}`\n : viewMode === 'ai'\n ? `messages ${aiMessages.length}`\n : `logs ${filteredLogs.length}/${logs.length}`}\n </Text>\n </Box>\n )}\n {showHelp && (\n <Text dimColor>\n Views: t/l/v/E/G/a • Search: / • Filters: e/S/R/H/f/x • Capture: p/r/J • Clear: c\n </Text>\n )}\n </Box>\n\n <Box marginBottom={0}>\n <Text dimColor>\n {spanFilters.serviceName || spanFilters.route || spanFilters.statusGroup !== 'all' || spanFilters.traceId\n ? `filters:${spanFilters.serviceName ? ` service=${spanFilters.serviceName}` : ''}${spanFilters.route ? ` route=${spanFilters.route}` : ''}${spanFilters.statusGroup && spanFilters.statusGroup !== 'all' ? ` status=${spanFilters.statusGroup}` : ''}${spanFilters.traceId ? ` trace=${spanFilters.traceId.slice(0, 8)}…` : ''}`\n : 'filters: none'}\n </Text>\n </Box>\n\n {viewMode === 'topology' && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text bold>Service Topology</Text>\n <Text dimColor>Press G to toggle · Shows service dependencies from span data</Text>\n <Box flexDirection=\"column\" marginTop={1}>\n {topologyLines.map((line, i) => {\n const hasErr = line.includes(' err');\n return (\n <Text key={`topo-${i}`} color={hasErr ? 'red' : undefined}>\n {line}\n </Text>\n );\n })}\n </Box>\n </Box>\n )}\n\n {viewMode === 'ai' && (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1} paddingY={0}>\n <Box marginBottom={1} justifyContent=\"space-between\">\n <Text bold>AI Assistant</Text>\n <Text dimColor>\n {aiState.status === 'streaming'\n ? '(streaming...)'\n : aiState.status === 'unconfigured'\n ? '(no provider)'\n : aiState.status === 'error'\n ? '(error)'\n : ''}\n </Text>\n </Box>\n\n {aiState.status === 'unconfigured' ? (\n <Box flexDirection=\"column\">\n <Text dimColor>No AI provider configured.</Text>\n <Text dimColor>Set AI_PROVIDER and AI_MODEL env vars, or start Ollama locally.</Text>\n <Text dimColor>Press a to close this view.</Text>\n </Box>\n ) : (\n <>\n {aiMessages.length === 0 && aiState.status !== 'error' && (\n <Text dimColor>Ask a question about your telemetry data. Press Enter to send.</Text>\n )}\n {aiMessages.slice(-10).map((msg, i) => (\n <Box key={`ai-msg-${i}`} flexDirection=\"column\" marginBottom={msg.role === 'assistant' ? 1 : 0}>\n <Text color={msg.role === 'user' ? 'cyan' : undefined}>\n {msg.role === 'user' ? '> ' : ''}\n {msg.content.slice(0, 1000)}\n {msg.content.length > 1000 ? '...' : ''}\n </Text>\n </Box>\n ))}\n {aiSpec && (\n <Box flexDirection=\"column\" marginBottom={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <InkRenderer spec={aiSpec} />\n </Box>\n )}\n {aiState.status === 'error' && (\n <Text color=\"red\">Error: {aiState.message}</Text>\n )}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\">&gt; </Text>\n <Text>\n {aiInput || (aiInputMode ? '(type your question)' : '(press a to focus)')}\n </Text>\n </Box>\n </>\n )}\n </Box>\n )}\n\n {/* eslint-disable unicorn/no-negated-condition */}\n {viewMode !== 'topology' && viewMode !== 'ai' && (drilldownTraceId != null ? (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"gray\" paddingX={1} paddingY={0}>\n {/* Trace header */}\n <Box marginBottom={0} flexDirection=\"column\">\n <Text bold>Trace {drilldownTraceId.slice(0, 16)}…</Text>\n <Box flexDirection=\"row\" gap={1}>\n {drilldownSummary?.services?.map((svc) => (\n <Text key={svc} color={getServiceColor(svc)}>{svc}</Text>\n ))}\n <Text dimColor>·</Text>\n <Text>{drilldownSummary?.rootName ?? 'unknown'}</Text>\n <Text dimColor>·</Text>\n <Text dimColor>{drilldownSpans.length} spans</Text>\n <Text dimColor>·</Text>\n <Text dimColor>{drilldownSummary?.services?.length ?? 0} services</Text>\n {drilldownSummary?.hasError && <Text color=\"red\">{' '}ERROR</Text>}\n </Box>\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Duration: </Text>\n <Text color=\"green\">{formatDurationMs(drilldownSummary?.durationMs ?? 0)}</Text>\n </Box>\n </Box>\n {/* Tabs — blue active */}\n <Box marginBottom={0} flexDirection=\"row\" gap={2}>\n <Text\n color={drilldownTab === 'timeline' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'timeline'}\n bold={drilldownTab === 'timeline'}\n >\n Timeline\n </Text>\n <Text\n color={drilldownTab === 'spans' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'spans'}\n bold={drilldownTab === 'spans'}\n >\n Spans ({drilldownSpans.length})\n </Text>\n <Text\n color={drilldownTab === 'logs' ? 'blue' : undefined}\n dimColor={drilldownTab !== 'logs'}\n bold={drilldownTab === 'logs'}\n >\n Logs ({drilldownLogs.length})\n </Text>\n </Box>\n\n {drilldownTab === 'timeline' &&\n (() => {\n const NAME_COL = 28;\n const SERVICE_COL = 12;\n const KIND_COL = 10;\n let traceStartMs = Infinity;\n for (const s of drilldownSummary?.spans ?? []) {\n if (s.startTime < traceStartMs) traceStartMs = s.startTime;\n }\n if (traceStartMs === Infinity) traceStartMs = 0;\n const traceDurMs = drilldownSummary?.durationMs ?? 1;\n const WATERFALL_WIDTH = 44;\n const items = drilldownTimeline.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT);\n\n return (\n <>\n {/* Time ruler */}\n <Box flexDirection=\"row\">\n <Text dimColor>{''.padEnd(NAME_COL + SERVICE_COL + KIND_COL + 2)}</Text>\n <Text dimColor>{buildTimeRuler(traceDurMs, WATERFALL_WIDTH)}</Text>\n </Box>\n {items.map((item, i) => {\n const isSel = i + drilldownScrollOffset === drilldownSelectedIndex;\n if (item.type === 'span' && item.span) {\n const s = item.span;\n const node = drilldownTree.find(\n (n) => n.span.spanId === s.spanId,\n );\n const depth = node?.depth ?? 0;\n const indent = ' '.repeat(Math.min(depth, 4));\n const nameWidth = NAME_COL - Math.min(depth, 4) * 2 - 1;\n const svcName = spanServiceName(s);\n const svcColor = getServiceColor(svcName);\n const kindStr = (s.kind ?? '').padEnd(KIND_COL);\n const svcStr = truncate(svcName, SERVICE_COL - 2).padEnd(SERVICE_COL);\n const errorMark = s.status === 'ERROR' ? '✗' : ' ';\n const namePart = `${indent}${truncate(s.name, nameWidth - 1)}`.padEnd(NAME_COL - 1);\n const bar = buildWaterfallBar(\n s.startTime, s.durationMs,\n traceStartMs, traceDurMs,\n WATERFALL_WIDTH,\n );\n return (\n <Box key={`${s.spanId}-${i}`} flexDirection=\"row\">\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>\n {isSel ? '▸' : ' '}<Text color={s.status === 'ERROR' ? 'red' : undefined}>{errorMark}</Text>{namePart}\n </Text>\n <Text color={svcColor}> {svcStr}</Text>\n <Text dimColor>{kindStr}</Text>\n <Text color={s.status === 'ERROR' ? 'red' : svcColor}>{bar}</Text>\n <Text color={s.status === 'ERROR' ? 'red' : svcColor}>\n {' '}{formatDurationMs(s.durationMs)}\n </Text>\n </Box>\n );\n } else if (item.type === 'log' && item.log) {\n const l = item.log;\n const levelColor =\n l.level === 'error' ? 'red' : l.level === 'warn' ? 'yellow' : 'blue';\n const relTime = drilldownSummary\n ? `+${formatDurationMs(l.time - traceStartMs)}`\n : '';\n const logName = ` ${l.level.toUpperCase()} ${truncate(l.message, NAME_COL - 8)}`.padEnd(NAME_COL);\n const logOffset = drilldownSummary\n ? Math.floor(((l.time - traceStartMs) / traceDurMs) * WATERFALL_WIDTH)\n : 0;\n const clampedOffset = Math.max(0, Math.min(logOffset, WATERFALL_WIDTH - 1));\n const logBar = ' '.repeat(clampedOffset) + '·' + ' '.repeat(WATERFALL_WIDTH - clampedOffset - 1);\n return (\n <Box key={`log-${i}`} flexDirection=\"row\">\n <Text backgroundColor={isSel ? 'blue' : undefined} color={isSel ? 'white' : undefined}>\n {isSel ? '▸' : ' '}<Text color={levelColor}>{logName}</Text>\n </Text>\n <Text dimColor>{' '.padEnd(SERVICE_COL + KIND_COL + 1)}</Text>\n <Text dimColor>{logBar}</Text>\n <Text dimColor> {relTime}</Text>\n </Box>\n );\n }\n return null;\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - items.length) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n );\n })()}\n\n {drilldownTab === 'spans' &&\n drilldownTree.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT).map((node, i) => renderTreeRow(node, i + drilldownScrollOffset))}\n {drilldownTab === 'spans' &&\n Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(drilldownTree.length, LIST_HEIGHT)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n\n {drilldownTab === 'logs' &&\n drilldownLogs.slice(drilldownScrollOffset, drilldownScrollOffset + LIST_HEIGHT).map((log, i) => {\n const isSel = i + drilldownScrollOffset === drilldownSelectedIndex;\n const levelColor =\n log.level === 'error'\n ? 'red'\n : log.level === 'warn'\n ? 'yellow'\n : log.level === 'info'\n ? 'green'\n : undefined;\n return (\n <Box key={`log-${i}`}>\n <Text\n backgroundColor={isSel ? 'blue' : undefined}\n color={isSel ? 'white' : undefined}\n >\n {isSel ? '▸' : ' '}\n <Text color={levelColor}>\n {' '}\n {log.level.toUpperCase()}\n </Text>{' '}\n <Text dimColor>[{truncate(log.message, 50)}]</Text>\n </Text>\n </Box>\n );\n })}\n {drilldownTab === 'logs' &&\n Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(drilldownLogs.length, LIST_HEIGHT)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n\n {/* Inline detail for selected span */}\n {drilldownSelectedItem?.type === 'span' && drilldownSelectedItem.span && (\n (() => {\n const span = drilldownSelectedItem.span;\n const { key: keyAttrs, rest: restAttrs } = keyAttrsAndRest(span.attributes);\n return (\n <Box marginTop={1} flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Box flexDirection=\"row\" gap={2}>\n <Text bold>{span.name}</Text>\n <Text color={getServiceColor(spanServiceName(span))}>{spanServiceName(span)}</Text>\n <Text dimColor>{span.kind ?? ''}</Text>\n <Text color={span.status === 'ERROR' ? 'red' : 'green'}>{span.status}</Text>\n <Text>{formatDurationMs(span.durationMs)}</Text>\n </Box>\n <Box flexDirection=\"row\" gap={2}>\n <Text dimColor>Trace: {span.traceId}</Text>\n <Text dimColor>Span: {span.spanId}</Text>\n {span.parentSpanId && <Text dimColor>Parent: {span.parentSpanId}</Text>}\n </Box>\n {keyAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Key attributes</Text>\n {keyAttrs.slice(0, 6).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {restAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {restAttrs.slice(0, 8).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {/* Span Events */}\n {span.events && span.events.length > 0 && (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold dimColor>Events ({span.events.length})</Text>\n {span.events.slice(0, 5).map((ev, i) => (\n <Box key={`ev-${i}`} flexDirection=\"row\">\n <Text color={ev.name === 'exception' ? 'red' : 'yellow'}>\n {' '}{'\\u25C6'} {truncate(ev.name, 20)}\n </Text>\n <Text dimColor>\n {' '}+{formatDurationMs(ev.timeMs - span.startTime)}\n </Text>\n {ev.attributes && Object.keys(ev.attributes).length > 0 && (\n <Text dimColor>\n {' '}{Object.entries(ev.attributes).slice(0, 2).map(([k, v]) => `${k}=${String(v)}`).join(' ')}\n </Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n {/* Span Links */}\n {span.links && span.links.length > 0 && (\n <Box flexDirection=\"column\" marginTop={0}>\n <Text bold dimColor>Links ({span.links.length})</Text>\n {span.links.slice(0, 5).map((lnk, i) => (\n <Box key={`lnk-${i}`} flexDirection=\"row\">\n <Text color=\"cyan\">\n {' '}{'\\u2192'} trace:{lnk.traceId.slice(0, 8)}{'\\u2026'} span:{lnk.spanId.slice(0, 8)}{'\\u2026'}\n </Text>\n {lnk.attributes && Object.keys(lnk.attributes).length > 0 && (\n <Text dimColor>\n {' '}{Object.entries(lnk.attributes).slice(0, 2).map(([k, v]) => `${k}=${String(v)}`).join(' ')}\n </Text>\n )}\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n })()\n )}\n {/* Inline detail for selected log */}\n {drilldownSelectedItem?.type === 'log' && drilldownSelectedItem.log && (\n (() => {\n const log = drilldownSelectedItem.log;\n return (\n <Box marginTop={1} flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Box flexDirection=\"row\" gap={2}>\n <Text bold>{log.level.toUpperCase()}</Text>\n <Text>{log.message}</Text>\n </Box>\n <Text>\n <Text dimColor>Time: </Text>\n <Text>{new Date(log.time).toISOString()}</Text>\n </Text>\n {log.traceId && <Text dimColor>Trace: {log.traceId}</Text>}\n {log.spanId && <Text dimColor>Span: {log.spanId}</Text>}\n {log.attributes && Object.keys(log.attributes).length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {Object.entries(log.attributes).slice(0, 10).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 40)}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n })()\n )}\n </Box>\n ) : (\n <Box flexDirection=\"row\" gap={2}>\n <Box\n flexDirection=\"column\"\n width=\"55%\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={0}\n >\n <Box marginTop={0} marginBottom={1}>\n <Text key=\"list-title\" bold>\n {viewMode === 'trace'\n ? 'Recent traces'\n : viewMode === 'span'\n ? 'Recent spans'\n : viewMode === 'service-summary'\n ? 'Service summary'\n : viewMode === 'errors'\n ? 'Recent errors'\n : 'Recent logs'}\n </Text>\n {filterErrorsOnly && (\n <Text key=\"errors-only-label\" color=\"red\">\n {' '}\n (errors only)\n </Text>\n )}\n {searchQuery && (\n <Text key=\"search-label\" dimColor>\n {' '}\n /{searchQuery}\n </Text>\n )}\n </Box>\n\n <>\n {viewMode === 'trace' ? (\n filteredSummaries.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No traces yet. Call a traced function or hit an endpoint\n to see them here.\n </Text>\n <Text dimColor>\n Tip: trace() your handlers with autotel to get spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredSummaries.slice(0, 20).map((t, i) => {\n const isSel = i === selected;\n return (\n <Box key={t.traceId} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '▸ ' : ' '}\n </Text>\n <Text color={t.hasError ? 'red' : 'yellow'} bold={isSel}>\n {truncate(t.rootName, 28)}\n </Text>\n <Text dimColor>\n {' '}{t.spans.length} spans\n </Text>\n <Text color=\"green\">\n {' '}{formatDurationMs(t.durationMs)}\n </Text>\n <Text dimColor>\n {' '}{formatRelative(t.lastEndTime)}\n </Text>\n <Text dimColor>{' '}{t.traceId.slice(0, 12)}…</Text>\n {t.hasError && <Text color=\"red\"> ●</Text>}\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredSummaries.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'span' ? (\n filteredSpans.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No spans yet. Call a traced function or hit an endpoint to\n see them here.\n </Text>\n <Text dimColor>\n Tip: trace() your handlers with autotel to get spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredSpans.slice(0, 20).map((s, i) => {\n const isSel = i === selected;\n const svcName = spanServiceName(s);\n const svcColor = getServiceColor(svcName);\n const statusColor =\n s.status === 'ERROR'\n ? 'red'\n : s.durationMs > 500\n ? 'yellow'\n : 'green';\n return (\n <Box\n key={`${s.spanId}-${s.startTime}`}\n flexDirection=\"row\"\n >\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color={colors ? statusColor : undefined}>\n {truncate(s.name, 26)}\n </Text>\n <Text color={svcColor}> {truncate(svcName, 10)}</Text>\n <Text dimColor> {formatDurationMs(s.durationMs)}</Text>\n <Text dimColor> {formatRelative(s.endTime)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredSpans.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'service-summary' ? (\n serviceStats.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No service stats yet. Add `service.name` attributes to\n spans.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 1) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {serviceStats.slice(0, 20).map((svc, i) => {\n const isSel = i === selected;\n const errorRate = svc.total\n ? (svc.errors / svc.total) * 100\n : 0;\n return (\n <Box key={svc.serviceName} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text>{truncate(svc.serviceName, 16)}</Text>\n <Text dimColor>\n {' '}\n {svc.errors}/{svc.total}\n </Text>\n <Text dimColor> {errorRate.toFixed(0)}%</Text>\n <Text dimColor> p95 {formatDurationMs(svc.p95Ms)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(serviceStats.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : viewMode === 'errors' ? (\n filteredErrorSummaries.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>No errors yet.</Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 1) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredErrorSummaries.slice(0, 20).map((e, i) => {\n const isSel = i === selected;\n return (\n <Box key={e.traceId} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color=\"red\">{truncate(e.rootName, 16)}</Text>\n <Text dimColor> {truncate(e.serviceName, 10)}</Text>\n {e.route && (\n <Text dimColor> {truncate(e.route, 14)}</Text>\n )}\n {typeof e.statusCode === 'number' && (\n <Text dimColor> {e.statusCode}</Text>\n )}\n <Text dimColor> ({e.errorCount})</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredErrorSummaries.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )\n ) : filteredLogs.length === 0 ? (\n <>\n <Box flexDirection=\"column\">\n <Text dimColor>\n No logs yet. Emit request logs or canonical log lines to see\n them here.\n </Text>\n <Text dimColor>\n Tip: hook getTerminalLogStream() into your canonical log\n line drain.\n </Text>\n </Box>\n {Array.from({ length: Math.max(0, LIST_HEIGHT - 2) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n ) : (\n <>\n {filteredLogs.slice(0, 20).map((log, i) => {\n const isSel = i === selected;\n const levelColor =\n log.level === 'error'\n ? 'red'\n : log.level === 'warn'\n ? 'yellow'\n : log.level === 'debug'\n ? 'gray'\n : 'green';\n return (\n <Box key={`${log.time}-${i}`} flexDirection=\"row\">\n <Text color={isSel ? 'cyan' : undefined}>\n {isSel ? '› ' : ' '}\n </Text>\n <Text color={colors ? levelColor : undefined}>\n {truncate(log.level.toUpperCase(), 5)}\n </Text>\n <Text> </Text>\n <Text>{truncate(log.message, 32)}</Text>\n </Box>\n );\n })}\n {Array.from({ length: Math.max(0, LIST_HEIGHT - Math.min(filteredLogs.length, 20)) }).map((_, i) => (\n <Box key={`pad-${i}`}><Text> </Text></Box>\n ))}\n </>\n )}\n </>\n </Box>\n\n <Box\n flexDirection=\"column\"\n width=\"45%\"\n borderStyle=\"round\"\n borderColor=\"gray\"\n paddingX={1}\n paddingY={0}\n >\n <>\n <Box marginBottom={1}>\n <Text bold>Details</Text>\n </Box>\n\n {viewMode === 'errors' ? (\n (() => {\n const e = filteredErrorSummaries[selected] ?? null;\n if (!e)\n return (\n <Text dimColor>Select an error to view details.</Text>\n );\n return (\n <>\n <Text>\n <Text dimColor>Trace: </Text>\n <Text>{e.traceId}</Text>\n </Text>\n <Text dimColor>\n Service: {e.serviceName}\n {e.route ? ` • Route: ${e.route}` : ''}\n {typeof e.statusCode === 'number'\n ? ` • Status: ${e.statusCode}`\n : ''}\n </Text>\n <Text dimColor>Errors: {e.errorCount}</Text>\n <Text dimColor>\n Press T to jump to trace view for this trace.\n </Text>\n </>\n );\n })()\n ) : viewMode === 'service-summary' ? (\n (() => {\n const svc = serviceStats[selected] ?? null;\n if (!svc)\n return (\n <Text dimColor>Select a service to view details.</Text>\n );\n return (\n <>\n <Text>\n <Text dimColor>Service: </Text>\n <Text>{svc.serviceName}</Text>\n </Text>\n <Text dimColor>\n Spans: {svc.total} | Errors: {svc.errors} | Avg:{' '}\n {formatDurationMs(svc.avgMs)} | P95:{' '}\n {formatDurationMs(svc.p95Ms)}\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Top routes</Text>\n {selectedServiceRouteStats.length === 0 ? (\n <Text dimColor>(no http.route)</Text>\n ) : (\n selectedServiceRouteStats.map((r) => (\n <Text key={r.route} dimColor>\n {truncate(r.route, 20)} {r.errors}/{r.total} p95{' '}\n {formatDurationMs(r.p95Ms)}\n </Text>\n ))\n )}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Hot spans</Text>\n {selectedServiceHotSpans.length === 0 ? (\n <Text dimColor>(no spans)</Text>\n ) : (\n selectedServiceHotSpans.map((h) => (\n <Text key={h.name} dimColor>\n {truncate(h.name, 20)} p95{' '}\n {formatDurationMs(h.p95Ms)} ({h.count}x)\n </Text>\n ))\n )}\n </Box>\n </>\n );\n })()\n ) : viewMode === 'log' ? (\n (() => {\n const log = filteredLogs[selected] ?? null;\n if (!log) {\n return (\n <Text dimColor>Select a log to view details.</Text>\n );\n }\n return (\n <>\n <Text>\n <Text dimColor>Level: </Text>\n <Text>{log.level.toUpperCase()}</Text>\n </Text>\n <Text>\n <Text dimColor>Time: </Text>\n <Text>{new Date(log.time).toISOString()}</Text>\n </Text>\n <Text>\n <Text dimColor>Message: </Text>\n <Text>{log.message}</Text>\n </Text>\n {log.traceId && (\n <Text dimColor>Trace: {log.traceId}</Text>\n )}\n {log.spanId && <Text dimColor>Span: {log.spanId}</Text>}\n {log.attributes &&\n Object.keys(log.attributes).length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {Object.entries(log.attributes)\n .slice(0, 10)\n .map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 40)}\n </Text>\n ))}\n </Box>\n )}\n {timelineItems.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Timeline (trace)</Text>\n {timelineItems.slice(0, 10).map((item, idx) => {\n const relMs =\n item.time -\n (selectedTraceSummary?.spans[0]?.startTime ??\n item.time);\n if (item.type === 'span' && item.span) {\n return (\n <Text key={`span-${idx}`} dimColor>\n +{relMs}ms span{' '}\n {truncate(item.span.name, 20)}\n </Text>\n );\n }\n if (item.type === 'log' && item.log) {\n return (\n <Text key={`log-${idx}`}>\n +{relMs}ms log{' '}\n {truncate(item.log.message, 24)}\n </Text>\n );\n }\n return null;\n })}\n </Box>\n )}\n </>\n );\n })()\n ) : currentSpan ? (\n <>\n <Text>\n <Text dimColor>Name: </Text>\n <Text>{currentSpan.name}</Text>\n </Text>\n <Text>\n <Text dimColor>Status: </Text>\n <Text\n color={currentSpan.status === 'ERROR' ? 'red' : 'green'}\n >\n {currentSpan.status}\n </Text>\n </Text>\n <Text>\n <Text dimColor>Duration: </Text>\n <Text>\n {formatDurationMs(currentSpan.durationMs)}\n {perSpanNameStats.byName.has(currentSpan.name) &&\n (() => {\n const p = perSpanNameStats.byName.get(\n currentSpan.name,\n )!;\n const ratio =\n p.avgMs > 0\n ? currentSpan.durationMs / p.avgMs\n : 1;\n if (ratio >= 1.5)\n return ` (${ratio.toFixed(1)}x avg)`;\n return '';\n })()}\n </Text>\n </Text>\n <Text dimColor>Trace: {currentSpan.traceId}</Text>\n <Text dimColor>Span: {currentSpan.spanId}</Text>\n {currentSpan.parentSpanId && (\n <Text dimColor>Parent: {currentSpan.parentSpanId}</Text>\n )}\n {currentSpan.kind && (\n <Text dimColor>Kind: {currentSpan.kind}</Text>\n )}\n\n {(() => {\n const { key: keyAttrs, rest: restAttrs } =\n keyAttrsAndRest(currentSpan.attributes);\n return (\n <>\n {keyAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Key attributes</Text>\n {keyAttrs.slice(0, 6).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {restAttrs.length > 0 && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Attributes</Text>\n {restAttrs.slice(0, 8).map(([k, v]) => (\n <Text key={k} dimColor>\n {truncate(k, 18)}: {truncate(String(v), 28)}\n </Text>\n ))}\n </Box>\n )}\n {keyAttrs.length === 0 && restAttrs.length === 0 && (\n <Text dimColor>(no attributes)</Text>\n )}\n </>\n );\n })()}\n\n {waterfallSpans.length > 0 && drilldownTraceId != null && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Waterfall</Text>\n {waterfallSpans.slice(0, 10).map((w) => {\n const barLen =\n Math.round(\n (w.span.durationMs / waterfallMaxMs) * barWidth,\n ) || 1;\n const bar = '█'.repeat(barLen);\n const indent = ' '.repeat(w.depth);\n return (\n <Box key={w.span.spanId} flexDirection=\"row\">\n <Text dimColor>{indent}</Text>\n <Text>{truncate(w.span.name, 12)}</Text>\n <Text dimColor> {bar}</Text>\n <Text dimColor>\n {' '}\n {formatDurationMs(w.span.durationMs)}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n </>\n ) : (\n <Text dimColor>Select a trace or span to view details.</Text>\n )}\n </>\n </Box>\n </Box>\n ))}\n\n {showStats && (\n <Box marginTop={1} borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n Spans: {stats.total} | Span errors: {stats.errors} | Logs:{' '}\n {logStats.total} | Log errors: {logStats.errors} | Avg:{' '}\n {formatDurationMs(stats.avg)} | P95: {formatDurationMs(stats.p95)}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n// Global streaming processor for auto-wiring\nlet globalStreamingProcessor: StreamingSpanProcessor | null = null;\n\n/**\n * Check if a TracerProvider has an addSpanProcessor method\n * (Node.js SDK providers have this, but API-level providers don't)\n */\nfunction canAddSpanProcessor(\n provider: TracerProvider,\n): provider is TracerProvider & {\n addSpanProcessor: (processor: unknown) => void;\n} {\n return (\n typeof provider === 'object' &&\n provider !== null &&\n 'addSpanProcessor' in provider &&\n typeof (provider as { addSpanProcessor?: unknown }).addSpanProcessor ===\n 'function'\n );\n}\n\n/**\n * Render the terminal dashboard\n *\n * Automatically wires up a streaming processor from the current tracer provider\n * if no stream is provided. Otherwise uses the provided stream.\n *\n * @param options - Dashboard configuration options\n * @param stream - Optional manual stream (for advanced use cases)\n *\n * @example Auto-wire (recommended)\n * ```typescript\n * import { init } from 'autotel'\n * import { renderTerminal } from 'autotel-terminal'\n *\n * init({ service: 'my-app' })\n * renderTerminal() // Automatically creates stream from current tracer provider\n * ```\n *\n * @example Manual stream\n * ```typescript\n * import { StreamingSpanProcessor } from 'autotel-terminal'\n * import { createTerminalSpanStream } from 'autotel-terminal'\n *\n * const processor = new StreamingSpanProcessor(baseProcessor)\n * const stream = createTerminalSpanStream(processor)\n * renderTerminal({}, stream)\n * ```\n */\nexport function renderTerminal(\n options: TerminalOptions = {},\n stream?: TerminalSpanStream,\n): void {\n const title = options.title ?? 'Autotel Trace Inspector';\n const showStats = options.showStats !== false;\n const maxSpans = options.maxSpans ?? 100;\n const colors = options.colors ?? Boolean(process.stdout.isTTY);\n const aiConfig = options.ai;\n\n // Check if stdin supports raw mode (needed for keyboard input)\n // If not, we disable stdin to prevent Ink from throwing an error\n const stdinOption = process.stdin.isTTY ? process.stdin : undefined;\n\n // If stream provided, use it directly\n if (stream) {\n try {\n render(\n <Dashboard\n title={title}\n showStats={showStats}\n maxSpans={maxSpans}\n colors={colors}\n stream={stream}\n logStream={getTerminalLogStream()}\n aiConfig={aiConfig}\n />,\n { stdin: stdinOption },\n );\n } catch (error) {\n console.error('[autotel-terminal] Failed to render dashboard:', error);\n }\n return;\n }\n\n // Otherwise, auto-wire from current tracer provider\n let provider: TracerProvider;\n try {\n provider = getAutotelTracerProvider();\n } catch (error) {\n console.error(\n '[autotel-terminal] Failed to get tracer provider. Call init() first or provide a stream.',\n error,\n );\n return;\n }\n\n if (!provider) {\n console.error(\n '[autotel-terminal] No tracer provider found. Call init() first or provide a stream.',\n );\n return;\n }\n\n // Check if provider supports addSpanProcessor (Node.js SDK providers do)\n if (!canAddSpanProcessor(provider)) {\n console.error(\n '[autotel-terminal] TracerProvider does not support addSpanProcessor. Provide a stream manually.',\n );\n return;\n }\n\n // Create streaming processor that doesn't wrap anything (just streams)\n // This way it doesn't interfere with existing processors\n globalStreamingProcessor = new StreamingSpanProcessor(null);\n const terminalStream = createTerminalSpanStream(globalStreamingProcessor);\n\n // Add streaming processor to provider\n provider.addSpanProcessor(globalStreamingProcessor);\n\n try {\n render(\n <Dashboard\n title={title}\n showStats={showStats}\n maxSpans={maxSpans}\n colors={colors}\n stream={terminalStream}\n logStream={getTerminalLogStream()}\n />,\n { stdin: stdinOption },\n );\n } catch (error) {\n console.error('[autotel-terminal] Failed to render dashboard:', error);\n }\n}\n\n// Re-export types and utilities\nexport type { TerminalSpanEvent, TerminalSpanStream, SpanEvent, SpanLink } from './span-stream';\nexport { StreamingSpanProcessor } from './streaming-processor';\nexport { createTerminalSpanStream } from './span-stream';\nexport { getTerminalLogStream } from './log-stream';\nexport type { TerminalLogStream } from './log-stream';\nexport type { TerminalLogEvent } from './lib/log-model';\n\n// Re-export OpenTelemetry types for advanced users\nexport type { ReadableSpan } from '@opentelemetry/sdk-trace-base';\nexport { SpanStatusCode, SpanKind } from 'autotel';\n\n// Re-export PrettyConsoleExporter for convenience\nexport {\n PrettyConsoleExporter,\n type PrettyConsoleExporterOptions,\n} from 'autotel/exporters';\n","import { createServer, type Server } from 'node:http';\n\nconst LOOPBACK = new Set(['localhost', '127.0.0.1', '::1']);\n\nexport interface LoopbackListeners {\n /** Resolves once the primary and (attempted) sibling listeners are up. */\n ready: Promise<{ addresses: string[]; warnings: string[] }>;\n /** Close the sibling listener (the primary server is owned by the caller). */\n closeSibling: () => Promise<void>;\n}\n\n/** Format host:port, bracketing IPv6 literals (e.g. `[::1]:4319`). */\nexport function formatAddress(host: string, port: number): string {\n return host.includes(':') ? `[${host}]:${port}` : `${host}:${port}`;\n}\n\n/**\n * Listen on `host:port`, and when `host` is a loopback literal, ALSO listen on\n * the sibling loopback family (IPv4 ⟷ IPv6) so a client reaches the collector\n * whether the OS resolves `localhost` to `127.0.0.1` or `::1`.\n *\n * Kills a silent footgun: a dev-server proxy targeting `http://localhost:PORT`\n * on macOS resolves `localhost` to `::1`, but a collector bound only to\n * `127.0.0.1` never receives the request — spans vanish with no error. If the\n * sibling family cannot bind, it is surfaced as a warning, never fatal.\n */\nexport function listenLoopbackDualStack(args: {\n primary: Server;\n port: number;\n host: string;\n attachSecondary: (server: Server) => void;\n}): LoopbackListeners {\n const { primary, port, host, attachSecondary } = args;\n let sibling: Server | undefined;\n\n const ready = new Promise<{ addresses: string[]; warnings: string[] }>(\n (resolve) => {\n const addresses: string[] = [];\n const warnings: string[] = [];\n const primaryHost = host === 'localhost' ? '127.0.0.1' : host;\n\n primary.listen(port, primaryHost, () => {\n const addr = primary.address();\n const resolvedPort =\n addr && typeof addr === 'object' ? addr.port : port;\n addresses.push(formatAddress(primaryHost, resolvedPort));\n\n if (!LOOPBACK.has(host)) {\n resolve({ addresses, warnings });\n return;\n }\n\n const siblingHost = primaryHost === '::1' ? '127.0.0.1' : '::1';\n const s = createServer();\n attachSecondary(s);\n\n const onError = (e: Error) => {\n s.close();\n warnings.push(\n `could not also bind ${formatAddress(siblingHost, resolvedPort)} (${e.message}); ` +\n `clients using the ${siblingHost === '::1' ? 'IPv6' : 'IPv4'} form of \"localhost\" may not connect.`,\n );\n resolve({ addresses, warnings });\n };\n s.once('error', onError);\n s.listen(resolvedPort, siblingHost, () => {\n s.off('error', onError);\n sibling = s;\n addresses.push(formatAddress(siblingHost, resolvedPort));\n resolve({ addresses, warnings });\n });\n });\n },\n );\n\n return {\n ready,\n closeSibling: () =>\n new Promise<void>((res) => {\n if (!sibling) return res();\n sibling.close(() => res());\n }),\n };\n}\n","import type { TerminalSpanEvent, TerminalSpanStream } from './span-stream';\n\ntype Subscriber = (event: TerminalSpanEvent) => void;\n\n/**\n * In-memory stream implementation for standalone CLI ingestion.\n */\nexport class CliTerminalSpanStream implements TerminalSpanStream {\n #subscribers = new Set<Subscriber>();\n\n onSpanEnd(callback: Subscriber): () => void {\n this.#subscribers.add(callback);\n return () => {\n this.#subscribers.delete(callback);\n };\n }\n\n push(event: TerminalSpanEvent): void {\n for (const subscriber of this.#subscribers) {\n subscriber(event);\n }\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { TerminalSpanEvent, SpanEvent, SpanLink } from './span-stream';\nimport type { TerminalLogEvent, LogLevel } from './lib/log-model';\n\nconst MAX_BODY_BYTES = 10 * 1024 * 1024; // 10 MB\n\ntype OtlpAnyValue = {\n stringValue?: string;\n boolValue?: boolean;\n intValue?: string | number;\n doubleValue?: number;\n bytesValue?: string;\n};\n\ntype OtlpKeyValue = {\n key: string;\n value?: OtlpAnyValue;\n};\n\ntype OtlpSpan = {\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n name?: string;\n kind?: number | string;\n startTimeUnixNano?: string;\n endTimeUnixNano?: string;\n attributes?: OtlpKeyValue[];\n status?: {\n code?: number | string;\n };\n events?: {\n timeUnixNano?: string;\n name?: string;\n attributes?: OtlpKeyValue[];\n }[];\n links?: {\n traceId?: string;\n spanId?: string;\n attributes?: OtlpKeyValue[];\n }[];\n};\n\nfunction anyValueToPrimitive(value: OtlpAnyValue | undefined): unknown {\n if (!value) return undefined;\n if (value.stringValue !== undefined) return value.stringValue;\n if (value.boolValue !== undefined) return value.boolValue;\n if (value.intValue !== undefined) {\n const num = Number(value.intValue);\n return Number.isNaN(num) ? value.intValue : num;\n }\n if (value.doubleValue !== undefined) return value.doubleValue;\n if (value.bytesValue !== undefined) return value.bytesValue;\n return undefined;\n}\n\nfunction attrsToRecord(\n attributes: OtlpKeyValue[] | undefined,\n): Record<string, unknown> {\n if (!attributes || attributes.length === 0) return {};\n const out: Record<string, unknown> = {};\n for (const attribute of attributes) {\n out[attribute.key] = anyValueToPrimitive(attribute.value);\n }\n return out;\n}\n\nfunction normalizeHexId(\n id: string | undefined,\n expectedHexLength: number,\n): string {\n if (!id) return ''.padStart(expectedHexLength, '0');\n const trimmed = id.trim();\n if (/^[a-fA-F0-9]+$/.test(trimmed)) {\n return trimmed\n .toLowerCase()\n .padStart(expectedHexLength, '0')\n .slice(-expectedHexLength);\n }\n try {\n const decoded = Buffer.from(trimmed, 'base64').toString('hex');\n if (decoded.length > 0) {\n return decoded\n .toLowerCase()\n .padStart(expectedHexLength, '0')\n .slice(-expectedHexLength);\n }\n } catch {\n // ignore and fall through\n }\n return ''.padStart(expectedHexLength, '0');\n}\n\nfunction toMs(unixNano: string | undefined): number {\n if (!unixNano) return Date.now();\n const parsed = Number(unixNano);\n if (Number.isNaN(parsed)) return Date.now();\n return parsed / 1_000_000;\n}\n\nfunction mapStatus(\n code: number | string | undefined,\n): 'OK' | 'ERROR' | 'UNSET' {\n const normalized = typeof code === 'string' ? code.toUpperCase() : code;\n if (\n normalized === 1 ||\n normalized === 'STATUS_CODE_OK' ||\n normalized === 'OK'\n )\n return 'OK';\n if (\n normalized === 2 ||\n normalized === 'STATUS_CODE_ERROR' ||\n normalized === 'ERROR'\n ) {\n return 'ERROR';\n }\n return 'UNSET';\n}\n\nfunction mapKind(kind: number | string | undefined): string {\n if (typeof kind === 'string') return kind.toUpperCase();\n switch (kind) {\n case 1: {\n return 'INTERNAL';\n }\n case 2: {\n return 'SERVER';\n }\n case 3: {\n return 'CLIENT';\n }\n case 4: {\n return 'PRODUCER';\n }\n case 5: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n}\n\nfunction* extractSpans(\n payload: unknown,\n): Generator<{ span: OtlpSpan; resourceAttrs: Record<string, unknown> }> {\n if (!payload || typeof payload !== 'object') return;\n const resourceSpans = (payload as { resourceSpans?: unknown[] })\n .resourceSpans;\n if (!Array.isArray(resourceSpans)) return;\n for (const resourceSpan of resourceSpans) {\n if (!resourceSpan || typeof resourceSpan !== 'object') continue;\n const resource = (resourceSpan as { resource?: { attributes?: OtlpKeyValue[] } }).resource;\n const resourceAttrs = attrsToRecord(resource?.attributes);\n const scopeSpans = (resourceSpan as { scopeSpans?: unknown[] }).scopeSpans;\n if (!Array.isArray(scopeSpans)) continue;\n for (const scopeSpan of scopeSpans) {\n if (!scopeSpan || typeof scopeSpan !== 'object') continue;\n const spans = (scopeSpan as { spans?: unknown[] }).spans;\n if (!Array.isArray(spans)) continue;\n for (const span of spans) {\n if (span && typeof span === 'object') {\n yield { span: span as OtlpSpan, resourceAttrs };\n }\n }\n }\n }\n}\n\nexport function otlpSpanToTerminalEvent(\n span: OtlpSpan,\n resourceAttrs: Record<string, unknown> = {},\n): TerminalSpanEvent {\n const startTime = toMs(span.startTimeUnixNano);\n const endTime = toMs(span.endTimeUnixNano);\n const spanAttrs = attrsToRecord(span.attributes);\n // Merge resource attributes (e.g. service.name) under span attributes,\n // with span-level attributes taking precedence\n const mergedAttrs: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(resourceAttrs)) {\n mergedAttrs[k] = v;\n }\n for (const [k, v] of Object.entries(spanAttrs)) {\n mergedAttrs[k] = v;\n }\n const parsedEvents: SpanEvent[] | undefined = span.events?.length\n ? span.events.map((e) => ({\n name: e.name || '',\n timeMs: toMs(e.timeUnixNano),\n attributes: attrsToRecord(e.attributes),\n }))\n : undefined;\n\n const parsedLinks: SpanLink[] | undefined = span.links?.length\n ? span.links.map((l) => ({\n traceId: normalizeHexId(l.traceId, 32),\n spanId: normalizeHexId(l.spanId, 16),\n attributes: attrsToRecord(l.attributes),\n }))\n : undefined;\n\n return {\n name: span.name || 'unnamed',\n spanId: normalizeHexId(span.spanId, 16),\n traceId: normalizeHexId(span.traceId, 32),\n parentSpanId: span.parentSpanId\n ? normalizeHexId(span.parentSpanId, 16)\n : undefined,\n startTime,\n endTime,\n durationMs: Math.max(0, endTime - startTime),\n status: mapStatus(span.status?.code),\n kind: mapKind(span.kind),\n attributes: mergedAttrs,\n ...(parsedEvents ? { events: parsedEvents } : {}),\n ...(parsedLinks ? { links: parsedLinks } : {}),\n };\n}\n\nexport async function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n let totalLength = 0;\n for await (const chunk of req) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n totalLength += buf.length;\n if (totalLength > MAX_BODY_BYTES) {\n throw new Error(`Body exceeds ${MAX_BODY_BYTES} byte limit`);\n }\n chunks.push(buf);\n }\n const raw = Buffer.concat(chunks).toString('utf8');\n if (!raw) return {};\n return JSON.parse(raw);\n}\n\nexport function sendJson(\n res: ServerResponse,\n status: number,\n data: Record<string, unknown>,\n): void {\n res.statusCode = status;\n res.setHeader('content-type', 'application/json');\n res.end(JSON.stringify(data));\n}\n\nexport function parseOtlpEvents(payload: unknown): TerminalSpanEvent[] {\n const events: TerminalSpanEvent[] = [];\n for (const { span, resourceAttrs } of extractSpans(payload)) {\n events.push(otlpSpanToTerminalEvent(span, resourceAttrs));\n }\n return events;\n}\n\n// --- OTLP Log parsing ---\n\ntype OtlpLogRecord = {\n timeUnixNano?: string;\n observedTimeUnixNano?: string;\n severityNumber?: number;\n severityText?: string;\n body?: OtlpAnyValue;\n attributes?: OtlpKeyValue[];\n traceId?: string;\n spanId?: string;\n};\n\nfunction mapSeverityToLevel(\n severityNumber?: number,\n severityText?: string,\n): LogLevel {\n if (severityText) {\n const lower = severityText.toLowerCase();\n if (lower.startsWith('debug') || lower === 'trace') return 'debug';\n if (lower.startsWith('info')) return 'info';\n if (lower.startsWith('warn')) return 'warn';\n if (lower.startsWith('error') || lower.startsWith('fatal')) return 'error';\n }\n if (severityNumber !== undefined) {\n if (severityNumber <= 4) return 'debug';\n if (severityNumber <= 8) return 'debug';\n if (severityNumber <= 12) return 'info';\n if (severityNumber <= 16) return 'warn';\n return 'error';\n }\n return 'info';\n}\n\nfunction bodyToMessage(body: OtlpAnyValue | undefined): string {\n if (!body) return '';\n const value = anyValueToPrimitive(body);\n return value === undefined ? '' : String(value);\n}\n\nfunction* extractLogRecords(payload: unknown): Generator<OtlpLogRecord> {\n if (!payload || typeof payload !== 'object') return;\n const resourceLogs = (payload as { resourceLogs?: unknown[] }).resourceLogs;\n if (!Array.isArray(resourceLogs)) return;\n for (const resourceLog of resourceLogs) {\n if (!resourceLog || typeof resourceLog !== 'object') continue;\n const scopeLogs = (resourceLog as { scopeLogs?: unknown[] }).scopeLogs;\n if (!Array.isArray(scopeLogs)) continue;\n for (const scopeLog of scopeLogs) {\n if (!scopeLog || typeof scopeLog !== 'object') continue;\n const logRecords = (scopeLog as { logRecords?: unknown[] }).logRecords;\n if (!Array.isArray(logRecords)) continue;\n for (const record of logRecords) {\n if (record && typeof record === 'object') {\n yield record as OtlpLogRecord;\n }\n }\n }\n }\n}\n\nexport function parseOtlpLogEvents(payload: unknown): TerminalLogEvent[] {\n const events: TerminalLogEvent[] = [];\n for (const record of extractLogRecords(payload)) {\n const time = toMs(record.timeUnixNano || record.observedTimeUnixNano);\n events.push({\n time,\n level: mapSeverityToLevel(record.severityNumber, record.severityText),\n message: bodyToMessage(record.body),\n traceId: record.traceId ? normalizeHexId(record.traceId, 32) : undefined,\n spanId: record.spanId ? normalizeHexId(record.spanId, 16) : undefined,\n attributes: attrsToRecord(record.attributes),\n });\n }\n return events;\n}\n\n// --- OTLP Metrics parsing (accept and count) ---\n\nexport function countOtlpMetrics(payload: unknown): number {\n if (!payload || typeof payload !== 'object') return 0;\n let count = 0;\n const resourceMetrics = (payload as { resourceMetrics?: unknown[] })\n .resourceMetrics;\n if (!Array.isArray(resourceMetrics)) return 0;\n for (const resourceMetric of resourceMetrics) {\n if (!resourceMetric || typeof resourceMetric !== 'object') continue;\n const scopeMetrics = (resourceMetric as { scopeMetrics?: unknown[] })\n .scopeMetrics;\n if (!Array.isArray(scopeMetrics)) continue;\n for (const scopeMetric of scopeMetrics) {\n if (!scopeMetric || typeof scopeMetric !== 'object') continue;\n const metrics = (scopeMetric as { metrics?: unknown[] }).metrics;\n if (Array.isArray(metrics)) {\n count += metrics.length;\n }\n }\n }\n return count;\n}\n","#!/usr/bin/env node\nimport { readFileSync } from 'node:fs';\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport path from 'node:path';\nimport { renderTerminal } from './index';\nimport { listenLoopbackDualStack } from './listen';\nimport { getTerminalLogStream } from './log-stream';\nimport { CliTerminalSpanStream } from './cli-stream';\nimport {\n countOtlpMetrics,\n parseOtlpEvents,\n parseOtlpLogEvents,\n readJsonBody,\n sendJson,\n} from './otlp-http-json';\n\nimport type { AIConfig, AIProviderType } from './ai/types';\n\ntype CliOptions = {\n port: number;\n host: string;\n title?: string;\n ai: Partial<AIConfig>;\n};\n\nfunction printHelp(): void {\n process.stdout.write(\n String.raw`autotel-terminal - Standalone OTLP receiver with terminal dashboard\n\nUsage: autotel-terminal [options]\n\nOptions:\n -p, --port <port> Port to listen on (default: 4319, env: AUTOTEL_TERMINAL_PORT)\n -H, --host <host> Host to bind to (default: 127.0.0.1, env: AUTOTEL_TERMINAL_HOST)\n -t, --title <title> Dashboard title (env: AUTOTEL_TERMINAL_TITLE)\n -h, --help Show this help message\n -v, --version Show version number\n\nAI Options:\n --ai-provider <provider> AI provider: ollama, openai, openai-compatible (env: AI_PROVIDER)\n --ai-model <model> AI model name (env: AI_MODEL)\n --ai-api-key <key> API key for cloud providers (env: AI_API_KEY)\n --ai-base-url <url> Custom AI endpoint URL (env: AI_BASE_URL)\n\n Auto-detection: if Ollama is running locally, it is used automatically.\n If OPENAI_API_KEY is set, OpenAI is used. Press 'a' in the dashboard to toggle AI.\n\nEndpoints:\n POST /v1/traces Receive OTLP JSON trace data\n POST /v1/logs Receive OTLP JSON log data\n POST /v1/metrics Receive OTLP JSON metric data (accepted and counted)\n GET /healthz Health check\n\nExamples:\n npx autotel-terminal\n npx autotel-terminal --ai-provider ollama --ai-model granite4\n AI_API_KEY=sk-... npx autotel-terminal --ai-provider openai --ai-model gpt-4o\n` + '\\n',\n );\n}\n\nfunction printVersion(): void {\n try {\n const dir = import.meta.dirname ?? new URL('.', import.meta.url).pathname;\n const pkgPath = path.resolve(dir, '..', 'package.json');\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n process.stdout.write(`${pkg.version}\\n`);\n } catch {\n process.stdout.write('unknown\\n');\n }\n}\n\nfunction parseArgs(argv: string[]): CliOptions | null {\n const options: CliOptions = {\n port: Number(process.env.AUTOTEL_TERMINAL_PORT || 4319),\n host: process.env.AUTOTEL_TERMINAL_HOST || '127.0.0.1',\n title: process.env.AUTOTEL_TERMINAL_TITLE,\n ai: {},\n };\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n const next = argv[i + 1];\n\n if (arg === '--help' || arg === '-h') {\n printHelp();\n return null;\n }\n if (arg === '--version' || arg === '-v') {\n printVersion();\n return null;\n }\n if ((arg === '--port' || arg === '-p') && next) {\n options.port = Number(next);\n i++;\n continue;\n }\n if ((arg === '--host' || arg === '-H') && next) {\n options.host = next;\n i++;\n continue;\n }\n if ((arg === '--title' || arg === '-t') && next) {\n options.title = next;\n i++;\n continue;\n }\n if (arg === '--ai-provider' && next) {\n options.ai.provider = next as AIProviderType;\n i++;\n continue;\n }\n if (arg === '--ai-model' && next) {\n options.ai.model = next;\n i++;\n continue;\n }\n if (arg === '--ai-api-key' && next) {\n options.ai.apiKey = next;\n i++;\n continue;\n }\n if (arg === '--ai-base-url' && next) {\n options.ai.baseUrl = next;\n i++;\n }\n }\n\n return options;\n}\n\nconst OTLP_ROUTES = new Set(['/v1/traces', '/v1/logs', '/v1/metrics']);\n\nasync function main(): Promise<void> {\n const options = parseArgs(process.argv.slice(2));\n if (!options) {\n process.exit(0);\n }\n\n const spanStream = new CliTerminalSpanStream();\n const logStream = getTerminalLogStream();\n\n renderTerminal(\n {\n title:\n options.title || `Autotel Terminal (${options.host}:${options.port})`,\n ai: options.ai,\n },\n spanStream,\n );\n\n const requestHandler = async (\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> => {\n if (req.method === 'GET' && req.url === '/healthz') {\n sendJson(res, 200, { ok: true });\n return;\n }\n\n if (req.method !== 'POST' || !OTLP_ROUTES.has(req.url ?? '')) {\n sendJson(res, 404, { error: 'Not found' });\n return;\n }\n\n try {\n const payload = await readJsonBody(req);\n\n if (req.url === '/v1/traces') {\n const events = parseOtlpEvents(payload);\n for (const event of events) {\n spanStream.push(event);\n }\n sendJson(res, 200, { acceptedSpans: events.length });\n return;\n }\n\n if (req.url === '/v1/logs') {\n const events = parseOtlpLogEvents(payload);\n for (const event of events) {\n logStream.emit(event);\n }\n sendJson(res, 200, { acceptedLogs: events.length });\n return;\n }\n\n if (req.url === '/v1/metrics') {\n const count = countOtlpMetrics(payload);\n sendJson(res, 200, { acceptedMetrics: count });\n return;\n }\n } catch (error) {\n sendJson(res, 400, {\n error: 'Invalid OTLP JSON payload',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n const server = createServer(requestHandler);\n\n // Bind both loopback families when host is loopback, so a `localhost` proxy\n // reaches us whether it resolves to 127.0.0.1 or ::1 (the macOS IPv6 footgun).\n const listeners = listenLoopbackDualStack({\n primary: server,\n port: options.port,\n host: options.host,\n attachSecondary: (s) => s.on('request', requestHandler),\n });\n\n const { addresses, warnings } = await listeners.ready;\n process.stdout.write(\n `[autotel-terminal] listening on ${addresses.join(' + ')}\\n`,\n );\n process.stdout.write(\n '[autotel-terminal] endpoints: /v1/traces, /v1/logs, /v1/metrics\\n',\n );\n process.stdout.write(\n '[autotel-terminal] set OTEL_EXPORTER_OTLP_PROTOCOL=http/json and OTEL_EXPORTER_OTLP_ENDPOINT to this host/port\\n',\n );\n for (const w of warnings) {\n process.stdout.write(`[autotel-terminal] ⚠ ${w}\\n`);\n }\n\n const shutdown = () => {\n Promise.all([\n new Promise<void>((r) => server.close(() => r())),\n listeners.closeSibling(),\n ]).then(() => process.exit(0));\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nmain().catch((error) => {\n process.stderr.write(\n `[autotel-terminal] failed to start: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exit(1);\n});\n"]}