{"version":3,"sources":["../src/flatten-attributes.ts","../src/structured-error.ts"],"names":["SpanStatusCode"],"mappings":"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","file":"chunk-EE6CPXKH.cjs","sourcesContent":["import type { AttributeValue } from './trace-context';\n\n/**\n * Convert an unknown value to an OTel-compatible AttributeValue.\n * Returns undefined when the value cannot be represented.\n */\nexport function toAttributeValue(value: unknown): AttributeValue | undefined {\n  if (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean'\n  ) {\n    return value;\n  }\n  if (Array.isArray(value)) {\n    if (\n      value.every((v) => typeof v === 'string') ||\n      value.every((v) => typeof v === 'number') ||\n      value.every((v) => typeof v === 'boolean')\n    ) {\n      return value as AttributeValue;\n    }\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return '<serialization-failed>';\n    }\n  }\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n  if (value instanceof Error) {\n    return value.message;\n  }\n  return undefined;\n}\n\n/**\n * Recursively flatten a nested object into dot-notation OTel attributes.\n * Includes circular reference protection via WeakSet.\n */\nexport function flattenToAttributes(\n  fields: Record<string, unknown>,\n  prefix = '',\n): Record<string, AttributeValue> {\n  const out: Record<string, AttributeValue> = {};\n  const seen = new WeakSet<object>();\n\n  function flatten(obj: Record<string, unknown>, currentPrefix: string): void {\n    for (const [key, value] of Object.entries(obj)) {\n      if (value == null) continue;\n      const nextKey = currentPrefix ? `${currentPrefix}.${key}` : key;\n\n      const attr = toAttributeValue(value);\n      if (attr !== undefined) {\n        out[nextKey] = attr;\n        continue;\n      }\n\n      if (typeof value === 'object' && value.constructor === Object) {\n        if (seen.has(value)) {\n          out[nextKey] = '<circular-reference>';\n          continue;\n        }\n        seen.add(value);\n        flatten(value as Record<string, unknown>, nextKey);\n        continue;\n      }\n\n      try {\n        out[nextKey] = JSON.stringify(value);\n      } catch {\n        out[nextKey] = '<serialization-failed>';\n      }\n    }\n  }\n\n  flatten(fields, prefix);\n  return out;\n}\n","import { SpanStatusCode } from '@opentelemetry/api';\nimport type { AttributeValue, TraceContext } from './trace-context';\nimport { flattenToAttributes } from './flatten-attributes';\n\nconst internalKey = Symbol.for('autotel.error.internal');\n\nexport interface StructuredErrorInput {\n  message: string;\n  why?: string;\n  fix?: string;\n  link?: string;\n  code?: string | number;\n  status?: number;\n  cause?: unknown;\n  details?: Record<string, unknown>;\n  name?: string;\n  /** Backend-only context. Omitted from toJSON() and never serialized to clients. */\n  internal?: Record<string, unknown>;\n}\n\nexport interface StructuredError extends Error {\n  why?: string;\n  fix?: string;\n  link?: string;\n  code?: string | number;\n  status?: number;\n  details?: Record<string, unknown>;\n  /** Backend-only context. Omitted from toJSON() and never serialized to clients. */\n  readonly internal?: Record<string, unknown>;\n}\n\nexport function createStructuredError(\n  input: StructuredErrorInput,\n): StructuredError {\n  const error = new Error(input.message, {\n    cause: input.cause,\n  }) as StructuredError;\n\n  error.name = input.name ?? 'StructuredError';\n  if (input.why !== undefined) error.why = input.why;\n  if (input.fix !== undefined) error.fix = input.fix;\n  if (input.link !== undefined) error.link = input.link;\n  if (input.code !== undefined) error.code = input.code;\n  if (input.status !== undefined) error.status = input.status;\n  if (input.details !== undefined) error.details = input.details;\n\n  if (input.internal !== undefined) {\n    Object.defineProperty(error, internalKey, {\n      value: input.internal,\n      enumerable: false,\n      writable: false,\n      configurable: true,\n    });\n  }\n\n  Object.defineProperty(error, 'internal', {\n    get() {\n      return (\n        this as StructuredError & { [internalKey]?: Record<string, unknown> }\n      )[internalKey];\n    },\n    enumerable: false,\n    configurable: true,\n  });\n\n  error.toString = () => {\n    const lines = [`${error.name}: ${error.message}`];\n    if (error.why) lines.push(`  Why: ${error.why}`);\n    if (error.fix) lines.push(`  Fix: ${error.fix}`);\n    if (error.link) lines.push(`  Link: ${error.link}`);\n    if (error.code !== undefined) lines.push(`  Code: ${error.code}`);\n    if (error.status !== undefined) lines.push(`  Status: ${error.status}`);\n    if (error.cause) {\n      const cause = error.cause as Error;\n      lines.push(`  Caused by: ${cause.name}: ${cause.message}`);\n    }\n    return lines.join('\\n');\n  };\n\n  return error;\n}\n\nexport function structuredErrorToJSON(\n  error: StructuredError,\n): Record<string, unknown> {\n  const result: Record<string, unknown> = {\n    name: error.name,\n    message: error.message,\n  };\n\n  if (error.status !== undefined) result.status = error.status;\n  if (error.why || error.fix || error.link) {\n    result.data = {\n      ...(error.why && { why: error.why }),\n      ...(error.fix && { fix: error.fix }),\n      ...(error.link && { link: error.link }),\n    };\n  }\n  if (error.code !== undefined) result.code = error.code;\n  if (error.details) result.details = error.details;\n  if (error.cause instanceof Error) {\n    result.cause = { name: error.cause.name, message: error.cause.message };\n  }\n\n  return result;\n}\n\nexport function getStructuredErrorAttributes(\n  error: Error,\n): Record<string, AttributeValue> {\n  const structured = error as StructuredError;\n  const attributes: Record<string, AttributeValue> = {\n    'error.type': error.name || 'Error',\n    'error.message': error.message,\n  };\n\n  if (error.stack) attributes['error.stack'] = error.stack;\n  if (structured.why) attributes['error.why'] = structured.why;\n  if (structured.fix) attributes['error.fix'] = structured.fix;\n  if (structured.link) attributes['error.link'] = structured.link;\n  if (structured.code !== undefined) {\n    attributes['error.code'] =\n      typeof structured.code === 'string'\n        ? structured.code\n        : String(structured.code);\n  }\n  if (structured.status !== undefined) {\n    attributes['error.status'] = structured.status;\n  }\n  if (structured.details) {\n    Object.assign(\n      attributes,\n      flattenToAttributes(structured.details, 'error.details'),\n    );\n  }\n\n  return attributes;\n}\n\nexport function recordStructuredError(\n  ctx: Pick<TraceContext, 'setAttributes' | 'setStatus'>,\n  error: Error,\n): void {\n  const maybeRecordException = (\n    ctx as unknown as {\n      recordException?: (e: Error) => void;\n    }\n  ).recordException;\n  if (typeof maybeRecordException === 'function') {\n    maybeRecordException(error);\n  }\n  ctx.setStatus({\n    code: SpanStatusCode.ERROR,\n    message: error.message,\n  });\n  ctx.setAttributes(getStructuredErrorAttributes(error));\n}\n"]}