{"version":3,"sources":["../src/agent/tracing/tracer.ts","../src/agent/tracing/exporters/console.ts","../src/agent/tracing/exporters/otel.ts","../src/agent/tracing/exporters/edgework.ts"],"names":[],"mappings":"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","file":"chunk-ST2K7TOA.mjs","sourcesContent":["/**\n * EADK Tracer\n *\n * Automatic trace collection with span management.\n * Combines OpenAI Agents SDK tracing with OpenTelemetry export.\n */\n\nimport type { Span, SpanType, SpanEvent, TraceExporter } from '../core/types';\n\nfunction createTraceId(): string {\n  return crypto.randomUUID().replace(/-/g, '');\n}\n\nfunction createSpanId(): string {\n  return crypto.randomUUID().replace(/-/g, '').slice(0, 16);\n}\n\n/**\n * Tracer collects spans during agent execution and exports them.\n */\nexport class Tracer {\n  private spans: Map<string, Span> = new Map();\n  private exporters: TraceExporter[] = [];\n  private traceId: string;\n  private enabled: boolean;\n\n  constructor(options?: { exporters?: TraceExporter[]; enabled?: boolean }) {\n    this.exporters = options?.exporters ?? [];\n    this.enabled = options?.enabled ?? true;\n    this.traceId = createTraceId();\n  }\n\n  /**\n   * Start a new span.\n   */\n  startSpan(options: {\n    name: string;\n    type: SpanType;\n    parentId?: string;\n    attributes?: Record<string, unknown>;\n  }): Span {\n    const span: Span = {\n      id: createSpanId(),\n      parentId: options.parentId,\n      traceId: this.traceId,\n      type: options.type,\n      name: options.name,\n      startTime: Date.now(),\n      attributes: options.attributes ?? {},\n      events: [],\n      status: 'unset',\n    };\n\n    if (this.enabled) {\n      this.spans.set(span.id, span);\n    }\n\n    return span;\n  }\n\n  /**\n   * End a span and export it.\n   */\n  endSpan(spanId: string, status?: 'ok' | 'error', error?: Error): void {\n    const span = this.spans.get(spanId);\n    if (!span) return;\n\n    span.endTime = Date.now();\n    span.status = status ?? 'ok';\n    if (error) span.error = error;\n\n    // Export to all exporters\n    for (const exporter of this.exporters) {\n      exporter.exportSpan(span);\n    }\n  }\n\n  /**\n   * Add an event to a span.\n   */\n  addSpanEvent(\n    spanId: string,\n    name: string,\n    attributes?: Record<string, unknown>\n  ): void {\n    const span = this.spans.get(spanId);\n    if (!span) return;\n\n    span.events.push({\n      name,\n      timestamp: Date.now(),\n      attributes,\n    });\n  }\n\n  /**\n   * Set span attributes.\n   */\n  setSpanAttributes(spanId: string, attributes: Record<string, unknown>): void {\n    const span = this.spans.get(spanId);\n    if (!span) return;\n\n    Object.assign(span.attributes, attributes);\n  }\n\n  /**\n   * Get all collected spans.\n   */\n  getSpans(): Span[] {\n    return [...this.spans.values()];\n  }\n\n  /**\n   * Get a specific span by ID.\n   */\n  getSpan(spanId: string): Span | undefined {\n    return this.spans.get(spanId);\n  }\n\n  /**\n   * Get the current trace ID.\n   */\n  getTraceId(): string {\n    return this.traceId;\n  }\n\n  /**\n   * Flush all exporters.\n   */\n  async flush(): Promise<void> {\n    await Promise.all(this.exporters.map((e) => e.flush()));\n  }\n\n  /**\n   * Clear all spans (for testing).\n   */\n  clear(): void {\n    this.spans.clear();\n  }\n\n  /**\n   * Add an exporter.\n   */\n  addExporter(exporter: TraceExporter): void {\n    this.exporters.push(exporter);\n  }\n}\n\n/**\n * Global tracer instance (singleton for convenience).\n */\nlet globalTracer: Tracer | null = null;\n\nexport function getGlobalTracer(): Tracer {\n  if (!globalTracer) {\n    globalTracer = new Tracer();\n  }\n  return globalTracer;\n}\n\nexport function setGlobalTracer(tracer: Tracer): void {\n  globalTracer = tracer;\n}\n","/**\n * Console Trace Exporter\n *\n * Logs spans to the console for development and debugging.\n */\n\nimport type { Span, TraceExporter } from '../../core/types';\n\nexport class ConsoleExporter implements TraceExporter {\n  private verbose: boolean;\n\n  constructor(options?: { verbose?: boolean }) {\n    this.verbose = options?.verbose ?? false;\n  }\n\n  exportSpan(span: Span): void {\n    const duration = span.endTime\n      ? `${span.endTime - span.startTime}ms`\n      : 'ongoing';\n    const status =\n      span.status === 'error' ? '!' : span.status === 'ok' ? '+' : '?';\n\n    const prefix = `[${status}] [${span.type}]`;\n    const summary = `${prefix} ${span.name} (${duration})`;\n\n    if (span.status === 'error') {\n      console.error(summary, span.error?.message ?? '');\n    } else {\n      console.log(summary);\n    }\n\n    if (this.verbose) {\n      if (Object.keys(span.attributes).length > 0) {\n        console.log('  attributes:', span.attributes);\n      }\n      if (span.events.length > 0) {\n        for (const event of span.events) {\n          console.log(`  event: ${event.name}`, event.attributes ?? '');\n        }\n      }\n    }\n  }\n\n  async flush(): Promise<void> {\n    // Console doesn't need flushing\n  }\n}\n","/**\n * OpenTelemetry Trace Exporter\n *\n * Exports spans in OpenTelemetry-compatible format.\n * Can be configured to send to any OTel collector endpoint.\n */\n\nimport type { Span, TraceExporter } from '../../core/types';\n\nexport interface OTelExporterConfig {\n  /** OTel collector endpoint */\n  endpoint: string;\n  /** Service name */\n  serviceName?: string;\n  /** Additional headers */\n  headers?: Record<string, string>;\n  /** Batch size before flush */\n  batchSize?: number;\n}\n\nexport class OpenTelemetryExporter implements TraceExporter {\n  private config: OTelExporterConfig;\n  private buffer: Span[] = [];\n  private batchSize: number;\n\n  constructor(config: OTelExporterConfig) {\n    this.config = config;\n    this.batchSize = config.batchSize ?? 100;\n  }\n\n  exportSpan(span: Span): void {\n    this.buffer.push(span);\n    if (this.buffer.length >= this.batchSize) {\n      // Fire-and-forget flush\n      this.flush().catch(() => {\n        /* fire-and-forget */\n      });\n    }\n  }\n\n  async flush(): Promise<void> {\n    if (this.buffer.length === 0) return;\n\n    const spans = [...this.buffer];\n    this.buffer = [];\n\n    const otelSpans = spans.map((span) => this.toOTelSpan(span));\n\n    try {\n      const response = await fetch(this.config.endpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          ...(this.config.headers ?? {}),\n        },\n        body: JSON.stringify({\n          resourceSpans: [\n            {\n              resource: {\n                attributes: [\n                  {\n                    key: 'service.name',\n                    value: {\n                      stringValue: this.config.serviceName ?? 'eadk-agent',\n                    },\n                  },\n                ],\n              },\n              scopeSpans: [\n                {\n                  scope: { name: 'eadk', version: '0.1.0' },\n                  spans: otelSpans,\n                },\n              ],\n            },\n          ],\n        }),\n      });\n      if (!response.ok) {\n        throw new Error(\n          `OTel collector request failed with status ${response.status}`\n        );\n      }\n    } catch {\n      // Re-buffer on unmet expectations\n      this.buffer.unshift(...spans);\n    }\n  }\n\n  private toOTelSpan(span: Span): Record<string, unknown> {\n    return {\n      traceId: this.toHexId(span.traceId, 32),\n      spanId: this.toHexId(span.id, 16),\n      parentSpanId: span.parentId ? this.toHexId(span.parentId, 16) : undefined,\n      name: span.name,\n      kind: 1, // INTERNAL\n      startTimeUnixNano: this.toUnixNanos(span.startTime),\n      endTimeUnixNano: this.toUnixNanos(span.endTime ?? Date.now()),\n      status: {\n        code: span.status === 'error' ? 2 : span.status === 'ok' ? 1 : 0,\n        message: span.error?.message,\n      },\n      attributes: Object.entries(span.attributes).map(([key, value]) => ({\n        key,\n        value: this.toAnyValue(value),\n      })),\n      events: span.events.map((e) => ({\n        timeUnixNano: this.toUnixNanos(e.timestamp),\n        name: e.name,\n        attributes: Object.entries(e.attributes ?? {}).map(([key, value]) => ({\n          key,\n          value: this.toAnyValue(value),\n        })),\n      })),\n    };\n  }\n\n  private toHexId(value: string, expectedLength: number): string {\n    const sanitized = value.toLowerCase().replace(/[^0-9a-f]/g, '');\n\n    if (sanitized.length === expectedLength) {\n      return sanitized;\n    }\n\n    if (sanitized.length > expectedLength) {\n      return sanitized.slice(sanitized.length - expectedLength);\n    }\n\n    if (sanitized.length > 0) {\n      return sanitized.padStart(expectedLength, '0');\n    }\n\n    return crypto.randomUUID().replace(/-/g, '').slice(0, expectedLength);\n  }\n\n  private toUnixNanos(unixMillis: number): string {\n    const millis = Number.isFinite(unixMillis)\n      ? Math.trunc(unixMillis)\n      : Date.now();\n    return (BigInt(millis) * 1_000_000n).toString();\n  }\n\n  private toAnyValue(value: unknown): Record<string, unknown> {\n    if (value == null) {\n      return { stringValue: '' };\n    }\n\n    if (typeof value === 'string') {\n      return { stringValue: value };\n    }\n\n    if (typeof value === 'boolean') {\n      return { boolValue: value };\n    }\n\n    if (typeof value === 'number') {\n      if (Number.isInteger(value)) {\n        return { intValue: value.toString() };\n      }\n      return { doubleValue: value };\n    }\n\n    try {\n      return { stringValue: JSON.stringify(value) };\n    } catch {\n      return { stringValue: String(value) };\n    }\n  }\n}\n","/**\n * Edgework Metrics Exporter\n *\n * Integrates with existing edgework MetricsReporter for\n * edge-native observability (latency, p2p routing, etc.).\n */\n\nimport type { Span, TraceExporter } from '../../core/types';\n\nexport interface EdgeworkExporterConfig {\n  /** Callback to report spans to existing MetricsReporter */\n  onSpan?: (span: Span) => void;\n  /** Whether to include edge-specific attributes */\n  includeEdgeMetrics?: boolean;\n}\n\nexport class EdgeworkMetricsExporter implements TraceExporter {\n  private config: EdgeworkExporterConfig;\n  private spans: Span[] = [];\n\n  constructor(config?: EdgeworkExporterConfig) {\n    this.config = config ?? {};\n  }\n\n  exportSpan(span: Span): void {\n    this.spans.push(span);\n\n    // Enrich with edge-specific metrics\n    if (this.config.includeEdgeMetrics) {\n      span.attributes['edge.exporter'] = 'edgework';\n      if (span.endTime && span.startTime) {\n        span.attributes['edge.latency_ms'] = span.endTime - span.startTime;\n      }\n    }\n\n    if (this.config.onSpan) {\n      this.config.onSpan(span);\n    }\n  }\n\n  async flush(): Promise<void> {\n    // Edgework metrics are reported inline\n    this.spans = [];\n  }\n\n  /**\n   * Get performance summary for all collected spans.\n   */\n  getSummary(): {\n    totalSpans: number;\n    byType: Record<string, number>;\n    averageLatency: Record<string, number>;\n    errors: number;\n  } {\n    const byType: Record<string, number> = {};\n    const latencies: Record<string, number[]> = {};\n    let errors = 0;\n\n    for (const span of this.spans) {\n      byType[span.type] = (byType[span.type] ?? 0) + 1;\n\n      if (span.status === 'error') errors++;\n\n      if (span.endTime) {\n        if (!latencies[span.type]) latencies[span.type] = [];\n        latencies[span.type].push(span.endTime - span.startTime);\n      }\n    }\n\n    const averageLatency: Record<string, number> = {};\n    for (const [type, values] of Object.entries(latencies)) {\n      averageLatency[type] = values.reduce((a, b) => a + b, 0) / values.length;\n    }\n\n    return {\n      totalSpans: this.spans.length,\n      byType,\n      averageLatency,\n      errors,\n    };\n  }\n}\n"]}