agent-inspect 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/README.md +34 -6
- package/docs/ADAPTERS.md +6 -0
- package/docs/API.md +132 -9
- package/docs/ARCHITECTURE.md +4 -0
- package/docs/CLI.md +98 -5
- package/docs/DIFF.md +8 -0
- package/docs/EXPORTS.md +13 -0
- package/docs/GETTING-STARTED.md +19 -1
- package/docs/KNOWN-ISSUES.md +8 -1
- package/docs/LIMITATIONS.md +13 -2
- package/docs/LOGS.md +22 -0
- package/docs/SCHEMA.md +19 -7
- package/docs/SCREENSHOTS.md +190 -9
- package/package.json +71 -1
- package/packages/cli/dist/index.cjs +7121 -3986
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +7122 -3987
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/core/dist/advanced.cjs +2258 -0
- package/packages/core/dist/advanced.cjs.map +1 -0
- package/packages/core/dist/advanced.d.cts +254 -0
- package/packages/core/dist/advanced.d.ts +254 -0
- package/packages/core/dist/advanced.mjs +11 -0
- package/packages/core/dist/advanced.mjs.map +1 -0
- package/packages/core/dist/chunk-57S5D6HR.mjs +655 -0
- package/packages/core/dist/chunk-57S5D6HR.mjs.map +1 -0
- package/packages/core/dist/chunk-6QSLZCBJ.mjs +743 -0
- package/packages/core/dist/chunk-6QSLZCBJ.mjs.map +1 -0
- package/packages/core/dist/chunk-6SZPTECC.mjs +342 -0
- package/packages/core/dist/chunk-6SZPTECC.mjs.map +1 -0
- package/packages/core/dist/chunk-74XZ6N7Q.mjs +409 -0
- package/packages/core/dist/chunk-74XZ6N7Q.mjs.map +1 -0
- package/packages/core/dist/chunk-7TGZLWEE.mjs +35 -0
- package/packages/core/dist/chunk-7TGZLWEE.mjs.map +1 -0
- package/packages/core/dist/chunk-BT7CATSD.mjs +497 -0
- package/packages/core/dist/chunk-BT7CATSD.mjs.map +1 -0
- package/packages/core/dist/chunk-E5F2LQCX.mjs +83 -0
- package/packages/core/dist/chunk-E5F2LQCX.mjs.map +1 -0
- package/packages/core/dist/chunk-EDTQHZPM.mjs +88 -0
- package/packages/core/dist/chunk-EDTQHZPM.mjs.map +1 -0
- package/packages/core/dist/chunk-HR7G62IE.mjs +785 -0
- package/packages/core/dist/chunk-HR7G62IE.mjs.map +1 -0
- package/packages/core/dist/chunk-HY7H3CQM.mjs +127 -0
- package/packages/core/dist/chunk-HY7H3CQM.mjs.map +1 -0
- package/packages/core/dist/chunk-S4YWKV4G.mjs +48 -0
- package/packages/core/dist/chunk-S4YWKV4G.mjs.map +1 -0
- package/packages/core/dist/chunk-TFLPUZ56.mjs +1571 -0
- package/packages/core/dist/chunk-TFLPUZ56.mjs.map +1 -0
- package/packages/core/dist/chunk-TZISEVLQ.mjs +390 -0
- package/packages/core/dist/chunk-TZISEVLQ.mjs.map +1 -0
- package/packages/core/dist/chunk-U2BGPESY.mjs +150 -0
- package/packages/core/dist/chunk-U2BGPESY.mjs.map +1 -0
- package/packages/core/dist/chunk-VTIB5MDK.mjs +304 -0
- package/packages/core/dist/chunk-VTIB5MDK.mjs.map +1 -0
- package/packages/core/dist/chunk-VU6O5QAH.mjs +99 -0
- package/packages/core/dist/chunk-VU6O5QAH.mjs.map +1 -0
- package/packages/core/dist/chunk-Y56BPA3B.mjs +990 -0
- package/packages/core/dist/chunk-Y56BPA3B.mjs.map +1 -0
- package/packages/core/dist/chunk-YWAOOXLR.mjs +475 -0
- package/packages/core/dist/chunk-YWAOOXLR.mjs.map +1 -0
- package/packages/core/dist/diff.cjs +993 -0
- package/packages/core/dist/diff.cjs.map +1 -0
- package/packages/core/dist/diff.d.cts +82 -0
- package/packages/core/dist/diff.d.ts +82 -0
- package/packages/core/dist/diff.mjs +5 -0
- package/packages/core/dist/diff.mjs.map +1 -0
- package/packages/core/dist/exporters.cjs +1228 -0
- package/packages/core/dist/exporters.cjs.map +1 -0
- package/packages/core/dist/exporters.d.cts +114 -0
- package/packages/core/dist/exporters.d.ts +114 -0
- package/packages/core/dist/exporters.mjs +6 -0
- package/packages/core/dist/exporters.mjs.map +1 -0
- package/packages/core/dist/index.cjs +5542 -2218
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +113 -908
- package/packages/core/dist/index.d.ts +113 -908
- package/packages/core/dist/index.mjs +1048 -5403
- package/packages/core/dist/index.mjs.map +1 -1
- package/packages/core/dist/inspect-event-Des4JDHo.d.cts +41 -0
- package/packages/core/dist/inspect-event-Des4JDHo.d.ts +41 -0
- package/packages/core/dist/log-config-BnH8Ykcb.d.cts +33 -0
- package/packages/core/dist/log-config-C1GcJPIM.d.ts +33 -0
- package/packages/core/dist/logs.cjs +1007 -0
- package/packages/core/dist/logs.cjs.map +1 -0
- package/packages/core/dist/logs.d.cts +138 -0
- package/packages/core/dist/logs.d.ts +138 -0
- package/packages/core/dist/logs.mjs +6 -0
- package/packages/core/dist/logs.mjs.map +1 -0
- package/packages/core/dist/persisted-inspect-event-0kaRADsp.d.cts +56 -0
- package/packages/core/dist/persisted-inspect-event-DiFto0K2.d.ts +56 -0
- package/packages/core/dist/persisted.cjs +1055 -0
- package/packages/core/dist/persisted.cjs.map +1 -0
- package/packages/core/dist/persisted.d.cts +111 -0
- package/packages/core/dist/persisted.d.ts +111 -0
- package/packages/core/dist/persisted.mjs +7 -0
- package/packages/core/dist/persisted.mjs.map +1 -0
- package/packages/core/dist/readers.cjs +2590 -0
- package/packages/core/dist/readers.cjs.map +1 -0
- package/packages/core/dist/readers.d.cts +80 -0
- package/packages/core/dist/readers.d.ts +80 -0
- package/packages/core/dist/readers.mjs +9 -0
- package/packages/core/dist/readers.mjs.map +1 -0
- package/packages/core/dist/types-DB8jB6Jg.d.cts +232 -0
- package/packages/core/dist/types-tSix7tfv.d.ts +232 -0
- package/packages/core/dist/writers.cjs +997 -0
- package/packages/core/dist/writers.cjs.map +1 -0
- package/packages/core/dist/writers.d.cts +62 -0
- package/packages/core/dist/writers.d.ts +62 -0
- package/packages/core/dist/writers.mjs +9 -0
- package/packages/core/dist/writers.mjs.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/logs/config.ts","../src/logs/json-parser.ts","../src/logs/log4js-parser.ts","../src/logs/mapping.ts","../src/logs/redactor.ts","../../../node_modules/.pnpm/nanoid@5.1.11/node_modules/nanoid/url-alphabet/index.js","../../../node_modules/.pnpm/nanoid@5.1.11/node_modules/nanoid/index.js","../src/logs/normalizer.ts","../src/logs/tree-builder.ts","../src/logs/tree-renderer.ts","../src/logs/line-parser.ts","../src/logs/live-tree.ts","../src/logs/index.ts"],"names":["readFile","isRecord","crypto"],"mappings":"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","file":"logs.cjs","sourcesContent":["import { readFile } from \"node:fs/promises\";\n\nimport type { LogEventMapping, LogIngestConfig, RedactionRule } from \"../types/log-config.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isNonEmptyStringArray(v: unknown): v is string[] {\n return (\n Array.isArray(v) &&\n v.length > 0 &&\n v.every((x) => typeof x === \"string\" && x.trim() !== \"\")\n );\n}\n\nfunction validateRedact(redact: unknown): asserts redact is RedactionRule[] {\n if (!Array.isArray(redact)) {\n throw new Error(\"Invalid config: redact must be an array\");\n }\n for (const r of redact) {\n if (typeof r === \"string\") continue;\n if (!isRecord(r)) {\n throw new Error(\"Invalid config: redact entries must be strings or objects\");\n }\n if (typeof r.key !== \"string\" || r.key.trim() === \"\") {\n throw new Error(\"Invalid config: redact.key must be a non-empty string\");\n }\n if (r.strategy !== \"full\" && r.strategy !== \"prefix\" && r.strategy !== \"hash\") {\n throw new Error(\n `Invalid config: redact.strategy must be one of full, prefix, hash (got ${String(\n r.strategy,\n )})`,\n );\n }\n if (r.keep !== undefined && (typeof r.keep !== \"number\" || !Number.isFinite(r.keep) || r.keep < 0)) {\n throw new Error(\"Invalid config: redact.keep must be a non-negative number when provided\");\n }\n }\n}\n\nfunction validateMappings(mappings: unknown): asserts mappings is Record<string, LogEventMapping> {\n if (!isRecord(mappings)) {\n throw new Error(\"Invalid config: mappings must be an object\");\n }\n}\n\nexport const DEFAULT_LOG_INGEST_CONFIG: LogIngestConfig = {\n runIdKeys: [\"runId\", \"traceId\", \"requestId\", \"decisionId\", \"jobId\"],\n eventKey: \"event\",\n timestampKey: \"timestamp\",\n messageKey: \"message\",\n levelKey: \"level\",\n heuristicWindowMs: 2000,\n mappings: {\n \"*.error\": { kind: \"ERROR\", status: \"error\" },\n \"*.failed\": { kind: \"ERROR\", status: \"error\" },\n \"*.llm.*\": { kind: \"LLM\" },\n \"*.tool.*\": { kind: \"TOOL\" },\n \"*.agent.*\": { kind: \"AGENT\" },\n \"*.retriever.*\": { kind: \"RETRIEVER\" },\n \"*.result.*\": { kind: \"RESULT\" },\n },\n};\n\nexport function mergeLogIngestConfig(\n base: LogIngestConfig,\n override: Partial<LogIngestConfig>,\n): LogIngestConfig {\n const merged: LogIngestConfig = {\n ...base,\n ...override,\n mappings: {\n ...(base.mappings ?? {}),\n ...(override.mappings ?? {}),\n },\n };\n return merged;\n}\n\nexport async function loadLogIngestConfig(configPath?: string): Promise<LogIngestConfig> {\n if (configPath === undefined || configPath.trim() === \"\") {\n return DEFAULT_LOG_INGEST_CONFIG;\n }\n\n let rawText: string;\n try {\n rawText = await readFile(configPath, \"utf-8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to read config file: ${configPath} (${msg})`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText) as unknown;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Invalid JSON in config file: ${configPath} (${msg})`);\n }\n\n if (!isRecord(parsed)) {\n throw new Error(\"Invalid config: expected a JSON object at top-level\");\n }\n\n const user = parsed as Partial<LogIngestConfig>;\n\n if (user.runIdKeys !== undefined && !isNonEmptyStringArray(user.runIdKeys)) {\n throw new Error(\"Invalid config: runIdKeys must be a non-empty array of strings\");\n }\n if (user.eventKey !== undefined && (typeof user.eventKey !== \"string\" || user.eventKey.trim() === \"\")) {\n throw new Error(\"Invalid config: eventKey must be a non-empty string\");\n }\n\n for (const k of [\n \"timestampKey\",\n \"messageKey\",\n \"levelKey\",\n \"parentIdKey\",\n \"durationKey\",\n \"statusKey\",\n ] as const) {\n const v = (user as any)[k];\n if (v !== undefined && (typeof v !== \"string\" || v.trim() === \"\")) {\n throw new Error(`Invalid config: ${k} must be a non-empty string when provided`);\n }\n }\n\n if (user.mappings !== undefined) {\n validateMappings(user.mappings);\n }\n if (user.redact !== undefined) {\n validateRedact(user.redact);\n }\n if (\n user.heuristicWindowMs !== undefined &&\n (typeof user.heuristicWindowMs !== \"number\" ||\n !Number.isFinite(user.heuristicWindowMs) ||\n user.heuristicWindowMs < 0)\n ) {\n throw new Error(\"Invalid config: heuristicWindowMs must be a non-negative number when provided\");\n }\n\n // Explicitly reject obviously unsafe config patterns.\n if ((user as any).redact && JSON.stringify((user as any).redact).includes(\"=>\")) {\n throw new Error(\"Invalid config: function strings are not supported in redact rules\");\n }\n\n return mergeLogIngestConfig(DEFAULT_LOG_INGEST_CONFIG, user);\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nexport class JsonLogParser {\n parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord> {\n const records: RawLogRecord[] = [];\n const warnings: ParserWarning[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNumber = i + 1;\n const raw = lines[i] ?? \"\";\n const trimmed = raw.trim();\n if (trimmed === \"\") continue;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed) as unknown;\n } catch {\n warnings.push({\n code: \"MALFORMED_JSON\",\n message: \"Malformed JSON log line\",\n file: filePath,\n line: lineNumber,\n raw: trimmed.slice(0, 500),\n });\n continue;\n }\n if (!isRecord(parsed)) {\n warnings.push({\n code: \"MALFORMED_JSON\",\n message: \"JSON log line must be an object\",\n file: filePath,\n line: lineNumber,\n raw: trimmed.slice(0, 500),\n });\n continue;\n }\n records.push({\n raw: parsed,\n file: filePath,\n line: lineNumber,\n sourceType: \"json-log\",\n });\n }\n\n return { records, warnings };\n }\n\n async parseFile(filePath: string): Promise<ParseResult<RawLogRecord>> {\n let text: string;\n try {\n text = await readFile(filePath, \"utf-8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to read log file: ${filePath} (${msg})`);\n }\n const lines = text.split(/\\r?\\n/);\n return this.parseLines(lines, filePath);\n }\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction findLastJsonObjectSubstring(line: string): string | undefined {\n // Scan for balanced {...} regions and keep the last one.\n // This is deliberately conservative: it does not attempt to parse JS object literal syntax.\n let last: { start: number; end: number } | undefined;\n for (let i = 0; i < line.length; i++) {\n if (line[i] !== \"{\") continue;\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let j = i; j < line.length; j++) {\n const ch = line[j]!;\n if (inString) {\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (ch === '\"') {\n inString = true;\n continue;\n }\n if (ch === \"{\") depth += 1;\n if (ch === \"}\") depth -= 1;\n if (depth === 0) {\n last = { start: i, end: j + 1 };\n i = j;\n break;\n }\n if (depth < 0) break;\n }\n }\n if (!last) return undefined;\n return line.slice(last.start, last.end);\n}\n\nexport class Log4jsParser {\n parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord> {\n const records: RawLogRecord[] = [];\n const warnings: ParserWarning[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lineNumber = i + 1;\n const rawLine = lines[i] ?? \"\";\n const trimmed = rawLine.trim();\n if (trimmed === \"\") continue;\n\n const jsonText = findLastJsonObjectSubstring(trimmed);\n if (!jsonText) {\n warnings.push({\n code: \"UNSUPPORTED_LOG4JS_PAYLOAD\",\n message: \"No embedded JSON object found in log4js line\",\n file: filePath,\n line: lineNumber,\n raw: trimmed.slice(0, 500),\n });\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(jsonText) as unknown;\n } catch {\n warnings.push({\n code: \"MALFORMED_JSON\",\n message: \"Malformed embedded JSON object in log4js line\",\n file: filePath,\n line: lineNumber,\n raw: jsonText.slice(0, 500),\n });\n continue;\n }\n\n if (!isRecord(parsed)) {\n warnings.push({\n code: \"UNSUPPORTED_LOG4JS_PAYLOAD\",\n message: \"Embedded JSON payload must be an object\",\n file: filePath,\n line: lineNumber,\n raw: jsonText.slice(0, 500),\n });\n continue;\n }\n\n records.push({\n raw: parsed,\n file: filePath,\n line: lineNumber,\n sourceType: \"log4js\",\n });\n }\n\n return { records, warnings };\n }\n\n async parseFile(filePath: string): Promise<ParseResult<RawLogRecord>> {\n let text: string;\n try {\n text = await readFile(filePath, \"utf-8\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Failed to read log file: ${filePath} (${msg})`);\n }\n const lines = text.split(/\\r?\\n/);\n return this.parseLines(lines, filePath);\n }\n}\n\n","import type { LogEventMapping } from \"../types/log-config.js\";\n\nexport function wildcardMatch(pattern: string, value: string): boolean {\n if (pattern === value) return true;\n if (!pattern.includes(\"*\")) return false;\n\n const parts = pattern.split(\"*\");\n let idx = 0;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n if (part === \"\") continue;\n const found = value.indexOf(part, idx);\n if (found === -1) return false;\n if (i === 0 && !pattern.startsWith(\"*\") && found !== 0) return false;\n idx = found + part.length;\n }\n if (!pattern.endsWith(\"*\")) {\n const last = parts[parts.length - 1]!;\n if (last !== \"\" && !value.endsWith(last)) return false;\n if (last === \"\" && !value.endsWith(parts[parts.length - 2] ?? \"\")) return false;\n }\n return true;\n}\n\nexport function matchMapping(\n eventName: string,\n mappings?: Record<string, LogEventMapping>,\n): LogEventMapping | undefined {\n if (!mappings) return undefined;\n if (mappings[eventName]) return mappings[eventName];\n\n let bestKey: string | undefined;\n let bestScore = -1;\n\n for (const key of Object.keys(mappings)) {\n if (!key.includes(\"*\")) continue;\n if (!wildcardMatch(key, eventName)) continue;\n const score = key.replaceAll(\"*\", \"\").length;\n if (score > bestScore) {\n bestScore = score;\n bestKey = key;\n }\n }\n\n return bestKey ? mappings[bestKey] : undefined;\n}\n\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","export let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import { webcrypto as crypto } from 'node:crypto'\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nconst POOL_SIZE_MULTIPLIER = 128\nlet pool, poolOffset\nfunction fillPool(bytes) {\n if (bytes < 0 || bytes > 1024) throw new RangeError('Wrong ID size')\n if (!pool || pool.length < bytes) {\n pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER)\n crypto.getRandomValues(pool)\n poolOffset = 0\n } else if (poolOffset + bytes > pool.length) {\n crypto.getRandomValues(pool)\n poolOffset = 0\n }\n poolOffset += bytes\n}\nexport function random(bytes) {\n fillPool((bytes |= 0))\n return pool.subarray(poolOffset - bytes, poolOffset)\n}\nexport function customRandom(alphabet, defaultSize, getRandom) {\n let safeByteCutoff = 256 - (256 % alphabet.length)\n if (safeByteCutoff === 256) {\n let mask = alphabet.length - 1\n return (size = defaultSize) => {\n if (!size) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(size)\n let i = size\n while (i--) {\n id += alphabet[bytes[i] & mask]\n if (id.length >= size) return id\n }\n }\n }\n }\n let step = Math.ceil((1.6 * 256 * defaultSize) / safeByteCutoff)\n return (size = defaultSize) => {\n if (!size) return ''\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let i = step\n while (i--) {\n if (bytes[i] < safeByteCutoff) {\n id += alphabet[bytes[i] % alphabet.length]\n if (id.length >= size) return id\n }\n }\n }\n }\n}\nexport function customAlphabet(alphabet, size = 21) {\n return customRandom(alphabet, size, random)\n}\nexport function nanoid(size = 21) {\n fillPool((size |= 0))\n let id = ''\n for (let i = poolOffset - size; i < poolOffset; i++) {\n id += scopedUrlAlphabet[pool[i] & 63]\n }\n return id\n}\n","import { nanoid } from \"nanoid\";\n\nimport type { InspectEvent, InspectKind } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\nimport { matchMapping } from \"./mapping.js\";\n\nfunction isFiniteNumber(v: unknown): v is number {\n return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction safeString(v: unknown): string | undefined {\n if (typeof v !== \"string\") return undefined;\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\nfunction parseTimestamp(v: unknown): number | undefined {\n if (isFiniteNumber(v)) return v;\n if (typeof v === \"string\") {\n const t = Date.parse(v);\n if (Number.isFinite(t)) return t;\n }\n return undefined;\n}\n\nfunction hasToken(hay: string, token: string): boolean {\n return hay.includes(token);\n}\n\nfunction inferKind(eventName: string): InspectKind {\n if (hasToken(eventName, \".llm.\")) return \"LLM\";\n if (hasToken(eventName, \".tool.\")) return \"TOOL\";\n if (hasToken(eventName, \".agent.\")) return \"AGENT\";\n if (hasToken(eventName, \".retriever.\")) return \"RETRIEVER\";\n if (hasToken(eventName, \".result.\")) return \"RESULT\";\n if (eventName.endsWith(\".error\") || eventName.endsWith(\".failed\") || eventName.includes(\".error\") || eventName.includes(\".failed\")) {\n return \"ERROR\";\n }\n return \"LOG\";\n}\n\nfunction deriveName(eventName: string, kind: InspectKind): string {\n const parts = eventName.split(\".\");\n const last = parts[parts.length - 1] ?? eventName;\n if (kind === \"LLM\") return `llm:${last}`;\n if (kind === \"TOOL\") return `tool:${last}`;\n if (kind === \"AGENT\") return `agent:${last}`;\n if (kind === \"RESULT\") return `result:${last}`;\n if (kind === \"RUN\") return `run:${last}`;\n if (kind === \"RETRIEVER\") return `retriever:${last}`;\n if (kind === \"ERROR\") return `error:${last}`;\n return eventName;\n}\n\nexport interface NormalizeOptions {\n config: LogIngestConfig;\n sourceFile?: string;\n}\n\nexport class EventNormalizer {\n readonly #config: LogIngestConfig;\n\n constructor(options: NormalizeOptions) {\n this.#config = options.config;\n }\n\n #normalizeInternal(\n record: RawLogRecord,\n ): { event?: InspectEvent; warning?: ParserWarning } {\n const raw = record.raw;\n const cfg = this.#config;\n\n // runId\n let runId: string | undefined;\n for (const k of cfg.runIdKeys) {\n const v = raw[k];\n const s = safeString(v);\n if (s) {\n runId = s;\n break;\n }\n }\n if (!runId) {\n return {\n warning: {\n code: \"MISSING_RUN_ID\",\n message: \"Missing run id (none of runIdKeys present)\",\n file: record.file,\n line: record.line,\n },\n };\n }\n\n // event name\n const eventName = safeString(raw[cfg.eventKey]);\n if (!eventName) {\n return {\n warning: {\n code: \"MISSING_EVENT\",\n message: `Missing event name (key: ${cfg.eventKey})`,\n file: record.file,\n line: record.line,\n },\n };\n }\n\n const mapping = matchMapping(eventName, cfg.mappings);\n\n // timestamp\n const tsKey = cfg.timestampKey ?? \"timestamp\";\n const tsRaw = raw[tsKey];\n const parsedTs = parseTimestamp(tsRaw);\n const timestamp = parsedTs ?? Date.now();\n const timestampMissing = parsedTs === undefined;\n\n // parentId\n const parentIdKey = cfg.parentIdKey;\n const parentId = parentIdKey ? safeString(raw[parentIdKey]) : undefined;\n\n // duration\n let durationMs: number | undefined;\n const durationKey = cfg.durationKey;\n if (durationKey) {\n const v = raw[durationKey];\n if (isFiniteNumber(v)) durationMs = v;\n } else if (isFiniteNumber((raw as any).durationMs)) {\n durationMs = (raw as any).durationMs as number;\n }\n\n // status\n let status: InspectEvent[\"status\"] | undefined;\n const statusKey = cfg.statusKey;\n const statusRaw = statusKey ? safeString(raw[statusKey]) : undefined;\n if (statusRaw === \"running\" || statusRaw === \"ok\" || statusRaw === \"error\") {\n status = statusRaw;\n } else if (mapping?.status) {\n status = mapping.status;\n } else if (mapping?.kind === \"ERROR\") {\n status = \"error\";\n } else if (eventName.includes(\".failed\") || eventName.includes(\".error\")) {\n status = \"error\";\n } else if (mapping?.startsRun || mapping?.startsStep) {\n status = \"running\";\n } else if (mapping?.endsRun || mapping?.endsStep) {\n status = \"ok\";\n }\n\n // kind\n const kind: InspectKind = mapping?.kind ?? inferKind(eventName);\n\n // name\n const name = mapping?.name ?? deriveName(eventName, kind);\n\n // confidence\n let confidence: InspectEvent[\"confidence\"] = \"correlated\";\n if (parentId || mapping?.startsRun) confidence = \"explicit\";\n if (timestampMissing) confidence = \"unknown\";\n\n // attributes: exclude used keys\n const omit = new Set<string>([\n ...cfg.runIdKeys,\n cfg.eventKey,\n tsKey,\n cfg.messageKey ?? \"message\",\n cfg.levelKey ?? \"level\",\n cfg.parentIdKey ?? \"\",\n cfg.durationKey ?? \"\",\n cfg.statusKey ?? \"\",\n \"durationMs\",\n ].filter((k) => k !== \"\"));\n\n const attributes: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (omit.has(k)) continue;\n attributes[k] = v;\n }\n\n const event: InspectEvent = {\n eventId: nanoid(10),\n runId,\n ...(parentId ? { parentId } : {}),\n name,\n kind,\n timestamp,\n ...(status ? { status } : {}),\n ...(durationMs !== undefined ? { durationMs } : {}),\n ...(Object.keys(attributes).length > 0 ? { attributes } : {}),\n confidence,\n source: {\n type: record.sourceType,\n file: record.file,\n line: record.line,\n },\n };\n\n if (timestampMissing) {\n return {\n event,\n warning: {\n code: \"MISSING_TIMESTAMP\",\n message: `Missing or invalid timestamp (key: ${tsKey})`,\n file: record.file,\n line: record.line,\n raw: JSON.stringify(raw).slice(0, 500),\n },\n };\n }\n\n return { event };\n }\n\n normalize(record: RawLogRecord): InspectEvent | ParserWarning {\n const r = this.#normalizeInternal(record);\n return r.event ?? (r.warning as ParserWarning);\n }\n\n normalizeAll(records: RawLogRecord[]): ParseResult<InspectEvent> {\n const out: InspectEvent[] = [];\n const warnings: ParserWarning[] = [];\n for (const r of records) {\n const normalized = this.#normalizeInternal(r);\n if (normalized.event) out.push(normalized.event);\n if (normalized.warning) warnings.push(normalized.warning);\n }\n return { records: out, warnings };\n }\n}\n\n","import type { InspectEvent, InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\n\nexport interface TreeBuilderOptions {\n config?: LogIngestConfig;\n}\n\nfunction inc<T extends string>(map: Record<T, number>, key: T): void {\n map[key] = (map[key] ?? 0) + 1;\n}\n\nfunction computeRunStatus(events: InspectEvent[]): InspectRunTree[\"status\"] {\n let hasRunning = false;\n for (const e of events) {\n if (e.status === \"error\") return \"error\";\n if (e.status === \"running\") hasRunning = true;\n }\n if (hasRunning) return \"running\";\n return \"ok\";\n}\n\nexport class TreeBuilder {\n constructor(options?: TreeBuilderOptions) {\n void options?.config;\n }\n\n build(events: InspectEvent[]): InspectRunTree[] {\n const byRun = new Map<string, InspectEvent[]>();\n for (const e of events) {\n if (!byRun.has(e.runId)) byRun.set(e.runId, []);\n byRun.get(e.runId)!.push(e);\n }\n\n const out: InspectRunTree[] = [];\n for (const [runId, runEvents] of byRun.entries()) {\n const sorted = [...runEvents].sort((a, b) => a.timestamp - b.timestamp);\n\n const nodes = new Map<string, InspectNode>();\n for (const e of sorted) {\n nodes.set(e.eventId, { event: e, children: [], depth: 0 });\n }\n\n const roots: InspectNode[] = [];\n for (const node of nodes.values()) {\n const parentId = node.event.parentId;\n if (parentId && nodes.has(parentId)) {\n nodes.get(parentId)!.children.push(node);\n } else {\n roots.push(node);\n }\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 // metadata\n const confidenceBreakdown = {\n explicit: 0,\n correlated: 0,\n heuristic: 0,\n unknown: 0,\n } as Record<InspectEvent[\"confidence\"], number>;\n const kinds = {} as Record<InspectEvent[\"kind\"], number>;\n for (const e of sorted) {\n inc(confidenceBreakdown, e.confidence);\n (kinds as any)[e.kind] = ((kinds as any)[e.kind] ?? 0) + 1;\n }\n\n const startedAt = sorted.length > 0 ? sorted[0]!.timestamp : undefined;\n const endedAt = sorted.length > 0 ? sorted[sorted.length - 1]!.timestamp : undefined;\n const status = computeRunStatus(sorted);\n const durationMs =\n startedAt !== undefined &&\n endedAt !== undefined &&\n Number.isFinite(startedAt) &&\n Number.isFinite(endedAt) &&\n endedAt >= startedAt &&\n status !== \"running\"\n ? endedAt - startedAt\n : undefined;\n\n const name = sorted.find((e) => e.kind === \"RUN\")?.name;\n\n out.push({\n runId,\n name,\n status,\n startedAt,\n endedAt: status === \"running\" ? undefined : endedAt,\n durationMs,\n children: roots,\n metadata: {\n totalEvents: sorted.length,\n confidenceBreakdown,\n kinds,\n },\n });\n }\n\n // newest first for stable display\n out.sort((a, b) => (b.startedAt ?? 0) - (a.startedAt ?? 0));\n return out;\n }\n}\n\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nexport interface RenderTreeOptions {\n verbose?: boolean;\n showConfidence?: \"always\" | \"non-explicit\" | \"never\";\n showMetadata?: boolean;\n color?: boolean;\n maxAttributeLength?: number;\n summary?: boolean;\n}\n\nfunction truncate(v: string, max: number): string {\n if (v.length <= max) return v;\n return v.slice(0, Math.max(0, max - 1)) + \"…\";\n}\n\nfunction fmtAttrValue(value: unknown, maxLen: number): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\") return truncate(value, maxLen);\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n if (typeof value === \"object\") {\n try {\n return truncate(JSON.stringify(value), maxLen);\n } catch {\n return \"[object]\";\n }\n }\n return String(value);\n}\n\nfunction compactAttrs(attrs: Record<string, unknown> | undefined, maxLen: number): string {\n if (!attrs) return \"\";\n const entries = Object.entries(attrs);\n if (entries.length === 0) return \"\";\n\n const picks = new Map<string, string>();\n const set = (k: string, v: unknown) => {\n const s = fmtAttrValue(v, maxLen);\n if (s !== undefined) picks.set(k, s);\n };\n\n // Prefer common keys in expected output\n set(\"job\", attrs.jobId ?? attrs.job ?? attrs.jobUuid);\n set(\"user\", attrs.userUuid ?? attrs.userId ?? attrs.user);\n set(\"trip\", attrs.tripUuid ?? attrs.tripId ?? attrs.trip);\n set(\"msgs\", attrs.messageCount ?? attrs.msgs);\n set(\"trips\", attrs.trips);\n set(\"model\", attrs.model);\n\n // tokens: input/output\n const tokens = attrs.tokens;\n if (tokens && typeof tokens === \"object\" && tokens !== null) {\n const input = (tokens as any).input;\n const output = (tokens as any).output;\n if (typeof input === \"number\" || typeof output === \"number\") {\n picks.set(\"tokens\", `${input ?? \"?\"}/${output ?? \"?\"}`);\n }\n }\n\n // Allow a few booleans/strings\n for (const k of [\"shouldNotify\", \"variant\"] as const) {\n if (k in attrs) set(k, (attrs as any)[k]);\n }\n\n const rendered = [...picks.entries()]\n .filter(([, v]) => v !== \"\")\n .map(([k, v]) => `${k}=${v}`);\n\n return rendered.length > 0 ? \" \" + rendered.join(\" \") : \"\";\n}\n\nfunction statusMark(node: InspectNode): string {\n if (node.event.status === \"error\") return \" ✖\";\n if (node.event.status === \"ok\") return \" ✔\";\n return \"\";\n}\n\nfunction fmtDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) return \"\";\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction renderNodeLines(node: InspectNode, prefix: string, isLast: boolean, options: Required<RenderTreeOptions>): string[] {\n const branch = prefix + (isLast ? \"└─ \" : \"├─ \");\n const nextPrefix = prefix + (isLast ? \" \" : \"│ \");\n const attrs = compactAttrs(node.event.attributes, options.maxAttributeLength);\n const dur = node.event.durationMs !== undefined ? ` ${fmtDuration(node.event.durationMs)}` : \"\";\n const line = `${branch}${node.event.name}${attrs}${statusMark(node)}${dur}`;\n\n const lines = [line];\n\n const showConf =\n options.showConfidence === \"always\" ||\n (options.showConfidence === \"non-explicit\" && node.event.confidence !== \"explicit\");\n if (showConf) {\n lines.push(`${nextPrefix}confidence: ${node.event.confidence}`);\n }\n\n const children = node.children;\n for (let i = 0; i < children.length; i++) {\n lines.push(...renderNodeLines(children[i]!, nextPrefix, i === children.length - 1, options));\n }\n return lines;\n}\n\nexport function renderRunTree(tree: InspectRunTree, options?: RenderTreeOptions): string {\n const opts: Required<RenderTreeOptions> = {\n verbose: options?.verbose ?? false,\n showConfidence: options?.showConfidence ?? \"always\",\n showMetadata: options?.showMetadata ?? false,\n color: options?.color ?? false,\n maxAttributeLength: options?.maxAttributeLength ?? 40,\n summary: options?.summary ?? true,\n };\n\n const header = `Run ${tree.runId}`;\n const lines: string[] = [header];\n\n const children = tree.children;\n for (let i = 0; i < children.length; i++) {\n lines.push(...renderNodeLines(children[i]!, \"\", i === children.length - 1, opts));\n }\n\n if (opts.summary) {\n const cb = tree.metadata.confidenceBreakdown;\n const tools = tree.metadata.kinds.TOOL ?? 0;\n const llms = tree.metadata.kinds.LLM ?? 0;\n lines.push(\"\");\n lines.push(\"Summary:\");\n lines.push(` Events: ${tree.metadata.totalEvents}`);\n lines.push(` Tools: ${tools}`);\n lines.push(` LLMs: ${llms}`);\n lines.push(\n ` Confidence: ${cb.explicit} explicit, ${cb.correlated} correlated, ${cb.heuristic} heuristic, ${cb.unknown} unknown`,\n );\n lines.push(\"\");\n lines.push(\"Note:\");\n lines.push(\" Flat timeline by default. Nesting only with explicit parentId.\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function renderRunTrees(trees: InspectRunTree[], options?: RenderTreeOptions): string {\n return trees.map((t) => renderRunTree(t, options)).join(\"\\n\\n\");\n}\n\n","import type { RawLogRecord } from \"./raw-record.js\";\nimport { JsonLogParser } from \"./json-parser.js\";\nimport { Log4jsParser } from \"./log4js-parser.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nexport type LogSourceFormat = \"json\" | \"log4js\" | \"auto\";\n\nexport interface ParseLogLineOptions {\n format?: LogSourceFormat;\n file?: string;\n line?: number;\n}\n\nfunction shiftLineNumbers(\n res: ParseResult<RawLogRecord>,\n options: ParseLogLineOptions,\n): ParseResult<RawLogRecord> {\n const targetLine =\n typeof options.line === \"number\" && Number.isFinite(options.line) && options.line > 0\n ? Math.floor(options.line)\n : undefined;\n const file = typeof options.file === \"string\" && options.file.trim() !== \"\" ? options.file : undefined;\n\n if (targetLine === undefined && file === undefined) return res;\n\n const mapRecord = (x: RawLogRecord): RawLogRecord => ({\n ...x,\n ...(targetLine !== undefined ? { line: targetLine } : {}),\n ...(file !== undefined ? { file } : {}),\n });\n\n const mapWarning = (x: ParserWarning): ParserWarning => ({\n ...x,\n ...(targetLine !== undefined ? { line: targetLine } : {}),\n ...(file !== undefined ? { file } : {}),\n });\n\n return {\n records: res.records.map(mapRecord),\n warnings: res.warnings.map(mapWarning),\n };\n}\n\nfunction normalizeFormat(line: string, format: LogSourceFormat | undefined): LogSourceFormat {\n if (format && format !== \"auto\") return format;\n const trimmed = line.trim();\n if (trimmed.startsWith(\"{\")) return \"json\";\n return \"log4js\";\n}\n\nexport function parseLogLine(\n line: string,\n options: ParseLogLineOptions = {},\n): ParseResult<RawLogRecord> {\n const raw = typeof line === \"string\" ? line : \"\";\n const trimmed = raw.trim();\n if (trimmed === \"\") return { records: [], warnings: [] };\n\n const format = normalizeFormat(raw, options.format);\n const base =\n format === \"json\"\n ? new JsonLogParser().parseLines([raw], options.file)\n : new Log4jsParser().parseLines([raw], options.file);\n\n // JsonLogParser/Log4jsParser always number lines starting at 1; for streaming tail we\n // need to preserve the real stream/file line number when provided.\n return shiftLineNumbers(base, options);\n}\n\n","import type { InspectEvent, InspectRunTree } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport { mergeLogIngestConfig } from \"./config.js\";\nimport type { LogSourceFormat } from \"./line-parser.js\";\nimport { parseLogLine } from \"./line-parser.js\";\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { Redactor } from \"./redactor.js\";\nimport { TreeBuilder } from \"./tree-builder.js\";\nimport type { ParserWarning } from \"./warnings.js\";\n\nexport interface LiveLogUpdate {\n events: InspectEvent[];\n trees: InspectRunTree[];\n warnings: ParserWarning[];\n}\n\nexport interface LiveLogAccumulatorOptions {\n config: LogIngestConfig;\n format?: LogSourceFormat;\n file?: string;\n}\n\nexport class LiveLogAccumulator {\n readonly #config: LogIngestConfig;\n readonly #format: LogSourceFormat;\n readonly #file?: string;\n\n readonly #normalizer: EventNormalizer;\n readonly #redactor: Redactor;\n readonly #treeBuilder: TreeBuilder;\n\n #events: InspectEvent[] = [];\n #warnings: ParserWarning[] = [];\n #trees: InspectRunTree[] = [];\n\n constructor(options: LiveLogAccumulatorOptions) {\n // Ensure defaults are applied consistently.\n this.#config = mergeLogIngestConfig(options.config, {});\n this.#format = options.format ?? \"auto\";\n this.#file = options.file;\n\n this.#normalizer = new EventNormalizer({ config: this.#config });\n this.#redactor = new Redactor({ rules: this.#config.redact });\n this.#treeBuilder = new TreeBuilder({ config: this.#config });\n }\n\n pushLine(line: string, lineNumber?: number): LiveLogUpdate {\n try {\n const parsed = parseLogLine(line, {\n format: this.#format,\n file: this.#file,\n line: lineNumber,\n });\n\n const normalized = this.#normalizer.normalizeAll(parsed.records);\n\n // Redact attributes after normalization, before storing.\n const redactedEvents = normalized.records.map((e) => ({\n ...e,\n attributes: e.attributes ? this.#redactor.redactRecord(e.attributes) : undefined,\n }));\n\n this.#events = [...this.#events, ...redactedEvents];\n this.#warnings = [...this.#warnings, ...parsed.warnings, ...normalized.warnings];\n this.#trees = this.#treeBuilder.build(this.#events);\n\n return {\n events: this.#events,\n trees: this.#trees,\n warnings: this.#warnings,\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const warning: ParserWarning = {\n code: \"UNKNOWN\",\n message: `LiveLogAccumulator failed to process line (${msg})`,\n file: this.#file,\n line: lineNumber,\n raw: typeof line === \"string\" ? line.slice(0, 500) : undefined,\n };\n this.#warnings = [...this.#warnings, warning];\n return { events: this.#events, trees: this.#trees, warnings: this.#warnings };\n }\n }\n\n getEvents(): InspectEvent[] {\n return this.#events;\n }\n\n getTrees(): InspectRunTree[] {\n return this.#trees;\n }\n\n getWarnings(): ParserWarning[] {\n return this.#warnings;\n }\n\n reset(): void {\n this.#events = [];\n this.#trees = [];\n this.#warnings = [];\n }\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { InspectEvent, InspectRunTree } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport { loadLogIngestConfig, mergeLogIngestConfig } from \"./config.js\";\nimport { JsonLogParser } from \"./json-parser.js\";\nimport { Log4jsParser } from \"./log4js-parser.js\";\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport { Redactor } from \"./redactor.js\";\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { TreeBuilder } from \"./tree-builder.js\";\nimport type { ParserWarning } from \"./warnings.js\";\nexport type { LogSourceFormat, ParseLogLineOptions } from \"./line-parser.js\";\nexport { parseLogLine } from \"./line-parser.js\";\nexport type { LiveLogUpdate, LiveLogAccumulatorOptions } from \"./live-tree.js\";\nexport { LiveLogAccumulator } from \"./live-tree.js\";\n\nexport interface ParseLogsOptions {\n format?: \"json\" | \"log4js\" | \"auto\";\n config?: LogIngestConfig;\n configPath?: string;\n runIdKeys?: string[];\n eventKey?: string;\n timestampKey?: string;\n messageKey?: string;\n levelKey?: string;\n parentIdKey?: string;\n durationKey?: string;\n statusKey?: string;\n warnings?: \"none\" | \"summary\" | \"all\";\n}\n\nexport interface LogToTreeResult {\n events: InspectEvent[];\n trees: InspectRunTree[];\n warnings: ParserWarning[];\n}\n\nfunction firstNonEmptyLine(text: string): string | undefined {\n for (const line of text.split(/\\r?\\n/)) {\n const t = line.trim();\n if (t !== \"\") return t;\n }\n return undefined;\n}\n\nasync function detectFormat(\n filePath: string,\n): Promise<\"json\" | \"log4js\"> {\n const text = await readFile(filePath, \"utf-8\");\n const first = firstNonEmptyLine(text);\n if (!first) return \"log4js\";\n if (!first.startsWith(\"{\")) return \"log4js\";\n try {\n const parsed = JSON.parse(first) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return \"json\";\n } catch {\n /* ignore */\n }\n return \"log4js\";\n}\n\nfunction applyOverrides(\n cfg: LogIngestConfig,\n options: ParseLogsOptions,\n): LogIngestConfig {\n const override: Partial<LogIngestConfig> = {};\n for (const k of [\n \"runIdKeys\",\n \"eventKey\",\n \"timestampKey\",\n \"messageKey\",\n \"levelKey\",\n \"parentIdKey\",\n \"durationKey\",\n \"statusKey\",\n ] as const) {\n const v = (options as any)[k];\n if (v !== undefined) (override as any)[k] = v;\n }\n return mergeLogIngestConfig(cfg, override);\n}\n\n/**\n * @experimental Compatibility-oriented API for parsing structured logs into normalized run trees.\n * Subject to refinement before a future stability declaration.\n */\nexport async function parseLogsToTrees(\n filePath: string,\n options: ParseLogsOptions = {},\n): Promise<LogToTreeResult> {\n const base =\n options.config ??\n (await loadLogIngestConfig(options.configPath));\n const config = applyOverrides(base, options);\n\n const format =\n options.format === \"auto\" || options.format === undefined\n ? await detectFormat(filePath)\n : options.format;\n\n let parsed: { records: RawLogRecord[]; warnings: ParserWarning[] };\n if (format === \"json\") {\n parsed = await new JsonLogParser().parseFile(filePath);\n } else {\n parsed = await new Log4jsParser().parseFile(filePath);\n }\n\n const normalizer = new EventNormalizer({ config });\n const normalized = normalizer.normalizeAll(parsed.records);\n\n // Redact attributes after normalization.\n const redactor = new Redactor({ rules: config.redact });\n const events: InspectEvent[] = normalized.records.map((e) => ({\n ...e,\n attributes: e.attributes ? redactor.redactRecord(e.attributes) : undefined,\n }));\n\n const trees = new TreeBuilder({ config }).build(events);\n\n return {\n events,\n trees,\n warnings: [...parsed.warnings, ...normalized.warnings],\n };\n}\n\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { a as LogIngestConfig, L as LogEventMapping, R as RedactionRule } from './log-config-BnH8Ykcb.cjs';
|
|
2
|
+
export { b as RedactionStrategy } from './log-config-BnH8Ykcb.cjs';
|
|
3
|
+
import { a as InspectEvent, c as InspectRunTree } from './inspect-event-Des4JDHo.cjs';
|
|
4
|
+
|
|
5
|
+
type ParserWarningCode = "MALFORMED_JSON" | "MISSING_RUN_ID" | "MISSING_EVENT" | "MISSING_TIMESTAMP" | "UNSUPPORTED_LOG4JS_PAYLOAD" | "CONFIG_ERROR" | "UNKNOWN";
|
|
6
|
+
interface ParserWarning {
|
|
7
|
+
code: ParserWarningCode;
|
|
8
|
+
message: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
line?: number;
|
|
11
|
+
raw?: string;
|
|
12
|
+
}
|
|
13
|
+
interface ParseResult<T> {
|
|
14
|
+
records: T[];
|
|
15
|
+
warnings: ParserWarning[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare const DEFAULT_LOG_INGEST_CONFIG: LogIngestConfig;
|
|
19
|
+
declare function mergeLogIngestConfig(base: LogIngestConfig, override: Partial<LogIngestConfig>): LogIngestConfig;
|
|
20
|
+
declare function loadLogIngestConfig(configPath?: string): Promise<LogIngestConfig>;
|
|
21
|
+
|
|
22
|
+
interface RawLogRecord {
|
|
23
|
+
raw: Record<string, unknown>;
|
|
24
|
+
file?: string;
|
|
25
|
+
line: number;
|
|
26
|
+
sourceType: "json-log" | "log4js";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare class JsonLogParser {
|
|
30
|
+
parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord>;
|
|
31
|
+
parseFile(filePath: string): Promise<ParseResult<RawLogRecord>>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare class Log4jsParser {
|
|
35
|
+
parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord>;
|
|
36
|
+
parseFile(filePath: string): Promise<ParseResult<RawLogRecord>>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare function wildcardMatch(pattern: string, value: string): boolean;
|
|
40
|
+
declare function matchMapping(eventName: string, mappings?: Record<string, LogEventMapping>): LogEventMapping | undefined;
|
|
41
|
+
|
|
42
|
+
declare const DEFAULT_REDACT_KEYS: readonly ["authorization", "cookie", "token", "apiKey", "password", "secret", "email"];
|
|
43
|
+
interface RedactorOptions {
|
|
44
|
+
rules?: RedactionRule[];
|
|
45
|
+
/** Additional exact keys (case-insensitive) to redact in addition to defaults. */
|
|
46
|
+
extraKeys?: readonly string[];
|
|
47
|
+
}
|
|
48
|
+
declare class Redactor {
|
|
49
|
+
#private;
|
|
50
|
+
constructor(options?: RedactorOptions);
|
|
51
|
+
redactValue(key: string, value: unknown): unknown;
|
|
52
|
+
redactRecord(record: Record<string, unknown>): Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface NormalizeOptions {
|
|
56
|
+
config: LogIngestConfig;
|
|
57
|
+
sourceFile?: string;
|
|
58
|
+
}
|
|
59
|
+
declare class EventNormalizer {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: NormalizeOptions);
|
|
62
|
+
normalize(record: RawLogRecord): InspectEvent | ParserWarning;
|
|
63
|
+
normalizeAll(records: RawLogRecord[]): ParseResult<InspectEvent>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface TreeBuilderOptions {
|
|
67
|
+
config?: LogIngestConfig;
|
|
68
|
+
}
|
|
69
|
+
declare class TreeBuilder {
|
|
70
|
+
constructor(options?: TreeBuilderOptions);
|
|
71
|
+
build(events: InspectEvent[]): InspectRunTree[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface RenderTreeOptions {
|
|
75
|
+
verbose?: boolean;
|
|
76
|
+
showConfidence?: "always" | "non-explicit" | "never";
|
|
77
|
+
showMetadata?: boolean;
|
|
78
|
+
color?: boolean;
|
|
79
|
+
maxAttributeLength?: number;
|
|
80
|
+
summary?: boolean;
|
|
81
|
+
}
|
|
82
|
+
declare function renderRunTree(tree: InspectRunTree, options?: RenderTreeOptions): string;
|
|
83
|
+
declare function renderRunTrees(trees: InspectRunTree[], options?: RenderTreeOptions): string;
|
|
84
|
+
|
|
85
|
+
type LogSourceFormat = "json" | "log4js" | "auto";
|
|
86
|
+
interface ParseLogLineOptions {
|
|
87
|
+
format?: LogSourceFormat;
|
|
88
|
+
file?: string;
|
|
89
|
+
line?: number;
|
|
90
|
+
}
|
|
91
|
+
declare function parseLogLine(line: string, options?: ParseLogLineOptions): ParseResult<RawLogRecord>;
|
|
92
|
+
|
|
93
|
+
interface LiveLogUpdate {
|
|
94
|
+
events: InspectEvent[];
|
|
95
|
+
trees: InspectRunTree[];
|
|
96
|
+
warnings: ParserWarning[];
|
|
97
|
+
}
|
|
98
|
+
interface LiveLogAccumulatorOptions {
|
|
99
|
+
config: LogIngestConfig;
|
|
100
|
+
format?: LogSourceFormat;
|
|
101
|
+
file?: string;
|
|
102
|
+
}
|
|
103
|
+
declare class LiveLogAccumulator {
|
|
104
|
+
#private;
|
|
105
|
+
constructor(options: LiveLogAccumulatorOptions);
|
|
106
|
+
pushLine(line: string, lineNumber?: number): LiveLogUpdate;
|
|
107
|
+
getEvents(): InspectEvent[];
|
|
108
|
+
getTrees(): InspectRunTree[];
|
|
109
|
+
getWarnings(): ParserWarning[];
|
|
110
|
+
reset(): void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface ParseLogsOptions {
|
|
114
|
+
format?: "json" | "log4js" | "auto";
|
|
115
|
+
config?: LogIngestConfig;
|
|
116
|
+
configPath?: string;
|
|
117
|
+
runIdKeys?: string[];
|
|
118
|
+
eventKey?: string;
|
|
119
|
+
timestampKey?: string;
|
|
120
|
+
messageKey?: string;
|
|
121
|
+
levelKey?: string;
|
|
122
|
+
parentIdKey?: string;
|
|
123
|
+
durationKey?: string;
|
|
124
|
+
statusKey?: string;
|
|
125
|
+
warnings?: "none" | "summary" | "all";
|
|
126
|
+
}
|
|
127
|
+
interface LogToTreeResult {
|
|
128
|
+
events: InspectEvent[];
|
|
129
|
+
trees: InspectRunTree[];
|
|
130
|
+
warnings: ParserWarning[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @experimental Compatibility-oriented API for parsing structured logs into normalized run trees.
|
|
134
|
+
* Subject to refinement before a future stability declaration.
|
|
135
|
+
*/
|
|
136
|
+
declare function parseLogsToTrees(filePath: string, options?: ParseLogsOptions): Promise<LogToTreeResult>;
|
|
137
|
+
|
|
138
|
+
export { DEFAULT_LOG_INGEST_CONFIG, DEFAULT_REDACT_KEYS, EventNormalizer, JsonLogParser, LiveLogAccumulator, type LiveLogAccumulatorOptions, type LiveLogUpdate, Log4jsParser, LogEventMapping, LogIngestConfig, type LogSourceFormat, type LogToTreeResult, type NormalizeOptions, type ParseLogLineOptions, type ParseLogsOptions, type ParseResult, type ParserWarning, type ParserWarningCode, type RawLogRecord, RedactionRule, Redactor, type RedactorOptions, type RenderTreeOptions, TreeBuilder, type TreeBuilderOptions, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { a as LogIngestConfig, L as LogEventMapping, R as RedactionRule } from './log-config-C1GcJPIM.js';
|
|
2
|
+
export { b as RedactionStrategy } from './log-config-C1GcJPIM.js';
|
|
3
|
+
import { a as InspectEvent, c as InspectRunTree } from './inspect-event-Des4JDHo.js';
|
|
4
|
+
|
|
5
|
+
type ParserWarningCode = "MALFORMED_JSON" | "MISSING_RUN_ID" | "MISSING_EVENT" | "MISSING_TIMESTAMP" | "UNSUPPORTED_LOG4JS_PAYLOAD" | "CONFIG_ERROR" | "UNKNOWN";
|
|
6
|
+
interface ParserWarning {
|
|
7
|
+
code: ParserWarningCode;
|
|
8
|
+
message: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
line?: number;
|
|
11
|
+
raw?: string;
|
|
12
|
+
}
|
|
13
|
+
interface ParseResult<T> {
|
|
14
|
+
records: T[];
|
|
15
|
+
warnings: ParserWarning[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
declare const DEFAULT_LOG_INGEST_CONFIG: LogIngestConfig;
|
|
19
|
+
declare function mergeLogIngestConfig(base: LogIngestConfig, override: Partial<LogIngestConfig>): LogIngestConfig;
|
|
20
|
+
declare function loadLogIngestConfig(configPath?: string): Promise<LogIngestConfig>;
|
|
21
|
+
|
|
22
|
+
interface RawLogRecord {
|
|
23
|
+
raw: Record<string, unknown>;
|
|
24
|
+
file?: string;
|
|
25
|
+
line: number;
|
|
26
|
+
sourceType: "json-log" | "log4js";
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare class JsonLogParser {
|
|
30
|
+
parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord>;
|
|
31
|
+
parseFile(filePath: string): Promise<ParseResult<RawLogRecord>>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare class Log4jsParser {
|
|
35
|
+
parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord>;
|
|
36
|
+
parseFile(filePath: string): Promise<ParseResult<RawLogRecord>>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare function wildcardMatch(pattern: string, value: string): boolean;
|
|
40
|
+
declare function matchMapping(eventName: string, mappings?: Record<string, LogEventMapping>): LogEventMapping | undefined;
|
|
41
|
+
|
|
42
|
+
declare const DEFAULT_REDACT_KEYS: readonly ["authorization", "cookie", "token", "apiKey", "password", "secret", "email"];
|
|
43
|
+
interface RedactorOptions {
|
|
44
|
+
rules?: RedactionRule[];
|
|
45
|
+
/** Additional exact keys (case-insensitive) to redact in addition to defaults. */
|
|
46
|
+
extraKeys?: readonly string[];
|
|
47
|
+
}
|
|
48
|
+
declare class Redactor {
|
|
49
|
+
#private;
|
|
50
|
+
constructor(options?: RedactorOptions);
|
|
51
|
+
redactValue(key: string, value: unknown): unknown;
|
|
52
|
+
redactRecord(record: Record<string, unknown>): Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface NormalizeOptions {
|
|
56
|
+
config: LogIngestConfig;
|
|
57
|
+
sourceFile?: string;
|
|
58
|
+
}
|
|
59
|
+
declare class EventNormalizer {
|
|
60
|
+
#private;
|
|
61
|
+
constructor(options: NormalizeOptions);
|
|
62
|
+
normalize(record: RawLogRecord): InspectEvent | ParserWarning;
|
|
63
|
+
normalizeAll(records: RawLogRecord[]): ParseResult<InspectEvent>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
interface TreeBuilderOptions {
|
|
67
|
+
config?: LogIngestConfig;
|
|
68
|
+
}
|
|
69
|
+
declare class TreeBuilder {
|
|
70
|
+
constructor(options?: TreeBuilderOptions);
|
|
71
|
+
build(events: InspectEvent[]): InspectRunTree[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface RenderTreeOptions {
|
|
75
|
+
verbose?: boolean;
|
|
76
|
+
showConfidence?: "always" | "non-explicit" | "never";
|
|
77
|
+
showMetadata?: boolean;
|
|
78
|
+
color?: boolean;
|
|
79
|
+
maxAttributeLength?: number;
|
|
80
|
+
summary?: boolean;
|
|
81
|
+
}
|
|
82
|
+
declare function renderRunTree(tree: InspectRunTree, options?: RenderTreeOptions): string;
|
|
83
|
+
declare function renderRunTrees(trees: InspectRunTree[], options?: RenderTreeOptions): string;
|
|
84
|
+
|
|
85
|
+
type LogSourceFormat = "json" | "log4js" | "auto";
|
|
86
|
+
interface ParseLogLineOptions {
|
|
87
|
+
format?: LogSourceFormat;
|
|
88
|
+
file?: string;
|
|
89
|
+
line?: number;
|
|
90
|
+
}
|
|
91
|
+
declare function parseLogLine(line: string, options?: ParseLogLineOptions): ParseResult<RawLogRecord>;
|
|
92
|
+
|
|
93
|
+
interface LiveLogUpdate {
|
|
94
|
+
events: InspectEvent[];
|
|
95
|
+
trees: InspectRunTree[];
|
|
96
|
+
warnings: ParserWarning[];
|
|
97
|
+
}
|
|
98
|
+
interface LiveLogAccumulatorOptions {
|
|
99
|
+
config: LogIngestConfig;
|
|
100
|
+
format?: LogSourceFormat;
|
|
101
|
+
file?: string;
|
|
102
|
+
}
|
|
103
|
+
declare class LiveLogAccumulator {
|
|
104
|
+
#private;
|
|
105
|
+
constructor(options: LiveLogAccumulatorOptions);
|
|
106
|
+
pushLine(line: string, lineNumber?: number): LiveLogUpdate;
|
|
107
|
+
getEvents(): InspectEvent[];
|
|
108
|
+
getTrees(): InspectRunTree[];
|
|
109
|
+
getWarnings(): ParserWarning[];
|
|
110
|
+
reset(): void;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface ParseLogsOptions {
|
|
114
|
+
format?: "json" | "log4js" | "auto";
|
|
115
|
+
config?: LogIngestConfig;
|
|
116
|
+
configPath?: string;
|
|
117
|
+
runIdKeys?: string[];
|
|
118
|
+
eventKey?: string;
|
|
119
|
+
timestampKey?: string;
|
|
120
|
+
messageKey?: string;
|
|
121
|
+
levelKey?: string;
|
|
122
|
+
parentIdKey?: string;
|
|
123
|
+
durationKey?: string;
|
|
124
|
+
statusKey?: string;
|
|
125
|
+
warnings?: "none" | "summary" | "all";
|
|
126
|
+
}
|
|
127
|
+
interface LogToTreeResult {
|
|
128
|
+
events: InspectEvent[];
|
|
129
|
+
trees: InspectRunTree[];
|
|
130
|
+
warnings: ParserWarning[];
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @experimental Compatibility-oriented API for parsing structured logs into normalized run trees.
|
|
134
|
+
* Subject to refinement before a future stability declaration.
|
|
135
|
+
*/
|
|
136
|
+
declare function parseLogsToTrees(filePath: string, options?: ParseLogsOptions): Promise<LogToTreeResult>;
|
|
137
|
+
|
|
138
|
+
export { DEFAULT_LOG_INGEST_CONFIG, DEFAULT_REDACT_KEYS, EventNormalizer, JsonLogParser, LiveLogAccumulator, type LiveLogAccumulatorOptions, type LiveLogUpdate, Log4jsParser, LogEventMapping, LogIngestConfig, type LogSourceFormat, type LogToTreeResult, type NormalizeOptions, type ParseLogLineOptions, type ParseLogsOptions, type ParseResult, type ParserWarning, type ParserWarningCode, type RawLogRecord, RedactionRule, Redactor, type RedactorOptions, type RenderTreeOptions, TreeBuilder, type TreeBuilderOptions, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DEFAULT_LOG_INGEST_CONFIG, EventNormalizer, JsonLogParser, LiveLogAccumulator, Log4jsParser, loadLogIngestConfig, matchMapping, mergeLogIngestConfig, parseLogLine, parseLogsToTrees, renderRunTree, renderRunTrees, wildcardMatch } from './chunk-HR7G62IE.mjs';
|
|
2
|
+
export { DEFAULT_REDACT_KEYS, Redactor } from './chunk-VU6O5QAH.mjs';
|
|
3
|
+
export { TreeBuilder } from './chunk-E5F2LQCX.mjs';
|
|
4
|
+
import './chunk-7TGZLWEE.mjs';
|
|
5
|
+
//# sourceMappingURL=logs.mjs.map
|
|
6
|
+
//# sourceMappingURL=logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"logs.mjs"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { I as InspectKind, A as AttributionConfidence } from './inspect-event-Des4JDHo.cjs';
|
|
2
|
+
|
|
3
|
+
type PersistedSchemaVersion = "0.2";
|
|
4
|
+
type PersistedEventSourceType = "manual" | "json-log" | "log4js" | "adapter" | "ai-sdk" | "otel";
|
|
5
|
+
interface PersistedEventSource {
|
|
6
|
+
type: PersistedEventSourceType;
|
|
7
|
+
name?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
}
|
|
10
|
+
type PersistedEventStatus = "running" | "ok" | "error" | "unknown";
|
|
11
|
+
interface PersistedInspectError {
|
|
12
|
+
name?: string;
|
|
13
|
+
message: string;
|
|
14
|
+
code?: string;
|
|
15
|
+
}
|
|
16
|
+
interface PersistedTokenUsage {
|
|
17
|
+
input?: number;
|
|
18
|
+
output?: number;
|
|
19
|
+
total?: number;
|
|
20
|
+
cached?: number;
|
|
21
|
+
}
|
|
22
|
+
interface PersistedTraceContext {
|
|
23
|
+
traceId?: string;
|
|
24
|
+
spanId?: string;
|
|
25
|
+
parentSpanId?: string;
|
|
26
|
+
}
|
|
27
|
+
interface PersistedInspectEvent {
|
|
28
|
+
schemaVersion: PersistedSchemaVersion;
|
|
29
|
+
eventId: string;
|
|
30
|
+
runId: string;
|
|
31
|
+
parentId?: string;
|
|
32
|
+
kind: InspectKind;
|
|
33
|
+
name: string;
|
|
34
|
+
status?: PersistedEventStatus;
|
|
35
|
+
timestamp: string;
|
|
36
|
+
startedAt?: string;
|
|
37
|
+
endedAt?: string;
|
|
38
|
+
durationMs?: number;
|
|
39
|
+
confidence: AttributionConfidence;
|
|
40
|
+
source: PersistedEventSource;
|
|
41
|
+
attributes?: Record<string, unknown>;
|
|
42
|
+
inputSummary?: unknown;
|
|
43
|
+
outputSummary?: unknown;
|
|
44
|
+
error?: PersistedInspectError;
|
|
45
|
+
tokenUsage?: PersistedTokenUsage;
|
|
46
|
+
trace?: PersistedTraceContext;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Runtime guard for a v0.2 {@link PersistedInspectEvent} JSON object.
|
|
50
|
+
*
|
|
51
|
+
* Timestamp fields (`timestamp`, `startedAt`, `endedAt`) are validated as
|
|
52
|
+
* non-empty strings only — stricter ISO-8601 parsing may be added later.
|
|
53
|
+
*/
|
|
54
|
+
declare function isPersistedInspectEvent(value: unknown): value is PersistedInspectEvent;
|
|
55
|
+
|
|
56
|
+
export { type PersistedInspectEvent as P, type PersistedEventSource as a, type PersistedEventSourceType as b, type PersistedEventStatus as c, type PersistedInspectError as d, type PersistedSchemaVersion as e, type PersistedTokenUsage as f, type PersistedTraceContext as g, isPersistedInspectEvent as i };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { I as InspectKind, A as AttributionConfidence } from './inspect-event-Des4JDHo.js';
|
|
2
|
+
|
|
3
|
+
type PersistedSchemaVersion = "0.2";
|
|
4
|
+
type PersistedEventSourceType = "manual" | "json-log" | "log4js" | "adapter" | "ai-sdk" | "otel";
|
|
5
|
+
interface PersistedEventSource {
|
|
6
|
+
type: PersistedEventSourceType;
|
|
7
|
+
name?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
}
|
|
10
|
+
type PersistedEventStatus = "running" | "ok" | "error" | "unknown";
|
|
11
|
+
interface PersistedInspectError {
|
|
12
|
+
name?: string;
|
|
13
|
+
message: string;
|
|
14
|
+
code?: string;
|
|
15
|
+
}
|
|
16
|
+
interface PersistedTokenUsage {
|
|
17
|
+
input?: number;
|
|
18
|
+
output?: number;
|
|
19
|
+
total?: number;
|
|
20
|
+
cached?: number;
|
|
21
|
+
}
|
|
22
|
+
interface PersistedTraceContext {
|
|
23
|
+
traceId?: string;
|
|
24
|
+
spanId?: string;
|
|
25
|
+
parentSpanId?: string;
|
|
26
|
+
}
|
|
27
|
+
interface PersistedInspectEvent {
|
|
28
|
+
schemaVersion: PersistedSchemaVersion;
|
|
29
|
+
eventId: string;
|
|
30
|
+
runId: string;
|
|
31
|
+
parentId?: string;
|
|
32
|
+
kind: InspectKind;
|
|
33
|
+
name: string;
|
|
34
|
+
status?: PersistedEventStatus;
|
|
35
|
+
timestamp: string;
|
|
36
|
+
startedAt?: string;
|
|
37
|
+
endedAt?: string;
|
|
38
|
+
durationMs?: number;
|
|
39
|
+
confidence: AttributionConfidence;
|
|
40
|
+
source: PersistedEventSource;
|
|
41
|
+
attributes?: Record<string, unknown>;
|
|
42
|
+
inputSummary?: unknown;
|
|
43
|
+
outputSummary?: unknown;
|
|
44
|
+
error?: PersistedInspectError;
|
|
45
|
+
tokenUsage?: PersistedTokenUsage;
|
|
46
|
+
trace?: PersistedTraceContext;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Runtime guard for a v0.2 {@link PersistedInspectEvent} JSON object.
|
|
50
|
+
*
|
|
51
|
+
* Timestamp fields (`timestamp`, `startedAt`, `endedAt`) are validated as
|
|
52
|
+
* non-empty strings only — stricter ISO-8601 parsing may be added later.
|
|
53
|
+
*/
|
|
54
|
+
declare function isPersistedInspectEvent(value: unknown): value is PersistedInspectEvent;
|
|
55
|
+
|
|
56
|
+
export { type PersistedInspectEvent as P, type PersistedEventSource as a, type PersistedEventSourceType as b, type PersistedEventStatus as c, type PersistedInspectError as d, type PersistedSchemaVersion as e, type PersistedTokenUsage as f, type PersistedTraceContext as g, isPersistedInspectEvent as i };
|