agent-inspect 6.31.4 → 6.31.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/docs/SAFE-TRACE-SHARING.md +1 -1
  4. package/package.json +1 -1
  5. package/packages/cli/dist/{chunk-LKEPABND.mjs → chunk-YXDNWHNJ.mjs} +5 -8
  6. package/packages/cli/dist/chunk-YXDNWHNJ.mjs.map +1 -0
  7. package/packages/cli/dist/index.cjs +120 -21
  8. package/packages/cli/dist/index.cjs.map +1 -1
  9. package/packages/cli/dist/index.mjs +120 -18
  10. package/packages/cli/dist/index.mjs.map +1 -1
  11. package/packages/cli/dist/{src-4WYF5RFI.mjs → src-H22KNWAZ.mjs} +3 -3
  12. package/packages/cli/dist/{src-4WYF5RFI.mjs.map → src-H22KNWAZ.mjs.map} +1 -1
  13. package/packages/core/dist/advanced.cjs +1 -1
  14. package/packages/core/dist/advanced.cjs.map +1 -1
  15. package/packages/core/dist/advanced.mjs +9 -9
  16. package/packages/core/dist/checks.cjs +2 -5
  17. package/packages/core/dist/checks.cjs.map +1 -1
  18. package/packages/core/dist/checks.mjs +3 -3
  19. package/packages/core/dist/{chunk-2KJR6X4V.mjs → chunk-DK3OW6UI.mjs} +3 -3
  20. package/packages/core/dist/chunk-DK3OW6UI.mjs.map +1 -0
  21. package/packages/core/dist/{chunk-NY4ILMXK.mjs → chunk-EXGQLMVB.mjs} +3 -3
  22. package/packages/core/dist/{chunk-NY4ILMXK.mjs.map → chunk-EXGQLMVB.mjs.map} +1 -1
  23. package/packages/core/dist/{chunk-PKDBFBJ7.mjs → chunk-LXYPM2ZO.mjs} +5 -8
  24. package/packages/core/dist/{chunk-PKDBFBJ7.mjs.map → chunk-LXYPM2ZO.mjs.map} +1 -1
  25. package/packages/core/dist/{chunk-INE5IWLN.mjs → chunk-N5PZAI6Q.mjs} +3 -3
  26. package/packages/core/dist/{chunk-INE5IWLN.mjs.map → chunk-N5PZAI6Q.mjs.map} +1 -1
  27. package/packages/core/dist/{chunk-MTMTXTJL.mjs → chunk-VQUB3WRI.mjs} +4 -4
  28. package/packages/core/dist/{chunk-MTMTXTJL.mjs.map → chunk-VQUB3WRI.mjs.map} +1 -1
  29. package/packages/core/dist/exporters.cjs +58 -7
  30. package/packages/core/dist/exporters.cjs.map +1 -1
  31. package/packages/core/dist/exporters.mjs +60 -9
  32. package/packages/core/dist/exporters.mjs.map +1 -1
  33. package/packages/core/dist/index.cjs +1 -1
  34. package/packages/core/dist/index.cjs.map +1 -1
  35. package/packages/core/dist/index.mjs +4 -4
  36. package/packages/core/dist/writers.cjs +1 -1
  37. package/packages/core/dist/writers.cjs.map +1 -1
  38. package/packages/core/dist/writers.mjs +1 -1
  39. package/packages/cli/dist/chunk-LKEPABND.mjs.map +0 -1
  40. package/packages/core/dist/chunk-2KJR6X4V.mjs.map +0 -1
@@ -1,8 +1,8 @@
1
- import { getCurrentContext, getCurrentDepth, getParentStepId, getTraceSafetyFromContext, runWithStepContext, printStepStart, printStepComplete, printError, printFailedAt, inspectRun } from './chunk-MTMTXTJL.mjs';
2
- export { createInspector, getCurrentCorrelationMetadata, inspectRun, maybeInspectRun } from './chunk-MTMTXTJL.mjs';
3
- import { normalizeObserveOutcomeInput, prepareOutcomeEventForDisk } from './chunk-INE5IWLN.mjs';
1
+ import { getCurrentContext, getCurrentDepth, getParentStepId, getTraceSafetyFromContext, runWithStepContext, printStepStart, printStepComplete, printError, printFailedAt, inspectRun } from './chunk-VQUB3WRI.mjs';
2
+ export { createInspector, getCurrentCorrelationMetadata, inspectRun, maybeInspectRun } from './chunk-VQUB3WRI.mjs';
3
+ import { normalizeObserveOutcomeInput, prepareOutcomeEventForDisk } from './chunk-N5PZAI6Q.mjs';
4
4
  import './chunk-BT7CATSD.mjs';
5
- import { prepareTraceEventForDisk, writeTraceEvent } from './chunk-2KJR6X4V.mjs';
5
+ import { prepareTraceEventForDisk, writeTraceEvent } from './chunk-DK3OW6UI.mjs';
6
6
  import './chunk-VLVCLAPB.mjs';
7
7
  import './chunk-S4YWKV4G.mjs';
8
8
  import { warn, createStepId, formatError, truncateName } from './chunk-7DHSWDKB.mjs';
@@ -184,7 +184,7 @@ var Redactor = class {
184
184
  };
185
185
 
186
186
  // packages/core/src/safety/credential-value-patterns.ts
187
- var KEY_VALUE_SECRET_PATTERN = /\b(?:api[_-]?key|internal[_-]?token|access[_-]?token|auth[_-]?token|password|secret|token)=(?!\[(?:REDACTED(?::[^\]]*)?|HASH:[0-9a-f]{8})\](?![^\s"'\\&#?;/]))([^\s"'\\]{8,})/i;
187
+ var KEY_VALUE_SECRET_PATTERN = /\b(?:api[_-]?key|internal[_-]?token|access[_-]?token|auth[_-]?token|password|secret|token)=(?!\[(?:REDACTED(?::[^\]]*)?|HASH:[0-9a-f]{8})\](?![^\s"'\\&#?]))([^\s"'\\]{8,})/i;
188
188
  var HIGH_CONFIDENCE_CREDENTIAL_PATTERNS = [
189
189
  /^(?:basic|bearer|digest|apikey)\s+[a-z0-9._~+/=-]+$/i,
190
190
  /\bbearer\s+[a-z0-9._~+/=-]{12,}\b/i,
@@ -1 +1 @@
1
- {"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"]}
1
+ {"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"]}
@@ -1,4 +1,4 @@
1
- import { resolveTraceSafetyOptions, preparePersistedInspectEventForWrite } from './chunk-2KJR6X4V.mjs';
1
+ import { resolveTraceSafetyOptions, preparePersistedInspectEventForWrite } from './chunk-DK3OW6UI.mjs';
2
2
  import './chunk-VLVCLAPB.mjs';
3
3
  import { mkdirTraceDir, appendTraceFile, getTraceFilePath } from './chunk-7DHSWDKB.mjs';
4
4
  import './chunk-EE5Z2GQ3.mjs';