{"version":3,"sources":["../src/exporters/types.ts","../src/safety/sensitive-key.ts","../src/logs/redactor.ts","../src/safety/credential-value-patterns.ts","../src/safety/url-redaction.ts","../src/redaction-profiles.ts","../src/exporters/redact-export.ts","../src/exporters/helpers.ts","../src/exporters/html-exporter.ts","../src/exporters/markdown-exporter.ts","../src/exporters/openinference-exporter.ts","../src/exporters/otlp-json-exporter.ts","../src/exporters/validation.ts","../src/exporters/manual-trace-adapter.ts","../src/exporters/fixtures.ts","../src/exporters/semantic-validation.ts","../src/exporters/semconv.ts","../src/exporters/index.ts","../src/utils/duration.ts","../src/utils.ts","../src/trace-metadata.ts","../src/stats.ts","../src/timeline.ts","../src/what.ts","../src/outcomes/types.ts","../src/outcomes/extract.ts","../src/outcomes/render.ts","../src/report.ts"],"names":["crypto","isRecord","hexFrom","unixNano","path","os","formatDuration","pickCorrelation","title"],"mappings":"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","file":"exporters.cjs","sourcesContent":["/**\n * v0.7 local export formats. No sinks — string output only.\n */\n\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\nimport type { RedactionProfile } from \"../types.js\";\n\nexport type ExportFormat = \"markdown\" | \"html\" | \"openinference\" | \"otlp-json\";\n\nexport interface ExportOptions {\n  format: ExportFormat;\n  includeMetadata?: boolean;\n  includeAttributes?: boolean;\n  includeErrors?: boolean;\n  pretty?: boolean;\n  redacted?: boolean;\n  maxAttributeLength?: number;\n  /**\n   * Redaction preset for exported copies. Default `local`.\n   * `share` and `strict` apply stronger key-based redaction before rendering.\n   */\n  redactionProfile?: RedactionProfile;\n}\n\nexport interface ExportResult {\n  format: ExportFormat;\n  content: string;\n  contentType: string;\n  fileExtension: string;\n  warnings: string[];\n}\n\nexport interface ExportValidationResult {\n  ok: boolean;\n  format: ExportFormat;\n  errors: string[];\n  warnings: string[];\n}\n\nexport interface TraceExporter {\n  name: string;\n  format: ExportFormat;\n  export(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult;\n  validate?(content: string): ExportValidationResult;\n}\n\n/** Library version string embedded in JSON exports (human-readable, not semver guarantee for formats). */\nexport const EXPORT_PAYLOAD_VERSION = \"0.1.2\";\n","/**\n * Contextual sensitive-key classification for safety checks and redaction.\n *\n * Avoids treating model token-configuration fields (ls_max_tokens, max_tokens,\n * token_count, …) as credentials solely because they contain the substring\n * \"token\". Value-based secret detectors remain separate.\n *\n * @experimental Shared classifier used by checks (6.14.2+); parity across\n * surfaces lands in the same patch train.\n */\n\n/** True when the original key already uses an explicit separator. */\nfunction keyHasExplicitSeparator(value: string): boolean {\n  return /[_\\-.]/.test(value);\n}\n\n/**\n * Canonicalize field names so camelCase / kebab / dot / snake forms share a\n * snake_case shape the compound matcher can recognize (`userPassword` →\n * `user_password`).\n */\nexport function normalizeSensitiveKey(value: string): string {\n  return value\n    .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"_\")\n    .replace(/^_+|_+$/g, \"\");\n}\n\n/** Model / usage configuration keys that are not credentials by key alone. */\nexport const NON_CREDENTIAL_TOKEN_CONFIG_KEYS: ReadonlySet<string> = new Set(\n  [\n    \"tokens\",\n    \"max_tokens\",\n    \"min_tokens\",\n    \"ls_max_tokens\",\n    \"token_count\",\n    \"token_limit\",\n    \"token_budget\",\n    \"input_tokens\",\n    \"output_tokens\",\n    \"total_tokens\",\n    \"cached_tokens\",\n    \"prompt_tokens\",\n    \"completion_tokens\",\n  ].map(normalizeSensitiveKey),\n);\n\nexport const DEFAULT_CREDENTIAL_SENSITIVE_KEYS = [\n  \"authorization\",\n  \"cookie\",\n  \"token\",\n  \"access_token\",\n  \"accesstoken\",\n  \"auth_token\",\n  \"authtoken\",\n  \"refresh_token\",\n  \"refreshtoken\",\n  \"id_token\",\n  \"idtoken\",\n  \"bearer_token\",\n  \"bearertoken\",\n  \"api_token\",\n  \"apitoken\",\n  \"apikey\",\n  \"api_key\",\n  \"password\",\n  \"secret\",\n  \"email\",\n] as const;\n\nfunction isTokenCredentialKey(normalized: string): boolean {\n  if (NON_CREDENTIAL_TOKEN_CONFIG_KEYS.has(normalized)) return false;\n  if (normalized === \"token\") return true;\n  // access_token / refreshToken → *token, but not *tokens (max_tokens → max_tokens)\n  if (normalized.endsWith(\"tokens\")) return false;\n  return normalized.endsWith(\"token\");\n}\n\n/**\n * True when the field name looks credential-sensitive under the shared policy.\n *\n * Suffix compounds (`user_password`, `userPassword`) always match. Prefix\n * compounds (`email_note`) match only when the original key already contained\n * an explicit separator, so camelCase topic fields like `emailNote` stay for\n * value detectors instead of key redaction.\n */\nexport function isCredentialSensitiveKey(\n  key: string | undefined,\n  sensitiveKeys: readonly string[] = DEFAULT_CREDENTIAL_SENSITIVE_KEYS,\n): boolean {\n  if (!key) return false;\n  const normalized = normalizeSensitiveKey(key);\n  if (!normalized) return false;\n  if (NON_CREDENTIAL_TOKEN_CONFIG_KEYS.has(normalized)) return false;\n\n  const allowPrefixCompound = keyHasExplicitSeparator(key);\n\n  for (const sensitive of sensitiveKeys) {\n    const s = normalizeSensitiveKey(sensitive);\n    if (!s) continue;\n    if (s === \"token\") {\n      if (isTokenCredentialKey(normalized)) return true;\n      continue;\n    }\n    if (normalized === s) return true;\n    // Compound keys with explicit separators, plus camelCase owner+secret suffixes.\n    if (normalized.endsWith(`_${s}`)) return true;\n    if (allowPrefixCompound && normalized.startsWith(`${s}_`)) return true;\n  }\n  return false;\n}\n","import crypto from \"node:crypto\";\n\nimport { isCredentialSensitiveKey } from \"../safety/sensitive-key.js\";\n\nimport type { RedactionRule } from \"../types/log-config.js\";\n\nexport const DEFAULT_REDACT_KEYS = [\n  \"authorization\",\n  \"cookie\",\n  \"token\",\n  \"apiKey\",\n  \"password\",\n  \"secret\",\n  \"email\",\n] as const;\n\nexport interface RedactorOptions {\n  rules?: RedactionRule[];\n  /** Additional exact keys (case-insensitive) to redact in addition to defaults. */\n  extraKeys?: readonly string[];\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction toKey(s: string): string {\n  return s.toLowerCase();\n}\n\nfunction stableHash(value: string): string {\n  const h = crypto.createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n  return h.slice(0, 8);\n}\n\ntype CompiledRule = (\n  | { key: string; strategy: \"full\" }\n  | { key: string; strategy: \"prefix\"; keep: number }\n  | { key: string; strategy: \"hash\" }\n) & { raw?: string };\n\nfunction compileRules(\n  rules?: RedactionRule[],\n  extraKeys?: readonly string[],\n): CompiledRule[] {\n  const out = new Map<string, CompiledRule>();\n\n  const set = (r: CompiledRule) => {\n    const k = toKey(r.key);\n    out.set(k, { ...r, key: k, raw: r.raw ?? r.key } as CompiledRule);\n  };\n\n  for (const k of DEFAULT_REDACT_KEYS) {\n    set({ key: k, strategy: \"full\" });\n  }\n\n  for (const k of extraKeys ?? []) {\n    if (typeof k === \"string\" && k.length > 0) {\n      set({ key: k, strategy: \"full\" });\n    }\n  }\n\n  for (const r of rules ?? []) {\n    if (typeof r === \"string\") {\n      set({ key: r, strategy: \"full\" });\n      continue;\n    }\n    const key = r.key;\n    if (r.strategy === \"full\") set({ key, strategy: \"full\" });\n    if (r.strategy === \"hash\") set({ key, strategy: \"hash\" });\n    if (r.strategy === \"prefix\") {\n      set({ key, strategy: \"prefix\", keep: typeof r.keep === \"number\" ? r.keep : 8 });\n    }\n  }\n\n  return [...out.values()];\n}\n\nexport class Redactor {\n  readonly #rules: CompiledRule[];\n\n  constructor(options?: RedactorOptions) {\n    this.#rules = compileRules(options?.rules, options?.extraKeys);\n  }\n\n  /** Field names this redactor treats as sensitive, for value-level helpers. */\n  get sensitiveKeys(): readonly string[] {\n    return this.#rules.map((rule) => rule.raw ?? rule.key);\n  }\n\n  redactValue(key: string, value: unknown): unknown {\n    const k = toKey(key);\n    const rule =\n      this.#rules.find((r) => r.key === k) ??\n      this.#rules.find((r) => isCredentialSensitiveKey(key, [r.raw ?? r.key]));\n    if (!rule) {\n      return this.#redactNested(value);\n    }\n\n    if (rule.strategy === \"full\") return \"[REDACTED]\";\n    const asString =\n      typeof value === \"string\"\n        ? value\n        : typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\"\n          ? String(value)\n          : undefined;\n\n    if (rule.strategy === \"prefix\") {\n      if (asString === undefined) return \"[REDACTED]\";\n      const keep = Math.max(0, Math.floor(rule.keep));\n      return asString.length <= keep ? `${asString}…` : `${asString.slice(0, keep)}…`;\n    }\n\n    if (rule.strategy === \"hash\") {\n      if (asString === undefined) return \"[HASH:unknown]\";\n      return `[HASH:${stableHash(asString)}]`;\n    }\n\n    return this.#redactNested(value);\n  }\n\n  redactRecord(record: Record<string, unknown>): Record<string, unknown> {\n    const out: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(record)) {\n      out[k] = this.redactValue(k, v);\n    }\n    return out;\n  }\n\n  #redactNested(value: unknown): unknown {\n    if (Array.isArray(value)) {\n      return value.map((v) => this.#redactNested(v));\n    }\n    if (isRecord(value)) {\n      const out: Record<string, unknown> = {};\n      for (const [k, v] of Object.entries(value)) {\n        out[k] = this.redactValue(k, v);\n      }\n      return out;\n    }\n    return value;\n  }\n}\n\n","/**\n * High-confidence free-text credential detectors for pre-disk error messages.\n *\n * Mirrors `@agent-inspect/redact` local-profile value detectors (keep in sync with\n * `packages/redact/src/index.ts` credentialDetectors + `key-value-secret.ts`).\n * Key-based redaction alone cannot protect secrets embedded in `error.message`.\n */\n\n/** Keep in sync with packages/redact/src/key-value-secret.ts. */\nconst KEY_VALUE_SECRET_PATTERN =\n  /\\b(?:api[_-]?key|internal[_-]?token|access[_-]?token|auth[_-]?token|password|secret|token)=(?!\\[(?:REDACTED(?::[^\\]]*)?|HASH:[0-9a-f]{8})\\](?![^\\s\"'\\\\&#?]))([^\\s\"'\\\\]{8,})/i;\n\n/**\n * Ordered high-confidence value patterns. A match replaces the whole string\n * with `[REDACTED]`, matching `@agent-inspect/redact` detector replace semantics.\n */\nconst HIGH_CONFIDENCE_CREDENTIAL_PATTERNS: readonly RegExp[] = [\n  /^(?:basic|bearer|digest|apikey)\\s+[a-z0-9._~+/=-]+$/i,\n  /\\bbearer\\s+[a-z0-9._~+/=-]{12,}\\b/i,\n  /\\b[a-z0-9_.-]+=[^;\\s]+(?:;\\s*[a-z0-9_.-]+=[^;\\s]+)+/i,\n  /\\beyJ[a-zA-Z0-9_-]{8,}\\.[a-zA-Z0-9_-]{8,}\\.[a-zA-Z0-9_-]{8,}\\b/,\n  /\\b(?:sk-(?:proj-)?[a-zA-Z0-9_-]{16,}|sk-ant-[a-zA-Z0-9_-]{16,}|AIza[0-9A-Za-z_-]{20,})\\b/,\n  /\\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{20,}\\b/,\n  /\\b(?:AKIA|ASIA)[A-Z0-9]{16}\\b/,\n  /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*-----END [A-Z ]*PRIVATE KEY-----/,\n  KEY_VALUE_SECRET_PATTERN,\n];\n\nexport function stringContainsHighConfidenceCredential(value: string): boolean {\n  for (const pattern of HIGH_CONFIDENCE_CREDENTIAL_PATTERNS) {\n    pattern.lastIndex = 0;\n    if (pattern.test(value)) {\n      pattern.lastIndex = 0;\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * When a free-text string matches a high-confidence credential detector,\n * replace the whole value (Redactor-compatible). Otherwise return unchanged.\n */\nexport function redactHighConfidenceCredentialsInString(\n  value: string,\n  replacement = \"[REDACTED]\",\n): string {\n  return stringContainsHighConfidenceCredential(value) ? replacement : value;\n}\n","/**\n * URL-aware redaction for http(s) and common connection-string schemes.\n *\n * Keeps scheme, host and path so two attempts of the same step stay\n * comparable, and removes credentials carried in userinfo, query params and\n * fragment params. Identifier-looking path segments are masked on http(s)\n * when the profile redacts identifiers. Connection URIs only strip userinfo\n * and sensitive params so database/queue paths stay intact.\n *\n * Mirrors `packages/redact/src/url-redaction.ts`. Keep both copies in sync.\n */\n\nimport { isCredentialSensitiveKey } from \"./sensitive-key.js\";\n\nexport interface UrlRedactionOptions {\n  /** Field names the active profile redacts, used for query and fragment params. */\n  sensitiveKeys: readonly string[];\n  /** Value-level credential check, usually the profile's detectors. */\n  isSensitiveValue: (value: string) => boolean;\n  replacement?: string;\n  /** Mask identifier-looking path segments (share and strict profiles, http(s) only). */\n  maskPathIds?: boolean;\n  idPlaceholder?: string;\n}\n\nexport interface UrlRedactionResult {\n  value: string;\n  credentialRedacted: boolean;\n  identifiersMasked: boolean;\n}\n\nconst HTTP_URL = /^https?:\\/\\/[^\\s]+$/i;\n\n/** Connection schemes common in agent tool attributes (DB, cache, queue). */\nconst CONNECTION_PROTOCOLS = new Set([\n  \"postgres:\",\n  \"postgresql:\",\n  \"mysql:\",\n  \"mariadb:\",\n  \"mongodb:\",\n  \"mongodb+srv:\",\n  \"redis:\",\n  \"rediss:\",\n  \"amqp:\",\n  \"amqps:\",\n]);\n\nconst CONNECTION_URI =\n  /^(?:postgres|postgresql|mysql|mariadb|mongodb(?:\\+srv)?|rediss?|amqps?):\\/\\/[^\\s]+$/i;\n\n/**\n * Connection strings are not always WHATWG URLs (multihost + IP-literal\n * authorities). When `new URL` fails, strip a clear userinfo@ authority\n * prefix so credentials never survive as unchanged SAFE text.\n * @see https://github.com/mongodb/specifications/blob/master/source/connection-string/connection-string-spec.md#host-information\n */\nconst CONNECTION_USERINFO =\n  /^(postgres|postgresql|mysql|mariadb|mongodb(?:\\+srv)?|rediss?|amqps?):\\/\\/([^@/?#]+)@(.+)$/i;\n\nconst CONNECTION_HAS_USERINFO =\n  /^(?:postgres|postgresql|mysql|mariadb|mongodb(?:\\+srv)?|rediss?|amqps?):\\/\\/[^@/?#]+@/i;\n\n\nconst UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst HEX_SEGMENT = /^[0-9a-f]{12,}$/i;\nconst NUMERIC_SEGMENT = /^\\d{5,}$/;\nconst OPAQUE_SEGMENT = /^[A-Za-z0-9_-]{20,}$/;\n\n/** True when the whole string is a single http(s) URL. */\nexport function looksLikeHttpUrl(value: string): boolean {\n  return HTTP_URL.test(value.trim());\n}\n\n/** True when the whole string is a known connection URI with a scheme:// authority. */\nexport function looksLikeConnectionUri(value: string): boolean {\n  return CONNECTION_URI.test(value.trim());\n}\n\n/** True when the value is eligible for URL-aware rewrite (http(s) or connection URI). */\nexport function looksLikeUrlForRedaction(value: string): boolean {\n  return looksLikeHttpUrl(value) || looksLikeConnectionUri(value);\n}\n\nfunction parseRedactableUrl(value: string): URL | undefined {\n  try {\n    const url = new URL(value.trim());\n    if (url.protocol === \"http:\" || url.protocol === \"https:\") return url;\n    if (CONNECTION_PROTOCOLS.has(url.protocol)) return url;\n    return undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Strip userinfo when the generic URL parser cannot handle a recognized\n * connection authority (e.g. comma-separated multihost lists).\n */\nfunction redactConnectionUserinfoFallback(\n  value: string,\n  replacement: string,\n): UrlRedactionResult | undefined {\n  const trimmed = value.trim();\n  const match = CONNECTION_USERINFO.exec(trimmed);\n  if (match) {\n    const [, scheme, , rest] = match;\n    if (scheme && rest && rest.length > 0) {\n      return {\n        value: `${scheme}://${rest}`,\n        credentialRedacted: true,\n        identifiersMasked: false,\n      };\n    }\n  }\n  // Recognized scheme with userinfo that still cannot be rewritten safely:\n  // withhold the whole value rather than leave credentials unchanged.\n  if (looksLikeConnectionUri(trimmed) && CONNECTION_HAS_USERINFO.test(trimmed)) {\n    return {\n      value: replacement,\n      credentialRedacted: true,\n      identifiersMasked: false,\n    };\n  }\n  return undefined;\n}\n\nfunction isHttpProtocol(protocol: string): boolean {\n  return protocol === \"http:\" || protocol === \"https:\";\n}\n\nfunction isIdentifierSegment(segment: string): boolean {\n  if (UUID_SEGMENT.test(segment)) return true;\n  if (HEX_SEGMENT.test(segment)) return true;\n  if (NUMERIC_SEGMENT.test(segment)) return true;\n  return OPAQUE_SEGMENT.test(segment) && /\\d/.test(segment) && /[A-Za-z]/.test(segment);\n}\n\nfunction decodeParam(value: string): string {\n  try {\n    return decodeURIComponent(value.replace(/\\+/g, \" \"));\n  } catch {\n    return value;\n  }\n}\n\nfunction redactParams(\n  raw: string,\n  options: UrlRedactionOptions,\n  replacement: string,\n): { value: string; redacted: boolean } {\n  let redacted = false;\n  const parts = raw.split(\"&\").map((part) => {\n    if (part.length === 0) return part;\n    const separator = part.indexOf(\"=\");\n    if (separator < 0) return part;\n    const rawKey = part.slice(0, separator);\n    const rawValue = part.slice(separator + 1);\n    const key = decodeParam(rawKey);\n    const value = decodeParam(rawValue);\n    if (\n      isCredentialSensitiveKey(key, options.sensitiveKeys) ||\n      options.isSensitiveValue(value)\n    ) {\n      redacted = true;\n      return `${rawKey}=${replacement}`;\n    }\n    return part;\n  });\n  return { value: parts.join(\"&\"), redacted };\n}\n\n/**\n * Redacts the sensitive parts of an http(s) or connection URI. Returns the\n * value unchanged when it is not a supported URL or has nothing to remove.\n */\nexport function redactUrlString(\n  value: string,\n  options: UrlRedactionOptions,\n): UrlRedactionResult {\n  const unchanged: UrlRedactionResult = {\n    value,\n    credentialRedacted: false,\n    identifiersMasked: false,\n  };\n  if (!looksLikeUrlForRedaction(value)) return unchanged;\n\n  const replacement = options.replacement ?? \"[REDACTED]\";\n  const url = parseRedactableUrl(value);\n  if (!url) {\n    return redactConnectionUserinfoFallback(value, replacement) ?? unchanged;\n  }\n\n  const idPlaceholder = options.idPlaceholder ?? \"[id]\";\n  const http = isHttpProtocol(url.protocol);\n\n  let credentialRedacted = url.username.length > 0 || url.password.length > 0;\n  let identifiersMasked = false;\n\n  let pathname = url.pathname;\n  if (http && options.maskPathIds === true) {\n    pathname = url.pathname\n      .split(\"/\")\n      .map((segment) => {\n        if (segment.length === 0 || !isIdentifierSegment(decodeParam(segment))) {\n          return segment;\n        }\n        identifiersMasked = true;\n        return idPlaceholder;\n      })\n      .join(\"/\");\n  }\n\n  let search = \"\";\n  if (url.search.length > 1) {\n    const params = redactParams(url.search.slice(1), options, replacement);\n    if (params.redacted) credentialRedacted = true;\n    search = `?${params.value}`;\n  } else if (url.search.length === 1) {\n    search = \"?\";\n  }\n\n  let hash = url.hash;\n  if (url.hash.includes(\"=\")) {\n    const params = redactParams(url.hash.slice(1), options, replacement);\n    if (params.redacted) credentialRedacted = true;\n    hash = `#${params.value}`;\n  }\n\n  if (!credentialRedacted && !identifiersMasked) return unchanged;\n\n  return {\n    value: `${url.protocol}//${url.host}${pathname}${search}${hash}`,\n    credentialRedacted,\n    identifiersMasked,\n  };\n}\n","import type { RedactionProfile } from \"./types.js\";\n\n/** Extra keys redacted under the `share` profile (in addition to {@link DEFAULT_REDACT_KEYS}). */\nexport const SHARE_PROFILE_EXTRA_KEYS = [\n  \"userEmail\",\n  \"customerEmail\",\n  \"phone\",\n  \"phoneNumber\",\n  \"address\",\n  \"ip\",\n  \"ipAddress\",\n  \"sessionId\",\n  \"requestId\",\n  \"correlationId\",\n  \"decisionId\",\n  \"groupId\",\n  \"customerId\",\n  \"userId\",\n  \"accountId\",\n  \"tenantId\",\n  \"orgId\",\n  \"organizationId\",\n  \"traceId\",\n  \"spanId\",\n  \"parentSpanId\",\n] as const;\n\n/** Extra keys redacted under the `strict` profile (in addition to share keys). */\nexport const STRICT_PROFILE_EXTRA_KEYS = [\n  \"prompt\",\n  \"completion\",\n  \"input\",\n  \"output\",\n  \"inputPreview\",\n  \"outputPreview\",\n  \"message\",\n  \"messages\",\n  \"transcript\",\n  \"context\",\n  \"document\",\n  \"documents\",\n  \"chunk\",\n  \"chunks\",\n  \"retrieval\",\n  \"query\",\n] as const;\n\nexport interface ResolvedRedactionProfile {\n  profile: RedactionProfile;\n  extraKeys: readonly string[];\n  maxMetadataValueLengthCap?: number;\n  maxPreviewLengthCap?: number;\n}\n\n/** Resolves named profile behavior (keys + metadata string caps). */\nexport function resolveRedactionProfile(\n  profile: RedactionProfile = \"local\",\n): ResolvedRedactionProfile {\n  switch (profile) {\n    case \"local\":\n      return { profile: \"local\", extraKeys: [] };\n    case \"share\":\n      return {\n        profile: \"share\",\n        extraKeys: SHARE_PROFILE_EXTRA_KEYS,\n        maxMetadataValueLengthCap: 500,\n        maxPreviewLengthCap: 200,\n      };\n    case \"strict\":\n      return {\n        profile: \"strict\",\n        extraKeys: [...SHARE_PROFILE_EXTRA_KEYS, ...STRICT_PROFILE_EXTRA_KEYS],\n        maxMetadataValueLengthCap: 200,\n        maxPreviewLengthCap: 80,\n      };\n    default:\n      return { profile: \"local\", extraKeys: [] };\n  }\n}\n\nfunction isPreviewKey(key: string): boolean {\n  return key.toLowerCase().includes(\"preview\");\n}\n\n/**\n * Applies profile metadata string caps. User-provided lower limits are preserved.\n */\nexport function applyProfileMetadataCaps(\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n  resolved: ResolvedRedactionProfile,\n): { maxMetadataValueLength: number; maxPreviewLength: number } {\n  let meta = maxMetadataValueLength;\n  let preview = maxPreviewLength;\n\n  if (resolved.maxMetadataValueLengthCap !== undefined) {\n    meta = Math.min(meta, resolved.maxMetadataValueLengthCap);\n  }\n  if (resolved.maxPreviewLengthCap !== undefined) {\n    preview = Math.min(preview, resolved.maxPreviewLengthCap);\n  }\n\n  return { maxMetadataValueLength: meta, maxPreviewLength: preview };\n}\n\nexport function truncateStringForProfile(\n  value: string,\n  key: string,\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n): string {\n  const max = isPreviewKey(key) ? maxPreviewLength : maxMetadataValueLength;\n  if (max <= 0) return \"…\";\n  if (value.length <= max) return value;\n  return `${value.slice(0, max)}…`;\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport { Redactor, DEFAULT_REDACT_KEYS } from \"../logs/redactor.js\";\nimport { stringContainsHighConfidenceCredential } from \"../safety/credential-value-patterns.js\";\nimport { redactUrlString } from \"../safety/url-redaction.js\";\nimport {\n  applyProfileMetadataCaps,\n  resolveRedactionProfile,\n  truncateStringForProfile,\n} from \"../redaction-profiles.js\";\nimport type { ErrorInfo, RedactionProfile, TraceEvent } from \"../types.js\";\n\nexport interface RedactRunTreeForExportOptions {\n  redactionProfile?: RedactionProfile;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction deepClone<T>(value: T): T {\n  if (value === null || typeof value !== \"object\") {\n    return value;\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => deepClone(item)) as T;\n  }\n  const out: Record<string, unknown> = {};\n  for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n    out[k] = deepClone(v);\n  }\n  return out as T;\n}\n\nfunction boundAttributeValues(\n  record: Record<string, unknown>,\n  sensitiveKeys: readonly string[],\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n  seen: WeakSet<object>,\n  depth: number,\n): Record<string, unknown> {\n  if (depth > 32) {\n    return { truncated: true, reason: \"maxDepth\" };\n  }\n\n  const out: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(record)) {\n    out[key] = boundValue(\n      value,\n      key,\n      sensitiveKeys,\n      maxMetadataValueLength,\n      maxPreviewLength,\n      seen,\n      depth,\n    );\n  }\n  return out;\n}\n\nfunction boundValue(\n  value: unknown,\n  key: string,\n  sensitiveKeys: readonly string[],\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n  seen: WeakSet<object>,\n  depth: number,\n): unknown {\n  if (value === null || typeof value !== \"object\") {\n    if (typeof value === \"string\") {\n      const rewritten = redactUrlString(value, {\n        sensitiveKeys,\n        isSensitiveValue: stringContainsHighConfidenceCredential,\n        maskPathIds: true,\n      }).value;\n      return truncateStringForProfile(\n        stringContainsHighConfidenceCredential(rewritten) ? \"[REDACTED]\" : rewritten,\n        key,\n        maxMetadataValueLength,\n        maxPreviewLength,\n      );\n    }\n    return value;\n  }\n\n  if (seen.has(value)) return \"[Circular]\";\n  seen.add(value);\n\n  if (Array.isArray(value)) {\n    return value\n      .slice(0, 50)\n      .map((item, index) =>\n        boundValue(\n          item,\n          String(index),\n          sensitiveKeys,\n          maxMetadataValueLength,\n          maxPreviewLength,\n          seen,\n          depth + 1,\n        ),\n      );\n  }\n\n  return boundAttributeValues(\n    value as Record<string, unknown>,\n    sensitiveKeys,\n    maxMetadataValueLength,\n    maxPreviewLength,\n    seen,\n    depth + 1,\n  );\n}\n\nfunction redactEventAttributes(\n  attrs: Record<string, unknown> | undefined,\n  redactor: Redactor,\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n): Record<string, unknown> | undefined {\n  if (!attrs || Object.keys(attrs).length === 0) {\n    return attrs;\n  }\n\n  const redacted = redactor.redactRecord(attrs);\n  const seen = new WeakSet<object>();\n  const bounded = boundAttributeValues(\n    redacted,\n    [...DEFAULT_REDACT_KEYS, ...redactor.sensitiveKeys],\n    maxMetadataValueLength,\n    maxPreviewLength,\n    seen,\n    0,\n  );\n\n  const err = bounded.error;\n  if (isRecord(err) && typeof err.message === \"string\") {\n    bounded.error = {\n      ...err,\n      message: truncateStringForProfile(\n        err.message,\n        \"message\",\n        maxMetadataValueLength,\n        maxPreviewLength,\n      ),\n      ...(typeof err.stack === \"string\"\n        ? {\n            stack: truncateStringForProfile(\n              err.stack,\n              \"stack\",\n              maxMetadataValueLength,\n              maxPreviewLength,\n            ),\n          }\n        : {}),\n    };\n  }\n\n  return bounded;\n}\n\nfunction redactErrorInfo(\n  error: ErrorInfo | undefined,\n  redactor: Redactor,\n  maxMetadataValueLength: number,\n  maxPreviewLength: number,\n): ErrorInfo | undefined {\n  if (error === undefined) return undefined;\n\n  const record = redactEventAttributes(\n    { error },\n    redactor,\n    maxMetadataValueLength,\n    maxPreviewLength,\n  );\n  const redacted = record?.error;\n  if (!isRecord(redacted) || typeof redacted.message !== \"string\") {\n    return undefined;\n  }\n\n  return {\n    message: redacted.message,\n    ...(typeof redacted.stack === \"string\" ? { stack: redacted.stack } : {}),\n  };\n}\n\n/**\n * Returns structured trace-event copies that are safe to use across every report section.\n * Profile redaction and bounds are applied before any human-readable rendering.\n */\nexport function redactTraceEventsForReport(\n  events: readonly TraceEvent[],\n  options?: RedactRunTreeForExportOptions,\n): TraceEvent[] {\n  const profile = options?.redactionProfile ?? \"local\";\n  if (profile === \"local\") {\n    return deepClone(events) as TraceEvent[];\n  }\n\n  const resolved = resolveRedactionProfile(profile);\n  const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n    2000,\n    500,\n    resolved,\n  );\n  const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n  return events.map((event): TraceEvent => {\n    switch (event.event) {\n      case \"run_started\":\n        return {\n          ...event,\n          name: truncateStringForProfile(\n            event.name,\n            \"name\",\n            maxMetadataValueLength,\n            maxPreviewLength,\n          ),\n          ...(event.metadata !== undefined\n            ? {\n                metadata: redactEventAttributes(\n                  event.metadata,\n                  redactor,\n                  maxMetadataValueLength,\n                  maxPreviewLength,\n                ),\n              }\n            : {}),\n        };\n      case \"step_started\":\n        return {\n          ...event,\n          name: truncateStringForProfile(\n            event.name,\n            \"name\",\n            maxMetadataValueLength,\n            maxPreviewLength,\n          ),\n          ...(event.metadata !== undefined\n            ? {\n                metadata: redactEventAttributes(\n                  event.metadata,\n                  redactor,\n                  maxMetadataValueLength,\n                  maxPreviewLength,\n                ),\n              }\n            : {}),\n        };\n      case \"run_completed\":\n      case \"step_completed\":\n        return {\n          ...event,\n          ...(event.error !== undefined\n            ? {\n                error: redactErrorInfo(\n                  event.error,\n                  redactor,\n                  maxMetadataValueLength,\n                  maxPreviewLength,\n                ),\n              }\n            : {}),\n        };\n      case \"outcome_observed\": {\n        const actualAttrs =\n          event.actual !== undefined\n            ? redactEventAttributes(\n                { value: event.actual },\n                redactor,\n                maxMetadataValueLength,\n                maxPreviewLength,\n              )\n            : undefined;\n        const redactedActual =\n          actualAttrs !== undefined && \"value\" in actualAttrs\n            ? actualAttrs.value\n            : undefined;\n        const redactedEvidence =\n          event.evidence !== undefined\n            ? redactEventAttributes(\n                isRecord(event.evidence) ? event.evidence : { value: event.evidence },\n                redactor,\n                maxMetadataValueLength,\n                maxPreviewLength,\n              )\n            : undefined;\n        return {\n          ...event,\n          name: truncateStringForProfile(\n            event.name,\n            \"name\",\n            maxMetadataValueLength,\n            maxPreviewLength,\n          ),\n          expectation: truncateStringForProfile(\n            event.expectation,\n            \"expectation\",\n            maxMetadataValueLength,\n            maxPreviewLength,\n          ),\n          ...(redactedActual !== undefined ? { actual: redactedActual } : {}),\n          ...(redactedEvidence !== undefined ? { evidence: redactedEvidence } : {}),\n        };\n      }\n      default:\n        return event;\n    }\n  });\n}\n\n/**\n * Returns a deep copy of `tree` with profile-based redaction applied to event attributes.\n * Does not mutate the input tree.\n */\nexport function redactRunTreeForExport(\n  tree: InspectRunTree,\n  options?: RedactRunTreeForExportOptions,\n): InspectRunTree {\n  const profile = options?.redactionProfile ?? \"local\";\n  if (profile === \"local\") {\n    return deepClone(tree);\n  }\n\n  const resolved = resolveRedactionProfile(profile);\n  const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n    2000,\n    500,\n    resolved,\n  );\n  const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n  const clone = deepClone(tree);\n\n  function walk(nodes: InspectNode[]): void {\n    for (const node of nodes) {\n      if (node.event.attributes !== undefined) {\n        node.event.attributes = redactEventAttributes(\n          node.event.attributes,\n          redactor,\n          maxMetadataValueLength,\n          maxPreviewLength,\n        );\n      }\n      if (node.children.length > 0) {\n        walk(node.children);\n      }\n    }\n  }\n\n  walk(clone.children);\n  return clone;\n}\n","import type { InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nconst REDACT_SUBSTRINGS = [\n  \"authorization\",\n  \"cookie\",\n  \"token\",\n  \"apikey\",\n  \"password\",\n  \"secret\",\n  \"email\",\n] as const;\n\nfunction shouldRedactKey(key: string): boolean {\n  const k = key.toLowerCase();\n  for (const s of REDACT_SUBSTRINGS) {\n    if (k.includes(s)) return true;\n  }\n  return false;\n}\n\nexport function safeString(value: unknown, maxLength?: number): string {\n  if (value === null || value === undefined) return \"\";\n  let s: string;\n  if (typeof value === \"string\") s = value;\n  else if (typeof value === \"number\" || typeof value === \"boolean\") s = String(value);\n  else s = stableJson(value, false);\n  if (maxLength !== undefined && maxLength >= 0 && s.length > maxLength) {\n    return `${s.slice(0, maxLength)}…`;\n  }\n  return s;\n}\n\n/** Escape markdown table pipes and normalize line breaks for safe inline text. */\nexport function escapeMarkdown(value: string): string {\n  return value\n    .replace(/\\|/g, \"\\\\|\")\n    .replace(/\\r\\n/g, \"\\n\")\n    .replace(/\\r/g, \"\\n\")\n    .replace(/\\n/g, \" \");\n}\n\nexport function escapeHtml(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&quot;\")\n    .replace(/'/g, \"&#39;\");\n}\n\nfunction sortKeysDeep(input: unknown): unknown {\n  if (input === null || typeof input !== \"object\") return input;\n  if (Array.isArray(input)) return input.map(sortKeysDeep);\n  const o = input as Record<string, unknown>;\n  const out: Record<string, unknown> = {};\n  for (const k of Object.keys(o).sort()) {\n    out[k] = sortKeysDeep(o[k]);\n  }\n  return out;\n}\n\nexport function stableJson(value: unknown, pretty?: boolean): string {\n  const sorted = sortKeysDeep(value);\n  return pretty === true ? JSON.stringify(sorted, null, 2) : JSON.stringify(sorted);\n}\n\nexport function compactAttributes(\n  attrs: Record<string, unknown> | undefined,\n  options?: { maxLength?: number; redacted?: boolean },\n): Record<string, unknown> {\n  if (attrs === undefined) return {};\n  const maxLen = options?.maxLength ?? 500;\n  const redacted = options?.redacted ?? true;\n  const out: Record<string, unknown> = {};\n  for (const key of Object.keys(attrs).sort()) {\n    if (redacted && shouldRedactKey(key)) {\n      out[key] = \"[REDACTED]\";\n      continue;\n    }\n    const v = attrs[key];\n    out[key] = compactValue(v, maxLen, redacted);\n  }\n  return out;\n}\n\nfunction compactValue(value: unknown, maxLen: number, redacted: boolean): unknown {\n  if (value === null || typeof value !== \"object\") {\n    return typeof value === \"string\" ? safeString(value, maxLen) : value;\n  }\n  if (Array.isArray(value)) {\n    const arr = value.slice(0, 20).map((x) => compactValue(x, maxLen, redacted));\n    if (value.length > 20) arr.push(`…(+${value.length - 20} more)`);\n    return arr;\n  }\n  const o = value as Record<string, unknown>;\n  const inner: Record<string, unknown> = {};\n  for (const k of Object.keys(o)) {\n    if (redacted && shouldRedactKey(k)) inner[k] = \"[REDACTED]\";\n    else inner[k] = compactValue(o[k], maxLen, redacted);\n  }\n  return inner;\n}\n\nexport function summarizeTree(tree: InspectRunTree): Record<string, unknown> {\n  const flat = flattenTree(tree);\n  const errorNodes = flat.filter((n) => n.event.status === \"error\").length;\n  return {\n    runId: tree.runId,\n    name: tree.name,\n    status: tree.status,\n    startedAt: tree.startedAt,\n    endedAt: tree.endedAt,\n    durationMs: tree.durationMs,\n    stepCount: flat.length,\n    errorStepCount: errorNodes,\n    totalEvents: tree.metadata.totalEvents,\n    confidenceBreakdown: { ...tree.metadata.confidenceBreakdown },\n    kinds: { ...tree.metadata.kinds },\n  };\n}\n\n/** Depth-first pre-order flatten (matches typical tree display). */\nexport function flattenTree(tree: InspectRunTree): InspectNode[] {\n  const out: InspectNode[] = [];\n  function walk(nodes: InspectNode[]): void {\n    for (const n of nodes) {\n      out.push(n);\n      if (n.children.length > 0) walk(n.children);\n    }\n  }\n  walk(tree.children);\n  return out;\n}\n\nexport function zeroKinds(): Record<InspectKind, number> {\n  return {\n    RUN: 0,\n    AGENT: 0,\n    LLM: 0,\n    TOOL: 0,\n    CHAIN: 0,\n    RETRIEVER: 0,\n    DECISION: 0,\n    RESULT: 0,\n    ERROR: 0,\n    LOGIC: 0,\n    LOG: 0,\n    OUTCOME: 0,\n  };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n  compactAttributes,\n  escapeHtml,\n  flattenTree,\n  safeString,\n  stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeHtml(nodes: InspectNode[], ulClass = \"tree\"): string {\n  if (nodes.length === 0) return \"\";\n  const parts: string[] = [`<ul class=\"${ulClass}\">`];\n  for (const n of nodes) {\n    const ev = n.event;\n    const status = ev.status ?? \"?\";\n    const dur =\n      ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n        ? `${ev.durationMs}ms`\n        : \"-\";\n    parts.push(\"<li>\");\n    parts.push(\n      `<span class=\"nm\">${escapeHtml(ev.name)}</span> <span class=\"meta\">[${escapeHtml(ev.kind)}] ${escapeHtml(status)} (${escapeHtml(dur)})</span>`,\n    );\n    if (n.children.length > 0) {\n      parts.push(renderTreeHtml(n.children, \"tree nested\"));\n    }\n    parts.push(\"</li>\");\n  }\n  parts.push(\"</ul>\");\n  return parts.join(\"\");\n}\n\nexport function exportHtml(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult {\n  const warnings: string[] = [];\n  const includeMetadata = options?.includeMetadata ?? true;\n  const includeAttributes = options?.includeAttributes ?? false;\n  const includeErrors = options?.includeErrors ?? true;\n  const maxLen = options?.maxAttributeLength ?? 500;\n  const redacted = options?.redacted ?? true;\n\n  const titleName = escapeHtml(tree.name ?? tree.runId);\n\n  const summaryRows: string[] = [];\n  summaryRows.push(\n    `<tr><th scope=\"row\">runId</th><td><code>${escapeHtml(tree.runId)}</code></td></tr>`,\n  );\n  if (tree.name !== undefined) {\n    summaryRows.push(`<tr><th scope=\"row\">name</th><td>${escapeHtml(tree.name)}</td></tr>`);\n  }\n  summaryRows.push(\n    `<tr><th scope=\"row\">status</th><td>${escapeHtml(String(tree.status ?? \"unknown\"))}</td></tr>`,\n  );\n  summaryRows.push(\n    `<tr><th scope=\"row\">durationMs</th><td>${tree.durationMs !== undefined ? escapeHtml(String(tree.durationMs)) : \"—\"}</td></tr>`,\n  );\n  summaryRows.push(\n    `<tr><th scope=\"row\">startedAt</th><td>${tree.startedAt !== undefined ? escapeHtml(String(tree.startedAt)) : \"—\"}</td></tr>`,\n  );\n  summaryRows.push(\n    `<tr><th scope=\"row\">endedAt</th><td>${tree.endedAt !== undefined ? escapeHtml(String(tree.endedAt)) : \"—\"}</td></tr>`,\n  );\n  summaryRows.push(\n    `<tr><th scope=\"row\">totalEvents</th><td>${escapeHtml(String(tree.metadata.totalEvents))}</td></tr>`,\n  );\n\n  let confidenceHtml = \"\";\n  if (includeMetadata) {\n    const cb = tree.metadata.confidenceBreakdown;\n    confidenceHtml += \"<h3>Confidence breakdown</h3><table><thead><tr><th>bucket</th><th>count</th></tr></thead><tbody>\";\n    for (const k of Object.keys(cb).sort()) {\n      const key = k as keyof typeof cb;\n      confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${cb[key]}</td></tr>`;\n    }\n    confidenceHtml += \"</tbody></table>\";\n\n    confidenceHtml += \"<h3>Kind breakdown</h3><table><thead><tr><th>kind</th><th>count</th></tr></thead><tbody>\";\n    for (const k of Object.keys(tree.metadata.kinds).sort()) {\n      const key = k as keyof typeof tree.metadata.kinds;\n      const c = tree.metadata.kinds[key];\n      if (c > 0) confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${c}</td></tr>`;\n    }\n    confidenceHtml += \"</tbody></table>\";\n  }\n\n  const flat = flattenTree(tree);\n  const errors = flat.filter((n) => n.event.status === \"error\");\n  let errorsHtml = \"\";\n  if (includeErrors && errors.length > 0) {\n    errorsHtml += \"<h2>Errors</h2><ul>\";\n    for (const n of errors) {\n      const msg =\n        n.event.attributes && typeof n.event.attributes.error === \"object\"\n          ? safeString(\n              (n.event.attributes.error as { message?: string }).message,\n              maxLen,\n            )\n          : \"\";\n      errorsHtml += `<li><strong>${escapeHtml(n.event.name)}</strong> (${escapeHtml(n.event.eventId)}): ${escapeHtml(msg || \"error\")}</li>`;\n    }\n    errorsHtml += \"</ul>\";\n  }\n\n  let attrsHtml = \"\";\n  if (includeAttributes) {\n    attrsHtml += \"<h2>Attributes (bounded)</h2>\";\n    for (const n of flat) {\n      if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n      const compact = compactAttributes(n.event.attributes, {\n        maxLength: maxLen,\n        redacted,\n      });\n      attrsHtml += `<h3>${escapeHtml(n.event.name)}</h3><pre class=\"json\">${escapeHtml(stableJson(compact, true))}</pre>`;\n    }\n    warnings.push(\n      \"Attributes may still contain sensitive data; review exports before sharing.\",\n    );\n  }\n\n  const css = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\ntable{border-collapse:collapse;margin:0.75rem 0}\nth,td{border:1px solid #ccc;padding:0.35rem 0.6rem;text-align:left}\nth{background:#f5f5f5}\npre.json{background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.85rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n  const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>${titleName}</title>\n<style>${css}</style>\n</head>\n<body>\n<header><h1>AgentInspect Run: ${titleName}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect.</p>\n${includeMetadata ? `<section class=\"summary\"><h2>Summary</h2><table>${summaryRows.join(\"\")}</table>${confidenceHtml}</section>` : \"\"}\n<section class=\"tree\"><h2>Execution tree</h2>${tree.children.length > 0 ? renderTreeHtml(tree.children) : \"<p>No steps recorded.</p>\"}</section>\n${errorsHtml}\n${attrsHtml}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n  return {\n    format: \"html\",\n    content: html,\n    contentType: \"text/html\",\n    fileExtension: \".html\",\n    warnings,\n  };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n  compactAttributes,\n  escapeMarkdown,\n  flattenTree,\n  safeString,\n  stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeAscii(nodes: InspectNode[], indent = \"\"): string {\n  const lines: string[] = [];\n  for (let i = 0; i < nodes.length; i++) {\n    const n = nodes[i]!;\n    const last = i === nodes.length - 1;\n    const branch = last ? \"└─ \" : \"├─ \";\n    const ev = n.event;\n    const status = ev.status ?? \"?\";\n    const dur =\n      ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n        ? `${ev.durationMs}ms`\n        : \"-\";\n    lines.push(`${indent}${branch}${escapeMarkdown(ev.name)} [${ev.kind}] ${status} (${dur})`);\n    const nextIndent = indent + (last ? \"   \" : \"│  \");\n    if (n.children.length > 0) {\n      const childStr = renderTreeAscii(n.children, nextIndent);\n      if (childStr.length > 0) lines.push(childStr);\n    }\n  }\n  return lines.join(\"\\n\");\n}\n\nexport function exportMarkdown(\n  tree: InspectRunTree,\n  options?: Partial<ExportOptions>,\n): ExportResult {\n  const warnings: string[] = [];\n  const includeMetadata = options?.includeMetadata ?? true;\n  const includeAttributes = options?.includeAttributes ?? false;\n  const includeErrors = options?.includeErrors ?? true;\n  const maxLen = options?.maxAttributeLength ?? 500;\n  const redacted = options?.redacted ?? true;\n\n  const titleName = tree.name ?? tree.runId;\n  const lines: string[] = [];\n  lines.push(`# AgentInspect Run: ${escapeMarkdown(titleName)}`);\n  lines.push(\"\");\n  lines.push(\"Generated locally by AgentInspect. Review for sensitive data before sharing.\");\n  lines.push(\"\");\n\n  if (includeMetadata) {\n    lines.push(\"## Summary\");\n    lines.push(\"\");\n    lines.push(`- **runId**: ${escapeMarkdown(tree.runId)}`);\n    if (tree.name !== undefined) lines.push(`- **name**: ${escapeMarkdown(tree.name)}`);\n    lines.push(`- **status**: ${escapeMarkdown(String(tree.status ?? \"unknown\"))}`);\n    lines.push(\n      `- **durationMs**: ${tree.durationMs !== undefined ? escapeMarkdown(String(tree.durationMs)) : \"-\"}`,\n    );\n    lines.push(\n      `- **startedAt**: ${tree.startedAt !== undefined ? escapeMarkdown(String(tree.startedAt)) : \"-\"}`,\n    );\n    lines.push(\n      `- **endedAt**: ${tree.endedAt !== undefined ? escapeMarkdown(String(tree.endedAt)) : \"-\"}`,\n    );\n    lines.push(`- **totalEvents**: ${tree.metadata.totalEvents}`);\n    lines.push(\"\");\n    lines.push(\"### Confidence breakdown\");\n    lines.push(\"\");\n    lines.push(\"| bucket | count |\");\n    lines.push(\"| --- | --- |\");\n    for (const k of Object.keys(tree.metadata.confidenceBreakdown).sort()) {\n      const key = k as keyof typeof tree.metadata.confidenceBreakdown;\n      lines.push(\n        `| ${escapeMarkdown(key)} | ${tree.metadata.confidenceBreakdown[key]} |`,\n      );\n    }\n    lines.push(\"\");\n    lines.push(\"### Kind breakdown\");\n    lines.push(\"\");\n    lines.push(\"| kind | count |\");\n    lines.push(\"| --- | --- |\");\n    for (const k of Object.keys(tree.metadata.kinds).sort()) {\n      const key = k as keyof typeof tree.metadata.kinds;\n      const c = tree.metadata.kinds[key];\n      if (c > 0) lines.push(`| ${escapeMarkdown(key)} | ${c} |`);\n    }\n    lines.push(\"\");\n  }\n\n  lines.push(\"## Execution tree\");\n  lines.push(\"\");\n  lines.push(\"```text\");\n  lines.push(\n    tree.children.length > 0 ? renderTreeAscii(tree.children) : \"(no steps)\",\n  );\n  lines.push(\"```\");\n  lines.push(\"\");\n\n  const flat = flattenTree(tree);\n  const errors = flat.filter((n) => n.event.status === \"error\");\n  if (includeErrors && errors.length > 0) {\n    lines.push(\"## Errors\");\n    lines.push(\"\");\n    for (const n of errors) {\n      const msg =\n        n.event.attributes && typeof n.event.attributes.error === \"object\"\n          ? safeString(\n              (n.event.attributes.error as { message?: string }).message,\n              maxLen,\n            )\n          : \"\";\n      lines.push(\n        `- **${escapeMarkdown(n.event.name)}** (${escapeMarkdown(n.event.eventId)}): ${escapeMarkdown(msg || \"error\")}`,\n      );\n    }\n    lines.push(\"\");\n  }\n\n  if (includeAttributes) {\n    lines.push(\"## Attributes (bounded)\");\n    lines.push(\"\");\n    for (const n of flat) {\n      if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n      const compact = compactAttributes(n.event.attributes, {\n        maxLength: maxLen,\n        redacted,\n      });\n      lines.push(`### ${escapeMarkdown(n.event.name)}`);\n      lines.push(\"\");\n      lines.push(\"```json\");\n      lines.push(stableJson(compact, true));\n      lines.push(\"```\");\n      lines.push(\"\");\n    }\n    warnings.push(\n      \"Attributes may still contain sensitive data; review exports before sharing.\",\n    );\n  }\n\n  return {\n    format: \"markdown\",\n    content: lines.join(\"\\n\"),\n    contentType: \"text/markdown\",\n    fileExtension: \".md\",\n    warnings,\n  };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\nexport interface OpenInferenceSpan {\n  trace_id: string;\n  span_id: string;\n  parent_span_id?: string;\n  name: string;\n  /** Decimal string: epoch-nanosecond values exceed Number.MAX_SAFE_INTEGER. */\n  start_time_unix_nano: string;\n  end_time_unix_nano?: string;\n  attributes: Record<string, unknown>;\n  status?: {\n    code: \"OK\" | \"ERROR\" | \"UNSET\";\n    message?: string;\n  };\n}\n\nexport interface OpenInferenceExport {\n  exporter: \"agent-inspect\";\n  format: \"openinference\";\n  compatibility: \"openinference-compatible\";\n  version: string;\n  trace_id: string;\n  spans: OpenInferenceSpan[];\n  warnings: string[];\n}\n\nfunction hexFrom(seed: string, byteLen: number): string {\n  return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\n/**\n * Convert epoch milliseconds to exact epoch nanoseconds. Computed in BigInt\n * because realistic epochs exceed Number.MAX_SAFE_INTEGER once scaled to\n * nanoseconds (1.7e18 vs 9.0e15), which silently loses precision in doubles.\n */\nfunction unixNano(ms: number): bigint {\n  const whole = Math.trunc(ms);\n  const fractionNs = Math.round((ms - whole) * 1e6);\n  return BigInt(whole) * 1_000_000n + BigInt(fractionNs);\n}\n\nfunction mapInspectKindToOI(\n  kind: InspectKind,\n  warnings: string[],\n): { openInferenceKind: string; ambiguousNote?: string } {\n  switch (kind) {\n    case \"LLM\":\n      return { openInferenceKind: \"LLM\" };\n    case \"TOOL\":\n      return { openInferenceKind: \"TOOL\" };\n    case \"CHAIN\":\n      return { openInferenceKind: \"CHAIN\" };\n    case \"RETRIEVER\":\n      return { openInferenceKind: \"RETRIEVER\" };\n    case \"AGENT\":\n      return { openInferenceKind: \"AGENT\" };\n    case \"DECISION\":\n      warnings.push(\n        `Ambiguous kind DECISION mapped to CHAIN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n      );\n      return { openInferenceKind: \"CHAIN\" };\n    case \"RESULT\":\n      warnings.push(\n        `Ambiguous kind RESULT mapped to UNKNOWN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n      );\n      return { openInferenceKind: \"UNKNOWN\" };\n    case \"ERROR\":\n      warnings.push(`ERROR kind mapped to CHAIN for span compatibility.`);\n      return { openInferenceKind: \"CHAIN\" };\n    case \"LOG\":\n    case \"LOGIC\":\n    case \"RUN\":\n      warnings.push(`${kind} mapped to CHAIN for span compatibility.`);\n      return { openInferenceKind: \"CHAIN\" };\n    default:\n      warnings.push(`Unhandled InspectKind ${kind} mapped to UNKNOWN.`);\n      return { openInferenceKind: \"UNKNOWN\" };\n  }\n}\n\nexport function exportOpenInference(\n  tree: InspectRunTree,\n  options?: Partial<ExportOptions>,\n): ExportResult {\n  const warnings: string[] = [\n    \"OpenInference-compatible JSON export is experimental until verified against specific backends.\",\n    \"This file was generated locally and not sent anywhere.\",\n  ];\n\n  const traceId = hexFrom(`trace:${tree.runId}`, 16);\n  const includeAttributes = options?.includeAttributes ?? false;\n  const maxLen = options?.maxAttributeLength ?? 500;\n  const pretty = options?.pretty ?? true;\n\n  const spans: OpenInferenceSpan[] = [];\n\n  for (const n of flattenTree(tree)) {\n    const ev = n.event;\n    const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n    const parentSpanHex = ev.parentId\n      ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n      : undefined;\n    const startNs = unixNano(ev.timestamp);\n    let endNs: bigint | undefined;\n    if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n      endNs = startNs + unixNano(ev.durationMs);\n    }\n\n    const { openInferenceKind } = mapInspectKindToOI(ev.kind, warnings);\n\n    const attrs: Record<string, unknown> = {\n      \"openinference.span.kind\": openInferenceKind,\n      \"agent_inspect.kind\": ev.kind,\n      \"agent_inspect.confidence\": ev.confidence,\n      \"agent_inspect.source.type\": ev.source.type,\n      \"agent_inspect.run_id\": tree.runId,\n      \"agent_inspect.event_id\": ev.eventId,\n      \"agent_inspect.status\": ev.status ?? \"unset\",\n    };\n    if (ev.durationMs !== undefined) {\n      attrs[\"agent_inspect.duration_ms\"] = ev.durationMs;\n    }\n\n    const meta = ev.attributes;\n    if (meta?.model !== undefined && typeof meta.model === \"string\") {\n      attrs[\"llm.model_name\"] = meta.model;\n    }\n    const tokens = meta?.tokens;\n    if (tokens && typeof tokens === \"object\" && tokens !== null) {\n      const inp = (tokens as { input?: number }).input;\n      const outp = (tokens as { output?: number }).output;\n      if (typeof inp === \"number\") attrs[\"llm.token_count.prompt\"] = inp;\n      if (typeof outp === \"number\") attrs[\"llm.token_count.completion\"] = outp;\n    }\n\n    if (includeAttributes && meta && typeof meta === \"object\") {\n      for (const [k, v] of Object.entries(meta)) {\n        if (k === \"tokens\" || k === \"model\") continue;\n        if (v !== undefined && v !== null && typeof v !== \"object\") {\n          attrs[`agent_inspect.preview.${k}`] =\n            typeof v === \"string\" ? v.slice(0, maxLen) : v;\n        }\n      }\n    }\n\n    let status: OpenInferenceSpan[\"status\"];\n    if (ev.status === \"error\") {\n      const msg =\n        meta && typeof meta.error === \"object\" && meta.error !== null\n          ? String((meta.error as { message?: string }).message ?? \"error\")\n          : \"error\";\n      status = { code: \"ERROR\", message: msg.slice(0, maxLen) };\n    } else if (ev.status === \"ok\") {\n      status = { code: \"OK\" };\n    } else {\n      status = { code: \"UNSET\" };\n    }\n\n    spans.push({\n      trace_id: traceId,\n      span_id: spanId,\n      parent_span_id: parentSpanHex,\n      name: ev.name,\n      start_time_unix_nano: startNs.toString(),\n      end_time_unix_nano: endNs?.toString(),\n      attributes: attrs,\n      status,\n    });\n  }\n\n  const payload: OpenInferenceExport = {\n    exporter: \"agent-inspect\",\n    format: \"openinference\",\n    compatibility: \"openinference-compatible\",\n    version: EXPORT_PAYLOAD_VERSION,\n    trace_id: traceId,\n    spans,\n    warnings,\n  };\n\n  return {\n    format: \"openinference\",\n    content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n    contentType: \"application/json\",\n    fileExtension: \".openinference.json\",\n    warnings,\n  };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind } from \"../types/inspect-event.js\";\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\n/** OTLP StatusCode numeric enum (proto). */\nexport const OTLP_STATUS_CODE_UNSET = 0;\nexport const OTLP_STATUS_CODE_OK = 1;\nexport const OTLP_STATUS_CODE_ERROR = 2;\n\n/** OTLP SpanKind numeric enum — INTERNAL. */\nexport const OTLP_SPAN_KIND_INTERNAL = 1;\n\nfunction hexFrom(seed: string, byteLen: number): string {\n  return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\n/**\n * Convert epoch milliseconds to exact epoch nanoseconds. Computed in BigInt\n * because realistic epochs exceed Number.MAX_SAFE_INTEGER once scaled to\n * nanoseconds (1.7e18 vs 9.0e15), which silently loses precision in doubles.\n */\nfunction unixNano(ms: number): bigint {\n  const whole = Math.trunc(ms);\n  const fractionNs = Math.round((ms - whole) * 1e6);\n  return BigInt(whole) * 1_000_000n + BigInt(fractionNs);\n}\n\nfunction stringAttr(key: string, value: string): { key: string; value: { stringValue: string } } {\n  return { key, value: { stringValue: value } };\n}\n\nfunction intAttr(key: string, value: number): { key: string; value: { intValue: string } } {\n  return { key, value: { intValue: String(Math.trunc(value)) } };\n}\n\nfunction doubleAttr(key: string, value: number): { key: string; value: { doubleValue: number } } {\n  return { key, value: { doubleValue: value } };\n}\n\nfunction boolAttr(key: string, value: boolean): { key: string; value: { boolValue: boolean } } {\n  return { key, value: { boolValue: value } };\n}\n\ntype OtlpAttr =\n  | ReturnType<typeof stringAttr>\n  | ReturnType<typeof intAttr>\n  | ReturnType<typeof doubleAttr>\n  | ReturnType<typeof boolAttr>;\n\nfunction numberAttr(key: string, value: number): OtlpAttr {\n  if (Number.isFinite(value) && !Number.isInteger(value)) {\n    return doubleAttr(key, value);\n  }\n  return intAttr(key, value);\n}\n\nfunction genAiOperationName(kind: InspectKind): string | undefined {\n  switch (kind) {\n    case \"LLM\":\n      return \"generate_content\";\n    case \"TOOL\":\n      return \"execute_tool\";\n    case \"AGENT\":\n      return \"invoke_agent\";\n    default:\n      return undefined;\n  }\n}\n\nfunction resolveSpanTimes(ev: {\n  timestamp: number;\n  durationMs?: number;\n  attributes?: Record<string, unknown>;\n}): { startNs: string; endNs?: string } {\n  const startedAtMs =\n    typeof ev.attributes?.startedAtMs === \"number\" &&\n    Number.isFinite(ev.attributes.startedAtMs)\n      ? ev.attributes.startedAtMs\n      : undefined;\n  const endedAtMs =\n    typeof ev.attributes?.endedAtMs === \"number\" &&\n    Number.isFinite(ev.attributes.endedAtMs)\n      ? ev.attributes.endedAtMs\n      : undefined;\n  const startMs = startedAtMs ?? ev.timestamp;\n  const startNs = String(unixNano(startMs));\n  if (endedAtMs !== undefined) {\n    return { startNs, endNs: String(unixNano(endedAtMs)) };\n  }\n  if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n    return {\n      startNs,\n      endNs: String(unixNano(startMs) + unixNano(ev.durationMs)),\n    };\n  }\n  return { startNs };\n}\n\nexport function exportOtlpJson(\n  tree: InspectRunTree,\n  options?: Partial<ExportOptions>,\n): ExportResult {\n  const warnings: string[] = [\n    \"OTLP JSON export uses OTel GenAI-aligned attributes where applicable; experimental until verified against specific collectors.\",\n    \"Not OTLP gRPC/protobuf — JSON mapping only. Generated locally; no network upload.\",\n    \"Status and span kind use OTLP numeric enums (StatusCode 0/1/2, SpanKind INTERNAL=1).\",\n  ];\n\n  const traceId = hexFrom(`trace:${tree.runId}`, 16);\n  const includeAttributes = options?.includeAttributes ?? false;\n  const maxLen = options?.maxAttributeLength ?? 500;\n  const pretty = options?.pretty ?? true;\n\n  const flat = flattenTree(tree);\n  const spans: Record<string, unknown>[] = [];\n\n  for (const n of flat) {\n    const ev = n.event;\n    const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n    const parentSpanId = ev.parentId\n      ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n      : undefined;\n\n    const { startNs, endNs } = resolveSpanTimes(ev);\n\n    const attrs: OtlpAttr[] = [\n      stringAttr(\"agent_inspect.kind\", ev.kind),\n      stringAttr(\"agent_inspect.confidence\", ev.confidence),\n      stringAttr(\"agent_inspect.source.type\", ev.source.type),\n      stringAttr(\"agent_inspect.run_id\", tree.runId),\n      stringAttr(\"agent_inspect.event_id\", ev.eventId),\n      stringAttr(\"agent_inspect.status\", ev.status ?? \"unset\"),\n    ];\n\n    if (ev.durationMs !== undefined) {\n      attrs.push(intAttr(\"agent_inspect.duration_ms\", ev.durationMs));\n    }\n\n    const op = genAiOperationName(ev.kind);\n    if (op !== undefined) {\n      attrs.push(stringAttr(\"gen_ai.operation.name\", op));\n    }\n\n    const meta = ev.attributes;\n    if (meta?.model !== undefined && typeof meta.model === \"string\") {\n      attrs.push(stringAttr(\"gen_ai.request.model\", meta.model.slice(0, maxLen)));\n    }\n\n    const tokens = meta?.tokens;\n    if (tokens && typeof tokens === \"object\" && tokens !== null) {\n      const inp = (tokens as { input?: number }).input;\n      const outp = (tokens as { output?: number }).output;\n      if (typeof inp === \"number\") attrs.push(intAttr(\"gen_ai.usage.input_tokens\", inp));\n      if (typeof outp === \"number\") attrs.push(intAttr(\"gen_ai.usage.output_tokens\", outp));\n    }\n\n    if (includeAttributes && meta && typeof meta === \"object\") {\n      for (const [k, v] of Object.entries(meta)) {\n        if (k === \"tokens\" || k === \"model\") continue;\n        if (typeof v === \"string\") {\n          attrs.push(stringAttr(`agent_inspect.preview.${k}`, v.slice(0, maxLen)));\n        } else if (typeof v === \"number\" && Number.isFinite(v)) {\n          attrs.push(numberAttr(`agent_inspect.preview.${k}`, v));\n        } else if (typeof v === \"boolean\") {\n          attrs.push(boolAttr(`agent_inspect.preview.${k}`, v));\n        }\n      }\n    }\n\n    let statusCode: number = OTLP_STATUS_CODE_UNSET;\n    let statusMessage: string | undefined;\n    if (ev.status === \"error\") {\n      statusCode = OTLP_STATUS_CODE_ERROR;\n      statusMessage =\n        meta && typeof meta.error === \"object\" && meta.error !== null\n          ? String((meta.error as { message?: string }).message ?? \"error\").slice(0, maxLen)\n          : \"error\";\n    } else if (ev.status === \"ok\") {\n      statusCode = OTLP_STATUS_CODE_OK;\n    }\n\n    const spanJson: Record<string, unknown> = {\n      traceId,\n      spanId,\n      name: ev.name,\n      kind: OTLP_SPAN_KIND_INTERNAL,\n      startTimeUnixNano: startNs,\n      attributes: attrs,\n      status: {\n        code: statusCode,\n        ...(statusMessage !== undefined ? { message: statusMessage } : {}),\n      },\n    };\n\n    if (parentSpanId !== undefined) {\n      spanJson.parentSpanId = parentSpanId;\n    }\n    if (endNs !== undefined) {\n      spanJson.endTimeUnixNano = endNs;\n    }\n\n    spans.push(spanJson);\n  }\n\n  const payload = {\n    resourceSpans: [\n      {\n        resource: {\n          attributes: [stringAttr(\"service.name\", \"agent-inspect\")],\n        },\n        scopeSpans: [\n          {\n            scope: { name: \"agent-inspect\" },\n            spans,\n          },\n        ],\n      },\n    ],\n  };\n\n  return {\n    format: \"otlp-json\",\n    content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n    contentType: \"application/json\",\n    fileExtension: \".otlp.json\",\n    warnings,\n  };\n}\n","import type { ExportFormat, ExportValidationResult } from \"./types.js\";\n\nconst EXPERIMENTAL =\n  \"Experimental compatibility export — verify against your target tooling before relying on it.\";\n\nfunction pushPath(\n  errors: string[],\n  path: string,\n  message: string,\n): void {\n  errors.push(`${path}: ${message}`);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction validateOtlpJson(content: string): ExportValidationResult {\n  const errors: string[] = [];\n  const warnings: string[] = [\n    EXPERIMENTAL,\n    \"OTLP JSON mapping uses OTel GenAI-aligned attributes where applicable; collectors may require transformation.\",\n    \"protocol-valid ≠ profile-complete ≠ fixture-complete — nested path diagnostics report protocol shape only.\",\n  ];\n\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(content) as unknown;\n  } catch {\n    pushPath(errors, \"$\", \"OTLP JSON export is not valid JSON\");\n    return { ok: false, format: \"otlp-json\", errors, warnings };\n  }\n\n  if (!isRecord(parsed)) {\n    pushPath(errors, \"$\", \"OTLP JSON export must be an object\");\n    return { ok: false, format: \"otlp-json\", errors, warnings };\n  }\n\n  if (!Array.isArray(parsed.resourceSpans)) {\n    pushPath(errors, \"$.resourceSpans\", \"must be an array\");\n    return { ok: false, format: \"otlp-json\", errors, warnings };\n  }\n\n  parsed.resourceSpans.forEach((resourceSpan, rsi) => {\n    const rsPath = `$.resourceSpans[${rsi}]`;\n    if (!isRecord(resourceSpan)) {\n      pushPath(errors, rsPath, \"must be an object\");\n      return;\n    }\n    if (!Array.isArray(resourceSpan.scopeSpans)) {\n      pushPath(errors, `${rsPath}.scopeSpans`, \"must be an array\");\n      return;\n    }\n    resourceSpan.scopeSpans.forEach((scopeSpan, ssi) => {\n      const ssPath = `${rsPath}.scopeSpans[${ssi}]`;\n      if (!isRecord(scopeSpan)) {\n        pushPath(errors, ssPath, \"must be an object\");\n        return;\n      }\n      if (!Array.isArray(scopeSpan.spans)) {\n        pushPath(errors, `${ssPath}.spans`, \"must be an array\");\n        return;\n      }\n      scopeSpan.spans.forEach((span, spi) => {\n        const spanPath = `${ssPath}.spans[${spi}]`;\n        if (!isRecord(span)) {\n          pushPath(errors, spanPath, \"must be an object\");\n          return;\n        }\n        if (typeof span.traceId !== \"string\" || span.traceId.length === 0) {\n          pushPath(errors, `${spanPath}.traceId`, \"must be a non-empty string\");\n        }\n        if (typeof span.spanId !== \"string\" || span.spanId.length === 0) {\n          pushPath(errors, `${spanPath}.spanId`, \"must be a non-empty string\");\n        }\n        if (typeof span.name !== \"string\") {\n          pushPath(errors, `${spanPath}.name`, \"must be a string\");\n        }\n        if (\n          typeof span.startTimeUnixNano !== \"string\" ||\n          !/^\\d+$/.test(span.startTimeUnixNano)\n        ) {\n          pushPath(\n            errors,\n            `${spanPath}.startTimeUnixNano`,\n            \"must be a decimal-string 64-bit integer\",\n          );\n        }\n        if (\n          span.endTimeUnixNano !== undefined &&\n          (typeof span.endTimeUnixNano !== \"string\" ||\n            !/^\\d+$/.test(span.endTimeUnixNano))\n        ) {\n          pushPath(\n            errors,\n            `${spanPath}.endTimeUnixNano`,\n            \"must be a decimal-string 64-bit integer when present\",\n          );\n        }\n\n        // SpanKind: numeric preferred; historical string enums remain protocol-valid.\n        if (typeof span.kind === \"number\") {\n          if (!Number.isInteger(span.kind)) {\n            pushPath(errors, `${spanPath}.kind`, \"must be an integer SpanKind enum\");\n          }\n        } else if (typeof span.kind === \"string\") {\n          warnings.push(\n            `${spanPath}.kind: string SpanKind enum is legacy; prefer numeric (INTERNAL=1)`,\n          );\n        } else if (span.kind !== undefined) {\n          pushPath(\n            errors,\n            `${spanPath}.kind`,\n            \"must be numeric SpanKind or historical string enum\",\n          );\n        }\n\n        if (!isRecord(span.status)) {\n          pushPath(errors, `${spanPath}.status`, \"must be an object\");\n        } else {\n          const code = span.status.code;\n          if (typeof code === \"number\") {\n            if (![0, 1, 2].includes(code)) {\n              pushPath(\n                errors,\n                `${spanPath}.status.code`,\n                \"must be numeric StatusCode 0 (UNSET), 1 (OK), or 2 (ERROR)\",\n              );\n            }\n          } else if (typeof code === \"string\") {\n            const upper = code.toUpperCase();\n            if (\n              upper !== \"STATUS_CODE_UNSET\" &&\n              upper !== \"STATUS_CODE_OK\" &&\n              upper !== \"STATUS_CODE_ERROR\" &&\n              upper !== \"UNSET\" &&\n              upper !== \"OK\" &&\n              upper !== \"ERROR\" &&\n              !/^[012]$/.test(code.trim())\n            ) {\n              pushPath(\n                errors,\n                `${spanPath}.status.code`,\n                \"unrecognized StatusCode string\",\n              );\n            } else {\n              warnings.push(\n                `${spanPath}.status.code: string StatusCode is legacy; prefer numeric 0/1/2`,\n              );\n            }\n          } else {\n            pushPath(\n              errors,\n              `${spanPath}.status.code`,\n              \"must be numeric StatusCode 0/1/2 or historical string enum\",\n            );\n          }\n        }\n      });\n    });\n  });\n\n  return { ok: errors.length === 0, format: \"otlp-json\", errors, warnings };\n}\n\nexport function validateExportContent(\n  format: ExportFormat,\n  content: string,\n): ExportValidationResult {\n  const errors: string[] = [];\n  const warnings: string[] = [EXPERIMENTAL];\n\n  if (format === \"markdown\") {\n    if (!content.startsWith(\"# AgentInspect Run\")) {\n      errors.push('Markdown export must start with \"# AgentInspect Run\"');\n    }\n    return { ok: errors.length === 0, format, errors, warnings };\n  }\n\n  if (format === \"html\") {\n    const lower = content.toLowerCase();\n    if (!lower.includes(\"<!doctype html\")) {\n      errors.push(\"HTML export must include <!doctype html>\");\n    }\n    if (/<\\s*script\\b/i.test(content)) {\n      errors.push(\"HTML export must not contain script tags\");\n    }\n    if (/<\\s*link\\b[^>]*href\\s*=/i.test(content)) {\n      warnings.push(\"HTML export contains link tags — ensure no external stylesheets.\");\n    }\n    return { ok: errors.length === 0, format, errors, warnings };\n  }\n\n  if (format === \"openinference\") {\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(content) as unknown;\n    } catch {\n      errors.push(\"OpenInference export is not valid JSON\");\n      return { ok: false, format, errors, warnings };\n    }\n    if (!parsed || typeof parsed !== \"object\") {\n      errors.push(\"OpenInference export JSON must be an object\");\n      return { ok: false, format, errors, warnings };\n    }\n    const o = parsed as Record<string, unknown>;\n    if (o.format !== \"openinference\") {\n      errors.push('OpenInference export must include format: \"openinference\"');\n    }\n    if (!Array.isArray(o.spans)) {\n      errors.push(\"OpenInference export must include a spans array\");\n    }\n    warnings.push(\"OpenInference-compatible JSON is not guaranteed for every backend.\");\n    return { ok: errors.length === 0, format, errors, warnings };\n  }\n\n  if (format === \"otlp-json\") {\n    return validateOtlpJson(content);\n  }\n\n  errors.push(`Unsupported export format`);\n  return { ok: false, format, errors, warnings };\n}\n","import type { InspectEvent, InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport type {\n  StepStartedEvent,\n  StepType,\n  TraceEvent,\n} from \"../types.js\";\n\nimport { zeroKinds } from \"./helpers.js\";\n\nfunction stepTypeToInspectKind(t: StepType): InspectKind {\n  switch (t) {\n    case \"llm\":\n      return \"LLM\";\n    case \"tool\":\n      return \"TOOL\";\n    case \"decision\":\n      return \"DECISION\";\n    case \"run\":\n      return \"CHAIN\";\n    default:\n      return \"LOGIC\";\n  }\n}\n\nfunction mapStepStatus(\n  s: \"success\" | \"error\" | undefined,\n): InspectEvent[\"status\"] | undefined {\n  if (s === undefined) return \"running\";\n  if (s === \"success\") return \"ok\";\n  return \"error\";\n}\n\ntype StepAcc = {\n  id: string;\n  parentId?: string;\n  name: string;\n  type: StepType;\n  startTime: number;\n  timestamp: number;\n  metadata?: Record<string, unknown>;\n  status?: \"success\" | \"error\";\n  endTime?: number;\n  durationMs?: number;\n  error?: { message: string; stack?: string };\n};\n\n/**\n * Build an {@link InspectRunTree} from v0.1 JSONL {@link TraceEvent} rows (manual tracing).\n * Does not mutate the input array or event objects.\n */\nexport function manualTraceEventsToRunTree(events: TraceEvent[]): InspectRunTree {\n  const started = events.find((e) => e.event === \"run_started\");\n  if (!started || started.event !== \"run_started\") {\n    throw new Error(\"Invalid trace: missing run_started\");\n  }\n\n  const runId = started.runId;\n  const runName = started.name;\n\n  const completedAll = events.filter((e) => e.event === \"run_completed\");\n  const lastCompleted = completedAll[completedAll.length - 1];\n\n  let runStatus: InspectRunTree[\"status\"];\n  if (lastCompleted === undefined) {\n    runStatus = \"running\";\n  } else if (lastCompleted.status === \"success\") {\n    runStatus = \"ok\";\n  } else {\n    runStatus = \"error\";\n  }\n\n  const startedAt = started.startTime;\n  const endedAt =\n    lastCompleted !== undefined && runStatus !== \"running\" ? lastCompleted.endTime : undefined;\n  const durationMs =\n    lastCompleted !== undefined && Number.isFinite(lastCompleted.durationMs)\n      ? lastCompleted.durationMs\n      : undefined;\n\n  const steps = new Map<string, StepAcc>();\n\n  for (const e of events) {\n    if (e.event !== \"step_started\") continue;\n    const s = e as StepStartedEvent;\n    steps.set(s.stepId, {\n      id: s.stepId,\n      parentId: s.parentId,\n      name: s.name,\n      type: s.type,\n      startTime: s.startTime,\n      timestamp: s.timestamp,\n      metadata: s.metadata as Record<string, unknown> | undefined,\n    });\n  }\n\n  for (const e of events) {\n    if (e.event !== \"step_completed\") continue;\n    const acc = steps.get(e.stepId);\n    if (!acc) continue;\n    acc.status = e.status;\n    acc.endTime = e.endTime;\n    acc.durationMs = e.durationMs;\n    if (e.error?.message) {\n      acc.error = e.error;\n    }\n  }\n\n  const inspectNodes = new Map<string, InspectNode>();\n\n  for (const acc of steps.values()) {\n    const kind = stepTypeToInspectKind(acc.type);\n    const status = mapStepStatus(acc.status);\n    const attrs: Record<string, unknown> = { ...(acc.metadata ?? {}) };\n    if (acc.error?.message) {\n      attrs.error = acc.error;\n    }\n\n    const evt: InspectEvent = {\n      eventId: acc.id,\n      runId,\n      parentId: acc.parentId,\n      name: acc.name,\n      kind,\n      timestamp: acc.timestamp,\n      status,\n      durationMs: acc.durationMs,\n      attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n      confidence: \"explicit\",\n      source: { type: \"manual\" },\n    };\n\n    inspectNodes.set(acc.id, { event: evt, children: [], depth: 0 });\n  }\n\n  const roots: InspectNode[] = [];\n  const sortByStart = (a: InspectNode, b: InspectNode) =>\n    a.event.timestamp - b.event.timestamp;\n\n  for (const node of inspectNodes.values()) {\n    const pid = node.event.parentId;\n    if (pid !== undefined && inspectNodes.has(pid)) {\n      inspectNodes.get(pid)!.children.push(node);\n    } else {\n      roots.push(node);\n    }\n  }\n\n  roots.sort(sortByStart);\n  for (const n of inspectNodes.values()) {\n    n.children.sort(sortByStart);\n  }\n\n  const assignDepth = (n: InspectNode, depth: number) => {\n    n.depth = depth;\n    for (const c of n.children) assignDepth(c, depth + 1);\n  };\n  for (const r of roots) assignDepth(r, 0);\n\n  const confidenceBreakdown = {\n    explicit: 0,\n    correlated: 0,\n    heuristic: 0,\n    unknown: 0,\n  } as InspectRunTree[\"metadata\"][\"confidenceBreakdown\"];\n\n  const kinds = zeroKinds();\n\n  function countWalk(nodes: InspectNode[]): void {\n    for (const n of nodes) {\n      confidenceBreakdown[n.event.confidence] += 1;\n      kinds[n.event.kind] += 1;\n      if (n.children.length > 0) countWalk(n.children);\n    }\n  }\n  countWalk(roots);\n\n  return {\n    runId,\n    name: runName,\n    status: runStatus,\n    startedAt,\n    endedAt,\n    durationMs,\n    children: roots,\n    metadata: {\n      totalEvents: inspectNodes.size,\n      confidenceBreakdown,\n      kinds,\n    },\n  };\n}\n","import type { ExportValidationResult } from \"./types.js\";\nimport { validateExportContent } from \"./validation.js\";\n\n/** Validate committed or exported OpenInference-compatible JSON fixtures. */\nexport function validateOpenInferenceFixture(content: string): ExportValidationResult {\n  return validateExportContent(\"openinference\", content);\n}\n\n/** Validate committed or exported OTLP JSON fixtures. */\nexport function validateOtlpJsonFixture(content: string): ExportValidationResult {\n  return validateExportContent(\"otlp-json\", content);\n}\n","/**\n * Semantic field checks beyond shape validation for standards fixtures.\n */\nimport type { ExportValidationResult } from \"./types.js\";\nimport { validateOpenInferenceFixture, validateOtlpJsonFixture } from \"./fixtures.js\";\n\nconst SEMCONV_PIN = \"OTEL_GEN_AI_SEMCONV_PIN\";\n\nfunction semanticWarnings(format: \"openinference\" | \"otlp-json\", parsed: Record<string, unknown>): string[] {\n  const warnings: string[] = [];\n  if (format === \"openinference\") {\n    const spans = Array.isArray(parsed.spans) ? parsed.spans : [];\n    if (spans.length > 0) {\n      const first = spans[0] as Record<string, unknown>;\n      if (first.trace_id === undefined && first.traceId === undefined) {\n        warnings.push(\"OpenInference semantic: first span missing trace_id\");\n      }\n    }\n  }\n  if (format === \"otlp-json\") {\n    warnings.push(`OTLP semantic validation pinned to ${SEMCONV_PIN} mapping docs`);\n  }\n  return warnings;\n}\n\nexport function validateOpenInferenceSemanticFixture(content: string): ExportValidationResult {\n  const base = validateOpenInferenceFixture(content);\n  if (!base.ok) return base;\n  try {\n    const parsed = JSON.parse(content) as Record<string, unknown>;\n    return {\n      ...base,\n      warnings: [...base.warnings, ...semanticWarnings(\"openinference\", parsed)],\n    };\n  } catch {\n    return base;\n  }\n}\n\nexport function validateOtlpJsonSemanticFixture(content: string): ExportValidationResult {\n  const base = validateOtlpJsonFixture(content);\n  if (!base.ok) return base;\n  try {\n    const parsed = JSON.parse(content) as Record<string, unknown>;\n    return {\n      ...base,\n      warnings: [...base.warnings, ...semanticWarnings(\"otlp-json\", parsed)],\n    };\n  } catch {\n    return base;\n  }\n}\n","/**\n * Documented OpenTelemetry GenAI semantic convention reference for OTLP JSON exports.\n * Local mapping only — no OTel SDK dependency in core.\n *\n * Declared `attributes` must match keys the exporter can emit. Do not list\n * prompt/completion bodies here — AgentInspect never exports them on this path.\n */\nexport const OTEL_GEN_AI_SEMCONV_PIN = {\n  /** Human-readable pin label recorded in export metadata and docs. */\n  version: \"1.36.0\",\n  /** Public spec URL for maintainers validating attribute names. */\n  specUrl: \"https://opentelemetry.io/docs/specs/semconv/gen-ai/\",\n  /** GenAI attribute keys the AgentInspect OTLP JSON exporter may emit. */\n  attributes: [\n    \"gen_ai.operation.name\",\n    \"gen_ai.request.model\",\n    \"gen_ai.usage.input_tokens\",\n    \"gen_ai.usage.output_tokens\",\n  ],\n  /**\n   * Non-GenAI attribute key prefixes intentionally emitted alongside GenAI pins.\n   * Any other `gen_ai.*` key in export output is an undocumented extension.\n   */\n  documentedExtensionPrefixes: [\"agent_inspect.\"] as const,\n  /** Explicitly never emitted (safety + honesty). */\n  neverEmitted: [\"gen_ai.prompt\", \"gen_ai.completion\"] as const,\n} as const;\n","import type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult, ExportValidationResult } from \"./types.js\";\nimport { redactRunTreeForExport } from \"./redact-export.js\";\nimport { exportHtml } from \"./html-exporter.js\";\nimport { exportMarkdown } from \"./markdown-exporter.js\";\nimport { exportOpenInference } from \"./openinference-exporter.js\";\nimport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nimport { validateExportContent } from \"./validation.js\";\n\nexport function mergeExportDefaults(options: ExportOptions): ExportOptions {\n  return {\n    format: options.format,\n    includeMetadata: options.includeMetadata ?? true,\n    includeAttributes: options.includeAttributes ?? false,\n    includeErrors: options.includeErrors ?? true,\n    pretty: options.pretty ?? true,\n    redacted: options.redacted ?? true,\n    maxAttributeLength: options.maxAttributeLength ?? 500,\n    redactionProfile: options.redactionProfile ?? \"local\",\n  };\n}\n\n/**\n * @experimental Compatibility-oriented export API. Exports are local-only and do not upload anywhere.\n * Subject to refinement before a future stability declaration.\n */\nexport function exportRunTree(tree: InspectRunTree, options: ExportOptions): ExportResult {\n  const opts = mergeExportDefaults(options);\n  const exportTree =\n    opts.redactionProfile === \"local\"\n      ? tree\n      : redactRunTreeForExport(tree, { redactionProfile: opts.redactionProfile });\n  switch (opts.format) {\n    case \"markdown\":\n      return exportMarkdown(exportTree, opts);\n    case \"html\":\n      return exportHtml(exportTree, opts);\n    case \"openinference\":\n      return exportOpenInference(exportTree, opts);\n    case \"otlp-json\":\n      return exportOtlpJson(exportTree, opts);\n    default: {\n      const _x: never = opts.format;\n      throw new Error(`Unsupported export format: ${String(_x)}`);\n    }\n  }\n}\n\nexport function validateExport(result: ExportResult): ExportValidationResult {\n  const base = validateExportContent(result.format, result.content);\n  return {\n    ok: base.ok,\n    format: base.format,\n    errors: base.errors,\n    warnings: [...result.warnings, ...base.warnings],\n  };\n}\n\nexport type {\n  ExportFormat,\n  ExportOptions,\n  ExportResult,\n  ExportValidationResult,\n  TraceExporter,\n} from \"./types.js\";\nexport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nexport * from \"./helpers.js\";\nexport { manualTraceEventsToRunTree } from \"./manual-trace-adapter.js\";\nexport { exportMarkdown } from \"./markdown-exporter.js\";\nexport { exportHtml } from \"./html-exporter.js\";\nexport type { OpenInferenceExport, OpenInferenceSpan } from \"./openinference-exporter.js\";\nexport { exportOpenInference } from \"./openinference-exporter.js\";\nexport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nexport { validateExportContent } from \"./validation.js\";\nexport {\n  validateOpenInferenceFixture,\n  validateOtlpJsonFixture,\n} from \"./fixtures.js\";\nexport {\n  validateOpenInferenceSemanticFixture,\n  validateOtlpJsonSemanticFixture,\n} from \"./semantic-validation.js\";\nexport { OTEL_GEN_AI_SEMCONV_PIN } from \"./semconv.js\";\nexport { redactRunTreeForExport } from \"./redact-export.js\";\n","/**\n * v0.2 shared duration utilities.\n *\n * `parseDuration` is used for filters such as \"since\" / \"older-than\".\n * `formatDuration` is used for compact display in CLI and summaries.\n */\n\nexport function parseDuration(duration: string): number {\n  const raw = typeof duration === \"string\" ? duration.trim() : \"\";\n  const match = raw.match(/^(\\d+)(ms|[smhd])$/);\n  if (!match) {\n    throw new Error(\n      `Invalid duration format: ${duration}. Use a positive integer followed by ms, s, m, h, or d (e.g. 500ms, 30s, 5m, 2h, 7d).`,\n    );\n  }\n\n  const amount = Number.parseInt(match[1], 10);\n  const unit = match[2];\n\n  if (!Number.isFinite(amount) || amount <= 0) {\n    throw new Error(\n      `Invalid duration amount: ${duration}. Amount must be a positive integer.`,\n    );\n  }\n\n  switch (unit) {\n    case \"ms\":\n      return amount;\n    case \"s\":\n      return amount * 1000;\n    case \"m\":\n      return amount * 60 * 1000;\n    case \"h\":\n      return amount * 60 * 60 * 1000;\n    case \"d\":\n      return amount * 24 * 60 * 60 * 1000;\n    default: {\n      // Should be unreachable due to regex.\n      throw new Error(`Unknown duration unit: ${unit}`);\n    }\n  }\n}\n\nexport function formatDuration(ms: number): string {\n  if (!Number.isFinite(ms)) {\n    return \"0ms\";\n  }\n  if (ms < 0) {\n    throw new Error(`formatDuration: ms must be non-negative (got ${ms})`);\n  }\n  if (ms < 1000) {\n    return `${Math.floor(ms)}ms`;\n  }\n  if (ms < 60_000) {\n    return `${(ms / 1000).toFixed(2)}s`;\n  }\n  if (ms < 3_600_000) {\n    return `${(ms / 60_000).toFixed(1)}m`;\n  }\n  return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport { mkdirTraceDir } from \"./trace-filesystem.js\";\nimport type { ErrorInfo } from \"./types.js\";\nimport { formatDuration as formatDurationV2 } from \"./utils/duration.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n  os.tmpdir(),\n  \"agent-inspect\",\n  RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n  return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n  return `step_${nanoid(10)}`;\n}\n\n/** Formats a duration for CLI display (v0.2 rules). */\nexport function formatDuration(ms: number): string {\n  return formatDurationV2(ms);\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n  if (!Number.isFinite(timestamp)) {\n    return \"Invalid date\";\n  }\n  const d = new Date(timestamp);\n  if (Number.isNaN(d.getTime())) {\n    return \"Invalid date\";\n  }\n  const y = d.getFullYear();\n  const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n  const day = String(d.getDate()).padStart(2, \"0\");\n  const h = String(d.getHours()).padStart(2, \"0\");\n  const min = String(d.getMinutes()).padStart(2, \"0\");\n  const s = String(d.getSeconds()).padStart(2, \"0\");\n  return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n  const envDir = process.env.AGENT_INSPECT_TRACE_DIR;\n  if (typeof envDir === \"string\" && envDir.trim() !== \"\") {\n    return envDir.trim();\n  }\n  try {\n    const home = os.homedir();\n    if (typeof home !== \"string\" || home.trim() === \"\") {\n      return FALLBACK_TRACE_DIR;\n    }\n    return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n  } catch {\n    return FALLBACK_TRACE_DIR;\n  }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n  const baseDir = traceDir ?? getDefaultTraceDir();\n  let safeId =\n    typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n  safeId = path.basename(safeId);\n  if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n    safeId = \"run_unknown\";\n  }\n  return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n  const primary = path.resolve(traceDir);\n  try {\n    await mkdirTraceDir(primary);\n    return primary;\n  } catch {\n    warn(`Failed to create trace directory: ${primary}`);\n    const fallback = path.resolve(FALLBACK_TRACE_DIR);\n    try {\n      await mkdirTraceDir(fallback);\n      return fallback;\n    } catch {\n      warn(`Failed to create fallback trace directory: ${fallback}`);\n      return primary;\n    }\n  }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n  if (error instanceof Error) {\n    const out: ErrorInfo = { message: error.message };\n    if (typeof error.stack === \"string\" && error.stack.length > 0) {\n      out.stack = error.stack;\n    }\n    return out;\n  }\n  if (typeof error === \"string\") {\n    return { message: error };\n  }\n  if (error === null) {\n    return { message: \"Unknown error: null\" };\n  }\n  if (error === undefined) {\n    return { message: \"Unknown error: undefined\" };\n  }\n  if (\n    typeof error === \"number\" ||\n    typeof error === \"boolean\" ||\n    typeof error === \"bigint\"\n  ) {\n    return { message: String(error) };\n  }\n  if (typeof error === \"object\") {\n    try {\n      return { message: JSON.stringify(error) };\n    } catch {\n      return { message: \"Unknown error\" };\n    }\n  }\n  return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n  if (typeof name !== \"string\" || name.trim() === \"\") {\n    return \"unnamed\";\n  }\n  const trimmed = name.trim();\n  if (trimmed.length <= maxLength) {\n    return trimmed;\n  }\n  const ellipsis = \"...\";\n  const head = Math.max(0, maxLength - ellipsis.length);\n  return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n  const base = `[AgentInspect] ${message}`;\n  if (error === undefined) {\n    console.warn(base);\n    return;\n  }\n  console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n  RunCompletedEvent,\n  RunStartedEvent,\n  StepCompletedEvent,\n  StepStartedEvent,\n  TraceEvent,\n  TraceMetadata,\n  TraceMetadataStatus,\n  RunSummary,\n  StepType,\n  StepStatus,\n} from \"./types.js\";\nimport { parseTraceJsonl } from \"./read-trace.js\";\n\nfunction isFiniteNumber(v: unknown): v is number {\n  return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction parseIsoToMs(value: string | undefined): number | undefined {\n  if (value === undefined) return undefined;\n  const parsed = Date.parse(value);\n  return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport async function extractMetadata(\n  filePath: string,\n  _quickScan?: boolean,\n): Promise<TraceMetadata> {\n  const stats = await stat(filePath);\n\n  let runIdFromFile = path.basename(filePath);\n  if (runIdFromFile.endsWith(\".jsonl\")) {\n    runIdFromFile = runIdFromFile.slice(0, -\".jsonl\".length);\n  }\n\n  const raw = await readFile(filePath, \"utf-8\");\n  const parsedTrace = parseTraceJsonl(raw, { warnings: false });\n\n  let runId: string | undefined;\n  let name: string | undefined;\n  let startedAt: number | undefined;\n  let endedAt: number | undefined;\n  let explicitDurationMs: number | undefined;\n\n  let hasRunStarted = false;\n  let hasRunCompleted = false;\n  let runCompletedStatus: \"success\" | \"error\" | undefined;\n  let anyStepError = false;\n  const anyKnownEvent = parsedTrace.sourceEventCount > 0;\n  let persistedStatus: TraceMetadataStatus | undefined;\n\n  const persistedRun = parsedTrace.persisted.find(\n    (event) => event.kind === \"RUN\",\n  );\n  if (persistedRun) {\n    runId = persistedRun.runId;\n    if (persistedRun.name.trim() !== \"\") {\n      name = persistedRun.name;\n    }\n    startedAt =\n      parseIsoToMs(persistedRun.startedAt) ??\n      parseIsoToMs(persistedRun.timestamp);\n    endedAt = parseIsoToMs(persistedRun.endedAt);\n    if (isFiniteNumber(persistedRun.durationMs)) {\n      explicitDurationMs = persistedRun.durationMs;\n      if (endedAt === undefined && startedAt !== undefined) {\n        endedAt = startedAt + persistedRun.durationMs;\n      }\n    }\n    if (persistedRun.status === \"ok\") persistedStatus = \"success\";\n    else if (persistedRun.status === \"error\") persistedStatus = \"error\";\n    else if (persistedRun.status === \"running\") persistedStatus = \"running\";\n    else if (persistedRun.status === \"unknown\") persistedStatus = \"unknown\";\n  } else {\n    runId = parsedTrace.persisted[0]?.runId;\n  }\n\n  for (const e of parsedTrace.events) {\n    if (\n      runId === undefined &&\n      typeof (e as { runId?: unknown }).runId === \"string\"\n    ) {\n      runId = (e as { runId: string }).runId;\n    }\n\n    if (e.event === \"run_started\") {\n      hasRunStarted = true;\n      const rs = e as RunStartedEvent;\n      if (typeof rs.name === \"string\" && rs.name.trim() !== \"\") {\n        name = rs.name;\n      }\n      if (isFiniteNumber(rs.startTime)) {\n        startedAt = rs.startTime;\n      } else if (isFiniteNumber(rs.timestamp)) {\n        startedAt = rs.timestamp;\n      }\n    }\n\n    if (e.event === \"run_completed\") {\n      hasRunCompleted = true;\n      const rc = e as RunCompletedEvent;\n      runCompletedStatus = rc.status;\n      if (isFiniteNumber(rc.endTime)) endedAt = rc.endTime;\n      else if (isFiniteNumber(rc.timestamp)) endedAt = rc.timestamp;\n      if (isFiniteNumber(rc.durationMs)) explicitDurationMs = rc.durationMs;\n    }\n\n    if (e.event === \"step_completed\") {\n      const sc = e as StepCompletedEvent;\n      if (sc.status === \"error\") {\n        anyStepError = true;\n      }\n    }\n  }\n\n  const resolvedRunId = runId ?? runIdFromFile;\n\n  let status: TraceMetadataStatus = \"unknown\";\n  if (\n    hasRunCompleted &&\n    (runCompletedStatus === \"success\" || runCompletedStatus === \"error\")\n  ) {\n    status = runCompletedStatus;\n  } else if (anyStepError) {\n    // If run_completed is missing, but at least one step failed, treat as error.\n    status = \"error\";\n  } else if (persistedStatus !== undefined) {\n    status = persistedStatus;\n  } else if (hasRunStarted && !hasRunCompleted) {\n    status = \"running\";\n  } else if (anyKnownEvent) {\n    status = \"unknown\";\n  } else {\n    status = \"unknown\";\n  }\n\n  const durationMs =\n    explicitDurationMs ??\n    (startedAt !== undefined &&\n    endedAt !== undefined &&\n    Number.isFinite(startedAt) &&\n    Number.isFinite(endedAt) &&\n    endedAt >= startedAt\n      ? endedAt - startedAt\n      : undefined);\n\n  return {\n    runId: resolvedRunId,\n    name,\n    status,\n    startedAt,\n    endedAt,\n    durationMs,\n    eventCount: parsedTrace.sourceEventCount,\n    filePath,\n    fileSize: stats.size,\n    createdAt: stats.birthtime,\n  };\n}\n\ntype StepAgg = {\n  type: StepType;\n  name: string;\n  status: StepStatus;\n  durationMs?: number;\n  parentId?: string;\n  tokensInput?: number;\n  tokensOutput?: number;\n  tokensTotal?: number;\n  tokensCached?: number;\n  tokensCacheWrite?: number;\n  tokensReasoning?: number;\n};\n\nconst ROOT_STEP_DEPTH = 0;\nconst MAX_RUN_SUMMARY_DEPTH = 1000;\n\nfunction isNonNegativeFiniteNumber(value: unknown): value is number {\n  return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction resolveParentStepId(\n  step: StepAgg,\n  steps: ReadonlyMap<string, StepAgg>,\n): string | undefined {\n  const parentId = step.parentId;\n  if (typeof parentId !== \"string\" || parentId.trim() === \"\") {\n    return undefined;\n  }\n\n  return steps.has(parentId) ? parentId : undefined;\n}\n\n// Resolve ancestry iteratively so malformed cycles and deeply nested\n// valid traces cannot overflow the JavaScript call stack.\nfunction computeStepDepth(\n  stepId: string,\n  steps: ReadonlyMap<string, StepAgg>,\n  depthCache: Map<string, number>,\n): number {\n  const cached = depthCache.get(stepId);\n  if (cached !== undefined) return cached;\n\n  const ancestry: string[] = [];\n  const ancestryIndexes = new Map<string, number>();\n  let currentStepId = stepId;\n  let resolvedDepth: number | undefined;\n\n  while (resolvedDepth === undefined) {\n    const cachedDepth = depthCache.get(currentStepId);\n    if (cachedDepth !== undefined) {\n      resolvedDepth = cachedDepth;\n      continue;\n    }\n\n    const cycleStart = ancestryIndexes.get(currentStepId);\n    if (cycleStart !== undefined) {\n      const cycleStepIds = ancestry.splice(cycleStart);\n      for (const cycleStepId of cycleStepIds) {\n        depthCache.set(cycleStepId, ROOT_STEP_DEPTH);\n      }\n      resolvedDepth = ROOT_STEP_DEPTH;\n      continue;\n    }\n\n    const currentStep = steps.get(currentStepId);\n    if (!currentStep) {\n      resolvedDepth = ROOT_STEP_DEPTH;\n      continue;\n    }\n\n    ancestryIndexes.set(currentStepId, ancestry.length);\n    ancestry.push(currentStepId);\n\n    const parentStepId = resolveParentStepId(currentStep, steps);\n    if (parentStepId === undefined) {\n      ancestry.pop();\n      depthCache.set(currentStepId, ROOT_STEP_DEPTH);\n      resolvedDepth = ROOT_STEP_DEPTH;\n      continue;\n    }\n\n    currentStepId = parentStepId;\n  }\n\n  // Depth is parent depth + 1. Cap at a sane limit after cycles are resolved.\n  ancestry.reverse();\n  for (const ancestorStepId of ancestry) {\n    resolvedDepth = Math.min(MAX_RUN_SUMMARY_DEPTH, resolvedDepth + 1);\n    depthCache.set(ancestorStepId, resolvedDepth);\n  }\n\n  return depthCache.get(stepId) ?? ROOT_STEP_DEPTH;\n}\n\nexport function buildRunSummary(events: TraceEvent[]): RunSummary {\n  const started = events.find(\n    (e): e is RunStartedEvent => e.event === \"run_started\",\n  );\n  const completed = events.filter(\n    (e): e is RunCompletedEvent => e.event === \"run_completed\",\n  );\n  const lastCompleted = completed[completed.length - 1];\n\n  const runId = started?.runId ?? events.find((e: any) => typeof e.runId === \"string\")?.runId ?? \"unknown-run\";\n\n  const name =\n    typeof started?.name === \"string\" && started.name.trim() !== \"\"\n      ? started.name\n      : undefined;\n\n  const status: TraceMetadataStatus = lastCompleted\n    ? lastCompleted.status\n    : started\n      ? \"running\"\n      : \"unknown\";\n\n  const durationMs =\n    lastCompleted && isFiniteNumber(lastCompleted.durationMs)\n      ? lastCompleted.durationMs\n      : undefined;\n\n  const startedAt =\n    started && isFiniteNumber(started.startTime)\n      ? started.startTime\n      : undefined;\n\n  const steps = new Map<string, StepAgg>();\n\n  for (const e of events) {\n    if (e.event === \"step_started\") {\n      const s = e as StepStartedEvent;\n      steps.set(s.stepId, {\n        type: s.type,\n        name: s.name,\n        status: \"running\",\n        parentId: s.parentId,\n        tokensInput:\n          isNonNegativeFiniteNumber(s.metadata?.tokens?.input)\n            ? s.metadata.tokens.input\n            : undefined,\n        tokensOutput:\n          isNonNegativeFiniteNumber(s.metadata?.tokens?.output)\n            ? s.metadata.tokens.output\n            : undefined,\n        tokensTotal: isNonNegativeFiniteNumber(s.metadata?.tokens?.total)\n          ? s.metadata.tokens.total\n          : undefined,\n        tokensCached: isNonNegativeFiniteNumber(s.metadata?.tokens?.cached)\n          ? s.metadata.tokens.cached\n          : undefined,\n        tokensCacheWrite: isNonNegativeFiniteNumber(\n          s.metadata?.tokens?.cacheWrite,\n        )\n          ? s.metadata.tokens.cacheWrite\n          : undefined,\n        tokensReasoning: isNonNegativeFiniteNumber(\n          s.metadata?.tokens?.reasoning,\n        )\n          ? s.metadata.tokens.reasoning\n          : undefined,\n      });\n    }\n  }\n\n  for (const e of events) {\n    if (e.event === \"step_completed\") {\n      const c = e as StepCompletedEvent;\n      const existing = steps.get(c.stepId);\n      if (!existing) continue;\n      existing.status = c.status;\n      existing.durationMs = c.durationMs;\n    }\n  }\n\n  let totalSteps = 0;\n  let llmSteps = 0;\n  let toolSteps = 0;\n  let logicSteps = 0;\n  let errorSteps = 0;\n  let maxDepth = 0;\n  let longestStep: RunSummary[\"longestStep\"] | undefined;\n\n  let totalTokensInput = 0;\n  let totalTokensOutput = 0;\n  let totalTokensTotal = 0;\n  let totalTokensCached = 0;\n  let totalTokensCacheWrite = 0;\n  let totalTokensReasoning = 0;\n  let tokenBearingSteps = 0;\n  let stepsWithKnownTotal = 0;\n  let hasCachedTokens = false;\n  let hasCacheWriteTokens = false;\n  let hasReasoningTokens = false;\n\n  const depthCache = new Map<string, number>();\n\n  for (const [id, s] of steps.entries()) {\n    totalSteps += 1;\n    if (s.type === \"llm\") llmSteps += 1;\n    else if (s.type === \"tool\") toolSteps += 1;\n    else logicSteps += 1;\n\n    if (s.status === \"error\") errorSteps += 1;\n    const depth = computeStepDepth(id, steps, depthCache);\n    if (depth > maxDepth) maxDepth = depth;\n\n    if (typeof s.durationMs === \"number\" && Number.isFinite(s.durationMs)) {\n      if (!longestStep || s.durationMs > longestStep.durationMs) {\n        longestStep = { name: s.name, durationMs: s.durationMs, type: s.type };\n      }\n    }\n\n    if (\n      s.tokensInput !== undefined ||\n      s.tokensOutput !== undefined ||\n      s.tokensTotal !== undefined ||\n      s.tokensCached !== undefined ||\n      s.tokensCacheWrite !== undefined ||\n      s.tokensReasoning !== undefined\n    ) {\n      tokenBearingSteps += 1;\n      if (s.tokensInput !== undefined) totalTokensInput += s.tokensInput;\n      if (s.tokensOutput !== undefined) totalTokensOutput += s.tokensOutput;\n\n      if (s.tokensTotal !== undefined) {\n        totalTokensTotal += s.tokensTotal;\n        stepsWithKnownTotal += 1;\n      } else if (s.tokensInput !== undefined && s.tokensOutput !== undefined) {\n        totalTokensTotal += s.tokensInput + s.tokensOutput;\n        stepsWithKnownTotal += 1;\n      }\n\n      if (s.tokensCached !== undefined) {\n        totalTokensCached += s.tokensCached;\n        hasCachedTokens = true;\n      }\n      if (s.tokensCacheWrite !== undefined) {\n        totalTokensCacheWrite += s.tokensCacheWrite;\n        hasCacheWriteTokens = true;\n      }\n      if (s.tokensReasoning !== undefined) {\n        totalTokensReasoning += s.tokensReasoning;\n        hasReasoningTokens = true;\n      }\n    }\n  }\n\n  const summary: RunSummary = {\n    runId,\n    name,\n    status,\n    durationMs,\n    totalSteps,\n    llmSteps,\n    toolSteps,\n    logicSteps,\n    errorSteps,\n    maxDepth,\n    ...(longestStep ? { longestStep } : {}),\n    ...(tokenBearingSteps > 0\n      ? {\n          totalTokens: {\n            input: totalTokensInput,\n            output: totalTokensOutput,\n            ...(stepsWithKnownTotal === tokenBearingSteps\n              ? { total: totalTokensTotal }\n              : {}),\n            ...(hasCachedTokens ? { cached: totalTokensCached } : {}),\n            ...(hasCacheWriteTokens\n              ? { cacheWrite: totalTokensCacheWrite }\n              : {}),\n            ...(hasReasoningTokens\n              ? { reasoning: totalTokensReasoning }\n              : {}),\n          },\n        }\n      : {}),\n  };\n\n  // startedAt isn't in RunSummary spec, but keep deterministic results: ignore.\n  void startedAt;\n  return summary;\n}\n","import type { RunStartedEvent, TraceEvent, TraceMetadata } from \"./types.js\";\nimport { buildRunSummary } from \"./trace-metadata.js\";\nimport { filterTraces } from \"./trace-filter.js\";\nimport { readTraceEventsFromFile } from \"./storage.js\";\nimport { formatDuration } from \"./utils.js\";\n\nexport interface DurationStats {\n  minMs?: number;\n  maxMs?: number;\n  avgMs?: number;\n  p50Ms?: number;\n  p95Ms?: number;\n}\n\nexport interface TraceStatsRankedRun {\n  runId: string;\n  name?: string;\n  durationMs?: number;\n  status: string;\n}\n\nexport interface TraceStatsRankedStep {\n  runId: string;\n  stepName: string;\n  stepType: string;\n  durationMs: number;\n}\n\nexport interface TraceStats {\n  traceDir: string;\n  since?: string;\n  correlationId?: string;\n  groupId?: string;\n  totalRuns: number;\n  successCount: number;\n  errorCount: number;\n  runningCount: number;\n  unknownCount: number;\n  errorRate: number;\n  duration: DurationStats;\n  totalSteps: number;\n  avgStepsPerRun: number;\n  totalLlmSteps: number;\n  totalToolSteps: number;\n  totalErrorSteps: number;\n  slowestRuns: TraceStatsRankedRun[];\n  slowestSteps: TraceStatsRankedStep[];\n}\n\nexport interface TraceStatsOptions {\n  traceDir: string;\n  since?: string;\n  correlationId?: string;\n  groupId?: string;\n  slowRunLimit?: number;\n  slowStepLimit?: number;\n}\n\nfunction percentile(sorted: number[], p: number): number | undefined {\n  if (sorted.length === 0) return undefined;\n  const idx = Math.min(\n    sorted.length - 1,\n    Math.max(0, Math.ceil((p / 100) * sorted.length) - 1),\n  );\n  return sorted[idx];\n}\n\nasync function readRunStartedMetadata(\n  filePath: string,\n): Promise<Record<string, unknown> | undefined> {\n  try {\n    const events = await readTraceEventsFromFile(filePath);\n    for (const event of events) {\n      if (event.event !== \"run_started\") continue;\n      const rs = event as RunStartedEvent;\n      if (rs.metadata && typeof rs.metadata === \"object\") {\n        return rs.metadata as Record<string, unknown>;\n      }\n      return undefined;\n    }\n  } catch {\n    /* skip */\n  }\n  return undefined;\n}\n\nfunction metaMatchesCorrelation(\n  metadata: Record<string, unknown> | undefined,\n  correlationId?: string,\n  groupId?: string,\n): boolean {\n  if (correlationId) {\n    const v = metadata?.correlationId;\n    if (typeof v !== \"string\" || v !== correlationId) return false;\n  }\n  if (groupId) {\n    const v = metadata?.groupId;\n    if (typeof v !== \"string\" || v !== groupId) return false;\n  }\n  return true;\n}\n\nexport async function buildTraceStats(\n  metas: TraceMetadata[],\n  options: TraceStatsOptions,\n): Promise<TraceStats> {\n  let filtered = filterTraces(metas, { since: options.since });\n\n  if (options.correlationId || options.groupId) {\n    const next: TraceMetadata[] = [];\n    for (const m of filtered) {\n      const md = await readRunStartedMetadata(m.filePath);\n      if (metaMatchesCorrelation(md, options.correlationId, options.groupId)) {\n        next.push(m);\n      }\n    }\n    filtered = next;\n  }\n\n  let successCount = 0;\n  let errorCount = 0;\n  let runningCount = 0;\n  let unknownCount = 0;\n  const durations: number[] = [];\n  let totalSteps = 0;\n  let totalLlmSteps = 0;\n  let totalToolSteps = 0;\n  let totalErrorSteps = 0;\n  const slowestRuns: TraceStatsRankedRun[] = [];\n  const slowestSteps: TraceStatsRankedStep[] = [];\n\n  for (const m of filtered) {\n    if (m.status === \"success\") successCount += 1;\n    else if (m.status === \"error\") errorCount += 1;\n    else if (m.status === \"running\") runningCount += 1;\n    else unknownCount += 1;\n\n    if (\n      typeof m.durationMs === \"number\" &&\n      Number.isFinite(m.durationMs) &&\n      m.durationMs >= 0\n    ) {\n      durations.push(m.durationMs);\n      slowestRuns.push({\n        runId: m.runId,\n        name: m.name,\n        durationMs: m.durationMs,\n        status: m.status,\n      });\n    }\n\n    try {\n      const events = await readTraceEventsFromFile(m.filePath);\n      if (events.length === 0) continue;\n      const summary = buildRunSummary(events);\n      totalSteps += summary.totalSteps;\n      totalLlmSteps += summary.llmSteps;\n      totalToolSteps += summary.toolSteps;\n      totalErrorSteps += summary.errorSteps;\n\n      const steps = collectCompletedSteps(events, m.runId);\n      for (const s of steps) {\n        slowestSteps.push(s);\n      }\n    } catch {\n      /* skip malformed */\n    }\n  }\n\n  slowestRuns.sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n  slowestSteps.sort((a, b) => b.durationMs - a.durationMs);\n\n  const runLimit = options.slowRunLimit ?? 5;\n  const stepLimit = options.slowStepLimit ?? 5;\n  const sortedDur = [...durations].sort((a, b) => a - b);\n  const totalRuns = filtered.length;\n  const errorRate = totalRuns > 0 ? errorCount / totalRuns : 0;\n  const sumDur = durations.reduce((a, b) => a + b, 0);\n\n  return {\n    traceDir: options.traceDir,\n    ...(options.since ? { since: options.since } : {}),\n    ...(options.correlationId ? { correlationId: options.correlationId } : {}),\n    ...(options.groupId ? { groupId: options.groupId } : {}),\n    totalRuns,\n    successCount,\n    errorCount,\n    runningCount,\n    unknownCount,\n    errorRate,\n    duration: {\n      ...(sortedDur.length > 0\n        ? {\n            minMs: sortedDur[0],\n            maxMs: sortedDur[sortedDur.length - 1],\n            avgMs: sumDur / sortedDur.length,\n            p50Ms: percentile(sortedDur, 50),\n            p95Ms: percentile(sortedDur, 95),\n          }\n        : {}),\n    },\n    totalSteps,\n    avgStepsPerRun: totalRuns > 0 ? totalSteps / totalRuns : 0,\n    totalLlmSteps,\n    totalToolSteps,\n    totalErrorSteps,\n    slowestRuns: slowestRuns.slice(0, runLimit),\n    slowestSteps: slowestSteps.slice(0, stepLimit),\n  };\n}\n\nfunction collectCompletedSteps(\n  events: TraceEvent[],\n  runId: string,\n): TraceStatsRankedStep[] {\n  const started = new Map<string, { name: string; type: string }>();\n  const out: TraceStatsRankedStep[] = [];\n  for (const e of events) {\n    if (e.event === \"step_started\") {\n      const s = e as { stepId: string; name: string; type: string };\n      started.set(s.stepId, { name: s.name, type: s.type });\n    }\n    if (e.event === \"step_completed\") {\n      const c = e as {\n        stepId: string;\n        durationMs?: number;\n        status: string;\n      };\n      if (c.status !== \"success\" && c.status !== \"error\") continue;\n      if (typeof c.durationMs !== \"number\" || !Number.isFinite(c.durationMs)) {\n        continue;\n      }\n      const meta = started.get(c.stepId);\n      out.push({\n        runId,\n        stepName: meta?.name ?? c.stepId,\n        stepType: meta?.type ?? \"logic\",\n        durationMs: c.durationMs,\n      });\n    }\n  }\n  return out;\n}\n\n/**\n * Formats a step label for display. `step.tool`/`step.llm` already store the\n * name with its type prefix (e.g. \"tool:lookup\"), while plain `step()` stores a\n * bare name, so prefixing unconditionally would double the prefix. Add the type\n * prefix only when the name does not already carry it, matching what list/view\n * show for the same step.\n */\nexport function formatStepLabel(stepType: string, stepName: string): string {\n  return stepName.startsWith(`${stepType}:`) ? stepName : `${stepType}:${stepName}`;\n}\n\nexport function renderTraceStats(stats: TraceStats): string {\n  const lines: string[] = [];\n  lines.push(\"Trace stats (local)\");\n  lines.push(`Directory: ${stats.traceDir}`);\n  if (stats.since) lines.push(`Since: ${stats.since}`);\n  if (stats.correlationId) lines.push(`Correlation ID: ${stats.correlationId}`);\n  if (stats.groupId) lines.push(`Group ID: ${stats.groupId}`);\n  lines.push(\"\");\n  lines.push(`Runs: ${stats.totalRuns}`);\n  lines.push(\n    `  success: ${stats.successCount}  error: ${stats.errorCount}  running: ${stats.runningCount}  unknown: ${stats.unknownCount}`,\n  );\n  lines.push(`Error rate: ${(stats.errorRate * 100).toFixed(1)}%`);\n  if (stats.duration.avgMs !== undefined) {\n    lines.push(\n      `Duration: min ${formatDuration(stats.duration.minMs ?? 0)} | avg ${formatDuration(stats.duration.avgMs)} | p50 ${formatDuration(stats.duration.p50Ms ?? 0)} | p95 ${formatDuration(stats.duration.p95Ms ?? 0)} | max ${formatDuration(stats.duration.maxMs ?? 0)}`,\n    );\n  }\n  lines.push(\"\");\n  lines.push(`Steps: ${stats.totalSteps} (avg ${stats.avgStepsPerRun.toFixed(1)} per run)`);\n  lines.push(\n    `  LLM: ${stats.totalLlmSteps}  tool: ${stats.totalToolSteps}  errors: ${stats.totalErrorSteps}`,\n  );\n  if (stats.slowestRuns.length > 0) {\n    lines.push(\"\");\n    lines.push(\"Slowest runs:\");\n    for (const r of stats.slowestRuns) {\n      lines.push(\n        `  ${r.runId} | ${r.name ?? \"-\"} | ${formatDuration(r.durationMs ?? 0)} | ${r.status}`,\n      );\n    }\n  }\n  if (stats.slowestSteps.length > 0) {\n    lines.push(\"\");\n    lines.push(\"Slowest steps:\");\n    for (const s of stats.slowestSteps) {\n      lines.push(\n        `  ${s.runId} | ${formatStepLabel(s.stepType, s.stepName)} | ${formatDuration(s.durationMs)}`,\n      );\n    }\n  }\n  return lines.join(\"\\n\");\n}\n","import type {\n  RunCompletedEvent,\n  RunStartedEvent,\n  StepCompletedEvent,\n  StepStartedEvent,\n  StepStatus,\n  StepType,\n  TraceEvent,\n  TraceMetadataStatus,\n} from \"./types.js\";\nimport { formatStepLabel } from \"./stats.js\";\nimport { formatDuration, formatTimestamp } from \"./utils.js\";\n\nexport type TimelineFocus = \"all\" | \"slow\";\n\nexport interface TimelineEntry {\n  stepId: string;\n  name: string;\n  type: StepType;\n  status: StepStatus;\n  depth: number;\n  startedAt: number;\n  offsetMs: number;\n  durationMs?: number;\n  isError: boolean;\n  slow?: boolean;\n  streaming?: {\n    chunkCount?: number;\n    streamDurationMs?: number;\n    streamedCharCount?: number;\n  };\n}\n\nexport interface RunTimeline {\n  runId: string;\n  name?: string;\n  status: TraceMetadataStatus;\n  startedAt?: number;\n  endedAt?: number;\n  durationMs?: number;\n  correlation?: {\n    correlationId?: string;\n    requestId?: string;\n    decisionId?: string;\n    groupId?: string;\n  };\n  entries: TimelineEntry[];\n}\n\nexport interface TimelineOptions {\n  focus?: TimelineFocus;\n  slowTopN?: number;\n}\n\nconst ROOT_TIMELINE_DEPTH = 0;\nconst MAX_TIMELINE_DEPTH = 1000;\n\nfunction finite(n: unknown): n is number {\n  return typeof n === \"number\" && Number.isFinite(n);\n}\n\nfunction pickStreamingMeta(\n  metadata: Record<string, unknown> | undefined,\n): TimelineEntry[\"streaming\"] | undefined {\n  if (!metadata || typeof metadata !== \"object\") return undefined;\n  const chunkCount = metadata.chunkCount;\n  const streamDurationMs = metadata.streamDurationMs;\n  const streamedCharCount = metadata.streamedCharCount;\n  if (\n    !finite(chunkCount) &&\n    !finite(streamDurationMs) &&\n    !finite(streamedCharCount)\n  ) {\n    return undefined;\n  }\n  return {\n    ...(finite(chunkCount) ? { chunkCount } : {}),\n    ...(finite(streamDurationMs) ? { streamDurationMs } : {}),\n    ...(finite(streamedCharCount) ? { streamedCharCount } : {}),\n  };\n}\n\nfunction pickCorrelation(\n  metadata: Record<string, unknown> | undefined,\n): RunTimeline[\"correlation\"] | undefined {\n  if (!metadata || typeof metadata !== \"object\") return undefined;\n  const out: NonNullable<RunTimeline[\"correlation\"]> = {};\n  for (const key of [\n    \"correlationId\",\n    \"requestId\",\n    \"decisionId\",\n    \"groupId\",\n  ] as const) {\n    const v = metadata[key];\n    if (typeof v === \"string\" && v.trim() !== \"\") {\n      out[key] = v;\n    }\n  }\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function buildRunTimeline(\n  events: readonly TraceEvent[],\n  options: TimelineOptions = {},\n): RunTimeline {\n  const started = events.find(\n    (e): e is RunStartedEvent => e.event === \"run_started\",\n  );\n  const completed = events.filter(\n    (e): e is RunCompletedEvent => e.event === \"run_completed\",\n  );\n  const lastCompleted = completed[completed.length - 1];\n\n  const runId =\n    started?.runId ??\n    events.find((e) => typeof (e as { runId?: string }).runId === \"string\")\n      ?.runId ??\n    \"unknown-run\";\n\n  const runStart =\n    started && finite(started.startTime)\n      ? started.startTime\n      : started && finite(started.timestamp)\n        ? started.timestamp\n        : undefined;\n\n  const status: TraceMetadataStatus = lastCompleted\n    ? lastCompleted.status\n    : started\n      ? \"running\"\n      : \"unknown\";\n\n  const steps = new Map<\n    string,\n    {\n      name: string;\n      type: StepType;\n      parentId?: string;\n      startedAt: number;\n      status: StepStatus;\n      durationMs?: number;\n      metadata?: Record<string, unknown>;\n    }\n  >();\n\n  for (const e of events) {\n    if (e.event === \"step_started\") {\n      const s = e as StepStartedEvent;\n      steps.set(s.stepId, {\n        name: s.name,\n        type: s.type,\n        parentId: s.parentId,\n        startedAt: finite(s.startTime) ? s.startTime : s.timestamp,\n        status: \"running\",\n        metadata: s.metadata as Record<string, unknown> | undefined,\n      });\n    }\n  }\n\n  for (const e of events) {\n    if (e.event !== \"step_completed\") continue;\n    const c = e as StepCompletedEvent;\n    const node = steps.get(c.stepId);\n    if (!node) continue;\n    node.status = c.status;\n    if (finite(c.durationMs)) node.durationMs = c.durationMs;\n  }\n\n  const depthCache = new Map<string, number>();\n  const computeDepth = (stepId: string): number => {\n    const cached = depthCache.get(stepId);\n    if (cached !== undefined) return cached;\n\n    const ancestry: string[] = [];\n    const ancestryIndexes = new Map<string, number>();\n    let currentStepId = stepId;\n    let resolvedDepth: number | undefined;\n\n    while (resolvedDepth === undefined) {\n      const cachedDepth = depthCache.get(currentStepId);\n      if (cachedDepth !== undefined) {\n        resolvedDepth = cachedDepth;\n        continue;\n      }\n\n      const cycleStart = ancestryIndexes.get(currentStepId);\n      if (cycleStart !== undefined) {\n        const cycleStepIds = ancestry.splice(cycleStart);\n        for (const cycleStepId of cycleStepIds) {\n          depthCache.set(cycleStepId, ROOT_TIMELINE_DEPTH);\n        }\n        resolvedDepth = ROOT_TIMELINE_DEPTH;\n        continue;\n      }\n\n      const currentStep = steps.get(currentStepId);\n      if (!currentStep) {\n        resolvedDepth = ROOT_TIMELINE_DEPTH;\n        continue;\n      }\n\n      ancestryIndexes.set(currentStepId, ancestry.length);\n      ancestry.push(currentStepId);\n\n      const parentId = currentStep.parentId;\n      if (\n        typeof parentId !== \"string\" ||\n        parentId.trim() === \"\" ||\n        !steps.has(parentId)\n      ) {\n        ancestry.pop();\n        depthCache.set(currentStepId, ROOT_TIMELINE_DEPTH);\n        resolvedDepth = ROOT_TIMELINE_DEPTH;\n        continue;\n      }\n\n      currentStepId = parentId;\n    }\n\n    ancestry.reverse();\n    for (const ancestorStepId of ancestry) {\n      resolvedDepth = Math.min(MAX_TIMELINE_DEPTH, resolvedDepth + 1);\n      depthCache.set(ancestorStepId, resolvedDepth);\n    }\n\n    const resolvedStepDepth = depthCache.get(stepId);\n    if (resolvedStepDepth === undefined) {\n      throw new Error(`Failed to resolve timeline depth for step \"${stepId}\"`);\n    }\n    return resolvedStepDepth;\n  };\n\n  const entries: TimelineEntry[] = [];\n  for (const [stepId, s] of steps.entries()) {\n    const offsetMs =\n      runStart !== undefined && finite(s.startedAt)\n        ? Math.max(0, s.startedAt - runStart)\n        : 0;\n    entries.push({\n      stepId,\n      name: s.name,\n      type: s.type,\n      status: s.status,\n      depth: computeDepth(stepId),\n      startedAt: s.startedAt,\n      offsetMs,\n      durationMs: s.durationMs,\n      isError: s.status === \"error\",\n      streaming: pickStreamingMeta(s.metadata),\n    });\n  }\n\n  entries.sort((a, b) => a.startedAt - b.startedAt);\n\n  const slowTopN = options.slowTopN ?? 3;\n  if (options.focus === \"slow\" && entries.length > 0) {\n    const ranked = [...entries]\n      .filter((e) => finite(e.durationMs))\n      .sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n    const slowIds = new Set(\n      ranked.slice(0, slowTopN).map((e) => e.stepId),\n    );\n    for (const e of entries) {\n      if (slowIds.has(e.stepId)) e.slow = true;\n    }\n  }\n\n  return {\n    runId,\n    name:\n      typeof started?.name === \"string\" && started.name.trim() !== \"\"\n        ? started.name\n        : undefined,\n    status,\n    startedAt: runStart,\n    endedAt:\n      lastCompleted && finite(lastCompleted.endTime)\n        ? lastCompleted.endTime\n        : undefined,\n    durationMs:\n      lastCompleted && finite(lastCompleted.durationMs)\n        ? lastCompleted.durationMs\n        : undefined,\n    correlation: pickCorrelation(\n      started?.metadata as Record<string, unknown> | undefined,\n    ),\n    entries,\n  };\n}\n\nexport interface RenderTimelineOptions {\n  focus?: TimelineFocus;\n}\n\nexport function renderTimeline(\n  timeline: RunTimeline,\n  options: RenderTimelineOptions = {},\n): string {\n  const lines: string[] = [];\n  lines.push(`Timeline: ${timeline.name ?? timeline.runId}`);\n  lines.push(`Run ID: ${timeline.runId}`);\n  lines.push(`Status: ${timeline.status}`);\n  if (timeline.startedAt !== undefined) {\n    lines.push(`Started: ${formatTimestamp(timeline.startedAt)}`);\n  }\n  if (timeline.durationMs !== undefined) {\n    lines.push(`Duration: ${formatDuration(timeline.durationMs)}`);\n  }\n  if (timeline.correlation) {\n    const parts = Object.entries(timeline.correlation)\n      .filter(([, v]) => typeof v === \"string\")\n      .map(([k, v]) => `${k}=${v}`);\n    if (parts.length > 0) {\n      lines.push(`Correlation: ${parts.join(\", \")}`);\n    }\n  }\n  lines.push(\"\");\n  lines.push(\"Steps (chronological):\");\n\n  const show = timeline.entries.filter((e) => {\n    if (options.focus === \"slow\") return e.slow === true;\n    return true;\n  });\n\n  if (show.length === 0) {\n    lines.push(\n      options.focus === \"slow\"\n        ? \"(no steps with duration for slow focus)\"\n        : \"(no steps)\",\n    );\n    return lines.join(\"\\n\");\n  }\n\n  for (const e of show) {\n    const prefix = e.slow ? \"[slow] \" : \"\";\n    const typeTag =\n      e.type === \"llm\" ? \"llm\" : e.type === \"tool\" ? \"tool\" : e.type;\n    const dur =\n      e.durationMs !== undefined ? formatDuration(e.durationMs) : \"-\";\n    const err = e.isError ? \" error\" : \"\";\n    const off = formatDuration(e.offsetMs);\n    let line = `${prefix}+${off} ${formatStepLabel(typeTag, e.name)} (${dur})${err}`;\n    if (e.streaming?.chunkCount !== undefined) {\n      line += ` chunks=${e.streaming.chunkCount}`;\n    }\n    if (e.streaming?.streamDurationMs !== undefined) {\n      line += ` stream=${formatDuration(e.streaming.streamDurationMs)}`;\n    }\n    lines.push(line);\n  }\n\n  return lines.join(\"\\n\");\n}\n","import type {\n  RunCompletedEvent,\n  RunStartedEvent,\n  StepCompletedEvent,\n  StepStartedEvent,\n  TraceCorrelationMetadata,\n  TraceEvent,\n  TraceMetadataStatus,\n} from \"./types.js\";\nimport { buildRunSummary } from \"./trace-metadata.js\";\nimport { formatDuration } from \"./utils.js\";\n\nexport interface RunWhatSummary {\n  runId: string;\n  name?: string;\n  status: TraceMetadataStatus;\n  durationMs?: number;\n  totalSteps: number;\n  llmSteps: number;\n  toolSteps: number;\n  logicSteps: number;\n  errorSteps: number;\n  maxDepth: number;\n  longestStep?: {\n    name: string;\n    durationMs: number;\n    type: string;\n  };\n  totalTokens?: {\n    input: number;\n    output: number;\n    total?: number;\n    cached?: number;\n    cacheWrite?: number;\n    reasoning?: number;\n  };\n  correlation?: TraceCorrelationMetadata;\n  failedStepNames: string[];\n  runErrorMessage?: string;\n}\n\nfunction pickCorrelation(\n  metadata: Record<string, unknown> | undefined,\n): TraceCorrelationMetadata | undefined {\n  if (!metadata) return undefined;\n  const out: TraceCorrelationMetadata = {};\n  for (const key of [\n    \"correlationId\",\n    \"requestId\",\n    \"decisionId\",\n    \"groupId\",\n  ] as const) {\n    const value = metadata[key];\n    if (typeof value === \"string\" && value.trim() !== \"\") {\n      out[key] = value;\n    }\n  }\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction stepMixLine(summary: RunWhatSummary): string {\n  const parts: string[] = [];\n  if (summary.llmSteps > 0) parts.push(`${summary.llmSteps} LLM`);\n  if (summary.toolSteps > 0) parts.push(`${summary.toolSteps} tool`);\n  if (summary.logicSteps > 0) parts.push(`${summary.logicSteps} logic`);\n  return parts.length > 0 ? parts.join(\", \") : \"none\";\n}\n\nfunction outcomeLine(summary: RunWhatSummary): string {\n  if (summary.status === \"success\") {\n    return summary.errorSteps > 0\n      ? \"Completed with step errors recorded.\"\n      : \"Completed successfully.\";\n  }\n  if (summary.status === \"error\") {\n    if (summary.failedStepNames.length > 0) {\n      const names = summary.failedStepNames.slice(0, 3).join(\", \");\n      const suffix =\n        summary.failedStepNames.length > 3\n          ? ` (+${summary.failedStepNames.length - 3} more)`\n          : \"\";\n      return `Failed at step(s): ${names}${suffix}.`;\n    }\n    if (summary.runErrorMessage) {\n      return `Run failed: ${summary.runErrorMessage}`;\n    }\n    return \"Run failed.\";\n  }\n  if (summary.status === \"running\") {\n    return \"Run is still in progress (no run_completed).\";\n  }\n  return \"Outcome unknown — inspect events may be incomplete.\";\n}\n\n/**\n * Build a concise inspection summary for `what` / report workflows.\n * Read-only over in-memory v0.1 {@link TraceEvent} rows.\n */\nexport function buildRunWhatSummary(events: TraceEvent[]): RunWhatSummary {\n  const base = buildRunSummary(events);\n  const started = events.find(\n    (e): e is RunStartedEvent => e.event === \"run_started\",\n  );\n  const completed = events.filter(\n    (e): e is RunCompletedEvent => e.event === \"run_completed\",\n  );\n  const lastCompleted = completed[completed.length - 1];\n\n  const failedStepNames: string[] = [];\n  const stepNames = new Map<string, string>();\n  for (const e of events) {\n    if (e.event === \"step_started\") {\n      const s = e as StepStartedEvent;\n      stepNames.set(s.stepId, s.name);\n    }\n  }\n  for (const e of events) {\n    if (e.event === \"step_completed\") {\n      const sc = e as StepCompletedEvent;\n      if (sc.status === \"error\") {\n        failedStepNames.push(stepNames.get(sc.stepId) ?? sc.stepId);\n      }\n    }\n  }\n\n  return {\n    runId: base.runId,\n    name: base.name,\n    status: base.status,\n    durationMs: base.durationMs,\n    totalSteps: base.totalSteps,\n    llmSteps: base.llmSteps,\n    toolSteps: base.toolSteps,\n    logicSteps: base.logicSteps,\n    errorSteps: base.errorSteps,\n    maxDepth: base.maxDepth,\n    longestStep: base.longestStep,\n    totalTokens: base.totalTokens,\n    correlation: pickCorrelation(started?.metadata),\n    failedStepNames,\n    runErrorMessage: lastCompleted?.error?.message,\n  };\n}\n\nexport interface RenderWhatOptions {\n  /** Include correlation ids when present (default true). */\n  correlation?: boolean;\n}\n\n/**\n * Render a human-readable `what` summary (plain text, no ANSI).\n */\nexport function renderRunWhat(\n  summary: RunWhatSummary,\n  options: RenderWhatOptions = {},\n): string {\n  const showCorrelation = options.correlation !== false;\n  const lines: string[] = [];\n  const label = summary.name ?? summary.runId;\n  lines.push(`What: ${label}`);\n\n  const duration =\n    summary.durationMs !== undefined ? formatDuration(summary.durationMs) : \"—\";\n  lines.push(\n    `Status: ${summary.status} · Duration: ${duration} · Steps: ${summary.totalSteps} (${stepMixLine(summary)})`,\n  );\n\n  if (summary.totalTokens) {\n    const tokenParts = [\n      `${summary.totalTokens.input} in`,\n      `${summary.totalTokens.output} out`,\n    ];\n    if (summary.totalTokens.total !== undefined) {\n      tokenParts.push(`${summary.totalTokens.total} total`);\n    }\n    if (summary.totalTokens.cached !== undefined) {\n      tokenParts.push(`${summary.totalTokens.cached} cached`);\n    }\n    if (summary.totalTokens.cacheWrite !== undefined) {\n      tokenParts.push(`${summary.totalTokens.cacheWrite} cache-write`);\n    }\n    if (summary.totalTokens.reasoning !== undefined) {\n      tokenParts.push(`${summary.totalTokens.reasoning} reasoning`);\n    }\n    lines.push(`Tokens: ${tokenParts.join(\" / \")}`);\n  }\n\n  if (showCorrelation && summary.correlation) {\n    const parts: string[] = [];\n    if (summary.correlation.correlationId) {\n      parts.push(`correlationId=${summary.correlation.correlationId}`);\n    }\n    if (summary.correlation.requestId) {\n      parts.push(`requestId=${summary.correlation.requestId}`);\n    }\n    if (summary.correlation.decisionId) {\n      parts.push(`decisionId=${summary.correlation.decisionId}`);\n    }\n    if (summary.correlation.groupId) {\n      parts.push(`groupId=${summary.correlation.groupId}`);\n    }\n    if (parts.length > 0) {\n      lines.push(`Correlation: ${parts.join(\", \")}`);\n    }\n  }\n\n  lines.push(`Outcome: ${outcomeLine(summary)}`);\n\n  if (summary.longestStep && summary.totalSteps > 0) {\n    lines.push(\n      `Slowest: ${summary.longestStep.name} (${formatDuration(summary.longestStep.durationMs)}, ${summary.longestStep.type})`,\n    );\n  }\n\n  if (summary.maxDepth > 0) {\n    lines.push(`Max depth: ${summary.maxDepth}`);\n  }\n\n  return lines.join(\"\\n\");\n}\n","export type ObservedOutcomeStatus = \"passed\" | \"failed\" | \"unknown\" | \"skipped\";\n\nexport type ObservedOutcomeMethod =\n  | \"dom\"\n  | \"accessibility\"\n  | \"snapshot\"\n  | \"network\"\n  | \"storage\"\n  | \"filesystem\"\n  | \"database\"\n  | \"queue\"\n  | \"custom\";\n\nexport interface ObservedOutcome {\n  outcomeId: string;\n  runId: string;\n  parentId?: string;\n  name: string;\n  expectation: string;\n  status: ObservedOutcomeStatus;\n  method?: ObservedOutcomeMethod;\n  actual?: unknown;\n  evidence?: unknown;\n  observedAt: number;\n}\n\nexport interface ObserveOutcomeOptions {\n  expectation: string;\n  status: ObservedOutcomeStatus;\n  method?: ObservedOutcomeMethod;\n  actual?: unknown;\n  evidence?: unknown;\n  observedAt?: number | string;\n}\n\nexport interface ObservedOutcomeSummary {\n  total: number;\n  passed: number;\n  failed: number;\n  unknown: number;\n  skipped: number;\n  outcomes: ObservedOutcome[];\n}\n\nexport const OBSERVED_OUTCOME_STATUSES: readonly ObservedOutcomeStatus[] = [\n  \"passed\",\n  \"failed\",\n  \"unknown\",\n  \"skipped\",\n];\n\nexport const OBSERVED_OUTCOME_METHODS: readonly ObservedOutcomeMethod[] = [\n  \"dom\",\n  \"accessibility\",\n  \"snapshot\",\n  \"network\",\n  \"storage\",\n  \"filesystem\",\n  \"database\",\n  \"queue\",\n  \"custom\",\n];\n\nexport const OUTCOME_ATTRIBUTE_STATUS_KEY = \"outcomeStatus\";\nexport const OUTCOME_ATTRIBUTE_EXPECTATION_KEY = \"expectation\";\nexport const OUTCOME_ATTRIBUTE_METHOD_KEY = \"method\";\nexport const OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY = \"observedAt\";\nexport const OUTCOME_LEGACY_EVENT = \"outcome_observed\";\n","import type { PersistedInspectEvent } from \"../types/persisted-inspect-event.js\";\nimport type { TraceEvent } from \"../types.js\";\nimport {\n  OUTCOME_ATTRIBUTE_EXPECTATION_KEY,\n  OUTCOME_ATTRIBUTE_METHOD_KEY,\n  OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY,\n  OUTCOME_ATTRIBUTE_STATUS_KEY,\n  OUTCOME_LEGACY_EVENT,\n  type ObservedOutcome,\n  type ObservedOutcomeMethod,\n  type ObservedOutcomeStatus,\n  type ObservedOutcomeSummary,\n} from \"./types.js\";\nimport { parseObservedOutcomeStatus } from \"./validate.js\";\n\nfunction isOutcomeStatus(value: unknown): value is ObservedOutcomeStatus {\n  return (\n    value === \"passed\" ||\n    value === \"failed\" ||\n    value === \"unknown\" ||\n    value === \"skipped\"\n  );\n}\n\nfunction parseMethod(value: unknown): ObservedOutcomeMethod | undefined {\n  if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n  return value as ObservedOutcomeMethod;\n}\n\nfunction fromOutcomeObservedEvent(event: Extract<TraceEvent, { event: \"outcome_observed\" }>): ObservedOutcome {\n  return {\n    outcomeId: event.outcomeId,\n    runId: event.runId,\n    ...(event.parentId !== undefined ? { parentId: event.parentId } : {}),\n    name: event.name,\n    expectation: event.expectation,\n    status: event.status,\n    ...(event.method !== undefined ? { method: event.method } : {}),\n    ...(event.actual !== undefined ? { actual: event.actual } : {}),\n    ...(event.evidence !== undefined ? { evidence: event.evidence } : {}),\n    observedAt: event.observedAt,\n  };\n}\n\nfunction fromPersistedOutcome(event: PersistedInspectEvent): ObservedOutcome | undefined {\n  if (event.kind !== \"OUTCOME\") return undefined;\n  const attrs = event.attributes ?? {};\n  const statusRaw = attrs[OUTCOME_ATTRIBUTE_STATUS_KEY];\n  if (!isOutcomeStatus(statusRaw)) return undefined;\n  const expectation =\n    typeof attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY] === \"string\"\n      ? attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY]\n      : event.name;\n  const observedAtRaw = attrs[OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY];\n  const observedAt =\n    typeof observedAtRaw === \"string\"\n      ? Date.parse(observedAtRaw)\n      : typeof observedAtRaw === \"number\" && Number.isFinite(observedAtRaw)\n        ? observedAtRaw\n        : Date.parse(event.timestamp);\n  return {\n    outcomeId: event.eventId,\n    runId: event.runId,\n    ...(event.parentId !== undefined ? { parentId: event.parentId } : {}),\n    name: event.name,\n    expectation,\n    status: statusRaw,\n    ...(parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) !== undefined\n      ? { method: parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) }\n      : {}),\n    ...(event.outputSummary !== undefined ? { actual: event.outputSummary } : {}),\n    ...(attrs.evidence !== undefined ? { evidence: attrs.evidence } : {}),\n    observedAt: Number.isFinite(observedAt) ? observedAt : Date.parse(event.timestamp),\n  };\n}\n\nexport function extractOutcomesFromTraceEvents(events: readonly TraceEvent[]): ObservedOutcome[] {\n  const out: ObservedOutcome[] = [];\n  for (const event of events) {\n    if (event.event === OUTCOME_LEGACY_EVENT) {\n      out.push(fromOutcomeObservedEvent(event as Extract<TraceEvent, { event: \"outcome_observed\" }>));\n    }\n  }\n  return out.sort((a, b) => a.observedAt - b.observedAt || a.name.localeCompare(b.name));\n}\n\nexport function extractOutcomesFromPersistedEvents(\n  events: readonly PersistedInspectEvent[],\n): ObservedOutcome[] {\n  const out: ObservedOutcome[] = [];\n  for (const event of events) {\n    const outcome = fromPersistedOutcome(event);\n    if (outcome) out.push(outcome);\n  }\n  return out.sort((a, b) => a.observedAt - b.observedAt || a.name.localeCompare(b.name));\n}\n\nexport function summarizeObservedOutcomes(outcomes: readonly ObservedOutcome[]): ObservedOutcomeSummary {\n  const summary: ObservedOutcomeSummary = {\n    total: outcomes.length,\n    passed: 0,\n    failed: 0,\n    unknown: 0,\n    skipped: 0,\n    outcomes: [...outcomes],\n  };\n  for (const outcome of outcomes) {\n    summary[outcome.status] += 1;\n  }\n  return summary;\n}\n\nexport function outcomesMatchingStatus(\n  outcomes: readonly ObservedOutcome[],\n  statuses: readonly ObservedOutcomeStatus[],\n): ObservedOutcome[] {\n  const set = new Set(statuses);\n  return outcomes.filter((outcome) => set.has(outcome.status));\n}\n\nexport function parseObservationFilter(value: string | undefined): ObservedOutcomeStatus | undefined {\n  if (value === undefined || value.trim() === \"\") return undefined;\n  return parseObservedOutcomeStatus(value);\n}\n","import type { ObservedOutcome, ObservedOutcomeSummary } from \"./types.js\";\n\nfunction formatPayload(value: unknown): string {\n  if (value === undefined) return \"\";\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return String(value);\n  }\n}\n\nexport function renderObservedOutcomesMarkdown(summary: ObservedOutcomeSummary): string {\n  if (summary.total === 0) {\n    return \"No observed outcomes recorded for this run.\";\n  }\n  const lines = [\n    `Total: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})`,\n    \"\",\n    \"| Name | Status | Expectation | Method |\",\n    \"| --- | --- | --- | --- |\",\n  ];\n  for (const outcome of summary.outcomes) {\n    lines.push(\n      `| ${outcome.name} | ${outcome.status} | ${outcome.expectation.replace(/\\|/g, \"\\\\|\")} | ${outcome.method ?? \"-\"} |`,\n    );\n  }\n  return lines.join(\"\\n\");\n}\n\nexport function renderObservedOutcomesText(summary: ObservedOutcomeSummary): string {\n  if (summary.total === 0) {\n    return \"No observed outcomes recorded for this run.\";\n  }\n  const lines = [\n    `Observed outcomes: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})`,\n  ];\n  for (const outcome of summary.outcomes) {\n    const evidence = formatPayload(outcome.evidence);\n    const suffix = evidence ? ` evidence=${evidence}` : \"\";\n    lines.push(\n      `- ${outcome.name} [${outcome.status}] ${outcome.expectation}${suffix}`,\n    );\n  }\n  return lines.join(\"\\n\");\n}\n\nexport function renderObservedOutcomesHtml(summary: ObservedOutcomeSummary): string {\n  if (summary.total === 0) {\n    return \"<p>No observed outcomes recorded for this run.</p>\";\n  }\n  const rows = summary.outcomes\n    .map((outcome: ObservedOutcome) => {\n      const esc = (v: string) =>\n        v.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n      return `<tr><td>${esc(outcome.name)}</td><td>${esc(outcome.status)}</td><td>${esc(outcome.expectation)}</td><td>${esc(outcome.method ?? \"-\")}</td></tr>`;\n    })\n    .join(\"\");\n  return `<p>Total: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})</p><table><thead><tr><th>Name</th><th>Status</th><th>Expectation</th><th>Method</th></tr></thead><tbody>${rows}</tbody></table>`;\n}\n","import type { TraceEvent } from \"./types.js\";\nimport type { RedactionProfile } from \"./types.js\";\nimport type { InspectRunTree } from \"./types/inspect-event.js\";\nimport { exportHtml } from \"./exporters/html-exporter.js\";\nimport { exportMarkdown } from \"./exporters/markdown-exporter.js\";\nimport { escapeHtml, escapeMarkdown } from \"./exporters/helpers.js\";\nimport { manualTraceEventsToRunTree } from \"./exporters/manual-trace-adapter.js\";\nimport {\n  redactRunTreeForExport,\n  redactTraceEventsForReport,\n} from \"./exporters/redact-export.js\";\nimport { buildRunTimeline, renderTimeline } from \"./timeline.js\";\nimport { buildRunWhatSummary, renderRunWhat } from \"./what.js\";\nimport {\n  extractOutcomesFromTraceEvents,\n  renderObservedOutcomesHtml,\n  renderObservedOutcomesMarkdown,\n  summarizeObservedOutcomes,\n} from \"./outcomes/index.js\";\n\nexport type ReportFormat = \"markdown\" | \"html\";\nexport type ReportSection = \"all\" | \"observations\" | \"what\" | \"timeline\" | \"tree\";\n\nexport interface ReportOptions {\n  format: ReportFormat;\n  includeAttributes?: boolean;\n  includeErrors?: boolean;\n  redactionProfile?: RedactionProfile;\n  /** Include correlation ids in the what section (default true). */\n  correlation?: boolean;\n  /** Limit output to one section (`observations` shows observed outcomes only). */\n  section?: ReportSection;\n}\n\nexport interface ReportResult {\n  format: ReportFormat;\n  content: string;\n  contentType: string;\n  fileExtension: string;\n}\n\nfunction resolveTree(\n  events: TraceEvent[],\n  profile: RedactionProfile,\n): InspectRunTree {\n  const tree = manualTraceEventsToRunTree(events);\n  return profile === \"local\"\n    ? tree\n    : redactRunTreeForExport(tree, { redactionProfile: profile });\n}\n\nfunction tailMarkdownSection(content: string, heading: string): string {\n  const marker = `## ${heading}`;\n  const idx = content.indexOf(marker);\n  if (idx < 0) return \"\";\n  return content.slice(idx).trimEnd();\n}\n\nfunction extractHtmlFragment(content: string, start: string, end: string): string {\n  const startIdx = content.indexOf(start);\n  if (startIdx < 0) return \"\";\n  const endIdx = content.indexOf(end, startIdx + start.length);\n  if (endIdx < 0) return content.slice(startIdx);\n  return content.slice(startIdx, endIdx);\n}\n\nconst REPORT_HTML_CSS = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\npre{white-space:pre-wrap;background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.9rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n/**\n * Build a local inspection report (markdown or HTML) from v0.1 trace events.\n * Composes `what`, timeline, and execution-tree sections.\n */\nexport function buildRunReport(\n  events: TraceEvent[],\n  options: ReportOptions,\n): ReportResult {\n  const profile = options.redactionProfile ?? \"local\";\n  const section = options.section ?? \"all\";\n  const safeEvents = redactTraceEventsForReport(events, {\n    redactionProfile: profile,\n  });\n  const outcomes = summarizeObservedOutcomes(\n    extractOutcomesFromTraceEvents(safeEvents),\n  );\n  const observationsMarkdown = renderObservedOutcomesMarkdown(outcomes);\n  const observationsHtml = renderObservedOutcomesHtml(outcomes);\n\n  if (section === \"observations\") {\n    if (options.format === \"markdown\") {\n      return {\n        format: \"markdown\",\n        content: `## Observed outcomes\\n\\n${observationsMarkdown}\\n`,\n        contentType: \"text/markdown\",\n        fileExtension: \".md\",\n      };\n    }\n    return {\n      format: \"html\",\n      content: `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><title>Observed outcomes</title><style>${REPORT_HTML_CSS}</style></head><body><h1>Observed outcomes</h1>${observationsHtml}</body></html>`,\n      contentType: \"text/html\",\n      fileExtension: \".html\",\n    };\n  }\n\n  const whatSummary = buildRunWhatSummary(safeEvents);\n  const whatText = renderRunWhat(whatSummary, {\n    correlation: options.correlation !== false,\n  });\n  const timelineText = renderTimeline(buildRunTimeline(safeEvents));\n  const tree = resolveTree(safeEvents, profile);\n\n  const exportOpts = {\n    includeMetadata: false,\n    includeAttributes: options.includeAttributes === true,\n    includeErrors: options.includeErrors !== false,\n    redacted: true,\n    redactionProfile: profile,\n    maxAttributeLength: 500,\n  };\n\n  if (options.format === \"markdown\") {\n    const treeMd = exportMarkdown(tree, exportOpts);\n    const tail = tailMarkdownSection(treeMd.content, \"Execution tree\");\n    const title = escapeMarkdown(whatSummary.name ?? whatSummary.runId);\n    const lines = [\n      `# AgentInspect Report: ${title}`,\n      \"\",\n      \"Generated locally by AgentInspect. Review for sensitive data before sharing.\",\n      \"\",\n      \"## What happened\",\n      \"\",\n      \"```text\",\n      whatText,\n      \"```\",\n      \"\",\n      \"## Timeline\",\n      \"\",\n      \"```text\",\n      timelineText,\n      \"```\",\n      \"\",\n      \"## Observed outcomes\",\n      \"\",\n      observationsMarkdown,\n      \"\",\n    ];\n    if (tail) {\n      lines.push(tail, \"\");\n    } else {\n      lines.push(\"## Execution tree\", \"\", \"(no steps)\", \"\");\n    }\n\n    return {\n      format: \"markdown\",\n      content: lines.join(\"\\n\"),\n      contentType: \"text/markdown\",\n      fileExtension: \".md\",\n    };\n  }\n\n  const treeHtml = exportHtml(tree, exportOpts);\n  const title = escapeHtml(whatSummary.name ?? whatSummary.runId);\n  const treeSection = extractHtmlFragment(\n    treeHtml.content,\n    '<section class=\"tree\">',\n    \"</section>\",\n  );\n  // The exporter emits Errors before Attributes, so the errors fragment must\n  // stop at the attributes heading when both sections are present; ending at\n  // <footer> would swallow the attributes section and duplicate it below.\n  const errorsSectionEnd = treeHtml.content.includes(\n    \"<h2>Attributes (bounded)</h2>\",\n  )\n    ? \"<h2>Attributes (bounded)</h2>\"\n    : \"<footer>\";\n  const errorsSection = treeHtml.content.includes(\"<h2>Errors</h2>\")\n    ? extractHtmlFragment(treeHtml.content, \"<h2>Errors</h2>\", errorsSectionEnd)\n    : \"\";\n  const attrsSection = treeHtml.content.includes(\"<h2>Attributes (bounded)</h2>\")\n    ? extractHtmlFragment(\n        treeHtml.content,\n        \"<h2>Attributes (bounded)</h2>\",\n        \"<footer>\",\n      )\n    : \"\";\n\n  const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>AgentInspect Report: ${title}</title>\n<style>${REPORT_HTML_CSS}</style>\n</head>\n<body>\n<header><h1>AgentInspect Report: ${title}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect. Review for sensitive data before sharing.</p>\n<section class=\"what\"><h2>What happened</h2><pre>${escapeHtml(whatText)}</pre></section>\n<section class=\"timeline\"><h2>Timeline</h2><pre>${escapeHtml(timelineText)}</pre></section>\n<section class=\"observations\"><h2>Observed outcomes</h2>${observationsHtml}</section>\n${treeSection || \"<section class=\\\"tree\\\"><h2>Execution tree</h2><p>No steps recorded.</p></section>\"}\n${errorsSection}\n${attrsSection}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n  return {\n    format: \"html\",\n    content: html,\n    contentType: \"text/html\",\n    fileExtension: \".html\",\n  };\n}\n"]}