autotel-devtools 3.0.1 → 5.0.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/error-aggregator.ts","../../src/server/telemetry-limits.ts","../../src/server/server.ts","../../src/server/exporter.ts","../../src/server/resource-utils.ts","../../src/server/log-exporter.ts","../../src/server/remote-exporter.ts","../../src/server/otlp.ts","../../src/server/http.ts"],"names":["resolve","createServer"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error Aggregator\n *\n * Groups similar errors together based on stack trace fingerprinting.\n * Tracks error frequency, first/last occurrence, and affected traces.\n *\n * @example\n * ```typescript\n * const aggregator = new ErrorAggregator({ maxGroups: 100 });\n *\n * // Add errors from spans\n * aggregator.addError({\n * traceId: '123',\n * spanId: '456',\n * spanName: 'api.createUser',\n * service: 'user-service',\n * timestamp: Date.now(),\n * error: {\n * type: 'ValidationError',\n * message: 'Invalid email format',\n * stackTrace: 'Error: Invalid email...'\n * }\n * });\n *\n * // Get aggregated error groups\n * const groups = aggregator.getErrorGroups();\n * ```\n */\n\nimport type { ErrorGroup, ErrorOccurrence, SpanData, TraceData } from './types';\n\nexport interface ErrorAggregatorOptions {\n /**\n * Maximum number of error groups to track (default: 100)\n * Oldest groups are evicted when limit is reached\n */\n maxGroups?: number;\n\n /**\n * Maximum number of affected traces to keep per group (default: 10)\n */\n maxAffectedTraces?: number;\n\n /**\n * Maximum number of affected span names to keep per group (default: 5)\n */\n maxAffectedSpans?: number;\n\n /**\n * Number of stack frames to use for fingerprinting (default: 5)\n */\n stackFramesForFingerprint?: number;\n}\n\nexport class ErrorAggregator {\n private errorGroups: Map<string, ErrorGroup> = new Map();\n private options: Required<ErrorAggregatorOptions>;\n\n constructor(options: ErrorAggregatorOptions = {}) {\n this.options = {\n maxGroups: options.maxGroups ?? 100,\n maxAffectedTraces: options.maxAffectedTraces ?? 10,\n maxAffectedSpans: options.maxAffectedSpans ?? 5,\n stackFramesForFingerprint: options.stackFramesForFingerprint ?? 5,\n };\n }\n\n /**\n * Add an error occurrence to the aggregator\n */\n addError(occurrence: ErrorOccurrence): ErrorGroup {\n const fingerprint = this.generateFingerprint(occurrence);\n const existing = this.errorGroups.get(fingerprint);\n\n if (existing) {\n // Update existing group\n existing.count++;\n existing.lastSeen = occurrence.timestamp;\n\n // Add trace ID if not already present (keep last N)\n if (!existing.affectedTraces.includes(occurrence.traceId)) {\n existing.affectedTraces.push(occurrence.traceId);\n if (existing.affectedTraces.length > this.options.maxAffectedTraces) {\n existing.affectedTraces.shift();\n }\n }\n\n // Add span name if not already present\n if (!existing.affectedSpans.includes(occurrence.spanName)) {\n existing.affectedSpans.push(occurrence.spanName);\n if (existing.affectedSpans.length > this.options.maxAffectedSpans) {\n existing.affectedSpans.shift();\n }\n }\n\n return existing;\n }\n\n // Create new group\n const newGroup: ErrorGroup = {\n fingerprint,\n type: occurrence.error.type,\n message: occurrence.error.message,\n stackTrace: this.normalizeStackTrace(occurrence.error.stackTrace),\n count: 1,\n firstSeen: occurrence.timestamp,\n lastSeen: occurrence.timestamp,\n affectedTraces: [occurrence.traceId],\n affectedSpans: [occurrence.spanName],\n service: occurrence.service,\n attributes: occurrence.attributes,\n };\n\n // Evict oldest group if at capacity\n if (this.errorGroups.size >= this.options.maxGroups) {\n this.evictOldestGroup();\n }\n\n this.errorGroups.set(fingerprint, newGroup);\n return newGroup;\n }\n\n /**\n * Extract errors from a trace and add them to the aggregator\n */\n addErrorsFromTrace(trace: TraceData): ErrorGroup[] {\n const addedGroups: ErrorGroup[] = [];\n\n for (const span of trace.spans) {\n if (span.status.code === 'ERROR') {\n const occurrence = this.extractErrorFromSpan(span, trace);\n if (occurrence) {\n const group = this.addError(occurrence);\n addedGroups.push(group);\n }\n }\n }\n\n return addedGroups;\n }\n\n /**\n * Extract error occurrence from a span\n */\n private extractErrorFromSpan(\n span: SpanData,\n trace: TraceData,\n ): ErrorOccurrence | null {\n // Try to get error info from span attributes or events\n const exceptionEvent = span.events?.find((e) => e.name === 'exception');\n const errorType =\n (span.attributes['exception.type'] as string) ||\n (span.attributes['error.type'] as string) ||\n (exceptionEvent?.attributes?.['exception.type'] as string) ||\n 'Error';\n\n const errorMessage =\n span.status.message ||\n (span.attributes['exception.message'] as string) ||\n (span.attributes['error.message'] as string) ||\n 'Unknown error';\n\n const stackTrace =\n (span.attributes['exception.stacktrace'] as string) ||\n (span.attributes['exception.stack'] as string) ||\n this.extractStackFromEvents(span);\n\n return {\n traceId: trace.traceId,\n spanId: span.spanId,\n spanName: span.name,\n service: trace.service,\n timestamp: span.endTime,\n error: {\n type: errorType,\n message: errorMessage,\n stackTrace,\n },\n attributes: this.extractRelevantAttributes(span.attributes),\n };\n }\n\n /**\n * Extract stack trace from span events (exception events)\n */\n private extractStackFromEvents(span: SpanData): string | undefined {\n if (!span.events) return undefined;\n\n const exceptionEvent = span.events.find((e) => e.name === 'exception');\n if (exceptionEvent?.attributes) {\n return (\n (exceptionEvent.attributes['exception.stacktrace'] as string) ||\n (exceptionEvent.attributes['exception.stack'] as string)\n );\n }\n\n return undefined;\n }\n\n /**\n * Extract relevant attributes for error context\n */\n private extractRelevantAttributes(\n attributes: Record<string, unknown>,\n ): Record<string, unknown> {\n const relevant: Record<string, unknown> = {};\n const keepKeys = [\n 'http.method',\n 'http.url',\n 'http.route',\n 'http.status_code',\n 'db.system',\n 'db.operation',\n 'rpc.method',\n 'rpc.service',\n 'code.function',\n 'code.filepath',\n 'user.id',\n 'operation.name',\n ];\n\n for (const key of keepKeys) {\n if (key in attributes) {\n relevant[key] = attributes[key];\n }\n }\n\n return relevant;\n }\n\n /**\n * Generate a fingerprint for error grouping\n *\n * Uses error type + first N stack frames (normalized)\n */\n private generateFingerprint(occurrence: ErrorOccurrence): string {\n const parts: string[] = [occurrence.error.type];\n\n if (occurrence.error.stackTrace) {\n const frames = this.extractStackFrames(\n occurrence.error.stackTrace,\n this.options.stackFramesForFingerprint,\n );\n parts.push(...frames);\n } else {\n // Fallback to error message if no stack trace\n parts.push(this.normalizeMessage(occurrence.error.message));\n }\n\n // Simple hash function\n return this.simpleHash(parts.join('|'));\n }\n\n /**\n * Extract and normalize stack frames from a stack trace\n */\n private extractStackFrames(stackTrace: string, count: number): string[] {\n const lines = stackTrace.split('\\n');\n const frames: string[] = [];\n\n for (const line of lines) {\n if (frames.length >= count) break;\n\n // Match common stack trace patterns\n const trimmed = line.trim();\n\n // Node.js style: \"at functionName (file:line:col)\"\n const nodeMatch = trimmed.match(/^at\\s+(.+?)\\s+\\((.+?):(\\d+):\\d+\\)$/);\n if (nodeMatch) {\n frames.push(`${nodeMatch[1]}@${this.normalizeFilePath(nodeMatch[2])}`);\n continue;\n }\n\n // Anonymous function style: \"at file:line:col\"\n const anonMatch = trimmed.match(/^at\\s+(.+?):(\\d+):\\d+$/);\n if (anonMatch) {\n frames.push(`anonymous@${this.normalizeFilePath(anonMatch[1])}`);\n continue;\n }\n\n // Browser style: \"functionName@file:line:col\"\n const browserMatch = trimmed.match(/^(.+?)@(.+?):(\\d+):\\d+$/);\n if (browserMatch) {\n frames.push(\n `${browserMatch[1]}@${this.normalizeFilePath(browserMatch[2])}`,\n );\n continue;\n }\n }\n\n return frames;\n }\n\n /**\n * Normalize file path by removing absolute path prefixes and node_modules paths\n */\n private normalizeFilePath(filePath: string): string {\n // Remove node_modules paths (keep package name)\n const nodeModulesMatch = filePath.match(\n /node_modules\\/(@[^/]+\\/[^/]+|[^/]+)/,\n );\n if (nodeModulesMatch) {\n return `[npm]/${nodeModulesMatch[1]}`;\n }\n\n // Remove common absolute path prefixes\n return filePath\n .replace(/^.*?\\/src\\//, 'src/')\n .replace(/^.*?\\/dist\\//, 'dist/')\n .replace(/^.*?\\/lib\\//, 'lib/')\n .replace(/^file:\\/\\//, '');\n }\n\n /**\n * Normalize error message by removing dynamic parts\n */\n private normalizeMessage(message: string): string {\n return (\n message\n // Remove UUIDs\n .replaceAll(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '[UUID]',\n )\n // Remove hex IDs\n .replaceAll(/\\b[0-9a-f]{16,}\\b/gi, '[ID]')\n // Remove numbers\n .replaceAll(/\\b\\d+\\b/g, '[N]')\n // Remove quoted strings\n .replaceAll(/\"[^\"]*\"/g, '\"[STR]\"')\n .replaceAll(/'[^']*'/g, \"'[STR]'\")\n // Truncate long messages\n .slice(0, 200)\n );\n }\n\n /**\n * Normalize stack trace for display\n */\n private normalizeStackTrace(stackTrace?: string): string | undefined {\n if (!stackTrace) return undefined;\n\n const lines = stackTrace.split('\\n').slice(0, 10); // Keep first 10 lines\n return lines.join('\\n');\n }\n\n /**\n * Simple hash function for fingerprinting\n */\n private simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n /**\n * Evict the oldest error group\n */\n private evictOldestGroup(): void {\n let oldest: { fingerprint: string; lastSeen: number } | null = null;\n\n for (const [fingerprint, group] of this.errorGroups) {\n if (!oldest || group.lastSeen < oldest.lastSeen) {\n oldest = { fingerprint, lastSeen: group.lastSeen };\n }\n }\n\n if (oldest) {\n this.errorGroups.delete(oldest.fingerprint);\n }\n }\n\n /**\n * Get all error groups, sorted by most recent\n */\n getErrorGroups(): ErrorGroup[] {\n return [...this.errorGroups.values()].sort(\n (a, b) => b.lastSeen - a.lastSeen,\n );\n }\n\n /**\n * Get error groups sorted by count (most frequent first)\n */\n getErrorGroupsByFrequency(): ErrorGroup[] {\n return [...this.errorGroups.values()].sort(\n (a, b) => b.count - a.count,\n );\n }\n\n /**\n * Get a specific error group by fingerprint\n */\n getErrorGroup(fingerprint: string): ErrorGroup | undefined {\n return this.errorGroups.get(fingerprint);\n }\n\n /**\n * Get error groups for a specific service\n */\n getErrorGroupsByService(service: string): ErrorGroup[] {\n return this.getErrorGroups().filter((g) => g.service === service);\n }\n\n /**\n * Get total error count across all groups\n */\n getTotalErrorCount(): number {\n let total = 0;\n for (const group of this.errorGroups.values()) {\n total += group.count;\n }\n return total;\n }\n\n /**\n * Get error statistics\n */\n getStats(): {\n totalGroups: number;\n totalErrors: number;\n recentErrors: number;\n topErrorTypes: Array<{ type: string; count: number }>;\n } {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n let recentErrors = 0;\n const typeCount = new Map<string, number>();\n\n for (const group of this.errorGroups.values()) {\n if (group.lastSeen > oneHourAgo) {\n recentErrors += group.count;\n }\n typeCount.set(group.type, (typeCount.get(group.type) || 0) + group.count);\n }\n\n const topErrorTypes = [...typeCount.entries()]\n .map(([type, count]) => ({ type, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n totalGroups: this.errorGroups.size,\n totalErrors: this.getTotalErrorCount(),\n recentErrors,\n topErrorTypes,\n };\n }\n\n /**\n * Clear all error groups\n */\n clear(): void {\n this.errorGroups.clear();\n }\n\n /**\n * Clear old error groups (not seen in given time window)\n */\n clearOlderThan(maxAgeMs: number): number {\n const cutoff = Date.now() - maxAgeMs;\n let cleared = 0;\n\n for (const [fingerprint, group] of this.errorGroups) {\n if (group.lastSeen < cutoff) {\n this.errorGroups.delete(fingerprint);\n cleared++;\n }\n }\n\n return cleared;\n }\n}\n","import type { DevtoolsData } from './types'\n\nexport interface TelemetryLimits {\n maxTraceCount: number\n maxLogCount: number\n maxMetricCount: number\n}\n\nexport interface ResolveTelemetryLimitsArgs {\n maxHistory?: number\n maxTraceCount?: number\n maxLogCount?: number\n maxMetricCount?: number\n env?: NodeJS.ProcessEnv\n}\n\nconst defaultLimit = 100\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined\n const parsed = Number.parseInt(value, 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined\n}\n\nexport function resolveTelemetryLimits(\n args: ResolveTelemetryLimitsArgs = {},\n): TelemetryLimits {\n const env = args.env ?? process.env\n const fallback = args.maxHistory ?? defaultLimit\n\n return {\n maxTraceCount:\n args.maxTraceCount ??\n parseLimit(env.AUTOTEL_MAX_TRACE_COUNT) ??\n fallback,\n maxLogCount:\n args.maxLogCount ??\n parseLimit(env.AUTOTEL_MAX_LOG_COUNT) ??\n fallback,\n maxMetricCount:\n args.maxMetricCount ??\n parseLimit(env.AUTOTEL_MAX_METRIC_COUNT) ??\n fallback,\n }\n}\n\nexport function appendWithLimit<T>(items: T[], item: T, limit: number): T[] {\n if (limit <= 0) return []\n const next = [...items, item]\n return next.length > limit ? next.slice(next.length - limit) : next\n}\n\nexport function appendManyWithLimit<T>(\n items: T[],\n incoming: T[],\n limit: number,\n): T[] {\n if (limit <= 0 || incoming.length === 0) return limit <= 0 ? [] : items\n const next = [...items, ...incoming]\n return next.length > limit ? next.slice(next.length - limit) : next\n}\n\nexport function applyTelemetryLimits(\n data: DevtoolsData,\n limits: TelemetryLimits,\n): DevtoolsData {\n return {\n ...data,\n traces: data.traces.slice(-limits.maxTraceCount),\n logs: data.logs.slice(-limits.maxLogCount),\n metrics: data.metrics.slice(-limits.maxMetricCount),\n }\n}\n","// src/server/server.ts\nimport { WebSocketServer, WebSocket } from 'ws'\nimport type { Server as HTTPServer } from 'node:http'\nimport { createServer } from 'node:http'\nimport { ErrorAggregator } from './error-aggregator'\nimport type {\n TraceData,\n LogData,\n MetricData,\n DevtoolsData,\n} from './types'\nimport {\n appendManyWithLimit,\n appendWithLimit,\n resolveTelemetryLimits,\n type TelemetryLimits,\n} from './telemetry-limits'\n\nexport interface DevtoolsServerOptions {\n port?: number\n server?: HTTPServer\n path?: string\n verbose?: boolean\n maxHistory?: number\n maxTraceCount?: number\n maxLogCount?: number\n maxMetricCount?: number\n}\n\nexport class DevtoolsServer {\n private wss: WebSocketServer\n private clients = new Set<WebSocket>()\n private httpServer: HTTPServer\n private traces: TraceData[] = []\n private logs: LogData[] = []\n private metrics: MetricData[] = []\n private errorAggregator = new ErrorAggregator()\n private limits: TelemetryLimits\n private verbose: boolean\n private _port: number\n\n constructor(options: DevtoolsServerOptions = {}) {\n this.limits = resolveTelemetryLimits(options)\n this.verbose = options.verbose ?? false\n this._port = options.port ?? 4318\n\n this.httpServer = options.server ?? createServer()\n this.wss = new WebSocketServer({ server: this.httpServer, path: options.path ?? '/ws' })\n\n this.wss.on('connection', (ws) => {\n this.clients.add(ws)\n this.log(`Client connected (${this.clients.size} total)`)\n\n // Send history to late-connecting clients\n const data = this.getCurrentData()\n if (data.traces.length > 0 || data.logs.length > 0 || data.errors.length > 0) {\n ws.send(JSON.stringify(data))\n }\n\n ws.on('close', () => {\n this.clients.delete(ws)\n this.log(`Client disconnected (${this.clients.size} total)`)\n })\n })\n\n // Only start listening if no external server was provided\n if (!options.server) {\n this.httpServer.listen(this._port, () => {\n const addr = this.httpServer.address()\n if (addr && typeof addr === 'object') this._port = addr.port\n this.log(`WebSocket server listening on port ${this._port}`)\n })\n }\n }\n\n get port(): number {\n const addr = this.httpServer.address()\n if (addr && typeof addr === 'object') return addr.port\n return this._port\n }\n\n get clientCount(): number {\n return this.clients.size\n }\n\n addTrace(trace: TraceData): void {\n // Merge if trace already exists (out-of-order spans)\n const existing = this.traces.find(t => t.traceId === trace.traceId)\n if (existing) {\n const existingSpanIds = new Set(existing.spans.map(s => s.spanId))\n for (const span of trace.spans) {\n if (!existingSpanIds.has(span.spanId)) {\n existing.spans.push(span)\n }\n }\n existing.startTime = Math.min(existing.startTime, trace.startTime)\n existing.endTime = Math.max(existing.endTime, trace.endTime)\n existing.duration = existing.endTime - existing.startTime\n if (trace.status === 'ERROR') existing.status = 'ERROR'\n } else {\n this.traces = appendWithLimit(\n this.traces,\n trace,\n this.limits.maxTraceCount,\n )\n }\n\n this.errorAggregator.addErrorsFromTrace(trace)\n this.broadcast({ traces: [trace], metrics: [], logs: [], errors: this.errorAggregator.getErrorGroups() })\n }\n\n addTraces(traces: TraceData[]): void {\n for (const trace of traces) this.addTrace(trace)\n }\n\n addLog(log: LogData): void {\n this.logs = appendWithLimit(this.logs, log, this.limits.maxLogCount)\n this.broadcast({ traces: [], metrics: [], logs: [log], errors: [] })\n }\n\n addLogs(logs: LogData[]): void {\n this.logs = appendManyWithLimit(this.logs, logs, this.limits.maxLogCount)\n this.broadcast({ traces: [], metrics: [], logs, errors: [] })\n }\n\n addMetric(metric: MetricData): void {\n this.metrics = appendWithLimit(\n this.metrics,\n metric,\n this.limits.maxMetricCount,\n )\n this.broadcast({ traces: [], metrics: [metric], logs: [], errors: [] })\n }\n\n getCurrentData(): DevtoolsData {\n return {\n traces: this.traces,\n metrics: this.metrics,\n logs: this.logs,\n errors: this.errorAggregator.getErrorGroups(),\n }\n }\n\n clearData(): void {\n this.traces = []\n this.logs = []\n this.metrics = []\n this.errorAggregator.clear()\n }\n\n private broadcast(data: DevtoolsData): void {\n const msg = JSON.stringify(data)\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(msg)\n }\n }\n }\n\n private log(message: string): void {\n if (this.verbose) console.log(`[autotel-devtools] ${message}`)\n }\n\n async close(): Promise<void> {\n for (const client of this.clients) client.close()\n this.clients.clear()\n this.wss.close()\n await new Promise<void>((resolve) => this.httpServer.close(() => resolve()))\n }\n}\n","/**\n * OpenTelemetry SpanExporter that streams spans to DevtoolsServer\n */\n\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult, ExportResultCode } from '@opentelemetry/core';\nimport type { DevtoolsServer } from './server';\nimport type { TraceData, SpanData } from './types';\n\nexport class DevtoolsSpanExporter implements SpanExporter {\n private server: DevtoolsServer;\n private serviceName: string;\n\n constructor(server: DevtoolsServer, serviceName: string = 'unknown-service') {\n this.server = server;\n this.serviceName = serviceName;\n }\n\n /**\n * Export spans to the WebSocket server\n */\n async export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): Promise<void> {\n // Immediately call the callback to unblock the span processor\n // Then process the spans asynchronously\n resultCallback({ code: 0 as ExportResultCode });\n\n // Process spans asynchronously without blocking\n Promise.resolve().then(() => {\n try {\n console.log(`[Autotel Exporter] Exporting ${spans.length} span(s)`);\n\n // Group spans by trace ID\n const traceMap = new Map<string, ReadableSpan[]>();\n\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n if (!traceMap.has(traceId)) {\n traceMap.set(traceId, []);\n }\n traceMap.get(traceId)!.push(span);\n }\n\n // Convert each trace and send to server\n for (const [traceId, traceSpans] of traceMap) {\n const trace = this.convertToTraceData(traceId, traceSpans);\n console.log(\n `[Autotel Exporter] Adding trace ${traceId.slice(0, 16)} with ${traceSpans.length} spans`,\n );\n this.server.addTrace(trace);\n }\n } catch (error) {\n console.error('[Autotel Exporter] Export error:', error);\n }\n });\n }\n\n /**\n * Shutdown the exporter\n */\n async shutdown(): Promise<void> {\n // Nothing to clean up\n }\n\n /**\n * Force flush any buffered spans\n */\n async forceFlush(): Promise<void> {\n // Nothing to flush\n }\n\n /**\n * Convert OpenTelemetry spans to TraceData\n */\n private convertToTraceData(\n traceId: string,\n spans: ReadableSpan[],\n ): TraceData {\n // Convert spans\n const spanData: SpanData[] = spans.map((span) => this.convertSpan(span));\n\n // Find root span (no parent)\n const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];\n\n // Sort spans by start time\n spanData.sort((a, b) => a.startTime - b.startTime);\n\n const startTime = Math.min(...spanData.map((s) => s.startTime));\n const endTime = Math.max(...spanData.map((s) => s.endTime));\n\n // Determine overall status (ERROR if any span errored)\n const hasError = spanData.some((s) => s.status.code === 'ERROR');\n const status = hasError ? 'ERROR' : 'OK';\n\n return {\n traceId,\n correlationId: traceId.slice(0, 16), // First 16 chars\n rootSpan,\n spans: spanData,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: status as 'OK' | 'ERROR' | 'UNSET',\n service: this.serviceName,\n };\n }\n\n /**\n * Convert OpenTelemetry span to SpanData\n */\n private convertSpan(span: ReadableSpan): SpanData {\n const spanContext = span.spanContext();\n const startTime = span.startTime[0] * 1000 + span.startTime[1] / 1_000_000;\n const endTime = span.endTime[0] * 1000 + span.endTime[1] / 1_000_000;\n\n // Convert attributes\n const attributes: Record<string, any> = {};\n for (const [key, value] of Object.entries(span.attributes)) {\n attributes[key] = value;\n }\n\n // Convert status\n const statusCode = span.status.code;\n let status: 'OK' | 'ERROR' | 'UNSET';\n switch (statusCode) {\n case 0: {\n status = 'UNSET';\n break;\n }\n case 1: {\n status = 'OK';\n break;\n }\n case 2: {\n status = 'ERROR';\n break;\n }\n default: {\n status = 'UNSET';\n }\n }\n\n // Convert events\n const events = span.events.map((event) => ({\n name: event.name,\n timestamp: event.time[0] * 1000 + event.time[1] / 1_000_000,\n attributes: event.attributes\n ? Object.fromEntries(Object.entries(event.attributes))\n : undefined,\n }));\n\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n parentSpanId: (span as any).parentSpanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTime,\n endTime,\n duration: endTime - startTime,\n attributes,\n status: {\n code: status,\n message: span.status.message,\n },\n events: events.length > 0 ? events : undefined,\n };\n }\n\n /**\n * Convert OpenTelemetry SpanKind to string\n */\n private convertSpanKind(\n kind: number,\n ): 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER' {\n switch (kind) {\n case 0: {\n return 'INTERNAL';\n }\n case 1: {\n return 'SERVER';\n }\n case 2: {\n return 'CLIENT';\n }\n case 3: {\n return 'PRODUCER';\n }\n case 4: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n }\n}\n","export function getResourceName(\n resource: Record<string, unknown> | undefined,\n fallback = 'unknown',\n): string {\n if (!resource) return fallback\n\n const candidates = [\n resource['service.name'],\n resource['service.namespace'],\n resource['deployment.environment.name'],\n resource['host.name'],\n resource['container.name'],\n resource['process.executable.name'],\n ]\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n return candidate\n }\n }\n\n return fallback\n}\n","/**\n * Log record exporter that sends OTel logs to a Devtools server HTTP ingest.\n * Use with BatchLogRecordProcessor when you want to view logs in the Autotel widget/extension.\n *\n * @example\n * ```typescript\n * import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\n * import { DevtoolsLogExporter } from '@autotel/devtools/server';\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * logRecordProcessors: [\n * new BatchLogRecordProcessor(\n * new DevtoolsLogExporter({ endpoint: 'http://localhost:8082' })\n * ),\n * ],\n * });\n * ```\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport type { ReadableLogRecord } from '@opentelemetry/sdk-logs';\nimport type { LogData } from './types';\nimport { getResourceName } from './resource-utils';\n\nexport interface DevtoolsLogExporterOptions {\n /**\n * Base URL of the Devtools HTTP ingest server\n * e.g. 'http://localhost:8082'\n */\n endpoint: string;\n\n /**\n * API key for authentication (if server requires it)\n */\n apiKey?: string;\n\n /**\n * Request timeout in milliseconds (default: 5000)\n */\n timeout?: number;\n}\n\nconst defaultTimeout = 5000;\n\nfunction hrTimeToMs(hrTime: [number, number]): number {\n return hrTime[0] * 1000 + hrTime[1] / 1e6;\n}\n\nfunction bodyToPayload(body: ReadableLogRecord['body']): string | Record<string, unknown> {\n if (body === undefined) return '';\n if (typeof body === 'string') return body;\n if (typeof body === 'object' && body !== null) return body as Record<string, unknown>;\n return String(body);\n}\n\nfunction recordToLogData(record: ReadableLogRecord, index: number): LogData {\n const id = `log-${Date.now()}-${index}-${Math.random().toString(36).slice(2, 9)}`;\n const timestamp = hrTimeToMs(record.hrTime);\n const body = bodyToPayload(record.body);\n const attributes = record.attributes && Object.keys(record.attributes).length > 0\n ? (record.attributes as Record<string, unknown>)\n : undefined;\n const resource = record.resource?.attributes && Object.keys(record.resource.attributes).length > 0\n ? (record.resource.attributes as Record<string, unknown>)\n : undefined;\n\n const log: LogData = {\n id,\n resourceName: getResourceName(resource),\n severityText: record.severityText,\n severityNumber: record.severityNumber,\n body,\n timestamp,\n attributes,\n resource,\n };\n\n if (record.spanContext) {\n log.traceId = record.spanContext.traceId;\n log.spanId = record.spanContext.spanId;\n }\n\n return log;\n}\n\nexport class DevtoolsLogExporter implements LogRecordExporter {\n private endpoint: string;\n private apiKey: string;\n private timeout: number;\n private isShutdown = false;\n\n constructor(options: DevtoolsLogExporterOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, '');\n this.apiKey = options.apiKey ?? '';\n this.timeout = options.timeout ?? defaultTimeout;\n }\n\n export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {\n if (this.isShutdown || logs.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n const payload = { logs: logs.map((r, i) => recordToLogData(r, i)) };\n const url = `${this.endpoint}/ingest/logs`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n .then((res) => {\n clearTimeout(timeoutId);\n if (!res.ok) {\n throw new Error(`Devtools log ingest failed: ${res.status} ${res.statusText}`);\n }\n resultCallback({ code: ExportResultCode.SUCCESS });\n })\n .catch((err) => {\n clearTimeout(timeoutId);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n });\n }\n\n shutdown(): Promise<void> {\n this.isShutdown = true;\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n","/**\n * Remote Span Exporter for sending traces to a hosted DevtoolsServer\n *\n * Use this when the DevtoolsServer is running on a different machine/process.\n *\n * @example\n * ```typescript\n * import { DevtoolsRemoteExporter } from '@autotel/devtools/server';\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * spanExporters: [\n * new DevtoolsRemoteExporter({\n * endpoint: 'https://autotel.mycompany.com',\n * apiKey: process.env.AUTOTEL_API_KEY,\n * })\n * ]\n * });\n * ```\n */\n\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult, ExportResultCode } from '@opentelemetry/core';\nimport type { TraceData, SpanData } from './types';\n\nexport interface DevtoolsRemoteExporterOptions {\n /**\n * Base URL of the Devtools server\n * e.g., 'https://autotel.mycompany.com' or 'http://localhost:8082'\n */\n endpoint: string;\n\n /**\n * API key for authentication (if server requires it)\n */\n apiKey?: string;\n\n /**\n * Service name for traces (default: 'unknown-service')\n */\n serviceName?: string;\n\n /**\n * Request timeout in milliseconds (default: 5000)\n */\n timeout?: number;\n\n /**\n * Retry failed requests (default: true)\n */\n retry?: boolean;\n\n /**\n * Number of retries (default: 3)\n */\n retryCount?: number;\n\n /**\n * Retry delay in milliseconds (default: 1000)\n */\n retryDelay?: number;\n\n /**\n * Enable verbose logging (default: false)\n */\n verbose?: boolean;\n}\n\nexport class DevtoolsRemoteExporter implements SpanExporter {\n private options: Required<DevtoolsRemoteExporterOptions>;\n private pendingExports: Promise<void>[] = [];\n\n constructor(options: DevtoolsRemoteExporterOptions) {\n this.options = {\n endpoint: options.endpoint.replace(/\\/$/, ''), // Remove trailing slash\n apiKey: options.apiKey ?? '',\n serviceName: options.serviceName ?? 'unknown-service',\n timeout: options.timeout ?? 5000,\n retry: options.retry ?? true,\n retryCount: options.retryCount ?? 3,\n retryDelay: options.retryDelay ?? 1000,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Export spans to the remote server\n */\n async export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): Promise<void> {\n // Start export asynchronously\n const exportPromise = this.doExport(spans)\n .then(() => {\n resultCallback({ code: 0 as ExportResultCode }); // SUCCESS\n })\n .catch((error) => {\n this.log(`Export failed: ${error.message}`);\n resultCallback({ code: 1 as ExportResultCode }); // FAILED\n });\n\n this.pendingExports.push(exportPromise);\n\n // Clean up completed exports\n exportPromise.finally(() => {\n const index = this.pendingExports.indexOf(exportPromise);\n if (index !== -1) {\n this.pendingExports.splice(index, 1);\n }\n });\n }\n\n private async doExport(spans: ReadableSpan[]): Promise<void> {\n if (spans.length === 0) return;\n\n this.log(`Exporting ${spans.length} span(s) to ${this.options.endpoint}`);\n\n // Group spans by trace ID and convert\n const traceMap = new Map<string, ReadableSpan[]>();\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n if (!traceMap.has(traceId)) {\n traceMap.set(traceId, []);\n }\n traceMap.get(traceId)!.push(span);\n }\n\n const traces: TraceData[] = [];\n for (const [traceId, traceSpans] of traceMap) {\n traces.push(this.convertToTraceData(traceId, traceSpans));\n }\n\n // Send with retry\n await this.sendWithRetry({ traces });\n }\n\n private async sendWithRetry(payload: { traces: TraceData[] }): Promise<void> {\n let lastError: Error | null = null;\n const maxAttempts = this.options.retry ? this.options.retryCount : 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.send(payload);\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n this.log(\n `Attempt ${attempt}/${maxAttempts} failed: ${lastError.message}`,\n );\n\n if (attempt < maxAttempts) {\n await this.sleep(this.options.retryDelay * attempt); // Exponential backoff\n }\n }\n }\n\n throw lastError || new Error('Export failed');\n }\n\n private async send(payload: { traces: TraceData[] }): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.options.timeout,\n );\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.options.apiKey) {\n headers['Authorization'] = `Bearer ${this.options.apiKey}`;\n }\n\n const response = await fetch(`${this.options.endpoint}/ingest/traces`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = (await response.json()) as { processed: number };\n this.log(`Successfully sent ${result.processed} trace(s)`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Shutdown the exporter, waiting for pending exports\n */\n async shutdown(): Promise<void> {\n this.log('Shutting down, waiting for pending exports...');\n await Promise.allSettled(this.pendingExports);\n this.log('Shutdown complete');\n }\n\n /**\n * Force flush pending exports\n */\n async forceFlush(): Promise<void> {\n await Promise.allSettled(this.pendingExports);\n }\n\n private convertToTraceData(\n traceId: string,\n spans: ReadableSpan[],\n ): TraceData {\n const spanData: SpanData[] = spans.map((span) => this.convertSpan(span));\n\n // Find root span (no parent)\n const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];\n\n // Sort spans by start time\n spanData.sort((a, b) => a.startTime - b.startTime);\n\n const startTime = Math.min(...spanData.map((s) => s.startTime));\n const endTime = Math.max(...spanData.map((s) => s.endTime));\n\n const hasError = spanData.some((s) => s.status.code === 'ERROR');\n const status = hasError ? 'ERROR' : 'OK';\n\n return {\n traceId,\n correlationId: traceId.slice(0, 16),\n rootSpan,\n spans: spanData,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: status as 'OK' | 'ERROR' | 'UNSET',\n service: this.options.serviceName,\n };\n }\n\n private convertSpan(span: ReadableSpan): SpanData {\n const spanContext = span.spanContext();\n const startTime = span.startTime[0] * 1000 + span.startTime[1] / 1_000_000;\n const endTime = span.endTime[0] * 1000 + span.endTime[1] / 1_000_000;\n\n const attributes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(span.attributes)) {\n attributes[key] = value;\n }\n\n let status: 'OK' | 'ERROR' | 'UNSET';\n switch (span.status.code) {\n case 0: {\n status = 'UNSET';\n break;\n }\n case 1: {\n status = 'OK';\n break;\n }\n case 2: {\n status = 'ERROR';\n break;\n }\n default: {\n status = 'UNSET';\n }\n }\n\n const events = span.events.map((event) => ({\n name: event.name,\n timestamp: event.time[0] * 1000 + event.time[1] / 1_000_000,\n attributes: event.attributes\n ? Object.fromEntries(Object.entries(event.attributes))\n : undefined,\n }));\n\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n parentSpanId: (span as any).parentSpanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTime,\n endTime,\n duration: endTime - startTime,\n attributes,\n status: {\n code: status,\n message: span.status.message,\n },\n events: events.length > 0 ? events : undefined,\n };\n }\n\n private convertSpanKind(\n kind: number,\n ): 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER' {\n switch (kind) {\n case 0: {\n return 'INTERNAL';\n }\n case 1: {\n return 'SERVER';\n }\n case 2: {\n return 'CLIENT';\n }\n case 3: {\n return 'PRODUCER';\n }\n case 4: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.options.verbose) {\n console.log(`[Devtools Remote Exporter] ${message}`);\n }\n }\n}\n","// src/server/otlp.ts\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { SpanData, TraceData, LogData } from './types'\nimport { getResourceName } from './resource-utils'\n\ntype OtlpAnyValue = {\n stringValue?: string\n boolValue?: boolean\n intValue?: string | number\n doubleValue?: number\n bytesValue?: string\n arrayValue?: { values?: OtlpAnyValue[] }\n kvlistValue?: { values?: OtlpKeyValue[] }\n}\n\ntype OtlpKeyValue = { key: string; value?: OtlpAnyValue }\n\nfunction resolveOtlpValue(v?: OtlpAnyValue): unknown {\n if (!v) return undefined\n if (v.stringValue !== undefined) return v.stringValue\n if (v.boolValue !== undefined) return v.boolValue\n if (v.intValue !== undefined) return typeof v.intValue === 'string' ? Number(v.intValue) : v.intValue\n if (v.doubleValue !== undefined) return v.doubleValue\n if (v.bytesValue !== undefined) return v.bytesValue\n if (v.arrayValue?.values) return v.arrayValue.values.map(resolveOtlpValue)\n if (v.kvlistValue?.values) return flattenAttributes(v.kvlistValue.values)\n return undefined\n}\n\nfunction flattenAttributes(attrs?: OtlpKeyValue[]): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n if (!attrs) return out\n for (const { key, value } of attrs) {\n out[key] = resolveOtlpValue(value)\n }\n return out\n}\n\nfunction nanoToMs(nano?: string): number {\n if (!nano) return 0\n return Number(BigInt(nano) / 1_000_000n)\n}\n\nconst SPAN_KIND_MAP: Record<number | string, SpanData['kind']> = {\n 0: 'INTERNAL', 1: 'INTERNAL', 2: 'SERVER', 3: 'CLIENT', 4: 'PRODUCER', 5: 'CONSUMER',\n SPAN_KIND_INTERNAL: 'INTERNAL', SPAN_KIND_SERVER: 'SERVER',\n SPAN_KIND_CLIENT: 'CLIENT', SPAN_KIND_PRODUCER: 'PRODUCER', SPAN_KIND_CONSUMER: 'CONSUMER',\n}\n\nfunction normalizeHexId(id?: string): string {\n if (!id) return ''\n // Only attempt base64 decode for strings that look like base64-encoded binary IDs\n // (length 24 or 28 chars for 16/32-byte IDs, valid base64 chars, not plain hex)\n const isBase64Like = /^[A-Za-z0-9+/=]+$/.test(id) && !(/^[0-9a-f]+$/i.test(id))\n const isLikelyBase64Id = isBase64Like && (id.length === 24 || id.length === 28 || id.length === 44 || id.length === 48)\n if (isLikelyBase64Id) {\n try {\n const bytes = Buffer.from(id, 'base64')\n return bytes.toString('hex')\n } catch { /* fall through */ }\n }\n return id\n}\n\nexport function parseOtlpTraces(payload: unknown): TraceData[] {\n if (!payload || typeof payload !== 'object') return []\n const { resourceSpans } = payload as any\n if (!Array.isArray(resourceSpans) || resourceSpans.length === 0) return []\n\n const traceMap = new Map<string, { spans: SpanData[]; service: string }>()\n\n for (const rs of resourceSpans) {\n const resourceAttrs = flattenAttributes(rs.resource?.attributes)\n const service = String(resourceAttrs['service.name'] || 'unknown')\n const scopeSpans = rs.scopeSpans || []\n\n for (const ss of scopeSpans) {\n for (const span of ss.spans || []) {\n const traceId = normalizeHexId(span.traceId)\n if (!traceId) continue\n\n const startMs = nanoToMs(span.startTimeUnixNano)\n const endMs = nanoToMs(span.endTimeUnixNano)\n const statusCode = span.status?.code\n let status: SpanData['status']['code'] = 'UNSET'\n if (statusCode === 1 || statusCode === 'STATUS_CODE_OK') status = 'OK'\n if (statusCode === 2 || statusCode === 'STATUS_CODE_ERROR') status = 'ERROR'\n\n const spanData: SpanData = {\n traceId,\n spanId: normalizeHexId(span.spanId),\n parentSpanId: normalizeHexId(span.parentSpanId) || undefined,\n name: span.name || 'unknown',\n kind: SPAN_KIND_MAP[span.kind ?? 0] || 'INTERNAL',\n startTime: startMs,\n endTime: endMs,\n duration: endMs - startMs,\n attributes: { ...resourceAttrs, ...flattenAttributes(span.attributes) } as Record<string, any>,\n status: { code: status, message: span.status?.message },\n events: (span.events || []).map((e: any) => ({\n name: e.name || '',\n timestamp: nanoToMs(e.timeUnixNano),\n attributes: flattenAttributes(e.attributes) as Record<string, any>,\n })),\n }\n\n const existing = traceMap.get(traceId)\n if (existing) {\n existing.spans.push(spanData)\n } else {\n traceMap.set(traceId, { spans: [spanData], service })\n }\n }\n }\n }\n\n const traces: TraceData[] = []\n for (const [traceId, { spans, service }] of traceMap) {\n const sorted = spans.sort((a, b) => a.startTime - b.startTime)\n const rootSpan = sorted.find(s => !s.parentSpanId) || sorted[0]\n const startTime = Math.min(...sorted.map(s => s.startTime))\n const endTime = Math.max(...sorted.map(s => s.endTime))\n const hasError = sorted.some(s => s.status.code === 'ERROR')\n\n traces.push({\n traceId,\n correlationId: traceId.slice(0, 16),\n rootSpan,\n spans: sorted,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: hasError ? 'ERROR' : 'OK',\n service,\n })\n }\n\n return traces\n}\n\nexport function parseOtlpLogs(payload: unknown): LogData[] {\n if (!payload || typeof payload !== 'object') return []\n const { resourceLogs } = payload as any\n if (!Array.isArray(resourceLogs)) return []\n\n const logs: LogData[] = []\n for (const rl of resourceLogs) {\n const resourceAttrs = flattenAttributes(rl.resource?.attributes)\n for (const sl of rl.scopeLogs || []) {\n for (const rec of sl.logRecords || []) {\n const timestamp = nanoToMs(rec.timeUnixNano || rec.observedTimeUnixNano)\n const traceId = normalizeHexId(rec.traceId) || undefined\n const spanId = normalizeHexId(rec.spanId) || undefined\n const body = rec.body ? resolveOtlpValue(rec.body) : ''\n\n logs.push({\n id: `${traceId || 'no-trace'}:${spanId || 'no-span'}:${timestamp}:${rec.severityNumber || 0}`,\n traceId,\n spanId,\n resourceName: getResourceName(resourceAttrs as Record<string, unknown>),\n severityText: rec.severityText,\n severityNumber: rec.severityNumber,\n body: typeof body === 'string' ? body : (body as Record<string, unknown>),\n timestamp,\n attributes: flattenAttributes(rec.attributes) as Record<string, unknown>,\n resource: resourceAttrs as Record<string, unknown>,\n })\n }\n }\n }\n\n return logs\n}\n\nexport function countOtlpMetrics(payload: unknown): number {\n if (!payload || typeof payload !== 'object') return 0\n const { resourceMetrics } = payload as any\n if (!Array.isArray(resourceMetrics)) return 0\n let count = 0\n for (const rm of resourceMetrics) {\n for (const sm of rm.scopeMetrics || []) {\n count += (sm.metrics || []).length\n }\n }\n return count\n}\n\nexport async function readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()))\n } catch {\n reject(new Error('Invalid JSON'))\n }\n })\n req.on('error', reject)\n })\n}\n\nexport function sendJson(res: ServerResponse, status: number, data: Record<string, unknown>): void {\n const body = JSON.stringify(data)\n res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) })\n res.end(body)\n}\n","// src/server/http.ts\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from 'node:http'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { parseOtlpTraces, parseOtlpLogs, countOtlpMetrics, readJsonBody, sendJson } from './otlp'\nimport type { DevtoolsServer } from './server'\n\nexport interface HttpServerOptions {\n port?: number\n host?: string\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 5; i++) {\n if (existsSync(resolve(dir, 'package.json'))) return dir\n dir = dirname(dir)\n }\n return dir\n}\n\nconst FULLPAGE_HTML = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>autotel-devtools</title><style>*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;width:100%;overflow:hidden}</style></head><body><script src=\"/widget.js?mode=fullpage\"></script></body></html>`\n\nlet cachedWidgetJs: string | null = null\nfunction getWidgetJs(): string {\n if (!cachedWidgetJs) {\n const pkgRoot = findPackageRoot()\n const candidates = [\n resolve(pkgRoot, 'dist', 'widget.global.js'),\n resolve(pkgRoot, 'widget.global.js'),\n ]\n for (const candidate of candidates) {\n try {\n cachedWidgetJs = readFileSync(candidate, 'utf8')\n break\n } catch { /* try next */ }\n }\n if (!cachedWidgetJs) {\n cachedWidgetJs = '// widget bundle not found - run pnpm build first'\n }\n }\n return cachedWidgetJs\n}\n\nexport function attachDevtoolsRoutes(httpServer: Server, devtools: DevtoolsServer): void {\n httpServer.on('request', async (req: IncomingMessage, res: ServerResponse) => {\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*')\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204)\n res.end()\n return\n }\n\n const url = req.url || '/'\n\n // GET / — fullpage HTML\n if (req.method === 'GET' && url === '/') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': Buffer.byteLength(FULLPAGE_HTML) })\n res.end(FULLPAGE_HTML)\n return\n }\n\n // GET /widget.js — widget bundle\n if (req.method === 'GET' && url.startsWith('/widget.js')) {\n const js = getWidgetJs()\n res.writeHead(200, { 'Content-Type': 'application/javascript; charset=utf-8', 'Content-Length': Buffer.byteLength(js) })\n res.end(js)\n return\n }\n\n // GET /healthz\n if (req.method === 'GET' && url === '/healthz') {\n sendJson(res, 200, { ok: true, clients: devtools.clientCount })\n return\n }\n\n // POST /v1/traces\n if (req.method === 'POST' && url === '/v1/traces') {\n try {\n const payload = await readJsonBody(req)\n const traces = parseOtlpTraces(payload)\n devtools.addTraces(traces)\n sendJson(res, 200, { acceptedTraces: traces.length })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n // POST /v1/logs\n if (req.method === 'POST' && url === '/v1/logs') {\n try {\n const payload = await readJsonBody(req)\n const logs = parseOtlpLogs(payload)\n devtools.addLogs(logs)\n sendJson(res, 200, { acceptedLogs: logs.length })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n // POST /v1/metrics\n if (req.method === 'POST' && url === '/v1/metrics') {\n try {\n const payload = await readJsonBody(req)\n const count = countOtlpMetrics(payload)\n sendJson(res, 200, { acceptedMetrics: count })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n sendJson(res, 404, { error: 'Not found' })\n })\n}\n\nexport function createDevtoolsHttpServer(devtools: DevtoolsServer, _options: HttpServerOptions = {}): Server {\n const server = createServer()\n attachDevtoolsRoutes(server, devtools)\n return server\n}\n"]}
1
+ {"version":3,"sources":["../../src/server/error-aggregator.ts","../../src/server/telemetry-limits.ts","../../src/server/server.ts","../../src/server/exporter.ts","../../src/server/resource-utils.ts","../../src/server/log-exporter.ts","../../src/server/remote-exporter.ts","../../src/server/otlp.ts","../../src/server/http.ts"],"names":["resolve","createServer"],"mappings":";;;;;;;;;;AAsDO,IAAM,kBAAN,MAAsB;AAAA,EACnB,WAAA,uBAA2C,GAAA,EAAI;AAAA,EAC/C,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,SAAA,EAAW,QAAQ,SAAA,IAAa,GAAA;AAAA,MAChC,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,EAAA;AAAA,MAChD,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,CAAA;AAAA,MAC9C,yBAAA,EAA2B,QAAQ,yBAAA,IAA6B;AAAA,KAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAAyC;AAChD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,UAAU,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA;AAEjD,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,QAAA,CAAS,KAAA,EAAA;AACT,MAAA,QAAA,CAAS,WAAW,UAAA,CAAW,SAAA;AAG/B,MAAA,IAAI,CAAC,QAAA,CAAS,cAAA,CAAe,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACzD,QAAA,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AAC/C,QAAA,IAAI,QAAA,CAAS,cAAA,CAAe,MAAA,GAAS,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AACnE,UAAA,QAAA,CAAS,eAAe,KAAA,EAAM;AAAA,QAChC;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,QAAA,CAAS,aAAA,CAAc,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzD,QAAA,QAAA,CAAS,aAAA,CAAc,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AAC/C,QAAA,IAAI,QAAA,CAAS,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjE,UAAA,QAAA,CAAS,cAAc,KAAA,EAAM;AAAA,QAC/B;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAuB;AAAA,MAC3B,WAAA;AAAA,MACA,IAAA,EAAM,WAAW,KAAA,CAAM,IAAA;AAAA,MACvB,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,MAC1B,UAAA,EAAY,IAAA,CAAK,mBAAA,CAAoB,UAAA,CAAW,MAAM,UAAU,CAAA;AAAA,MAChE,KAAA,EAAO,CAAA;AAAA,MACP,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,UAAU,UAAA,CAAW,SAAA;AAAA,MACrB,cAAA,EAAgB,CAAC,UAAA,CAAW,OAAO,CAAA;AAAA,MACnC,aAAA,EAAe,CAAC,UAAA,CAAW,QAAQ,CAAA;AAAA,MACnC,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,YAAY,UAAA,CAAW;AAAA,KACzB;AAGA,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,IAAQ,IAAA,CAAK,QAAQ,SAAA,EAAW;AACnD,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAA,EAAa,QAAQ,CAAA;AAC1C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,KAAA,EAAgC;AACjD,IAAA,MAAM,cAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,OAAA,EAAS;AAChC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AACxD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACtC,UAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CACN,MACA,KAAA,EACwB;AAExB,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,EAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AACtE,IAAA,MAAM,SAAA,GACH,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,IAChC,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA,IAC5B,cAAA,EAAgB,UAAA,GAAa,gBAAgB,CAAA,IAC9C,OAAA;AAEF,IAAA,MAAM,YAAA,GACJ,IAAA,CAAK,MAAA,CAAO,OAAA,IACX,IAAA,CAAK,UAAA,CAAW,mBAAmB,CAAA,IACnC,IAAA,CAAK,UAAA,CAAW,eAAe,CAAA,IAChC,eAAA;AAEF,IAAA,MAAM,UAAA,GACH,IAAA,CAAK,UAAA,CAAW,sBAAsB,CAAA,IACtC,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,IAClC,IAAA,CAAK,sBAAA,CAAuB,IAAI,CAAA;AAElC,IAAA,OAAO;AAAA,MACL,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,IAAA;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,WAAW,IAAA,CAAK,OAAA;AAAA,MAChB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,YAAA;AAAA,QACT;AAAA,OACF;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,yBAAA,CAA0B,IAAA,CAAK,UAAU;AAAA,KAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,IAAA,EAAoC;AACjE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA;AAEzB,IAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AACrE,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC9B,MAAA,OACG,eAAe,UAAA,CAAW,sBAAsB,CAAA,IAChD,cAAA,CAAe,WAAW,iBAAiB,CAAA;AAAA,IAEhD;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,0BACN,UAAA,EACyB;AACzB,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,aAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,UAAA,CAAW,GAAG,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,UAAA,EAAqC;AAC/D,IAAA,MAAM,KAAA,GAAkB,CAAC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAE9C,IAAA,IAAI,UAAA,CAAW,MAAM,UAAA,EAAY;AAC/B,MAAA,MAAM,SAAS,IAAA,CAAK,kBAAA;AAAA,QAClB,WAAW,KAAA,CAAM,UAAA;AAAA,QACjB,KAAK,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,IACtB,CAAA,MAAO;AAEL,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,UAAA,CAAW,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC5D;AAGA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,YAAoB,KAAA,EAAyB;AACtE,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAG5B,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,oCAAoC,CAAA;AACpE,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,iBAAA,CAAkB,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AACrE,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,wBAAwB,CAAA;AACxD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAA,CAAO,IAAA,CAAK,aAAa,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC5D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,CAAA,EAAG,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,iBAAA,CAAkB,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAAA,SAC/D;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAA,EAA0B;AAElD,IAAA,MAAM,mBAAmB,QAAA,CAAS,KAAA;AAAA,MAChC;AAAA,KACF;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO,CAAA,MAAA,EAAS,gBAAA,CAAiB,CAAC,CAAC,CAAA,CAAA;AAAA,IACrC;AAGA,IAAA,OAAO,QAAA,CACJ,OAAA,CAAQ,aAAA,EAAe,MAAM,EAC7B,OAAA,CAAQ,cAAA,EAAgB,OAAO,CAAA,CAC/B,QAAQ,aAAA,EAAe,MAAM,CAAA,CAC7B,OAAA,CAAQ,cAAc,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAAA,EAAyB;AAChD,IAAA,OACE,OAAA,CAEG,UAAA;AAAA,MACC,gEAAA;AAAA,MACA;AAAA,MAGD,UAAA,CAAW,qBAAA,EAAuB,MAAM,CAAA,CAExC,UAAA,CAAW,YAAY,KAAK,CAAA,CAE5B,WAAW,UAAA,EAAY,SAAS,EAChC,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA,CAEhC,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,EAEnB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,UAAA,EAAyC;AACnE,IAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AAExB,IAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAChD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,GAAA,EAAqB;AACtC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,MAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,KAAK,IAAA,GAAO,IAAA;AAC5B,MAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AACA,IAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,MAAA,GAA2D,IAAA;AAE/D,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,KAAK,CAAA,IAAK,KAAK,WAAA,EAAa;AACnD,MAAA,IAAI,CAAC,MAAA,IAAU,KAAA,CAAM,QAAA,GAAW,OAAO,QAAA,EAAU;AAC/C,QAAA,MAAA,GAAS,EAAE,WAAA,EAAa,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS;AAAA,MACnD;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA+B;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MACpC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAA,GAA0C;AACxC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MACpC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,WAAA,EAA6C;AACzD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,OAAA,EAA+B;AACrD,IAAA,OAAO,IAAA,CAAK,gBAAe,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC7C,MAAA,KAAA,IAAS,KAAA,CAAM,KAAA;AAAA,IACjB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAKE;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UAAA,GAAa,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,GAAA;AAEnC,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAE1C,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC7C,MAAA,IAAI,KAAA,CAAM,WAAW,UAAA,EAAY;AAC/B,QAAA,YAAA,IAAgB,KAAA,CAAM,KAAA;AAAA,MACxB;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,EAAA,CAAO,SAAA,CAAU,GAAA,CAAI,MAAM,IAAI,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO,EAAE,IAAA,EAAM,KAAA,EAAM,CAAE,CAAA,CACxC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,GAAG,CAAC,CAAA;AAEb,IAAA,OAAO;AAAA,MACL,WAAA,EAAa,KAAK,WAAA,CAAY,IAAA;AAAA,MAC9B,WAAA,EAAa,KAAK,kBAAA,EAAmB;AAAA,MACrC,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAA0B;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA;AAC5B,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,KAAK,CAAA,IAAK,KAAK,WAAA,EAAa;AACnD,MAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,WAAW,CAAA;AACnC,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;AC7cA,IAAM,YAAA,GAAe,GAAA;AAErB,SAAS,WAAW,KAAA,EAA+C;AACjE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,OAAO,OAAO,QAAA,CAAS,MAAM,CAAA,IAAK,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAC1D;AAEO,SAAS,sBAAA,CACd,IAAA,GAAmC,EAAC,EACnB;AACjB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA;AAChC,EAAA,MAAM,QAAA,GAAW,KAAK,UAAA,IAAc,YAAA;AAEpC,EAAA,OAAO;AAAA,IACL,eACE,IAAA,CAAK,aAAA,IACL,UAAA,CAAW,GAAA,CAAI,uBAAuB,CAAA,IACtC,QAAA;AAAA,IACF,aACE,IAAA,CAAK,WAAA,IACL,UAAA,CAAW,GAAA,CAAI,qBAAqB,CAAA,IACpC,QAAA;AAAA,IACF,gBACE,IAAA,CAAK,cAAA,IACL,UAAA,CAAW,GAAA,CAAI,wBAAwB,CAAA,IACvC;AAAA,GACJ;AACF;AAEO,SAAS,eAAA,CAAmB,KAAA,EAAY,IAAA,EAAS,KAAA,EAAoB;AAC1E,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAA,EAAO,IAAI,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,SAAS,KAAA,GAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA,GAAI,IAAA;AACjE;AAEO,SAAS,mBAAA,CACd,KAAA,EACA,QAAA,EACA,KAAA,EACK;AACL,EAAA,IAAI,KAAA,IAAS,KAAK,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,KAAA,IAAS,CAAA,GAAI,EAAC,GAAI,KAAA;AAClE,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAA,EAAO,GAAG,QAAQ,CAAA;AACnC,EAAA,OAAO,IAAA,CAAK,SAAS,KAAA,GAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA,GAAI,IAAA;AACjE;AAEO,SAAS,oBAAA,CACd,MACA,MAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,OAAO,aAAa,CAAA;AAAA,IAC/C,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,OAAO,WAAW,CAAA;AAAA,IACzC,SAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,OAAO,cAAc;AAAA,GACpD;AACF;;;AC3CO,IAAM,iBAAN,MAAqB;AAAA,EAClB,GAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAe;AAAA,EAC7B,UAAA;AAAA,EACA,SAAsB,EAAC;AAAA,EACvB,OAAkB,EAAC;AAAA,EACnB,UAAwB,EAAC;AAAA,EACzB,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAAA,EACtC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,uBAAuB,OAAO,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,IAAA,IAAQ,IAAA;AAE7B,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,MAAA,IAAU,YAAA,EAAa;AACjD,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,UAAA,EAAY,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,KAAA,EAAO,CAAA;AAEvF,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,YAAA,EAAc,CAAC,EAAA,KAAO;AAChC,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,kBAAA,EAAqB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,OAAA,CAAS,CAAA;AAGxD,MAAA,MAAM,IAAA,GAAO,KAAK,cAAA,EAAe;AACjC,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5E,QAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MAC9B;AAEA,MAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,qBAAA,EAAwB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,OAAA,CAAS,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,MAAM;AACvC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ;AACrC,QAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,EAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AACxD,QAAA,IAAA,CAAK,GAAA,CAAI,CAAA,mCAAA,EAAsC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ;AACrC,IAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,SAAiB,IAAA,CAAK,IAAA;AAClD,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA,EAEA,SAAS,KAAA,EAAwB;AAE/B,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,OAAA,KAAY,MAAM,OAAO,CAAA;AAClE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAC,CAAA;AACjE,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,QAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,UAAA,QAAA,CAAS,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA,QAAA,CAAS,YAAY,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,SAAA,EAAW,MAAM,SAAS,CAAA;AACjE,MAAA,QAAA,CAAS,UAAU,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,MAAM,OAAO,CAAA;AAC3D,MAAA,QAAA,CAAS,QAAA,GAAW,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,SAAA;AAChD,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS,QAAA,CAAS,MAAA,GAAS,OAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,eAAA;AAAA,QACZ,IAAA,CAAK,MAAA;AAAA,QACL,KAAA;AAAA,QACA,KAAK,MAAA,CAAO;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,mBAAmB,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,CAAC,KAAK,GAAG,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,EAAC,EAAG,MAAA,EAAQ,KAAK,eAAA,CAAgB,cAAA,IAAkB,CAAA;AAAA,EAC1G;AAAA,EAEA,UAAU,MAAA,EAA2B;AACnC,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAAA,EACjD;AAAA,EAEA,OAAO,GAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,OAAO,eAAA,CAAgB,IAAA,CAAK,MAAM,GAAA,EAAK,IAAA,CAAK,OAAO,WAAW,CAAA;AACnE,IAAA,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAA;AAAA,EACrE;AAAA,EAEA,QAAQ,IAAA,EAAuB;AAC7B,IAAA,IAAA,CAAK,OAAO,mBAAA,CAAoB,IAAA,CAAK,MAAM,IAAA,EAAM,IAAA,CAAK,OAAO,WAAW,CAAA;AACxE,IAAA,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,EAC9D;AAAA,EAEA,UAAU,MAAA,EAA0B;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,eAAA;AAAA,MACb,IAAA,CAAK,OAAA;AAAA,MACL,MAAA;AAAA,MACA,KAAK,MAAA,CAAO;AAAA,KACd;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,IAAI,OAAA,EAAS,CAAC,MAAM,CAAA,EAAG,MAAM,EAAC,EAAG,MAAA,EAAQ,IAAI,CAAA;AAAA,EACxE;AAAA,EAEA,cAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAA,EAAQ,IAAA,CAAK,eAAA,CAAgB,cAAA;AAAe,KAC9C;AAAA,EACF;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,OAAO,EAAC;AACb,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AAAA,EAEQ,UAAU,IAAA,EAA0B;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAC/B,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AACxC,QAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,KAAK,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,KAAA,EAAM;AAChD,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,MAAM,IAAI,OAAA,CAAc,CAACA,QAAAA,KAAY,IAAA,CAAK,WAAW,KAAA,CAAM,MAAMA,QAAAA,EAAS,CAAC,CAAA;AAAA,EAC7E;AACF;;;AChKO,IAAM,uBAAN,MAAmD;AAAA,EAChD,MAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAwB,WAAA,GAAsB,iBAAA,EAAmB;AAC3E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EACe;AAGf,IAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAuB,CAAA;AAG9C,IAAA,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AAC3B,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,KAAA,CAAM,MAAM,CAAA,QAAA,CAAU,CAAA;AAGlE,QAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AAEjD,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AACnC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,YAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA;AAAA,UAC1B;AACA,UAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,QAClC;AAGA,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,UAAU,CAAA,IAAK,QAAA,EAAU;AAC5C,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,UAAU,CAAA;AACzD,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,gCAAA,EAAmC,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,MAAA,EAAS,WAAW,MAAM,CAAA,MAAA;AAAA,WACnF;AACA,UAAA,IAAA,CAAK,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,QAC5B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,MACzD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,SACA,KAAA,EACW;AAEX,IAAA,MAAM,QAAA,GAAuB,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AAGvE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,YAAY,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA;AAGpE,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAEjD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAG1D,IAAA,MAAM,QAAA,GAAW,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,WAAW,OAAA,GAAU,IAAA;AAEpC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,aAAA,EAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA;AAAA,MAClC,QAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,GAAU,SAAA;AAAA,MACpB,MAAA;AAAA,MACA,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,IAAA,EAA8B;AAChD,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,EAAY;AACrC,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,CAAC,IAAI,GAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AACjE,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,CAAC,IAAI,GAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAG3D,IAAA,MAAM,aAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1D,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,IACpB;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,IAAA;AAC/B,IAAA,IAAI,MAAA;AACJ,IAAA,QAAQ,UAAA;AAAY,MAClB,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,OAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,OAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,MAAA,GAAS,OAAA;AAAA,MACX;AAAA;AAIF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACzC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAA,EAAW,MAAM,IAAA,CAAK,CAAC,IAAI,GAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA;AAAA,MAClD,UAAA,EAAY,KAAA,CAAM,UAAA,GACd,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA,GACnD;AAAA,KACN,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,cAAe,IAAA,CAAa,YAAA;AAAA,MAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,MACpC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,GAAU,SAAA;AAAA,MACpB,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,OACvB;AAAA,MACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,KACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,IAAA,EAC4D;AAC5D,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,OAAO,UAAA;AAAA,MACT;AAAA;AACF,EACF;AACF;;;ACtMO,SAAS,eAAA,CACd,QAAA,EACA,QAAA,GAAW,SAAA,EACH;AACR,EAAA,IAAI,CAAC,UAAU,OAAO,QAAA;AAEtB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,SAAS,cAAc,CAAA;AAAA,IACvB,SAAS,mBAAmB,CAAA;AAAA,IAC5B,SAAS,6BAA6B,CAAA;AAAA,IACtC,SAAS,WAAW,CAAA;AAAA,IACpB,SAAS,gBAAgB,CAAA;AAAA,IACzB,SAAS,yBAAyB;AAAA,GACpC;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,UAAU,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AAChE,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;;;ACwBA,IAAM,cAAA,GAAiB,GAAA;AAEvB,SAAS,WAAW,MAAA,EAAkC;AACpD,EAAA,OAAO,OAAO,CAAC,CAAA,GAAI,GAAA,GAAO,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACxC;AAEA,SAAS,cAAc,IAAA,EAAmE;AACxF,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,EAAA;AAC/B,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACrC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAM,OAAO,IAAA;AACtD,EAAA,OAAO,OAAO,IAAI,CAAA;AACpB;AAEA,SAAS,eAAA,CAAgB,QAA2B,KAAA,EAAwB;AAC1E,EAAA,MAAM,KAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC/E,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GAC3E,MAAA,CAAO,UAAA,GACR,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,EAAU,UAAA,IAAc,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GAC5F,MAAA,CAAO,SAAS,UAAA,GACjB,MAAA;AAEJ,EAAA,MAAM,GAAA,GAAe;AAAA,IACnB,EAAA;AAAA,IACA,YAAA,EAAc,gBAAgB,QAAQ,CAAA;AAAA,IACtC,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,IAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAO,WAAA,CAAY,OAAA;AACjC,IAAA,GAAA,CAAI,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA;AAAA,EAClC;AAEA,EAAA,OAAO,GAAA;AACT;AAEO,IAAM,sBAAN,MAAuD;AAAA,EACpD,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EAErB,YAAY,OAAA,EAAqC;AAC/C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,EAAA;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,cAAA;AAAA,EACpC;AAAA,EAEA,MAAA,CAAO,MAA2B,cAAA,EAAsD;AACtF,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,gBAAA,CAAiB,OAAA,EAAS,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAC,CAAA,EAAE;AAClE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,YAAA,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,KAAA,CAAM,GAAA,EAAK;AAAA,MACT,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,MAC5B,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA,CACE,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,MAC/E;AACA,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,gBAAA,CAAiB,OAAA,EAAS,CAAA;AAAA,IACnD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,cAAA,CAAe;AAAA,QACb,MAAM,gBAAA,CAAiB,MAAA;AAAA,QACvB,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC;AAAA,OAC1D,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,QAAA,GAA0B;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,UAAA,GAA4B;AAC1B,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AACF;;;AChFO,IAAM,yBAAN,MAAqD;AAAA,EAClD,OAAA;AAAA,EACA,iBAAkC,EAAC;AAAA,EAE3C,YAAY,OAAA,EAAwC;AAClD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA;AAAA,MAC5C,MAAA,EAAQ,QAAQ,MAAA,IAAU,EAAA;AAAA,MAC1B,WAAA,EAAa,QAAQ,WAAA,IAAe,iBAAA;AAAA,MACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,GAAA;AAAA,MAC5B,KAAA,EAAO,QAAQ,KAAA,IAAS,IAAA;AAAA,MACxB,UAAA,EAAY,QAAQ,UAAA,IAAc,CAAA;AAAA,MAClC,UAAA,EAAY,QAAQ,UAAA,IAAc,GAAA;AAAA,MAClC,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,KAAA,EACA,cAAA,EACe;AAEf,IAAA,MAAM,gBAAgB,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,CACtC,KAAK,MAAM;AACV,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAuB,CAAA;AAAA,IAChD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC1C,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAuB,CAAA;AAAA,IAChD,CAAC,CAAA;AAEH,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,aAAa,CAAA;AAGtC,IAAA,aAAA,CAAc,QAAQ,MAAM;AAC1B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,aAAa,CAAA;AACvD,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MACrC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,SAAS,KAAA,EAAsC;AAC3D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,IAAA,CAAK,GAAA,CAAI,aAAa,KAAA,CAAM,MAAM,eAAe,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAGxE,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AACjD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AACnC,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA;AAAA,MAC1B;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,SAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,UAAU,CAAA,IAAK,QAAA,EAAU;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,IAC1D;AAGA,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,EAAE,MAAA,EAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,MAAc,cAAc,OAAA,EAAiD;AAC3E,IAAA,IAAI,SAAA,GAA0B,IAAA;AAC9B,IAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,QAAQ,UAAA,GAAa,CAAA;AAEnE,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AACvB,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,GAAY,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,WAAW,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,SAAA,EAAY,UAAU,OAAO,CAAA;AAAA,SAChE;AAEA,QAAA,IAAI,UAAU,WAAA,EAAa;AACzB,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,OAAO,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,IAAa,IAAI,KAAA,CAAM,eAAe,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAc,KAAK,OAAA,EAAiD;AAClE,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,UAAA;AAAA,MAChB,MAAM,WAAW,KAAA,EAAM;AAAA,MACvB,KAAK,OAAA,CAAQ;AAAA,KACf;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,MAAM,CAAA,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,cAAA,CAAA,EAAkB;AAAA,QACrE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,MAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,MAAA,IAAA,CAAK,GAAA,CAAI,CAAA,kBAAA,EAAqB,MAAA,CAAO,SAAS,CAAA,SAAA,CAAW,CAAA;AAAA,IAC3D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,IAAI,+CAA+C,CAAA;AACxD,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAI,mBAAmB,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAAA,EAC9C;AAAA,EAEQ,kBAAA,CACN,SACA,KAAA,EACW;AACX,IAAA,MAAM,QAAA,GAAuB,MAAM,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,WAAA,CAAY,IAAI,CAAC,CAAA;AAGvE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,YAAY,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA;AAGpE,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAEjD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAE1D,IAAA,MAAM,QAAA,GAAW,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,WAAW,OAAA,GAAU,IAAA;AAEpC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,aAAA,EAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MAClC,QAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,GAAU,SAAA;AAAA,MACpB,MAAA;AAAA,MACA,OAAA,EAAS,KAAK,OAAA,CAAQ;AAAA,KACxB;AAAA,EACF;AAAA,EAEQ,YAAY,IAAA,EAA8B;AAChD,IAAA,MAAM,WAAA,GAAc,KAAK,WAAA,EAAY;AACrC,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU,CAAC,IAAI,GAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA,GAAI,GAAA;AACjE,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,CAAC,IAAI,GAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AAE3D,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC1D,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,IACpB;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,QAAQ,IAAA,CAAK,OAAO,IAAA;AAAM,MACxB,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,OAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,IAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,MAAA,GAAS,OAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,MAAA,GAAS,OAAA;AAAA,MACX;AAAA;AAGF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACzC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAA,EAAW,MAAM,IAAA,CAAK,CAAC,IAAI,GAAA,GAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA;AAAA,MAClD,UAAA,EAAY,KAAA,CAAM,UAAA,GACd,MAAA,CAAO,WAAA,CAAY,OAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA,GACnD;AAAA,KACN,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,SAAS,WAAA,CAAY,OAAA;AAAA,MACrB,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,cAAe,IAAA,CAAa,YAAA;AAAA,MAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,MACpC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,GAAU,SAAA;AAAA,MACpB,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,OACvB;AAAA,MACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,KACvC;AAAA,EACF;AAAA,EAEQ,gBACN,IAAA,EAC4D;AAC5D,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,KAAK,CAAA,EAAG;AACN,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,MACA,SAAS;AACP,QAAA,OAAO,UAAA;AAAA,MACT;AAAA;AACF,EACF;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,aAAY,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA,EAEQ,IAAI,OAAA,EAAuB;AACjC,IAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAE,CAAA;AAAA,IACrD;AAAA,EACF;AACF;;;AC3TA,SAAS,iBAAiB,CAAA,EAA2B;AACnD,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,EAAW,OAAO,CAAA,CAAE,WAAA;AAC1C,EAAA,IAAI,CAAA,CAAE,SAAA,KAAc,MAAA,EAAW,OAAO,CAAA,CAAE,SAAA;AACxC,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,MAAA,EAAW,OAAO,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAA,GAAI,CAAA,CAAE,QAAA;AAC7F,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,EAAW,OAAO,CAAA,CAAE,WAAA;AAC1C,EAAA,IAAI,CAAA,CAAE,UAAA,KAAe,MAAA,EAAW,OAAO,CAAA,CAAE,UAAA;AACzC,EAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAQ,OAAO,EAAE,UAAA,CAAW,MAAA,CAAO,IAAI,gBAAgB,CAAA;AACzE,EAAA,IAAI,EAAE,WAAA,EAAa,MAAA,SAAe,iBAAA,CAAkB,CAAA,CAAE,YAAY,MAAM,CAAA;AACxE,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,KAAA,EAAiD;AAC1E,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AACnB,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,KAAA,EAAO;AAClC,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,gBAAA,CAAiB,KAAK,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,SAAS,IAAA,EAAuB;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,QAAU,CAAA;AACzC;AAEA,IAAM,aAAA,GAA2D;AAAA,EAC/D,CAAA,EAAG,UAAA;AAAA,EAAY,CAAA,EAAG,UAAA;AAAA,EAAY,CAAA,EAAG,QAAA;AAAA,EAAU,CAAA,EAAG,QAAA;AAAA,EAAU,CAAA,EAAG,UAAA;AAAA,EAAY,CAAA,EAAG,UAAA;AAAA,EAC1E,kBAAA,EAAoB,UAAA;AAAA,EAAY,gBAAA,EAAkB,QAAA;AAAA,EAClD,gBAAA,EAAkB,QAAA;AAAA,EAAU,kBAAA,EAAoB,UAAA;AAAA,EAAY,kBAAA,EAAoB;AAClF,CAAA;AAEA,SAAS,eAAe,EAAA,EAAqB;AAC3C,EAAA,IAAI,CAAC,IAAI,OAAO,EAAA;AAGhB,EAAA,MAAM,YAAA,GAAe,oBAAoB,IAAA,CAAK,EAAE,KAAK,CAAE,cAAA,CAAe,KAAK,EAAE,CAAA;AAC7E,EAAA,MAAM,gBAAA,GAAmB,YAAA,KAAiB,EAAA,CAAG,MAAA,KAAW,EAAA,IAAM,EAAA,CAAG,MAAA,KAAW,EAAA,IAAM,EAAA,CAAG,MAAA,KAAW,EAAA,IAAM,EAAA,CAAG,MAAA,KAAW,EAAA,CAAA;AACpH,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AACtC,MAAA,OAAO,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AAAA,IAAqB;AAAA,EAC/B;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,gBAAgB,OAAA,EAA+B;AAC7D,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,SAAiB,EAAC;AACrD,EAAA,MAAM,EAAE,eAAc,GAAI,OAAA;AAC1B,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,aAAa,KAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEzE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoD;AAEzE,EAAA,KAAA,MAAW,MAAM,aAAA,EAAe;AAC9B,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,EAAA,CAAG,QAAA,EAAU,UAAU,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,cAAc,KAAK,SAAS,CAAA;AACjE,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,UAAA,IAAc,EAAC;AAErC,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,KAAA,MAAW,IAAA,IAAQ,EAAA,CAAG,KAAA,IAAS,EAAC,EAAG;AACjC,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAC3C,QAAA,IAAI,CAAC,OAAA,EAAS;AAEd,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,iBAAiB,CAAA;AAC/C,QAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA;AAC3C,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,EAAQ,IAAA;AAChC,QAAA,IAAI,MAAA,GAAqC,OAAA;AACzC,QAAA,IAAI,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,gBAAA,EAAkB,MAAA,GAAS,IAAA;AAClE,QAAA,IAAI,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,mBAAA,EAAqB,MAAA,GAAS,OAAA;AAErE,QAAA,MAAM,QAAA,GAAqB;AAAA,UACzB,OAAA;AAAA,UACA,MAAA,EAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAAA,UAClC,YAAA,EAAc,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA,IAAK,MAAA;AAAA,UACnD,IAAA,EAAM,KAAK,IAAA,IAAQ,SAAA;AAAA,UACnB,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAA,IAAK,UAAA;AAAA,UACvC,SAAA,EAAW,OAAA;AAAA,UACX,OAAA,EAAS,KAAA;AAAA,UACT,UAAU,KAAA,GAAQ,OAAA;AAAA,UAClB,UAAA,EAAY,EAAE,GAAG,aAAA,EAAe,GAAG,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA,EAAE;AAAA,UACtE,QAAQ,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,UACtD,SAAS,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,YAC3C,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,YAChB,SAAA,EAAW,QAAA,CAAS,CAAA,CAAE,YAAY,CAAA;AAAA,YAClC,UAAA,EAAY,iBAAA,CAAkB,CAAA,CAAE,UAAU;AAAA,WAC5C,CAAE;AAAA,SACJ;AAEA,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,GAAA,CAAI,SAAS,EAAE,KAAA,EAAO,CAAC,QAAQ,CAAA,EAAG,SAAS,CAAA;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,EAAE,OAAO,OAAA,EAAS,KAAK,QAAA,EAAU;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,YAAY,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,GAAG,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAG,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA;AACtD,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,MAAA,CAAO,SAAS,OAAO,CAAA;AAE3D,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,OAAA;AAAA,MACA,aAAA,EAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,MAClC,QAAA;AAAA,MACA,KAAA,EAAO,MAAA;AAAA,MACP,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,GAAU,SAAA;AAAA,MACpB,MAAA,EAAQ,WAAW,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAc,OAAA,EAA6B;AACzD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,SAAiB,EAAC;AACrD,EAAA,MAAM,EAAE,cAAa,GAAI,OAAA;AACzB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,SAAU,EAAC;AAE1C,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,EAAA,CAAG,QAAA,EAAU,UAAU,CAAA;AAC/D,IAAA,KAAA,MAAW,EAAA,IAAM,EAAA,CAAG,SAAA,IAAa,EAAC,EAAG;AACnC,MAAA,KAAA,MAAW,GAAA,IAAO,EAAA,CAAG,UAAA,IAAc,EAAC,EAAG;AACrC,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,YAAA,IAAgB,IAAI,oBAAoB,CAAA;AACvE,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,IAAK,MAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,IAAK,MAAA;AAC7C,QAAA,MAAM,OAAO,GAAA,CAAI,IAAA,GAAO,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,GAAI,EAAA;AAErD,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,EAAA,EAAI,CAAA,EAAG,OAAA,IAAW,UAAU,CAAA,CAAA,EAAI,MAAA,IAAU,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,cAAA,IAAkB,CAAC,CAAA,CAAA;AAAA,UAC3F,OAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA,EAAc,gBAAgB,aAAwC,CAAA;AAAA,UACtE,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,gBAAgB,GAAA,CAAI,cAAA;AAAA,UACpB,IAAA,EAAM,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAQ,IAAA;AAAA,UACzC,SAAA;AAAA,UACA,UAAA,EAAY,iBAAA,CAAkB,GAAA,CAAI,UAAU,CAAA;AAAA,UAC5C,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,iBAAiB,OAAA,EAA0B;AACzD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,CAAA;AACpD,EAAA,MAAM,EAAE,iBAAgB,GAAI,OAAA;AAC5B,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,GAAG,OAAO,CAAA;AAC5C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,eAAA,EAAiB;AAChC,IAAA,KAAA,MAAW,EAAA,IAAM,EAAA,CAAG,YAAA,IAAgB,EAAC,EAAG;AACtC,MAAA,KAAA,IAAA,CAAU,EAAA,CAAG,OAAA,IAAW,EAAC,EAAG,MAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,eAAsB,aAAa,GAAA,EAAwC;AACzE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,GAAA,CAAI,GAAG,MAAA,EAAQ,CAAC,UAAkB,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,IAAI;AACF,QAAAA,QAAAA,CAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,OAAO,MAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAAA,MACtD,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEO,SAAS,QAAA,CAAS,GAAA,EAAqB,MAAA,EAAgB,IAAA,EAAqC;AACjG,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAChC,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,EAAE,cAAA,EAAgB,kBAAA,EAAoB,kBAAkB,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA;AACvG,EAAA,GAAA,CAAI,IAAI,IAAI,CAAA;AACd;;;ACjMA,SAAS,eAAA,GAA0B;AACjC,EAAA,IAAI,GAAA,GAAM,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAChD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,WAAW,OAAA,CAAQ,GAAA,EAAK,cAAc,CAAC,GAAG,OAAO,GAAA;AACrD,IAAA,GAAA,GAAM,QAAQ,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,aAAA,GAAgB,CAAA,4UAAA,CAAA;AAEtB,IAAI,cAAA,GAAgC,IAAA;AACpC,SAAS,WAAA,GAAsB;AAC7B,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,OAAA,CAAQ,OAAA,EAAS,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAC3C,OAAA,CAAQ,SAAS,kBAAkB;AAAA,KACrC;AACA,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,YAAA,CAAa,WAAW,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAiB;AAAA,IAC3B;AACA,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,cAAA,GAAiB,mDAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,oBAAA,CAAqB,YAAoB,QAAA,EAAgC;AACvF,EAAA,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,OAAO,GAAA,EAAsB,GAAA,KAAwB;AAE5E,IAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,GAAG,CAAA;AAChD,IAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,4BAA4B,CAAA;AAC1E,IAAA,GAAA,CAAI,SAAA,CAAU,gCAAgC,cAAc,CAAA;AAE5D,IAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,GAAA,EAAI;AACR,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AAGvB,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,GAAA,KAAQ,GAAA,EAAK;AACvC,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,0BAAA,EAA4B,kBAAkB,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,EAAG,CAAA;AACrH,MAAA,GAAA,CAAI,IAAI,aAAa,CAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,MAAA,KAAW,KAAA,IAAS,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AACxD,MAAA,MAAM,KAAK,WAAA,EAAY;AACvB,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,uCAAA,EAAyC,kBAAkB,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA;AACvH,MAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AACV,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,GAAA,KAAQ,UAAA,EAAY;AAC9C,MAAA,QAAA,CAAS,GAAA,EAAK,KAAK,EAAE,EAAA,EAAI,MAAM,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA;AAC9D,MAAA;AAAA,IACF;AAOA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,KAAA,IAAS,GAAA,KAAQ,YAAA,EAAc;AAChD,MAAA,MAAM,IAAA,GAAO,SAAS,cAAA,EAAe;AACrC,MAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA;AACrE,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,GAAA,KAAQ,YAAA,EAAc;AACnD,MAAA,QAAA,CAAS,SAAA,EAAU;AACnB,MAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AACpC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,KAAQ,YAAA,EAAc;AACjD,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,GAAG,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,gBAAgB,OAAO,CAAA;AACtC,QAAA,QAAA,CAAS,UAAU,MAAM,CAAA;AACzB,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,cAAA,EAAgB,MAAA,CAAO,QAAQ,CAAA;AAAA,MACtD,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,MACxG;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,KAAQ,UAAA,EAAY;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,GAAG,CAAA;AACtC,QAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,QAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,QAAA,QAAA,CAAS,KAAK,GAAA,EAAK,EAAE,YAAA,EAAc,IAAA,CAAK,QAAQ,CAAA;AAAA,MAClD,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,MACxG;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,KAAQ,aAAA,EAAe;AAClD,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,GAAG,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AACtC,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,eAAA,EAAiB,OAAO,CAAA;AAAA,MAC/C,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,MAAA,CAAO,CAAC,GAAG,CAAA;AAAA,MACxG;AACA,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,EAAE,KAAA,EAAO,aAAa,CAAA;AAAA,EAC3C,CAAC,CAAA;AACH;AAEO,SAAS,wBAAA,CAAyB,QAAA,EAA0B,QAAA,GAA8B,EAAC,EAAW;AAC3G,EAAA,MAAM,SAASC,YAAAA,EAAa;AAC5B,EAAA,oBAAA,CAAqB,QAAQ,QAAQ,CAAA;AACrC,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["/**\n * Error Aggregator\n *\n * Groups similar errors together based on stack trace fingerprinting.\n * Tracks error frequency, first/last occurrence, and affected traces.\n *\n * @example\n * ```typescript\n * const aggregator = new ErrorAggregator({ maxGroups: 100 });\n *\n * // Add errors from spans\n * aggregator.addError({\n * traceId: '123',\n * spanId: '456',\n * spanName: 'api.createUser',\n * service: 'user-service',\n * timestamp: Date.now(),\n * error: {\n * type: 'ValidationError',\n * message: 'Invalid email format',\n * stackTrace: 'Error: Invalid email...'\n * }\n * });\n *\n * // Get aggregated error groups\n * const groups = aggregator.getErrorGroups();\n * ```\n */\n\nimport type { ErrorGroup, ErrorOccurrence, SpanData, TraceData } from './types';\n\nexport interface ErrorAggregatorOptions {\n /**\n * Maximum number of error groups to track (default: 100)\n * Oldest groups are evicted when limit is reached\n */\n maxGroups?: number;\n\n /**\n * Maximum number of affected traces to keep per group (default: 10)\n */\n maxAffectedTraces?: number;\n\n /**\n * Maximum number of affected span names to keep per group (default: 5)\n */\n maxAffectedSpans?: number;\n\n /**\n * Number of stack frames to use for fingerprinting (default: 5)\n */\n stackFramesForFingerprint?: number;\n}\n\nexport class ErrorAggregator {\n private errorGroups: Map<string, ErrorGroup> = new Map();\n private options: Required<ErrorAggregatorOptions>;\n\n constructor(options: ErrorAggregatorOptions = {}) {\n this.options = {\n maxGroups: options.maxGroups ?? 100,\n maxAffectedTraces: options.maxAffectedTraces ?? 10,\n maxAffectedSpans: options.maxAffectedSpans ?? 5,\n stackFramesForFingerprint: options.stackFramesForFingerprint ?? 5,\n };\n }\n\n /**\n * Add an error occurrence to the aggregator\n */\n addError(occurrence: ErrorOccurrence): ErrorGroup {\n const fingerprint = this.generateFingerprint(occurrence);\n const existing = this.errorGroups.get(fingerprint);\n\n if (existing) {\n // Update existing group\n existing.count++;\n existing.lastSeen = occurrence.timestamp;\n\n // Add trace ID if not already present (keep last N)\n if (!existing.affectedTraces.includes(occurrence.traceId)) {\n existing.affectedTraces.push(occurrence.traceId);\n if (existing.affectedTraces.length > this.options.maxAffectedTraces) {\n existing.affectedTraces.shift();\n }\n }\n\n // Add span name if not already present\n if (!existing.affectedSpans.includes(occurrence.spanName)) {\n existing.affectedSpans.push(occurrence.spanName);\n if (existing.affectedSpans.length > this.options.maxAffectedSpans) {\n existing.affectedSpans.shift();\n }\n }\n\n return existing;\n }\n\n // Create new group\n const newGroup: ErrorGroup = {\n fingerprint,\n type: occurrence.error.type,\n message: occurrence.error.message,\n stackTrace: this.normalizeStackTrace(occurrence.error.stackTrace),\n count: 1,\n firstSeen: occurrence.timestamp,\n lastSeen: occurrence.timestamp,\n affectedTraces: [occurrence.traceId],\n affectedSpans: [occurrence.spanName],\n service: occurrence.service,\n attributes: occurrence.attributes,\n };\n\n // Evict oldest group if at capacity\n if (this.errorGroups.size >= this.options.maxGroups) {\n this.evictOldestGroup();\n }\n\n this.errorGroups.set(fingerprint, newGroup);\n return newGroup;\n }\n\n /**\n * Extract errors from a trace and add them to the aggregator\n */\n addErrorsFromTrace(trace: TraceData): ErrorGroup[] {\n const addedGroups: ErrorGroup[] = [];\n\n for (const span of trace.spans) {\n if (span.status.code === 'ERROR') {\n const occurrence = this.extractErrorFromSpan(span, trace);\n if (occurrence) {\n const group = this.addError(occurrence);\n addedGroups.push(group);\n }\n }\n }\n\n return addedGroups;\n }\n\n /**\n * Extract error occurrence from a span\n */\n private extractErrorFromSpan(\n span: SpanData,\n trace: TraceData,\n ): ErrorOccurrence | null {\n // Try to get error info from span attributes or events\n const exceptionEvent = span.events?.find((e) => e.name === 'exception');\n const errorType =\n (span.attributes['exception.type'] as string) ||\n (span.attributes['error.type'] as string) ||\n (exceptionEvent?.attributes?.['exception.type'] as string) ||\n 'Error';\n\n const errorMessage =\n span.status.message ||\n (span.attributes['exception.message'] as string) ||\n (span.attributes['error.message'] as string) ||\n 'Unknown error';\n\n const stackTrace =\n (span.attributes['exception.stacktrace'] as string) ||\n (span.attributes['exception.stack'] as string) ||\n this.extractStackFromEvents(span);\n\n return {\n traceId: trace.traceId,\n spanId: span.spanId,\n spanName: span.name,\n service: trace.service,\n timestamp: span.endTime,\n error: {\n type: errorType,\n message: errorMessage,\n stackTrace,\n },\n attributes: this.extractRelevantAttributes(span.attributes),\n };\n }\n\n /**\n * Extract stack trace from span events (exception events)\n */\n private extractStackFromEvents(span: SpanData): string | undefined {\n if (!span.events) return undefined;\n\n const exceptionEvent = span.events.find((e) => e.name === 'exception');\n if (exceptionEvent?.attributes) {\n return (\n (exceptionEvent.attributes['exception.stacktrace'] as string) ||\n (exceptionEvent.attributes['exception.stack'] as string)\n );\n }\n\n return undefined;\n }\n\n /**\n * Extract relevant attributes for error context\n */\n private extractRelevantAttributes(\n attributes: Record<string, unknown>,\n ): Record<string, unknown> {\n const relevant: Record<string, unknown> = {};\n const keepKeys = [\n 'http.method',\n 'http.url',\n 'http.route',\n 'http.status_code',\n 'db.system',\n 'db.operation',\n 'rpc.method',\n 'rpc.service',\n 'code.function',\n 'code.filepath',\n 'user.id',\n 'operation.name',\n ];\n\n for (const key of keepKeys) {\n if (key in attributes) {\n relevant[key] = attributes[key];\n }\n }\n\n return relevant;\n }\n\n /**\n * Generate a fingerprint for error grouping\n *\n * Uses error type + first N stack frames (normalized)\n */\n private generateFingerprint(occurrence: ErrorOccurrence): string {\n const parts: string[] = [occurrence.error.type];\n\n if (occurrence.error.stackTrace) {\n const frames = this.extractStackFrames(\n occurrence.error.stackTrace,\n this.options.stackFramesForFingerprint,\n );\n parts.push(...frames);\n } else {\n // Fallback to error message if no stack trace\n parts.push(this.normalizeMessage(occurrence.error.message));\n }\n\n // Simple hash function\n return this.simpleHash(parts.join('|'));\n }\n\n /**\n * Extract and normalize stack frames from a stack trace\n */\n private extractStackFrames(stackTrace: string, count: number): string[] {\n const lines = stackTrace.split('\\n');\n const frames: string[] = [];\n\n for (const line of lines) {\n if (frames.length >= count) break;\n\n // Match common stack trace patterns\n const trimmed = line.trim();\n\n // Node.js style: \"at functionName (file:line:col)\"\n const nodeMatch = trimmed.match(/^at\\s+(.+?)\\s+\\((.+?):(\\d+):\\d+\\)$/);\n if (nodeMatch) {\n frames.push(`${nodeMatch[1]}@${this.normalizeFilePath(nodeMatch[2])}`);\n continue;\n }\n\n // Anonymous function style: \"at file:line:col\"\n const anonMatch = trimmed.match(/^at\\s+(.+?):(\\d+):\\d+$/);\n if (anonMatch) {\n frames.push(`anonymous@${this.normalizeFilePath(anonMatch[1])}`);\n continue;\n }\n\n // Browser style: \"functionName@file:line:col\"\n const browserMatch = trimmed.match(/^(.+?)@(.+?):(\\d+):\\d+$/);\n if (browserMatch) {\n frames.push(\n `${browserMatch[1]}@${this.normalizeFilePath(browserMatch[2])}`,\n );\n continue;\n }\n }\n\n return frames;\n }\n\n /**\n * Normalize file path by removing absolute path prefixes and node_modules paths\n */\n private normalizeFilePath(filePath: string): string {\n // Remove node_modules paths (keep package name)\n const nodeModulesMatch = filePath.match(\n /node_modules\\/(@[^/]+\\/[^/]+|[^/]+)/,\n );\n if (nodeModulesMatch) {\n return `[npm]/${nodeModulesMatch[1]}`;\n }\n\n // Remove common absolute path prefixes\n return filePath\n .replace(/^.*?\\/src\\//, 'src/')\n .replace(/^.*?\\/dist\\//, 'dist/')\n .replace(/^.*?\\/lib\\//, 'lib/')\n .replace(/^file:\\/\\//, '');\n }\n\n /**\n * Normalize error message by removing dynamic parts\n */\n private normalizeMessage(message: string): string {\n return (\n message\n // Remove UUIDs\n .replaceAll(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '[UUID]',\n )\n // Remove hex IDs\n .replaceAll(/\\b[0-9a-f]{16,}\\b/gi, '[ID]')\n // Remove numbers\n .replaceAll(/\\b\\d+\\b/g, '[N]')\n // Remove quoted strings\n .replaceAll(/\"[^\"]*\"/g, '\"[STR]\"')\n .replaceAll(/'[^']*'/g, \"'[STR]'\")\n // Truncate long messages\n .slice(0, 200)\n );\n }\n\n /**\n * Normalize stack trace for display\n */\n private normalizeStackTrace(stackTrace?: string): string | undefined {\n if (!stackTrace) return undefined;\n\n const lines = stackTrace.split('\\n').slice(0, 10); // Keep first 10 lines\n return lines.join('\\n');\n }\n\n /**\n * Simple hash function for fingerprinting\n */\n private simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(16).padStart(8, '0');\n }\n\n /**\n * Evict the oldest error group\n */\n private evictOldestGroup(): void {\n let oldest: { fingerprint: string; lastSeen: number } | null = null;\n\n for (const [fingerprint, group] of this.errorGroups) {\n if (!oldest || group.lastSeen < oldest.lastSeen) {\n oldest = { fingerprint, lastSeen: group.lastSeen };\n }\n }\n\n if (oldest) {\n this.errorGroups.delete(oldest.fingerprint);\n }\n }\n\n /**\n * Get all error groups, sorted by most recent\n */\n getErrorGroups(): ErrorGroup[] {\n return [...this.errorGroups.values()].sort(\n (a, b) => b.lastSeen - a.lastSeen,\n );\n }\n\n /**\n * Get error groups sorted by count (most frequent first)\n */\n getErrorGroupsByFrequency(): ErrorGroup[] {\n return [...this.errorGroups.values()].sort(\n (a, b) => b.count - a.count,\n );\n }\n\n /**\n * Get a specific error group by fingerprint\n */\n getErrorGroup(fingerprint: string): ErrorGroup | undefined {\n return this.errorGroups.get(fingerprint);\n }\n\n /**\n * Get error groups for a specific service\n */\n getErrorGroupsByService(service: string): ErrorGroup[] {\n return this.getErrorGroups().filter((g) => g.service === service);\n }\n\n /**\n * Get total error count across all groups\n */\n getTotalErrorCount(): number {\n let total = 0;\n for (const group of this.errorGroups.values()) {\n total += group.count;\n }\n return total;\n }\n\n /**\n * Get error statistics\n */\n getStats(): {\n totalGroups: number;\n totalErrors: number;\n recentErrors: number;\n topErrorTypes: Array<{ type: string; count: number }>;\n } {\n const now = Date.now();\n const oneHourAgo = now - 60 * 60 * 1000;\n\n let recentErrors = 0;\n const typeCount = new Map<string, number>();\n\n for (const group of this.errorGroups.values()) {\n if (group.lastSeen > oneHourAgo) {\n recentErrors += group.count;\n }\n typeCount.set(group.type, (typeCount.get(group.type) || 0) + group.count);\n }\n\n const topErrorTypes = [...typeCount.entries()]\n .map(([type, count]) => ({ type, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5);\n\n return {\n totalGroups: this.errorGroups.size,\n totalErrors: this.getTotalErrorCount(),\n recentErrors,\n topErrorTypes,\n };\n }\n\n /**\n * Clear all error groups\n */\n clear(): void {\n this.errorGroups.clear();\n }\n\n /**\n * Clear old error groups (not seen in given time window)\n */\n clearOlderThan(maxAgeMs: number): number {\n const cutoff = Date.now() - maxAgeMs;\n let cleared = 0;\n\n for (const [fingerprint, group] of this.errorGroups) {\n if (group.lastSeen < cutoff) {\n this.errorGroups.delete(fingerprint);\n cleared++;\n }\n }\n\n return cleared;\n }\n}\n","import type { DevtoolsData } from './types'\n\nexport interface TelemetryLimits {\n maxTraceCount: number\n maxLogCount: number\n maxMetricCount: number\n}\n\nexport interface ResolveTelemetryLimitsArgs {\n maxHistory?: number\n maxTraceCount?: number\n maxLogCount?: number\n maxMetricCount?: number\n env?: NodeJS.ProcessEnv\n}\n\nconst defaultLimit = 100\n\nfunction parseLimit(value: string | undefined): number | undefined {\n if (!value) return undefined\n const parsed = Number.parseInt(value, 10)\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined\n}\n\nexport function resolveTelemetryLimits(\n args: ResolveTelemetryLimitsArgs = {},\n): TelemetryLimits {\n const env = args.env ?? process.env\n const fallback = args.maxHistory ?? defaultLimit\n\n return {\n maxTraceCount:\n args.maxTraceCount ??\n parseLimit(env.AUTOTEL_MAX_TRACE_COUNT) ??\n fallback,\n maxLogCount:\n args.maxLogCount ??\n parseLimit(env.AUTOTEL_MAX_LOG_COUNT) ??\n fallback,\n maxMetricCount:\n args.maxMetricCount ??\n parseLimit(env.AUTOTEL_MAX_METRIC_COUNT) ??\n fallback,\n }\n}\n\nexport function appendWithLimit<T>(items: T[], item: T, limit: number): T[] {\n if (limit <= 0) return []\n const next = [...items, item]\n return next.length > limit ? next.slice(next.length - limit) : next\n}\n\nexport function appendManyWithLimit<T>(\n items: T[],\n incoming: T[],\n limit: number,\n): T[] {\n if (limit <= 0 || incoming.length === 0) return limit <= 0 ? [] : items\n const next = [...items, ...incoming]\n return next.length > limit ? next.slice(next.length - limit) : next\n}\n\nexport function applyTelemetryLimits(\n data: DevtoolsData,\n limits: TelemetryLimits,\n): DevtoolsData {\n return {\n ...data,\n traces: data.traces.slice(-limits.maxTraceCount),\n logs: data.logs.slice(-limits.maxLogCount),\n metrics: data.metrics.slice(-limits.maxMetricCount),\n }\n}\n","// src/server/server.ts\nimport { WebSocketServer, WebSocket } from 'ws'\nimport type { Server as HTTPServer } from 'node:http'\nimport { createServer } from 'node:http'\nimport { ErrorAggregator } from './error-aggregator'\nimport type {\n TraceData,\n LogData,\n MetricData,\n DevtoolsData,\n} from './types'\nimport {\n appendManyWithLimit,\n appendWithLimit,\n resolveTelemetryLimits,\n type TelemetryLimits,\n} from './telemetry-limits'\n\nexport interface DevtoolsServerOptions {\n port?: number\n server?: HTTPServer\n path?: string\n verbose?: boolean\n maxHistory?: number\n maxTraceCount?: number\n maxLogCount?: number\n maxMetricCount?: number\n}\n\nexport class DevtoolsServer {\n private wss: WebSocketServer\n private clients = new Set<WebSocket>()\n private httpServer: HTTPServer\n private traces: TraceData[] = []\n private logs: LogData[] = []\n private metrics: MetricData[] = []\n private errorAggregator = new ErrorAggregator()\n private limits: TelemetryLimits\n private verbose: boolean\n private _port: number\n\n constructor(options: DevtoolsServerOptions = {}) {\n this.limits = resolveTelemetryLimits(options)\n this.verbose = options.verbose ?? false\n this._port = options.port ?? 4318\n\n this.httpServer = options.server ?? createServer()\n this.wss = new WebSocketServer({ server: this.httpServer, path: options.path ?? '/ws' })\n\n this.wss.on('connection', (ws) => {\n this.clients.add(ws)\n this.log(`Client connected (${this.clients.size} total)`)\n\n // Send history to late-connecting clients\n const data = this.getCurrentData()\n if (data.traces.length > 0 || data.logs.length > 0 || data.errors.length > 0) {\n ws.send(JSON.stringify(data))\n }\n\n ws.on('close', () => {\n this.clients.delete(ws)\n this.log(`Client disconnected (${this.clients.size} total)`)\n })\n })\n\n // Only start listening if no external server was provided\n if (!options.server) {\n this.httpServer.listen(this._port, () => {\n const addr = this.httpServer.address()\n if (addr && typeof addr === 'object') this._port = addr.port\n this.log(`WebSocket server listening on port ${this._port}`)\n })\n }\n }\n\n get port(): number {\n const addr = this.httpServer.address()\n if (addr && typeof addr === 'object') return addr.port\n return this._port\n }\n\n get clientCount(): number {\n return this.clients.size\n }\n\n addTrace(trace: TraceData): void {\n // Merge if trace already exists (out-of-order spans)\n const existing = this.traces.find(t => t.traceId === trace.traceId)\n if (existing) {\n const existingSpanIds = new Set(existing.spans.map(s => s.spanId))\n for (const span of trace.spans) {\n if (!existingSpanIds.has(span.spanId)) {\n existing.spans.push(span)\n }\n }\n existing.startTime = Math.min(existing.startTime, trace.startTime)\n existing.endTime = Math.max(existing.endTime, trace.endTime)\n existing.duration = existing.endTime - existing.startTime\n if (trace.status === 'ERROR') existing.status = 'ERROR'\n } else {\n this.traces = appendWithLimit(\n this.traces,\n trace,\n this.limits.maxTraceCount,\n )\n }\n\n this.errorAggregator.addErrorsFromTrace(trace)\n this.broadcast({ traces: [trace], metrics: [], logs: [], errors: this.errorAggregator.getErrorGroups() })\n }\n\n addTraces(traces: TraceData[]): void {\n for (const trace of traces) this.addTrace(trace)\n }\n\n addLog(log: LogData): void {\n this.logs = appendWithLimit(this.logs, log, this.limits.maxLogCount)\n this.broadcast({ traces: [], metrics: [], logs: [log], errors: [] })\n }\n\n addLogs(logs: LogData[]): void {\n this.logs = appendManyWithLimit(this.logs, logs, this.limits.maxLogCount)\n this.broadcast({ traces: [], metrics: [], logs, errors: [] })\n }\n\n addMetric(metric: MetricData): void {\n this.metrics = appendWithLimit(\n this.metrics,\n metric,\n this.limits.maxMetricCount,\n )\n this.broadcast({ traces: [], metrics: [metric], logs: [], errors: [] })\n }\n\n getCurrentData(): DevtoolsData {\n return {\n traces: this.traces,\n metrics: this.metrics,\n logs: this.logs,\n errors: this.errorAggregator.getErrorGroups(),\n }\n }\n\n clearData(): void {\n this.traces = []\n this.logs = []\n this.metrics = []\n this.errorAggregator.clear()\n }\n\n private broadcast(data: DevtoolsData): void {\n const msg = JSON.stringify(data)\n for (const client of this.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(msg)\n }\n }\n }\n\n private log(message: string): void {\n if (this.verbose) console.log(`[autotel-devtools] ${message}`)\n }\n\n async close(): Promise<void> {\n for (const client of this.clients) client.close()\n this.clients.clear()\n this.wss.close()\n await new Promise<void>((resolve) => this.httpServer.close(() => resolve()))\n }\n}\n","/**\n * OpenTelemetry SpanExporter that streams spans to DevtoolsServer\n */\n\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult, ExportResultCode } from '@opentelemetry/core';\nimport type { DevtoolsServer } from './server';\nimport type { TraceData, SpanData } from './types';\n\nexport class DevtoolsSpanExporter implements SpanExporter {\n private server: DevtoolsServer;\n private serviceName: string;\n\n constructor(server: DevtoolsServer, serviceName: string = 'unknown-service') {\n this.server = server;\n this.serviceName = serviceName;\n }\n\n /**\n * Export spans to the WebSocket server\n */\n async export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): Promise<void> {\n // Immediately call the callback to unblock the span processor\n // Then process the spans asynchronously\n resultCallback({ code: 0 as ExportResultCode });\n\n // Process spans asynchronously without blocking\n Promise.resolve().then(() => {\n try {\n console.log(`[Autotel Exporter] Exporting ${spans.length} span(s)`);\n\n // Group spans by trace ID\n const traceMap = new Map<string, ReadableSpan[]>();\n\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n if (!traceMap.has(traceId)) {\n traceMap.set(traceId, []);\n }\n traceMap.get(traceId)!.push(span);\n }\n\n // Convert each trace and send to server\n for (const [traceId, traceSpans] of traceMap) {\n const trace = this.convertToTraceData(traceId, traceSpans);\n console.log(\n `[Autotel Exporter] Adding trace ${traceId.slice(0, 16)} with ${traceSpans.length} spans`,\n );\n this.server.addTrace(trace);\n }\n } catch (error) {\n console.error('[Autotel Exporter] Export error:', error);\n }\n });\n }\n\n /**\n * Shutdown the exporter\n */\n async shutdown(): Promise<void> {\n // Nothing to clean up\n }\n\n /**\n * Force flush any buffered spans\n */\n async forceFlush(): Promise<void> {\n // Nothing to flush\n }\n\n /**\n * Convert OpenTelemetry spans to TraceData\n */\n private convertToTraceData(\n traceId: string,\n spans: ReadableSpan[],\n ): TraceData {\n // Convert spans\n const spanData: SpanData[] = spans.map((span) => this.convertSpan(span));\n\n // Find root span (no parent)\n const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];\n\n // Sort spans by start time\n spanData.sort((a, b) => a.startTime - b.startTime);\n\n const startTime = Math.min(...spanData.map((s) => s.startTime));\n const endTime = Math.max(...spanData.map((s) => s.endTime));\n\n // Determine overall status (ERROR if any span errored)\n const hasError = spanData.some((s) => s.status.code === 'ERROR');\n const status = hasError ? 'ERROR' : 'OK';\n\n return {\n traceId,\n correlationId: traceId.slice(0, 16), // First 16 chars\n rootSpan,\n spans: spanData,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: status as 'OK' | 'ERROR' | 'UNSET',\n service: this.serviceName,\n };\n }\n\n /**\n * Convert OpenTelemetry span to SpanData\n */\n private convertSpan(span: ReadableSpan): SpanData {\n const spanContext = span.spanContext();\n const startTime = span.startTime[0] * 1000 + span.startTime[1] / 1_000_000;\n const endTime = span.endTime[0] * 1000 + span.endTime[1] / 1_000_000;\n\n // Convert attributes\n const attributes: Record<string, any> = {};\n for (const [key, value] of Object.entries(span.attributes)) {\n attributes[key] = value;\n }\n\n // Convert status\n const statusCode = span.status.code;\n let status: 'OK' | 'ERROR' | 'UNSET';\n switch (statusCode) {\n case 0: {\n status = 'UNSET';\n break;\n }\n case 1: {\n status = 'OK';\n break;\n }\n case 2: {\n status = 'ERROR';\n break;\n }\n default: {\n status = 'UNSET';\n }\n }\n\n // Convert events\n const events = span.events.map((event) => ({\n name: event.name,\n timestamp: event.time[0] * 1000 + event.time[1] / 1_000_000,\n attributes: event.attributes\n ? Object.fromEntries(Object.entries(event.attributes))\n : undefined,\n }));\n\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n parentSpanId: (span as any).parentSpanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTime,\n endTime,\n duration: endTime - startTime,\n attributes,\n status: {\n code: status,\n message: span.status.message,\n },\n events: events.length > 0 ? events : undefined,\n };\n }\n\n /**\n * Convert OpenTelemetry SpanKind to string\n */\n private convertSpanKind(\n kind: number,\n ): 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER' {\n switch (kind) {\n case 0: {\n return 'INTERNAL';\n }\n case 1: {\n return 'SERVER';\n }\n case 2: {\n return 'CLIENT';\n }\n case 3: {\n return 'PRODUCER';\n }\n case 4: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n }\n}\n","export function getResourceName(\n resource: Record<string, unknown> | undefined,\n fallback = 'unknown',\n): string {\n if (!resource) return fallback\n\n const candidates = [\n resource['service.name'],\n resource['service.namespace'],\n resource['deployment.environment.name'],\n resource['host.name'],\n resource['container.name'],\n resource['process.executable.name'],\n ]\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim().length > 0) {\n return candidate\n }\n }\n\n return fallback\n}\n","/**\n * Log record exporter that sends OTel logs to a Devtools server HTTP ingest.\n * Use with BatchLogRecordProcessor when you want to view logs in the Autotel widget/extension.\n *\n * @example\n * ```typescript\n * import { BatchLogRecordProcessor } from '@opentelemetry/sdk-logs';\n * import { DevtoolsLogExporter } from '@autotel/devtools/server';\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * logRecordProcessors: [\n * new BatchLogRecordProcessor(\n * new DevtoolsLogExporter({ endpoint: 'http://localhost:8082' })\n * ),\n * ],\n * });\n * ```\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport type { ReadableLogRecord } from '@opentelemetry/sdk-logs';\nimport type { LogData } from './types';\nimport { getResourceName } from './resource-utils';\n\nexport interface DevtoolsLogExporterOptions {\n /**\n * Base URL of the Devtools HTTP ingest server\n * e.g. 'http://localhost:8082'\n */\n endpoint: string;\n\n /**\n * API key for authentication (if server requires it)\n */\n apiKey?: string;\n\n /**\n * Request timeout in milliseconds (default: 5000)\n */\n timeout?: number;\n}\n\nconst defaultTimeout = 5000;\n\nfunction hrTimeToMs(hrTime: [number, number]): number {\n return hrTime[0] * 1000 + hrTime[1] / 1e6;\n}\n\nfunction bodyToPayload(body: ReadableLogRecord['body']): string | Record<string, unknown> {\n if (body === undefined) return '';\n if (typeof body === 'string') return body;\n if (typeof body === 'object' && body !== null) return body as Record<string, unknown>;\n return String(body);\n}\n\nfunction recordToLogData(record: ReadableLogRecord, index: number): LogData {\n const id = `log-${Date.now()}-${index}-${Math.random().toString(36).slice(2, 9)}`;\n const timestamp = hrTimeToMs(record.hrTime);\n const body = bodyToPayload(record.body);\n const attributes = record.attributes && Object.keys(record.attributes).length > 0\n ? (record.attributes as Record<string, unknown>)\n : undefined;\n const resource = record.resource?.attributes && Object.keys(record.resource.attributes).length > 0\n ? (record.resource.attributes as Record<string, unknown>)\n : undefined;\n\n const log: LogData = {\n id,\n resourceName: getResourceName(resource),\n severityText: record.severityText,\n severityNumber: record.severityNumber,\n body,\n timestamp,\n attributes,\n resource,\n };\n\n if (record.spanContext) {\n log.traceId = record.spanContext.traceId;\n log.spanId = record.spanContext.spanId;\n }\n\n return log;\n}\n\nexport class DevtoolsLogExporter implements LogRecordExporter {\n private endpoint: string;\n private apiKey: string;\n private timeout: number;\n private isShutdown = false;\n\n constructor(options: DevtoolsLogExporterOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, '');\n this.apiKey = options.apiKey ?? '';\n this.timeout = options.timeout ?? defaultTimeout;\n }\n\n export(logs: ReadableLogRecord[], resultCallback: (result: ExportResult) => void): void {\n if (this.isShutdown || logs.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS });\n return;\n }\n\n const payload = { logs: logs.map((r, i) => recordToLogData(r, i)) };\n const url = `${this.endpoint}/ingest/logs`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.apiKey) {\n headers['Authorization'] = `Bearer ${this.apiKey}`;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n })\n .then((res) => {\n clearTimeout(timeoutId);\n if (!res.ok) {\n throw new Error(`Devtools log ingest failed: ${res.status} ${res.statusText}`);\n }\n resultCallback({ code: ExportResultCode.SUCCESS });\n })\n .catch((err) => {\n clearTimeout(timeoutId);\n resultCallback({\n code: ExportResultCode.FAILED,\n error: err instanceof Error ? err : new Error(String(err)),\n });\n });\n }\n\n shutdown(): Promise<void> {\n this.isShutdown = true;\n return Promise.resolve();\n }\n\n forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n}\n","/**\n * Remote Span Exporter for sending traces to a hosted DevtoolsServer\n *\n * Use this when the DevtoolsServer is running on a different machine/process.\n *\n * @example\n * ```typescript\n * import { DevtoolsRemoteExporter } from '@autotel/devtools/server';\n * import { init } from 'autotel';\n *\n * init({\n * service: 'my-app',\n * spanExporters: [\n * new DevtoolsRemoteExporter({\n * endpoint: 'https://autotel.mycompany.com',\n * apiKey: process.env.AUTOTEL_API_KEY,\n * })\n * ]\n * });\n * ```\n */\n\nimport type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { ExportResult, ExportResultCode } from '@opentelemetry/core';\nimport type { TraceData, SpanData } from './types';\n\nexport interface DevtoolsRemoteExporterOptions {\n /**\n * Base URL of the Devtools server\n * e.g., 'https://autotel.mycompany.com' or 'http://localhost:8082'\n */\n endpoint: string;\n\n /**\n * API key for authentication (if server requires it)\n */\n apiKey?: string;\n\n /**\n * Service name for traces (default: 'unknown-service')\n */\n serviceName?: string;\n\n /**\n * Request timeout in milliseconds (default: 5000)\n */\n timeout?: number;\n\n /**\n * Retry failed requests (default: true)\n */\n retry?: boolean;\n\n /**\n * Number of retries (default: 3)\n */\n retryCount?: number;\n\n /**\n * Retry delay in milliseconds (default: 1000)\n */\n retryDelay?: number;\n\n /**\n * Enable verbose logging (default: false)\n */\n verbose?: boolean;\n}\n\nexport class DevtoolsRemoteExporter implements SpanExporter {\n private options: Required<DevtoolsRemoteExporterOptions>;\n private pendingExports: Promise<void>[] = [];\n\n constructor(options: DevtoolsRemoteExporterOptions) {\n this.options = {\n endpoint: options.endpoint.replace(/\\/$/, ''), // Remove trailing slash\n apiKey: options.apiKey ?? '',\n serviceName: options.serviceName ?? 'unknown-service',\n timeout: options.timeout ?? 5000,\n retry: options.retry ?? true,\n retryCount: options.retryCount ?? 3,\n retryDelay: options.retryDelay ?? 1000,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Export spans to the remote server\n */\n async export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): Promise<void> {\n // Start export asynchronously\n const exportPromise = this.doExport(spans)\n .then(() => {\n resultCallback({ code: 0 as ExportResultCode }); // SUCCESS\n })\n .catch((error) => {\n this.log(`Export failed: ${error.message}`);\n resultCallback({ code: 1 as ExportResultCode }); // FAILED\n });\n\n this.pendingExports.push(exportPromise);\n\n // Clean up completed exports\n exportPromise.finally(() => {\n const index = this.pendingExports.indexOf(exportPromise);\n if (index !== -1) {\n this.pendingExports.splice(index, 1);\n }\n });\n }\n\n private async doExport(spans: ReadableSpan[]): Promise<void> {\n if (spans.length === 0) return;\n\n this.log(`Exporting ${spans.length} span(s) to ${this.options.endpoint}`);\n\n // Group spans by trace ID and convert\n const traceMap = new Map<string, ReadableSpan[]>();\n for (const span of spans) {\n const traceId = span.spanContext().traceId;\n if (!traceMap.has(traceId)) {\n traceMap.set(traceId, []);\n }\n traceMap.get(traceId)!.push(span);\n }\n\n const traces: TraceData[] = [];\n for (const [traceId, traceSpans] of traceMap) {\n traces.push(this.convertToTraceData(traceId, traceSpans));\n }\n\n // Send with retry\n await this.sendWithRetry({ traces });\n }\n\n private async sendWithRetry(payload: { traces: TraceData[] }): Promise<void> {\n let lastError: Error | null = null;\n const maxAttempts = this.options.retry ? this.options.retryCount : 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.send(payload);\n return;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n this.log(\n `Attempt ${attempt}/${maxAttempts} failed: ${lastError.message}`,\n );\n\n if (attempt < maxAttempts) {\n await this.sleep(this.options.retryDelay * attempt); // Exponential backoff\n }\n }\n }\n\n throw lastError || new Error('Export failed');\n }\n\n private async send(payload: { traces: TraceData[] }): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this.options.timeout,\n );\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.options.apiKey) {\n headers['Authorization'] = `Bearer ${this.options.apiKey}`;\n }\n\n const response = await fetch(`${this.options.endpoint}/ingest/traces`, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`HTTP ${response.status}: ${text}`);\n }\n\n const result = (await response.json()) as { processed: number };\n this.log(`Successfully sent ${result.processed} trace(s)`);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Shutdown the exporter, waiting for pending exports\n */\n async shutdown(): Promise<void> {\n this.log('Shutting down, waiting for pending exports...');\n await Promise.allSettled(this.pendingExports);\n this.log('Shutdown complete');\n }\n\n /**\n * Force flush pending exports\n */\n async forceFlush(): Promise<void> {\n await Promise.allSettled(this.pendingExports);\n }\n\n private convertToTraceData(\n traceId: string,\n spans: ReadableSpan[],\n ): TraceData {\n const spanData: SpanData[] = spans.map((span) => this.convertSpan(span));\n\n // Find root span (no parent)\n const rootSpan = spanData.find((s) => !s.parentSpanId) || spanData[0];\n\n // Sort spans by start time\n spanData.sort((a, b) => a.startTime - b.startTime);\n\n const startTime = Math.min(...spanData.map((s) => s.startTime));\n const endTime = Math.max(...spanData.map((s) => s.endTime));\n\n const hasError = spanData.some((s) => s.status.code === 'ERROR');\n const status = hasError ? 'ERROR' : 'OK';\n\n return {\n traceId,\n correlationId: traceId.slice(0, 16),\n rootSpan,\n spans: spanData,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: status as 'OK' | 'ERROR' | 'UNSET',\n service: this.options.serviceName,\n };\n }\n\n private convertSpan(span: ReadableSpan): SpanData {\n const spanContext = span.spanContext();\n const startTime = span.startTime[0] * 1000 + span.startTime[1] / 1_000_000;\n const endTime = span.endTime[0] * 1000 + span.endTime[1] / 1_000_000;\n\n const attributes: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(span.attributes)) {\n attributes[key] = value;\n }\n\n let status: 'OK' | 'ERROR' | 'UNSET';\n switch (span.status.code) {\n case 0: {\n status = 'UNSET';\n break;\n }\n case 1: {\n status = 'OK';\n break;\n }\n case 2: {\n status = 'ERROR';\n break;\n }\n default: {\n status = 'UNSET';\n }\n }\n\n const events = span.events.map((event) => ({\n name: event.name,\n timestamp: event.time[0] * 1000 + event.time[1] / 1_000_000,\n attributes: event.attributes\n ? Object.fromEntries(Object.entries(event.attributes))\n : undefined,\n }));\n\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n parentSpanId: (span as any).parentSpanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTime,\n endTime,\n duration: endTime - startTime,\n attributes,\n status: {\n code: status,\n message: span.status.message,\n },\n events: events.length > 0 ? events : undefined,\n };\n }\n\n private convertSpanKind(\n kind: number,\n ): 'INTERNAL' | 'SERVER' | 'CLIENT' | 'PRODUCER' | 'CONSUMER' {\n switch (kind) {\n case 0: {\n return 'INTERNAL';\n }\n case 1: {\n return 'SERVER';\n }\n case 2: {\n return 'CLIENT';\n }\n case 3: {\n return 'PRODUCER';\n }\n case 4: {\n return 'CONSUMER';\n }\n default: {\n return 'INTERNAL';\n }\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(message: string): void {\n if (this.options.verbose) {\n console.log(`[Devtools Remote Exporter] ${message}`);\n }\n }\n}\n","// src/server/otlp.ts\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport type { SpanData, TraceData, LogData } from './types'\nimport { getResourceName } from './resource-utils'\n\ntype OtlpAnyValue = {\n stringValue?: string\n boolValue?: boolean\n intValue?: string | number\n doubleValue?: number\n bytesValue?: string\n arrayValue?: { values?: OtlpAnyValue[] }\n kvlistValue?: { values?: OtlpKeyValue[] }\n}\n\ntype OtlpKeyValue = { key: string; value?: OtlpAnyValue }\n\nfunction resolveOtlpValue(v?: OtlpAnyValue): unknown {\n if (!v) return undefined\n if (v.stringValue !== undefined) return v.stringValue\n if (v.boolValue !== undefined) return v.boolValue\n if (v.intValue !== undefined) return typeof v.intValue === 'string' ? Number(v.intValue) : v.intValue\n if (v.doubleValue !== undefined) return v.doubleValue\n if (v.bytesValue !== undefined) return v.bytesValue\n if (v.arrayValue?.values) return v.arrayValue.values.map(resolveOtlpValue)\n if (v.kvlistValue?.values) return flattenAttributes(v.kvlistValue.values)\n return undefined\n}\n\nfunction flattenAttributes(attrs?: OtlpKeyValue[]): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n if (!attrs) return out\n for (const { key, value } of attrs) {\n out[key] = resolveOtlpValue(value)\n }\n return out\n}\n\nfunction nanoToMs(nano?: string): number {\n if (!nano) return 0\n return Number(BigInt(nano) / 1_000_000n)\n}\n\nconst SPAN_KIND_MAP: Record<number | string, SpanData['kind']> = {\n 0: 'INTERNAL', 1: 'INTERNAL', 2: 'SERVER', 3: 'CLIENT', 4: 'PRODUCER', 5: 'CONSUMER',\n SPAN_KIND_INTERNAL: 'INTERNAL', SPAN_KIND_SERVER: 'SERVER',\n SPAN_KIND_CLIENT: 'CLIENT', SPAN_KIND_PRODUCER: 'PRODUCER', SPAN_KIND_CONSUMER: 'CONSUMER',\n}\n\nfunction normalizeHexId(id?: string): string {\n if (!id) return ''\n // Only attempt base64 decode for strings that look like base64-encoded binary IDs\n // (length 24 or 28 chars for 16/32-byte IDs, valid base64 chars, not plain hex)\n const isBase64Like = /^[A-Za-z0-9+/=]+$/.test(id) && !(/^[0-9a-f]+$/i.test(id))\n const isLikelyBase64Id = isBase64Like && (id.length === 24 || id.length === 28 || id.length === 44 || id.length === 48)\n if (isLikelyBase64Id) {\n try {\n const bytes = Buffer.from(id, 'base64')\n return bytes.toString('hex')\n } catch { /* fall through */ }\n }\n return id\n}\n\nexport function parseOtlpTraces(payload: unknown): TraceData[] {\n if (!payload || typeof payload !== 'object') return []\n const { resourceSpans } = payload as any\n if (!Array.isArray(resourceSpans) || resourceSpans.length === 0) return []\n\n const traceMap = new Map<string, { spans: SpanData[]; service: string }>()\n\n for (const rs of resourceSpans) {\n const resourceAttrs = flattenAttributes(rs.resource?.attributes)\n const service = String(resourceAttrs['service.name'] || 'unknown')\n const scopeSpans = rs.scopeSpans || []\n\n for (const ss of scopeSpans) {\n for (const span of ss.spans || []) {\n const traceId = normalizeHexId(span.traceId)\n if (!traceId) continue\n\n const startMs = nanoToMs(span.startTimeUnixNano)\n const endMs = nanoToMs(span.endTimeUnixNano)\n const statusCode = span.status?.code\n let status: SpanData['status']['code'] = 'UNSET'\n if (statusCode === 1 || statusCode === 'STATUS_CODE_OK') status = 'OK'\n if (statusCode === 2 || statusCode === 'STATUS_CODE_ERROR') status = 'ERROR'\n\n const spanData: SpanData = {\n traceId,\n spanId: normalizeHexId(span.spanId),\n parentSpanId: normalizeHexId(span.parentSpanId) || undefined,\n name: span.name || 'unknown',\n kind: SPAN_KIND_MAP[span.kind ?? 0] || 'INTERNAL',\n startTime: startMs,\n endTime: endMs,\n duration: endMs - startMs,\n attributes: { ...resourceAttrs, ...flattenAttributes(span.attributes) } as Record<string, any>,\n status: { code: status, message: span.status?.message },\n events: (span.events || []).map((e: any) => ({\n name: e.name || '',\n timestamp: nanoToMs(e.timeUnixNano),\n attributes: flattenAttributes(e.attributes) as Record<string, any>,\n })),\n }\n\n const existing = traceMap.get(traceId)\n if (existing) {\n existing.spans.push(spanData)\n } else {\n traceMap.set(traceId, { spans: [spanData], service })\n }\n }\n }\n }\n\n const traces: TraceData[] = []\n for (const [traceId, { spans, service }] of traceMap) {\n const sorted = spans.sort((a, b) => a.startTime - b.startTime)\n const rootSpan = sorted.find(s => !s.parentSpanId) || sorted[0]\n const startTime = Math.min(...sorted.map(s => s.startTime))\n const endTime = Math.max(...sorted.map(s => s.endTime))\n const hasError = sorted.some(s => s.status.code === 'ERROR')\n\n traces.push({\n traceId,\n correlationId: traceId.slice(0, 16),\n rootSpan,\n spans: sorted,\n startTime,\n endTime,\n duration: endTime - startTime,\n status: hasError ? 'ERROR' : 'OK',\n service,\n })\n }\n\n return traces\n}\n\nexport function parseOtlpLogs(payload: unknown): LogData[] {\n if (!payload || typeof payload !== 'object') return []\n const { resourceLogs } = payload as any\n if (!Array.isArray(resourceLogs)) return []\n\n const logs: LogData[] = []\n for (const rl of resourceLogs) {\n const resourceAttrs = flattenAttributes(rl.resource?.attributes)\n for (const sl of rl.scopeLogs || []) {\n for (const rec of sl.logRecords || []) {\n const timestamp = nanoToMs(rec.timeUnixNano || rec.observedTimeUnixNano)\n const traceId = normalizeHexId(rec.traceId) || undefined\n const spanId = normalizeHexId(rec.spanId) || undefined\n const body = rec.body ? resolveOtlpValue(rec.body) : ''\n\n logs.push({\n id: `${traceId || 'no-trace'}:${spanId || 'no-span'}:${timestamp}:${rec.severityNumber || 0}`,\n traceId,\n spanId,\n resourceName: getResourceName(resourceAttrs as Record<string, unknown>),\n severityText: rec.severityText,\n severityNumber: rec.severityNumber,\n body: typeof body === 'string' ? body : (body as Record<string, unknown>),\n timestamp,\n attributes: flattenAttributes(rec.attributes) as Record<string, unknown>,\n resource: resourceAttrs as Record<string, unknown>,\n })\n }\n }\n }\n\n return logs\n}\n\nexport function countOtlpMetrics(payload: unknown): number {\n if (!payload || typeof payload !== 'object') return 0\n const { resourceMetrics } = payload as any\n if (!Array.isArray(resourceMetrics)) return 0\n let count = 0\n for (const rm of resourceMetrics) {\n for (const sm of rm.scopeMetrics || []) {\n count += (sm.metrics || []).length\n }\n }\n return count\n}\n\nexport async function readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', () => {\n try {\n resolve(JSON.parse(Buffer.concat(chunks).toString()))\n } catch {\n reject(new Error('Invalid JSON'))\n }\n })\n req.on('error', reject)\n })\n}\n\nexport function sendJson(res: ServerResponse, status: number, data: Record<string, unknown>): void {\n const body = JSON.stringify(data)\n res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) })\n res.end(body)\n}\n","// src/server/http.ts\nimport { createServer, type IncomingMessage, type ServerResponse, type Server } from 'node:http'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { parseOtlpTraces, parseOtlpLogs, countOtlpMetrics, readJsonBody, sendJson } from './otlp'\nimport type { DevtoolsServer } from './server'\n\nexport interface HttpServerOptions {\n port?: number\n host?: string\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 5; i++) {\n if (existsSync(resolve(dir, 'package.json'))) return dir\n dir = dirname(dir)\n }\n return dir\n}\n\nconst FULLPAGE_HTML = `<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>autotel-devtools</title><style>*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;width:100%;overflow:hidden}</style></head><body><script src=\"/widget.js?mode=fullpage\"></script></body></html>`\n\nlet cachedWidgetJs: string | null = null\nfunction getWidgetJs(): string {\n if (!cachedWidgetJs) {\n const pkgRoot = findPackageRoot()\n const candidates = [\n resolve(pkgRoot, 'dist', 'widget.global.js'),\n resolve(pkgRoot, 'widget.global.js'),\n ]\n for (const candidate of candidates) {\n try {\n cachedWidgetJs = readFileSync(candidate, 'utf8')\n break\n } catch { /* try next */ }\n }\n if (!cachedWidgetJs) {\n cachedWidgetJs = '// widget bundle not found - run pnpm build first'\n }\n }\n return cachedWidgetJs\n}\n\nexport function attachDevtoolsRoutes(httpServer: Server, devtools: DevtoolsServer): void {\n httpServer.on('request', async (req: IncomingMessage, res: ServerResponse) => {\n // CORS headers\n res.setHeader('Access-Control-Allow-Origin', '*')\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS')\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type')\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204)\n res.end()\n return\n }\n\n const url = req.url || '/'\n\n // GET / — fullpage HTML\n if (req.method === 'GET' && url === '/') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': Buffer.byteLength(FULLPAGE_HTML) })\n res.end(FULLPAGE_HTML)\n return\n }\n\n // GET /widget.js — widget bundle\n if (req.method === 'GET' && url.startsWith('/widget.js')) {\n const js = getWidgetJs()\n res.writeHead(200, { 'Content-Type': 'application/javascript; charset=utf-8', 'Content-Length': Buffer.byteLength(js) })\n res.end(js)\n return\n }\n\n // GET /healthz\n if (req.method === 'GET' && url === '/healthz') {\n sendJson(res, 200, { ok: true, clients: devtools.clientCount })\n return\n }\n\n // GET /v1/traces — read back what the collector has actually received.\n // This is the verification primitive for tests: poll the collector over\n // HTTP and assert receipt, instead of only asserting \"the client tried to\n // send\" (which a browser-level route intercept can fake). Bypasses the UI's\n // WebSocket entirely.\n if (req.method === 'GET' && url === '/v1/traces') {\n const data = devtools.getCurrentData()\n sendJson(res, 200, { traces: data.traces, count: data.traces.length })\n return\n }\n\n // DELETE /v1/traces — clear captured telemetry (test isolation / reset).\n // Clears traces, logs, metrics and aggregated errors so each test starts clean.\n if (req.method === 'DELETE' && url === '/v1/traces') {\n devtools.clearData()\n sendJson(res, 200, { cleared: true })\n return\n }\n\n // POST /v1/traces\n if (req.method === 'POST' && url === '/v1/traces') {\n try {\n const payload = await readJsonBody(req)\n const traces = parseOtlpTraces(payload)\n devtools.addTraces(traces)\n sendJson(res, 200, { acceptedTraces: traces.length })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n // POST /v1/logs\n if (req.method === 'POST' && url === '/v1/logs') {\n try {\n const payload = await readJsonBody(req)\n const logs = parseOtlpLogs(payload)\n devtools.addLogs(logs)\n sendJson(res, 200, { acceptedLogs: logs.length })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n // POST /v1/metrics\n if (req.method === 'POST' && url === '/v1/metrics') {\n try {\n const payload = await readJsonBody(req)\n const count = countOtlpMetrics(payload)\n sendJson(res, 200, { acceptedMetrics: count })\n } catch (e) {\n sendJson(res, 400, { error: 'Invalid OTLP JSON', message: e instanceof Error ? e.message : String(e) })\n }\n return\n }\n\n sendJson(res, 404, { error: 'Not found' })\n })\n}\n\nexport function createDevtoolsHttpServer(devtools: DevtoolsServer, _options: HttpServerOptions = {}): Server {\n const server = createServer()\n attachDevtoolsRoutes(server, devtools)\n return server\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-devtools",
3
- "version": "3.0.1",
3
+ "version": "5.0.0",
4
4
  "description": "Standalone OTLP receiver with web UI for local development",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -91,7 +91,7 @@
91
91
  "vitest-mock-extended": "^4.0.0"
92
92
  },
93
93
  "peerDependencies": {
94
- "autotel": "3.1.1"
94
+ "autotel": "3.3.0"
95
95
  },
96
96
  "peerDependenciesMeta": {
97
97
  "autotel": {