{"version":3,"sources":["../src/safety/sensitive-key.ts","../src/logs/redactor.ts","../src/safety/credential-value-patterns.ts","../src/redaction-profiles.ts","../src/types/inspect-event.ts","../src/types/persisted-inspect-event.ts","../src/trace-filesystem.ts","../src/utils.ts","../src/trace-event-safety.ts","../src/writers/index.ts"],"names":["crypto","isRecord","mkdir","appendFile","path","os","out","serializeEvent"],"mappings":"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","file":"writers.cjs","sourcesContent":["/**\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","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","export type AttributionConfidence =\n  | \"explicit\"\n  | \"correlated\"\n  | \"heuristic\"\n  | \"unknown\";\n\n/** Canonical attribution-confidence literals (weakest → strongest order is rank-based). */\nexport const ATTRIBUTION_CONFIDENCES: readonly AttributionConfidence[] = [\n  \"unknown\",\n  \"heuristic\",\n  \"correlated\",\n  \"explicit\",\n] as const;\n\nexport function isAttributionConfidence(value: unknown): value is AttributionConfidence {\n  return (\n    typeof value === \"string\" &&\n    (ATTRIBUTION_CONFIDENCES as readonly string[]).includes(value)\n  );\n}\n\n/** Rank for threshold comparisons; unknown is weakest (0). */\nexport const ATTRIBUTION_CONFIDENCE_RANK: Record<AttributionConfidence, number> = {\n  unknown: 0,\n  heuristic: 1,\n  correlated: 2,\n  explicit: 3,\n};\n\nexport type InspectKind =\n  | \"RUN\"\n  | \"AGENT\"\n  | \"LLM\"\n  | \"TOOL\"\n  | \"CHAIN\"\n  | \"RETRIEVER\"\n  | \"DECISION\"\n  | \"RESULT\"\n  | \"ERROR\"\n  | \"LOGIC\"\n  | \"LOG\"\n  | \"OUTCOME\";\n\nexport interface EventSource {\n  type: \"manual\" | \"json-log\" | \"log4js\" | \"pino\" | \"winston\" | \"adapter\";\n  file?: string;\n  line?: number;\n}\n\nexport interface InspectEvent {\n  eventId: string;\n  runId: string;\n  parentId?: string;\n  name: string;\n  kind: InspectKind;\n  timestamp: number;\n  status?: \"running\" | \"ok\" | \"error\";\n  durationMs?: number;\n  attributes?: Record<string, unknown>;\n  confidence: AttributionConfidence;\n  source: EventSource;\n}\n\nexport interface InspectNode {\n  event: InspectEvent;\n  children: InspectNode[];\n  depth: number;\n}\n\n/** Bounded parent/cycle summary for visibility-first tree building (6.14.2+). */\nexport interface RelationshipSummary {\n  rootCount: number;\n  selfParentCount: number;\n  cycleCount: number;\n  unresolvedParentCount: number;\n  normalizedEdgeCount: number;\n}\n\nexport interface InspectRunTree {\n  runId: string;\n  name?: string;\n  status?: \"running\" | \"ok\" | \"error\";\n  startedAt?: number;\n  endedAt?: number;\n  durationMs?: number;\n  children: InspectNode[];\n  metadata: {\n    totalEvents: number;\n    confidenceBreakdown: Record<AttributionConfidence, number>;\n    kinds: Record<InspectKind, number>;\n    relationshipSummary?: RelationshipSummary;\n  };\n}\n\n","import type { AttributionConfidence, InspectKind } from \"./inspect-event.js\";\nimport { isAttributionConfidence } from \"./inspect-event.js\";\n\nexport type PersistedSchemaVersion = \"0.2\" | \"1.0\";\n\nexport type PersistedEventSourceType =\n  | \"manual\"\n  | \"json-log\"\n  | \"log4js\"\n  | \"adapter\"\n  | \"ai-sdk\"\n  | \"otel\";\n\nexport interface PersistedEventSource {\n  type: PersistedEventSourceType;\n  name?: string;\n  version?: string;\n}\n\nexport type PersistedEventStatus = \"running\" | \"ok\" | \"error\" | \"unknown\";\n\nexport interface PersistedInspectError {\n  name?: string;\n  message: string;\n  code?: string;\n}\n\nexport interface PersistedTokenUsage {\n  input?: number;\n  output?: number;\n  total?: number;\n  /** Cache-read tokens (informational; never added to total). */\n  cached?: number;\n  /** Cache-write / cache-creation tokens (informational; never added to total). */\n  cacheWrite?: number;\n  /** Reasoning / thinking tokens when providers report them separately. */\n  reasoning?: number;\n}\n\nexport interface PersistedTraceContext {\n  traceId?: string;\n  spanId?: string;\n  parentSpanId?: string;\n}\n\nexport interface PersistedInspectEventBase {\n  eventId: string;\n  runId: string;\n  parentId?: string;\n  kind: InspectKind;\n  name: string;\n  status?: PersistedEventStatus;\n  timestamp: string;\n  startedAt?: string;\n  endedAt?: string;\n  durationMs?: number;\n  confidence: AttributionConfidence;\n  source: PersistedEventSource;\n  attributes?: Record<string, unknown>;\n  inputSummary?: unknown;\n  outputSummary?: unknown;\n  error?: PersistedInspectError;\n  tokenUsage?: PersistedTokenUsage;\n  trace?: PersistedTraceContext;\n}\n\nexport interface PersistedInspectEventV02 extends PersistedInspectEventBase {\n  schemaVersion: \"0.2\";\n}\n\nexport interface PersistedInspectEventV10 extends PersistedInspectEventBase {\n  schemaVersion: \"1.0\";\n  [key: string]: unknown;\n}\n\nexport type PersistedInspectEvent =\n  | PersistedInspectEventV02\n  | PersistedInspectEventV10;\n\nconst INSPECT_KINDS: readonly InspectKind[] = [\n  \"RUN\",\n  \"AGENT\",\n  \"LLM\",\n  \"TOOL\",\n  \"CHAIN\",\n  \"RETRIEVER\",\n  \"DECISION\",\n  \"RESULT\",\n  \"ERROR\",\n  \"LOGIC\",\n  \"LOG\",\n  \"OUTCOME\",\n];\n\nconst PERSISTED_EVENT_SOURCE_TYPES: readonly PersistedEventSourceType[] = [\n  \"manual\",\n  \"json-log\",\n  \"log4js\",\n  \"adapter\",\n  \"ai-sdk\",\n  \"otel\",\n];\n\nconst PERSISTED_EVENT_STATUSES: readonly PersistedEventStatus[] = [\n  \"running\",\n  \"ok\",\n  \"error\",\n  \"unknown\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n  return typeof value === \"string\";\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n  return typeof value === \"string\" && value.length > 0;\n}\n\nfunction isOptionalString(value: unknown): boolean {\n  return value === undefined || isString(value);\n}\n\nfunction isNonNegativeNumber(value: unknown): value is number {\n  return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction isOptionalNonNegativeNumber(value: unknown): boolean {\n  return value === undefined || isNonNegativeNumber(value);\n}\n\nfunction isInspectKind(value: unknown): value is InspectKind {\n  return (\n    typeof value === \"string\" &&\n    (INSPECT_KINDS as readonly string[]).includes(value)\n  );\n}\n\nfunction isPersistedEventSourceType(\n  value: unknown,\n): value is PersistedEventSourceType {\n  return (\n    typeof value === \"string\" &&\n    (PERSISTED_EVENT_SOURCE_TYPES as readonly string[]).includes(value)\n  );\n}\n\nfunction isPersistedEventStatus(value: unknown): value is PersistedEventStatus {\n  return (\n    typeof value === \"string\" &&\n    (PERSISTED_EVENT_STATUSES as readonly string[]).includes(value)\n  );\n}\n\nfunction isPersistedEventSource(value: unknown): value is PersistedEventSource {\n  if (!isRecord(value)) return false;\n  if (!isPersistedEventSourceType(value.type)) return false;\n  if (!isOptionalString(value.name)) return false;\n  if (!isOptionalString(value.version)) return false;\n  return true;\n}\n\nfunction isPersistedInspectError(value: unknown): value is PersistedInspectError {\n  if (!isRecord(value)) return false;\n  if (!isNonEmptyString(value.message)) return false;\n  if (!isOptionalString(value.name)) return false;\n  if (!isOptionalString(value.code)) return false;\n  return true;\n}\n\nfunction isPersistedTokenUsage(value: unknown): value is PersistedTokenUsage {\n  if (!isRecord(value)) return false;\n  if (!isOptionalNonNegativeNumber(value.input)) return false;\n  if (!isOptionalNonNegativeNumber(value.output)) return false;\n  if (!isOptionalNonNegativeNumber(value.total)) return false;\n  if (!isOptionalNonNegativeNumber(value.cached)) return false;\n  if (!isOptionalNonNegativeNumber(value.cacheWrite)) return false;\n  if (!isOptionalNonNegativeNumber(value.reasoning)) return false;\n  return true;\n}\n\nfunction isPersistedTraceContext(value: unknown): value is PersistedTraceContext {\n  if (!isRecord(value)) return false;\n  if (!isOptionalString(value.traceId)) return false;\n  if (!isOptionalString(value.spanId)) return false;\n  if (!isOptionalString(value.parentSpanId)) return false;\n  return true;\n}\n\n/**\n * Runtime guard for a v0.2 or v1.0 {@link PersistedInspectEvent} JSON object.\n *\n * Timestamp fields (`timestamp`, `startedAt`, `endedAt`) are validated as\n * non-empty strings only — stricter ISO-8601 parsing may be added later.\n */\nexport function isPersistedInspectEvent(\n  value: unknown,\n): value is PersistedInspectEvent {\n  if (!isRecord(value)) return false;\n  if (value.schemaVersion !== \"0.2\" && value.schemaVersion !== \"1.0\") {\n    return false;\n  }\n\n  if (!isNonEmptyString(value.eventId)) return false;\n  if (!isNonEmptyString(value.runId)) return false;\n  if (!isInspectKind(value.kind)) return false;\n  if (!isNonEmptyString(value.name)) return false;\n  // Non-empty string required; ISO format not validated in this PR.\n  if (!isNonEmptyString(value.timestamp)) return false;\n  if (!isAttributionConfidence(value.confidence)) return false;\n  if (!isPersistedEventSource(value.source)) return false;\n\n  if (value.parentId !== undefined && !isNonEmptyString(value.parentId)) {\n    return false;\n  }\n  if (value.status !== undefined && !isPersistedEventStatus(value.status)) {\n    return false;\n  }\n  if (!isOptionalString(value.startedAt)) return false;\n  if (!isOptionalString(value.endedAt)) return false;\n  if (value.durationMs !== undefined && !isNonNegativeNumber(value.durationMs)) {\n    return false;\n  }\n  if (value.attributes !== undefined && !isRecord(value.attributes)) {\n    return false;\n  }\n  if (value.error !== undefined && !isPersistedInspectError(value.error)) {\n    return false;\n  }\n  if (value.tokenUsage !== undefined && !isPersistedTokenUsage(value.tokenUsage)) {\n    return false;\n  }\n  if (value.trace !== undefined && !isPersistedTraceContext(value.trace)) {\n    return false;\n  }\n\n  return true;\n}\n\nexport function isPersistedInspectEventV02(\n  value: unknown,\n): value is PersistedInspectEventV02 {\n  return isPersistedInspectEvent(value) && value.schemaVersion === \"0.2\";\n}\n\nexport function isPersistedInspectEventV10(\n  value: unknown,\n): value is PersistedInspectEventV10 {\n  return isPersistedInspectEvent(value) && value.schemaVersion === \"1.0\";\n}\n","import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\n\n/** POSIX mode requested for newly created built-in raw trace directories. */\nexport const TRACE_DIR_MODE = 0o700;\n\n/** POSIX mode requested for newly created built-in raw trace JSONL files. */\nexport const TRACE_FILE_MODE = 0o600;\n\n/**\n * Creates a trace directory recursively with {@link TRACE_DIR_MODE}.\n * Mode applies only to newly created path components; existing directories are not chmodded.\n */\nexport async function mkdirTraceDir(dirPath: string): Promise<void> {\n  await mkdir(dirPath, { recursive: true, mode: TRACE_DIR_MODE });\n}\n\n/**\n * Creates or truncates an empty UTF-8 trace file with {@link TRACE_FILE_MODE}.\n * Mode applies only when the file is created; existing files are not chmodded.\n */\nexport async function createEmptyTraceFile(filePath: string): Promise<void> {\n  await writeFile(filePath, \"\", { encoding: \"utf-8\", mode: TRACE_FILE_MODE });\n}\n\n/**\n * Appends UTF-8 data to a trace file, creating it with {@link TRACE_FILE_MODE} when missing.\n * Mode applies only on create; existing files are not chmodded.\n */\nexport async function appendTraceFile(filePath: string, data: string): Promise<void> {\n  await appendFile(filePath, data, { encoding: \"utf-8\", mode: TRACE_FILE_MODE });\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 { Redactor } from \"./logs/redactor.js\";\nimport { redactHighConfidenceCredentialsInString } from \"./safety/credential-value-patterns.js\";\nimport {\n  applyProfileMetadataCaps,\n  resolveRedactionProfile,\n  type ResolvedRedactionProfile,\n} from \"./redaction-profiles.js\";\nimport { serializeEvent } from \"./storage.js\";\nimport type { RedactionRule } from \"./types/log-config.js\";\nimport {\n  isPersistedInspectEvent,\n  type PersistedInspectError,\n  type PersistedInspectEvent,\n  type PersistedTokenUsage,\n  type PersistedTraceContext,\n} from \"./types/persisted-inspect-event.js\";\nimport type {\n  InspectRunOptions,\n  RedactionProfile,\n  StepMetadata,\n  TraceEvent,\n} from \"./types.js\";\n\n/** Default max length for string metadata values (non-preview keys). */\nexport const DEFAULT_MAX_METADATA_VALUE_LENGTH = 2000;\n\n/** Default max length for preview-like metadata keys (contains `preview`, case-insensitive). */\nexport const DEFAULT_MAX_PREVIEW_LENGTH = 500;\n\n/** Default max serialized JSONL line size in bytes (UTF-8). */\nexport const DEFAULT_MAX_EVENT_BYTES = 65_536;\n\n/** Resolved trace safety settings used at write time. */\nexport interface TraceSafetyOptions {\n  redactEnabled: boolean;\n  redactionRules?: RedactionRule[];\n  redactionProfile: RedactionProfile;\n  profileExtraKeys: readonly string[];\n  maxMetadataValueLength: number;\n  maxPreviewLength: number;\n  maxEventBytes: number;\n}\n\nexport type { ResolvedRedactionProfile };\nexport { resolveRedactionProfile };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nconst KNOWN_PERSISTED_EVENT_FIELDS = new Set([\n  \"schemaVersion\",\n  \"eventId\",\n  \"runId\",\n  \"kind\",\n  \"name\",\n  \"parentId\",\n  \"status\",\n  \"timestamp\",\n  \"startedAt\",\n  \"endedAt\",\n  \"durationMs\",\n  \"confidence\",\n  \"source\",\n  \"attributes\",\n  \"inputSummary\",\n  \"outputSummary\",\n  \"error\",\n  \"tokenUsage\",\n  \"trace\",\n]);\n\nfunction isSafeExtensionFieldName(key: string): boolean {\n  return key !== \"__proto__\" && key !== \"constructor\" && key !== \"prototype\";\n}\n\nfunction isPreviewKey(key: string): boolean {\n  return key.toLowerCase().includes(\"preview\");\n}\n\nfunction truncateString(value: string, maxLen: number): string {\n  if (maxLen <= 0) return \"…\";\n  if (value.length <= maxLen) return value;\n  return `${value.slice(0, maxLen)}…`;\n}\n\nfunction byteLength(text: string): number {\n  return Buffer.byteLength(text, \"utf8\");\n}\n\n/** Resolves {@link InspectRunOptions} trace safety fields with safe defaults. */\nexport function resolveTraceSafetyOptions(\n  options?: Pick<\n    InspectRunOptions,\n    | \"redact\"\n    | \"redactionProfile\"\n    | \"maxEventBytes\"\n    | \"maxMetadataValueLength\"\n    | \"maxPreviewLength\"\n  >,\n): TraceSafetyOptions {\n  const redact = options?.redact;\n  let redactEnabled = true;\n  let redactionRules: RedactionRule[] | undefined;\n\n  if (redact === false) {\n    redactEnabled = false;\n  } else if (redact === true || redact === undefined) {\n    redactEnabled = true;\n  } else if (isRecord(redact)) {\n    redactEnabled = true;\n    redactionRules = redact.rules;\n  }\n\n  const profile = options?.redactionProfile ?? \"local\";\n  const resolvedProfile = resolveRedactionProfile(profile);\n\n  const userMaxMetadata =\n    typeof options?.maxMetadataValueLength === \"number\" &&\n    Number.isFinite(options.maxMetadataValueLength) &&\n    options.maxMetadataValueLength >= 0\n      ? Math.floor(options.maxMetadataValueLength)\n      : undefined;\n  const userMaxPreview =\n    typeof options?.maxPreviewLength === \"number\" &&\n    Number.isFinite(options.maxPreviewLength) &&\n    options.maxPreviewLength >= 0\n      ? Math.floor(options.maxPreviewLength)\n      : undefined;\n\n  let maxMetadataValueLength = userMaxMetadata ?? DEFAULT_MAX_METADATA_VALUE_LENGTH;\n  let maxPreviewLength = userMaxPreview ?? DEFAULT_MAX_PREVIEW_LENGTH;\n\n  if (redactEnabled && profile !== \"local\") {\n    const capped = applyProfileMetadataCaps(\n      maxMetadataValueLength,\n      maxPreviewLength,\n      resolvedProfile,\n    );\n    maxMetadataValueLength = capped.maxMetadataValueLength;\n    maxPreviewLength = capped.maxPreviewLength;\n  }\n\n  return {\n    redactEnabled,\n    redactionRules,\n    redactionProfile: profile,\n    profileExtraKeys: redactEnabled ? resolvedProfile.extraKeys : [],\n    maxMetadataValueLength,\n    maxPreviewLength,\n    maxEventBytes:\n      typeof options?.maxEventBytes === \"number\" &&\n      Number.isFinite(options.maxEventBytes) &&\n      options.maxEventBytes > 0\n        ? Math.floor(options.maxEventBytes)\n        : DEFAULT_MAX_EVENT_BYTES,\n  };\n}\n\nfunction boundMetadataValue(\n  key: string,\n  value: unknown,\n  opts: TraceSafetyOptions,\n  seen: WeakSet<object>,\n  depth: number,\n): unknown {\n  if (depth > 32) return \"[MaxDepth]\";\n\n  if (typeof value === \"bigint\") {\n    return `${value.toString()}n`;\n  }\n  if (typeof value === \"function\") {\n    return \"[Function]\";\n  }\n  if (typeof value === \"symbol\") {\n    return \"[Symbol]\";\n  }\n  if (typeof value === \"number\" && !Number.isFinite(value)) {\n    return String(value);\n  }\n  if (value === undefined) {\n    return null;\n  }\n\n  if (value === null || typeof value !== \"object\") {\n    if (typeof value === \"string\") {\n      const max = isPreviewKey(key) ? opts.maxPreviewLength : opts.maxMetadataValueLength;\n      return truncateString(value, max);\n    }\n    return value;\n  }\n\n  if (seen.has(value)) return \"[Circular]\";\n  seen.add(value);\n\n  if (Array.isArray(value)) {\n    const maxItems = 50;\n    const out = value\n      .slice(0, maxItems)\n      .map((item, index) =>\n        boundMetadataValue(String(index), item, opts, seen, depth + 1),\n      );\n    if (value.length > maxItems) {\n      out.push(`…(+${value.length - maxItems} more)`);\n    }\n    return out;\n  }\n\n  const record = value as Record<string, unknown>;\n  const out: Record<string, unknown> = {};\n  try {\n    for (const [k, v] of Object.entries(record)) {\n      out[k] = boundMetadataValue(k, v, opts, seen, depth + 1);\n    }\n  } catch {\n    return { truncated: true, reason: \"metadataEnumerationFailed\" };\n  }\n  return out;\n}\n\nfunction redactMetadata(\n  metadata: Record<string, unknown>,\n  opts: TraceSafetyOptions,\n): Record<string, unknown> {\n  if (!opts.redactEnabled) return { ...metadata };\n  const redactor = new Redactor({\n    rules: opts.redactionRules,\n    extraKeys: opts.profileExtraKeys,\n  });\n  return redactor.redactRecord(metadata);\n}\n\n/** Redacts (when enabled) and truncates metadata values for disk persistence. */\nexport function prepareMetadataForDisk(\n  metadata: Record<string, unknown> | StepMetadata,\n  opts: TraceSafetyOptions,\n): Record<string, unknown> {\n  try {\n    const preBounded = boundMetadataValue(\n      \"metadata\",\n      metadata,\n      opts,\n      new WeakSet<object>(),\n      0,\n    );\n    const redacted = redactMetadata(\n      isRecord(preBounded) ? preBounded : {},\n      opts,\n    );\n    const bounded = boundMetadataValue(\n      \"metadata\",\n      redacted,\n      opts,\n      new WeakSet<object>(),\n      0,\n    );\n    return isRecord(bounded) ? bounded : {};\n  } catch {\n    return { truncated: true, reason: \"metadataPreparationFailed\" };\n  }\n}\n\nfunction truncateErrorStack(\n  event: TraceEvent,\n  maxLen: number,\n): TraceEvent {\n  if (event.event !== \"run_completed\" && event.event !== \"step_completed\") {\n    return event;\n  }\n  if (!event.error?.stack || typeof event.error.stack !== \"string\") {\n    return event;\n  }\n  return {\n    ...event,\n    error: {\n      ...event.error,\n      stack: truncateString(event.error.stack, maxLen),\n    },\n  };\n}\n\nfunction replaceMetadataWithTruncationMarker(\n  event: TraceEvent,\n  originalApproxBytes: number,\n): TraceEvent {\n  const marker = {\n    truncated: true,\n    reason: \"maxEventBytes\",\n    originalApproxBytes,\n  };\n  if (event.event === \"run_started\") {\n    return { ...event, metadata: marker };\n  }\n  if (event.event === \"step_started\") {\n    return { ...event, metadata: marker };\n  }\n  return event;\n}\n\nfunction shrinkMetadataLimits(\n  opts: TraceSafetyOptions,\n  factor: number,\n): TraceSafetyOptions {\n  return {\n    ...opts,\n    maxMetadataValueLength: Math.max(32, Math.floor(opts.maxMetadataValueLength * factor)),\n    maxPreviewLength: Math.max(16, Math.floor(opts.maxPreviewLength * factor)),\n  };\n}\n\nfunction applyMetadataToEvent(\n  event: TraceEvent,\n  metadata: Record<string, unknown>,\n): TraceEvent {\n  if (event.event === \"run_started\") {\n    return { ...event, metadata };\n  }\n  if (event.event === \"step_started\") {\n    return { ...event, metadata: metadata as StepMetadata };\n  }\n  return event;\n}\n\nfunction eventHasMetadata(event: TraceEvent): boolean {\n  return (\n    (event.event === \"run_started\" || event.event === \"step_started\") &&\n    event.metadata !== undefined\n  );\n}\n\nfunction getEventMetadata(event: TraceEvent): Record<string, unknown> | undefined {\n  if (event.event === \"run_started\" || event.event === \"step_started\") {\n    return event.metadata as Record<string, unknown> | undefined;\n  }\n  return undefined;\n}\n\n/**\n * Applies redaction, metadata truncation, and final serialized size bounds.\n * Never throws; returns a schema-valid event or a minimally truncated variant.\n */\nfunction prepareTraceEventErrorForDisk(\n  event: TraceEvent,\n  opts: TraceSafetyOptions,\n): TraceEvent {\n  if (\n    (event.event !== \"run_completed\" && event.event !== \"step_completed\") ||\n    !event.error\n  ) {\n    return event;\n  }\n  if (!opts.redactEnabled) return event;\n\n  const redactor = new Redactor({\n    rules: opts.redactionRules,\n    extraKeys: opts.profileExtraKeys,\n  });\n  const nextError = { ...event.error };\n  let changed = false;\n\n  if (typeof nextError.message === \"string\") {\n    const keyRedacted = redactor.redactValue(\"message\", nextError.message);\n    const message =\n      typeof keyRedacted === \"string\"\n        ? redactHighConfidenceCredentialsInString(keyRedacted)\n        : \"[REDACTED]\";\n    if (message !== nextError.message) {\n      nextError.message = message.length > 0 ? message : \"Unknown error\";\n      changed = true;\n    }\n  }\n\n  // Stack frames often echo error.message; scrub credential-bearing stacks too.\n  if (typeof nextError.stack === \"string\") {\n    const scrubbedStack = redactHighConfidenceCredentialsInString(nextError.stack);\n    if (scrubbedStack !== nextError.stack) {\n      nextError.stack = scrubbedStack;\n      changed = true;\n    }\n  }\n\n  if (!changed) return event;\n  return { ...event, error: nextError };\n}\n\nexport function prepareTraceEventForDisk(\n  event: TraceEvent,\n  opts: TraceSafetyOptions,\n): TraceEvent {\n  try {\n    let working: TraceEvent = prepareTraceEventErrorForDisk({ ...event }, opts);\n\n    const rawMetadata = getEventMetadata(working);\n    if (rawMetadata !== undefined) {\n      const safe = prepareMetadataForDisk(rawMetadata, opts);\n      working = applyMetadataToEvent(working, safe);\n    }\n\n    let serialized = serializeEvent(working);\n    if (serialized === \"\") {\n      return working;\n    }\n\n    let bytes = byteLength(serialized);\n    if (bytes <= opts.maxEventBytes) {\n      return working;\n    }\n\n    if (rawMetadata !== undefined) {\n      for (const factor of [0.5, 0.25, 0.1]) {\n        const tighter = shrinkMetadataLimits(opts, factor);\n        const shrunk = prepareMetadataForDisk(rawMetadata, tighter);\n        working = applyMetadataToEvent(working, shrunk);\n        serialized = serializeEvent(working);\n        if (serialized !== \"\" && byteLength(serialized) <= opts.maxEventBytes) {\n          return working;\n        }\n      }\n\n      working = replaceMetadataWithTruncationMarker(working, bytes);\n      serialized = serializeEvent(working);\n      if (serialized !== \"\" && byteLength(serialized) <= opts.maxEventBytes) {\n        return working;\n      }\n    }\n\n    working = truncateErrorStack(working, Math.min(opts.maxMetadataValueLength, 500));\n    serialized = serializeEvent(working);\n    if (serialized !== \"\" && byteLength(serialized) <= opts.maxEventBytes) {\n      return working;\n    }\n\n    if (eventHasMetadata(working)) {\n      working = replaceMetadataWithTruncationMarker(working, bytes);\n      serialized = serializeEvent(working);\n      if (serialized !== \"\" && byteLength(serialized) <= opts.maxEventBytes) {\n        return working;\n      }\n\n      if (working.event === \"run_started\") {\n        const { metadata: _meta, ...rest } = working;\n        working = rest;\n      } else if (working.event === \"step_started\") {\n        const { metadata: _meta, ...rest } = working;\n        working = rest;\n      }\n    }\n\n    return working;\n  } catch {\n    if (event.event === \"run_started\" || event.event === \"step_started\") {\n      return applyMetadataToEvent(event, {\n        truncated: true,\n        reason: \"prepareTraceEventFailed\",\n      });\n    }\n    return event;\n  }\n}\n\nfunction safeGet(record: Record<string, unknown>, key: string): unknown {\n  try {\n    return record[key];\n  } catch {\n    return undefined;\n  }\n}\n\nfunction optionalBoundedString(\n  value: unknown,\n  _key: string,\n  opts: TraceSafetyOptions,\n): string | undefined {\n  if (typeof value !== \"string\") return undefined;\n  return truncateString(value, opts.maxMetadataValueLength);\n}\n\nfunction requiredBoundedString(\n  value: unknown,\n  key: string,\n  opts: TraceSafetyOptions,\n): string | undefined {\n  const out = optionalBoundedString(value, key, opts);\n  return out && out.length > 0 ? out : undefined;\n}\n\nfunction preparePersistedSummaryForDisk(\n  key: \"input\" | \"output\",\n  value: unknown,\n  opts: TraceSafetyOptions,\n): unknown {\n  try {\n    const redactor = new Redactor({\n      rules: opts.redactionRules,\n      extraKeys: opts.profileExtraKeys,\n    });\n    const redacted = opts.redactEnabled ? redactor.redactValue(key, value) : value;\n    return boundMetadataValue(key, redacted, opts, new WeakSet<object>(), 0);\n  } catch {\n    return { truncated: true, reason: \"summaryPreparationFailed\" };\n  }\n}\n\nfunction preparePersistedErrorForDisk(\n  value: unknown,\n  opts: TraceSafetyOptions,\n): PersistedInspectError | undefined {\n  if (!isRecord(value)) return undefined;\n\n  try {\n    const redactor = new Redactor({\n      rules: opts.redactionRules,\n      extraKeys: opts.profileExtraKeys,\n    });\n    const rawMessage = safeGet(value, \"message\");\n    // Key-based redactValue(\"message\", ...) does not catch free-text secrets;\n    // apply the same high-confidence value detectors as @agent-inspect/redact.\n    let messageForBound: unknown = rawMessage;\n    if (opts.redactEnabled) {\n      const keyRedacted = redactor.redactValue(\"message\", rawMessage);\n      messageForBound =\n        typeof keyRedacted === \"string\"\n          ? redactHighConfidenceCredentialsInString(keyRedacted)\n          : keyRedacted;\n    }\n    const boundedMessage = boundMetadataValue(\n      \"message\",\n      messageForBound,\n      opts,\n      new WeakSet<object>(),\n      0,\n    );\n    const message =\n      typeof boundedMessage === \"string\" && boundedMessage.length > 0\n        ? boundedMessage\n        : \"Unknown error\";\n\n    const out: PersistedInspectError = { message };\n    const name = optionalBoundedString(safeGet(value, \"name\"), \"name\", opts);\n    const code = optionalBoundedString(safeGet(value, \"code\"), \"code\", opts);\n    if (name !== undefined) out.name = name;\n    if (code !== undefined) out.code = code;\n    return out;\n  } catch {\n    return { message: \"Error preparation failed\" };\n  }\n}\n\nfunction prepareTokenUsage(value: unknown): PersistedTokenUsage | undefined {\n  if (!isRecord(value)) return undefined;\n  const out: PersistedTokenUsage = {};\n  for (const key of [\n    \"input\",\n    \"output\",\n    \"total\",\n    \"cached\",\n    \"cacheWrite\",\n    \"reasoning\",\n  ] as const) {\n    const item = safeGet(value, key);\n    if (typeof item === \"number\" && Number.isFinite(item) && item >= 0) {\n      out[key] = item;\n    }\n  }\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction prepareTraceContext(\n  value: unknown,\n  opts: TraceSafetyOptions,\n): PersistedTraceContext | undefined {\n  if (!isRecord(value)) return undefined;\n  const out: PersistedTraceContext = {};\n  const traceId = optionalBoundedString(safeGet(value, \"traceId\"), \"traceId\", opts);\n  const spanId = optionalBoundedString(safeGet(value, \"spanId\"), \"spanId\", opts);\n  const parentSpanId = optionalBoundedString(\n    safeGet(value, \"parentSpanId\"),\n    \"parentSpanId\",\n    opts,\n  );\n  if (traceId !== undefined) out.traceId = traceId;\n  if (spanId !== undefined) out.spanId = spanId;\n  if (parentSpanId !== undefined) out.parentSpanId = parentSpanId;\n  return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction preparePersistedExtensionFieldForDisk(\n  key: string,\n  value: unknown,\n  opts: TraceSafetyOptions,\n): unknown {\n  if (isRecord(value)) {\n    return prepareMetadataForDisk(value, opts);\n  }\n\n  const prepared = prepareMetadataForDisk({ [key]: value }, opts);\n  return Object.prototype.hasOwnProperty.call(prepared, key)\n    ? prepared[key]\n    : undefined;\n}\n\nfunction preserveV10ExtensionFields(\n  source: Record<string, unknown>,\n  candidate: PersistedInspectEvent,\n  opts: TraceSafetyOptions,\n): void {\n  if (candidate.schemaVersion !== \"1.0\") return;\n\n  for (const [key, value] of Object.entries(source)) {\n    if (\n      KNOWN_PERSISTED_EVENT_FIELDS.has(key) ||\n      !isSafeExtensionFieldName(key)\n    ) {\n      continue;\n    }\n\n    const prepared = preparePersistedExtensionFieldForDisk(key, value, opts);\n    if (prepared !== undefined) {\n      candidate[key] = prepared;\n    }\n  }\n}\n\nfunction serializedPersistedEvent(event: PersistedInspectEvent): string | undefined {\n  try {\n    return JSON.stringify(event);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction persistedEventByteLength(event: PersistedInspectEvent): number | undefined {\n  const serialized = serializedPersistedEvent(event);\n  return serialized === undefined ? undefined : byteLength(serialized);\n}\n\nfunction minimalPersistedEvent(\n  event: PersistedInspectEvent,\n  opts: TraceSafetyOptions,\n  originalApproxBytes: number,\n): PersistedInspectEvent {\n  return {\n    schemaVersion: event.schemaVersion,\n    eventId: truncateString(event.eventId, 128),\n    runId: truncateString(event.runId, 128),\n    kind: event.kind,\n    name: truncateString(event.name, 128),\n    ...(event.status !== undefined ? { status: event.status } : {}),\n    timestamp: truncateString(event.timestamp, 128),\n    confidence: event.confidence,\n    source: {\n      type: event.source.type,\n      ...(event.source.name !== undefined\n        ? { name: truncateString(event.source.name, 128) }\n        : {}),\n      ...(event.source.version !== undefined\n        ? { version: truncateString(event.source.version, 128) }\n        : {}),\n    },\n    attributes: {\n      truncated: true,\n      reason: \"maxEventBytes\",\n      originalApproxBytes,\n      maxEventBytes: opts.maxEventBytes,\n    },\n  };\n}\n\nfunction tinyPersistedEvent(event: PersistedInspectEvent): PersistedInspectEvent {\n  return {\n    schemaVersion: event.schemaVersion,\n    eventId: truncateString(event.eventId, 32),\n    runId: truncateString(event.runId, 32),\n    kind: event.kind,\n    name: truncateString(event.name, 32),\n    timestamp: truncateString(event.timestamp, 32),\n    confidence: event.confidence,\n    source: { type: event.source.type },\n    attributes: { truncated: true, reason: \"maxEventBytes\" },\n  };\n}\n\nfunction enforcePersistedEventSize(\n  event: PersistedInspectEvent,\n  opts: TraceSafetyOptions,\n): PersistedInspectEvent | undefined {\n  const bytes = persistedEventByteLength(event);\n  if (bytes === undefined) return undefined;\n  if (bytes <= opts.maxEventBytes) return event;\n\n  const minimal = minimalPersistedEvent(event, opts, bytes);\n  const minimalBytes = persistedEventByteLength(minimal);\n  if (minimalBytes !== undefined && minimalBytes <= opts.maxEventBytes) {\n    return minimal;\n  }\n\n  const tiny = tinyPersistedEvent(event);\n  return isPersistedInspectEvent(tiny) ? tiny : undefined;\n}\n\n/**\n * Prepares persisted inspect events for built-in persistence.\n *\n * The helper is intentionally non-throwing: invalid required fields return\n * `undefined`; supported optional fields are redacted, bounded, JSON-safe, and\n * final serialized-size checked before a writer sees the event.\n */\nexport function preparePersistedInspectEventForWrite(\n  value: unknown,\n  opts: TraceSafetyOptions = resolveTraceSafetyOptions(),\n): PersistedInspectEvent | undefined {\n  try {\n    if (!isRecord(value)) return undefined;\n\n    const source = safeGet(value, \"source\");\n    if (!isRecord(source)) return undefined;\n\n    const candidate: PersistedInspectEvent = {\n      schemaVersion: safeGet(value, \"schemaVersion\") as PersistedInspectEvent[\"schemaVersion\"],\n      eventId: requiredBoundedString(safeGet(value, \"eventId\"), \"eventId\", opts) ?? \"\",\n      runId: requiredBoundedString(safeGet(value, \"runId\"), \"runId\", opts) ?? \"\",\n      kind: safeGet(value, \"kind\") as PersistedInspectEvent[\"kind\"],\n      name: requiredBoundedString(safeGet(value, \"name\"), \"name\", opts) ?? \"\",\n      timestamp: requiredBoundedString(safeGet(value, \"timestamp\"), \"timestamp\", opts) ?? \"\",\n      confidence: safeGet(value, \"confidence\") as PersistedInspectEvent[\"confidence\"],\n      source: {\n        type: safeGet(source, \"type\") as PersistedInspectEvent[\"source\"][\"type\"],\n      },\n    };\n\n    const parentId = requiredBoundedString(safeGet(value, \"parentId\"), \"parentId\", opts);\n    const status = safeGet(value, \"status\");\n    const startedAt = optionalBoundedString(safeGet(value, \"startedAt\"), \"startedAt\", opts);\n    const endedAt = optionalBoundedString(safeGet(value, \"endedAt\"), \"endedAt\", opts);\n    const durationMs = safeGet(value, \"durationMs\");\n    const sourceName = optionalBoundedString(safeGet(source, \"name\"), \"name\", opts);\n    const sourceVersion = optionalBoundedString(safeGet(source, \"version\"), \"version\", opts);\n\n    if (parentId !== undefined) candidate.parentId = parentId;\n    if (\n      status === \"running\" ||\n      status === \"ok\" ||\n      status === \"error\" ||\n      status === \"unknown\"\n    ) {\n      candidate.status = status;\n    }\n    if (startedAt !== undefined) candidate.startedAt = startedAt;\n    if (endedAt !== undefined) candidate.endedAt = endedAt;\n    if (\n      typeof durationMs === \"number\" &&\n      Number.isFinite(durationMs) &&\n      durationMs >= 0\n    ) {\n      candidate.durationMs = durationMs;\n    }\n    if (sourceName !== undefined) candidate.source.name = sourceName;\n    if (sourceVersion !== undefined) candidate.source.version = sourceVersion;\n\n    const attributes = safeGet(value, \"attributes\");\n    if (isRecord(attributes)) {\n      candidate.attributes = prepareMetadataForDisk(attributes, opts);\n    }\n\n    if (safeGet(value, \"inputSummary\") !== undefined) {\n      candidate.inputSummary = preparePersistedSummaryForDisk(\n        \"input\",\n        safeGet(value, \"inputSummary\"),\n        opts,\n      );\n    }\n    if (safeGet(value, \"outputSummary\") !== undefined) {\n      candidate.outputSummary = preparePersistedSummaryForDisk(\n        \"output\",\n        safeGet(value, \"outputSummary\"),\n        opts,\n      );\n    }\n\n    const error = preparePersistedErrorForDisk(safeGet(value, \"error\"), opts);\n    if (error !== undefined) candidate.error = error;\n\n    const tokenUsage = prepareTokenUsage(safeGet(value, \"tokenUsage\"));\n    if (tokenUsage !== undefined) candidate.tokenUsage = tokenUsage;\n\n    const trace = prepareTraceContext(safeGet(value, \"trace\"), opts);\n    if (trace !== undefined) candidate.trace = trace;\n\n    preserveV10ExtensionFields(value, candidate, opts);\n\n    if (!isPersistedInspectEvent(candidate)) return undefined;\n    return enforcePersistedEventSize(candidate, opts);\n  } catch {\n    return undefined;\n  }\n}\n","import path from \"node:path\";\n\nimport {\n  preparePersistedInspectEventForWrite,\n  resolveTraceSafetyOptions,\n} from \"../trace-event-safety.js\";\nimport { appendTraceFile, mkdirTraceDir } from \"../trace-filesystem.js\";\nimport type { PersistedInspectEvent } from \"../types/persisted-inspect-event.js\";\nimport { getTraceFilePath } from \"../utils.js\";\n\nexport interface TraceWriterStats {\n  writtenEvents: number;\n  droppedEvents: number;\n  flushCount: number;\n  lastFlushAt?: string;\n  lastError?: string;\n}\n\nexport interface TraceWriter {\n  write(event: PersistedInspectEvent): Promise<void>;\n  flush?(): Promise<void>;\n  close?(): Promise<void>;\n  getStats?(): TraceWriterStats;\n}\n\nexport interface MemoryTraceWriter extends TraceWriter {\n  getEvents(): PersistedInspectEvent[];\n  clear(): void;\n}\n\nexport interface FileTraceWriterOptions {\n  /**\n   * Directory for per-run JSONL traces. Defaults to AgentInspect's default\n   * trace directory when neither `dir` nor `filePath` is supplied.\n   */\n  dir?: string;\n  /**\n   * Explicit JSONL output path. When supplied, all accepted events are written\n   * to this file rather than deriving a per-run file from `event.runId`.\n   */\n  filePath?: string;\n}\n\nexport type BufferedFileWriterOverflowMode = \"drop-oldest\" | \"drop-newest\";\n\nexport interface BufferedFileWriterOptions extends FileTraceWriterOptions {\n  /**\n   * Maximum number of events retained before overflow policy applies.\n   * Defaults to 1000.\n   */\n  maxQueueSize?: number;\n  /**\n   * Flush delay after the first queued event. Defaults to 250ms.\n   */\n  flushIntervalMs?: number;\n  /**\n   * Maximum events appended by one filesystem batch. Defaults to 100.\n   */\n  maxBatchSize?: number;\n  /**\n   * Overflow policy when `maxQueueSize` is reached. Defaults to `drop-oldest`.\n   */\n  overflow?: BufferedFileWriterOverflowMode;\n}\n\nexport interface CompositeTraceWriterOptions {\n  writers: TraceWriter[];\n}\n\nconst DEFAULT_TRACE_SAFETY = resolveTraceSafetyOptions();\n\nfunction createInitialStats(): TraceWriterStats {\n  return {\n    writtenEvents: 0,\n    droppedEvents: 0,\n    flushCount: 0,\n  };\n}\n\nfunction markFlush(stats: TraceWriterStats): void {\n  stats.flushCount += 1;\n  stats.lastFlushAt = new Date().toISOString();\n}\n\nfunction cloneStats(stats: TraceWriterStats): TraceWriterStats {\n  return { ...stats };\n}\n\nfunction normalizeError(error: unknown): string {\n  if (error instanceof Error && error.message.trim() !== \"\") {\n    return error.message;\n  }\n  if (typeof error === \"string\" && error.trim() !== \"\") {\n    return error;\n  }\n  return \"Unknown trace writer error\";\n}\n\nfunction recordDropped(stats: TraceWriterStats, error: unknown): void {\n  stats.droppedEvents += 1;\n  stats.lastError = normalizeError(error);\n}\n\nfunction prepareWriterEvent(\n  event: PersistedInspectEvent,\n): PersistedInspectEvent | undefined {\n  return preparePersistedInspectEventForWrite(event, DEFAULT_TRACE_SAFETY);\n}\n\nfunction resolveFilePath(\n  event: PersistedInspectEvent,\n  options: FileTraceWriterOptions,\n): string {\n  if (options.filePath && options.filePath.trim() !== \"\") {\n    return path.resolve(options.filePath);\n  }\n  return getTraceFilePath(event.runId, options.dir);\n}\n\nfunction serializeEvent(event: PersistedInspectEvent): string {\n  return `${JSON.stringify(event)}\\n`;\n}\n\nasync function appendEventLine(\n  event: PersistedInspectEvent,\n  options: FileTraceWriterOptions,\n): Promise<void> {\n  const filePath = resolveFilePath(event, options);\n  await mkdirTraceDir(path.dirname(filePath));\n  await appendTraceFile(filePath, serializeEvent(event));\n}\n\nasync function appendEventBatch(\n  events: PersistedInspectEvent[],\n  options: FileTraceWriterOptions,\n): Promise<{ written: number; dropped: number; lastError?: string }> {\n  const byPath = new Map<string, string[]>();\n  let dropped = 0;\n  let lastError: string | undefined;\n\n  for (const event of events) {\n    try {\n      const filePath = resolveFilePath(event, options);\n      const line = serializeEvent(event);\n      const lines = byPath.get(filePath);\n      if (lines) {\n        lines.push(line);\n      } else {\n        byPath.set(filePath, [line]);\n      }\n    } catch (error) {\n      dropped += 1;\n      lastError = normalizeError(error);\n    }\n  }\n\n  let written = 0;\n  for (const [filePath, lines] of byPath) {\n    try {\n      await mkdirTraceDir(path.dirname(filePath));\n      await appendTraceFile(filePath, lines.join(\"\"));\n      written += lines.length;\n    } catch (error) {\n      dropped += lines.length;\n      lastError = normalizeError(error);\n    }\n  }\n\n  return lastError\n    ? { written, dropped, lastError }\n    : { written, dropped };\n}\n\nexport function memoryWriter(): MemoryTraceWriter {\n  const events: PersistedInspectEvent[] = [];\n  const stats = createInitialStats();\n\n  return {\n    async write(event) {\n      const safe = prepareWriterEvent(event);\n      if (safe === undefined) {\n        recordDropped(stats, \"Invalid persisted inspect event\");\n        return;\n      }\n      events.push(safe);\n      stats.writtenEvents += 1;\n    },\n    async flush() {\n      markFlush(stats);\n    },\n    async close() {\n      // Memory writer has no external resources. Keep close idempotent.\n    },\n    getStats() {\n      return cloneStats(stats);\n    },\n    getEvents() {\n      return events.map((event) => structuredClone(event));\n    },\n    clear() {\n      events.length = 0;\n    },\n  };\n}\n\nexport function nullWriter(): TraceWriter {\n  const stats = createInitialStats();\n\n  return {\n    async write() {\n      stats.writtenEvents += 1;\n    },\n    async flush() {\n      markFlush(stats);\n    },\n    async close() {\n      // Null writer has no external resources. Keep close idempotent.\n    },\n    getStats() {\n      return cloneStats(stats);\n    },\n  };\n}\n\nexport function fileWriter(options: FileTraceWriterOptions = {}): TraceWriter {\n  const stats = createInitialStats();\n  let closed = false;\n  let queue: Promise<void> = Promise.resolve();\n\n  const enqueue = (event: PersistedInspectEvent): Promise<void> => {\n    const operation = queue.then(async () => {\n      if (closed) {\n        recordDropped(stats, \"Trace writer is closed\");\n        return;\n      }\n      try {\n        await appendEventLine(event, options);\n        stats.writtenEvents += 1;\n      } catch (error) {\n        recordDropped(stats, error);\n      }\n    });\n\n    queue = operation.catch(() => {\n      // Individual operations are already isolated above. This catch keeps the\n      // internal queue alive even if an unexpected implementation error slips\n      // through.\n    });\n\n    return operation.catch(() => {\n      // Instrumentation failures must not replace application errors.\n    });\n  };\n\n  return {\n    write(event) {\n      const safe = prepareWriterEvent(event);\n      if (safe === undefined) {\n        recordDropped(stats, \"Invalid persisted inspect event\");\n        return Promise.resolve();\n      }\n      return enqueue(safe);\n    },\n    async flush() {\n      await queue;\n      markFlush(stats);\n    },\n    async close() {\n      if (closed) return;\n      await queue;\n      closed = true;\n    },\n    getStats() {\n      return cloneStats(stats);\n    },\n  };\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n  if (value === undefined) return fallback;\n  if (!Number.isFinite(value) || value <= 0) return fallback;\n  return Math.floor(value);\n}\n\nfunction nonNegativeInteger(value: number | undefined, fallback: number): number {\n  if (value === undefined) return fallback;\n  if (!Number.isFinite(value) || value < 0) return fallback;\n  return Math.floor(value);\n}\n\nexport function bufferedFileWriter(\n  options: BufferedFileWriterOptions = {},\n): TraceWriter {\n  const stats = createInitialStats();\n  const maxQueueSize = positiveInteger(options.maxQueueSize, 1000);\n  const flushIntervalMs = nonNegativeInteger(options.flushIntervalMs, 250);\n  const maxBatchSize = positiveInteger(options.maxBatchSize, 100);\n  const overflow = options.overflow ?? \"drop-oldest\";\n  const pending: PersistedInspectEvent[] = [];\n  let closed = false;\n  let timer: ReturnType<typeof setTimeout> | undefined;\n  let chain: Promise<void> = Promise.resolve();\n\n  const clearTimer = (): void => {\n    if (timer !== undefined) {\n      clearTimeout(timer);\n      timer = undefined;\n    }\n  };\n\n  const scheduleFlush = (): void => {\n    if (closed || timer !== undefined || pending.length === 0) return;\n    timer = setTimeout(() => {\n      timer = undefined;\n      void drain(false);\n    }, flushIntervalMs);\n    if (\n      timer &&\n      typeof timer === \"object\" &&\n      \"unref\" in timer &&\n      typeof timer.unref === \"function\"\n    ) {\n      timer.unref();\n    }\n  };\n\n  const drainBatch = async (drainAll: boolean): Promise<void> => {\n    clearTimer();\n    do {\n      const batch = pending.splice(0, maxBatchSize);\n      if (batch.length === 0) break;\n      const result = await appendEventBatch(batch, options);\n      stats.writtenEvents += result.written;\n      stats.droppedEvents += result.dropped;\n      if (result.lastError) {\n        stats.lastError = result.lastError;\n      }\n    } while (drainAll && pending.length > 0);\n    if (pending.length > 0) scheduleFlush();\n  };\n\n  const drain = (drainAll: boolean): Promise<void> => {\n    const operation = chain.then(() => drainBatch(drainAll));\n    chain = operation.catch(() => {\n      // Keep later flushes alive even if an unexpected implementation error\n      // escapes the batch isolation above.\n    });\n    return operation.catch(() => {\n      // Instrumentation failures must not replace application errors.\n    });\n  };\n\n  return {\n    async write(event) {\n      if (closed) {\n        recordDropped(stats, \"Trace writer is closed\");\n        return;\n      }\n\n      const safe = prepareWriterEvent(event);\n      if (safe === undefined) {\n        recordDropped(stats, \"Invalid persisted inspect event\");\n        return;\n      }\n\n      if (pending.length >= maxQueueSize) {\n        if (overflow === \"drop-newest\") {\n          recordDropped(stats, \"Trace writer queue overflow\");\n          return;\n        }\n        pending.shift();\n        recordDropped(stats, \"Trace writer queue overflow\");\n      }\n\n      try {\n        pending.push(safe);\n      } catch (error) {\n        recordDropped(stats, error);\n        return;\n      }\n\n      scheduleFlush();\n    },\n    async flush() {\n      await drain(true);\n      markFlush(stats);\n    },\n    async close() {\n      if (closed) return;\n      await drain(true);\n      closed = true;\n      clearTimer();\n    },\n    getStats() {\n      return cloneStats(stats);\n    },\n  };\n}\n\nexport function compositeWriter(\n  writersOrOptions: TraceWriter[] | CompositeTraceWriterOptions,\n): TraceWriter {\n  const stats = createInitialStats();\n  const writers = Array.isArray(writersOrOptions)\n    ? [...writersOrOptions]\n    : [...writersOrOptions.writers];\n  let closed = false;\n\n  const recordChildFailure = (error: unknown): void => {\n    stats.droppedEvents += 1;\n    stats.lastError = normalizeError(error);\n  };\n\n  return {\n    async write(event) {\n      if (closed) {\n        recordDropped(stats, \"Trace writer is closed\");\n        return;\n      }\n\n      const safe = prepareWriterEvent(event);\n      if (safe === undefined) {\n        recordDropped(stats, \"Invalid persisted inspect event\");\n        return;\n      }\n\n      const childResults = await Promise.all(\n        writers.map(async (writer) => {\n          try {\n            await writer.write(structuredClone(safe));\n            return true;\n          } catch (error) {\n            recordChildFailure(error);\n            return false;\n          }\n        }),\n      );\n\n      if (childResults.some(Boolean)) {\n        stats.writtenEvents += 1;\n      } else {\n        recordDropped(stats, \"No composite trace writer accepted the event\");\n      }\n    },\n    async flush() {\n      await Promise.all(\n        writers.map(async (writer) => {\n          try {\n            await writer.flush?.();\n          } catch (error) {\n            stats.lastError = normalizeError(error);\n          }\n        }),\n      );\n      markFlush(stats);\n    },\n    async close() {\n      if (closed) return;\n      await Promise.all(\n        writers.map(async (writer) => {\n          try {\n            await writer.close?.();\n          } catch (error) {\n            stats.lastError = normalizeError(error);\n          }\n        }),\n      );\n      closed = true;\n    },\n    getStats() {\n      return cloneStats(stats);\n    },\n  };\n}\n"]}