agent-inspect 1.4.0 → 1.6.0
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.
- package/CHANGELOG.md +63 -0
- package/README.md +34 -6
- package/docs/ADAPTERS.md +6 -0
- package/docs/API.md +132 -9
- package/docs/ARCHITECTURE.md +4 -0
- package/docs/CLI.md +98 -5
- package/docs/DIFF.md +8 -0
- package/docs/EXPORTS.md +13 -0
- package/docs/GETTING-STARTED.md +19 -1
- package/docs/KNOWN-ISSUES.md +8 -1
- package/docs/LIMITATIONS.md +13 -2
- package/docs/LOGS.md +22 -0
- package/docs/SCHEMA.md +19 -7
- package/docs/SCREENSHOTS.md +190 -9
- package/package.json +71 -1
- package/packages/cli/dist/index.cjs +7121 -3986
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +7122 -3987
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/core/dist/advanced.cjs +2258 -0
- package/packages/core/dist/advanced.cjs.map +1 -0
- package/packages/core/dist/advanced.d.cts +254 -0
- package/packages/core/dist/advanced.d.ts +254 -0
- package/packages/core/dist/advanced.mjs +11 -0
- package/packages/core/dist/advanced.mjs.map +1 -0
- package/packages/core/dist/chunk-57S5D6HR.mjs +655 -0
- package/packages/core/dist/chunk-57S5D6HR.mjs.map +1 -0
- package/packages/core/dist/chunk-6QSLZCBJ.mjs +743 -0
- package/packages/core/dist/chunk-6QSLZCBJ.mjs.map +1 -0
- package/packages/core/dist/chunk-6SZPTECC.mjs +342 -0
- package/packages/core/dist/chunk-6SZPTECC.mjs.map +1 -0
- package/packages/core/dist/chunk-74XZ6N7Q.mjs +409 -0
- package/packages/core/dist/chunk-74XZ6N7Q.mjs.map +1 -0
- package/packages/core/dist/chunk-7TGZLWEE.mjs +35 -0
- package/packages/core/dist/chunk-7TGZLWEE.mjs.map +1 -0
- package/packages/core/dist/chunk-BT7CATSD.mjs +497 -0
- package/packages/core/dist/chunk-BT7CATSD.mjs.map +1 -0
- package/packages/core/dist/chunk-E5F2LQCX.mjs +83 -0
- package/packages/core/dist/chunk-E5F2LQCX.mjs.map +1 -0
- package/packages/core/dist/chunk-EDTQHZPM.mjs +88 -0
- package/packages/core/dist/chunk-EDTQHZPM.mjs.map +1 -0
- package/packages/core/dist/chunk-HR7G62IE.mjs +785 -0
- package/packages/core/dist/chunk-HR7G62IE.mjs.map +1 -0
- package/packages/core/dist/chunk-HY7H3CQM.mjs +127 -0
- package/packages/core/dist/chunk-HY7H3CQM.mjs.map +1 -0
- package/packages/core/dist/chunk-S4YWKV4G.mjs +48 -0
- package/packages/core/dist/chunk-S4YWKV4G.mjs.map +1 -0
- package/packages/core/dist/chunk-TFLPUZ56.mjs +1571 -0
- package/packages/core/dist/chunk-TFLPUZ56.mjs.map +1 -0
- package/packages/core/dist/chunk-TZISEVLQ.mjs +390 -0
- package/packages/core/dist/chunk-TZISEVLQ.mjs.map +1 -0
- package/packages/core/dist/chunk-U2BGPESY.mjs +150 -0
- package/packages/core/dist/chunk-U2BGPESY.mjs.map +1 -0
- package/packages/core/dist/chunk-VTIB5MDK.mjs +304 -0
- package/packages/core/dist/chunk-VTIB5MDK.mjs.map +1 -0
- package/packages/core/dist/chunk-VU6O5QAH.mjs +99 -0
- package/packages/core/dist/chunk-VU6O5QAH.mjs.map +1 -0
- package/packages/core/dist/chunk-Y56BPA3B.mjs +990 -0
- package/packages/core/dist/chunk-Y56BPA3B.mjs.map +1 -0
- package/packages/core/dist/chunk-YWAOOXLR.mjs +475 -0
- package/packages/core/dist/chunk-YWAOOXLR.mjs.map +1 -0
- package/packages/core/dist/diff.cjs +993 -0
- package/packages/core/dist/diff.cjs.map +1 -0
- package/packages/core/dist/diff.d.cts +82 -0
- package/packages/core/dist/diff.d.ts +82 -0
- package/packages/core/dist/diff.mjs +5 -0
- package/packages/core/dist/diff.mjs.map +1 -0
- package/packages/core/dist/exporters.cjs +1228 -0
- package/packages/core/dist/exporters.cjs.map +1 -0
- package/packages/core/dist/exporters.d.cts +114 -0
- package/packages/core/dist/exporters.d.ts +114 -0
- package/packages/core/dist/exporters.mjs +6 -0
- package/packages/core/dist/exporters.mjs.map +1 -0
- package/packages/core/dist/index.cjs +5542 -2218
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +113 -908
- package/packages/core/dist/index.d.ts +113 -908
- package/packages/core/dist/index.mjs +1048 -5403
- package/packages/core/dist/index.mjs.map +1 -1
- package/packages/core/dist/inspect-event-Des4JDHo.d.cts +41 -0
- package/packages/core/dist/inspect-event-Des4JDHo.d.ts +41 -0
- package/packages/core/dist/log-config-BnH8Ykcb.d.cts +33 -0
- package/packages/core/dist/log-config-C1GcJPIM.d.ts +33 -0
- package/packages/core/dist/logs.cjs +1007 -0
- package/packages/core/dist/logs.cjs.map +1 -0
- package/packages/core/dist/logs.d.cts +138 -0
- package/packages/core/dist/logs.d.ts +138 -0
- package/packages/core/dist/logs.mjs +6 -0
- package/packages/core/dist/logs.mjs.map +1 -0
- package/packages/core/dist/persisted-inspect-event-0kaRADsp.d.cts +56 -0
- package/packages/core/dist/persisted-inspect-event-DiFto0K2.d.ts +56 -0
- package/packages/core/dist/persisted.cjs +1055 -0
- package/packages/core/dist/persisted.cjs.map +1 -0
- package/packages/core/dist/persisted.d.cts +111 -0
- package/packages/core/dist/persisted.d.ts +111 -0
- package/packages/core/dist/persisted.mjs +7 -0
- package/packages/core/dist/persisted.mjs.map +1 -0
- package/packages/core/dist/readers.cjs +2590 -0
- package/packages/core/dist/readers.cjs.map +1 -0
- package/packages/core/dist/readers.d.cts +80 -0
- package/packages/core/dist/readers.d.ts +80 -0
- package/packages/core/dist/readers.mjs +9 -0
- package/packages/core/dist/readers.mjs.map +1 -0
- package/packages/core/dist/types-DB8jB6Jg.d.cts +232 -0
- package/packages/core/dist/types-tSix7tfv.d.ts +232 -0
- package/packages/core/dist/writers.cjs +997 -0
- package/packages/core/dist/writers.cjs.map +1 -0
- package/packages/core/dist/writers.d.cts +62 -0
- package/packages/core/dist/writers.d.ts +62 -0
- package/packages/core/dist/writers.mjs +9 -0
- package/packages/core/dist/writers.mjs.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logs/redactor.ts","../src/redaction-profiles.ts","../src/types/persisted-inspect-event.ts","../src/utils.ts","../src/trace-event-safety.ts","../src/writers/index.ts"],"names":["crypto","isRecord","path","os","out","serializeEvent","mkdir","appendFile"],"mappings":"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","file":"writers.cjs","sourcesContent":["import crypto from \"node:crypto\";\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\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 } 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 redactValue(key: string, value: unknown): unknown {\n const k = toKey(key);\n const rule = this.#rules.find((r) => r.key === k);\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","import type { RedactionProfile } from \"./types.js\";\n\n/** Extra keys redacted under the `share` profile (in addition to {@link DEFAULT_REDACT_KEYS}). */\nexport const SHARE_PROFILE_EXTRA_KEYS = [\n \"userEmail\",\n \"customerEmail\",\n \"phone\",\n \"phoneNumber\",\n \"address\",\n \"ip\",\n \"ipAddress\",\n \"sessionId\",\n \"requestId\",\n \"correlationId\",\n \"decisionId\",\n \"groupId\",\n \"customerId\",\n \"userId\",\n \"accountId\",\n \"tenantId\",\n \"orgId\",\n \"organizationId\",\n \"traceId\",\n \"spanId\",\n \"parentSpanId\",\n] as const;\n\n/** Extra keys redacted under the `strict` profile (in addition to share keys). */\nexport const STRICT_PROFILE_EXTRA_KEYS = [\n \"prompt\",\n \"completion\",\n \"input\",\n \"output\",\n \"inputPreview\",\n \"outputPreview\",\n \"message\",\n \"messages\",\n \"transcript\",\n \"context\",\n \"document\",\n \"documents\",\n \"chunk\",\n \"chunks\",\n \"retrieval\",\n \"query\",\n] as const;\n\nexport interface ResolvedRedactionProfile {\n profile: RedactionProfile;\n extraKeys: readonly string[];\n maxMetadataValueLengthCap?: number;\n maxPreviewLengthCap?: number;\n}\n\n/** Resolves named profile behavior (keys + metadata string caps). */\nexport function resolveRedactionProfile(\n profile: RedactionProfile = \"local\",\n): ResolvedRedactionProfile {\n switch (profile) {\n case \"local\":\n return { profile: \"local\", extraKeys: [] };\n case \"share\":\n return {\n profile: \"share\",\n extraKeys: SHARE_PROFILE_EXTRA_KEYS,\n maxMetadataValueLengthCap: 500,\n maxPreviewLengthCap: 200,\n };\n case \"strict\":\n return {\n profile: \"strict\",\n extraKeys: [...SHARE_PROFILE_EXTRA_KEYS, ...STRICT_PROFILE_EXTRA_KEYS],\n maxMetadataValueLengthCap: 200,\n maxPreviewLengthCap: 80,\n };\n default:\n return { profile: \"local\", extraKeys: [] };\n }\n}\n\nfunction isPreviewKey(key: string): boolean {\n return key.toLowerCase().includes(\"preview\");\n}\n\n/**\n * Applies profile metadata string caps. User-provided lower limits are preserved.\n */\nexport function applyProfileMetadataCaps(\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n resolved: ResolvedRedactionProfile,\n): { maxMetadataValueLength: number; maxPreviewLength: number } {\n let meta = maxMetadataValueLength;\n let preview = maxPreviewLength;\n\n if (resolved.maxMetadataValueLengthCap !== undefined) {\n meta = Math.min(meta, resolved.maxMetadataValueLengthCap);\n }\n if (resolved.maxPreviewLengthCap !== undefined) {\n preview = Math.min(preview, resolved.maxPreviewLengthCap);\n }\n\n return { maxMetadataValueLength: meta, maxPreviewLength: preview };\n}\n\nexport function truncateStringForProfile(\n value: string,\n key: string,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n): string {\n const max = isPreviewKey(key) ? maxPreviewLength : maxMetadataValueLength;\n if (max <= 0) return \"…\";\n if (value.length <= max) return value;\n return `${value.slice(0, max)}…`;\n}\n","import type { AttributionConfidence, InspectKind } from \"./inspect-event.js\";\n\nexport type PersistedSchemaVersion = \"0.2\";\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 cached?: number;\n}\n\nexport interface PersistedTraceContext {\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n}\n\nexport interface PersistedInspectEvent {\n schemaVersion: PersistedSchemaVersion;\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\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];\n\nconst ATTRIBUTION_CONFIDENCES: readonly AttributionConfidence[] = [\n \"explicit\",\n \"correlated\",\n \"heuristic\",\n \"unknown\",\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 isAttributionConfidence(value: unknown): value is AttributionConfidence {\n return (\n typeof value === \"string\" &&\n (ATTRIBUTION_CONFIDENCES 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 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 {@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\") return false;\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","import { mkdir } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\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 mkdir(primary, { recursive: true });\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 mkdir(fallback, { recursive: true });\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 {\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\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 */\nexport function prepareTraceEventForDisk(\n event: TraceEvent,\n opts: TraceSafetyOptions,\n): TraceEvent {\n try {\n let working: TraceEvent = { ...event };\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 const redactedMessage = opts.redactEnabled\n ? redactor.redactValue(\"message\", rawMessage)\n : rawMessage;\n const boundedMessage = boundMetadataValue(\n \"message\",\n redactedMessage,\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 [\"input\", \"output\", \"total\", \"cached\"] 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 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: \"0.2\",\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: \"0.2\",\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 v0.2 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 if (!isPersistedInspectEvent(candidate)) return undefined;\n return enforcePersistedEventSize(candidate, opts);\n } catch {\n return undefined;\n }\n}\n","import { appendFile, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport {\n preparePersistedInspectEventForWrite,\n resolveTraceSafetyOptions,\n} from \"../trace-event-safety.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 mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(filePath, serializeEvent(event), \"utf-8\");\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 mkdir(path.dirname(filePath), { recursive: true });\n await appendFile(filePath, lines.join(\"\"), \"utf-8\");\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"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { P as PersistedInspectEvent } from './persisted-inspect-event-0kaRADsp.cjs';
|
|
2
|
+
import './inspect-event-Des4JDHo.cjs';
|
|
3
|
+
|
|
4
|
+
interface TraceWriterStats {
|
|
5
|
+
writtenEvents: number;
|
|
6
|
+
droppedEvents: number;
|
|
7
|
+
flushCount: number;
|
|
8
|
+
lastFlushAt?: string;
|
|
9
|
+
lastError?: string;
|
|
10
|
+
}
|
|
11
|
+
interface TraceWriter {
|
|
12
|
+
write(event: PersistedInspectEvent): Promise<void>;
|
|
13
|
+
flush?(): Promise<void>;
|
|
14
|
+
close?(): Promise<void>;
|
|
15
|
+
getStats?(): TraceWriterStats;
|
|
16
|
+
}
|
|
17
|
+
interface MemoryTraceWriter extends TraceWriter {
|
|
18
|
+
getEvents(): PersistedInspectEvent[];
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
interface FileTraceWriterOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Directory for per-run JSONL traces. Defaults to AgentInspect's default
|
|
24
|
+
* trace directory when neither `dir` nor `filePath` is supplied.
|
|
25
|
+
*/
|
|
26
|
+
dir?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Explicit JSONL output path. When supplied, all accepted events are written
|
|
29
|
+
* to this file rather than deriving a per-run file from `event.runId`.
|
|
30
|
+
*/
|
|
31
|
+
filePath?: string;
|
|
32
|
+
}
|
|
33
|
+
type BufferedFileWriterOverflowMode = "drop-oldest" | "drop-newest";
|
|
34
|
+
interface BufferedFileWriterOptions extends FileTraceWriterOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Maximum number of events retained before overflow policy applies.
|
|
37
|
+
* Defaults to 1000.
|
|
38
|
+
*/
|
|
39
|
+
maxQueueSize?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Flush delay after the first queued event. Defaults to 250ms.
|
|
42
|
+
*/
|
|
43
|
+
flushIntervalMs?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum events appended by one filesystem batch. Defaults to 100.
|
|
46
|
+
*/
|
|
47
|
+
maxBatchSize?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Overflow policy when `maxQueueSize` is reached. Defaults to `drop-oldest`.
|
|
50
|
+
*/
|
|
51
|
+
overflow?: BufferedFileWriterOverflowMode;
|
|
52
|
+
}
|
|
53
|
+
interface CompositeTraceWriterOptions {
|
|
54
|
+
writers: TraceWriter[];
|
|
55
|
+
}
|
|
56
|
+
declare function memoryWriter(): MemoryTraceWriter;
|
|
57
|
+
declare function nullWriter(): TraceWriter;
|
|
58
|
+
declare function fileWriter(options?: FileTraceWriterOptions): TraceWriter;
|
|
59
|
+
declare function bufferedFileWriter(options?: BufferedFileWriterOptions): TraceWriter;
|
|
60
|
+
declare function compositeWriter(writersOrOptions: TraceWriter[] | CompositeTraceWriterOptions): TraceWriter;
|
|
61
|
+
|
|
62
|
+
export { type BufferedFileWriterOptions, type BufferedFileWriterOverflowMode, type CompositeTraceWriterOptions, type FileTraceWriterOptions, type MemoryTraceWriter, type TraceWriter, type TraceWriterStats, bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { P as PersistedInspectEvent } from './persisted-inspect-event-DiFto0K2.js';
|
|
2
|
+
import './inspect-event-Des4JDHo.js';
|
|
3
|
+
|
|
4
|
+
interface TraceWriterStats {
|
|
5
|
+
writtenEvents: number;
|
|
6
|
+
droppedEvents: number;
|
|
7
|
+
flushCount: number;
|
|
8
|
+
lastFlushAt?: string;
|
|
9
|
+
lastError?: string;
|
|
10
|
+
}
|
|
11
|
+
interface TraceWriter {
|
|
12
|
+
write(event: PersistedInspectEvent): Promise<void>;
|
|
13
|
+
flush?(): Promise<void>;
|
|
14
|
+
close?(): Promise<void>;
|
|
15
|
+
getStats?(): TraceWriterStats;
|
|
16
|
+
}
|
|
17
|
+
interface MemoryTraceWriter extends TraceWriter {
|
|
18
|
+
getEvents(): PersistedInspectEvent[];
|
|
19
|
+
clear(): void;
|
|
20
|
+
}
|
|
21
|
+
interface FileTraceWriterOptions {
|
|
22
|
+
/**
|
|
23
|
+
* Directory for per-run JSONL traces. Defaults to AgentInspect's default
|
|
24
|
+
* trace directory when neither `dir` nor `filePath` is supplied.
|
|
25
|
+
*/
|
|
26
|
+
dir?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Explicit JSONL output path. When supplied, all accepted events are written
|
|
29
|
+
* to this file rather than deriving a per-run file from `event.runId`.
|
|
30
|
+
*/
|
|
31
|
+
filePath?: string;
|
|
32
|
+
}
|
|
33
|
+
type BufferedFileWriterOverflowMode = "drop-oldest" | "drop-newest";
|
|
34
|
+
interface BufferedFileWriterOptions extends FileTraceWriterOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Maximum number of events retained before overflow policy applies.
|
|
37
|
+
* Defaults to 1000.
|
|
38
|
+
*/
|
|
39
|
+
maxQueueSize?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Flush delay after the first queued event. Defaults to 250ms.
|
|
42
|
+
*/
|
|
43
|
+
flushIntervalMs?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Maximum events appended by one filesystem batch. Defaults to 100.
|
|
46
|
+
*/
|
|
47
|
+
maxBatchSize?: number;
|
|
48
|
+
/**
|
|
49
|
+
* Overflow policy when `maxQueueSize` is reached. Defaults to `drop-oldest`.
|
|
50
|
+
*/
|
|
51
|
+
overflow?: BufferedFileWriterOverflowMode;
|
|
52
|
+
}
|
|
53
|
+
interface CompositeTraceWriterOptions {
|
|
54
|
+
writers: TraceWriter[];
|
|
55
|
+
}
|
|
56
|
+
declare function memoryWriter(): MemoryTraceWriter;
|
|
57
|
+
declare function nullWriter(): TraceWriter;
|
|
58
|
+
declare function fileWriter(options?: FileTraceWriterOptions): TraceWriter;
|
|
59
|
+
declare function bufferedFileWriter(options?: BufferedFileWriterOptions): TraceWriter;
|
|
60
|
+
declare function compositeWriter(writersOrOptions: TraceWriter[] | CompositeTraceWriterOptions): TraceWriter;
|
|
61
|
+
|
|
62
|
+
export { type BufferedFileWriterOptions, type BufferedFileWriterOverflowMode, type CompositeTraceWriterOptions, type FileTraceWriterOptions, type MemoryTraceWriter, type TraceWriter, type TraceWriterStats, bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { bufferedFileWriter, compositeWriter, fileWriter, memoryWriter, nullWriter } from './chunk-6SZPTECC.mjs';
|
|
2
|
+
import './chunk-57S5D6HR.mjs';
|
|
3
|
+
import './chunk-EDTQHZPM.mjs';
|
|
4
|
+
import './chunk-VU6O5QAH.mjs';
|
|
5
|
+
import './chunk-VTIB5MDK.mjs';
|
|
6
|
+
import './chunk-74XZ6N7Q.mjs';
|
|
7
|
+
import './chunk-7TGZLWEE.mjs';
|
|
8
|
+
//# sourceMappingURL=writers.mjs.map
|
|
9
|
+
//# sourceMappingURL=writers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"writers.mjs"}
|