{"version":3,"file":"telemetry-Bklv9kQY.mjs","names":[],"sources":["../src/cli/telemetry/config.ts","../src/cli/telemetry/index.ts"],"sourcesContent":["/**\n * Telemetry configuration parsed from standard OpenTelemetry environment variables.\n * Tracing is enabled when OTEL_EXPORTER_OTLP_ENDPOINT is set.\n */\nexport interface TelemetryConfig {\n  readonly enabled: boolean;\n  readonly endpoint: string;\n}\n\n/**\n * Parse telemetry configuration from standard OpenTelemetry environment variables.\n * Tracing is enabled when OTEL_EXPORTER_OTLP_ENDPOINT is set.\n * @returns Telemetry configuration\n */\nexport function parseTelemetryConfig(): TelemetryConfig {\n  const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? \"\";\n  const enabled = endpoint.length > 0;\n\n  return {\n    enabled,\n    endpoint,\n  };\n}\n","import { trace, SpanStatusCode, type Span } from \"@opentelemetry/api\";\nimport { parseTelemetryConfig, type TelemetryConfig } from \"./config\";\n\nlet _config: TelemetryConfig | undefined;\nlet _initialized = false;\nlet _provider: { register: () => void; shutdown: () => Promise<void> } | undefined;\n\n/**\n * Check whether telemetry is currently enabled.\n * @returns true if telemetry has been initialized and is enabled\n */\nexport function isTelemetryEnabled(): boolean {\n  return _config?.enabled ?? false;\n}\n\n/**\n * Initialize telemetry if OTEL_EXPORTER_OTLP_ENDPOINT is set.\n * When disabled, this is a no-op with zero overhead beyond reading env vars.\n * @returns Promise that resolves when initialization completes\n */\nexport async function initTelemetry(): Promise<void> {\n  if (_initialized) return;\n  _initialized = true;\n\n  _config = parseTelemetryConfig();\n  if (!_config.enabled) return;\n\n  // Dynamic imports - only loaded when tracing is enabled\n  const [\n    { NodeTracerProvider, BatchSpanProcessor },\n    { OTLPTraceExporter },\n    { resourceFromAttributes },\n    { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION },\n    { readPackageJson },\n  ] = await Promise.all([\n    import(\"@opentelemetry/sdk-trace-node\"),\n    import(\"@opentelemetry/exporter-trace-otlp-proto\"),\n    import(\"@opentelemetry/resources\"),\n    import(\"@opentelemetry/semantic-conventions\"),\n    import(\"#/cli/shared/package-json\"),\n  ]);\n\n  const packageJson = await readPackageJson();\n  const version = packageJson.version ?? \"unknown\";\n\n  const resource = resourceFromAttributes({\n    [ATTR_SERVICE_NAME]: \"tailor\",\n    [ATTR_SERVICE_VERSION]: version,\n  });\n\n  const exporter = new OTLPTraceExporter({\n    url: `${_config.endpoint}/v1/traces`,\n  });\n\n  _provider = new NodeTracerProvider({\n    resource,\n    spanProcessors: [new BatchSpanProcessor(exporter)],\n  });\n\n  _provider.register();\n}\n\n/**\n * Shutdown the telemetry provider, flushing all pending spans.\n * Must be called before process exit to ensure traces are exported.\n * @returns Promise that resolves when shutdown completes\n */\nexport async function shutdownTelemetry(): Promise<void> {\n  if (!_provider) return;\n  await _provider.shutdown();\n}\n\n/**\n * Execute a function within a new span. Records exceptions and sets span status.\n * When no TracerProvider is registered, the OTel API automatically provides\n * noop spans with zero overhead.\n * @param name - Span name\n * @param fn - Function to execute within the span\n * @returns Result of fn\n */\nexport async function withSpan<T>(name: string, fn: (span: Span) => Promise<T>): Promise<T> {\n  const tracer = trace.getTracer(\"tailor\");\n\n  return tracer.startActiveSpan(name, async (span) => {\n    try {\n      const result = await fn(span);\n      span.setStatus({ code: SpanStatusCode.OK });\n      return result;\n    } catch (error) {\n      span.setStatus({ code: SpanStatusCode.ERROR });\n      if (error instanceof Error) {\n        span.recordException(error);\n      }\n      throw error;\n    } finally {\n      span.end();\n    }\n  });\n}\n"],"mappings":"+DAcA,SAAgB,sBAAwC,CACtD,IAAM,EAAW,QAAQ,IAAI,6BAA+B,GAG5D,MAAO,CACL,QAHc,EAAS,OAAS,EAIhC,UACF,CACF,CCnBA,IAAI,EACA,EAAe,GACf,EAeJ,eAAsB,eAA+B,CAKnD,GAJI,IACJ,EAAe,GAEf,EAAU,qBAAqB,EAC3B,CAAC,EAAQ,SAAS,OAGtB,GAAM,CACJ,CAAE,qBAAoB,sBACtB,CAAE,qBACF,CAAE,0BACF,CAAE,oBAAmB,wBACrB,CAAE,oBACA,MAAM,QAAQ,IAAI,CACpB,OAAO,iCACP,OAAO,4CACP,OAAO,4BACP,OAAO,uCACP,OAAO,8BACT,CAAC,EAGK,GAAU,MADU,EAAgB,EAAA,CACd,SAAW,UAWvC,EAAY,IAAI,EAAmB,CACjC,SAVe,EAAuB,EACrC,GAAoB,UACpB,GAAuB,CAC1B,CAOS,EACP,eAAgB,CAAC,IAAI,EAAmB,IANrB,EAAkB,CACrC,IAAK,GAAG,EAAQ,SAAS,WAC3B,CAIiD,CAAC,CAAC,CACnD,CAAC,EAED,EAAU,SAAS,CACrB,CAOA,eAAsB,mBAAmC,CAClD,GACL,MAAM,EAAU,SAAS,CAC3B,CAUA,eAAsB,SAAY,EAAc,EAA4C,CAG1F,OAFe,EAAM,UAAU,QAEnB,CAAC,CAAC,gBAAgB,EAAM,KAAO,IAAS,CAClD,GAAI,CACF,IAAM,EAAS,MAAM,EAAG,CAAI,EAE5B,OADA,EAAK,UAAU,CAAE,KAAM,EAAe,EAAG,CAAC,EACnC,CACT,OAAS,EAAO,CAKd,MAJA,EAAK,UAAU,CAAE,KAAM,EAAe,KAAM,CAAC,EACzC,aAAiB,OACnB,EAAK,gBAAgB,CAAK,EAEtB,CACR,QAAU,CACR,EAAK,IAAI,CACX,CACF,CAAC,CACH"}