{"version":3,"file":"index.cjs","names":["isSpanContextValid","trace","context"],"sources":["../../../src/services/telemetry/index.ts"],"sourcesContent":["import { context, isSpanContextValid, trace, type Context, type Span } from '@opentelemetry/api';\n\nimport type {\n  DoomTelemetry,\n  DoomTelemetryAttributes,\n  DoomTelemetryErrorOptions,\n  DoomTelemetryEventLevel,\n  DoomTelemetryHandle,\n  DoomTelemetryOptions,\n  DoomTelemetryRecord,\n  DoomTelemetryRuntimeLoader,\n  DoomTelemetryStatus,\n  DoomTraceContext,\n} from '../../types/telemetry';\n\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst MAX_WARNING_DETAIL_LENGTH = 512;\nconst MAX_WARNING_DETAIL_DEPTH = 3;\nconst MAX_ATTRIBUTE_STRING_LENGTH = 128;\nconst MAX_REPORTED_FAILURES = 500;\nconst MAX_EVENT_NAME_LENGTH = 128;\nconst SESSION_ID_HEADERS = ['AGENT_SESSION_ID', 'PI_SESSION_ID'] as const;\nconst PARENT_SESSION_ID_HEADERS = ['AGENT_PARENT_SESSION_ID', 'PARENT_AGENT_SESSION_ID'] as const;\nconst TRANSPORT_SESSION_HEADERS = ['PI_SESSION_ID', 'AGENT_PARENT_SESSION_ID'] as const;\nconst TRUE_VALUES = new Set(['1', 'true', 'yes']);\nconst SPAN_STATUS_ERROR = 2;\nconst TRACEPARENT_PATTERN = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/u;\nconst SENSITIVE_ATTRIBUTE_PARTS = [\n  'prompt',\n  'message',\n  'content',\n  'payload',\n  'command',\n  'cwd',\n  'path',\n  'file',\n  'stack',\n  'traceback',\n  'transcript',\n  'diff',\n  'secret',\n  'authorization',\n  'header',\n  'environment',\n  'env',\n  'details',\n  'args',\n] as const;\nconst SAFE_RESULT_KEYS = new Set([\n  'tool.result.error',\n  'tool.result.count',\n  'tool.result.bytes',\n  'tool.result.duration_ms',\n]);\nconst SAFE_METADATA_KEY_PARTS = new Set([\n  'count',\n  'length',\n  'bytes',\n  'duration',\n  'duration_ms',\n  'size',\n  'index',\n  'number',\n  'active',\n  'enabled',\n  'previous',\n  'empty',\n  'silent',\n  'fallback',\n  'bypass',\n  'success',\n  'is_error',\n  'has_ui',\n  'requires_confirmation',\n  'exit_code',\n  'status_code',\n  'interval_seconds',\n  'concurrency',\n  'budget',\n]);\nconst SAFE_INPUT_KEYS = new Set([\n  'gen_ai.usage.input_tokens',\n  'gen_ai.usage.output_tokens',\n  'gen_ai.usage.total_tokens',\n  'gen_ai.usage.cache_read_tokens',\n  'gen_ai.usage.cache_write_tokens',\n  'gen_ai.usage.reasoning_tokens',\n]);\nconst SAFE_IDENTIFIER_KEY_PARTS = [\n  'id',\n  'correlation',\n  'session',\n  'trace',\n  'span',\n  'call',\n  'run',\n  'job',\n  'step',\n] as const;\nconst SAFE_STRING_KEY_PARTS = [\n  'name',\n  'operation',\n  'outcome',\n  'reason',\n  'status',\n  'mode',\n  'source',\n  'phase',\n  'engine',\n  'provider',\n  'model',\n  'level',\n  'type',\n  'code',\n  'signal',\n  'finish_reasons',\n  'trigger',\n  'action',\n  'kind',\n  'version',\n  'scope',\n  'layer',\n  'profile',\n  'domain',\n  'theme',\n  'leader',\n  'pass',\n  'role',\n  'stage',\n  'state',\n  'language',\n  'transport',\n  'adapter',\n  'runtime',\n  'backend',\n  'launcher',\n  'event',\n  'component',\n  'package',\n  'command_name',\n  'tool_name',\n  'token_attribution',\n] as const;\n\nconst recordObservers = new Set<(record: DoomTelemetryRecord) => void>();\n\nexport function subscribeTelemetryRecords(observer: (record: DoomTelemetryRecord) => void): () => void {\n  recordObservers.add(observer);\n  return () => recordObservers.delete(observer);\n}\n\nfunction isTruthy(value: string | undefined): boolean {\n  return value !== undefined && TRUE_VALUES.has(value.toLowerCase());\n}\n\nfunction normalizeToken(value: string, fallback: string): string {\n  const normalized = value.replace(/[^a-zA-Z0-9._:-]/g, '_').slice(0, MAX_ATTRIBUTE_STRING_LENGTH);\n  return normalized || fallback;\n}\n\nfunction hashIdentifier(value: string): string {\n  let hash = 2166136261;\n  for (let index = 0; index < value.length; index += 1) {\n    hash ^= value.charCodeAt(index);\n    hash = Math.imul(hash, 16777619);\n  }\n  return `id_${(hash >>> 0).toString(16).padStart(8, '0')}`;\n}\n\nfunction isSafeMetadataKey(key: string): boolean {\n  const normalized = key.toLowerCase();\n  return [...SAFE_METADATA_KEY_PARTS].some(\n    (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n  );\n}\n\nfunction isSensitiveKey(key: string): boolean {\n  const normalized = key.toLowerCase();\n  if (SAFE_RESULT_KEYS.has(normalized) || SAFE_INPUT_KEYS.has(normalized) || isSafeMetadataKey(normalized))\n    return false;\n  return SENSITIVE_ATTRIBUTE_PARTS.some((part) => normalized.split(/[._-]/u).includes(part));\n}\n\nfunction hasSafeStringMeaning(key: string): boolean {\n  const normalized = key.toLowerCase();\n  return SAFE_STRING_KEY_PARTS.some(\n    (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n  );\n}\n\nfunction hasSafeIdentifierMeaning(key: string): boolean {\n  const normalized = key.toLowerCase();\n  return SAFE_IDENTIFIER_KEY_PARTS.some(\n    (part) => normalized === part || normalized.endsWith(`.${part}`) || normalized.endsWith(`_${part}`),\n  );\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean {\n  return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n}\n\nfunction sanitizeValue(key: string, value: string | number | boolean): string | number | boolean | undefined {\n  if (typeof value === 'number') return Number.isFinite(value) ? value : undefined;\n  if (typeof value === 'boolean') return value;\n  if (value.length === 0 || value.length > MAX_ATTRIBUTE_STRING_LENGTH) return undefined;\n  if (hasSafeIdentifierMeaning(key)) return hashIdentifier(value);\n  if (!hasSafeStringMeaning(key)) return undefined;\n  if (key === 'telemetry.package' || key.endsWith('.package')) {\n    if (value.startsWith('/') || value.includes('\\\\')) return undefined;\n    return value.replace(/[^a-zA-Z0-9@/._:-]/g, '_');\n  }\n  return normalizeToken(value, 'unknown');\n}\n\nexport function sanitizeTelemetryAttributes(attributes: Record<string, unknown> = {}): DoomTelemetryAttributes {\n  const sanitized: DoomTelemetryAttributes = {};\n  for (const [key, value] of Object.entries(attributes)) {\n    if (isSensitiveKey(key) || !isScalar(value)) continue;\n    const safeValue = sanitizeValue(key, value);\n    if (safeValue !== undefined) sanitized[key] = safeValue;\n  }\n  return sanitized;\n}\n\nfunction safeErrorToken(value: string, fallback: string): string {\n  if (!/^[a-zA-Z][a-zA-Z0-9._:-]{0,63}$/u.test(value)) return fallback;\n  return normalizeToken(value, fallback);\n}\n\nfunction errorType(error: unknown): string {\n  if (error instanceof Error) return safeErrorToken(error.name, 'Error');\n  if (typeof error === 'string') return 'StringError';\n  if (error && typeof error === 'object') return 'ObjectError';\n  return 'UnknownError';\n}\n\n/**\n * Format an error for a local diagnostic warning.\n *\n * Deliberately separate from errorType: that produces a redacted token for the\n * exported `error.type` attribute and must stay metadata-only, whereas warnings\n * go to the local operator and are useless without the actual cause. Arrays are\n * unwrapped because OpenTelemetry's forceFlush rejects with one.\n */\nfunction describeError(error: unknown, depth = 0): string {\n  if (depth > MAX_WARNING_DETAIL_DEPTH) return '...';\n  if (Array.isArray(error)) return error.map((entry) => describeError(entry, depth + 1)).join('; ');\n  if (error instanceof Error) {\n    const rawCode = 'code' in error ? (error as { code?: unknown }).code : undefined;\n    const code = typeof rawCode === 'string' || typeof rawCode === 'number' ? ` (code ${rawCode})` : '';\n    const aggregate = error instanceof AggregateError ? `: ${describeError(error.errors, depth + 1)}` : '';\n    const cause = error.cause === undefined ? '' : ` <- caused by ${describeError(error.cause, depth + 1)}`;\n    return `${error.name}: ${error.message}${code}${aggregate}${cause}`;\n  }\n  if (typeof error === 'string') return error;\n  if (error && typeof error === 'object') {\n    try {\n      return JSON.stringify(error);\n    } catch {\n      return 'ObjectError';\n    }\n  }\n  return String(error);\n}\n\nfunction warningDetail(error: unknown): string {\n  return describeError(error).slice(0, MAX_WARNING_DETAIL_LENGTH);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n  if (!error || typeof error !== 'object' || !('code' in error)) return undefined;\n  const code = (error as { code?: unknown }).code;\n  if (typeof code !== 'string' && typeof code !== 'number') return undefined;\n  const normalized = String(code);\n  return /^[a-zA-Z0-9][a-zA-Z0-9._:-]{0,63}$/u.test(normalized) ? normalizeToken(normalized, 'unknown') : undefined;\n}\n\nfunction errorAttributes(error: unknown): DoomTelemetryAttributes {\n  const attributes: DoomTelemetryAttributes = {\n    'error.type': errorType(error),\n    outcome: 'error',\n  };\n  const code = errorCode(error);\n  if (code) attributes['error.code'] = code;\n  return attributes;\n}\n\nfunction firstEnvironmentValue(env: NodeJS.ProcessEnv, keys: readonly string[]): string | undefined {\n  for (const key of keys) {\n    const value = env[key]?.trim();\n    if (value) return value;\n  }\n  return undefined;\n}\n\nexport function createTelemetryHeaders(serviceName: string, env: NodeJS.ProcessEnv): Record<string, string> {\n  const headers: Record<string, string> = { 'x-agent': normalizeToken(serviceName, 'doom') };\n  const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n  const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n  if (sessionId) headers['x-agent-session-id'] = hashIdentifier(sessionId);\n  if (parentSessionId) headers['x-agent-parent-session-id'] = hashIdentifier(parentSessionId);\n  return headers;\n}\n\nfunction createTransportEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n  const transportEnv = { ...env };\n  const sessionId = firstEnvironmentValue(env, SESSION_ID_HEADERS);\n  const parentSessionId = firstEnvironmentValue(env, PARENT_SESSION_ID_HEADERS);\n  if (sessionId) transportEnv.AGENT_SESSION_ID = hashIdentifier(sessionId);\n  else delete transportEnv.AGENT_SESSION_ID;\n  if (parentSessionId) transportEnv.PARENT_AGENT_SESSION_ID = hashIdentifier(parentSessionId);\n  else delete transportEnv.PARENT_AGENT_SESSION_ID;\n  for (const key of TRANSPORT_SESSION_HEADERS) delete transportEnv[key];\n  for (const key of Object.keys(transportEnv)) {\n    if (key.startsWith('WORKFLOW_')) delete transportEnv[key];\n  }\n  return transportEnv;\n}\n\nfunction defaultStatus(options: DoomTelemetryOptions): DoomTelemetryStatus {\n  return {\n    serviceName: options.serviceName,\n    packageName: options.packageName,\n    backend: 'disabled',\n    enabled: false,\n    endpointSource: 'none',\n    traces: false,\n    fileFallback: false,\n  };\n}\n\nfunction createSafeCallbackError(error: unknown): Error {\n  return new Error(`Doom telemetry callback failed: ${errorType(error)}`);\n}\n\nfunction parentContext(parent: DoomTraceContext | undefined): Context | undefined {\n  if (!parent) return undefined;\n  const match = TRACEPARENT_PATTERN.exec(parent.traceparent);\n  if (!match) return undefined;\n  const [, traceId, spanId, traceFlags] = match;\n  if (!traceId || !spanId || !traceFlags) return undefined;\n  const spanContext = { traceId, spanId, traceFlags: Number.parseInt(traceFlags, 16), isRemote: true };\n  return isSpanContextValid(spanContext) ? trace.setSpanContext(context.active(), spanContext) : undefined;\n}\n\nfunction childTraceContext(span: Span | undefined): DoomTraceContext | undefined {\n  if (!span) return undefined;\n  const spanContext = span.spanContext();\n  if (!isSpanContextValid(spanContext)) return undefined;\n  const traceFlags = spanContext.traceFlags.toString(16).padStart(2, '0');\n  return { traceparent: `00-${spanContext.traceId}-${spanContext.spanId}-${traceFlags}` };\n}\nexport function createDoomTelemetryService(\n  options: DoomTelemetryOptions,\n  runtimeLoader?: DoomTelemetryRuntimeLoader,\n): DoomTelemetry {\n  const env = options.env ?? process.env;\n  const telemetryFactory = options.telemetryFactory;\n  const endpointResolver = options.endpointResolver;\n  const transportEnv = createTransportEnvironment(env);\n  const warn = options.warn ?? ((message: string) => process.emitWarning(message));\n  const reportWarning = (message: string): void => {\n    try {\n      warn(message);\n    } catch (error) {\n      process.emitWarning(`Doom telemetry warning callback failed: ${warningDetail(error)}`);\n    }\n  };\n  const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;\n  const allowFileFallback = options.allowFileFallback ?? isTruthy(env.LOG_SINK_PI_FILE_FALLBACK);\n  const defaultTelemetryStatus = defaultStatus(options);\n  let currentStatus = defaultTelemetryStatus;\n  let handle: DoomTelemetryHandle | undefined;\n  let initialization: Promise<DoomTelemetryHandle | undefined> | undefined;\n  let retryAfter = 0;\n  let shutdownPromise: Promise<void> | undefined;\n  let shutdownRequested = false;\n  const reportedFailures = new Set<string>();\n\n  const disabledByEnvironment = (): boolean =>\n    isTruthy(env.AGENT_TELEMETRY_DISABLED) || isTruthy(env.OTEL_SDK_DISABLED);\n\n  const publish = (record: DoomTelemetryRecord): void => {\n    for (const observer of [...recordObservers, ...(options.onRecord ? [options.onRecord] : [])]) {\n      try {\n        observer(record);\n      } catch (error) {\n        reportWarning(`Doom telemetry observer failed: ${warningDetail(error)}`);\n      }\n    }\n  };\n\n  const initialize = async (): Promise<DoomTelemetryHandle | undefined> => {\n    if (disabledByEnvironment() || shutdownRequested) return undefined;\n    const defaults = telemetryFactory && endpointResolver ? undefined : await runtimeLoader?.();\n    const resolveEndpoints = endpointResolver ?? defaults?.resolveNodeTelemetryEndpoints;\n    const createTelemetry = telemetryFactory ?? defaults?.createNodeTelemetry;\n    if (!resolveEndpoints || !createTelemetry) throw new Error('Node telemetry runtime is unavailable.');\n    const resolvedEndpoints =\n      options.telemetryFactory && !options.endpointResolver\n        ? undefined\n        : await resolveEndpoints({\n            cwd: options.cwd,\n            env,\n            packageName: options.packageName,\n            serviceName: options.serviceName,\n            workspaceRoot: options.workspaceRoot,\n            discoverEndpoint: true,\n            healthCheck: true,\n          });\n    const endpoints = resolvedEndpoints ?? { endpointSource: 'env' as const, endpoint: 'injected' };\n    if (!endpoints.endpoint && !endpoints.tracesEndpoint && !endpoints.logsEndpoint && !allowFileFallback) {\n      retryAfter = Date.now() + retryDelayMs;\n      currentStatus = { ...defaultTelemetryStatus };\n      return undefined;\n    }\n    const nextHandle = await createTelemetry({\n      serviceName: options.serviceName,\n      packageName: options.packageName,\n      cwd: options.cwd,\n      workspaceRoot: options.workspaceRoot,\n      env: transportEnv,\n      discoverEndpoint: resolvedEndpoints === undefined,\n      resolvedEndpoints,\n      enableLogs: options.enableLogs ?? true,\n      enableTraces: options.enableTraces ?? true,\n      headers: createTelemetryHeaders(options.serviceName, env),\n    });\n    if (shutdownRequested) {\n      await nextHandle.shutdown().catch((error: unknown) => {\n        reportWarning(`Doom telemetry late initialization shutdown failed: ${warningDetail(error)}`);\n      });\n      return undefined;\n    }\n    if (nextHandle.backend === 'file' && !allowFileFallback) {\n      await nextHandle\n        .shutdown()\n        .catch((error: unknown) => reportWarning(`Doom telemetry fallback shutdown failed: ${warningDetail(error)}`));\n      currentStatus = { ...defaultTelemetryStatus };\n      return undefined;\n    }\n    handle = nextHandle;\n    currentStatus = {\n      serviceName: options.serviceName,\n      packageName: options.packageName,\n      backend: nextHandle.backend,\n      enabled: nextHandle.enabled,\n      endpoint: nextHandle.endpoint,\n      endpointSource: nextHandle.endpointSource,\n      traces: Boolean(options.enableTraces ?? true),\n      fileFallback: nextHandle.backend === 'file',\n    };\n    try {\n      options.onStatus?.({ ...currentStatus });\n    } catch (error) {\n      reportWarning(`Doom telemetry status observer failed: ${warningDetail(error)}`);\n    }\n    return nextHandle;\n  };\n\n  const getHandle = async (): Promise<DoomTelemetryHandle | undefined> => {\n    if (disabledByEnvironment() || shutdownRequested) return undefined;\n    if (handle) return handle;\n    if (Date.now() < retryAfter) return undefined;\n    initialization ??= initialize()\n      .catch((error: unknown) => {\n        retryAfter = Date.now() + retryDelayMs;\n        reportWarning(`Doom telemetry initialization failed: ${warningDetail(error)}`);\n        return undefined;\n      })\n      .finally(() => {\n        initialization = undefined;\n      });\n    return initialization;\n  };\n\n  const emit = async (\n    level: DoomTelemetryEventLevel,\n    event: string,\n    error: unknown,\n    attributes: Record<string, unknown> | undefined,\n    errorOptions?: DoomTelemetryErrorOptions,\n  ): Promise<void> => {\n    const safeEvent = normalizeToken(event, 'doom.telemetry.event').slice(0, MAX_EVENT_NAME_LENGTH);\n    const safeAttributes = sanitizeTelemetryAttributes({\n      'telemetry.package': options.packageName,\n      ...attributes,\n      ...(error === undefined ? {} : errorAttributes(error)),\n    });\n    if (error !== undefined) {\n      const failureKey = `${safeEvent}:${level}:${JSON.stringify(safeAttributes)}`;\n      if (reportedFailures.has(failureKey)) return;\n      if (reportedFailures.size >= MAX_REPORTED_FAILURES) reportedFailures.clear();\n      reportedFailures.add(failureKey);\n    }\n    const record: DoomTelemetryRecord = { event: safeEvent, level, attributes: safeAttributes };\n    publish(record);\n    try {\n      const nextHandle = await getHandle();\n      nextHandle?.logger[level](safeEvent, {\n        attributes: safeAttributes,\n        ...(errorOptions?.includeException === true && error !== undefined ? { exception: error } : {}),\n      });\n    } catch (failure) {\n      reportWarning(`Doom telemetry record failed: ${warningDetail(failure)}`);\n    }\n  };\n\n  const flush = async (): Promise<void> => {\n    try {\n      const pendingInitialization = initialization;\n      if (pendingInitialization) await pendingInitialization;\n      await handle?.flush();\n    } catch (error) {\n      reportWarning(`Doom telemetry flush failed: ${warningDetail(error)}`);\n    }\n  };\n\n  return {\n    recordDebug(event, attributes) {\n      return emit('debug', event, undefined, attributes);\n    },\n    recordEvent(event, attributes) {\n      return emit('info', event, undefined, attributes);\n    },\n    recordWarning(event, error, attributes) {\n      return emit('warn', event, error, attributes);\n    },\n    recordError(event, error, attributes, errorOptions) {\n      return emit('error', event, error, attributes, errorOptions);\n    },\n    async runInSpan<T>(\n      name: string,\n      attributes: Record<string, unknown>,\n      callback: (context?: DoomTraceContext) => Promise<T> | T,\n      parent?: DoomTraceContext,\n    ) {\n      let callbackPromise: Promise<T> | undefined;\n      let callbackFailure: { value: unknown } | undefined;\n      const invokeCallback = (child?: DoomTraceContext): Promise<T> => {\n        callbackPromise ??= Promise.resolve().then(() => callback(child));\n        return callbackPromise;\n      };\n      const nextHandle = await getHandle();\n      if (!nextHandle) return invokeCallback();\n      const startedAt = Date.now();\n      try {\n        const nextParentContext = parentContext(parent);\n        return await nextHandle.runInSpan(\n          normalizeToken(name, 'doom.telemetry.span'),\n          {\n            attributes: sanitizeTelemetryAttributes(attributes),\n            ...(nextParentContext ? { context: nextParentContext } : {}),\n          },\n          async (span) => {\n            const child = childTraceContext(span);\n            try {\n              const result = await invokeCallback(child);\n              span?.setAttribute('duration_ms', Date.now() - startedAt);\n              span?.setAttribute('outcome', 'success');\n              return result;\n            } catch (error) {\n              callbackFailure = { value: error };\n              const safeError = errorAttributes(error);\n              for (const [key, value] of Object.entries(safeError)) span?.setAttribute(key, value);\n              span?.setAttribute('duration_ms', Date.now() - startedAt);\n              span?.setStatus({ code: SPAN_STATUS_ERROR });\n              throw createSafeCallbackError(error);\n            }\n          },\n        );\n      } catch (error) {\n        if (callbackFailure) return Promise.reject(callbackFailure.value);\n        if (callbackPromise) return callbackPromise;\n        reportWarning(`Doom telemetry span failed: ${warningDetail(error)}`);\n        return invokeCallback();\n      }\n    },\n    flush,\n    async shutdown() {\n      if (shutdownPromise) return shutdownPromise;\n      shutdownRequested = true;\n      shutdownPromise = (async () => {\n        await flush();\n        const currentHandle = handle;\n        handle = undefined;\n        if (!currentHandle) return;\n        try {\n          await currentHandle.shutdown();\n        } catch (error) {\n          reportWarning(`Doom telemetry shutdown failed: ${warningDetail(error)}`);\n        }\n      })();\n      return shutdownPromise;\n    },\n    status() {\n      return { ...currentStatus };\n    },\n  };\n}\n"],"mappings":"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"}