agent-inspect 4.2.0 → 4.4.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 +12 -0
- package/docs/API.md +3 -0
- package/docs/CLI.md +36 -0
- package/docs/SCHEMA.md +27 -1
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-5VSPJEZ7.mjs → chunk-ORHDQUT6.mjs} +385 -10
- package/packages/cli/dist/chunk-ORHDQUT6.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +2548 -1567
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +2028 -1495
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-VQT7QLGV.mjs → src-FJOHPC4X.mjs} +3 -3
- package/packages/cli/dist/{src-VQT7QLGV.mjs.map → src-FJOHPC4X.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +397 -12
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +105 -9
- package/packages/core/dist/advanced.d.ts +105 -9
- package/packages/core/dist/advanced.mjs +219 -17
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/core/dist/checks.cjs +117 -18
- package/packages/core/dist/checks.cjs.map +1 -1
- package/packages/core/dist/checks.d.cts +11 -3
- package/packages/core/dist/checks.d.ts +11 -3
- package/packages/core/dist/checks.mjs +42 -1
- package/packages/core/dist/checks.mjs.map +1 -1
- package/packages/core/dist/{chunk-2ZXEMWGK.mjs → chunk-3USJVBLA.mjs} +3 -3
- package/packages/core/dist/{chunk-2ZXEMWGK.mjs.map → chunk-3USJVBLA.mjs.map} +1 -1
- package/packages/core/dist/{chunk-HY7H3CQM.mjs → chunk-CAWPF22J.mjs} +4 -3
- package/packages/core/dist/chunk-CAWPF22J.mjs.map +1 -0
- package/packages/core/dist/{chunk-XUNJMAPD.mjs → chunk-KNYL56KZ.mjs} +38 -3
- package/packages/core/dist/chunk-KNYL56KZ.mjs.map +1 -0
- package/packages/core/dist/{chunk-IZBJAZGF.mjs → chunk-P366CCL2.mjs} +34 -3
- package/packages/core/dist/chunk-P366CCL2.mjs.map +1 -0
- package/packages/core/dist/{chunk-4JVGFNQH.mjs → chunk-ULCGIRTC.mjs} +95 -8
- package/packages/core/dist/chunk-ULCGIRTC.mjs.map +1 -0
- package/packages/core/dist/chunk-VFO76UH3.mjs +228 -0
- package/packages/core/dist/chunk-VFO76UH3.mjs.map +1 -0
- package/packages/core/dist/{chunk-NQZPZ2FN.mjs → chunk-WRE4CNPF.mjs} +6 -3
- package/packages/core/dist/chunk-WRE4CNPF.mjs.map +1 -0
- package/packages/core/dist/{chunk-A4V2H3YU.mjs → chunk-ZWA5RWMV.mjs} +40 -4
- package/packages/core/dist/chunk-ZWA5RWMV.mjs.map +1 -0
- package/packages/core/dist/{context-DjY-jvQk.d.cts → context-BbfkMYjz.d.cts} +5 -3
- package/packages/core/dist/{context-BDZmi53V.d.ts → context-Cp8NRbBX.d.ts} +5 -3
- package/packages/core/dist/diff.cjs.map +1 -1
- package/packages/core/dist/diff.d.cts +3 -3
- package/packages/core/dist/diff.d.ts +3 -3
- package/packages/core/dist/diff.mjs +1 -1
- package/packages/core/dist/exporters.cjs +137 -1
- package/packages/core/dist/exporters.cjs.map +1 -1
- package/packages/core/dist/exporters.d.cts +6 -3
- package/packages/core/dist/exporters.d.ts +6 -3
- package/packages/core/dist/exporters.mjs +71 -6
- package/packages/core/dist/exporters.mjs.map +1 -1
- package/packages/core/dist/index.cjs +181 -6
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +14 -7
- package/packages/core/dist/index.d.ts +14 -7
- package/packages/core/dist/index.mjs +51 -7
- package/packages/core/dist/index.mjs.map +1 -1
- package/packages/core/dist/{inspect-event-CYAV7Hxm.d.cts → inspect-event-IqwOHbGo.d.cts} +1 -1
- package/packages/core/dist/{inspect-event-CYAV7Hxm.d.ts → inspect-event-IqwOHbGo.d.ts} +1 -1
- package/packages/core/dist/{log-config-BNQ9UTmP.d.cts → log-config-CW8w5YQ9.d.cts} +1 -1
- package/packages/core/dist/{log-config-D3Yp1SZN.d.ts → log-config-SRA4xTp8.d.ts} +1 -1
- package/packages/core/dist/logs.d.cts +3 -3
- package/packages/core/dist/logs.d.ts +3 -3
- package/packages/core/dist/{persisted-inspect-event-BLvb0jSX.d.ts → persisted-inspect-event-DruwqARZ.d.ts} +1 -1
- package/packages/core/dist/{persisted-inspect-event-D5SjBz9b.d.cts → persisted-inspect-event-Gd-W8vB7.d.cts} +1 -1
- package/packages/core/dist/persisted.cjs +67 -1
- package/packages/core/dist/persisted.cjs.map +1 -1
- package/packages/core/dist/persisted.d.cts +5 -5
- package/packages/core/dist/persisted.d.ts +5 -5
- package/packages/core/dist/persisted.mjs +3 -3
- package/packages/core/dist/readers.cjs +72 -3
- package/packages/core/dist/readers.cjs.map +1 -1
- package/packages/core/dist/readers.d.cts +2 -2
- package/packages/core/dist/readers.d.ts +2 -2
- package/packages/core/dist/readers.mjs +5 -5
- package/packages/core/dist/readers.mjs.map +1 -1
- package/packages/core/dist/{types-CQun9LW6.d.ts → types-B1X87dUW.d.cts} +16 -2
- package/packages/core/dist/{types-C-llnPH0.d.cts → types-BVkjSd0q.d.ts} +16 -2
- package/packages/core/dist/types-CvsKGweN.d.cts +12 -0
- package/packages/core/dist/types-CvsKGweN.d.ts +12 -0
- package/packages/core/dist/writers.cjs +2 -1
- package/packages/core/dist/writers.cjs.map +1 -1
- package/packages/core/dist/writers.d.cts +2 -2
- package/packages/core/dist/writers.d.ts +2 -2
- package/packages/core/dist/writers.mjs +3 -4
- package/packages/core/dist/writers.mjs.map +1 -1
- package/packages/cli/dist/chunk-5VSPJEZ7.mjs.map +0 -1
- package/packages/core/dist/chunk-4JVGFNQH.mjs.map +0 -1
- package/packages/core/dist/chunk-A4V2H3YU.mjs.map +0 -1
- package/packages/core/dist/chunk-EDTQHZPM.mjs +0 -88
- package/packages/core/dist/chunk-EDTQHZPM.mjs.map +0 -1
- package/packages/core/dist/chunk-HY7H3CQM.mjs.map +0 -1
- package/packages/core/dist/chunk-IZBJAZGF.mjs.map +0 -1
- package/packages/core/dist/chunk-NQZPZ2FN.mjs.map +0 -1
- package/packages/core/dist/chunk-XUNJMAPD.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/exporters/types.ts","../src/logs/redactor.ts","../src/redaction-profiles.ts","../src/exporters/redact-export.ts","../src/exporters/helpers.ts","../src/exporters/html-exporter.ts","../src/exporters/markdown-exporter.ts","../src/exporters/openinference-exporter.ts","../src/exporters/otlp-json-exporter.ts","../src/exporters/validation.ts","../src/exporters/manual-trace-adapter.ts","../src/exporters/index.ts","../src/utils/duration.ts","../src/utils.ts","../src/timeline.ts","../src/trace-metadata.ts","../src/what.ts","../src/report.ts"],"names":["crypto","isRecord","hexFrom","path","os","formatDuration","pickCorrelation","title"],"mappings":"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","file":"exporters.cjs","sourcesContent":["/**\n * v0.7 local export formats. No sinks — string output only.\n */\n\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\nimport type { RedactionProfile } from \"../types.js\";\n\nexport type ExportFormat = \"markdown\" | \"html\" | \"openinference\" | \"otlp-json\";\n\nexport interface ExportOptions {\n format: ExportFormat;\n includeMetadata?: boolean;\n includeAttributes?: boolean;\n includeErrors?: boolean;\n pretty?: boolean;\n redacted?: boolean;\n maxAttributeLength?: number;\n /**\n * Redaction preset for exported copies. Default `local`.\n * `share` and `strict` apply stronger key-based redaction before rendering.\n */\n redactionProfile?: RedactionProfile;\n}\n\nexport interface ExportResult {\n format: ExportFormat;\n content: string;\n contentType: string;\n fileExtension: string;\n warnings: string[];\n}\n\nexport interface ExportValidationResult {\n ok: boolean;\n format: ExportFormat;\n errors: string[];\n warnings: string[];\n}\n\nexport interface TraceExporter {\n name: string;\n format: ExportFormat;\n export(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult;\n validate?(content: string): ExportValidationResult;\n}\n\n/** Library version string embedded in JSON exports (human-readable, not semver guarantee for formats). */\nexport const EXPORT_PAYLOAD_VERSION = \"0.1.2\";\n","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 { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport { Redactor } from \"../logs/redactor.js\";\nimport {\n applyProfileMetadataCaps,\n resolveRedactionProfile,\n truncateStringForProfile,\n} from \"../redaction-profiles.js\";\nimport type { ErrorInfo, RedactionProfile, TraceEvent } from \"../types.js\";\n\nexport interface RedactRunTreeForExportOptions {\n redactionProfile?: RedactionProfile;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepClone(item)) as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = deepClone(v);\n }\n return out as T;\n}\n\nfunction boundAttributeValues(\n record: Record<string, unknown>,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n seen: WeakSet<object>,\n depth: number,\n): Record<string, unknown> {\n if (depth > 32) {\n return { truncated: true, reason: \"maxDepth\" };\n }\n\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n out[key] = boundValue(value, key, maxMetadataValueLength, maxPreviewLength, seen, depth);\n }\n return out;\n}\n\nfunction boundValue(\n value: unknown,\n key: string,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n seen: WeakSet<object>,\n depth: number,\n): unknown {\n if (value === null || typeof value !== \"object\") {\n if (typeof value === \"string\") {\n return truncateStringForProfile(\n value,\n key,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n }\n return value;\n }\n\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value\n .slice(0, 50)\n .map((item, index) =>\n boundValue(\n item,\n String(index),\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n depth + 1,\n ),\n );\n }\n\n return boundAttributeValues(\n value as Record<string, unknown>,\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n depth + 1,\n );\n}\n\nfunction redactEventAttributes(\n attrs: Record<string, unknown> | undefined,\n redactor: Redactor,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n): Record<string, unknown> | undefined {\n if (!attrs || Object.keys(attrs).length === 0) {\n return attrs;\n }\n\n const redacted = redactor.redactRecord(attrs);\n const seen = new WeakSet<object>();\n const bounded = boundAttributeValues(\n redacted,\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n 0,\n );\n\n const err = bounded.error;\n if (isRecord(err) && typeof err.message === \"string\") {\n bounded.error = {\n ...err,\n message: truncateStringForProfile(\n err.message,\n \"message\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(typeof err.stack === \"string\"\n ? {\n stack: truncateStringForProfile(\n err.stack,\n \"stack\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n }\n\n return bounded;\n}\n\nfunction redactErrorInfo(\n error: ErrorInfo | undefined,\n redactor: Redactor,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n): ErrorInfo | undefined {\n if (error === undefined) return undefined;\n\n const record = redactEventAttributes(\n { error },\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n const redacted = record?.error;\n if (!isRecord(redacted) || typeof redacted.message !== \"string\") {\n return undefined;\n }\n\n return {\n message: redacted.message,\n ...(typeof redacted.stack === \"string\" ? { stack: redacted.stack } : {}),\n };\n}\n\n/**\n * Returns structured trace-event copies that are safe to use across every report section.\n * Profile redaction and bounds are applied before any human-readable rendering.\n */\nexport function redactTraceEventsForReport(\n events: readonly TraceEvent[],\n options?: RedactRunTreeForExportOptions,\n): TraceEvent[] {\n const profile = options?.redactionProfile ?? \"local\";\n if (profile === \"local\") {\n return deepClone(events) as TraceEvent[];\n }\n\n const resolved = resolveRedactionProfile(profile);\n const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n 2000,\n 500,\n resolved,\n );\n const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n return events.map((event): TraceEvent => {\n switch (event.event) {\n case \"run_started\":\n return {\n ...event,\n name: truncateStringForProfile(\n event.name,\n \"name\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(event.metadata !== undefined\n ? {\n metadata: redactEventAttributes(\n event.metadata,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n case \"step_started\":\n return {\n ...event,\n name: truncateStringForProfile(\n event.name,\n \"name\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(event.metadata !== undefined\n ? {\n metadata: redactEventAttributes(\n event.metadata,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n case \"run_completed\":\n case \"step_completed\":\n return {\n ...event,\n ...(event.error !== undefined\n ? {\n error: redactErrorInfo(\n event.error,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n }\n });\n}\n\n/**\n * Returns a deep copy of `tree` with profile-based redaction applied to event attributes.\n * Does not mutate the input tree.\n */\nexport function redactRunTreeForExport(\n tree: InspectRunTree,\n options?: RedactRunTreeForExportOptions,\n): InspectRunTree {\n const profile = options?.redactionProfile ?? \"local\";\n if (profile === \"local\") {\n return deepClone(tree);\n }\n\n const resolved = resolveRedactionProfile(profile);\n const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n 2000,\n 500,\n resolved,\n );\n const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n const clone = deepClone(tree);\n\n function walk(nodes: InspectNode[]): void {\n for (const node of nodes) {\n if (node.event.attributes !== undefined) {\n node.event.attributes = redactEventAttributes(\n node.event.attributes,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n }\n if (node.children.length > 0) {\n walk(node.children);\n }\n }\n }\n\n walk(clone.children);\n return clone;\n}\n","import type { InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nconst REDACT_SUBSTRINGS = [\n \"authorization\",\n \"cookie\",\n \"token\",\n \"apikey\",\n \"password\",\n \"secret\",\n \"email\",\n] as const;\n\nfunction shouldRedactKey(key: string): boolean {\n const k = key.toLowerCase();\n for (const s of REDACT_SUBSTRINGS) {\n if (k.includes(s)) return true;\n }\n return false;\n}\n\nexport function safeString(value: unknown, maxLength?: number): string {\n if (value === null || value === undefined) return \"\";\n let s: string;\n if (typeof value === \"string\") s = value;\n else if (typeof value === \"number\" || typeof value === \"boolean\") s = String(value);\n else s = stableJson(value, false);\n if (maxLength !== undefined && maxLength >= 0 && s.length > maxLength) {\n return `${s.slice(0, maxLength)}…`;\n }\n return s;\n}\n\n/** Escape markdown table pipes and normalize line breaks for safe inline text. */\nexport function escapeMarkdown(value: string): string {\n return value\n .replace(/\\|/g, \"\\\\|\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n .replace(/\\n/g, \" \");\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sortKeysDeep(input: unknown): unknown {\n if (input === null || typeof input !== \"object\") return input;\n if (Array.isArray(input)) return input.map(sortKeysDeep);\n const o = input as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(o).sort()) {\n out[k] = sortKeysDeep(o[k]);\n }\n return out;\n}\n\nexport function stableJson(value: unknown, pretty?: boolean): string {\n const sorted = sortKeysDeep(value);\n return pretty === true ? JSON.stringify(sorted, null, 2) : JSON.stringify(sorted);\n}\n\nexport function compactAttributes(\n attrs: Record<string, unknown> | undefined,\n options?: { maxLength?: number; redacted?: boolean },\n): Record<string, unknown> {\n if (attrs === undefined) return {};\n const maxLen = options?.maxLength ?? 500;\n const redacted = options?.redacted ?? true;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(attrs).sort()) {\n if (redacted && shouldRedactKey(key)) {\n out[key] = \"[REDACTED]\";\n continue;\n }\n const v = attrs[key];\n out[key] = compactValue(v, maxLen, redacted);\n }\n return out;\n}\n\nfunction compactValue(value: unknown, maxLen: number, redacted: boolean): unknown {\n if (value === null || typeof value !== \"object\") {\n return typeof value === \"string\" ? safeString(value, maxLen) : value;\n }\n if (Array.isArray(value)) {\n const arr = value.slice(0, 20).map((x) => compactValue(x, maxLen, redacted));\n if (value.length > 20) arr.push(`…(+${value.length - 20} more)`);\n return arr;\n }\n const o = value as Record<string, unknown>;\n const inner: Record<string, unknown> = {};\n for (const k of Object.keys(o)) {\n if (redacted && shouldRedactKey(k)) inner[k] = \"[REDACTED]\";\n else inner[k] = compactValue(o[k], maxLen, redacted);\n }\n return inner;\n}\n\nexport function summarizeTree(tree: InspectRunTree): Record<string, unknown> {\n const flat = flattenTree(tree);\n const errorNodes = flat.filter((n) => n.event.status === \"error\").length;\n return {\n runId: tree.runId,\n name: tree.name,\n status: tree.status,\n startedAt: tree.startedAt,\n endedAt: tree.endedAt,\n durationMs: tree.durationMs,\n stepCount: flat.length,\n errorStepCount: errorNodes,\n totalEvents: tree.metadata.totalEvents,\n confidenceBreakdown: { ...tree.metadata.confidenceBreakdown },\n kinds: { ...tree.metadata.kinds },\n };\n}\n\n/** Depth-first pre-order flatten (matches typical tree display). */\nexport function flattenTree(tree: InspectRunTree): InspectNode[] {\n const out: InspectNode[] = [];\n function walk(nodes: InspectNode[]): void {\n for (const n of nodes) {\n out.push(n);\n if (n.children.length > 0) walk(n.children);\n }\n }\n walk(tree.children);\n return out;\n}\n\nexport function zeroKinds(): Record<InspectKind, number> {\n return {\n RUN: 0,\n AGENT: 0,\n LLM: 0,\n TOOL: 0,\n CHAIN: 0,\n RETRIEVER: 0,\n DECISION: 0,\n RESULT: 0,\n ERROR: 0,\n LOGIC: 0,\n LOG: 0,\n };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n compactAttributes,\n escapeHtml,\n flattenTree,\n safeString,\n stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeHtml(nodes: InspectNode[], ulClass = \"tree\"): string {\n if (nodes.length === 0) return \"\";\n const parts: string[] = [`<ul class=\"${ulClass}\">`];\n for (const n of nodes) {\n const ev = n.event;\n const status = ev.status ?? \"?\";\n const dur =\n ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n ? `${ev.durationMs}ms`\n : \"-\";\n parts.push(\"<li>\");\n parts.push(\n `<span class=\"nm\">${escapeHtml(ev.name)}</span> <span class=\"meta\">[${escapeHtml(ev.kind)}] ${escapeHtml(status)} (${escapeHtml(dur)})</span>`,\n );\n if (n.children.length > 0) {\n parts.push(renderTreeHtml(n.children, \"tree nested\"));\n }\n parts.push(\"</li>\");\n }\n parts.push(\"</ul>\");\n return parts.join(\"\");\n}\n\nexport function exportHtml(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult {\n const warnings: string[] = [];\n const includeMetadata = options?.includeMetadata ?? true;\n const includeAttributes = options?.includeAttributes ?? false;\n const includeErrors = options?.includeErrors ?? true;\n const maxLen = options?.maxAttributeLength ?? 500;\n const redacted = options?.redacted ?? true;\n\n const titleName = escapeHtml(tree.name ?? tree.runId);\n\n const summaryRows: string[] = [];\n summaryRows.push(\n `<tr><th scope=\"row\">runId</th><td><code>${escapeHtml(tree.runId)}</code></td></tr>`,\n );\n if (tree.name !== undefined) {\n summaryRows.push(`<tr><th scope=\"row\">name</th><td>${escapeHtml(tree.name)}</td></tr>`);\n }\n summaryRows.push(\n `<tr><th scope=\"row\">status</th><td>${escapeHtml(String(tree.status ?? \"unknown\"))}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">durationMs</th><td>${tree.durationMs !== undefined ? escapeHtml(String(tree.durationMs)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">startedAt</th><td>${tree.startedAt !== undefined ? escapeHtml(String(tree.startedAt)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">endedAt</th><td>${tree.endedAt !== undefined ? escapeHtml(String(tree.endedAt)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">totalEvents</th><td>${escapeHtml(String(tree.metadata.totalEvents))}</td></tr>`,\n );\n\n let confidenceHtml = \"\";\n if (includeMetadata) {\n const cb = tree.metadata.confidenceBreakdown;\n confidenceHtml += \"<h3>Confidence breakdown</h3><table><thead><tr><th>bucket</th><th>count</th></tr></thead><tbody>\";\n for (const k of Object.keys(cb).sort()) {\n const key = k as keyof typeof cb;\n confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${cb[key]}</td></tr>`;\n }\n confidenceHtml += \"</tbody></table>\";\n\n confidenceHtml += \"<h3>Kind breakdown</h3><table><thead><tr><th>kind</th><th>count</th></tr></thead><tbody>\";\n for (const k of Object.keys(tree.metadata.kinds).sort()) {\n const key = k as keyof typeof tree.metadata.kinds;\n const c = tree.metadata.kinds[key];\n if (c > 0) confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${c}</td></tr>`;\n }\n confidenceHtml += \"</tbody></table>\";\n }\n\n const flat = flattenTree(tree);\n const errors = flat.filter((n) => n.event.status === \"error\");\n let errorsHtml = \"\";\n if (includeErrors && errors.length > 0) {\n errorsHtml += \"<h2>Errors</h2><ul>\";\n for (const n of errors) {\n const msg =\n n.event.attributes && typeof n.event.attributes.error === \"object\"\n ? safeString(\n (n.event.attributes.error as { message?: string }).message,\n maxLen,\n )\n : \"\";\n errorsHtml += `<li><strong>${escapeHtml(n.event.name)}</strong> (${escapeHtml(n.event.eventId)}): ${escapeHtml(msg || \"error\")}</li>`;\n }\n errorsHtml += \"</ul>\";\n }\n\n let attrsHtml = \"\";\n if (includeAttributes) {\n attrsHtml += \"<h2>Attributes (bounded)</h2>\";\n for (const n of flat) {\n if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n const compact = compactAttributes(n.event.attributes, {\n maxLength: maxLen,\n redacted,\n });\n attrsHtml += `<h3>${escapeHtml(n.event.name)}</h3><pre class=\"json\">${escapeHtml(stableJson(compact, true))}</pre>`;\n }\n warnings.push(\n \"Attributes may still contain sensitive data; review exports before sharing.\",\n );\n }\n\n const css = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\ntable{border-collapse:collapse;margin:0.75rem 0}\nth,td{border:1px solid #ccc;padding:0.35rem 0.6rem;text-align:left}\nth{background:#f5f5f5}\npre.json{background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.85rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>${titleName}</title>\n<style>${css}</style>\n</head>\n<body>\n<header><h1>AgentInspect Run: ${titleName}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect.</p>\n${includeMetadata ? `<section class=\"summary\"><h2>Summary</h2><table>${summaryRows.join(\"\")}</table>${confidenceHtml}</section>` : \"\"}\n<section class=\"tree\"><h2>Execution tree</h2>${tree.children.length > 0 ? renderTreeHtml(tree.children) : \"<p>No steps recorded.</p>\"}</section>\n${errorsHtml}\n${attrsHtml}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n return {\n format: \"html\",\n content: html,\n contentType: \"text/html\",\n fileExtension: \".html\",\n warnings,\n };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n compactAttributes,\n escapeMarkdown,\n flattenTree,\n safeString,\n stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeAscii(nodes: InspectNode[], indent = \"\"): string {\n const lines: string[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n const last = i === nodes.length - 1;\n const branch = last ? \"└─ \" : \"├─ \";\n const ev = n.event;\n const status = ev.status ?? \"?\";\n const dur =\n ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n ? `${ev.durationMs}ms`\n : \"-\";\n lines.push(`${indent}${branch}${escapeMarkdown(ev.name)} [${ev.kind}] ${status} (${dur})`);\n const nextIndent = indent + (last ? \" \" : \"│ \");\n if (n.children.length > 0) {\n const childStr = renderTreeAscii(n.children, nextIndent);\n if (childStr.length > 0) lines.push(childStr);\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport function exportMarkdown(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [];\n const includeMetadata = options?.includeMetadata ?? true;\n const includeAttributes = options?.includeAttributes ?? false;\n const includeErrors = options?.includeErrors ?? true;\n const maxLen = options?.maxAttributeLength ?? 500;\n const redacted = options?.redacted ?? true;\n\n const titleName = tree.name ?? tree.runId;\n const lines: string[] = [];\n lines.push(`# AgentInspect Run: ${escapeMarkdown(titleName)}`);\n lines.push(\"\");\n lines.push(\"Generated locally by AgentInspect. Review for sensitive data before sharing.\");\n lines.push(\"\");\n\n if (includeMetadata) {\n lines.push(\"## Summary\");\n lines.push(\"\");\n lines.push(`- **runId**: ${escapeMarkdown(tree.runId)}`);\n if (tree.name !== undefined) lines.push(`- **name**: ${escapeMarkdown(tree.name)}`);\n lines.push(`- **status**: ${escapeMarkdown(String(tree.status ?? \"unknown\"))}`);\n lines.push(\n `- **durationMs**: ${tree.durationMs !== undefined ? escapeMarkdown(String(tree.durationMs)) : \"-\"}`,\n );\n lines.push(\n `- **startedAt**: ${tree.startedAt !== undefined ? escapeMarkdown(String(tree.startedAt)) : \"-\"}`,\n );\n lines.push(\n `- **endedAt**: ${tree.endedAt !== undefined ? escapeMarkdown(String(tree.endedAt)) : \"-\"}`,\n );\n lines.push(`- **totalEvents**: ${tree.metadata.totalEvents}`);\n lines.push(\"\");\n lines.push(\"### Confidence breakdown\");\n lines.push(\"\");\n lines.push(\"| bucket | count |\");\n lines.push(\"| --- | --- |\");\n for (const k of Object.keys(tree.metadata.confidenceBreakdown).sort()) {\n const key = k as keyof typeof tree.metadata.confidenceBreakdown;\n lines.push(\n `| ${escapeMarkdown(key)} | ${tree.metadata.confidenceBreakdown[key]} |`,\n );\n }\n lines.push(\"\");\n lines.push(\"### Kind breakdown\");\n lines.push(\"\");\n lines.push(\"| kind | count |\");\n lines.push(\"| --- | --- |\");\n for (const k of Object.keys(tree.metadata.kinds).sort()) {\n const key = k as keyof typeof tree.metadata.kinds;\n const c = tree.metadata.kinds[key];\n if (c > 0) lines.push(`| ${escapeMarkdown(key)} | ${c} |`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Execution tree\");\n lines.push(\"\");\n lines.push(\"```text\");\n lines.push(\n tree.children.length > 0 ? renderTreeAscii(tree.children) : \"(no steps)\",\n );\n lines.push(\"```\");\n lines.push(\"\");\n\n const flat = flattenTree(tree);\n const errors = flat.filter((n) => n.event.status === \"error\");\n if (includeErrors && errors.length > 0) {\n lines.push(\"## Errors\");\n lines.push(\"\");\n for (const n of errors) {\n const msg =\n n.event.attributes && typeof n.event.attributes.error === \"object\"\n ? safeString(\n (n.event.attributes.error as { message?: string }).message,\n maxLen,\n )\n : \"\";\n lines.push(\n `- **${escapeMarkdown(n.event.name)}** (${escapeMarkdown(n.event.eventId)}): ${escapeMarkdown(msg || \"error\")}`,\n );\n }\n lines.push(\"\");\n }\n\n if (includeAttributes) {\n lines.push(\"## Attributes (bounded)\");\n lines.push(\"\");\n for (const n of flat) {\n if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n const compact = compactAttributes(n.event.attributes, {\n maxLength: maxLen,\n redacted,\n });\n lines.push(`### ${escapeMarkdown(n.event.name)}`);\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(stableJson(compact, true));\n lines.push(\"```\");\n lines.push(\"\");\n }\n warnings.push(\n \"Attributes may still contain sensitive data; review exports before sharing.\",\n );\n }\n\n return {\n format: \"markdown\",\n content: lines.join(\"\\n\"),\n contentType: \"text/markdown\",\n fileExtension: \".md\",\n warnings,\n };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\nexport interface OpenInferenceSpan {\n trace_id: string;\n span_id: string;\n parent_span_id?: string;\n name: string;\n start_time_unix_nano: number;\n end_time_unix_nano?: number;\n attributes: Record<string, unknown>;\n status?: {\n code: \"OK\" | \"ERROR\" | \"UNSET\";\n message?: string;\n };\n}\n\nexport interface OpenInferenceExport {\n exporter: \"agent-inspect\";\n format: \"openinference\";\n compatibility: \"openinference-compatible\";\n version: string;\n trace_id: string;\n spans: OpenInferenceSpan[];\n warnings: string[];\n}\n\nfunction hexFrom(seed: string, byteLen: number): string {\n return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\nfunction mapInspectKindToOI(\n kind: InspectKind,\n warnings: string[],\n): { openInferenceKind: string; ambiguousNote?: string } {\n switch (kind) {\n case \"LLM\":\n return { openInferenceKind: \"LLM\" };\n case \"TOOL\":\n return { openInferenceKind: \"TOOL\" };\n case \"CHAIN\":\n return { openInferenceKind: \"CHAIN\" };\n case \"RETRIEVER\":\n return { openInferenceKind: \"RETRIEVER\" };\n case \"AGENT\":\n return { openInferenceKind: \"AGENT\" };\n case \"DECISION\":\n warnings.push(\n `Ambiguous kind DECISION mapped to CHAIN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n );\n return { openInferenceKind: \"CHAIN\" };\n case \"RESULT\":\n warnings.push(\n `Ambiguous kind RESULT mapped to UNKNOWN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n );\n return { openInferenceKind: \"UNKNOWN\" };\n case \"ERROR\":\n warnings.push(`ERROR kind mapped to CHAIN for span compatibility.`);\n return { openInferenceKind: \"CHAIN\" };\n case \"LOG\":\n case \"LOGIC\":\n case \"RUN\":\n warnings.push(`${kind} mapped to CHAIN for span compatibility.`);\n return { openInferenceKind: \"CHAIN\" };\n default:\n warnings.push(`Unhandled InspectKind ${kind} mapped to UNKNOWN.`);\n return { openInferenceKind: \"UNKNOWN\" };\n }\n}\n\nexport function exportOpenInference(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [\n \"OpenInference-compatible JSON export is experimental until verified against specific backends.\",\n \"This file was generated locally and not sent anywhere.\",\n ];\n\n const traceId = hexFrom(`trace:${tree.runId}`, 16);\n const includeAttributes = options?.includeAttributes ?? false;\n const maxLen = options?.maxAttributeLength ?? 500;\n const pretty = options?.pretty ?? true;\n\n const spans: OpenInferenceSpan[] = [];\n\n for (const n of flattenTree(tree)) {\n const ev = n.event;\n const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n const parentSpanHex = ev.parentId\n ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n : undefined;\n const startNs = Math.round(ev.timestamp * 1e6);\n let endNs: number | undefined;\n if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n endNs = startNs + Math.round(ev.durationMs * 1e6);\n }\n\n const { openInferenceKind } = mapInspectKindToOI(ev.kind, warnings);\n\n const attrs: Record<string, unknown> = {\n \"openinference.span.kind\": openInferenceKind,\n \"agent_inspect.kind\": ev.kind,\n \"agent_inspect.confidence\": ev.confidence,\n \"agent_inspect.source.type\": ev.source.type,\n \"agent_inspect.run_id\": tree.runId,\n \"agent_inspect.event_id\": ev.eventId,\n \"agent_inspect.status\": ev.status ?? \"unset\",\n };\n if (ev.durationMs !== undefined) {\n attrs[\"agent_inspect.duration_ms\"] = ev.durationMs;\n }\n\n const meta = ev.attributes;\n if (meta?.model !== undefined && typeof meta.model === \"string\") {\n attrs[\"llm.model_name\"] = meta.model;\n }\n const tokens = meta?.tokens;\n if (tokens && typeof tokens === \"object\" && tokens !== null) {\n const inp = (tokens as { input?: number }).input;\n const outp = (tokens as { output?: number }).output;\n if (typeof inp === \"number\") attrs[\"llm.token_count.prompt\"] = inp;\n if (typeof outp === \"number\") attrs[\"llm.token_count.completion\"] = outp;\n }\n\n if (includeAttributes && meta && typeof meta === \"object\") {\n for (const [k, v] of Object.entries(meta)) {\n if (k === \"tokens\" || k === \"model\") continue;\n if (v !== undefined && v !== null && typeof v !== \"object\") {\n attrs[`agent_inspect.preview.${k}`] =\n typeof v === \"string\" ? v.slice(0, maxLen) : v;\n }\n }\n }\n\n let status: OpenInferenceSpan[\"status\"];\n if (ev.status === \"error\") {\n const msg =\n meta && typeof meta.error === \"object\" && meta.error !== null\n ? String((meta.error as { message?: string }).message ?? \"error\")\n : \"error\";\n status = { code: \"ERROR\", message: msg.slice(0, maxLen) };\n } else if (ev.status === \"ok\") {\n status = { code: \"OK\" };\n } else {\n status = { code: \"UNSET\" };\n }\n\n spans.push({\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanHex,\n name: ev.name,\n start_time_unix_nano: startNs,\n end_time_unix_nano: endNs,\n attributes: attrs,\n status,\n });\n }\n\n const payload: OpenInferenceExport = {\n exporter: \"agent-inspect\",\n format: \"openinference\",\n compatibility: \"openinference-compatible\",\n version: EXPORT_PAYLOAD_VERSION,\n trace_id: traceId,\n spans,\n warnings,\n };\n\n return {\n format: \"openinference\",\n content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n contentType: \"application/json\",\n fileExtension: \".openinference.json\",\n warnings,\n };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind } from \"../types/inspect-event.js\";\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\nfunction hexFrom(seed: string, byteLen: number): string {\n return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\nfunction stringAttr(key: string, value: string): { key: string; value: { stringValue: string } } {\n return { key, value: { stringValue: value } };\n}\n\nfunction intAttr(key: string, value: number): { key: string; value: { intValue: string } } {\n return { key, value: { intValue: String(value) } };\n}\n\ntype OtlpAttr =\n | ReturnType<typeof stringAttr>\n | ReturnType<typeof intAttr>;\n\nfunction genAiOperationName(kind: InspectKind): string | undefined {\n switch (kind) {\n case \"LLM\":\n return \"generate_content\";\n case \"TOOL\":\n return \"execute_tool\";\n case \"AGENT\":\n return \"invoke_agent\";\n default:\n return undefined;\n }\n}\n\nexport function exportOtlpJson(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [\n \"OTLP JSON export uses OTel GenAI-aligned attributes where applicable; experimental until verified against specific collectors.\",\n \"Not OTLP gRPC/protobuf — JSON mapping only. Generated locally; no network upload.\",\n ];\n\n const traceId = hexFrom(`trace:${tree.runId}`, 16);\n const includeAttributes = options?.includeAttributes ?? false;\n const maxLen = options?.maxAttributeLength ?? 500;\n const pretty = options?.pretty ?? true;\n\n const flat = flattenTree(tree);\n const spans: Record<string, unknown>[] = [];\n\n for (const n of flat) {\n const ev = n.event;\n const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n const parentSpanId = ev.parentId\n ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n : undefined;\n\n const startNs = String(Math.round(ev.timestamp * 1e6));\n let endNs: string | undefined;\n if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n endNs = String(Math.round(ev.timestamp * 1e6 + ev.durationMs * 1e6));\n }\n\n const attrs: OtlpAttr[] = [\n stringAttr(\"agent_inspect.kind\", ev.kind),\n stringAttr(\"agent_inspect.confidence\", ev.confidence),\n stringAttr(\"agent_inspect.source.type\", ev.source.type),\n stringAttr(\"agent_inspect.run_id\", tree.runId),\n stringAttr(\"agent_inspect.event_id\", ev.eventId),\n stringAttr(\"agent_inspect.status\", ev.status ?? \"unset\"),\n ];\n\n if (ev.durationMs !== undefined) {\n attrs.push(intAttr(\"agent_inspect.duration_ms\", ev.durationMs));\n }\n\n const op = genAiOperationName(ev.kind);\n if (op !== undefined) {\n attrs.push(stringAttr(\"gen_ai.operation.name\", op));\n }\n\n const meta = ev.attributes;\n if (meta?.model !== undefined && typeof meta.model === \"string\") {\n attrs.push(stringAttr(\"gen_ai.request.model\", meta.model.slice(0, maxLen)));\n }\n\n const tokens = meta?.tokens;\n if (tokens && typeof tokens === \"object\" && tokens !== null) {\n const inp = (tokens as { input?: number }).input;\n const outp = (tokens as { output?: number }).output;\n if (typeof inp === \"number\") attrs.push(intAttr(\"gen_ai.usage.input_tokens\", inp));\n if (typeof outp === \"number\") attrs.push(intAttr(\"gen_ai.usage.output_tokens\", outp));\n }\n\n if (includeAttributes && meta && typeof meta === \"object\") {\n for (const [k, v] of Object.entries(meta)) {\n if (k === \"tokens\" || k === \"model\") continue;\n if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n attrs.push(\n stringAttr(\n `agent_inspect.preview.${k}`,\n typeof v === \"string\" ? v.slice(0, maxLen) : String(v),\n ),\n );\n }\n }\n }\n\n let statusCode = \"STATUS_CODE_UNSET\";\n let statusMessage: string | undefined;\n if (ev.status === \"error\") {\n statusCode = \"STATUS_CODE_ERROR\";\n statusMessage =\n meta && typeof meta.error === \"object\" && meta.error !== null\n ? String((meta.error as { message?: string }).message ?? \"error\").slice(0, maxLen)\n : \"error\";\n } else if (ev.status === \"ok\") {\n statusCode = \"STATUS_CODE_OK\";\n }\n\n const spanJson: Record<string, unknown> = {\n traceId,\n spanId,\n name: ev.name,\n kind: \"SPAN_KIND_INTERNAL\",\n startTimeUnixNano: startNs,\n attributes: attrs,\n status: {\n code: statusCode,\n ...(statusMessage !== undefined ? { message: statusMessage } : {}),\n },\n };\n\n if (parentSpanId !== undefined) {\n spanJson.parentSpanId = parentSpanId;\n }\n if (endNs !== undefined) {\n spanJson.endTimeUnixNano = endNs;\n }\n\n spans.push(spanJson);\n }\n\n const payload = {\n resourceSpans: [\n {\n resource: {\n attributes: [stringAttr(\"service.name\", \"agent-inspect\")],\n },\n scopeSpans: [\n {\n scope: { name: \"agent-inspect\" },\n spans,\n },\n ],\n },\n ],\n };\n\n return {\n format: \"otlp-json\",\n content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n contentType: \"application/json\",\n fileExtension: \".otlp.json\",\n warnings,\n };\n}\n","import type { ExportFormat, ExportValidationResult } from \"./types.js\";\n\nconst EXPERIMENTAL =\n \"Experimental compatibility export — verify against your target tooling before relying on it.\";\n\nexport function validateExportContent(\n format: ExportFormat,\n content: string,\n): ExportValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [EXPERIMENTAL];\n\n if (format === \"markdown\") {\n if (!content.startsWith(\"# AgentInspect Run\")) {\n errors.push('Markdown export must start with \"# AgentInspect Run\"');\n }\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"html\") {\n const lower = content.toLowerCase();\n if (!lower.includes(\"<!doctype html\")) {\n errors.push(\"HTML export must include <!doctype html>\");\n }\n if (/<\\s*script\\b/i.test(content)) {\n errors.push(\"HTML export must not contain script tags\");\n }\n if (/<\\s*link\\b[^>]*href\\s*=/i.test(content)) {\n warnings.push(\"HTML export contains link tags — ensure no external stylesheets.\");\n }\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"openinference\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content) as unknown;\n } catch {\n errors.push(\"OpenInference export is not valid JSON\");\n return { ok: false, format, errors, warnings };\n }\n if (!parsed || typeof parsed !== \"object\") {\n errors.push(\"OpenInference export JSON must be an object\");\n return { ok: false, format, errors, warnings };\n }\n const o = parsed as Record<string, unknown>;\n if (o.format !== \"openinference\") {\n errors.push('OpenInference export must include format: \"openinference\"');\n }\n if (!Array.isArray(o.spans)) {\n errors.push(\"OpenInference export must include a spans array\");\n }\n warnings.push(\"OpenInference-compatible JSON is not guaranteed for every backend.\");\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"otlp-json\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content) as unknown;\n } catch {\n errors.push(\"OTLP JSON export is not valid JSON\");\n return { ok: false, format, errors, warnings };\n }\n if (!parsed || typeof parsed !== \"object\") {\n errors.push(\"OTLP JSON export must be an object\");\n return { ok: false, format, errors, warnings };\n }\n const o = parsed as Record<string, unknown>;\n if (!Array.isArray(o.resourceSpans)) {\n errors.push(\"OTLP JSON export must include resourceSpans array\");\n }\n warnings.push(\n \"OTLP JSON mapping uses OTel GenAI-aligned attributes where applicable; collectors may require transformation.\",\n );\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n errors.push(`Unsupported export format`);\n return { ok: false, format, errors, warnings };\n}\n","import type { InspectEvent, InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport type {\n StepStartedEvent,\n StepType,\n TraceEvent,\n} from \"../types.js\";\n\nimport { zeroKinds } from \"./helpers.js\";\n\nfunction stepTypeToInspectKind(t: StepType): InspectKind {\n switch (t) {\n case \"llm\":\n return \"LLM\";\n case \"tool\":\n return \"TOOL\";\n case \"decision\":\n return \"DECISION\";\n case \"run\":\n return \"CHAIN\";\n default:\n return \"LOGIC\";\n }\n}\n\nfunction mapStepStatus(\n s: \"success\" | \"error\" | undefined,\n): InspectEvent[\"status\"] | undefined {\n if (s === undefined) return \"running\";\n if (s === \"success\") return \"ok\";\n return \"error\";\n}\n\ntype StepAcc = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n timestamp: number;\n metadata?: Record<string, unknown>;\n status?: \"success\" | \"error\";\n endTime?: number;\n durationMs?: number;\n error?: { message: string; stack?: string };\n};\n\n/**\n * Build an {@link InspectRunTree} from v0.1 JSONL {@link TraceEvent} rows (manual tracing).\n * Does not mutate the input array or event objects.\n */\nexport function manualTraceEventsToRunTree(events: TraceEvent[]): InspectRunTree {\n const started = events.find((e) => e.event === \"run_started\");\n if (!started || started.event !== \"run_started\") {\n throw new Error(\"Invalid trace: missing run_started\");\n }\n\n const runId = started.runId;\n const runName = started.name;\n\n const completedAll = events.filter((e) => e.event === \"run_completed\");\n const lastCompleted = completedAll[completedAll.length - 1];\n\n let runStatus: InspectRunTree[\"status\"];\n if (lastCompleted === undefined) {\n runStatus = \"running\";\n } else if (lastCompleted.status === \"success\") {\n runStatus = \"ok\";\n } else {\n runStatus = \"error\";\n }\n\n const startedAt = started.startTime;\n const endedAt =\n lastCompleted !== undefined && runStatus !== \"running\" ? lastCompleted.endTime : undefined;\n const durationMs =\n lastCompleted !== undefined && Number.isFinite(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined;\n\n const steps = new Map<string, StepAcc>();\n\n for (const e of events) {\n if (e.event !== \"step_started\") continue;\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n startTime: s.startTime,\n timestamp: s.timestamp,\n metadata: s.metadata as Record<string, unknown> | undefined,\n });\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const acc = steps.get(e.stepId);\n if (!acc) continue;\n acc.status = e.status;\n acc.endTime = e.endTime;\n acc.durationMs = e.durationMs;\n if (e.error?.message) {\n acc.error = e.error;\n }\n }\n\n const inspectNodes = new Map<string, InspectNode>();\n\n for (const acc of steps.values()) {\n const kind = stepTypeToInspectKind(acc.type);\n const status = mapStepStatus(acc.status);\n const attrs: Record<string, unknown> = { ...(acc.metadata ?? {}) };\n if (acc.error?.message) {\n attrs.error = acc.error;\n }\n\n const evt: InspectEvent = {\n eventId: acc.id,\n runId,\n parentId: acc.parentId,\n name: acc.name,\n kind,\n timestamp: acc.timestamp,\n status,\n durationMs: acc.durationMs,\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n confidence: \"explicit\",\n source: { type: \"manual\" },\n };\n\n inspectNodes.set(acc.id, { event: evt, children: [], depth: 0 });\n }\n\n const roots: InspectNode[] = [];\n const sortByStart = (a: InspectNode, b: InspectNode) =>\n a.event.timestamp - b.event.timestamp;\n\n for (const node of inspectNodes.values()) {\n const pid = node.event.parentId;\n if (pid !== undefined && inspectNodes.has(pid)) {\n inspectNodes.get(pid)!.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n roots.sort(sortByStart);\n for (const n of inspectNodes.values()) {\n n.children.sort(sortByStart);\n }\n\n const assignDepth = (n: InspectNode, depth: number) => {\n n.depth = depth;\n for (const c of n.children) assignDepth(c, depth + 1);\n };\n for (const r of roots) assignDepth(r, 0);\n\n const confidenceBreakdown = {\n explicit: 0,\n correlated: 0,\n heuristic: 0,\n unknown: 0,\n } as InspectRunTree[\"metadata\"][\"confidenceBreakdown\"];\n\n const kinds = zeroKinds();\n\n function countWalk(nodes: InspectNode[]): void {\n for (const n of nodes) {\n confidenceBreakdown[n.event.confidence] += 1;\n kinds[n.event.kind] += 1;\n if (n.children.length > 0) countWalk(n.children);\n }\n }\n countWalk(roots);\n\n return {\n runId,\n name: runName,\n status: runStatus,\n startedAt,\n endedAt,\n durationMs,\n children: roots,\n metadata: {\n totalEvents: inspectNodes.size,\n confidenceBreakdown,\n kinds,\n },\n };\n}\n","import type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult, ExportValidationResult } from \"./types.js\";\nimport { redactRunTreeForExport } from \"./redact-export.js\";\nimport { exportHtml } from \"./html-exporter.js\";\nimport { exportMarkdown } from \"./markdown-exporter.js\";\nimport { exportOpenInference } from \"./openinference-exporter.js\";\nimport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nimport { validateExportContent } from \"./validation.js\";\n\nexport function mergeExportDefaults(options: ExportOptions): ExportOptions {\n return {\n format: options.format,\n includeMetadata: options.includeMetadata ?? true,\n includeAttributes: options.includeAttributes ?? false,\n includeErrors: options.includeErrors ?? true,\n pretty: options.pretty ?? true,\n redacted: options.redacted ?? true,\n maxAttributeLength: options.maxAttributeLength ?? 500,\n redactionProfile: options.redactionProfile ?? \"local\",\n };\n}\n\n/**\n * @experimental Compatibility-oriented export API. Exports are local-only and do not upload anywhere.\n * Subject to refinement before a future stability declaration.\n */\nexport function exportRunTree(tree: InspectRunTree, options: ExportOptions): ExportResult {\n const opts = mergeExportDefaults(options);\n const exportTree =\n opts.redactionProfile === \"local\"\n ? tree\n : redactRunTreeForExport(tree, { redactionProfile: opts.redactionProfile });\n switch (opts.format) {\n case \"markdown\":\n return exportMarkdown(exportTree, opts);\n case \"html\":\n return exportHtml(exportTree, opts);\n case \"openinference\":\n return exportOpenInference(exportTree, opts);\n case \"otlp-json\":\n return exportOtlpJson(exportTree, opts);\n default: {\n const _x: never = opts.format;\n throw new Error(`Unsupported export format: ${String(_x)}`);\n }\n }\n}\n\nexport function validateExport(result: ExportResult): ExportValidationResult {\n const base = validateExportContent(result.format, result.content);\n return {\n ok: base.ok,\n format: base.format,\n errors: base.errors,\n warnings: [...result.warnings, ...base.warnings],\n };\n}\n\nexport type {\n ExportFormat,\n ExportOptions,\n ExportResult,\n ExportValidationResult,\n TraceExporter,\n} from \"./types.js\";\nexport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nexport * from \"./helpers.js\";\nexport { manualTraceEventsToRunTree } from \"./manual-trace-adapter.js\";\nexport { exportMarkdown } from \"./markdown-exporter.js\";\nexport { exportHtml } from \"./html-exporter.js\";\nexport type { OpenInferenceExport, OpenInferenceSpan } from \"./openinference-exporter.js\";\nexport { exportOpenInference } from \"./openinference-exporter.js\";\nexport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nexport { validateExportContent } from \"./validation.js\";\nexport { redactRunTreeForExport } from \"./redact-export.js\";\n","/**\n * v0.2 shared duration utilities.\n *\n * `parseDuration` is used for filters such as \"since\" / \"older-than\".\n * `formatDuration` is used for compact display in CLI and summaries.\n */\n\nexport function parseDuration(duration: string): number {\n const raw = typeof duration === \"string\" ? duration.trim() : \"\";\n const match = raw.match(/^(\\d+)(ms|[smhd])$/);\n if (!match) {\n throw new Error(\n `Invalid duration format: ${duration}. Use a positive integer followed by ms, s, m, h, or d (e.g. 500ms, 30s, 5m, 2h, 7d).`,\n );\n }\n\n const amount = Number.parseInt(match[1], 10);\n const unit = match[2];\n\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\n `Invalid duration amount: ${duration}. Amount must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"ms\":\n return amount;\n case \"s\":\n return amount * 1000;\n case \"m\":\n return amount * 60 * 1000;\n case \"h\":\n return amount * 60 * 60 * 1000;\n case \"d\":\n return amount * 24 * 60 * 60 * 1000;\n default: {\n // Should be unreachable due to regex.\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n }\n}\n\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms)) {\n return \"0ms\";\n }\n if (ms < 0) {\n throw new Error(`formatDuration: ms must be non-negative (got ${ms})`);\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n if (ms < 60_000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n if (ms < 3_600_000) {\n return `${(ms / 60_000).toFixed(1)}m`;\n }\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\n","import { 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 type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n StepStatus,\n StepType,\n TraceEvent,\n TraceMetadataStatus,\n} from \"./types.js\";\nimport { formatDuration, formatTimestamp } from \"./utils.js\";\n\nexport type TimelineFocus = \"all\" | \"slow\";\n\nexport interface TimelineEntry {\n stepId: string;\n name: string;\n type: StepType;\n status: StepStatus;\n depth: number;\n startedAt: number;\n offsetMs: number;\n durationMs?: number;\n isError: boolean;\n slow?: boolean;\n streaming?: {\n chunkCount?: number;\n streamDurationMs?: number;\n streamedCharCount?: number;\n };\n}\n\nexport interface RunTimeline {\n runId: string;\n name?: string;\n status: TraceMetadataStatus;\n startedAt?: number;\n endedAt?: number;\n durationMs?: number;\n correlation?: {\n correlationId?: string;\n requestId?: string;\n decisionId?: string;\n groupId?: string;\n };\n entries: TimelineEntry[];\n}\n\nexport interface TimelineOptions {\n focus?: TimelineFocus;\n slowTopN?: number;\n}\n\nfunction finite(n: unknown): n is number {\n return typeof n === \"number\" && Number.isFinite(n);\n}\n\nfunction pickStreamingMeta(\n metadata: Record<string, unknown> | undefined,\n): TimelineEntry[\"streaming\"] | undefined {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const chunkCount = metadata.chunkCount;\n const streamDurationMs = metadata.streamDurationMs;\n const streamedCharCount = metadata.streamedCharCount;\n if (\n !finite(chunkCount) &&\n !finite(streamDurationMs) &&\n !finite(streamedCharCount)\n ) {\n return undefined;\n }\n return {\n ...(finite(chunkCount) ? { chunkCount } : {}),\n ...(finite(streamDurationMs) ? { streamDurationMs } : {}),\n ...(finite(streamedCharCount) ? { streamedCharCount } : {}),\n };\n}\n\nfunction pickCorrelation(\n metadata: Record<string, unknown> | undefined,\n): RunTimeline[\"correlation\"] | undefined {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const out: NonNullable<RunTimeline[\"correlation\"]> = {};\n for (const key of [\n \"correlationId\",\n \"requestId\",\n \"decisionId\",\n \"groupId\",\n ] as const) {\n const v = metadata[key];\n if (typeof v === \"string\" && v.trim() !== \"\") {\n out[key] = v;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function buildRunTimeline(\n events: TraceEvent[],\n options: TimelineOptions = {},\n): RunTimeline {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const runId =\n started?.runId ??\n events.find((e) => typeof (e as { runId?: string }).runId === \"string\")\n ?.runId ??\n \"unknown-run\";\n\n const runStart =\n started && finite(started.startTime)\n ? started.startTime\n : started && finite(started.timestamp)\n ? started.timestamp\n : undefined;\n\n const status: TraceMetadataStatus = lastCompleted\n ? lastCompleted.status\n : started\n ? \"running\"\n : \"unknown\";\n\n const steps = new Map<\n string,\n {\n name: string;\n type: StepType;\n parentId?: string;\n startedAt: number;\n status: StepStatus;\n durationMs?: number;\n metadata?: Record<string, unknown>;\n }\n >();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n name: s.name,\n type: s.type,\n parentId: s.parentId,\n startedAt: finite(s.startTime) ? s.startTime : s.timestamp,\n status: \"running\",\n metadata: s.metadata as Record<string, unknown> | undefined,\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = steps.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n if (finite(c.durationMs)) node.durationMs = c.durationMs;\n }\n\n const depthCache = new Map<string, number>();\n const computeDepth = (stepId: string): number => {\n const cached = depthCache.get(stepId);\n if (cached !== undefined) return cached;\n const node = steps.get(stepId);\n if (!node) return 0;\n const parent = node.parentId;\n if (\n typeof parent !== \"string\" ||\n parent.trim() === \"\" ||\n !steps.has(parent)\n ) {\n depthCache.set(stepId, 0);\n return 0;\n }\n const d = Math.min(1000, computeDepth(parent) + 1);\n depthCache.set(stepId, d);\n return d;\n };\n\n const entries: TimelineEntry[] = [];\n for (const [stepId, s] of steps.entries()) {\n const offsetMs =\n runStart !== undefined && finite(s.startedAt)\n ? Math.max(0, s.startedAt - runStart)\n : 0;\n entries.push({\n stepId,\n name: s.name,\n type: s.type,\n status: s.status,\n depth: computeDepth(stepId),\n startedAt: s.startedAt,\n offsetMs,\n durationMs: s.durationMs,\n isError: s.status === \"error\",\n streaming: pickStreamingMeta(s.metadata),\n });\n }\n\n entries.sort((a, b) => a.startedAt - b.startedAt);\n\n const slowTopN = options.slowTopN ?? 3;\n if (options.focus === \"slow\" && entries.length > 0) {\n const ranked = [...entries]\n .filter((e) => finite(e.durationMs))\n .sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n const slowIds = new Set(\n ranked.slice(0, slowTopN).map((e) => e.stepId),\n );\n for (const e of entries) {\n if (slowIds.has(e.stepId)) e.slow = true;\n }\n }\n\n return {\n runId,\n name:\n typeof started?.name === \"string\" && started.name.trim() !== \"\"\n ? started.name\n : undefined,\n status,\n startedAt: runStart,\n endedAt:\n lastCompleted && finite(lastCompleted.endTime)\n ? lastCompleted.endTime\n : undefined,\n durationMs:\n lastCompleted && finite(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined,\n correlation: pickCorrelation(\n started?.metadata as Record<string, unknown> | undefined,\n ),\n entries,\n };\n}\n\nexport interface RenderTimelineOptions {\n focus?: TimelineFocus;\n}\n\nexport function renderTimeline(\n timeline: RunTimeline,\n options: RenderTimelineOptions = {},\n): string {\n const lines: string[] = [];\n lines.push(`Timeline: ${timeline.name ?? timeline.runId}`);\n lines.push(`Run ID: ${timeline.runId}`);\n lines.push(`Status: ${timeline.status}`);\n if (timeline.startedAt !== undefined) {\n lines.push(`Started: ${formatTimestamp(timeline.startedAt)}`);\n }\n if (timeline.durationMs !== undefined) {\n lines.push(`Duration: ${formatDuration(timeline.durationMs)}`);\n }\n if (timeline.correlation) {\n const parts = Object.entries(timeline.correlation)\n .filter(([, v]) => typeof v === \"string\")\n .map(([k, v]) => `${k}=${v}`);\n if (parts.length > 0) {\n lines.push(`Correlation: ${parts.join(\", \")}`);\n }\n }\n lines.push(\"\");\n lines.push(\"Steps (chronological):\");\n\n const show = timeline.entries.filter((e) => {\n if (options.focus === \"slow\") return e.slow === true;\n return true;\n });\n\n if (show.length === 0) {\n lines.push(\n options.focus === \"slow\"\n ? \"(no steps with duration for slow focus)\"\n : \"(no steps)\",\n );\n return lines.join(\"\\n\");\n }\n\n for (const e of show) {\n const prefix = e.slow ? \"[slow] \" : \"\";\n const typeTag =\n e.type === \"llm\" ? \"llm\" : e.type === \"tool\" ? \"tool\" : e.type;\n const dur =\n e.durationMs !== undefined ? formatDuration(e.durationMs) : \"-\";\n const err = e.isError ? \" error\" : \"\";\n const off = formatDuration(e.offsetMs);\n let line = `${prefix}+${off} ${typeTag}:${e.name} (${dur})${err}`;\n if (e.streaming?.chunkCount !== undefined) {\n line += ` chunks=${e.streaming.chunkCount}`;\n }\n if (e.streaming?.streamDurationMs !== undefined) {\n line += ` stream=${formatDuration(e.streaming.streamDurationMs)}`;\n }\n lines.push(line);\n }\n\n return lines.join(\"\\n\");\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n TraceEvent,\n TraceMetadata,\n TraceMetadataStatus,\n RunSummary,\n StepType,\n StepStatus,\n} from \"./types.js\";\nimport { parseTraceJsonl } from \"./read-trace.js\";\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction parseIsoToMs(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport async function extractMetadata(\n filePath: string,\n _quickScan?: boolean,\n): Promise<TraceMetadata> {\n const stats = await stat(filePath);\n\n let runIdFromFile = path.basename(filePath);\n if (runIdFromFile.endsWith(\".jsonl\")) {\n runIdFromFile = runIdFromFile.slice(0, -\".jsonl\".length);\n }\n\n const raw = await readFile(filePath, \"utf-8\");\n const parsedTrace = parseTraceJsonl(raw, { warnings: false });\n\n let runId: string | undefined;\n let name: string | undefined;\n let startedAt: number | undefined;\n let endedAt: number | undefined;\n let explicitDurationMs: number | undefined;\n\n let hasRunStarted = false;\n let hasRunCompleted = false;\n let runCompletedStatus: \"success\" | \"error\" | undefined;\n let anyStepError = false;\n const anyKnownEvent = parsedTrace.sourceEventCount > 0;\n let persistedStatus: TraceMetadataStatus | undefined;\n\n const persistedRun = parsedTrace.persisted.find(\n (event) => event.kind === \"RUN\",\n );\n if (persistedRun) {\n runId = persistedRun.runId;\n if (persistedRun.name.trim() !== \"\") {\n name = persistedRun.name;\n }\n startedAt =\n parseIsoToMs(persistedRun.startedAt) ??\n parseIsoToMs(persistedRun.timestamp);\n endedAt = parseIsoToMs(persistedRun.endedAt);\n if (isFiniteNumber(persistedRun.durationMs)) {\n explicitDurationMs = persistedRun.durationMs;\n if (endedAt === undefined && startedAt !== undefined) {\n endedAt = startedAt + persistedRun.durationMs;\n }\n }\n if (persistedRun.status === \"ok\") persistedStatus = \"success\";\n else if (persistedRun.status === \"error\") persistedStatus = \"error\";\n else if (persistedRun.status === \"running\") persistedStatus = \"running\";\n else if (persistedRun.status === \"unknown\") persistedStatus = \"unknown\";\n } else {\n runId = parsedTrace.persisted[0]?.runId;\n }\n\n for (const e of parsedTrace.events) {\n if (\n runId === undefined &&\n typeof (e as { runId?: unknown }).runId === \"string\"\n ) {\n runId = (e as { runId: string }).runId;\n }\n\n if (e.event === \"run_started\") {\n hasRunStarted = true;\n const rs = e as RunStartedEvent;\n if (typeof rs.name === \"string\" && rs.name.trim() !== \"\") {\n name = rs.name;\n }\n if (isFiniteNumber(rs.startTime)) {\n startedAt = rs.startTime;\n } else if (isFiniteNumber(rs.timestamp)) {\n startedAt = rs.timestamp;\n }\n }\n\n if (e.event === \"run_completed\") {\n hasRunCompleted = true;\n const rc = e as RunCompletedEvent;\n runCompletedStatus = rc.status;\n if (isFiniteNumber(rc.endTime)) endedAt = rc.endTime;\n else if (isFiniteNumber(rc.timestamp)) endedAt = rc.timestamp;\n if (isFiniteNumber(rc.durationMs)) explicitDurationMs = rc.durationMs;\n }\n\n if (e.event === \"step_completed\") {\n const sc = e as StepCompletedEvent;\n if (sc.status === \"error\") {\n anyStepError = true;\n }\n }\n }\n\n const resolvedRunId = runId ?? runIdFromFile;\n\n let status: TraceMetadataStatus = \"unknown\";\n if (\n hasRunCompleted &&\n (runCompletedStatus === \"success\" || runCompletedStatus === \"error\")\n ) {\n status = runCompletedStatus;\n } else if (anyStepError) {\n // If run_completed is missing, but at least one step failed, treat as error.\n status = \"error\";\n } else if (persistedStatus !== undefined) {\n status = persistedStatus;\n } else if (hasRunStarted && !hasRunCompleted) {\n status = \"running\";\n } else if (anyKnownEvent) {\n status = \"unknown\";\n } else {\n status = \"unknown\";\n }\n\n const durationMs =\n explicitDurationMs ??\n (startedAt !== undefined &&\n endedAt !== undefined &&\n Number.isFinite(startedAt) &&\n Number.isFinite(endedAt) &&\n endedAt >= startedAt\n ? endedAt - startedAt\n : undefined);\n\n return {\n runId: resolvedRunId,\n name,\n status,\n startedAt,\n endedAt,\n durationMs,\n eventCount: parsedTrace.sourceEventCount,\n filePath,\n fileSize: stats.size,\n createdAt: stats.birthtime,\n };\n}\n\ntype StepAgg = {\n type: StepType;\n name: string;\n status: StepStatus;\n durationMs?: number;\n parentId?: string;\n tokensInput?: number;\n tokensOutput?: number;\n tokensTotal?: number;\n tokensCached?: number;\n};\n\nfunction isNonNegativeFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nexport function buildRunSummary(events: TraceEvent[]): RunSummary {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const runId = started?.runId ?? events.find((e: any) => typeof e.runId === \"string\")?.runId ?? \"unknown-run\";\n\n const name =\n typeof started?.name === \"string\" && started.name.trim() !== \"\"\n ? started.name\n : undefined;\n\n const status: TraceMetadataStatus = lastCompleted\n ? lastCompleted.status\n : started\n ? \"running\"\n : \"unknown\";\n\n const durationMs =\n lastCompleted && isFiniteNumber(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined;\n\n const startedAt =\n started && isFiniteNumber(started.startTime)\n ? started.startTime\n : undefined;\n\n const steps = new Map<string, StepAgg>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n type: s.type,\n name: s.name,\n status: \"running\",\n parentId: s.parentId,\n tokensInput:\n isNonNegativeFiniteNumber(s.metadata?.tokens?.input)\n ? s.metadata.tokens.input\n : undefined,\n tokensOutput:\n isNonNegativeFiniteNumber(s.metadata?.tokens?.output)\n ? s.metadata.tokens.output\n : undefined,\n tokensTotal: isNonNegativeFiniteNumber(s.metadata?.tokens?.total)\n ? s.metadata.tokens.total\n : undefined,\n tokensCached: isNonNegativeFiniteNumber(s.metadata?.tokens?.cached)\n ? s.metadata.tokens.cached\n : undefined,\n });\n }\n }\n\n for (const e of events) {\n if (e.event === \"step_completed\") {\n const c = e as StepCompletedEvent;\n const existing = steps.get(c.stepId);\n if (!existing) continue;\n existing.status = c.status;\n existing.durationMs = c.durationMs;\n }\n }\n\n let totalSteps = 0;\n let llmSteps = 0;\n let toolSteps = 0;\n let logicSteps = 0;\n let errorSteps = 0;\n let maxDepth = 0;\n let longestStep: RunSummary[\"longestStep\"] | undefined;\n\n let totalTokensInput = 0;\n let totalTokensOutput = 0;\n let totalTokensTotal = 0;\n let totalTokensCached = 0;\n let tokenBearingSteps = 0;\n let stepsWithKnownTotal = 0;\n let hasCachedTokens = false;\n\n const depthCache = new Map<string, number>();\n const computeDepth = (stepId: string): number => {\n const cached = depthCache.get(stepId);\n if (cached !== undefined) return cached;\n const node = steps.get(stepId);\n if (!node) return 0;\n const parent = node.parentId;\n if (typeof parent !== \"string\" || parent.trim() === \"\" || !steps.has(parent)) {\n depthCache.set(stepId, 0);\n return 0;\n }\n // Depth is parent depth + 1. Cap at a sane limit to avoid cycles.\n const d = Math.min(1000, computeDepth(parent) + 1);\n depthCache.set(stepId, d);\n return d;\n };\n\n for (const [id, s] of steps.entries()) {\n totalSteps += 1;\n if (s.type === \"llm\") llmSteps += 1;\n else if (s.type === \"tool\") toolSteps += 1;\n else logicSteps += 1;\n\n if (s.status === \"error\") errorSteps += 1;\n const depth = computeDepth(id);\n if (depth > maxDepth) maxDepth = depth;\n\n if (typeof s.durationMs === \"number\" && Number.isFinite(s.durationMs)) {\n if (!longestStep || s.durationMs > longestStep.durationMs) {\n longestStep = { name: s.name, durationMs: s.durationMs, type: s.type };\n }\n }\n\n if (\n s.tokensInput !== undefined ||\n s.tokensOutput !== undefined ||\n s.tokensTotal !== undefined ||\n s.tokensCached !== undefined\n ) {\n tokenBearingSteps += 1;\n if (s.tokensInput !== undefined) totalTokensInput += s.tokensInput;\n if (s.tokensOutput !== undefined) totalTokensOutput += s.tokensOutput;\n\n if (s.tokensTotal !== undefined) {\n totalTokensTotal += s.tokensTotal;\n stepsWithKnownTotal += 1;\n } else if (s.tokensInput !== undefined && s.tokensOutput !== undefined) {\n totalTokensTotal += s.tokensInput + s.tokensOutput;\n stepsWithKnownTotal += 1;\n }\n\n if (s.tokensCached !== undefined) {\n totalTokensCached += s.tokensCached;\n hasCachedTokens = true;\n }\n }\n }\n\n const summary: RunSummary = {\n runId,\n name,\n status,\n durationMs,\n totalSteps,\n llmSteps,\n toolSteps,\n logicSteps,\n errorSteps,\n maxDepth,\n ...(longestStep ? { longestStep } : {}),\n ...(tokenBearingSteps > 0\n ? {\n totalTokens: {\n input: totalTokensInput,\n output: totalTokensOutput,\n ...(stepsWithKnownTotal === tokenBearingSteps\n ? { total: totalTokensTotal }\n : {}),\n ...(hasCachedTokens ? { cached: totalTokensCached } : {}),\n },\n }\n : {}),\n };\n\n // startedAt isn't in RunSummary spec, but keep deterministic results: ignore.\n void startedAt;\n return summary;\n}\n","import type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n TraceCorrelationMetadata,\n TraceEvent,\n TraceMetadataStatus,\n} from \"./types.js\";\nimport { buildRunSummary } from \"./trace-metadata.js\";\nimport { formatDuration } from \"./utils.js\";\n\nexport interface RunWhatSummary {\n runId: string;\n name?: string;\n status: TraceMetadataStatus;\n durationMs?: number;\n totalSteps: number;\n llmSteps: number;\n toolSteps: number;\n logicSteps: number;\n errorSteps: number;\n maxDepth: number;\n longestStep?: {\n name: string;\n durationMs: number;\n type: string;\n };\n totalTokens?: {\n input: number;\n output: number;\n total?: number;\n cached?: number;\n };\n correlation?: TraceCorrelationMetadata;\n failedStepNames: string[];\n runErrorMessage?: string;\n}\n\nfunction pickCorrelation(\n metadata: Record<string, unknown> | undefined,\n): TraceCorrelationMetadata | undefined {\n if (!metadata) return undefined;\n const out: TraceCorrelationMetadata = {};\n for (const key of [\n \"correlationId\",\n \"requestId\",\n \"decisionId\",\n \"groupId\",\n ] as const) {\n const value = metadata[key];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction stepMixLine(summary: RunWhatSummary): string {\n const parts: string[] = [];\n if (summary.llmSteps > 0) parts.push(`${summary.llmSteps} LLM`);\n if (summary.toolSteps > 0) parts.push(`${summary.toolSteps} tool`);\n if (summary.logicSteps > 0) parts.push(`${summary.logicSteps} logic`);\n return parts.length > 0 ? parts.join(\", \") : \"none\";\n}\n\nfunction outcomeLine(summary: RunWhatSummary): string {\n if (summary.status === \"success\") {\n return summary.errorSteps > 0\n ? \"Completed with step errors recorded.\"\n : \"Completed successfully.\";\n }\n if (summary.status === \"error\") {\n if (summary.failedStepNames.length > 0) {\n const names = summary.failedStepNames.slice(0, 3).join(\", \");\n const suffix =\n summary.failedStepNames.length > 3\n ? ` (+${summary.failedStepNames.length - 3} more)`\n : \"\";\n return `Failed at step(s): ${names}${suffix}.`;\n }\n if (summary.runErrorMessage) {\n return `Run failed: ${summary.runErrorMessage}`;\n }\n return \"Run failed.\";\n }\n if (summary.status === \"running\") {\n return \"Run is still in progress (no run_completed).\";\n }\n return \"Outcome unknown — inspect events may be incomplete.\";\n}\n\n/**\n * Build a concise inspection summary for `what` / report workflows.\n * Read-only over in-memory v0.1 {@link TraceEvent} rows.\n */\nexport function buildRunWhatSummary(events: TraceEvent[]): RunWhatSummary {\n const base = buildRunSummary(events);\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const failedStepNames: string[] = [];\n const stepNames = new Map<string, string>();\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n stepNames.set(s.stepId, s.name);\n }\n }\n for (const e of events) {\n if (e.event === \"step_completed\") {\n const sc = e as StepCompletedEvent;\n if (sc.status === \"error\") {\n failedStepNames.push(stepNames.get(sc.stepId) ?? sc.stepId);\n }\n }\n }\n\n return {\n runId: base.runId,\n name: base.name,\n status: base.status,\n durationMs: base.durationMs,\n totalSteps: base.totalSteps,\n llmSteps: base.llmSteps,\n toolSteps: base.toolSteps,\n logicSteps: base.logicSteps,\n errorSteps: base.errorSteps,\n maxDepth: base.maxDepth,\n longestStep: base.longestStep,\n totalTokens: base.totalTokens,\n correlation: pickCorrelation(started?.metadata),\n failedStepNames,\n runErrorMessage: lastCompleted?.error?.message,\n };\n}\n\nexport interface RenderWhatOptions {\n /** Include correlation ids when present (default true). */\n correlation?: boolean;\n}\n\n/**\n * Render a human-readable `what` summary (plain text, no ANSI).\n */\nexport function renderRunWhat(\n summary: RunWhatSummary,\n options: RenderWhatOptions = {},\n): string {\n const showCorrelation = options.correlation !== false;\n const lines: string[] = [];\n const label = summary.name ?? summary.runId;\n lines.push(`What: ${label}`);\n\n const duration =\n summary.durationMs !== undefined ? formatDuration(summary.durationMs) : \"—\";\n lines.push(\n `Status: ${summary.status} · Duration: ${duration} · Steps: ${summary.totalSteps} (${stepMixLine(summary)})`,\n );\n\n if (summary.totalTokens) {\n const tokenParts = [\n `${summary.totalTokens.input} in`,\n `${summary.totalTokens.output} out`,\n ];\n if (summary.totalTokens.total !== undefined) {\n tokenParts.push(`${summary.totalTokens.total} total`);\n }\n if (summary.totalTokens.cached !== undefined) {\n tokenParts.push(`${summary.totalTokens.cached} cached`);\n }\n lines.push(`Tokens: ${tokenParts.join(\" / \")}`);\n }\n\n if (showCorrelation && summary.correlation) {\n const parts: string[] = [];\n if (summary.correlation.correlationId) {\n parts.push(`correlationId=${summary.correlation.correlationId}`);\n }\n if (summary.correlation.requestId) {\n parts.push(`requestId=${summary.correlation.requestId}`);\n }\n if (summary.correlation.decisionId) {\n parts.push(`decisionId=${summary.correlation.decisionId}`);\n }\n if (summary.correlation.groupId) {\n parts.push(`groupId=${summary.correlation.groupId}`);\n }\n if (parts.length > 0) {\n lines.push(`Correlation: ${parts.join(\", \")}`);\n }\n }\n\n lines.push(`Outcome: ${outcomeLine(summary)}`);\n\n if (summary.longestStep && summary.totalSteps > 0) {\n lines.push(\n `Slowest: ${summary.longestStep.name} (${formatDuration(summary.longestStep.durationMs)}, ${summary.longestStep.type})`,\n );\n }\n\n if (summary.maxDepth > 0) {\n lines.push(`Max depth: ${summary.maxDepth}`);\n }\n\n return lines.join(\"\\n\");\n}\n","import type { TraceEvent } from \"./types.js\";\nimport type { RedactionProfile } from \"./types.js\";\nimport type { InspectRunTree } from \"./types/inspect-event.js\";\nimport { exportHtml } from \"./exporters/html-exporter.js\";\nimport { exportMarkdown } from \"./exporters/markdown-exporter.js\";\nimport { escapeHtml, escapeMarkdown } from \"./exporters/helpers.js\";\nimport { manualTraceEventsToRunTree } from \"./exporters/manual-trace-adapter.js\";\nimport {\n redactRunTreeForExport,\n redactTraceEventsForReport,\n} from \"./exporters/redact-export.js\";\nimport { buildRunTimeline, renderTimeline } from \"./timeline.js\";\nimport { buildRunWhatSummary, renderRunWhat } from \"./what.js\";\n\nexport type ReportFormat = \"markdown\" | \"html\";\n\nexport interface ReportOptions {\n format: ReportFormat;\n includeAttributes?: boolean;\n includeErrors?: boolean;\n redactionProfile?: RedactionProfile;\n /** Include correlation ids in the what section (default true). */\n correlation?: boolean;\n}\n\nexport interface ReportResult {\n format: ReportFormat;\n content: string;\n contentType: string;\n fileExtension: string;\n}\n\nfunction resolveTree(\n events: TraceEvent[],\n profile: RedactionProfile,\n): InspectRunTree {\n const tree = manualTraceEventsToRunTree(events);\n return profile === \"local\"\n ? tree\n : redactRunTreeForExport(tree, { redactionProfile: profile });\n}\n\nfunction tailMarkdownSection(content: string, heading: string): string {\n const marker = `## ${heading}`;\n const idx = content.indexOf(marker);\n if (idx < 0) return \"\";\n return content.slice(idx).trimEnd();\n}\n\nfunction extractHtmlFragment(content: string, start: string, end: string): string {\n const startIdx = content.indexOf(start);\n if (startIdx < 0) return \"\";\n const endIdx = content.indexOf(end, startIdx + start.length);\n if (endIdx < 0) return content.slice(startIdx);\n return content.slice(startIdx, endIdx);\n}\n\nconst REPORT_HTML_CSS = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\npre{white-space:pre-wrap;background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.9rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n/**\n * Build a local inspection report (markdown or HTML) from v0.1 trace events.\n * Composes `what`, timeline, and execution-tree sections.\n */\nexport function buildRunReport(\n events: TraceEvent[],\n options: ReportOptions,\n): ReportResult {\n const profile = options.redactionProfile ?? \"local\";\n const safeEvents = redactTraceEventsForReport(events, {\n redactionProfile: profile,\n });\n const whatSummary = buildRunWhatSummary(safeEvents);\n const whatText = renderRunWhat(whatSummary, {\n correlation: options.correlation !== false,\n });\n const timelineText = renderTimeline(buildRunTimeline(safeEvents));\n const tree = resolveTree(safeEvents, profile);\n\n const exportOpts = {\n includeMetadata: false,\n includeAttributes: options.includeAttributes === true,\n includeErrors: options.includeErrors !== false,\n redacted: true,\n redactionProfile: profile,\n maxAttributeLength: 500,\n };\n\n if (options.format === \"markdown\") {\n const treeMd = exportMarkdown(tree, exportOpts);\n const tail = tailMarkdownSection(treeMd.content, \"Execution tree\");\n const title = escapeMarkdown(whatSummary.name ?? whatSummary.runId);\n const lines = [\n `# AgentInspect Report: ${title}`,\n \"\",\n \"Generated locally by AgentInspect. Review for sensitive data before sharing.\",\n \"\",\n \"## What happened\",\n \"\",\n \"```text\",\n whatText,\n \"```\",\n \"\",\n \"## Timeline\",\n \"\",\n \"```text\",\n timelineText,\n \"```\",\n \"\",\n ];\n if (tail) {\n lines.push(tail, \"\");\n } else {\n lines.push(\"## Execution tree\", \"\", \"(no steps)\", \"\");\n }\n\n return {\n format: \"markdown\",\n content: lines.join(\"\\n\"),\n contentType: \"text/markdown\",\n fileExtension: \".md\",\n };\n }\n\n const treeHtml = exportHtml(tree, exportOpts);\n const title = escapeHtml(whatSummary.name ?? whatSummary.runId);\n const treeSection = extractHtmlFragment(\n treeHtml.content,\n '<section class=\"tree\">',\n \"</section>\",\n );\n // The exporter emits Errors before Attributes, so the errors fragment must\n // stop at the attributes heading when both sections are present; ending at\n // <footer> would swallow the attributes section and duplicate it below.\n const errorsSectionEnd = treeHtml.content.includes(\n \"<h2>Attributes (bounded)</h2>\",\n )\n ? \"<h2>Attributes (bounded)</h2>\"\n : \"<footer>\";\n const errorsSection = treeHtml.content.includes(\"<h2>Errors</h2>\")\n ? extractHtmlFragment(treeHtml.content, \"<h2>Errors</h2>\", errorsSectionEnd)\n : \"\";\n const attrsSection = treeHtml.content.includes(\"<h2>Attributes (bounded)</h2>\")\n ? extractHtmlFragment(\n treeHtml.content,\n \"<h2>Attributes (bounded)</h2>\",\n \"<footer>\",\n )\n : \"\";\n\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>AgentInspect Report: ${title}</title>\n<style>${REPORT_HTML_CSS}</style>\n</head>\n<body>\n<header><h1>AgentInspect Report: ${title}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect. Review for sensitive data before sharing.</p>\n<section class=\"what\"><h2>What happened</h2><pre>${escapeHtml(whatText)}</pre></section>\n<section class=\"timeline\"><h2>Timeline</h2><pre>${escapeHtml(timelineText)}</pre></section>\n${treeSection || \"<section class=\\\"tree\\\"><h2>Execution tree</h2><p>No steps recorded.</p></section>\"}\n${errorsSection}\n${attrsSection}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n return {\n format: \"html\",\n content: html,\n contentType: \"text/html\",\n fileExtension: \".html\",\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/exporters/types.ts","../src/logs/redactor.ts","../src/redaction-profiles.ts","../src/exporters/redact-export.ts","../src/exporters/helpers.ts","../src/exporters/html-exporter.ts","../src/exporters/markdown-exporter.ts","../src/exporters/openinference-exporter.ts","../src/exporters/otlp-json-exporter.ts","../src/exporters/validation.ts","../src/exporters/manual-trace-adapter.ts","../src/exporters/index.ts","../src/utils/duration.ts","../src/utils.ts","../src/timeline.ts","../src/trace-metadata.ts","../src/what.ts","../src/outcomes/types.ts","../src/outcomes/extract.ts","../src/outcomes/render.ts","../src/report.ts"],"names":["crypto","isRecord","hexFrom","path","os","formatDuration","pickCorrelation","title"],"mappings":";;;;;;;;;;;;;;AA+CO,IAAM,sBAAA,GAAyB;AC3C/B,IAAM,mBAAA,GAAsB;AAAA,EACjC,eAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAQA,SAAS,SAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,EAAE,WAAA,EAAY;AACvB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,MAAM,CAAA,GAAIA,uBAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAO,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACxE,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACrB;AAOA,SAAS,YAAA,CACP,OACA,SAAA,EACgB;AAChB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA0B;AAE1C,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAoB;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,GAAG,CAAA;AACrB,IAAA,GAAA,CAAI,IAAI,CAAA,EAAG,EAAE,GAAG,CAAA,EAAG,GAAA,EAAK,GAAmB,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,KAAA,MAAW,KAAK,mBAAA,EAAqB;AACnC,IAAA,GAAA,CAAI,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAAA,EAClC;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,SAAA,IAAa,EAAC,EAAG;AAC/B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,MAAA,GAAA,CAAI,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,IAAS,EAAC,EAAG;AAC3B,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,MAAA,GAAA,CAAI,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAM,CAAA,CAAE,GAAA;AACd,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAQ,GAAA,CAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA;AACxD,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,EAAQ,GAAA,CAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA;AACxD,IAAA,IAAI,CAAA,CAAE,aAAa,QAAA,EAAU;AAC3B,MAAA,GAAA,CAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,CAAE,IAAA,GAAO,CAAA,EAAG,CAAA;AAAA,IAChF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,GAAA,CAAI,MAAA,EAAQ,CAAA;AACzB;AAEO,IAAM,WAAN,MAAe;AAAA,EACX,MAAA;AAAA,EAET,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,SAAS,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,WAAA,CAAY,KAAa,KAAA,EAAyB;AAChD,IAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAChD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAQ,OAAO,YAAA;AACrC,IAAA,MAAM,WACJ,OAAO,KAAA,KAAU,QAAA,GACb,KAAA,GACA,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,KAAU,aAAa,OAAO,KAAA,KAAU,QAAA,GAC1E,MAAA,CAAO,KAAK,CAAA,GACZ,MAAA;AAER,IAAA,IAAI,IAAA,CAAK,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAI,QAAA,KAAa,QAAW,OAAO,YAAA;AACnC,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9C,MAAA,OAAO,QAAA,CAAS,MAAA,IAAU,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAA,GAAM,CAAA,EAAG,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,MAAA,IAAI,QAAA,KAAa,QAAW,OAAO,gBAAA;AACnC,MAAA,OAAO,CAAA,MAAA,EAAS,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,aAAa,MAAA,EAA0D;AACrE,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,cAAc,KAAA,EAAyB;AACrC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO,MAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;;;ACjIO,IAAM,wBAAA,GAA2B;AAAA,EACtC,WAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,yBAAA,GAA4B;AAAA,EACvC,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAUO,SAAS,uBAAA,CACd,UAA4B,OAAA,EACF;AAC1B,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,EAAC,EAAE;AAAA,IAC3C,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,SAAA,EAAW,wBAAA;AAAA,QACX,yBAAA,EAA2B,GAAA;AAAA,QAC3B,mBAAA,EAAqB;AAAA,OACvB;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAW,CAAC,GAAG,wBAAA,EAA0B,GAAG,yBAAyB,CAAA;AAAA,QACrE,yBAAA,EAA2B,GAAA;AAAA,QAC3B,mBAAA,EAAqB;AAAA,OACvB;AAAA,IACF;AACE,MAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,EAAC,EAAE;AAAA;AAE/C;AAEA,SAAS,aAAa,GAAA,EAAsB;AAC1C,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA;AAC7C;AAKO,SAAS,wBAAA,CACd,sBAAA,EACA,gBAAA,EACA,QAAA,EAC8D;AAC9D,EAAA,IAAI,IAAA,GAAO,sBAAA;AACX,EAAA,IAAI,OAAA,GAAU,gBAAA;AAEd,EAAA,IAAI,QAAA,CAAS,8BAA8B,MAAA,EAAW;AACpD,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,QAAA,CAAS,yBAAyB,CAAA;AAAA,EAC1D;AACA,EAAA,IAAI,QAAA,CAAS,wBAAwB,MAAA,EAAW;AAC9C,IAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,mBAAmB,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,EAAE,sBAAA,EAAwB,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAQ;AACnE;AAEO,SAAS,wBAAA,CACd,KAAA,EACA,GAAA,EACA,sBAAA,EACA,gBAAA,EACQ;AACR,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAG,CAAA,GAAI,gBAAA,GAAmB,sBAAA;AACnD,EAAA,IAAI,GAAA,IAAO,GAAG,OAAO,QAAA;AACrB,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,GAAA,EAAK,OAAO,KAAA;AAChC,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA;AAC/B;;;ACtGA,SAASC,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,UAAa,KAAA,EAAa;AACjC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AACrE,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAA,CAAU,CAAC,CAAA;AAAA,EACtB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,oBAAA,CACP,MAAA,EACA,sBAAA,EACA,gBAAA,EACA,MACA,KAAA,EACyB;AACzB,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW;AAAA,EAC/C;AAEA,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,GAAA,CAAI,GAAG,IAAI,UAAA,CAAW,KAAA,EAAO,KAAK,sBAAA,EAAwB,gBAAA,EAAkB,MAAM,KAAK,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WACP,KAAA,EACA,GAAA,EACA,sBAAA,EACA,gBAAA,EACA,MACA,KAAA,EACS;AACT,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,wBAAA;AAAA,QACL,KAAA;AAAA,QACA,GAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,YAAA;AAC5B,EAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CACJ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA;AAAA,MAAI,CAAC,MAAM,KAAA,KACV,UAAA;AAAA,QACE,IAAA;AAAA,QACA,OAAO,KAAK,CAAA;AAAA,QACZ,sBAAA;AAAA,QACA,gBAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA,GAAQ;AAAA;AACV,KACF;AAAA,EACJ;AAEA,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA;AAAA,IACA,sBAAA;AAAA,IACA,gBAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,GAAQ;AAAA,GACV;AACF;AAEA,SAAS,qBAAA,CACP,KAAA,EACA,QAAA,EACA,sBAAA,EACA,gBAAA,EACqC;AACrC,EAAA,IAAI,CAAC,KAAA,IAAS,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,IACd,QAAA;AAAA,IACA,sBAAA;AAAA,IACA,gBAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,MAAM,OAAA,CAAQ,KAAA;AACpB,EAAA,IAAIA,UAAS,GAAG,CAAA,IAAK,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AACpD,IAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,MACd,GAAG,GAAA;AAAA,MACH,OAAA,EAAS,wBAAA;AAAA,QACP,GAAA,CAAI,OAAA;AAAA,QACJ,SAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,GAAI,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,GACrB;AAAA,QACE,KAAA,EAAO,wBAAA;AAAA,UACL,GAAA,CAAI,KAAA;AAAA,UACJ,OAAA;AAAA,UACA,sBAAA;AAAA,UACA;AAAA;AACF,UAEF;AAAC,KACP;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACA,sBAAA,EACA,gBAAA,EACuB;AACvB,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAEhC,EAAA,MAAM,MAAA,GAAS,qBAAA;AAAA,IACb,EAAE,KAAA,EAAM;AAAA,IACR,QAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAW,MAAA,EAAQ,KAAA;AACzB,EAAA,IAAI,CAACA,SAAAA,CAAS,QAAQ,KAAK,OAAO,QAAA,CAAS,YAAY,QAAA,EAAU;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,GAAI,OAAO,QAAA,CAAS,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAM,GAAI;AAAC,GACxE;AACF;AAMO,SAAS,0BAAA,CACd,QACA,OAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,SAAS,gBAAA,IAAoB,OAAA;AAC7C,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,QAAA,GAAW,wBAAwB,OAAO,CAAA;AAChD,EAAA,MAAM,EAAE,sBAAA,EAAwB,gBAAA,EAAiB,GAAI,wBAAA;AAAA,IACnD,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,SAAA,EAAW,QAAA,CAAS,WAAW,CAAA;AAE/D,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAsB;AACvC,IAAA,QAAQ,MAAM,KAAA;AAAO,MACnB,KAAK,aAAA;AACH,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,IAAA,EAAM,wBAAA;AAAA,YACJ,KAAA,CAAM,IAAA;AAAA,YACN,MAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,GAAI,KAAA,CAAM,QAAA,KAAa,MAAA,GACnB;AAAA,YACE,QAAA,EAAU,qBAAA;AAAA,cACR,KAAA,CAAM,QAAA;AAAA,cACN,QAAA;AAAA,cACA,sBAAA;AAAA,cACA;AAAA;AACF,cAEF;AAAC,SACP;AAAA,MACF,KAAK,cAAA;AACH,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,IAAA,EAAM,wBAAA;AAAA,YACJ,KAAA,CAAM,IAAA;AAAA,YACN,MAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,GAAI,KAAA,CAAM,QAAA,KAAa,MAAA,GACnB;AAAA,YACE,QAAA,EAAU,qBAAA;AAAA,cACR,KAAA,CAAM,QAAA;AAAA,cACN,QAAA;AAAA,cACA,sBAAA;AAAA,cACA;AAAA;AACF,cAEF;AAAC,SACP;AAAA,MACF,KAAK,eAAA;AAAA,MACL,KAAK,gBAAA;AACH,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,GAAI,KAAA,CAAM,KAAA,KAAU,MAAA,GAChB;AAAA,YACE,KAAA,EAAO,eAAA;AAAA,cACL,KAAA,CAAM,KAAA;AAAA,cACN,QAAA;AAAA,cACA,sBAAA;AAAA,cACA;AAAA;AACF,cAEF;AAAC,SACP;AAAA,MACF,KAAK,kBAAA,EAAoB;AACvB,QAAA,MAAM,WAAA,GACJ,KAAA,CAAM,MAAA,KAAW,MAAA,GACb,qBAAA;AAAA,UACE,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO;AAAA,UACtB,QAAA;AAAA,UACA,sBAAA;AAAA,UACA;AAAA,SACF,GACA,MAAA;AACN,QAAA,MAAM,iBACJ,WAAA,KAAgB,MAAA,IAAa,OAAA,IAAW,WAAA,GACpC,YAAY,KAAA,GACZ,MAAA;AACN,QAAA,MAAM,gBAAA,GACJ,KAAA,CAAM,QAAA,KAAa,MAAA,GACf,qBAAA;AAAA,UACEA,SAAAA,CAAS,MAAM,QAAQ,CAAA,GAAI,MAAM,QAAA,GAAW,EAAE,KAAA,EAAO,KAAA,CAAM,QAAA,EAAS;AAAA,UACpE,QAAA;AAAA,UACA,sBAAA;AAAA,UACA;AAAA,SACF,GACA,MAAA;AACN,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,IAAA,EAAM,wBAAA;AAAA,YACJ,KAAA,CAAM,IAAA;AAAA,YACN,MAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,WAAA,EAAa,wBAAA;AAAA,YACX,KAAA,CAAM,WAAA;AAAA,YACN,aAAA;AAAA,YACA,sBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAE,MAAA,EAAQ,cAAA,KAAmB,EAAC;AAAA,UACjE,GAAI,gBAAA,KAAqB,MAAA,GAAY,EAAE,QAAA,EAAU,gBAAA,KAAqB;AAAC,SACzE;AAAA,MACF;AAAA,MACA;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF,CAAC,CAAA;AACH;AAMO,SAAS,sBAAA,CACd,MACA,OAAA,EACgB;AAChB,EAAA,MAAM,OAAA,GAAU,SAAS,gBAAA,IAAoB,OAAA;AAC7C,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,OAAO,UAAU,IAAI,CAAA;AAAA,EACvB;AAEA,EAAA,MAAM,QAAA,GAAW,wBAAwB,OAAO,CAAA;AAChD,EAAA,MAAM,EAAE,sBAAA,EAAwB,gBAAA,EAAiB,GAAI,wBAAA;AAAA,IACnD,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,SAAA,EAAW,QAAA,CAAS,WAAW,CAAA;AAE/D,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAE5B,EAAA,SAAS,KAAK,KAAA,EAA4B;AACxC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW;AACvC,QAAA,IAAA,CAAK,MAAM,UAAA,GAAa,qBAAA;AAAA,UACtB,KAAK,KAAA,CAAM,UAAA;AAAA,UACX,QAAA;AAAA,UACA,sBAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,MAAM,QAAQ,CAAA;AACnB,EAAA,OAAO,KAAA;AACT;;;AC3UA,IAAM,iBAAA,GAAoB;AAAA,EACxB,eAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,gBAAgB,GAAA,EAAsB;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAI,WAAA,EAAY;AAC1B,EAAA,KAAA,MAAW,KAAK,iBAAA,EAAmB;AACjC,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,IAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CAAW,OAAgB,SAAA,EAA4B;AACrE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,EAAA,IAAI,CAAA;AACJ,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,CAAA,GAAI,KAAA;AAAA,OAAA,IAC1B,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW,CAAA,GAAI,OAAO,KAAK,CAAA;AAAA,OAC7E,CAAA,GAAI,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA;AAChC,EAAA,IAAI,cAAc,MAAA,IAAa,SAAA,IAAa,CAAA,IAAK,CAAA,CAAE,SAAS,SAAA,EAAW;AACrE,IAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,MAAA,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,KAAA,EAAO,KAAK,EACpB,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CACrB,QAAQ,KAAA,EAAO,IAAI,CAAA,CACnB,OAAA,CAAQ,OAAO,GAAG,CAAA;AACvB;AAEO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,YAAY,CAAA;AACvD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAK,EAAG;AACrC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,YAAA,CAAa,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,UAAA,CAAW,OAAgB,MAAA,EAA0B;AACnE,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AACjC,EAAA,OAAO,MAAA,KAAW,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAClF;AAEO,SAAS,iBAAA,CACd,OACA,OAAA,EACyB;AACzB,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAC;AACjC,EAAA,MAAM,MAAA,GAAS,SAAS,SAAA,IAAa,GAAA;AACrC,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AACtC,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAK,EAAG;AAC3C,IAAA,IAAI,QAAA,IAAY,eAAA,CAAgB,GAAG,CAAA,EAAG;AACpC,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,YAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,QAAQ,QAAQ,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAA,EAAgB,MAAA,EAAgB,QAAA,EAA4B;AAChF,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AAAA,EACjE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAC3E,IAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI,GAAA,CAAI,KAAK,CAAA,QAAA,EAAM,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,MAAA,CAAQ,CAAA;AAC/D,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG;AAC9B,IAAA,IAAI,YAAY,eAAA,CAAgB,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA;AAAA,SAC1C,KAAA,CAAM,CAAC,CAAA,GAAI,YAAA,CAAa,EAAE,CAAC,CAAA,EAAG,QAAQ,QAAQ,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,IAAA,EAA+C;AAC3E,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,MAAA,KAAW,OAAO,CAAA,CAAE,MAAA;AAClE,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK,MAAA;AAAA,IAChB,cAAA,EAAgB,UAAA;AAAA,IAChB,WAAA,EAAa,KAAK,QAAA,CAAS,WAAA;AAAA,IAC3B,mBAAA,EAAqB,EAAE,GAAG,IAAA,CAAK,SAAS,mBAAA,EAAoB;AAAA,IAC5D,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,SAAS,KAAA;AAAM,GAClC;AACF;AAGO,SAAS,YAAY,IAAA,EAAqC;AAC/D,EAAA,MAAM,MAAqB,EAAC;AAC5B,EAAA,SAAS,KAAK,KAAA,EAA4B;AACxC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA,IAAI,EAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,EAAE,QAAQ,CAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAClB,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,SAAA,GAAyC;AACvD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAA;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,SAAA,EAAW,CAAA;AAAA,IACX,QAAA,EAAU,CAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS;AAAA,GACX;AACF;;;AC1IA,SAAS,cAAA,CAAe,KAAA,EAAsB,OAAA,GAAU,MAAA,EAAgB;AACtE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,WAAA,EAAc,OAAO,CAAA,EAAA,CAAI,CAAA;AAClD,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA;AACb,IAAA,MAAM,MAAA,GAAS,GAAG,MAAA,IAAU,GAAA;AAC5B,IAAA,MAAM,GAAA,GACJ,EAAA,CAAG,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA,GACxD,CAAA,EAAG,EAAA,CAAG,UAAU,CAAA,EAAA,CAAA,GAChB,GAAA;AACN,IAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,oBAAoB,UAAA,CAAW,EAAA,CAAG,IAAI,CAAC,+BAA+B,UAAA,CAAW,EAAA,CAAG,IAAI,CAAC,KAAK,UAAA,CAAW,MAAM,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,GAAG,CAAC,CAAA,QAAA;AAAA,KACtI;AACA,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,QAAA,EAAU,aAAa,CAAC,CAAA;AAAA,IACtD;AACA,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,EACpB;AACA,EAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,EAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB;AAEO,SAAS,UAAA,CAAW,MAAsB,OAAA,EAAgD;AAC/F,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AACpD,EAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,KAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,IAAA;AAChD,EAAA,MAAM,MAAA,GAAS,SAAS,kBAAA,IAAsB,GAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,IAAA,IAAQ,KAAK,KAAK,CAAA;AAEpD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,CAAA,wCAAA,EAA2C,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,iBAAA;AAAA,GACnE;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,IAAA,WAAA,CAAY,KAAK,CAAA,iCAAA,EAAoC,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,EACxF;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,sCAAsC,UAAA,CAAW,MAAA,CAAO,KAAK,MAAA,IAAU,SAAS,CAAC,CAAC,CAAA,UAAA;AAAA,GACpF;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,CAAA,uCAAA,EAA0C,IAAA,CAAK,UAAA,KAAe,MAAA,GAAY,UAAA,CAAW,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA,GAAI,QAAG,CAAA,UAAA;AAAA,GACrH;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,CAAA,sCAAA,EAAyC,IAAA,CAAK,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,OAAO,IAAA,CAAK,SAAS,CAAC,CAAA,GAAI,QAAG,CAAA,UAAA;AAAA,GAClH;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,CAAA,oCAAA,EAAuC,IAAA,CAAK,OAAA,KAAY,MAAA,GAAY,UAAA,CAAW,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,QAAG,CAAA,UAAA;AAAA,GAC5G;AACA,EAAA,WAAA,CAAY,IAAA;AAAA,IACV,2CAA2C,UAAA,CAAW,MAAA,CAAO,KAAK,QAAA,CAAS,WAAW,CAAC,CAAC,CAAA,UAAA;AAAA,GAC1F;AAEA,EAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,mBAAA;AACzB,IAAA,cAAA,IAAkB,kGAAA;AAClB,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,CAAE,MAAK,EAAG;AACtC,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,cAAA,IAAkB,WAAW,UAAA,CAAW,GAAG,CAAC,CAAA,SAAA,EAAY,EAAA,CAAG,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,IACjE;AACA,IAAA,cAAA,IAAkB,kBAAA;AAElB,IAAA,cAAA,IAAkB,0FAAA;AAClB,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA,CAAE,MAAK,EAAG;AACvD,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACjC,MAAA,IAAI,CAAA,GAAI,GAAG,cAAA,IAAkB,CAAA,QAAA,EAAW,WAAW,GAAG,CAAC,YAAY,CAAC,CAAA,UAAA,CAAA;AAAA,IACtE;AACA,IAAA,cAAA,IAAkB,kBAAA;AAAA,EACpB;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,WAAW,OAAO,CAAA;AAC5D,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,UAAA,IAAc,qBAAA;AACd,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,GAAA,GACJ,EAAE,KAAA,CAAM,UAAA,IAAc,OAAO,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,KAAA,KAAU,QAAA,GACtD,UAAA;AAAA,QACG,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,KAAA,CAA+B,OAAA;AAAA,QACnD;AAAA,OACF,GACA,EAAA;AACN,MAAA,UAAA,IAAc,eAAe,UAAA,CAAW,CAAA,CAAE,KAAA,CAAM,IAAI,CAAC,CAAA,WAAA,EAAc,UAAA,CAAW,CAAA,CAAE,KAAA,CAAM,OAAO,CAAC,CAAA,GAAA,EAAM,UAAA,CAAW,GAAA,IAAO,OAAO,CAAC,CAAA,KAAA,CAAA;AAAA,IAChI;AACA,IAAA,UAAA,IAAc,OAAA;AAAA,EAChB;AAEA,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,SAAA,IAAa,+BAAA;AACb,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzE,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,CAAA,CAAE,KAAA,CAAM,UAAA,EAAY;AAAA,QACpD,SAAA,EAAW,MAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA,SAAA,IAAa,CAAA,IAAA,EAAO,UAAA,CAAW,CAAA,CAAE,KAAA,CAAM,IAAI,CAAC,CAAA,uBAAA,EAA0B,UAAA,CAAW,UAAA,CAAW,OAAA,EAAS,IAAI,CAAC,CAAC,CAAA,MAAA,CAAA;AAAA,IAC7G;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAaZ,IAAA,EAAK;AAEL,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAKN,SAAS,CAAA;AAAA,OAAA,EACT,GAAG,CAAA;AAAA;AAAA;AAAA,8BAAA,EAGoB,SAAS,CAAA;AAAA;AAAA,EAEvC,eAAA,GAAkB,mDAAmD,WAAA,CAAY,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,EAAW,cAAc,CAAA,UAAA,CAAA,GAAe,EAAE;AAAA,6CAAA,EACtF,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,GAAI,eAAe,IAAA,CAAK,QAAQ,IAAI,2BAA2B,CAAA;AAAA,EACnI,UAAU;AAAA,EACV,SAAS;AAAA;AAAA;AAAA,OAAA,CAAA;AAKT,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,WAAA;AAAA,IACb,aAAA,EAAe,OAAA;AAAA,IACf;AAAA,GACF;AACF;;;ACtJA,SAAS,eAAA,CAAgB,KAAA,EAAsB,MAAA,GAAS,EAAA,EAAY;AAClE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,IAAA,GAAO,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,OAAO,eAAA,GAAQ,eAAA;AAC9B,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA;AACb,IAAA,MAAM,MAAA,GAAS,GAAG,MAAA,IAAU,GAAA;AAC5B,IAAA,MAAM,GAAA,GACJ,EAAA,CAAG,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA,GACxD,CAAA,EAAG,EAAA,CAAG,UAAU,CAAA,EAAA,CAAA,GAChB,GAAA;AACN,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,MAAM,CAAA,EAAG,MAAM,GAAG,cAAA,CAAe,EAAA,CAAG,IAAI,CAAC,KAAK,EAAA,CAAG,IAAI,KAAK,MAAM,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACzF,IAAA,MAAM,UAAA,GAAa,MAAA,IAAU,IAAA,GAAO,KAAA,GAAQ,UAAA,CAAA;AAC5C,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,CAAA,CAAE,QAAA,EAAU,UAAU,CAAA;AACvD,MAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,cAAA,CACd,MACA,OAAA,EACc;AACd,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,eAAA,GAAkB,SAAS,eAAA,IAAmB,IAAA;AACpD,EAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,KAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,IAAA;AAChD,EAAA,MAAM,MAAA,GAAS,SAAS,kBAAA,IAAsB,GAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,IAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAA;AACpC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,cAAA,CAAe,SAAS,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,8EAA8E,CAAA;AACzF,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,cAAA,CAAe,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,eAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAClF,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,cAAA,CAAe,MAAA,CAAO,KAAK,MAAA,IAAU,SAAS,CAAC,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,kBAAA,EAAqB,IAAA,CAAK,UAAA,KAAe,MAAA,GAAY,cAAA,CAAe,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,KACpG;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,KAAc,MAAA,GAAY,cAAA,CAAe,OAAO,IAAA,CAAK,SAAS,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,KACjG;AACA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,eAAA,EAAkB,IAAA,CAAK,OAAA,KAAY,MAAA,GAAY,cAAA,CAAe,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,GAAG,CAAA;AAAA,KAC3F;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAC5D,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,mBAAmB,CAAA,CAAE,MAAK,EAAG;AACrE,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,EAAA,EAAK,eAAe,GAAG,CAAC,MAAM,IAAA,CAAK,QAAA,CAAS,mBAAA,CAAoB,GAAG,CAAC,CAAA,EAAA;AAAA,OACtE;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA,CAAE,MAAK,EAAG;AACvD,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACjC,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,eAAe,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,IAC3D;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAC9B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA,GAAI;AAAA,GAC9D;AACA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,WAAW,OAAO,CAAA;AAC5D,EAAA,IAAI,aAAA,IAAiB,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,GAAA,GACJ,EAAE,KAAA,CAAM,UAAA,IAAc,OAAO,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,KAAA,KAAU,QAAA,GACtD,UAAA;AAAA,QACG,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,KAAA,CAA+B,OAAA;AAAA,QACnD;AAAA,OACF,GACA,EAAA;AACN,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,OAAO,cAAA,CAAe,CAAA,CAAE,KAAA,CAAM,IAAI,CAAC,CAAA,IAAA,EAAO,cAAA,CAAe,CAAA,CAAE,KAAA,CAAM,OAAO,CAAC,CAAA,GAAA,EAAM,cAAA,CAAe,GAAA,IAAO,OAAO,CAAC,CAAA;AAAA,OAC/G;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACzE,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,CAAA,CAAE,KAAA,CAAM,UAAA,EAAY;AAAA,QACpD,SAAA,EAAW,MAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,cAAA,CAAe,EAAE,KAAA,CAAM,IAAI,CAAC,CAAA,CAAE,CAAA;AAChD,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,IAAI,CAAC,CAAA;AACpC,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACxB,WAAA,EAAa,eAAA;AAAA,IACb,aAAA,EAAe,KAAA;AAAA,IACf;AAAA,GACF;AACF;ACpHA,SAAS,OAAA,CAAQ,MAAc,OAAA,EAAyB;AACtD,EAAA,OAAOD,uBAAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAO,IAAA,EAAM,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,UAAU,CAAC,CAAA;AAC5F;AAEA,SAAS,kBAAA,CACP,MACA,QAAA,EACuD;AACvD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,mBAAmB,KAAA,EAAM;AAAA,IACpC,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,mBAAmB,MAAA,EAAO;AAAA,IACrC,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,mBAAmB,OAAA,EAAQ;AAAA,IACtC,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,mBAAmB,WAAA,EAAY;AAAA,IAC1C,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,mBAAmB,OAAA,EAAQ;AAAA,IACtC,KAAK,UAAA;AACH,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,mEAAmE,sBAAsB,CAAA,EAAA;AAAA,OAC3F;AACA,MAAA,OAAO,EAAE,mBAAmB,OAAA,EAAQ;AAAA,IACtC,KAAK,QAAA;AACH,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,mEAAmE,sBAAsB,CAAA,EAAA;AAAA,OAC3F;AACA,MAAA,OAAO,EAAE,mBAAmB,SAAA,EAAU;AAAA,IACxC,KAAK,OAAA;AACH,MAAA,QAAA,CAAS,KAAK,CAAA,kDAAA,CAAoD,CAAA;AAClE,MAAA,OAAO,EAAE,mBAAmB,OAAA,EAAQ;AAAA,IACtC,KAAK,KAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,wCAAA,CAA0C,CAAA;AAC/D,MAAA,OAAO,EAAE,mBAAmB,OAAA,EAAQ;AAAA,IACtC;AACE,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAChE,MAAA,OAAO,EAAE,mBAAmB,SAAA,EAAU;AAAA;AAE5C;AAEO,SAAS,mBAAA,CACd,MACA,OAAA,EACc;AACd,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzB,gGAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,UAAU,OAAA,CAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,IAAI,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,SAAS,kBAAA,IAAsB,GAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,IAAA;AAElC,EAAA,MAAM,QAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,CAAA,IAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AACjC,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA;AACb,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,EAAA,CAAG,QAAA,GACrB,OAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,QAAQ,CAAA,CAAA,EAAI,CAAC,CAAA,GACzC,MAAA;AACJ,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAY,GAAG,CAAA;AAC7C,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAG,UAAA,KAAe,MAAA,IAAa,OAAO,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA,EAAG;AACjE,MAAA,KAAA,GAAQ,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,aAAa,GAAG,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,kBAAA,CAAmB,EAAA,CAAG,MAAM,QAAQ,CAAA;AAElE,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,yBAAA,EAA2B,iBAAA;AAAA,MAC3B,sBAAsB,EAAA,CAAG,IAAA;AAAA,MACzB,4BAA4B,EAAA,CAAG,UAAA;AAAA,MAC/B,2BAAA,EAA6B,GAAG,MAAA,CAAO,IAAA;AAAA,MACvC,wBAAwB,IAAA,CAAK,KAAA;AAAA,MAC7B,0BAA0B,EAAA,CAAG,OAAA;AAAA,MAC7B,sBAAA,EAAwB,GAAG,MAAA,IAAU;AAAA,KACvC;AACA,IAAA,IAAI,EAAA,CAAG,eAAe,MAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,2BAA2B,IAAI,EAAA,CAAG,UAAA;AAAA,IAC1C;AAEA,IAAA,MAAM,OAAO,EAAA,CAAG,UAAA;AAChB,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,IAAa,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AAC/D,MAAA,KAAA,CAAM,gBAAgB,IAAI,IAAA,CAAK,KAAA;AAAA,IACjC;AACA,IAAA,MAAM,SAAS,IAAA,EAAM,MAAA;AACrB,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,EAAM;AAC3D,MAAA,MAAM,MAAO,MAAA,CAA8B,KAAA;AAC3C,MAAA,MAAM,OAAQ,MAAA,CAA+B,MAAA;AAC7C,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,KAAA,CAAM,wBAAwB,CAAA,GAAI,GAAA;AAC/D,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,4BAA4B,CAAA,GAAI,IAAA;AAAA,IACtE;AAEA,IAAA,IAAI,iBAAA,IAAqB,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACzD,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,OAAA,EAAS;AACrC,QAAA,IAAI,MAAM,MAAA,IAAa,CAAA,KAAM,IAAA,IAAQ,OAAO,MAAM,QAAA,EAAU;AAC1D,UAAA,KAAA,CAAM,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAE,CAAA,GAChC,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,EAAA,CAAG,WAAW,OAAA,EAAS;AACzB,MAAA,MAAM,GAAA,GACJ,IAAA,IAAQ,OAAO,IAAA,CAAK,UAAU,QAAA,IAAY,IAAA,CAAK,KAAA,KAAU,IAAA,GACrD,MAAA,CAAQ,IAAA,CAAK,KAAA,CAA+B,OAAA,IAAW,OAAO,CAAA,GAC9D,OAAA;AACN,MAAA,MAAA,GAAS,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,IAC1D,CAAA,MAAA,IAAW,EAAA,CAAG,MAAA,KAAW,IAAA,EAAM;AAC7B,MAAA,MAAA,GAAS,EAAE,MAAM,IAAA,EAAK;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,EAAE,MAAM,OAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,cAAA,EAAgB,aAAA;AAAA,MAChB,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,oBAAA,EAAsB,OAAA;AAAA,MACtB,kBAAA,EAAoB,KAAA;AAAA,MACpB,UAAA,EAAY,KAAA;AAAA,MACZ;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,OAAA,GAA+B;AAAA,IACnC,QAAA,EAAU,eAAA;AAAA,IACV,MAAA,EAAQ,eAAA;AAAA,IACR,aAAA,EAAe,0BAAA;AAAA,IACf,OAAA,EAAS,sBAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,eAAA;AAAA,IACR,SAAS,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,MAAA,GAAS,IAAI,MAAS,CAAA;AAAA,IAC7D,WAAA,EAAa,kBAAA;AAAA,IACb,aAAA,EAAe,qBAAA;AAAA,IACf;AAAA,GACF;AACF;AC9KA,SAASE,QAAAA,CAAQ,MAAc,OAAA,EAAyB;AACtD,EAAA,OAAOF,uBAAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,OAAO,IAAA,EAAM,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,UAAU,CAAC,CAAA;AAC5F;AAEA,SAAS,UAAA,CAAW,KAAa,KAAA,EAAgE;AAC/F,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,WAAA,EAAa,OAAM,EAAE;AAC9C;AAEA,SAAS,OAAA,CAAQ,KAAa,KAAA,EAA6D;AACzF,EAAA,OAAO,EAAE,KAAK,KAAA,EAAO,EAAE,UAAU,MAAA,CAAO,KAAK,GAAE,EAAE;AACnD;AAMA,SAAS,mBAAmB,IAAA,EAAuC;AACjE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,kBAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEO,SAAS,cAAA,CACd,MACA,OAAA,EACc;AACd,EAAA,MAAM,QAAA,GAAqB;AAAA,IACzB,gIAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,UAAUE,QAAAA,CAAQ,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,IAAI,EAAE,CAAA;AACjD,EAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,SAAS,kBAAA,IAAsB,GAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,IAAA;AAElC,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,EAAA,MAAM,QAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,KAAK,CAAA,CAAE,KAAA;AACb,IAAA,MAAM,MAAA,GAASA,SAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA;AACvD,IAAA,MAAM,YAAA,GAAe,EAAA,CAAG,QAAA,GACpBA,QAAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,QAAQ,CAAA,CAAA,EAAI,CAAC,CAAA,GACzC,MAAA;AAEJ,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,EAAA,CAAG,SAAA,GAAY,GAAG,CAAC,CAAA;AACrD,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,GAAG,UAAA,KAAe,MAAA,IAAa,OAAO,QAAA,CAAS,EAAA,CAAG,UAAU,CAAA,EAAG;AACjE,MAAA,KAAA,GAAQ,MAAA,CAAO,KAAK,KAAA,CAAM,EAAA,CAAG,YAAY,GAAA,GAAM,EAAA,CAAG,UAAA,GAAa,GAAG,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,KAAA,GAAoB;AAAA,MACxB,UAAA,CAAW,oBAAA,EAAsB,EAAA,CAAG,IAAI,CAAA;AAAA,MACxC,UAAA,CAAW,0BAAA,EAA4B,EAAA,CAAG,UAAU,CAAA;AAAA,MACpD,UAAA,CAAW,2BAAA,EAA6B,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA;AAAA,MACtD,UAAA,CAAW,sBAAA,EAAwB,IAAA,CAAK,KAAK,CAAA;AAAA,MAC7C,UAAA,CAAW,wBAAA,EAA0B,EAAA,CAAG,OAAO,CAAA;AAAA,MAC/C,UAAA,CAAW,sBAAA,EAAwB,EAAA,CAAG,MAAA,IAAU,OAAO;AAAA,KACzD;AAEA,IAAA,IAAI,EAAA,CAAG,eAAe,MAAA,EAAW;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,2BAAA,EAA6B,EAAA,CAAG,UAAU,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,EAAA,GAAK,kBAAA,CAAmB,EAAA,CAAG,IAAI,CAAA;AACrC,IAAA,IAAI,OAAO,MAAA,EAAW;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,uBAAA,EAAyB,EAAE,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,OAAO,EAAA,CAAG,UAAA;AAChB,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,IAAa,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,WAAW,sBAAA,EAAwB,IAAA,CAAK,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAC,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,SAAS,IAAA,EAAM,MAAA;AACrB,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,EAAM;AAC3D,MAAA,MAAM,MAAO,MAAA,CAA8B,KAAA;AAC3C,MAAA,MAAM,OAAQ,MAAA,CAA+B,MAAA;AAC7C,MAAA,IAAI,OAAO,QAAQ,QAAA,EAAU,KAAA,CAAM,KAAK,OAAA,CAAQ,2BAAA,EAA6B,GAAG,CAAC,CAAA;AACjF,MAAA,IAAI,OAAO,SAAS,QAAA,EAAU,KAAA,CAAM,KAAK,OAAA,CAAQ,4BAAA,EAA8B,IAAI,CAAC,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI,iBAAA,IAAqB,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACzD,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,OAAA,EAAS;AACrC,QAAA,IAAI,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,SAAA,EAAW;AAC5E,UAAA,KAAA,CAAM,IAAA;AAAA,YACJ,UAAA;AAAA,cACE,yBAAyB,CAAC,CAAA,CAAA;AAAA,cAC1B,OAAO,MAAM,QAAA,GAAW,CAAA,CAAE,MAAM,CAAA,EAAG,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC;AAAA;AACvD,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,GAAa,mBAAA;AACjB,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,EAAA,CAAG,WAAW,OAAA,EAAS;AACzB,MAAA,UAAA,GAAa,mBAAA;AACb,MAAA,aAAA,GACE,QAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,IAAY,KAAK,KAAA,KAAU,IAAA,GACrD,MAAA,CAAQ,IAAA,CAAK,MAA+B,OAAA,IAAW,OAAO,EAAE,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,GAC/E,OAAA;AAAA,IACR,CAAA,MAAA,IAAW,EAAA,CAAG,MAAA,KAAW,IAAA,EAAM;AAC7B,MAAA,UAAA,GAAa,gBAAA;AAAA,IACf;AAEA,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,IAAA,EAAM,oBAAA;AAAA,MACN,iBAAA,EAAmB,OAAA;AAAA,MACnB,UAAA,EAAY,KAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,OAAA,EAAS,aAAA,KAAkB;AAAC;AAClE,KACF;AAEA,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,QAAA,CAAS,YAAA,GAAe,YAAA;AAAA,IAC1B;AACA,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,QAAA,CAAS,eAAA,GAAkB,KAAA;AAAA,IAC7B;AAEA,IAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,aAAA,EAAe;AAAA,MACb;AAAA,QACE,QAAA,EAAU;AAAA,UACR,UAAA,EAAY,CAAC,UAAA,CAAW,cAAA,EAAgB,eAAe,CAAC;AAAA,SAC1D;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,KAAA,EAAO,EAAE,IAAA,EAAM,eAAA,EAAgB;AAAA,YAC/B;AAAA;AACF;AACF;AACF;AACF,GACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,SAAS,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,MAAA,GAAS,IAAI,MAAS,CAAA;AAAA,IAC7D,WAAA,EAAa,kBAAA;AAAA,IACb,aAAA,EAAe,YAAA;AAAA,IACf;AAAA,GACF;AACF;;;ACxKA,IAAM,YAAA,GACJ,mGAAA;AAEK,SAAS,qBAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,QAAA,GAAqB,CAAC,YAAY,CAAA;AAExC,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,oBAAoB,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,KAAK,sDAAsD,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,0BAAA,CAA2B,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5C,MAAA,QAAA,CAAS,KAAK,uEAAkE,CAAA;AAAA,IAClF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAW,eAAA,EAAiB;AAC9B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,KAAK,wCAAwC,CAAA;AACpD,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,IAC/C;AACA,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AACzD,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,IAC/C;AACA,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,IAAI,CAAA,CAAE,WAAW,eAAA,EAAiB;AAChC,MAAA,MAAA,CAAO,KAAK,2DAA2D,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAAA,IAC/D;AACA,IAAA,QAAA,CAAS,KAAK,oEAAoE,CAAA;AAClF,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAChD,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,IAC/C;AACA,IAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,MAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAChD,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,IAC/C;AACA,IAAA,MAAM,CAAA,GAAI,MAAA;AACV,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,IACjE;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KACF;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,WAAW,CAAA,EAAG,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAAA,EAC7D;AAEA,EAAA,MAAA,CAAO,KAAK,CAAA,yBAAA,CAA2B,CAAA;AACvC,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAC/C;;;ACvEA,SAAS,sBAAsB,CAAA,EAA0B;AACvD,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,KAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAEA,SAAS,cACP,CAAA,EACoC;AACpC,EAAA,IAAI,CAAA,KAAM,QAAW,OAAO,SAAA;AAC5B,EAAA,IAAI,CAAA,KAAM,WAAW,OAAO,IAAA;AAC5B,EAAA,OAAO,OAAA;AACT;AAoBO,SAAS,2BAA2B,MAAA,EAAsC;AAC/E,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,aAAa,CAAA;AAC5D,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,KAAA,KAAU,aAAA,EAAe;AAC/C,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,EAAA,MAAM,UAAU,OAAA,CAAQ,IAAA;AAExB,EAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,eAAe,CAAA;AACrE,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AAE1D,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,SAAA,GAAY,SAAA;AAAA,EACd,CAAA,MAAA,IAAW,aAAA,CAAc,MAAA,KAAW,SAAA,EAAW;AAC7C,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,OAAA;AAAA,EACd;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,UACJ,aAAA,KAAkB,MAAA,IAAa,SAAA,KAAc,SAAA,GAAY,cAAc,OAAA,GAAU,MAAA;AACnF,EAAA,MAAM,UAAA,GACJ,kBAAkB,MAAA,IAAa,MAAA,CAAO,SAAS,aAAA,CAAc,UAAU,CAAA,GACnE,aAAA,CAAc,UAAA,GACd,MAAA;AAEN,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AAEvC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,cAAA,EAAgB;AAChC,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,KAAA,CAAM,GAAA,CAAI,EAAE,MAAA,EAAQ;AAAA,MAClB,IAAI,CAAA,CAAE,MAAA;AAAA,MACN,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,UAAU,CAAA,CAAE;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,gBAAA,EAAkB;AAClC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA;AACf,IAAA,GAAA,CAAI,UAAU,CAAA,CAAE,OAAA;AAChB,IAAA,GAAA,CAAI,aAAa,CAAA,CAAE,UAAA;AACnB,IAAA,IAAI,CAAA,CAAE,OAAO,OAAA,EAAS;AACpB,MAAA,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAElD,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,MAAA,EAAO,EAAG;AAChC,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AACvC,IAAA,MAAM,QAAiC,EAAE,GAAI,GAAA,CAAI,QAAA,IAAY,EAAC,EAAG;AACjE,IAAA,IAAI,GAAA,CAAI,OAAO,OAAA,EAAS;AACtB,MAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAAA,IACpB;AAEA,IAAA,MAAM,GAAA,GAAoB;AAAA,MACxB,SAAS,GAAA,CAAI,EAAA;AAAA,MACb,KAAA;AAAA,MACA,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAA;AAAA,MACA,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,MAAA;AAAA,MACA,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAAA,MACpD,UAAA,EAAY,UAAA;AAAA,MACZ,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,KAC3B;AAEA,IAAA,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,EAAC,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAgB,CAAA,KACnC,EAAE,KAAA,CAAM,SAAA,GAAY,EAAE,KAAA,CAAM,SAAA;AAE9B,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAA,CAAa,MAAA,EAAO,EAAG;AACxC,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,QAAA;AACvB,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9C,MAAA,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,CAAG,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAa,MAAA,EAAO,EAAG;AACrC,IAAA,CAAA,CAAE,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,EAAgB,KAAA,KAAkB;AACrD,IAAA,CAAA,CAAE,KAAA,GAAQ,KAAA;AACV,IAAA,KAAA,MAAW,KAAK,CAAA,CAAE,QAAA,EAAU,WAAA,CAAY,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,EACtD,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAEvC,EAAA,MAAM,mBAAA,GAAsB;AAAA,IAC1B,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,MAAM,QAAQ,SAAA,EAAU;AAExB,EAAA,SAAS,UAAU,KAAA,EAA4B;AAC7C,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,mBAAA,CAAoB,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,IAAK,CAAA;AAC3C,MAAA,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AACvB,MAAA,IAAI,EAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,SAAA,CAAU,EAAE,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,SAAA,CAAU,KAAK,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,KAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,aAAa,YAAA,CAAa,IAAA;AAAA,MAC1B,mBAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;ACpLO,SAAS,oBAAoB,OAAA,EAAuC;AACzE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,IAC5C,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,KAAA;AAAA,IAChD,aAAA,EAAe,QAAQ,aAAA,IAAiB,IAAA;AAAA,IACxC,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,IAC1B,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,IAC9B,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,GAAA;AAAA,IAClD,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB;AAAA,GAChD;AACF;AAMO,SAAS,aAAA,CAAc,MAAsB,OAAA,EAAsC;AACxF,EAAA,MAAM,IAAA,GAAO,oBAAoB,OAAO,CAAA;AACxC,EAAA,MAAM,UAAA,GACJ,IAAA,CAAK,gBAAA,KAAqB,OAAA,GACtB,IAAA,GACA,sBAAA,CAAuB,IAAA,EAAM,EAAE,gBAAA,EAAkB,IAAA,CAAK,gBAAA,EAAkB,CAAA;AAC9E,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,UAAA;AACH,MAAA,OAAO,cAAA,CAAe,YAAY,IAAI,CAAA;AAAA,IACxC,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,YAAY,IAAI,CAAA;AAAA,IACpC,KAAK,eAAA;AACH,MAAA,OAAO,mBAAA,CAAoB,YAAY,IAAI,CAAA;AAAA,IAC7C,KAAK,WAAA;AACH,MAAA,OAAO,cAAA,CAAe,YAAY,IAAI,CAAA;AAAA,IACxC,SAAS;AACP,MAAA,MAAM,KAAY,IAAA,CAAK,MAAA;AACvB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA;AAEJ;AAEO,SAAS,eAAe,MAAA,EAA8C;AAC3E,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,MAAA,CAAO,MAAA,EAAQ,OAAO,OAAO,CAAA;AAChE,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,UAAU,CAAC,GAAG,OAAO,QAAA,EAAU,GAAG,KAAK,QAAQ;AAAA,GACjD;AACF;;;ACdO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAK,GAAA,EAAQ;AACf,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,KAAK,IAAA,EAAW;AAClB,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,IAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC;;;AC/CO,IAAM,aAAA,GAAgB,MAAA;AAGKC,qBAAA,CAAK,IAAA;AAAA,EACrCC,oBAAG,MAAA,EAAO;AAAA,EACV,eAAA;AAAA,EACA;AACF;AAgBO,SAASC,gBAAe,EAAA,EAAoB;AACjD,EAAA,OAAO,eAAiB,EAAE,CAAA;AAC5B;AAMO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,SAAS,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG;AAC7B,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,EAAA,MAAM,EAAA,GAAK,OAAO,CAAA,CAAE,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAC3C;;;ACNA,SAAS,OAAO,CAAA,EAAyB;AACvC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,SAAS,CAAC,CAAA;AACnD;AAEA,SAAS,kBACP,QAAA,EACwC;AACxC,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,MAAA;AACtD,EAAA,MAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,EAAA,MAAM,mBAAmB,QAAA,CAAS,gBAAA;AAClC,EAAA,MAAM,oBAAoB,QAAA,CAAS,iBAAA;AACnC,EAAA,IACE,CAAC,MAAA,CAAO,UAAU,CAAA,IAClB,CAAC,MAAA,CAAO,gBAAgB,CAAA,IACxB,CAAC,MAAA,CAAO,iBAAiB,CAAA,EACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO;AAAA,IACL,GAAI,MAAA,CAAO,UAAU,IAAI,EAAE,UAAA,KAAe,EAAC;AAAA,IAC3C,GAAI,MAAA,CAAO,gBAAgB,IAAI,EAAE,gBAAA,KAAqB,EAAC;AAAA,IACvD,GAAI,MAAA,CAAO,iBAAiB,IAAI,EAAE,iBAAA,KAAsB;AAAC,GAC3D;AACF;AAEA,SAAS,gBACP,QAAA,EACwC;AACxC,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,UAAU,OAAO,MAAA;AACtD,EAAA,MAAM,MAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,GAAA,IAAO;AAAA,IAChB,eAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI;AAC5C,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAEO,SAAS,gBAAA,CACd,MAAA,EACA,OAAA,GAA2B,EAAC,EACf;AACb,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AAAA,IACrB,CAAC,CAAA,KAA4B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC3C;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,IACvB,CAAC,CAAA,KAA8B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC7C;AACA,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAEpD,EAAA,MAAM,KAAA,GACJ,OAAA,EAAS,KAAA,IACT,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,OAAQ,CAAA,CAAyB,KAAA,KAAU,QAAQ,CAAA,EAClE,KAAA,IACJ,aAAA;AAEF,EAAA,MAAM,QAAA,GACJ,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAC/B,OAAA,CAAQ,SAAA,GACR,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GACjC,QAAQ,SAAA,GACR,MAAA;AAER,EAAA,MAAM,MAAA,GAA8B,aAAA,GAChC,aAAA,CAAc,MAAA,GACd,UACE,SAAA,GACA,SAAA;AAEN,EAAA,MAAM,KAAA,uBAAY,GAAA,EAWhB;AAEF,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,cAAA,EAAgB;AAC9B,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,MAAA,EAAQ;AAAA,QAClB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAW,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,QACjD,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,CAAA,CAAE;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,gBAAA,EAAkB;AAClC,IAAA,MAAM,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA;AAChB,IAAA,IAAI,OAAO,CAAA,CAAE,UAAU,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA,CAAE,UAAA;AAAA,EAChD;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAA2B;AAC/C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACpC,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,IAAA,MAAM,SAAS,IAAA,CAAK,QAAA;AACpB,IAAA,IACE,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,CAAO,IAAA,EAAK,KAAM,EAAA,IAClB,CAAC,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EACjB;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA;AACxB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,KAAM,YAAA,CAAa,MAAM,IAAI,CAAC,CAAA;AACjD,IAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA;AACxB,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,CAAC,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACzC,IAAA,MAAM,QAAA,GACJ,QAAA,KAAa,MAAA,IAAa,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,SAAA,GAAY,QAAQ,CAAA,GAClC,CAAA;AACN,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAA;AAAA,MACA,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,KAAA,EAAO,aAAa,MAAM,CAAA;AAAA,MAC1B,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,QAAA;AAAA,MACA,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,OAAA,EAAS,EAAE,MAAA,KAAW,OAAA;AAAA,MACtB,SAAA,EAAW,iBAAA,CAAkB,CAAA,CAAE,QAAQ;AAAA,KACxC,CAAA;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,EACvB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,CAClC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,UAAA,IAAc,CAAA,KAAM,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,CAAA;AAC3D,IAAA,MAAM,UAAU,IAAI,GAAA;AAAA,MAClB,MAAA,CAAO,MAAM,CAAA,EAAG,QAAQ,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM;AAAA,KAC/C;AACA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,QAAQ,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,IAAK,IAAA,GAAO,IAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA,EACE,OAAO,OAAA,EAAS,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,GACzD,OAAA,CAAQ,IAAA,GACR,MAAA;AAAA,IACN,MAAA;AAAA,IACA,SAAA,EAAW,QAAA;AAAA,IACX,SACE,aAAA,IAAiB,MAAA,CAAO,cAAc,OAAO,CAAA,GACzC,cAAc,OAAA,GACd,MAAA;AAAA,IACN,YACE,aAAA,IAAiB,MAAA,CAAO,cAAc,UAAU,CAAA,GAC5C,cAAc,UAAA,GACd,MAAA;AAAA,IACN,WAAA,EAAa,eAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,cAAA,CACd,QAAA,EACA,OAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AACzD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AACtC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,QAAA,CAAS,cAAc,MAAA,EAAW;AACpC,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,eAAA,CAAgB,QAAA,CAAS,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,IAAI,QAAA,CAAS,eAAe,MAAA,EAAW;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAaA,eAAAA,CAAe,QAAA,CAAS,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,CAC9C,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,OAAO,MAAM,QAAQ,CAAA,CACvC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,wBAAwB,CAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC1C,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,EAAQ,OAAO,EAAE,IAAA,KAAS,IAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,OAAA,CAAQ,KAAA,KAAU,MAAA,GACd,yCAAA,GACA;AAAA,KACN;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,GAAO,SAAA,GAAY,EAAA;AACpC,IAAA,MAAM,OAAA,GACJ,EAAE,IAAA,KAAS,KAAA,GAAQ,QAAQ,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,CAAA,CAAE,IAAA;AAC5D,IAAA,MAAM,MACJ,CAAA,CAAE,UAAA,KAAe,SAAYA,eAAAA,CAAe,CAAA,CAAE,UAAU,CAAA,GAAI,GAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,GAAU,QAAA,GAAW,EAAA;AACnC,IAAA,MAAM,GAAA,GAAMA,eAAAA,CAAe,CAAA,CAAE,QAAQ,CAAA;AACrC,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,GAAG,IAAI,GAAG,CAAA,CAAA;AAC/D,IAAA,IAAI,CAAA,CAAE,SAAA,EAAW,UAAA,KAAe,MAAA,EAAW;AACzC,MAAA,IAAA,IAAQ,CAAA,QAAA,EAAW,CAAA,CAAE,SAAA,CAAU,UAAU,CAAA,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,CAAA,CAAE,SAAA,EAAW,gBAAA,KAAqB,MAAA,EAAW;AAC/C,MAAA,IAAA,IAAQ,CAAA,QAAA,EAAWA,eAAAA,CAAe,CAAA,CAAE,SAAA,CAAU,gBAAgB,CAAC,CAAA,CAAA;AAAA,IACjE;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AC/RA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,SAAS,CAAC,CAAA;AACnD;AA4JA,SAAS,0BAA0B,KAAA,EAAiC;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,QAAA,CAAS,KAAK,KAAK,KAAA,IAAS,CAAA;AACzE;AAEO,SAAS,gBAAgB,MAAA,EAAkC;AAChE,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AAAA,IACrB,CAAC,CAAA,KAA4B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC3C;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,IACvB,CAAC,CAAA,KAA8B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC7C;AACA,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAEpD,EAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAW,OAAO,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA,EAAG,KAAA,IAAS,aAAA;AAE/F,EAAA,MAAM,IAAA,GACJ,OAAO,OAAA,EAAS,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,GACzD,OAAA,CAAQ,IAAA,GACR,MAAA;AAEN,EAAA,MAAM,MAAA,GAA8B,aAAA,GAChC,aAAA,CAAc,MAAA,GACd,UACE,SAAA,GACA,SAAA;AAEN,EAAA,MAAM,aACJ,aAAA,IAAiB,cAAA,CAAe,cAAc,UAAU,CAAA,GACpD,cAAc,UAAA,GACd,MAAA;AAEN,EACE,OAAA,IAAW,cAAA,CAAe,QAAQ,SAAS,CAAA,GACvC,QAAQ,SAAA,GACR;AAEN,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AAEvC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,cAAA,EAAgB;AAC9B,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,KAAA,CAAM,GAAA,CAAI,EAAE,MAAA,EAAQ;AAAA,QAClB,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,WAAA,EACE,yBAAA,CAA0B,CAAA,CAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA,GAC/C,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,KAAA,GAClB,MAAA;AAAA,QACN,YAAA,EACE,yBAAA,CAA0B,CAAA,CAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA,GAChD,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,MAAA,GAClB,MAAA;AAAA,QACN,WAAA,EAAa,yBAAA,CAA0B,CAAA,CAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAA,GAC5D,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,KAAA,GAClB,MAAA;AAAA,QACJ,YAAA,EAAc,yBAAA,CAA0B,CAAA,CAAE,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA,GAC9D,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,MAAA,GAClB;AAAA,OACL,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,gBAAA,EAAkB;AAChC,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA;AACnC,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,QAAA,CAAS,SAAS,CAAA,CAAE,MAAA;AACpB,MAAA,QAAA,CAAS,aAAa,CAAA,CAAE,UAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAA2B;AAC/C,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACpC,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,OAAO,CAAA;AAClB,IAAA,MAAM,SAAS,IAAA,CAAK,QAAA;AACpB,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,IAAA,EAAK,KAAM,EAAA,IAAM,CAAC,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5E,MAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA;AACxB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,KAAM,YAAA,CAAa,MAAM,IAAI,CAAC,CAAA;AACjD,IAAA,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA;AACxB,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AACrC,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO,QAAA,IAAY,CAAA;AAAA,SAAA,IACzB,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,SAAA,IAAa,CAAA;AAAA,SACpC,UAAA,IAAc,CAAA;AAEnB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS,UAAA,IAAc,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,aAAa,EAAE,CAAA;AAC7B,IAAA,IAAI,KAAA,GAAQ,UAAU,QAAA,GAAW,KAAA;AAEjC,IAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,OAAO,QAAA,CAAS,CAAA,CAAE,UAAU,CAAA,EAAG;AACrE,MAAA,IAAI,CAAC,WAAA,IAAe,CAAA,CAAE,UAAA,GAAa,YAAY,UAAA,EAAY;AACzD,QAAA,WAAA,GAAc,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,YAAY,CAAA,CAAE,UAAA,EAAY,IAAA,EAAM,CAAA,CAAE,IAAA,EAAK;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,IACE,CAAA,CAAE,WAAA,KAAgB,MAAA,IAClB,CAAA,CAAE,YAAA,KAAiB,MAAA,IACnB,CAAA,CAAE,WAAA,KAAgB,MAAA,IAClB,CAAA,CAAE,YAAA,KAAiB,MAAA,EACnB;AACA,MAAA,iBAAA,IAAqB,CAAA;AACrB,MAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,EAAW,gBAAA,IAAoB,CAAA,CAAE,WAAA;AACvD,MAAA,IAAI,CAAA,CAAE,YAAA,KAAiB,MAAA,EAAW,iBAAA,IAAqB,CAAA,CAAE,YAAA;AAEzD,MAAA,IAAI,CAAA,CAAE,gBAAgB,MAAA,EAAW;AAC/B,QAAA,gBAAA,IAAoB,CAAA,CAAE,WAAA;AACtB,QAAA,mBAAA,IAAuB,CAAA;AAAA,MACzB,WAAW,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAa,CAAA,CAAE,iBAAiB,MAAA,EAAW;AACtE,QAAA,gBAAA,IAAoB,CAAA,CAAE,cAAc,CAAA,CAAE,YAAA;AACtC,QAAA,mBAAA,IAAuB,CAAA;AAAA,MACzB;AAEA,MAAA,IAAI,CAAA,CAAE,iBAAiB,MAAA,EAAW;AAChC,QAAA,iBAAA,IAAqB,CAAA,CAAE,YAAA;AACvB,QAAA,eAAA,GAAkB,IAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAsB;AAAA,IAC1B,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,IACrC,GAAI,oBAAoB,CAAA,GACpB;AAAA,MACE,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,gBAAA;AAAA,QACP,MAAA,EAAQ,iBAAA;AAAA,QACR,GAAI,mBAAA,KAAwB,iBAAA,GACxB,EAAE,KAAA,EAAO,gBAAA,KACT,EAAC;AAAA,QACL,GAAI,eAAA,GAAkB,EAAE,MAAA,EAAQ,iBAAA,KAAsB;AAAC;AACzD,QAEF;AAAC,GACP;AAIA,EAAA,OAAO,OAAA;AACT;;;ACzTA,SAASC,iBACP,QAAA,EACsC;AACtC,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,MAAM,MAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,GAAA,IAAO;AAAA,IAChB,eAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACpD,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,MAAA;AAC7C;AAEA,SAAS,YAAY,OAAA,EAAiC;AACpD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,IAAA,CAAM,CAAA;AAC9D,EAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,KAAA,CAAO,CAAA;AACjE,EAAA,IAAI,OAAA,CAAQ,aAAa,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAA,MAAA,CAAQ,CAAA;AACpE,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,YAAY,OAAA,EAAiC;AACpD,EAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,IAAA,OAAO,OAAA,CAAQ,UAAA,GAAa,CAAA,GACxB,sCAAA,GACA,yBAAA;AAAA,EACN;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,OAAA,EAAS;AAC9B,IAAA,IAAI,OAAA,CAAQ,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,MAAM,KAAA,GAAQ,QAAQ,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3D,MAAA,MAAM,MAAA,GACJ,OAAA,CAAQ,eAAA,CAAgB,MAAA,GAAS,CAAA,GAC7B,MAAM,OAAA,CAAQ,eAAA,CAAgB,MAAA,GAAS,CAAC,CAAA,MAAA,CAAA,GACxC,EAAA;AACN,MAAA,OAAO,CAAA,mBAAA,EAAsB,KAAK,CAAA,EAAG,MAAM,CAAA,CAAA,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,OAAO,CAAA,YAAA,EAAe,QAAQ,eAAe,CAAA,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,IAAA,OAAO,8CAAA;AAAA,EACT;AACA,EAAA,OAAO,0DAAA;AACT;AAMO,SAAS,oBAAoB,MAAA,EAAsC;AACxE,EAAA,MAAM,IAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AAAA,IACrB,CAAC,CAAA,KAA4B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC3C;AACA,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,IACvB,CAAC,CAAA,KAA8B,CAAA,CAAE,KAAA,KAAU;AAAA,GAC7C;AACA,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAEpD,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,cAAA,EAAgB;AAC9B,MAAA,MAAM,CAAA,GAAI,CAAA;AACV,MAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,IAChC;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,gBAAA,EAAkB;AAChC,MAAA,MAAM,EAAA,GAAK,CAAA;AACX,MAAA,IAAI,EAAA,CAAG,WAAW,OAAA,EAAS;AACzB,QAAA,eAAA,CAAgB,KAAK,SAAA,CAAU,GAAA,CAAI,GAAG,MAAM,CAAA,IAAK,GAAG,MAAM,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,WAAA,EAAaA,gBAAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AAAA,IAC9C,eAAA;AAAA,IACA,eAAA,EAAiB,eAAe,KAAA,EAAO;AAAA,GACzC;AACF;AAUO,SAAS,aAAA,CACd,OAAA,EACA,OAAA,GAA6B,EAAC,EACtB;AACR,EAAA,MAAM,eAAA,GAAkB,QAAQ,WAAA,KAAgB,KAAA;AAChD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,KAAA;AACtC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAE3B,EAAA,MAAM,WACJ,OAAA,CAAQ,UAAA,KAAe,SAAYD,eAAAA,CAAe,OAAA,CAAQ,UAAU,CAAA,GAAI,QAAA;AAC1E,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAM,CAAA,gBAAA,EAAgB,QAAQ,CAAA,aAAA,EAAa,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,WAAA,CAAY,OAAO,CAAC,CAAA,CAAA;AAAA,GAC3G;AAEA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,GAAA,CAAA;AAAA,MAC5B,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,IAAA;AAAA,KAC/B;AACA,IAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,KAAA,KAAU,MAAA,EAAW;AAC3C,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,MAAA,KAAW,MAAA,EAAW;AAC5C,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IACxD;AACA,IAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,eAAA,IAAmB,QAAQ,WAAA,EAAa;AAC1C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,CAAQ,YAAY,aAAA,EAAe;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,WAAA,CAAY,aAAa,CAAA,CAAE,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,SAAA,EAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,UAAA,EAAY;AAClC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,WAAA,CAAY,OAAO,CAAC,CAAA,CAAE,CAAA;AAE7C,EAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,UAAA,GAAa,CAAA,EAAG;AACjD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,SAAA,EAAY,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAA,EAAA,EAAKA,eAAAA,CAAe,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,YAAY,IAAI,CAAA,CAAA;AAAA,KACtH;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AChJO,IAAM,oBAAA,GAAuB,kBAAA;;;ACtCpC,SAAS,yBAAyB,KAAA,EAA4E;AAC5G,EAAA,OAAO;AAAA,IACL,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,GAAI,MAAM,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,GAAI,EAAC;AAAA,IACnE,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI,EAAC;AAAA,IAC7D,GAAI,MAAM,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GAAI,EAAC;AAAA,IAC7D,GAAI,MAAM,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAS,GAAI,EAAC;AAAA,IACnE,YAAY,KAAA,CAAM;AAAA,GACpB;AACF;AAkCO,SAAS,+BAA+B,MAAA,EAAkD;AAC/F,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,UAAU,oBAAA,EAAsB;AACxC,MAAA,GAAA,CAAI,IAAA,CAAK,wBAAA,CAAyB,KAA2D,CAAC,CAAA;AAAA,IAChG;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AACvF;AAaO,SAAS,0BAA0B,QAAA,EAA8D;AACtG,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,OAAO,QAAA,CAAS,MAAA;AAAA,IAChB,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,CAAC,GAAG,QAAQ;AAAA,GACxB;AACA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,IAAK,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,OAAA;AACT;;;ACnGO,SAAS,+BAA+B,OAAA,EAAyC;AACtF,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,OAAO,6CAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,CAAA,UAAA,EAAa,QAAQ,OAAO,CAAA,CAAA,CAAA;AAAA,IACnI,EAAA;AAAA,IACA,0CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,QAAQ,QAAA,EAAU;AACtC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,KAAK,OAAA,CAAQ,IAAI,CAAA,GAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,GAAA,EAAM,OAAA,CAAQ,WAAA,CAAY,OAAA,CAAQ,OAAO,KAAK,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,UAAU,GAAG,CAAA,EAAA;AAAA,KACjH;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAmBO,SAAS,2BAA2B,OAAA,EAAyC;AAClF,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,OAAO,oDAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAClB,GAAA,CAAI,CAAC,OAAA,KAA6B;AACjC,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KACX,CAAA,CAAE,WAAW,GAAA,EAAK,OAAO,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,MAAM,CAAA,CAAE,UAAA,CAAW,KAAK,MAAM,CAAA;AAC3E,IAAA,OAAO,CAAA,QAAA,EAAW,IAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,SAAA,EAAY,GAAA,CAAI,QAAQ,MAAM,CAAC,YAAY,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAC,CAAA,SAAA,EAAY,IAAI,OAAA,CAAQ,MAAA,IAAU,GAAG,CAAC,CAAA,UAAA,CAAA;AAAA,EAC9I,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,aAAa,OAAA,CAAQ,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,MAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAa,QAAQ,OAAO,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAO,6GAA6G,IAAI,CAAA,gBAAA,CAAA;AAChQ;;;ACjBA,SAAS,WAAA,CACP,QACA,OAAA,EACgB;AAChB,EAAA,MAAM,IAAA,GAAO,2BAA2B,MAAM,CAAA;AAC9C,EAAA,OAAO,OAAA,KAAY,UACf,IAAA,GACA,sBAAA,CAAuB,MAAM,EAAE,gBAAA,EAAkB,SAAS,CAAA;AAChE;AAEA,SAAS,mBAAA,CAAoB,SAAiB,OAAA,EAAyB;AACrE,EAAA,MAAM,MAAA,GAAS,MAAM,OAAO,CAAA,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAClC,EAAA,IAAI,GAAA,GAAM,GAAG,OAAO,EAAA;AACpB,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,EAAQ;AACpC;AAEA,SAAS,mBAAA,CAAoB,OAAA,EAAiB,KAAA,EAAe,GAAA,EAAqB;AAChF,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AACtC,EAAA,IAAI,QAAA,GAAW,GAAG,OAAO,EAAA;AACzB,EAAA,MAAM,SAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAW,MAAM,MAAM,CAAA;AAC3D,EAAA,IAAI,MAAA,GAAS,CAAA,EAAG,OAAO,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AACvC;AAEA,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAUtB,IAAA,EAAK;AAMA,SAAS,cAAA,CACd,QACA,OAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,QAAQ,gBAAA,IAAoB,OAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,KAAA;AACnC,EAAA,MAAM,UAAA,GAAa,2BAA2B,MAAA,EAAQ;AAAA,IACpD,gBAAA,EAAkB;AAAA,GACnB,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,yBAAA;AAAA,IACf,+BAA+B,UAAU;AAAA,GAC3C;AACA,EAAA,MAAM,oBAAA,GAAuB,+BAA+B,QAAQ,CAAA;AACpE,EAAA,MAAM,gBAAA,GAAmB,2BAA2B,QAAQ,CAAA;AAE5D,EAAA,IAAI,YAAY,cAAA,EAAgB;AAC9B,IAAA,IAAI,OAAA,CAAQ,WAAW,UAAA,EAAY;AACjC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,CAAA;;AAAA,EAA2B,oBAAoB;AAAA,CAAA;AAAA,QACxD,WAAA,EAAa,eAAA;AAAA,QACb,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,CAAA,mGAAA,EAAsG,eAAe,CAAA,+CAAA,EAAkD,gBAAgB,CAAA,cAAA,CAAA;AAAA,MAChM,WAAA,EAAa,WAAA;AAAA,MACb,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,oBAAoB,UAAU,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,cAAc,WAAA,EAAa;AAAA,IAC1C,WAAA,EAAa,QAAQ,WAAA,KAAgB;AAAA,GACtC,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,gBAAA,CAAiB,UAAU,CAAC,CAAA;AAChE,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,UAAA,EAAY,OAAO,CAAA;AAE5C,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,eAAA,EAAiB,KAAA;AAAA,IACjB,iBAAA,EAAmB,QAAQ,iBAAA,KAAsB,IAAA;AAAA,IACjD,aAAA,EAAe,QAAQ,aAAA,KAAkB,KAAA;AAAA,IACzC,QAAA,EAAU,IAAA;AAAA,IAEV,kBAAA,EAAoB;AAAA,GACtB;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,UAAA,EAAY;AACjC,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,UAAU,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,MAAA,CAAO,OAAA,EAAS,gBAAgB,CAAA;AACjE,IAAA,MAAME,MAAAA,GAAQ,cAAA,CAAe,WAAA,CAAY,IAAA,IAAQ,YAAY,KAAK,CAAA;AAClE,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,0BAA0BA,MAAK,CAAA,CAAA;AAAA,MAC/B,EAAA;AAAA,MACA,8EAAA;AAAA,MACA,EAAA;AAAA,MACA,kBAAA;AAAA,MACA,EAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,EAAA;AAAA,MACA,aAAA;AAAA,MACA,EAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,EAAA;AAAA,MACA,sBAAA;AAAA,MACA,EAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,CAAM,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,mBAAA,EAAqB,EAAA,EAAI,YAAA,EAAc,EAAE,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,MACxB,WAAA,EAAa,eAAA;AAAA,MACb,aAAA,EAAe;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,WAAA,CAAY,IAAA,IAAQ,YAAY,KAAK,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,mBAAA;AAAA,IAClB,QAAA,CAAS,OAAA;AAAA,IACT,wBAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,MAAM,gBAAA,GAAmB,SAAS,OAAA,CAAQ,QAAA;AAAA,IACxC;AAAA,MAEE,+BAAA,GACA,UAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,iBAAiB,CAAA,GAC7D,mBAAA,CAAoB,QAAA,CAAS,OAAA,EAAS,iBAAA,EAAmB,gBAAgB,CAAA,GACzE,EAAA;AACJ,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,+BAA+B,CAAA,GAC1E,mBAAA;AAAA,IACE,QAAA,CAAS,OAAA;AAAA,IACT,+BAAA;AAAA,IACA;AAAA,GACF,GACA,EAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAKe,KAAK,CAAA;AAAA,OAAA,EAC1B,eAAe,CAAA;AAAA;AAAA;AAAA,iCAAA,EAGW,KAAK,CAAA;AAAA;AAAA,iDAAA,EAEW,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,gDAAA,EACrB,UAAA,CAAW,YAAY,CAAC,CAAA;AAAA,wDAAA,EAChB,gBAAgB,CAAA;AAAA,EACxE,eAAe,kFAAoF;AAAA,EACnG,aAAa;AAAA,EACb,YAAY;AAAA;AAAA;AAAA,OAAA,CAAA;AAKZ,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,WAAA;AAAA,IACb,aAAA,EAAe;AAAA,GACjB;AACF","file":"exporters.cjs","sourcesContent":["/**\n * v0.7 local export formats. No sinks — string output only.\n */\n\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\nimport type { RedactionProfile } from \"../types.js\";\n\nexport type ExportFormat = \"markdown\" | \"html\" | \"openinference\" | \"otlp-json\";\n\nexport interface ExportOptions {\n format: ExportFormat;\n includeMetadata?: boolean;\n includeAttributes?: boolean;\n includeErrors?: boolean;\n pretty?: boolean;\n redacted?: boolean;\n maxAttributeLength?: number;\n /**\n * Redaction preset for exported copies. Default `local`.\n * `share` and `strict` apply stronger key-based redaction before rendering.\n */\n redactionProfile?: RedactionProfile;\n}\n\nexport interface ExportResult {\n format: ExportFormat;\n content: string;\n contentType: string;\n fileExtension: string;\n warnings: string[];\n}\n\nexport interface ExportValidationResult {\n ok: boolean;\n format: ExportFormat;\n errors: string[];\n warnings: string[];\n}\n\nexport interface TraceExporter {\n name: string;\n format: ExportFormat;\n export(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult;\n validate?(content: string): ExportValidationResult;\n}\n\n/** Library version string embedded in JSON exports (human-readable, not semver guarantee for formats). */\nexport const EXPORT_PAYLOAD_VERSION = \"0.1.2\";\n","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 { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport { Redactor } from \"../logs/redactor.js\";\nimport {\n applyProfileMetadataCaps,\n resolveRedactionProfile,\n truncateStringForProfile,\n} from \"../redaction-profiles.js\";\nimport type { ErrorInfo, RedactionProfile, TraceEvent } from \"../types.js\";\n\nexport interface RedactRunTreeForExportOptions {\n redactionProfile?: RedactionProfile;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepClone(item)) as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = deepClone(v);\n }\n return out as T;\n}\n\nfunction boundAttributeValues(\n record: Record<string, unknown>,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n seen: WeakSet<object>,\n depth: number,\n): Record<string, unknown> {\n if (depth > 32) {\n return { truncated: true, reason: \"maxDepth\" };\n }\n\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n out[key] = boundValue(value, key, maxMetadataValueLength, maxPreviewLength, seen, depth);\n }\n return out;\n}\n\nfunction boundValue(\n value: unknown,\n key: string,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n seen: WeakSet<object>,\n depth: number,\n): unknown {\n if (value === null || typeof value !== \"object\") {\n if (typeof value === \"string\") {\n return truncateStringForProfile(\n value,\n key,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n }\n return value;\n }\n\n if (seen.has(value)) return \"[Circular]\";\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value\n .slice(0, 50)\n .map((item, index) =>\n boundValue(\n item,\n String(index),\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n depth + 1,\n ),\n );\n }\n\n return boundAttributeValues(\n value as Record<string, unknown>,\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n depth + 1,\n );\n}\n\nfunction redactEventAttributes(\n attrs: Record<string, unknown> | undefined,\n redactor: Redactor,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n): Record<string, unknown> | undefined {\n if (!attrs || Object.keys(attrs).length === 0) {\n return attrs;\n }\n\n const redacted = redactor.redactRecord(attrs);\n const seen = new WeakSet<object>();\n const bounded = boundAttributeValues(\n redacted,\n maxMetadataValueLength,\n maxPreviewLength,\n seen,\n 0,\n );\n\n const err = bounded.error;\n if (isRecord(err) && typeof err.message === \"string\") {\n bounded.error = {\n ...err,\n message: truncateStringForProfile(\n err.message,\n \"message\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(typeof err.stack === \"string\"\n ? {\n stack: truncateStringForProfile(\n err.stack,\n \"stack\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n }\n\n return bounded;\n}\n\nfunction redactErrorInfo(\n error: ErrorInfo | undefined,\n redactor: Redactor,\n maxMetadataValueLength: number,\n maxPreviewLength: number,\n): ErrorInfo | undefined {\n if (error === undefined) return undefined;\n\n const record = redactEventAttributes(\n { error },\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n const redacted = record?.error;\n if (!isRecord(redacted) || typeof redacted.message !== \"string\") {\n return undefined;\n }\n\n return {\n message: redacted.message,\n ...(typeof redacted.stack === \"string\" ? { stack: redacted.stack } : {}),\n };\n}\n\n/**\n * Returns structured trace-event copies that are safe to use across every report section.\n * Profile redaction and bounds are applied before any human-readable rendering.\n */\nexport function redactTraceEventsForReport(\n events: readonly TraceEvent[],\n options?: RedactRunTreeForExportOptions,\n): TraceEvent[] {\n const profile = options?.redactionProfile ?? \"local\";\n if (profile === \"local\") {\n return deepClone(events) as TraceEvent[];\n }\n\n const resolved = resolveRedactionProfile(profile);\n const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n 2000,\n 500,\n resolved,\n );\n const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n return events.map((event): TraceEvent => {\n switch (event.event) {\n case \"run_started\":\n return {\n ...event,\n name: truncateStringForProfile(\n event.name,\n \"name\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(event.metadata !== undefined\n ? {\n metadata: redactEventAttributes(\n event.metadata,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n case \"step_started\":\n return {\n ...event,\n name: truncateStringForProfile(\n event.name,\n \"name\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(event.metadata !== undefined\n ? {\n metadata: redactEventAttributes(\n event.metadata,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n case \"run_completed\":\n case \"step_completed\":\n return {\n ...event,\n ...(event.error !== undefined\n ? {\n error: redactErrorInfo(\n event.error,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n }\n : {}),\n };\n case \"outcome_observed\": {\n const actualAttrs =\n event.actual !== undefined\n ? redactEventAttributes(\n { value: event.actual },\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n )\n : undefined;\n const redactedActual =\n actualAttrs !== undefined && \"value\" in actualAttrs\n ? actualAttrs.value\n : undefined;\n const redactedEvidence =\n event.evidence !== undefined\n ? redactEventAttributes(\n isRecord(event.evidence) ? event.evidence : { value: event.evidence },\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n )\n : undefined;\n return {\n ...event,\n name: truncateStringForProfile(\n event.name,\n \"name\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n expectation: truncateStringForProfile(\n event.expectation,\n \"expectation\",\n maxMetadataValueLength,\n maxPreviewLength,\n ),\n ...(redactedActual !== undefined ? { actual: redactedActual } : {}),\n ...(redactedEvidence !== undefined ? { evidence: redactedEvidence } : {}),\n };\n }\n default:\n return event;\n }\n });\n}\n\n/**\n * Returns a deep copy of `tree` with profile-based redaction applied to event attributes.\n * Does not mutate the input tree.\n */\nexport function redactRunTreeForExport(\n tree: InspectRunTree,\n options?: RedactRunTreeForExportOptions,\n): InspectRunTree {\n const profile = options?.redactionProfile ?? \"local\";\n if (profile === \"local\") {\n return deepClone(tree);\n }\n\n const resolved = resolveRedactionProfile(profile);\n const { maxMetadataValueLength, maxPreviewLength } = applyProfileMetadataCaps(\n 2000,\n 500,\n resolved,\n );\n const redactor = new Redactor({ extraKeys: resolved.extraKeys });\n\n const clone = deepClone(tree);\n\n function walk(nodes: InspectNode[]): void {\n for (const node of nodes) {\n if (node.event.attributes !== undefined) {\n node.event.attributes = redactEventAttributes(\n node.event.attributes,\n redactor,\n maxMetadataValueLength,\n maxPreviewLength,\n );\n }\n if (node.children.length > 0) {\n walk(node.children);\n }\n }\n }\n\n walk(clone.children);\n return clone;\n}\n","import type { InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nconst REDACT_SUBSTRINGS = [\n \"authorization\",\n \"cookie\",\n \"token\",\n \"apikey\",\n \"password\",\n \"secret\",\n \"email\",\n] as const;\n\nfunction shouldRedactKey(key: string): boolean {\n const k = key.toLowerCase();\n for (const s of REDACT_SUBSTRINGS) {\n if (k.includes(s)) return true;\n }\n return false;\n}\n\nexport function safeString(value: unknown, maxLength?: number): string {\n if (value === null || value === undefined) return \"\";\n let s: string;\n if (typeof value === \"string\") s = value;\n else if (typeof value === \"number\" || typeof value === \"boolean\") s = String(value);\n else s = stableJson(value, false);\n if (maxLength !== undefined && maxLength >= 0 && s.length > maxLength) {\n return `${s.slice(0, maxLength)}…`;\n }\n return s;\n}\n\n/** Escape markdown table pipes and normalize line breaks for safe inline text. */\nexport function escapeMarkdown(value: string): string {\n return value\n .replace(/\\|/g, \"\\\\|\")\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n .replace(/\\n/g, \" \");\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sortKeysDeep(input: unknown): unknown {\n if (input === null || typeof input !== \"object\") return input;\n if (Array.isArray(input)) return input.map(sortKeysDeep);\n const o = input as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(o).sort()) {\n out[k] = sortKeysDeep(o[k]);\n }\n return out;\n}\n\nexport function stableJson(value: unknown, pretty?: boolean): string {\n const sorted = sortKeysDeep(value);\n return pretty === true ? JSON.stringify(sorted, null, 2) : JSON.stringify(sorted);\n}\n\nexport function compactAttributes(\n attrs: Record<string, unknown> | undefined,\n options?: { maxLength?: number; redacted?: boolean },\n): Record<string, unknown> {\n if (attrs === undefined) return {};\n const maxLen = options?.maxLength ?? 500;\n const redacted = options?.redacted ?? true;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(attrs).sort()) {\n if (redacted && shouldRedactKey(key)) {\n out[key] = \"[REDACTED]\";\n continue;\n }\n const v = attrs[key];\n out[key] = compactValue(v, maxLen, redacted);\n }\n return out;\n}\n\nfunction compactValue(value: unknown, maxLen: number, redacted: boolean): unknown {\n if (value === null || typeof value !== \"object\") {\n return typeof value === \"string\" ? safeString(value, maxLen) : value;\n }\n if (Array.isArray(value)) {\n const arr = value.slice(0, 20).map((x) => compactValue(x, maxLen, redacted));\n if (value.length > 20) arr.push(`…(+${value.length - 20} more)`);\n return arr;\n }\n const o = value as Record<string, unknown>;\n const inner: Record<string, unknown> = {};\n for (const k of Object.keys(o)) {\n if (redacted && shouldRedactKey(k)) inner[k] = \"[REDACTED]\";\n else inner[k] = compactValue(o[k], maxLen, redacted);\n }\n return inner;\n}\n\nexport function summarizeTree(tree: InspectRunTree): Record<string, unknown> {\n const flat = flattenTree(tree);\n const errorNodes = flat.filter((n) => n.event.status === \"error\").length;\n return {\n runId: tree.runId,\n name: tree.name,\n status: tree.status,\n startedAt: tree.startedAt,\n endedAt: tree.endedAt,\n durationMs: tree.durationMs,\n stepCount: flat.length,\n errorStepCount: errorNodes,\n totalEvents: tree.metadata.totalEvents,\n confidenceBreakdown: { ...tree.metadata.confidenceBreakdown },\n kinds: { ...tree.metadata.kinds },\n };\n}\n\n/** Depth-first pre-order flatten (matches typical tree display). */\nexport function flattenTree(tree: InspectRunTree): InspectNode[] {\n const out: InspectNode[] = [];\n function walk(nodes: InspectNode[]): void {\n for (const n of nodes) {\n out.push(n);\n if (n.children.length > 0) walk(n.children);\n }\n }\n walk(tree.children);\n return out;\n}\n\nexport function zeroKinds(): Record<InspectKind, number> {\n return {\n RUN: 0,\n AGENT: 0,\n LLM: 0,\n TOOL: 0,\n CHAIN: 0,\n RETRIEVER: 0,\n DECISION: 0,\n RESULT: 0,\n ERROR: 0,\n LOGIC: 0,\n LOG: 0,\n OUTCOME: 0,\n };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n compactAttributes,\n escapeHtml,\n flattenTree,\n safeString,\n stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeHtml(nodes: InspectNode[], ulClass = \"tree\"): string {\n if (nodes.length === 0) return \"\";\n const parts: string[] = [`<ul class=\"${ulClass}\">`];\n for (const n of nodes) {\n const ev = n.event;\n const status = ev.status ?? \"?\";\n const dur =\n ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n ? `${ev.durationMs}ms`\n : \"-\";\n parts.push(\"<li>\");\n parts.push(\n `<span class=\"nm\">${escapeHtml(ev.name)}</span> <span class=\"meta\">[${escapeHtml(ev.kind)}] ${escapeHtml(status)} (${escapeHtml(dur)})</span>`,\n );\n if (n.children.length > 0) {\n parts.push(renderTreeHtml(n.children, \"tree nested\"));\n }\n parts.push(\"</li>\");\n }\n parts.push(\"</ul>\");\n return parts.join(\"\");\n}\n\nexport function exportHtml(tree: InspectRunTree, options?: Partial<ExportOptions>): ExportResult {\n const warnings: string[] = [];\n const includeMetadata = options?.includeMetadata ?? true;\n const includeAttributes = options?.includeAttributes ?? false;\n const includeErrors = options?.includeErrors ?? true;\n const maxLen = options?.maxAttributeLength ?? 500;\n const redacted = options?.redacted ?? true;\n\n const titleName = escapeHtml(tree.name ?? tree.runId);\n\n const summaryRows: string[] = [];\n summaryRows.push(\n `<tr><th scope=\"row\">runId</th><td><code>${escapeHtml(tree.runId)}</code></td></tr>`,\n );\n if (tree.name !== undefined) {\n summaryRows.push(`<tr><th scope=\"row\">name</th><td>${escapeHtml(tree.name)}</td></tr>`);\n }\n summaryRows.push(\n `<tr><th scope=\"row\">status</th><td>${escapeHtml(String(tree.status ?? \"unknown\"))}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">durationMs</th><td>${tree.durationMs !== undefined ? escapeHtml(String(tree.durationMs)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">startedAt</th><td>${tree.startedAt !== undefined ? escapeHtml(String(tree.startedAt)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">endedAt</th><td>${tree.endedAt !== undefined ? escapeHtml(String(tree.endedAt)) : \"—\"}</td></tr>`,\n );\n summaryRows.push(\n `<tr><th scope=\"row\">totalEvents</th><td>${escapeHtml(String(tree.metadata.totalEvents))}</td></tr>`,\n );\n\n let confidenceHtml = \"\";\n if (includeMetadata) {\n const cb = tree.metadata.confidenceBreakdown;\n confidenceHtml += \"<h3>Confidence breakdown</h3><table><thead><tr><th>bucket</th><th>count</th></tr></thead><tbody>\";\n for (const k of Object.keys(cb).sort()) {\n const key = k as keyof typeof cb;\n confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${cb[key]}</td></tr>`;\n }\n confidenceHtml += \"</tbody></table>\";\n\n confidenceHtml += \"<h3>Kind breakdown</h3><table><thead><tr><th>kind</th><th>count</th></tr></thead><tbody>\";\n for (const k of Object.keys(tree.metadata.kinds).sort()) {\n const key = k as keyof typeof tree.metadata.kinds;\n const c = tree.metadata.kinds[key];\n if (c > 0) confidenceHtml += `<tr><td>${escapeHtml(key)}</td><td>${c}</td></tr>`;\n }\n confidenceHtml += \"</tbody></table>\";\n }\n\n const flat = flattenTree(tree);\n const errors = flat.filter((n) => n.event.status === \"error\");\n let errorsHtml = \"\";\n if (includeErrors && errors.length > 0) {\n errorsHtml += \"<h2>Errors</h2><ul>\";\n for (const n of errors) {\n const msg =\n n.event.attributes && typeof n.event.attributes.error === \"object\"\n ? safeString(\n (n.event.attributes.error as { message?: string }).message,\n maxLen,\n )\n : \"\";\n errorsHtml += `<li><strong>${escapeHtml(n.event.name)}</strong> (${escapeHtml(n.event.eventId)}): ${escapeHtml(msg || \"error\")}</li>`;\n }\n errorsHtml += \"</ul>\";\n }\n\n let attrsHtml = \"\";\n if (includeAttributes) {\n attrsHtml += \"<h2>Attributes (bounded)</h2>\";\n for (const n of flat) {\n if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n const compact = compactAttributes(n.event.attributes, {\n maxLength: maxLen,\n redacted,\n });\n attrsHtml += `<h3>${escapeHtml(n.event.name)}</h3><pre class=\"json\">${escapeHtml(stableJson(compact, true))}</pre>`;\n }\n warnings.push(\n \"Attributes may still contain sensitive data; review exports before sharing.\",\n );\n }\n\n const css = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\ntable{border-collapse:collapse;margin:0.75rem 0}\nth,td{border:1px solid #ccc;padding:0.35rem 0.6rem;text-align:left}\nth{background:#f5f5f5}\npre.json{background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.85rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>${titleName}</title>\n<style>${css}</style>\n</head>\n<body>\n<header><h1>AgentInspect Run: ${titleName}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect.</p>\n${includeMetadata ? `<section class=\"summary\"><h2>Summary</h2><table>${summaryRows.join(\"\")}</table>${confidenceHtml}</section>` : \"\"}\n<section class=\"tree\"><h2>Execution tree</h2>${tree.children.length > 0 ? renderTreeHtml(tree.children) : \"<p>No steps recorded.</p>\"}</section>\n${errorsHtml}\n${attrsHtml}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n return {\n format: \"html\",\n content: html,\n contentType: \"text/html\",\n fileExtension: \".html\",\n warnings,\n };\n}\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport {\n compactAttributes,\n escapeMarkdown,\n flattenTree,\n safeString,\n stableJson,\n} from \"./helpers.js\";\n\nfunction renderTreeAscii(nodes: InspectNode[], indent = \"\"): string {\n const lines: string[] = [];\n for (let i = 0; i < nodes.length; i++) {\n const n = nodes[i]!;\n const last = i === nodes.length - 1;\n const branch = last ? \"└─ \" : \"├─ \";\n const ev = n.event;\n const status = ev.status ?? \"?\";\n const dur =\n ev.durationMs !== undefined && Number.isFinite(ev.durationMs)\n ? `${ev.durationMs}ms`\n : \"-\";\n lines.push(`${indent}${branch}${escapeMarkdown(ev.name)} [${ev.kind}] ${status} (${dur})`);\n const nextIndent = indent + (last ? \" \" : \"│ \");\n if (n.children.length > 0) {\n const childStr = renderTreeAscii(n.children, nextIndent);\n if (childStr.length > 0) lines.push(childStr);\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport function exportMarkdown(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [];\n const includeMetadata = options?.includeMetadata ?? true;\n const includeAttributes = options?.includeAttributes ?? false;\n const includeErrors = options?.includeErrors ?? true;\n const maxLen = options?.maxAttributeLength ?? 500;\n const redacted = options?.redacted ?? true;\n\n const titleName = tree.name ?? tree.runId;\n const lines: string[] = [];\n lines.push(`# AgentInspect Run: ${escapeMarkdown(titleName)}`);\n lines.push(\"\");\n lines.push(\"Generated locally by AgentInspect. Review for sensitive data before sharing.\");\n lines.push(\"\");\n\n if (includeMetadata) {\n lines.push(\"## Summary\");\n lines.push(\"\");\n lines.push(`- **runId**: ${escapeMarkdown(tree.runId)}`);\n if (tree.name !== undefined) lines.push(`- **name**: ${escapeMarkdown(tree.name)}`);\n lines.push(`- **status**: ${escapeMarkdown(String(tree.status ?? \"unknown\"))}`);\n lines.push(\n `- **durationMs**: ${tree.durationMs !== undefined ? escapeMarkdown(String(tree.durationMs)) : \"-\"}`,\n );\n lines.push(\n `- **startedAt**: ${tree.startedAt !== undefined ? escapeMarkdown(String(tree.startedAt)) : \"-\"}`,\n );\n lines.push(\n `- **endedAt**: ${tree.endedAt !== undefined ? escapeMarkdown(String(tree.endedAt)) : \"-\"}`,\n );\n lines.push(`- **totalEvents**: ${tree.metadata.totalEvents}`);\n lines.push(\"\");\n lines.push(\"### Confidence breakdown\");\n lines.push(\"\");\n lines.push(\"| bucket | count |\");\n lines.push(\"| --- | --- |\");\n for (const k of Object.keys(tree.metadata.confidenceBreakdown).sort()) {\n const key = k as keyof typeof tree.metadata.confidenceBreakdown;\n lines.push(\n `| ${escapeMarkdown(key)} | ${tree.metadata.confidenceBreakdown[key]} |`,\n );\n }\n lines.push(\"\");\n lines.push(\"### Kind breakdown\");\n lines.push(\"\");\n lines.push(\"| kind | count |\");\n lines.push(\"| --- | --- |\");\n for (const k of Object.keys(tree.metadata.kinds).sort()) {\n const key = k as keyof typeof tree.metadata.kinds;\n const c = tree.metadata.kinds[key];\n if (c > 0) lines.push(`| ${escapeMarkdown(key)} | ${c} |`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Execution tree\");\n lines.push(\"\");\n lines.push(\"```text\");\n lines.push(\n tree.children.length > 0 ? renderTreeAscii(tree.children) : \"(no steps)\",\n );\n lines.push(\"```\");\n lines.push(\"\");\n\n const flat = flattenTree(tree);\n const errors = flat.filter((n) => n.event.status === \"error\");\n if (includeErrors && errors.length > 0) {\n lines.push(\"## Errors\");\n lines.push(\"\");\n for (const n of errors) {\n const msg =\n n.event.attributes && typeof n.event.attributes.error === \"object\"\n ? safeString(\n (n.event.attributes.error as { message?: string }).message,\n maxLen,\n )\n : \"\";\n lines.push(\n `- **${escapeMarkdown(n.event.name)}** (${escapeMarkdown(n.event.eventId)}): ${escapeMarkdown(msg || \"error\")}`,\n );\n }\n lines.push(\"\");\n }\n\n if (includeAttributes) {\n lines.push(\"## Attributes (bounded)\");\n lines.push(\"\");\n for (const n of flat) {\n if (!n.event.attributes || Object.keys(n.event.attributes).length === 0) continue;\n const compact = compactAttributes(n.event.attributes, {\n maxLength: maxLen,\n redacted,\n });\n lines.push(`### ${escapeMarkdown(n.event.name)}`);\n lines.push(\"\");\n lines.push(\"```json\");\n lines.push(stableJson(compact, true));\n lines.push(\"```\");\n lines.push(\"\");\n }\n warnings.push(\n \"Attributes may still contain sensitive data; review exports before sharing.\",\n );\n }\n\n return {\n format: \"markdown\",\n content: lines.join(\"\\n\"),\n contentType: \"text/markdown\",\n fileExtension: \".md\",\n warnings,\n };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind, InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\nexport interface OpenInferenceSpan {\n trace_id: string;\n span_id: string;\n parent_span_id?: string;\n name: string;\n start_time_unix_nano: number;\n end_time_unix_nano?: number;\n attributes: Record<string, unknown>;\n status?: {\n code: \"OK\" | \"ERROR\" | \"UNSET\";\n message?: string;\n };\n}\n\nexport interface OpenInferenceExport {\n exporter: \"agent-inspect\";\n format: \"openinference\";\n compatibility: \"openinference-compatible\";\n version: string;\n trace_id: string;\n spans: OpenInferenceSpan[];\n warnings: string[];\n}\n\nfunction hexFrom(seed: string, byteLen: number): string {\n return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\nfunction mapInspectKindToOI(\n kind: InspectKind,\n warnings: string[],\n): { openInferenceKind: string; ambiguousNote?: string } {\n switch (kind) {\n case \"LLM\":\n return { openInferenceKind: \"LLM\" };\n case \"TOOL\":\n return { openInferenceKind: \"TOOL\" };\n case \"CHAIN\":\n return { openInferenceKind: \"CHAIN\" };\n case \"RETRIEVER\":\n return { openInferenceKind: \"RETRIEVER\" };\n case \"AGENT\":\n return { openInferenceKind: \"AGENT\" };\n case \"DECISION\":\n warnings.push(\n `Ambiguous kind DECISION mapped to CHAIN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n );\n return { openInferenceKind: \"CHAIN\" };\n case \"RESULT\":\n warnings.push(\n `Ambiguous kind RESULT mapped to UNKNOWN for span compatibility (${EXPORT_PAYLOAD_VERSION}).`,\n );\n return { openInferenceKind: \"UNKNOWN\" };\n case \"ERROR\":\n warnings.push(`ERROR kind mapped to CHAIN for span compatibility.`);\n return { openInferenceKind: \"CHAIN\" };\n case \"LOG\":\n case \"LOGIC\":\n case \"RUN\":\n warnings.push(`${kind} mapped to CHAIN for span compatibility.`);\n return { openInferenceKind: \"CHAIN\" };\n default:\n warnings.push(`Unhandled InspectKind ${kind} mapped to UNKNOWN.`);\n return { openInferenceKind: \"UNKNOWN\" };\n }\n}\n\nexport function exportOpenInference(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [\n \"OpenInference-compatible JSON export is experimental until verified against specific backends.\",\n \"This file was generated locally and not sent anywhere.\",\n ];\n\n const traceId = hexFrom(`trace:${tree.runId}`, 16);\n const includeAttributes = options?.includeAttributes ?? false;\n const maxLen = options?.maxAttributeLength ?? 500;\n const pretty = options?.pretty ?? true;\n\n const spans: OpenInferenceSpan[] = [];\n\n for (const n of flattenTree(tree)) {\n const ev = n.event;\n const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n const parentSpanHex = ev.parentId\n ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n : undefined;\n const startNs = Math.round(ev.timestamp * 1e6);\n let endNs: number | undefined;\n if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n endNs = startNs + Math.round(ev.durationMs * 1e6);\n }\n\n const { openInferenceKind } = mapInspectKindToOI(ev.kind, warnings);\n\n const attrs: Record<string, unknown> = {\n \"openinference.span.kind\": openInferenceKind,\n \"agent_inspect.kind\": ev.kind,\n \"agent_inspect.confidence\": ev.confidence,\n \"agent_inspect.source.type\": ev.source.type,\n \"agent_inspect.run_id\": tree.runId,\n \"agent_inspect.event_id\": ev.eventId,\n \"agent_inspect.status\": ev.status ?? \"unset\",\n };\n if (ev.durationMs !== undefined) {\n attrs[\"agent_inspect.duration_ms\"] = ev.durationMs;\n }\n\n const meta = ev.attributes;\n if (meta?.model !== undefined && typeof meta.model === \"string\") {\n attrs[\"llm.model_name\"] = meta.model;\n }\n const tokens = meta?.tokens;\n if (tokens && typeof tokens === \"object\" && tokens !== null) {\n const inp = (tokens as { input?: number }).input;\n const outp = (tokens as { output?: number }).output;\n if (typeof inp === \"number\") attrs[\"llm.token_count.prompt\"] = inp;\n if (typeof outp === \"number\") attrs[\"llm.token_count.completion\"] = outp;\n }\n\n if (includeAttributes && meta && typeof meta === \"object\") {\n for (const [k, v] of Object.entries(meta)) {\n if (k === \"tokens\" || k === \"model\") continue;\n if (v !== undefined && v !== null && typeof v !== \"object\") {\n attrs[`agent_inspect.preview.${k}`] =\n typeof v === \"string\" ? v.slice(0, maxLen) : v;\n }\n }\n }\n\n let status: OpenInferenceSpan[\"status\"];\n if (ev.status === \"error\") {\n const msg =\n meta && typeof meta.error === \"object\" && meta.error !== null\n ? String((meta.error as { message?: string }).message ?? \"error\")\n : \"error\";\n status = { code: \"ERROR\", message: msg.slice(0, maxLen) };\n } else if (ev.status === \"ok\") {\n status = { code: \"OK\" };\n } else {\n status = { code: \"UNSET\" };\n }\n\n spans.push({\n trace_id: traceId,\n span_id: spanId,\n parent_span_id: parentSpanHex,\n name: ev.name,\n start_time_unix_nano: startNs,\n end_time_unix_nano: endNs,\n attributes: attrs,\n status,\n });\n }\n\n const payload: OpenInferenceExport = {\n exporter: \"agent-inspect\",\n format: \"openinference\",\n compatibility: \"openinference-compatible\",\n version: EXPORT_PAYLOAD_VERSION,\n trace_id: traceId,\n spans,\n warnings,\n };\n\n return {\n format: \"openinference\",\n content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n contentType: \"application/json\",\n fileExtension: \".openinference.json\",\n warnings,\n };\n}\n","import crypto from \"node:crypto\";\n\nimport type { InspectKind } from \"../types/inspect-event.js\";\nimport type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult } from \"./types.js\";\nimport { flattenTree } from \"./helpers.js\";\n\nfunction hexFrom(seed: string, byteLen: number): string {\n return crypto.createHash(\"sha256\").update(seed, \"utf8\").digest(\"hex\").slice(0, byteLen * 2);\n}\n\nfunction stringAttr(key: string, value: string): { key: string; value: { stringValue: string } } {\n return { key, value: { stringValue: value } };\n}\n\nfunction intAttr(key: string, value: number): { key: string; value: { intValue: string } } {\n return { key, value: { intValue: String(value) } };\n}\n\ntype OtlpAttr =\n | ReturnType<typeof stringAttr>\n | ReturnType<typeof intAttr>;\n\nfunction genAiOperationName(kind: InspectKind): string | undefined {\n switch (kind) {\n case \"LLM\":\n return \"generate_content\";\n case \"TOOL\":\n return \"execute_tool\";\n case \"AGENT\":\n return \"invoke_agent\";\n default:\n return undefined;\n }\n}\n\nexport function exportOtlpJson(\n tree: InspectRunTree,\n options?: Partial<ExportOptions>,\n): ExportResult {\n const warnings: string[] = [\n \"OTLP JSON export uses OTel GenAI-aligned attributes where applicable; experimental until verified against specific collectors.\",\n \"Not OTLP gRPC/protobuf — JSON mapping only. Generated locally; no network upload.\",\n ];\n\n const traceId = hexFrom(`trace:${tree.runId}`, 16);\n const includeAttributes = options?.includeAttributes ?? false;\n const maxLen = options?.maxAttributeLength ?? 500;\n const pretty = options?.pretty ?? true;\n\n const flat = flattenTree(tree);\n const spans: Record<string, unknown>[] = [];\n\n for (const n of flat) {\n const ev = n.event;\n const spanId = hexFrom(`${tree.runId}:${ev.eventId}`, 8);\n const parentSpanId = ev.parentId\n ? hexFrom(`${tree.runId}:${ev.parentId}`, 8)\n : undefined;\n\n const startNs = String(Math.round(ev.timestamp * 1e6));\n let endNs: string | undefined;\n if (ev.durationMs !== undefined && Number.isFinite(ev.durationMs)) {\n endNs = String(Math.round(ev.timestamp * 1e6 + ev.durationMs * 1e6));\n }\n\n const attrs: OtlpAttr[] = [\n stringAttr(\"agent_inspect.kind\", ev.kind),\n stringAttr(\"agent_inspect.confidence\", ev.confidence),\n stringAttr(\"agent_inspect.source.type\", ev.source.type),\n stringAttr(\"agent_inspect.run_id\", tree.runId),\n stringAttr(\"agent_inspect.event_id\", ev.eventId),\n stringAttr(\"agent_inspect.status\", ev.status ?? \"unset\"),\n ];\n\n if (ev.durationMs !== undefined) {\n attrs.push(intAttr(\"agent_inspect.duration_ms\", ev.durationMs));\n }\n\n const op = genAiOperationName(ev.kind);\n if (op !== undefined) {\n attrs.push(stringAttr(\"gen_ai.operation.name\", op));\n }\n\n const meta = ev.attributes;\n if (meta?.model !== undefined && typeof meta.model === \"string\") {\n attrs.push(stringAttr(\"gen_ai.request.model\", meta.model.slice(0, maxLen)));\n }\n\n const tokens = meta?.tokens;\n if (tokens && typeof tokens === \"object\" && tokens !== null) {\n const inp = (tokens as { input?: number }).input;\n const outp = (tokens as { output?: number }).output;\n if (typeof inp === \"number\") attrs.push(intAttr(\"gen_ai.usage.input_tokens\", inp));\n if (typeof outp === \"number\") attrs.push(intAttr(\"gen_ai.usage.output_tokens\", outp));\n }\n\n if (includeAttributes && meta && typeof meta === \"object\") {\n for (const [k, v] of Object.entries(meta)) {\n if (k === \"tokens\" || k === \"model\") continue;\n if (typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\") {\n attrs.push(\n stringAttr(\n `agent_inspect.preview.${k}`,\n typeof v === \"string\" ? v.slice(0, maxLen) : String(v),\n ),\n );\n }\n }\n }\n\n let statusCode = \"STATUS_CODE_UNSET\";\n let statusMessage: string | undefined;\n if (ev.status === \"error\") {\n statusCode = \"STATUS_CODE_ERROR\";\n statusMessage =\n meta && typeof meta.error === \"object\" && meta.error !== null\n ? String((meta.error as { message?: string }).message ?? \"error\").slice(0, maxLen)\n : \"error\";\n } else if (ev.status === \"ok\") {\n statusCode = \"STATUS_CODE_OK\";\n }\n\n const spanJson: Record<string, unknown> = {\n traceId,\n spanId,\n name: ev.name,\n kind: \"SPAN_KIND_INTERNAL\",\n startTimeUnixNano: startNs,\n attributes: attrs,\n status: {\n code: statusCode,\n ...(statusMessage !== undefined ? { message: statusMessage } : {}),\n },\n };\n\n if (parentSpanId !== undefined) {\n spanJson.parentSpanId = parentSpanId;\n }\n if (endNs !== undefined) {\n spanJson.endTimeUnixNano = endNs;\n }\n\n spans.push(spanJson);\n }\n\n const payload = {\n resourceSpans: [\n {\n resource: {\n attributes: [stringAttr(\"service.name\", \"agent-inspect\")],\n },\n scopeSpans: [\n {\n scope: { name: \"agent-inspect\" },\n spans,\n },\n ],\n },\n ],\n };\n\n return {\n format: \"otlp-json\",\n content: JSON.stringify(payload, null, pretty ? 2 : undefined),\n contentType: \"application/json\",\n fileExtension: \".otlp.json\",\n warnings,\n };\n}\n","import type { ExportFormat, ExportValidationResult } from \"./types.js\";\n\nconst EXPERIMENTAL =\n \"Experimental compatibility export — verify against your target tooling before relying on it.\";\n\nexport function validateExportContent(\n format: ExportFormat,\n content: string,\n): ExportValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [EXPERIMENTAL];\n\n if (format === \"markdown\") {\n if (!content.startsWith(\"# AgentInspect Run\")) {\n errors.push('Markdown export must start with \"# AgentInspect Run\"');\n }\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"html\") {\n const lower = content.toLowerCase();\n if (!lower.includes(\"<!doctype html\")) {\n errors.push(\"HTML export must include <!doctype html>\");\n }\n if (/<\\s*script\\b/i.test(content)) {\n errors.push(\"HTML export must not contain script tags\");\n }\n if (/<\\s*link\\b[^>]*href\\s*=/i.test(content)) {\n warnings.push(\"HTML export contains link tags — ensure no external stylesheets.\");\n }\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"openinference\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content) as unknown;\n } catch {\n errors.push(\"OpenInference export is not valid JSON\");\n return { ok: false, format, errors, warnings };\n }\n if (!parsed || typeof parsed !== \"object\") {\n errors.push(\"OpenInference export JSON must be an object\");\n return { ok: false, format, errors, warnings };\n }\n const o = parsed as Record<string, unknown>;\n if (o.format !== \"openinference\") {\n errors.push('OpenInference export must include format: \"openinference\"');\n }\n if (!Array.isArray(o.spans)) {\n errors.push(\"OpenInference export must include a spans array\");\n }\n warnings.push(\"OpenInference-compatible JSON is not guaranteed for every backend.\");\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n if (format === \"otlp-json\") {\n let parsed: unknown;\n try {\n parsed = JSON.parse(content) as unknown;\n } catch {\n errors.push(\"OTLP JSON export is not valid JSON\");\n return { ok: false, format, errors, warnings };\n }\n if (!parsed || typeof parsed !== \"object\") {\n errors.push(\"OTLP JSON export must be an object\");\n return { ok: false, format, errors, warnings };\n }\n const o = parsed as Record<string, unknown>;\n if (!Array.isArray(o.resourceSpans)) {\n errors.push(\"OTLP JSON export must include resourceSpans array\");\n }\n warnings.push(\n \"OTLP JSON mapping uses OTel GenAI-aligned attributes where applicable; collectors may require transformation.\",\n );\n return { ok: errors.length === 0, format, errors, warnings };\n }\n\n errors.push(`Unsupported export format`);\n return { ok: false, format, errors, warnings };\n}\n","import type { InspectEvent, InspectKind, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport type {\n StepStartedEvent,\n StepType,\n TraceEvent,\n} from \"../types.js\";\n\nimport { zeroKinds } from \"./helpers.js\";\n\nfunction stepTypeToInspectKind(t: StepType): InspectKind {\n switch (t) {\n case \"llm\":\n return \"LLM\";\n case \"tool\":\n return \"TOOL\";\n case \"decision\":\n return \"DECISION\";\n case \"run\":\n return \"CHAIN\";\n default:\n return \"LOGIC\";\n }\n}\n\nfunction mapStepStatus(\n s: \"success\" | \"error\" | undefined,\n): InspectEvent[\"status\"] | undefined {\n if (s === undefined) return \"running\";\n if (s === \"success\") return \"ok\";\n return \"error\";\n}\n\ntype StepAcc = {\n id: string;\n parentId?: string;\n name: string;\n type: StepType;\n startTime: number;\n timestamp: number;\n metadata?: Record<string, unknown>;\n status?: \"success\" | \"error\";\n endTime?: number;\n durationMs?: number;\n error?: { message: string; stack?: string };\n};\n\n/**\n * Build an {@link InspectRunTree} from v0.1 JSONL {@link TraceEvent} rows (manual tracing).\n * Does not mutate the input array or event objects.\n */\nexport function manualTraceEventsToRunTree(events: TraceEvent[]): InspectRunTree {\n const started = events.find((e) => e.event === \"run_started\");\n if (!started || started.event !== \"run_started\") {\n throw new Error(\"Invalid trace: missing run_started\");\n }\n\n const runId = started.runId;\n const runName = started.name;\n\n const completedAll = events.filter((e) => e.event === \"run_completed\");\n const lastCompleted = completedAll[completedAll.length - 1];\n\n let runStatus: InspectRunTree[\"status\"];\n if (lastCompleted === undefined) {\n runStatus = \"running\";\n } else if (lastCompleted.status === \"success\") {\n runStatus = \"ok\";\n } else {\n runStatus = \"error\";\n }\n\n const startedAt = started.startTime;\n const endedAt =\n lastCompleted !== undefined && runStatus !== \"running\" ? lastCompleted.endTime : undefined;\n const durationMs =\n lastCompleted !== undefined && Number.isFinite(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined;\n\n const steps = new Map<string, StepAcc>();\n\n for (const e of events) {\n if (e.event !== \"step_started\") continue;\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n id: s.stepId,\n parentId: s.parentId,\n name: s.name,\n type: s.type,\n startTime: s.startTime,\n timestamp: s.timestamp,\n metadata: s.metadata as Record<string, unknown> | undefined,\n });\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const acc = steps.get(e.stepId);\n if (!acc) continue;\n acc.status = e.status;\n acc.endTime = e.endTime;\n acc.durationMs = e.durationMs;\n if (e.error?.message) {\n acc.error = e.error;\n }\n }\n\n const inspectNodes = new Map<string, InspectNode>();\n\n for (const acc of steps.values()) {\n const kind = stepTypeToInspectKind(acc.type);\n const status = mapStepStatus(acc.status);\n const attrs: Record<string, unknown> = { ...(acc.metadata ?? {}) };\n if (acc.error?.message) {\n attrs.error = acc.error;\n }\n\n const evt: InspectEvent = {\n eventId: acc.id,\n runId,\n parentId: acc.parentId,\n name: acc.name,\n kind,\n timestamp: acc.timestamp,\n status,\n durationMs: acc.durationMs,\n attributes: Object.keys(attrs).length > 0 ? attrs : undefined,\n confidence: \"explicit\",\n source: { type: \"manual\" },\n };\n\n inspectNodes.set(acc.id, { event: evt, children: [], depth: 0 });\n }\n\n const roots: InspectNode[] = [];\n const sortByStart = (a: InspectNode, b: InspectNode) =>\n a.event.timestamp - b.event.timestamp;\n\n for (const node of inspectNodes.values()) {\n const pid = node.event.parentId;\n if (pid !== undefined && inspectNodes.has(pid)) {\n inspectNodes.get(pid)!.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n roots.sort(sortByStart);\n for (const n of inspectNodes.values()) {\n n.children.sort(sortByStart);\n }\n\n const assignDepth = (n: InspectNode, depth: number) => {\n n.depth = depth;\n for (const c of n.children) assignDepth(c, depth + 1);\n };\n for (const r of roots) assignDepth(r, 0);\n\n const confidenceBreakdown = {\n explicit: 0,\n correlated: 0,\n heuristic: 0,\n unknown: 0,\n } as InspectRunTree[\"metadata\"][\"confidenceBreakdown\"];\n\n const kinds = zeroKinds();\n\n function countWalk(nodes: InspectNode[]): void {\n for (const n of nodes) {\n confidenceBreakdown[n.event.confidence] += 1;\n kinds[n.event.kind] += 1;\n if (n.children.length > 0) countWalk(n.children);\n }\n }\n countWalk(roots);\n\n return {\n runId,\n name: runName,\n status: runStatus,\n startedAt,\n endedAt,\n durationMs,\n children: roots,\n metadata: {\n totalEvents: inspectNodes.size,\n confidenceBreakdown,\n kinds,\n },\n };\n}\n","import type { InspectRunTree } from \"../types/inspect-event.js\";\n\nimport type { ExportOptions, ExportResult, ExportValidationResult } from \"./types.js\";\nimport { redactRunTreeForExport } from \"./redact-export.js\";\nimport { exportHtml } from \"./html-exporter.js\";\nimport { exportMarkdown } from \"./markdown-exporter.js\";\nimport { exportOpenInference } from \"./openinference-exporter.js\";\nimport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nimport { validateExportContent } from \"./validation.js\";\n\nexport function mergeExportDefaults(options: ExportOptions): ExportOptions {\n return {\n format: options.format,\n includeMetadata: options.includeMetadata ?? true,\n includeAttributes: options.includeAttributes ?? false,\n includeErrors: options.includeErrors ?? true,\n pretty: options.pretty ?? true,\n redacted: options.redacted ?? true,\n maxAttributeLength: options.maxAttributeLength ?? 500,\n redactionProfile: options.redactionProfile ?? \"local\",\n };\n}\n\n/**\n * @experimental Compatibility-oriented export API. Exports are local-only and do not upload anywhere.\n * Subject to refinement before a future stability declaration.\n */\nexport function exportRunTree(tree: InspectRunTree, options: ExportOptions): ExportResult {\n const opts = mergeExportDefaults(options);\n const exportTree =\n opts.redactionProfile === \"local\"\n ? tree\n : redactRunTreeForExport(tree, { redactionProfile: opts.redactionProfile });\n switch (opts.format) {\n case \"markdown\":\n return exportMarkdown(exportTree, opts);\n case \"html\":\n return exportHtml(exportTree, opts);\n case \"openinference\":\n return exportOpenInference(exportTree, opts);\n case \"otlp-json\":\n return exportOtlpJson(exportTree, opts);\n default: {\n const _x: never = opts.format;\n throw new Error(`Unsupported export format: ${String(_x)}`);\n }\n }\n}\n\nexport function validateExport(result: ExportResult): ExportValidationResult {\n const base = validateExportContent(result.format, result.content);\n return {\n ok: base.ok,\n format: base.format,\n errors: base.errors,\n warnings: [...result.warnings, ...base.warnings],\n };\n}\n\nexport type {\n ExportFormat,\n ExportOptions,\n ExportResult,\n ExportValidationResult,\n TraceExporter,\n} from \"./types.js\";\nexport { EXPORT_PAYLOAD_VERSION } from \"./types.js\";\nexport * from \"./helpers.js\";\nexport { manualTraceEventsToRunTree } from \"./manual-trace-adapter.js\";\nexport { exportMarkdown } from \"./markdown-exporter.js\";\nexport { exportHtml } from \"./html-exporter.js\";\nexport type { OpenInferenceExport, OpenInferenceSpan } from \"./openinference-exporter.js\";\nexport { exportOpenInference } from \"./openinference-exporter.js\";\nexport { exportOtlpJson } from \"./otlp-json-exporter.js\";\nexport { validateExportContent } from \"./validation.js\";\nexport { redactRunTreeForExport } from \"./redact-export.js\";\n","/**\n * v0.2 shared duration utilities.\n *\n * `parseDuration` is used for filters such as \"since\" / \"older-than\".\n * `formatDuration` is used for compact display in CLI and summaries.\n */\n\nexport function parseDuration(duration: string): number {\n const raw = typeof duration === \"string\" ? duration.trim() : \"\";\n const match = raw.match(/^(\\d+)(ms|[smhd])$/);\n if (!match) {\n throw new Error(\n `Invalid duration format: ${duration}. Use a positive integer followed by ms, s, m, h, or d (e.g. 500ms, 30s, 5m, 2h, 7d).`,\n );\n }\n\n const amount = Number.parseInt(match[1], 10);\n const unit = match[2];\n\n if (!Number.isFinite(amount) || amount <= 0) {\n throw new Error(\n `Invalid duration amount: ${duration}. Amount must be a positive integer.`,\n );\n }\n\n switch (unit) {\n case \"ms\":\n return amount;\n case \"s\":\n return amount * 1000;\n case \"m\":\n return amount * 60 * 1000;\n case \"h\":\n return amount * 60 * 60 * 1000;\n case \"d\":\n return amount * 24 * 60 * 60 * 1000;\n default: {\n // Should be unreachable due to regex.\n throw new Error(`Unknown duration unit: ${unit}`);\n }\n }\n}\n\nexport function formatDuration(ms: number): string {\n if (!Number.isFinite(ms)) {\n return \"0ms\";\n }\n if (ms < 0) {\n throw new Error(`formatDuration: ms must be non-negative (got ${ms})`);\n }\n if (ms < 1000) {\n return `${Math.floor(ms)}ms`;\n }\n if (ms < 60_000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n if (ms < 3_600_000) {\n return `${(ms / 60_000).toFixed(1)}m`;\n }\n return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\n","import { 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 type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n StepStatus,\n StepType,\n TraceEvent,\n TraceMetadataStatus,\n} from \"./types.js\";\nimport { formatDuration, formatTimestamp } from \"./utils.js\";\n\nexport type TimelineFocus = \"all\" | \"slow\";\n\nexport interface TimelineEntry {\n stepId: string;\n name: string;\n type: StepType;\n status: StepStatus;\n depth: number;\n startedAt: number;\n offsetMs: number;\n durationMs?: number;\n isError: boolean;\n slow?: boolean;\n streaming?: {\n chunkCount?: number;\n streamDurationMs?: number;\n streamedCharCount?: number;\n };\n}\n\nexport interface RunTimeline {\n runId: string;\n name?: string;\n status: TraceMetadataStatus;\n startedAt?: number;\n endedAt?: number;\n durationMs?: number;\n correlation?: {\n correlationId?: string;\n requestId?: string;\n decisionId?: string;\n groupId?: string;\n };\n entries: TimelineEntry[];\n}\n\nexport interface TimelineOptions {\n focus?: TimelineFocus;\n slowTopN?: number;\n}\n\nfunction finite(n: unknown): n is number {\n return typeof n === \"number\" && Number.isFinite(n);\n}\n\nfunction pickStreamingMeta(\n metadata: Record<string, unknown> | undefined,\n): TimelineEntry[\"streaming\"] | undefined {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const chunkCount = metadata.chunkCount;\n const streamDurationMs = metadata.streamDurationMs;\n const streamedCharCount = metadata.streamedCharCount;\n if (\n !finite(chunkCount) &&\n !finite(streamDurationMs) &&\n !finite(streamedCharCount)\n ) {\n return undefined;\n }\n return {\n ...(finite(chunkCount) ? { chunkCount } : {}),\n ...(finite(streamDurationMs) ? { streamDurationMs } : {}),\n ...(finite(streamedCharCount) ? { streamedCharCount } : {}),\n };\n}\n\nfunction pickCorrelation(\n metadata: Record<string, unknown> | undefined,\n): RunTimeline[\"correlation\"] | undefined {\n if (!metadata || typeof metadata !== \"object\") return undefined;\n const out: NonNullable<RunTimeline[\"correlation\"]> = {};\n for (const key of [\n \"correlationId\",\n \"requestId\",\n \"decisionId\",\n \"groupId\",\n ] as const) {\n const v = metadata[key];\n if (typeof v === \"string\" && v.trim() !== \"\") {\n out[key] = v;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nexport function buildRunTimeline(\n events: TraceEvent[],\n options: TimelineOptions = {},\n): RunTimeline {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const runId =\n started?.runId ??\n events.find((e) => typeof (e as { runId?: string }).runId === \"string\")\n ?.runId ??\n \"unknown-run\";\n\n const runStart =\n started && finite(started.startTime)\n ? started.startTime\n : started && finite(started.timestamp)\n ? started.timestamp\n : undefined;\n\n const status: TraceMetadataStatus = lastCompleted\n ? lastCompleted.status\n : started\n ? \"running\"\n : \"unknown\";\n\n const steps = new Map<\n string,\n {\n name: string;\n type: StepType;\n parentId?: string;\n startedAt: number;\n status: StepStatus;\n durationMs?: number;\n metadata?: Record<string, unknown>;\n }\n >();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n name: s.name,\n type: s.type,\n parentId: s.parentId,\n startedAt: finite(s.startTime) ? s.startTime : s.timestamp,\n status: \"running\",\n metadata: s.metadata as Record<string, unknown> | undefined,\n });\n }\n }\n\n for (const e of events) {\n if (e.event !== \"step_completed\") continue;\n const c = e as StepCompletedEvent;\n const node = steps.get(c.stepId);\n if (!node) continue;\n node.status = c.status;\n if (finite(c.durationMs)) node.durationMs = c.durationMs;\n }\n\n const depthCache = new Map<string, number>();\n const computeDepth = (stepId: string): number => {\n const cached = depthCache.get(stepId);\n if (cached !== undefined) return cached;\n const node = steps.get(stepId);\n if (!node) return 0;\n const parent = node.parentId;\n if (\n typeof parent !== \"string\" ||\n parent.trim() === \"\" ||\n !steps.has(parent)\n ) {\n depthCache.set(stepId, 0);\n return 0;\n }\n const d = Math.min(1000, computeDepth(parent) + 1);\n depthCache.set(stepId, d);\n return d;\n };\n\n const entries: TimelineEntry[] = [];\n for (const [stepId, s] of steps.entries()) {\n const offsetMs =\n runStart !== undefined && finite(s.startedAt)\n ? Math.max(0, s.startedAt - runStart)\n : 0;\n entries.push({\n stepId,\n name: s.name,\n type: s.type,\n status: s.status,\n depth: computeDepth(stepId),\n startedAt: s.startedAt,\n offsetMs,\n durationMs: s.durationMs,\n isError: s.status === \"error\",\n streaming: pickStreamingMeta(s.metadata),\n });\n }\n\n entries.sort((a, b) => a.startedAt - b.startedAt);\n\n const slowTopN = options.slowTopN ?? 3;\n if (options.focus === \"slow\" && entries.length > 0) {\n const ranked = [...entries]\n .filter((e) => finite(e.durationMs))\n .sort((a, b) => (b.durationMs ?? 0) - (a.durationMs ?? 0));\n const slowIds = new Set(\n ranked.slice(0, slowTopN).map((e) => e.stepId),\n );\n for (const e of entries) {\n if (slowIds.has(e.stepId)) e.slow = true;\n }\n }\n\n return {\n runId,\n name:\n typeof started?.name === \"string\" && started.name.trim() !== \"\"\n ? started.name\n : undefined,\n status,\n startedAt: runStart,\n endedAt:\n lastCompleted && finite(lastCompleted.endTime)\n ? lastCompleted.endTime\n : undefined,\n durationMs:\n lastCompleted && finite(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined,\n correlation: pickCorrelation(\n started?.metadata as Record<string, unknown> | undefined,\n ),\n entries,\n };\n}\n\nexport interface RenderTimelineOptions {\n focus?: TimelineFocus;\n}\n\nexport function renderTimeline(\n timeline: RunTimeline,\n options: RenderTimelineOptions = {},\n): string {\n const lines: string[] = [];\n lines.push(`Timeline: ${timeline.name ?? timeline.runId}`);\n lines.push(`Run ID: ${timeline.runId}`);\n lines.push(`Status: ${timeline.status}`);\n if (timeline.startedAt !== undefined) {\n lines.push(`Started: ${formatTimestamp(timeline.startedAt)}`);\n }\n if (timeline.durationMs !== undefined) {\n lines.push(`Duration: ${formatDuration(timeline.durationMs)}`);\n }\n if (timeline.correlation) {\n const parts = Object.entries(timeline.correlation)\n .filter(([, v]) => typeof v === \"string\")\n .map(([k, v]) => `${k}=${v}`);\n if (parts.length > 0) {\n lines.push(`Correlation: ${parts.join(\", \")}`);\n }\n }\n lines.push(\"\");\n lines.push(\"Steps (chronological):\");\n\n const show = timeline.entries.filter((e) => {\n if (options.focus === \"slow\") return e.slow === true;\n return true;\n });\n\n if (show.length === 0) {\n lines.push(\n options.focus === \"slow\"\n ? \"(no steps with duration for slow focus)\"\n : \"(no steps)\",\n );\n return lines.join(\"\\n\");\n }\n\n for (const e of show) {\n const prefix = e.slow ? \"[slow] \" : \"\";\n const typeTag =\n e.type === \"llm\" ? \"llm\" : e.type === \"tool\" ? \"tool\" : e.type;\n const dur =\n e.durationMs !== undefined ? formatDuration(e.durationMs) : \"-\";\n const err = e.isError ? \" error\" : \"\";\n const off = formatDuration(e.offsetMs);\n let line = `${prefix}+${off} ${typeTag}:${e.name} (${dur})${err}`;\n if (e.streaming?.chunkCount !== undefined) {\n line += ` chunks=${e.streaming.chunkCount}`;\n }\n if (e.streaming?.streamDurationMs !== undefined) {\n line += ` stream=${formatDuration(e.streaming.streamDurationMs)}`;\n }\n lines.push(line);\n }\n\n return lines.join(\"\\n\");\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n TraceEvent,\n TraceMetadata,\n TraceMetadataStatus,\n RunSummary,\n StepType,\n StepStatus,\n} from \"./types.js\";\nimport { parseTraceJsonl } from \"./read-trace.js\";\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction parseIsoToMs(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nexport async function extractMetadata(\n filePath: string,\n _quickScan?: boolean,\n): Promise<TraceMetadata> {\n const stats = await stat(filePath);\n\n let runIdFromFile = path.basename(filePath);\n if (runIdFromFile.endsWith(\".jsonl\")) {\n runIdFromFile = runIdFromFile.slice(0, -\".jsonl\".length);\n }\n\n const raw = await readFile(filePath, \"utf-8\");\n const parsedTrace = parseTraceJsonl(raw, { warnings: false });\n\n let runId: string | undefined;\n let name: string | undefined;\n let startedAt: number | undefined;\n let endedAt: number | undefined;\n let explicitDurationMs: number | undefined;\n\n let hasRunStarted = false;\n let hasRunCompleted = false;\n let runCompletedStatus: \"success\" | \"error\" | undefined;\n let anyStepError = false;\n const anyKnownEvent = parsedTrace.sourceEventCount > 0;\n let persistedStatus: TraceMetadataStatus | undefined;\n\n const persistedRun = parsedTrace.persisted.find(\n (event) => event.kind === \"RUN\",\n );\n if (persistedRun) {\n runId = persistedRun.runId;\n if (persistedRun.name.trim() !== \"\") {\n name = persistedRun.name;\n }\n startedAt =\n parseIsoToMs(persistedRun.startedAt) ??\n parseIsoToMs(persistedRun.timestamp);\n endedAt = parseIsoToMs(persistedRun.endedAt);\n if (isFiniteNumber(persistedRun.durationMs)) {\n explicitDurationMs = persistedRun.durationMs;\n if (endedAt === undefined && startedAt !== undefined) {\n endedAt = startedAt + persistedRun.durationMs;\n }\n }\n if (persistedRun.status === \"ok\") persistedStatus = \"success\";\n else if (persistedRun.status === \"error\") persistedStatus = \"error\";\n else if (persistedRun.status === \"running\") persistedStatus = \"running\";\n else if (persistedRun.status === \"unknown\") persistedStatus = \"unknown\";\n } else {\n runId = parsedTrace.persisted[0]?.runId;\n }\n\n for (const e of parsedTrace.events) {\n if (\n runId === undefined &&\n typeof (e as { runId?: unknown }).runId === \"string\"\n ) {\n runId = (e as { runId: string }).runId;\n }\n\n if (e.event === \"run_started\") {\n hasRunStarted = true;\n const rs = e as RunStartedEvent;\n if (typeof rs.name === \"string\" && rs.name.trim() !== \"\") {\n name = rs.name;\n }\n if (isFiniteNumber(rs.startTime)) {\n startedAt = rs.startTime;\n } else if (isFiniteNumber(rs.timestamp)) {\n startedAt = rs.timestamp;\n }\n }\n\n if (e.event === \"run_completed\") {\n hasRunCompleted = true;\n const rc = e as RunCompletedEvent;\n runCompletedStatus = rc.status;\n if (isFiniteNumber(rc.endTime)) endedAt = rc.endTime;\n else if (isFiniteNumber(rc.timestamp)) endedAt = rc.timestamp;\n if (isFiniteNumber(rc.durationMs)) explicitDurationMs = rc.durationMs;\n }\n\n if (e.event === \"step_completed\") {\n const sc = e as StepCompletedEvent;\n if (sc.status === \"error\") {\n anyStepError = true;\n }\n }\n }\n\n const resolvedRunId = runId ?? runIdFromFile;\n\n let status: TraceMetadataStatus = \"unknown\";\n if (\n hasRunCompleted &&\n (runCompletedStatus === \"success\" || runCompletedStatus === \"error\")\n ) {\n status = runCompletedStatus;\n } else if (anyStepError) {\n // If run_completed is missing, but at least one step failed, treat as error.\n status = \"error\";\n } else if (persistedStatus !== undefined) {\n status = persistedStatus;\n } else if (hasRunStarted && !hasRunCompleted) {\n status = \"running\";\n } else if (anyKnownEvent) {\n status = \"unknown\";\n } else {\n status = \"unknown\";\n }\n\n const durationMs =\n explicitDurationMs ??\n (startedAt !== undefined &&\n endedAt !== undefined &&\n Number.isFinite(startedAt) &&\n Number.isFinite(endedAt) &&\n endedAt >= startedAt\n ? endedAt - startedAt\n : undefined);\n\n return {\n runId: resolvedRunId,\n name,\n status,\n startedAt,\n endedAt,\n durationMs,\n eventCount: parsedTrace.sourceEventCount,\n filePath,\n fileSize: stats.size,\n createdAt: stats.birthtime,\n };\n}\n\ntype StepAgg = {\n type: StepType;\n name: string;\n status: StepStatus;\n durationMs?: number;\n parentId?: string;\n tokensInput?: number;\n tokensOutput?: number;\n tokensTotal?: number;\n tokensCached?: number;\n};\n\nfunction isNonNegativeFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nexport function buildRunSummary(events: TraceEvent[]): RunSummary {\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const runId = started?.runId ?? events.find((e: any) => typeof e.runId === \"string\")?.runId ?? \"unknown-run\";\n\n const name =\n typeof started?.name === \"string\" && started.name.trim() !== \"\"\n ? started.name\n : undefined;\n\n const status: TraceMetadataStatus = lastCompleted\n ? lastCompleted.status\n : started\n ? \"running\"\n : \"unknown\";\n\n const durationMs =\n lastCompleted && isFiniteNumber(lastCompleted.durationMs)\n ? lastCompleted.durationMs\n : undefined;\n\n const startedAt =\n started && isFiniteNumber(started.startTime)\n ? started.startTime\n : undefined;\n\n const steps = new Map<string, StepAgg>();\n\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n steps.set(s.stepId, {\n type: s.type,\n name: s.name,\n status: \"running\",\n parentId: s.parentId,\n tokensInput:\n isNonNegativeFiniteNumber(s.metadata?.tokens?.input)\n ? s.metadata.tokens.input\n : undefined,\n tokensOutput:\n isNonNegativeFiniteNumber(s.metadata?.tokens?.output)\n ? s.metadata.tokens.output\n : undefined,\n tokensTotal: isNonNegativeFiniteNumber(s.metadata?.tokens?.total)\n ? s.metadata.tokens.total\n : undefined,\n tokensCached: isNonNegativeFiniteNumber(s.metadata?.tokens?.cached)\n ? s.metadata.tokens.cached\n : undefined,\n });\n }\n }\n\n for (const e of events) {\n if (e.event === \"step_completed\") {\n const c = e as StepCompletedEvent;\n const existing = steps.get(c.stepId);\n if (!existing) continue;\n existing.status = c.status;\n existing.durationMs = c.durationMs;\n }\n }\n\n let totalSteps = 0;\n let llmSteps = 0;\n let toolSteps = 0;\n let logicSteps = 0;\n let errorSteps = 0;\n let maxDepth = 0;\n let longestStep: RunSummary[\"longestStep\"] | undefined;\n\n let totalTokensInput = 0;\n let totalTokensOutput = 0;\n let totalTokensTotal = 0;\n let totalTokensCached = 0;\n let tokenBearingSteps = 0;\n let stepsWithKnownTotal = 0;\n let hasCachedTokens = false;\n\n const depthCache = new Map<string, number>();\n const computeDepth = (stepId: string): number => {\n const cached = depthCache.get(stepId);\n if (cached !== undefined) return cached;\n const node = steps.get(stepId);\n if (!node) return 0;\n const parent = node.parentId;\n if (typeof parent !== \"string\" || parent.trim() === \"\" || !steps.has(parent)) {\n depthCache.set(stepId, 0);\n return 0;\n }\n // Depth is parent depth + 1. Cap at a sane limit to avoid cycles.\n const d = Math.min(1000, computeDepth(parent) + 1);\n depthCache.set(stepId, d);\n return d;\n };\n\n for (const [id, s] of steps.entries()) {\n totalSteps += 1;\n if (s.type === \"llm\") llmSteps += 1;\n else if (s.type === \"tool\") toolSteps += 1;\n else logicSteps += 1;\n\n if (s.status === \"error\") errorSteps += 1;\n const depth = computeDepth(id);\n if (depth > maxDepth) maxDepth = depth;\n\n if (typeof s.durationMs === \"number\" && Number.isFinite(s.durationMs)) {\n if (!longestStep || s.durationMs > longestStep.durationMs) {\n longestStep = { name: s.name, durationMs: s.durationMs, type: s.type };\n }\n }\n\n if (\n s.tokensInput !== undefined ||\n s.tokensOutput !== undefined ||\n s.tokensTotal !== undefined ||\n s.tokensCached !== undefined\n ) {\n tokenBearingSteps += 1;\n if (s.tokensInput !== undefined) totalTokensInput += s.tokensInput;\n if (s.tokensOutput !== undefined) totalTokensOutput += s.tokensOutput;\n\n if (s.tokensTotal !== undefined) {\n totalTokensTotal += s.tokensTotal;\n stepsWithKnownTotal += 1;\n } else if (s.tokensInput !== undefined && s.tokensOutput !== undefined) {\n totalTokensTotal += s.tokensInput + s.tokensOutput;\n stepsWithKnownTotal += 1;\n }\n\n if (s.tokensCached !== undefined) {\n totalTokensCached += s.tokensCached;\n hasCachedTokens = true;\n }\n }\n }\n\n const summary: RunSummary = {\n runId,\n name,\n status,\n durationMs,\n totalSteps,\n llmSteps,\n toolSteps,\n logicSteps,\n errorSteps,\n maxDepth,\n ...(longestStep ? { longestStep } : {}),\n ...(tokenBearingSteps > 0\n ? {\n totalTokens: {\n input: totalTokensInput,\n output: totalTokensOutput,\n ...(stepsWithKnownTotal === tokenBearingSteps\n ? { total: totalTokensTotal }\n : {}),\n ...(hasCachedTokens ? { cached: totalTokensCached } : {}),\n },\n }\n : {}),\n };\n\n // startedAt isn't in RunSummary spec, but keep deterministic results: ignore.\n void startedAt;\n return summary;\n}\n","import type {\n RunCompletedEvent,\n RunStartedEvent,\n StepCompletedEvent,\n StepStartedEvent,\n TraceCorrelationMetadata,\n TraceEvent,\n TraceMetadataStatus,\n} from \"./types.js\";\nimport { buildRunSummary } from \"./trace-metadata.js\";\nimport { formatDuration } from \"./utils.js\";\n\nexport interface RunWhatSummary {\n runId: string;\n name?: string;\n status: TraceMetadataStatus;\n durationMs?: number;\n totalSteps: number;\n llmSteps: number;\n toolSteps: number;\n logicSteps: number;\n errorSteps: number;\n maxDepth: number;\n longestStep?: {\n name: string;\n durationMs: number;\n type: string;\n };\n totalTokens?: {\n input: number;\n output: number;\n total?: number;\n cached?: number;\n };\n correlation?: TraceCorrelationMetadata;\n failedStepNames: string[];\n runErrorMessage?: string;\n}\n\nfunction pickCorrelation(\n metadata: Record<string, unknown> | undefined,\n): TraceCorrelationMetadata | undefined {\n if (!metadata) return undefined;\n const out: TraceCorrelationMetadata = {};\n for (const key of [\n \"correlationId\",\n \"requestId\",\n \"decisionId\",\n \"groupId\",\n ] as const) {\n const value = metadata[key];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n out[key] = value;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction stepMixLine(summary: RunWhatSummary): string {\n const parts: string[] = [];\n if (summary.llmSteps > 0) parts.push(`${summary.llmSteps} LLM`);\n if (summary.toolSteps > 0) parts.push(`${summary.toolSteps} tool`);\n if (summary.logicSteps > 0) parts.push(`${summary.logicSteps} logic`);\n return parts.length > 0 ? parts.join(\", \") : \"none\";\n}\n\nfunction outcomeLine(summary: RunWhatSummary): string {\n if (summary.status === \"success\") {\n return summary.errorSteps > 0\n ? \"Completed with step errors recorded.\"\n : \"Completed successfully.\";\n }\n if (summary.status === \"error\") {\n if (summary.failedStepNames.length > 0) {\n const names = summary.failedStepNames.slice(0, 3).join(\", \");\n const suffix =\n summary.failedStepNames.length > 3\n ? ` (+${summary.failedStepNames.length - 3} more)`\n : \"\";\n return `Failed at step(s): ${names}${suffix}.`;\n }\n if (summary.runErrorMessage) {\n return `Run failed: ${summary.runErrorMessage}`;\n }\n return \"Run failed.\";\n }\n if (summary.status === \"running\") {\n return \"Run is still in progress (no run_completed).\";\n }\n return \"Outcome unknown — inspect events may be incomplete.\";\n}\n\n/**\n * Build a concise inspection summary for `what` / report workflows.\n * Read-only over in-memory v0.1 {@link TraceEvent} rows.\n */\nexport function buildRunWhatSummary(events: TraceEvent[]): RunWhatSummary {\n const base = buildRunSummary(events);\n const started = events.find(\n (e): e is RunStartedEvent => e.event === \"run_started\",\n );\n const completed = events.filter(\n (e): e is RunCompletedEvent => e.event === \"run_completed\",\n );\n const lastCompleted = completed[completed.length - 1];\n\n const failedStepNames: string[] = [];\n const stepNames = new Map<string, string>();\n for (const e of events) {\n if (e.event === \"step_started\") {\n const s = e as StepStartedEvent;\n stepNames.set(s.stepId, s.name);\n }\n }\n for (const e of events) {\n if (e.event === \"step_completed\") {\n const sc = e as StepCompletedEvent;\n if (sc.status === \"error\") {\n failedStepNames.push(stepNames.get(sc.stepId) ?? sc.stepId);\n }\n }\n }\n\n return {\n runId: base.runId,\n name: base.name,\n status: base.status,\n durationMs: base.durationMs,\n totalSteps: base.totalSteps,\n llmSteps: base.llmSteps,\n toolSteps: base.toolSteps,\n logicSteps: base.logicSteps,\n errorSteps: base.errorSteps,\n maxDepth: base.maxDepth,\n longestStep: base.longestStep,\n totalTokens: base.totalTokens,\n correlation: pickCorrelation(started?.metadata),\n failedStepNames,\n runErrorMessage: lastCompleted?.error?.message,\n };\n}\n\nexport interface RenderWhatOptions {\n /** Include correlation ids when present (default true). */\n correlation?: boolean;\n}\n\n/**\n * Render a human-readable `what` summary (plain text, no ANSI).\n */\nexport function renderRunWhat(\n summary: RunWhatSummary,\n options: RenderWhatOptions = {},\n): string {\n const showCorrelation = options.correlation !== false;\n const lines: string[] = [];\n const label = summary.name ?? summary.runId;\n lines.push(`What: ${label}`);\n\n const duration =\n summary.durationMs !== undefined ? formatDuration(summary.durationMs) : \"—\";\n lines.push(\n `Status: ${summary.status} · Duration: ${duration} · Steps: ${summary.totalSteps} (${stepMixLine(summary)})`,\n );\n\n if (summary.totalTokens) {\n const tokenParts = [\n `${summary.totalTokens.input} in`,\n `${summary.totalTokens.output} out`,\n ];\n if (summary.totalTokens.total !== undefined) {\n tokenParts.push(`${summary.totalTokens.total} total`);\n }\n if (summary.totalTokens.cached !== undefined) {\n tokenParts.push(`${summary.totalTokens.cached} cached`);\n }\n lines.push(`Tokens: ${tokenParts.join(\" / \")}`);\n }\n\n if (showCorrelation && summary.correlation) {\n const parts: string[] = [];\n if (summary.correlation.correlationId) {\n parts.push(`correlationId=${summary.correlation.correlationId}`);\n }\n if (summary.correlation.requestId) {\n parts.push(`requestId=${summary.correlation.requestId}`);\n }\n if (summary.correlation.decisionId) {\n parts.push(`decisionId=${summary.correlation.decisionId}`);\n }\n if (summary.correlation.groupId) {\n parts.push(`groupId=${summary.correlation.groupId}`);\n }\n if (parts.length > 0) {\n lines.push(`Correlation: ${parts.join(\", \")}`);\n }\n }\n\n lines.push(`Outcome: ${outcomeLine(summary)}`);\n\n if (summary.longestStep && summary.totalSteps > 0) {\n lines.push(\n `Slowest: ${summary.longestStep.name} (${formatDuration(summary.longestStep.durationMs)}, ${summary.longestStep.type})`,\n );\n }\n\n if (summary.maxDepth > 0) {\n lines.push(`Max depth: ${summary.maxDepth}`);\n }\n\n return lines.join(\"\\n\");\n}\n","export type ObservedOutcomeStatus = \"passed\" | \"failed\" | \"unknown\" | \"skipped\";\n\nexport type ObservedOutcomeMethod =\n | \"dom\"\n | \"accessibility\"\n | \"snapshot\"\n | \"network\"\n | \"storage\"\n | \"filesystem\"\n | \"database\"\n | \"queue\"\n | \"custom\";\n\nexport interface ObservedOutcome {\n outcomeId: string;\n runId: string;\n parentId?: string;\n name: string;\n expectation: string;\n status: ObservedOutcomeStatus;\n method?: ObservedOutcomeMethod;\n actual?: unknown;\n evidence?: unknown;\n observedAt: number;\n}\n\nexport interface ObserveOutcomeOptions {\n expectation: string;\n status: ObservedOutcomeStatus;\n method?: ObservedOutcomeMethod;\n actual?: unknown;\n evidence?: unknown;\n observedAt?: number | string;\n}\n\nexport interface ObservedOutcomeSummary {\n total: number;\n passed: number;\n failed: number;\n unknown: number;\n skipped: number;\n outcomes: ObservedOutcome[];\n}\n\nexport const OBSERVED_OUTCOME_STATUSES: readonly ObservedOutcomeStatus[] = [\n \"passed\",\n \"failed\",\n \"unknown\",\n \"skipped\",\n];\n\nexport const OBSERVED_OUTCOME_METHODS: readonly ObservedOutcomeMethod[] = [\n \"dom\",\n \"accessibility\",\n \"snapshot\",\n \"network\",\n \"storage\",\n \"filesystem\",\n \"database\",\n \"queue\",\n \"custom\",\n];\n\nexport const OUTCOME_ATTRIBUTE_STATUS_KEY = \"outcomeStatus\";\nexport const OUTCOME_ATTRIBUTE_EXPECTATION_KEY = \"expectation\";\nexport const OUTCOME_ATTRIBUTE_METHOD_KEY = \"method\";\nexport const OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY = \"observedAt\";\nexport const OUTCOME_LEGACY_EVENT = \"outcome_observed\";\n","import type { PersistedInspectEvent } from \"../types/persisted-inspect-event.js\";\nimport type { TraceEvent } from \"../types.js\";\nimport {\n OUTCOME_ATTRIBUTE_EXPECTATION_KEY,\n OUTCOME_ATTRIBUTE_METHOD_KEY,\n OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY,\n OUTCOME_ATTRIBUTE_STATUS_KEY,\n OUTCOME_LEGACY_EVENT,\n type ObservedOutcome,\n type ObservedOutcomeMethod,\n type ObservedOutcomeStatus,\n type ObservedOutcomeSummary,\n} from \"./types.js\";\nimport { parseObservedOutcomeStatus } from \"./validate.js\";\n\nfunction isOutcomeStatus(value: unknown): value is ObservedOutcomeStatus {\n return (\n value === \"passed\" ||\n value === \"failed\" ||\n value === \"unknown\" ||\n value === \"skipped\"\n );\n}\n\nfunction parseMethod(value: unknown): ObservedOutcomeMethod | undefined {\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n return value as ObservedOutcomeMethod;\n}\n\nfunction fromOutcomeObservedEvent(event: Extract<TraceEvent, { event: \"outcome_observed\" }>): ObservedOutcome {\n return {\n outcomeId: event.outcomeId,\n runId: event.runId,\n ...(event.parentId !== undefined ? { parentId: event.parentId } : {}),\n name: event.name,\n expectation: event.expectation,\n status: event.status,\n ...(event.method !== undefined ? { method: event.method } : {}),\n ...(event.actual !== undefined ? { actual: event.actual } : {}),\n ...(event.evidence !== undefined ? { evidence: event.evidence } : {}),\n observedAt: event.observedAt,\n };\n}\n\nfunction fromPersistedOutcome(event: PersistedInspectEvent): ObservedOutcome | undefined {\n if (event.kind !== \"OUTCOME\") return undefined;\n const attrs = event.attributes ?? {};\n const statusRaw = attrs[OUTCOME_ATTRIBUTE_STATUS_KEY];\n if (!isOutcomeStatus(statusRaw)) return undefined;\n const expectation =\n typeof attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY] === \"string\"\n ? attrs[OUTCOME_ATTRIBUTE_EXPECTATION_KEY]\n : event.name;\n const observedAtRaw = attrs[OUTCOME_ATTRIBUTE_OBSERVED_AT_KEY];\n const observedAt =\n typeof observedAtRaw === \"string\"\n ? Date.parse(observedAtRaw)\n : typeof observedAtRaw === \"number\" && Number.isFinite(observedAtRaw)\n ? observedAtRaw\n : Date.parse(event.timestamp);\n return {\n outcomeId: event.eventId,\n runId: event.runId,\n ...(event.parentId !== undefined ? { parentId: event.parentId } : {}),\n name: event.name,\n expectation,\n status: statusRaw,\n ...(parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) !== undefined\n ? { method: parseMethod(attrs[OUTCOME_ATTRIBUTE_METHOD_KEY]) }\n : {}),\n ...(event.outputSummary !== undefined ? { actual: event.outputSummary } : {}),\n ...(attrs.evidence !== undefined ? { evidence: attrs.evidence } : {}),\n observedAt: Number.isFinite(observedAt) ? observedAt : Date.parse(event.timestamp),\n };\n}\n\nexport function extractOutcomesFromTraceEvents(events: readonly TraceEvent[]): ObservedOutcome[] {\n const out: ObservedOutcome[] = [];\n for (const event of events) {\n if (event.event === OUTCOME_LEGACY_EVENT) {\n out.push(fromOutcomeObservedEvent(event as Extract<TraceEvent, { event: \"outcome_observed\" }>));\n }\n }\n return out.sort((a, b) => a.observedAt - b.observedAt || a.name.localeCompare(b.name));\n}\n\nexport function extractOutcomesFromPersistedEvents(\n events: readonly PersistedInspectEvent[],\n): ObservedOutcome[] {\n const out: ObservedOutcome[] = [];\n for (const event of events) {\n const outcome = fromPersistedOutcome(event);\n if (outcome) out.push(outcome);\n }\n return out.sort((a, b) => a.observedAt - b.observedAt || a.name.localeCompare(b.name));\n}\n\nexport function summarizeObservedOutcomes(outcomes: readonly ObservedOutcome[]): ObservedOutcomeSummary {\n const summary: ObservedOutcomeSummary = {\n total: outcomes.length,\n passed: 0,\n failed: 0,\n unknown: 0,\n skipped: 0,\n outcomes: [...outcomes],\n };\n for (const outcome of outcomes) {\n summary[outcome.status] += 1;\n }\n return summary;\n}\n\nexport function outcomesMatchingStatus(\n outcomes: readonly ObservedOutcome[],\n statuses: readonly ObservedOutcomeStatus[],\n): ObservedOutcome[] {\n const set = new Set(statuses);\n return outcomes.filter((outcome) => set.has(outcome.status));\n}\n\nexport function parseObservationFilter(value: string | undefined): ObservedOutcomeStatus | undefined {\n if (value === undefined || value.trim() === \"\") return undefined;\n return parseObservedOutcomeStatus(value);\n}\n","import type { ObservedOutcome, ObservedOutcomeSummary } from \"./types.js\";\n\nfunction formatPayload(value: unknown): string {\n if (value === undefined) return \"\";\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function renderObservedOutcomesMarkdown(summary: ObservedOutcomeSummary): string {\n if (summary.total === 0) {\n return \"No observed outcomes recorded for this run.\";\n }\n const lines = [\n `Total: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})`,\n \"\",\n \"| Name | Status | Expectation | Method |\",\n \"| --- | --- | --- | --- |\",\n ];\n for (const outcome of summary.outcomes) {\n lines.push(\n `| ${outcome.name} | ${outcome.status} | ${outcome.expectation.replace(/\\|/g, \"\\\\|\")} | ${outcome.method ?? \"-\"} |`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport function renderObservedOutcomesText(summary: ObservedOutcomeSummary): string {\n if (summary.total === 0) {\n return \"No observed outcomes recorded for this run.\";\n }\n const lines = [\n `Observed outcomes: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})`,\n ];\n for (const outcome of summary.outcomes) {\n const evidence = formatPayload(outcome.evidence);\n const suffix = evidence ? ` evidence=${evidence}` : \"\";\n lines.push(\n `- ${outcome.name} [${outcome.status}] ${outcome.expectation}${suffix}`,\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport function renderObservedOutcomesHtml(summary: ObservedOutcomeSummary): string {\n if (summary.total === 0) {\n return \"<p>No observed outcomes recorded for this run.</p>\";\n }\n const rows = summary.outcomes\n .map((outcome: ObservedOutcome) => {\n const esc = (v: string) =>\n v.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n return `<tr><td>${esc(outcome.name)}</td><td>${esc(outcome.status)}</td><td>${esc(outcome.expectation)}</td><td>${esc(outcome.method ?? \"-\")}</td></tr>`;\n })\n .join(\"\");\n return `<p>Total: ${summary.total} (passed ${summary.passed}, failed ${summary.failed}, unknown ${summary.unknown}, skipped ${summary.skipped})</p><table><thead><tr><th>Name</th><th>Status</th><th>Expectation</th><th>Method</th></tr></thead><tbody>${rows}</tbody></table>`;\n}\n","import type { TraceEvent } from \"./types.js\";\nimport type { RedactionProfile } from \"./types.js\";\nimport type { InspectRunTree } from \"./types/inspect-event.js\";\nimport { exportHtml } from \"./exporters/html-exporter.js\";\nimport { exportMarkdown } from \"./exporters/markdown-exporter.js\";\nimport { escapeHtml, escapeMarkdown } from \"./exporters/helpers.js\";\nimport { manualTraceEventsToRunTree } from \"./exporters/manual-trace-adapter.js\";\nimport {\n redactRunTreeForExport,\n redactTraceEventsForReport,\n} from \"./exporters/redact-export.js\";\nimport { buildRunTimeline, renderTimeline } from \"./timeline.js\";\nimport { buildRunWhatSummary, renderRunWhat } from \"./what.js\";\nimport {\n extractOutcomesFromTraceEvents,\n renderObservedOutcomesHtml,\n renderObservedOutcomesMarkdown,\n summarizeObservedOutcomes,\n} from \"./outcomes/index.js\";\n\nexport type ReportFormat = \"markdown\" | \"html\";\nexport type ReportSection = \"all\" | \"observations\" | \"what\" | \"timeline\" | \"tree\";\n\nexport interface ReportOptions {\n format: ReportFormat;\n includeAttributes?: boolean;\n includeErrors?: boolean;\n redactionProfile?: RedactionProfile;\n /** Include correlation ids in the what section (default true). */\n correlation?: boolean;\n /** Limit output to one section (`observations` shows observed outcomes only). */\n section?: ReportSection;\n}\n\nexport interface ReportResult {\n format: ReportFormat;\n content: string;\n contentType: string;\n fileExtension: string;\n}\n\nfunction resolveTree(\n events: TraceEvent[],\n profile: RedactionProfile,\n): InspectRunTree {\n const tree = manualTraceEventsToRunTree(events);\n return profile === \"local\"\n ? tree\n : redactRunTreeForExport(tree, { redactionProfile: profile });\n}\n\nfunction tailMarkdownSection(content: string, heading: string): string {\n const marker = `## ${heading}`;\n const idx = content.indexOf(marker);\n if (idx < 0) return \"\";\n return content.slice(idx).trimEnd();\n}\n\nfunction extractHtmlFragment(content: string, start: string, end: string): string {\n const startIdx = content.indexOf(start);\n if (startIdx < 0) return \"\";\n const endIdx = content.indexOf(end, startIdx + start.length);\n if (endIdx < 0) return content.slice(startIdx);\n return content.slice(startIdx, endIdx);\n}\n\nconst REPORT_HTML_CSS = `\nbody{font-family:system-ui,sans-serif;line-height:1.5;margin:1.5rem;max-width:960px;color:#111}\nh1{font-size:1.35rem}\nh2{font-size:1.1rem;margin-top:1.5rem}\npre{white-space:pre-wrap;background:#f8f8f8;padding:0.75rem;overflow:auto;font-size:0.9rem}\nul.tree{list-style:none;padding-left:1rem}\nul.tree.nested{padding-left:1.25rem;border-left:1px solid #ddd;margin:0.25rem 0}\n.nm{font-weight:600}\n.meta{color:#555;font-size:0.9rem}\nfooter{margin-top:2rem;font-size:0.85rem;color:#555}\n`.trim();\n\n/**\n * Build a local inspection report (markdown or HTML) from v0.1 trace events.\n * Composes `what`, timeline, and execution-tree sections.\n */\nexport function buildRunReport(\n events: TraceEvent[],\n options: ReportOptions,\n): ReportResult {\n const profile = options.redactionProfile ?? \"local\";\n const section = options.section ?? \"all\";\n const safeEvents = redactTraceEventsForReport(events, {\n redactionProfile: profile,\n });\n const outcomes = summarizeObservedOutcomes(\n extractOutcomesFromTraceEvents(safeEvents),\n );\n const observationsMarkdown = renderObservedOutcomesMarkdown(outcomes);\n const observationsHtml = renderObservedOutcomesHtml(outcomes);\n\n if (section === \"observations\") {\n if (options.format === \"markdown\") {\n return {\n format: \"markdown\",\n content: `## Observed outcomes\\n\\n${observationsMarkdown}\\n`,\n contentType: \"text/markdown\",\n fileExtension: \".md\",\n };\n }\n return {\n format: \"html\",\n content: `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"/><title>Observed outcomes</title><style>${REPORT_HTML_CSS}</style></head><body><h1>Observed outcomes</h1>${observationsHtml}</body></html>`,\n contentType: \"text/html\",\n fileExtension: \".html\",\n };\n }\n\n const whatSummary = buildRunWhatSummary(safeEvents);\n const whatText = renderRunWhat(whatSummary, {\n correlation: options.correlation !== false,\n });\n const timelineText = renderTimeline(buildRunTimeline(safeEvents));\n const tree = resolveTree(safeEvents, profile);\n\n const exportOpts = {\n includeMetadata: false,\n includeAttributes: options.includeAttributes === true,\n includeErrors: options.includeErrors !== false,\n redacted: true,\n redactionProfile: profile,\n maxAttributeLength: 500,\n };\n\n if (options.format === \"markdown\") {\n const treeMd = exportMarkdown(tree, exportOpts);\n const tail = tailMarkdownSection(treeMd.content, \"Execution tree\");\n const title = escapeMarkdown(whatSummary.name ?? whatSummary.runId);\n const lines = [\n `# AgentInspect Report: ${title}`,\n \"\",\n \"Generated locally by AgentInspect. Review for sensitive data before sharing.\",\n \"\",\n \"## What happened\",\n \"\",\n \"```text\",\n whatText,\n \"```\",\n \"\",\n \"## Timeline\",\n \"\",\n \"```text\",\n timelineText,\n \"```\",\n \"\",\n \"## Observed outcomes\",\n \"\",\n observationsMarkdown,\n \"\",\n ];\n if (tail) {\n lines.push(tail, \"\");\n } else {\n lines.push(\"## Execution tree\", \"\", \"(no steps)\", \"\");\n }\n\n return {\n format: \"markdown\",\n content: lines.join(\"\\n\"),\n contentType: \"text/markdown\",\n fileExtension: \".md\",\n };\n }\n\n const treeHtml = exportHtml(tree, exportOpts);\n const title = escapeHtml(whatSummary.name ?? whatSummary.runId);\n const treeSection = extractHtmlFragment(\n treeHtml.content,\n '<section class=\"tree\">',\n \"</section>\",\n );\n // The exporter emits Errors before Attributes, so the errors fragment must\n // stop at the attributes heading when both sections are present; ending at\n // <footer> would swallow the attributes section and duplicate it below.\n const errorsSectionEnd = treeHtml.content.includes(\n \"<h2>Attributes (bounded)</h2>\",\n )\n ? \"<h2>Attributes (bounded)</h2>\"\n : \"<footer>\";\n const errorsSection = treeHtml.content.includes(\"<h2>Errors</h2>\")\n ? extractHtmlFragment(treeHtml.content, \"<h2>Errors</h2>\", errorsSectionEnd)\n : \"\";\n const attrsSection = treeHtml.content.includes(\"<h2>Attributes (bounded)</h2>\")\n ? extractHtmlFragment(\n treeHtml.content,\n \"<h2>Attributes (bounded)</h2>\",\n \"<footer>\",\n )\n : \"\";\n\n const html = `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<title>AgentInspect Report: ${title}</title>\n<style>${REPORT_HTML_CSS}</style>\n</head>\n<body>\n<header><h1>AgentInspect Report: ${title}</h1></header>\n<p class=\"note\">Generated locally by AgentInspect. Review for sensitive data before sharing.</p>\n<section class=\"what\"><h2>What happened</h2><pre>${escapeHtml(whatText)}</pre></section>\n<section class=\"timeline\"><h2>Timeline</h2><pre>${escapeHtml(timelineText)}</pre></section>\n<section class=\"observations\"><h2>Observed outcomes</h2>${observationsHtml}</section>\n${treeSection || \"<section class=\\\"tree\\\"><h2>Execution tree</h2><p>No steps recorded.</p></section>\"}\n${errorsSection}\n${attrsSection}\n<footer>Generated locally by AgentInspect. Review for sensitive data before sharing.</footer>\n</body>\n</html>`;\n\n return {\n format: \"html\",\n content: html,\n contentType: \"text/html\",\n fileExtension: \".html\",\n };\n}\n"]}
|