@kb-labs/agent-tracing 2.15.0 → 2.16.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/privacy-redactor.ts","../src/incremental-trace-writer.ts","../src/file-tracer.ts","../src/trace-loader.ts","../src/trace-helpers.ts"],"names":["path","fs","path2"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Privacy redaction for trace events\n *\n * Uses shallow clone optimization - only clones objects that need redaction,\n * not the entire trace event tree.\n */\n\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport type { TraceConfig } from './incremental-trace-writer.js';\n\n/**\n * Default secret patterns (regex)\n */\nconst DEFAULT_SECRET_PATTERNS = [\n // API keys\n /sk-[A-Za-z0-9]{20,}/g, // OpenAI API keys\n /sk_live_[A-Za-z0-9]{24,}/g, // Stripe API keys\n /ghp_[A-Za-z0-9]{36}/g, // GitHub personal access tokens\n\n // Authentication tokens\n /Bearer\\s+[A-Za-z0-9\\-._~+/]+=*/g,\n /token[=:]\\s*[A-Za-z0-9\\-._~+/]+=*/gi,\n\n // Passwords\n /password[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n /passwd[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n /pwd[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n\n // Connection strings\n /mongodb(\\+srv)?:\\/\\/[^@]+@[^\\s]+/g,\n /postgres(ql)?:\\/\\/[^@]+@[^\\s]+/g,\n /mysql:\\/\\/[^@]+@[^\\s]+/g,\n\n // Email addresses (PII)\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/g,\n\n // Note: Generic long alphanumeric pattern removed to avoid false positives\n // (would match file hashes, UUIDs, legitimate data)\n // Credit card numbers removed - too many false positives\n];\n\n/**\n * Redact secrets from a string\n */\nexport function redactSecretsFromString(\n str: string,\n patterns: RegExp[] = DEFAULT_SECRET_PATTERNS\n): string {\n let result = str;\n\n for (const pattern of patterns) {\n result = result.replace(pattern, '[REDACTED]');\n }\n\n return result;\n}\n\n/**\n * Redact file paths (replace absolute paths with relative)\n */\nexport function redactPaths(\n str: string,\n replacements: Record<string, string>\n): string {\n let result = str;\n\n // Apply custom replacements\n for (const [absolute, relative] of Object.entries(replacements)) {\n result = result.replace(new RegExp(absolute.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'), relative);\n }\n\n return result;\n}\n\n/**\n * Redact secrets from unknown value (recursive shallow clone)\n *\n * Only clones objects/arrays that contain secrets.\n * Primitives and clean objects are returned as-is (no clone).\n */\nexport function redactValue(\n value: unknown,\n config: TraceConfig['privacy'],\n depth = 0\n): unknown {\n // Prevent infinite recursion\n if (depth > 10) {\n return '[REDACTED:TOO_DEEP]';\n }\n\n // Primitives\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n let result = value;\n\n if (config.redactSecrets) {\n const patterns = config.secretPatterns.map(p => new RegExp(p, 'g'));\n result = redactSecretsFromString(result, [...DEFAULT_SECRET_PATTERNS, ...patterns]);\n }\n\n if (config.redactPaths) {\n result = redactPaths(result, config.pathReplacements);\n }\n\n // Return original if nothing changed (no clone)\n return result === value ? value : result;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n // Arrays - shallow clone only if contains secrets\n if (Array.isArray(value)) {\n let changed = false;\n const result = value.map((item) => {\n const redacted = redactValue(item, config, depth + 1);\n if (redacted !== item) {\n changed = true;\n }\n return redacted;\n });\n\n // Return original if nothing changed (no clone)\n return changed ? result : value;\n }\n\n // Objects - shallow clone only if contains secrets\n if (typeof value === 'object') {\n let changed = false;\n const result: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n const redacted = redactValue(val, config, depth + 1);\n result[key] = redacted;\n if (redacted !== val) {\n changed = true;\n }\n }\n\n // Return original if nothing changed (no clone)\n return changed ? result : value;\n }\n\n return value;\n}\n\n/**\n * Redact secrets from a trace event (shallow clone optimization)\n *\n * Only clones parts of the event that need redaction.\n * Returns original event if no redaction needed.\n */\nexport function redactTraceEvent(\n event: DetailedTraceEntry,\n config: TraceConfig['privacy']\n): DetailedTraceEntry {\n // Skip if redaction disabled\n if (!config.redactSecrets && !config.redactPaths) {\n return event;\n }\n\n // Check if event needs redaction\n // Limit string size to prevent ReDoS (Regular Expression Denial of Service)\n const eventStr = JSON.stringify(event);\n const MAX_STRING_SIZE = 100000; // 100KB limit for regex testing\n const testStr = eventStr.length > MAX_STRING_SIZE ? eventStr.substring(0, MAX_STRING_SIZE) : eventStr;\n let needsRedaction = false;\n\n if (config.redactSecrets) {\n const patterns = config.secretPatterns.map(p => new RegExp(p, 'g'));\n needsRedaction = [...DEFAULT_SECRET_PATTERNS, ...patterns].some(p => p.test(testStr));\n }\n\n if (!needsRedaction && config.redactPaths) {\n needsRedaction = Object.keys(config.pathReplacements).some(path => testStr.includes(path));\n }\n\n // Return original if no secrets found (no clone!)\n if (!needsRedaction) {\n return event;\n }\n\n // Shallow clone and redact recursively\n return redactValue(event, config, 0) as DetailedTraceEntry;\n}\n\n/**\n * Create default privacy config\n */\nexport function createDefaultPrivacyConfig(): TraceConfig['privacy'] {\n return {\n redactSecrets: true,\n redactPaths: true,\n secretPatterns: [],\n pathReplacements: {\n '/Users': '~',\n '/home': '~',\n 'C:\\\\Users': '~',\n },\n };\n}\n","/**\n * Incremental Trace Writer - NDJSON append-only tracer with crash safety\n *\n * Design principle: reliability > speed.\n * Every event is written synchronously to disk immediately.\n * Even if the agent crashes mid-execution, all events up to the crash are on disk.\n *\n * Features:\n * - NDJSON format (newline-delimited JSON) for append-only writes\n * - Synchronous writes — zero event loss, even on crash\n * - Privacy redaction on trace() call\n * - Auto-cleanup (keep last 30 traces)\n * - Index generation for fast CLI queries\n */\n\nimport { promises as fs, mkdirSync, statSync, readFileSync, appendFileSync } from 'fs';\nimport path from 'path';\nimport type { Tracer } from '@kb-labs/agent-contracts';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { redactTraceEvent } from './privacy-redactor.js';\n\n/**\n * Trace configuration interface\n */\nexport interface TraceConfig {\n version: string;\n enabled: boolean;\n level: 'minimal' | 'standard' | 'detailed' | 'debug';\n\n incremental: {\n enabled: boolean;\n flushIntervalMs: number; // Default: 100ms\n maxBufferSize: number; // Default: 10 events\n format: 'ndjson';\n };\n\n capture: {\n prompts: boolean;\n toolOutputs: boolean;\n memorySnapshots: boolean;\n decisions: boolean;\n };\n\n retention: {\n maxTraces: number; // Default: 30\n maxDays: number; // Default: 30\n cleanupOnFinalize: boolean; // Default: true\n archiveOlderThan: number; // Days, default: 7\n compressArchived: boolean; // Default: true\n };\n\n privacy: {\n redactSecrets: boolean; // Default: true\n redactPaths: boolean; // Default: true\n secretPatterns: string[]; // Regex patterns\n pathReplacements: Record<string, string>;\n };\n\n storage: {\n path: string; // Default: \".kb/traces/incremental\"\n indexPath: string; // Default: \".kb/traces/incremental\"\n };\n}\n\n/**\n * Trace index for fast CLI queries\n */\nexport interface TraceIndex {\n version: string;\n taskId: string;\n createdAt: string;\n finalizedAt: string;\n\n summary: {\n totalEvents: number;\n iterations: number;\n status: 'success' | 'failed' | 'incomplete';\n eventCounts: Record<string, number>;\n };\n\n timing: {\n startedAt: string;\n completedAt: string;\n totalDurationMs: number;\n };\n\n cost: {\n totalCost: number;\n currency: 'USD';\n };\n\n errors: number;\n\n /** Two-tier memory statistics (aggregated from memory:* events) */\n memory?: {\n totalFactsAdded: number;\n totalArchiveStores: number;\n summarizationRuns: number;\n avgCompressionRatio: number;\n avgNewFactRate: number;\n finalFactSheetSize: number;\n finalFactSheetTokens: number;\n finalArchiveEntries: number;\n finalArchiveUniqueFiles: number;\n };\n\n iterations: Array<{\n iteration: number;\n eventCount: number;\n llmCalls: number;\n toolCalls: number;\n }>;\n}\n\n/**\n * Default trace configuration\n */\nexport const DEFAULT_TRACE_CONFIG: TraceConfig = {\n version: '1.0.0',\n enabled: true,\n level: 'detailed',\n\n incremental: {\n enabled: true,\n flushIntervalMs: 100,\n maxBufferSize: 10,\n format: 'ndjson',\n },\n\n capture: {\n prompts: true,\n toolOutputs: true,\n memorySnapshots: true,\n decisions: true,\n },\n\n retention: {\n maxTraces: 30,\n maxDays: 30,\n cleanupOnFinalize: true,\n archiveOlderThan: 7,\n compressArchived: true,\n },\n\n privacy: {\n redactSecrets: true,\n redactPaths: true,\n secretPatterns: [\n 'sk-[a-zA-Z0-9]{20,}', // OpenAI API keys\n 'Bearer\\\\s+[a-zA-Z0-9_-]+', // Bearer tokens\n 'password[\\'\"]?\\\\s*[:=]\\\\s*[\\'\"][^\\'\"]+([\\'\"]})', // Passwords\n 'api[_-]?key[\\'\"]?\\\\s*[:=]\\\\s*[\\'\"][^\\'\"]+[\\'\"]', // Generic API keys\n ],\n pathReplacements: {\n '/Users/': '~/',\n '/home/': '~/',\n '\\\\Users\\\\': '~\\\\',\n },\n },\n\n storage: {\n path: '.kb/traces/incremental',\n indexPath: '.kb/traces/incremental',\n },\n};\n\n/**\n * Incremental Trace Writer - crash-safe NDJSON tracer\n */\nexport class IncrementalTraceWriter implements Tracer {\n private seq: number = 0;\n private filepath: string;\n private indexPath: string;\n private config: TraceConfig;\n private taskId: string;\n private startTime: string;\n\n constructor(\n taskId: string,\n config: Partial<TraceConfig> = {},\n outputDir?: string\n ) {\n this.taskId = taskId;\n this.config = { ...DEFAULT_TRACE_CONFIG, ...config };\n this.startTime = new Date().toISOString();\n\n const dir = outputDir || this.config.storage.path;\n this.filepath = path.join(dir, `${taskId}.ndjson`);\n this.indexPath = path.join(dir, `${taskId}-index.json`);\n\n // Create output directory if not exists\n this.ensureDirectoryExists(dir);\n }\n\n /**\n * Record a trace entry — writes synchronously to disk.\n *\n * Every call = one appendFileSync. No buffering, no async, no lost events.\n * If the agent crashes on iteration 5, you have all events from iterations 1-5.\n */\n trace(entry: any): void {\n try {\n const seq = ++this.seq;\n const timestamp = entry.timestamp || new Date().toISOString();\n\n const fullEntry: DetailedTraceEntry = {\n ...entry,\n seq,\n timestamp,\n };\n\n const redacted = this.redact(fullEntry);\n\n // Sync write — event is on disk before trace() returns\n appendFileSync(this.filepath, JSON.stringify(redacted) + '\\n', 'utf-8');\n } catch (error) {\n console.error('[IncrementalTraceWriter] trace() error:', error);\n // Don't crash agent - tracing failure should not stop execution\n }\n }\n\n /**\n * Get all trace entries (reads from NDJSON file to avoid memory leak)\n * Returns TraceEntry[] for backward compatibility, but actual format is DetailedTraceEntry[]\n */\n getEntries(): any[] {\n try {\n const content = readFileSync(this.filepath, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n return lines.map((line: string) => JSON.parse(line));\n } catch {\n // File doesn't exist yet or is empty\n return [];\n }\n }\n\n /**\n * Save trace to file (backward compat — no-op, already written synchronously)\n */\n async save(_filePath: string): Promise<void> {\n // No-op — all events are already on disk\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.seq = 0;\n }\n\n /**\n * Finalize trace (generate index, cleanup old traces)\n */\n async finalize(): Promise<void> {\n try {\n // Generate index\n await this.createIndex();\n\n // Cleanup old traces\n if (this.config.retention.cleanupOnFinalize) {\n await this.cleanupOldTraces();\n }\n } catch (error) {\n console.error('[IncrementalTraceWriter] finalize() error:', error);\n }\n }\n\n /**\n * Create index file for fast CLI queries\n */\n async createIndex(): Promise<void> {\n try {\n const entries = this.getEntries();\n\n if (entries.length === 0) {\n console.warn('[IncrementalTraceWriter] No entries to index');\n return;\n }\n\n // Calculate summary statistics\n const stats = this.calculateIndexStatistics(entries);\n\n // Build index\n const index: TraceIndex = {\n version: '1.0.0',\n taskId: this.taskId,\n createdAt: this.startTime,\n finalizedAt: new Date().toISOString(),\n\n summary: {\n totalEvents: entries.length,\n iterations: stats.iterations.size,\n status: stats.errors > 0 ? 'failed' : 'success',\n eventCounts: stats.eventCounts,\n },\n\n timing: {\n startedAt: this.startTime,\n completedAt: new Date().toISOString(),\n totalDurationMs: Date.now() - new Date(this.startTime).getTime(),\n },\n\n cost: {\n totalCost: stats.totalCost,\n currency: 'USD',\n },\n\n errors: stats.errors,\n\n memory: stats.memory,\n\n iterations: Array.from(stats.iterations.entries())\n .map(([iteration, iterStats]) => ({ iteration, ...iterStats }))\n .sort((a, b) => a.iteration - b.iteration),\n };\n\n // Ensure index directory exists\n const indexDir = path.dirname(this.indexPath);\n this.ensureDirectoryExists(indexDir);\n\n // Write index file\n await fs.writeFile(this.indexPath, JSON.stringify(index, null, 2), 'utf-8');\n } catch (error) {\n console.error('[IncrementalTraceWriter] createIndex() error:', error);\n // Continue - CLI commands will work but slower (read full NDJSON)\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private Methods\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Cleanup old traces (keep last N traces)\n */\n private async cleanupOldTraces(): Promise<void> {\n try {\n const dir = path.dirname(this.filepath);\n const files = await fs.readdir(dir);\n\n // Filter .ndjson files\n const traceFiles = files.filter((f) => f.endsWith('.ndjson'));\n\n // If <= maxTraces, nothing to clean\n if (traceFiles.length <= this.config.retention.maxTraces) {\n return;\n }\n\n // Get file stats and sort by mtime (newest first)\n const filesWithStats = await Promise.all(\n traceFiles.map(async (file) => {\n const filepath = path.join(dir, file);\n const stats = await fs.stat(filepath);\n return { file, mtime: stats.mtime.getTime(), filepath };\n })\n );\n\n filesWithStats.sort((a, b) => b.mtime - a.mtime);\n\n // Delete oldest traces\n const toDelete = filesWithStats.slice(this.config.retention.maxTraces);\n\n // Delete files in parallel for better performance\n await Promise.allSettled(\n toDelete.map(async ({ file, filepath }) => {\n try {\n // Delete NDJSON file\n await fs.unlink(filepath);\n\n // Delete index file\n const indexFile = filepath.replace('.ndjson', '-index.json');\n try {\n await fs.unlink(indexFile);\n } catch {\n // Index might not exist, ignore\n }\n } catch (error) {\n console.error(`[IncrementalTraceWriter] Failed to delete ${file}:`, error);\n }\n })\n );\n\n if (toDelete.length > 0) {\n console.log(\n `[IncrementalTraceWriter] Cleaned up ${toDelete.length} old traces (kept last ${this.config.retention.maxTraces})`\n );\n }\n } catch (error) {\n console.error('[IncrementalTraceWriter] cleanupOldTraces() error:', error);\n // Continue - disk space grows but agent works\n }\n }\n\n /**\n * Redact sensitive data from entry using optimized privacy-redactor\n *\n * Uses shallow clone optimization - only clones objects that need redaction,\n * not the entire trace event tree. Returns original if no secrets found.\n */\n private redact(entry: DetailedTraceEntry): DetailedTraceEntry {\n if (!this.config.privacy.redactSecrets && !this.config.privacy.redactPaths) {\n return entry;\n }\n\n try {\n return redactTraceEvent(entry, this.config.privacy);\n } catch (error) {\n console.warn('[IncrementalTraceWriter] redact() error:', error);\n return entry; // Return un-redacted (privacy risk, but better than crash)\n }\n }\n\n /**\n * Calculate index statistics from trace entries\n */\n private calculateIndexStatistics(entries: any[]): {\n eventCounts: Record<string, number>;\n iterations: Map<number, { eventCount: number; llmCalls: number; toolCalls: number }>;\n totalCost: number;\n errors: number;\n memory?: {\n totalFactsAdded: number;\n totalArchiveStores: number;\n summarizationRuns: number;\n avgCompressionRatio: number;\n avgNewFactRate: number;\n finalFactSheetSize: number;\n finalFactSheetTokens: number;\n finalArchiveEntries: number;\n finalArchiveUniqueFiles: number;\n };\n } {\n const eventCounts: Record<string, number> = {};\n const iterations = new Map<number, { eventCount: number; llmCalls: number; toolCalls: number }>();\n let totalCost = 0;\n let errors = 0;\n\n // Memory stats accumulators\n let totalFactsAdded = 0;\n let totalArchiveStores = 0;\n let summarizationRuns = 0;\n let compressionRatioSum = 0;\n let newFactRateSum = 0;\n let lastFactSheetSize = 0;\n let lastFactSheetTokens = 0;\n let lastArchiveEntries = 0;\n let lastArchiveUniqueFiles = 0;\n\n for (const entry of entries) {\n // Count by type\n eventCounts[entry.type] = (eventCounts[entry.type] || 0) + 1;\n\n // Count by iteration\n if (entry.iteration !== undefined) {\n if (!iterations.has(entry.iteration)) {\n iterations.set(entry.iteration, { eventCount: 0, llmCalls: 0, toolCalls: 0 });\n }\n const iter = iterations.get(entry.iteration)!;\n iter.eventCount++;\n\n if (entry.type === 'llm:end') {\n iter.llmCalls++;\n if ('cost' in entry && entry.cost) {\n totalCost += entry.cost.totalCost || 0;\n }\n }\n\n if (entry.type === 'tool:end') {\n iter.toolCalls++;\n }\n }\n\n // Count errors\n if (entry.type === 'error:captured') {\n errors++;\n }\n\n // Aggregate memory events\n if (entry.type === 'memory:fact_added') {\n totalFactsAdded++;\n if (entry.factSheetStats) {\n lastFactSheetSize = entry.factSheetStats.totalFacts || 0;\n lastFactSheetTokens = entry.factSheetStats.estimatedTokens || 0;\n }\n }\n\n if (entry.type === 'memory:archive_store') {\n totalArchiveStores++;\n if (entry.archiveStats) {\n lastArchiveEntries = entry.archiveStats.totalEntries || 0;\n lastArchiveUniqueFiles = entry.archiveStats.uniqueFiles || 0;\n }\n }\n\n if (entry.type === 'memory:summarization_result') {\n summarizationRuns++;\n if (entry.efficiency) {\n compressionRatioSum += entry.efficiency.compressionRatio || 0;\n newFactRateSum += entry.efficiency.newFactRate || 0;\n }\n }\n }\n\n const hasMemoryEvents = totalFactsAdded > 0 || totalArchiveStores > 0 || summarizationRuns > 0;\n\n return {\n eventCounts,\n iterations,\n totalCost,\n errors,\n memory: hasMemoryEvents\n ? {\n totalFactsAdded,\n totalArchiveStores,\n summarizationRuns,\n avgCompressionRatio: summarizationRuns > 0 ? compressionRatioSum / summarizationRuns : 0,\n avgNewFactRate: summarizationRuns > 0 ? newFactRateSum / summarizationRuns : 0,\n finalFactSheetSize: lastFactSheetSize,\n finalFactSheetTokens: lastFactSheetTokens,\n finalArchiveEntries: lastArchiveEntries,\n finalArchiveUniqueFiles: lastArchiveUniqueFiles,\n }\n : undefined,\n };\n }\n\n /**\n * Ensure directory exists\n */\n private ensureDirectoryExists(dir: string): void {\n try {\n mkdirSync(dir, { recursive: true });\n } catch (error) {\n // Check if directory already exists\n try {\n const stats = statSync(dir);\n if (!stats.isDirectory()) {\n throw new Error(`Path exists but is not a directory: ${dir}`);\n }\n // Directory exists - all good\n } catch {\n // Directory doesn't exist and couldn't be created\n throw new Error(`Failed to create trace directory: ${dir}. Error: ${error}`);\n }\n }\n }\n}\n","/**\n * File-based tracer that saves execution traces to JSON files\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tracer, TraceEntry, DetailedTraceEntry } from '@kb-labs/agent-contracts';\ntype AnyEntry = Omit<DetailedTraceEntry, 'seq' | 'timestamp'>;\n\n/**\n * File tracer implementation\n */\nexport class FileTracer implements Tracer {\n private entries: AnyEntry[] = [];\n private taskId: string;\n private sessionId?: string;\n\n constructor(taskId: string, sessionId?: string) {\n this.taskId = taskId;\n this.sessionId = sessionId;\n }\n\n /**\n * Record a trace entry\n */\n trace(entry: AnyEntry): void {\n this.entries.push(entry);\n }\n\n /**\n * Get all trace entries\n */\n getEntries(): TraceEntry[] {\n return this.entries as unknown as TraceEntry[];\n }\n\n /**\n * Save trace to file\n */\n async save(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n const traceData = {\n taskId: this.taskId,\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n totalEntries: this.entries.length,\n entries: this.entries,\n };\n\n await fs.writeFile(filePath, JSON.stringify(traceData, null, 2), 'utf-8');\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries = [];\n }\n\n /**\n * Get trace summary statistics\n */\n getSummary(): {\n totalEntries: number;\n llmCalls: number;\n toolCalls: number;\n totalDuration: number;\n avgLLMDuration: number;\n avgToolDuration: number;\n } {\n const llmCalls = this.entries.filter(e => e.type === 'llm:call');\n const toolCalls = this.entries.filter(e => e.type === 'tool:execution');\n\n const getDuration = (e: AnyEntry): number => {\n if (e.type === 'llm:call' || e.type === 'tool:execution') {\n return (e as { timing?: { durationMs?: number } }).timing?.durationMs ?? 0;\n }\n return 0;\n };\n\n const totalDuration = this.entries.reduce((sum, e) => sum + getDuration(e), 0);\n const llmDuration = llmCalls.reduce((sum, e) => sum + getDuration(e), 0);\n const toolDuration = toolCalls.reduce((sum, e) => sum + getDuration(e), 0);\n\n return {\n totalEntries: this.entries.length,\n llmCalls: llmCalls.length,\n toolCalls: toolCalls.length,\n totalDuration,\n avgLLMDuration: llmCalls.length > 0 ? llmDuration / llmCalls.length : 0,\n avgToolDuration: toolCalls.length > 0 ? toolDuration / toolCalls.length : 0,\n };\n }\n}\n","/**\n * TraceLoader — loads and validates NDJSON trace files for CLI commands.\n *\n * Centralizes the logic duplicated across all trace commands:\n * - taskId format validation (prevent path traversal)\n * - file existence check\n * - file size guard (prevent memory exhaustion)\n * - NDJSON parsing with graceful line-error handling\n */\n\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\n\nexport const TRACE_DIR_RELATIVE = path.join('.kb', 'traces', 'incremental');\nconst TASK_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\nconst MAX_FILE_SIZE_BYTES = 100 * 1024 * 1024; // 100 MB\n\nexport type TraceLoadError =\n | { kind: 'invalid_task_id'; message: string }\n | { kind: 'not_found'; taskId: string }\n | { kind: 'too_large'; sizeBytes: number }\n | { kind: 'empty'; taskId: string }\n | { kind: 'io_error'; message: string };\n\nexport type TraceLoadResult =\n | { ok: true; events: DetailedTraceEntry[]; taskId: string; filePath: string }\n | { ok: false; error: TraceLoadError };\n\n/**\n * Load and parse a trace file by taskId.\n *\n * @param taskId - The task ID (validated against alphanumeric + hyphens/underscores)\n * @param workingDir - Base directory to resolve `.kb/traces/incremental/` from (default: process.cwd())\n */\nexport async function loadTrace(\n taskId: string | undefined,\n workingDir: string = process.cwd()\n): Promise<TraceLoadResult> {\n // 1. Presence check\n if (!taskId) {\n return { ok: false, error: { kind: 'invalid_task_id', message: 'Missing required --task-id' } };\n }\n\n // 2. Format validation — prevents path traversal by construction\n if (!TASK_ID_PATTERN.test(taskId)) {\n return {\n ok: false,\n error: {\n kind: 'invalid_task_id',\n message: 'Task ID must contain only alphanumeric characters, hyphens, and underscores',\n },\n };\n }\n\n const traceDir = path.join(workingDir, TRACE_DIR_RELATIVE);\n const filePath = path.join(traceDir, `${taskId}.ndjson`);\n\n // 3. Redundant path traversal check (defence-in-depth)\n const resolvedFile = path.resolve(filePath);\n const resolvedDir = path.resolve(traceDir);\n if (!resolvedFile.startsWith(resolvedDir + path.sep) && resolvedFile !== resolvedDir) {\n return { ok: false, error: { kind: 'invalid_task_id', message: 'Path traversal detected' } };\n }\n\n // 4. Existence + size check\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(filePath);\n } catch {\n return { ok: false, error: { kind: 'not_found', taskId } };\n }\n\n if (stat.size > MAX_FILE_SIZE_BYTES) {\n return { ok: false, error: { kind: 'too_large', sizeBytes: stat.size } };\n }\n\n // 5. Read + parse NDJSON — skip malformed lines gracefully\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (e) {\n return { ok: false, error: { kind: 'io_error', message: (e as Error).message } };\n }\n\n const events: DetailedTraceEntry[] = [];\n for (const line of content.split('\\n')) {\n if (!line.trim()) { continue; }\n try {\n events.push(JSON.parse(line) as DetailedTraceEntry);\n } catch {\n // Malformed line — skip silently (agent may have crashed mid-write)\n }\n }\n\n if (events.length === 0) {\n return { ok: false, error: { kind: 'empty', taskId } };\n }\n\n return { ok: true, events, taskId, filePath };\n}\n\n/**\n * Format a TraceLoadError into a human-readable string for CLI output.\n */\nexport function formatTraceLoadError(error: TraceLoadError): string {\n switch (error.kind) {\n case 'invalid_task_id': return `Invalid task ID: ${error.message}`;\n case 'not_found': return `Trace not found: ${error.taskId}`;\n case 'too_large': return `Trace file too large: ${Math.round(error.sizeBytes / 1024 / 1024)} MB (limit 100 MB)`;\n case 'empty': return `Trace file is empty: ${error.taskId}`;\n case 'io_error': return `IO error reading trace: ${error.message}`;\n }\n}\n","/**\n * Helper functions for creating detailed trace events\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-imports */\n/* eslint-disable sonarjs/no-duplicate-string */\n// Using import() in return types to avoid circular dependencies\n// Dynamic import syntax required for type-only imports in signatures\n\nimport type {\n IterationDetailEvent,\n LLMCallEvent,\n ToolExecutionEvent,\n MemorySnapshotEvent,\n DecisionPointEvent,\n SynthesisForcedTraceEvent,\n ErrorCapturedEvent,\n FactAddedEvent,\n ArchiveStoreEvent,\n SummarizationResultEvent,\n SummarizationLLMCallEvent,\n} from '@kb-labs/agent-contracts';\nimport type { LLMMessage, LLMToolCall, LLMToolCallResponse } from '@kb-labs/sdk';\n\n/**\n * Create iteration:detail event\n */\nexport function createIterationDetailEvent(params: {\n iteration: number;\n maxIterations: number;\n mode: 'instant' | 'auto' | 'thinking';\n temperature: number;\n availableTools: string[];\n messages: LLMMessage[];\n totalTokens: number;\n}): Omit<IterationDetailEvent, 'seq' | 'timestamp'> {\n return {\n type: 'iteration:detail',\n iteration: params.iteration,\n config: {\n maxIterations: params.maxIterations,\n mode: params.mode,\n temperature: params.temperature,\n },\n availableTools: {\n total: params.availableTools.length,\n tools: params.availableTools,\n },\n context: {\n messagesCount: params.messages.length,\n totalTokens: params.totalTokens,\n conversationSummary: params.messages\n .slice(-2)\n .map((m) => `${m.role}: ${m.content?.substring(0, 100) || ''}`)\n .join(' | '),\n },\n };\n}\n\n/**\n * Create llm:call event\n */\nexport function createLLMCallEvent(params: {\n iteration: number;\n model: string;\n temperature: number;\n maxTokens: number;\n tools: string[];\n response: LLMToolCallResponse;\n startTime: number;\n endTime: number;\n}): Omit<LLMCallEvent, 'seq' | 'timestamp'> {\n const durationMs = params.endTime - params.startTime;\n\n // Calculate cost (simple estimation - can be improved with actual pricing)\n const inputCost = (params.response.usage?.promptTokens || 0) * 0.000003; // $3 per 1M tokens\n const outputCost = (params.response.usage?.completionTokens || 0) * 0.000015; // $15 per 1M tokens\n\n return {\n type: 'llm:call',\n iteration: params.iteration,\n request: {\n model: params.model,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n tools: params.tools,\n },\n response: {\n content: params.response.content || null,\n toolCalls: params.response.toolCalls?.map((tc: LLMToolCall) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n })),\n stopReason: params.response.toolCalls && params.response.toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n usage: {\n inputTokens: params.response.usage.promptTokens,\n outputTokens: params.response.usage.completionTokens,\n totalTokens: params.response.usage.promptTokens + params.response.usage.completionTokens,\n },\n },\n timing: {\n startedAt: new Date(params.startTime).toISOString(),\n completedAt: new Date(params.endTime).toISOString(),\n durationMs,\n },\n cost: {\n inputCost,\n outputCost,\n totalCost: inputCost + outputCost,\n currency: 'USD',\n },\n };\n}\n\n/**\n * Create tool:execution event\n */\nexport function createToolExecutionEvent(params: {\n iteration: number;\n toolName: string;\n callId: string;\n input: unknown;\n output: {\n success: boolean;\n result?: unknown;\n error?: {\n message: string;\n code?: string;\n stack?: string;\n };\n };\n startTime: number;\n endTime: number;\n metadata?: Record<string, unknown>;\n}): Omit<ToolExecutionEvent, 'seq' | 'timestamp'> {\n const durationMs = params.endTime - params.startTime;\n\n // Record full output for tracing (up to 50KB), with truncation flag\n const resultStr = typeof params.output.result === 'string'\n ? params.output.result\n : JSON.stringify(params.output.result || '');\n const TRACE_OUTPUT_LIMIT = 50000; // 50KB — generous for debugging\n const truncated = resultStr.length > TRACE_OUTPUT_LIMIT;\n\n return {\n type: 'tool:execution',\n iteration: params.iteration,\n tool: {\n name: params.toolName,\n callId: params.callId,\n },\n input: params.input,\n output: {\n success: params.output.success,\n result: truncated ? resultStr.substring(0, TRACE_OUTPUT_LIMIT) + `\\n... (truncated from ${resultStr.length} chars)` : params.output.result,\n error: params.output.error,\n truncated,\n originalLength: resultStr.length,\n },\n timing: {\n startedAt: new Date(params.startTime).toISOString(),\n completedAt: new Date(params.endTime).toISOString(),\n durationMs,\n },\n metadata: params.metadata,\n };\n}\n\n/**\n * Create memory:snapshot event\n */\nexport function createMemorySnapshotEvent(params: {\n iteration: number;\n conversationHistory: number;\n userPreferences: Record<string, unknown>;\n facts: string[];\n findings: string[];\n filesRead: string[];\n searchesMade: number;\n toolsUsed: Record<string, number>;\n}): Omit<MemorySnapshotEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:snapshot',\n iteration: params.iteration,\n sessionMemory: {\n conversationHistory: params.conversationHistory,\n userPreferences: params.userPreferences,\n },\n sharedMemory: {\n facts: params.facts,\n findings: params.findings,\n },\n executionMemory: {\n filesRead: params.filesRead,\n searchesMade: params.searchesMade,\n toolsUsed: params.toolsUsed,\n },\n };\n}\n\n/**\n * Create decision:point event\n */\nexport function createDecisionPointEvent(params: {\n iteration: number;\n decision: 'tool_selection' | 'stopping_condition' | 'synthesis';\n toolSelection?: {\n chosenTool: string;\n reasoning: string;\n alternatives: Array<{ tool: string; reason: string }>;\n };\n stoppingCondition?: {\n shouldStop: boolean;\n reason: string;\n };\n}): Omit<DecisionPointEvent, 'seq' | 'timestamp'> {\n return {\n type: 'decision:point',\n iteration: params.iteration,\n decision: params.decision,\n toolSelection: params.toolSelection,\n stoppingCondition: params.stoppingCondition,\n };\n}\n\n/**\n * Create synthesis:forced event\n */\nexport function createSynthesisForcedEvent(params: {\n iteration: number;\n reason: 'last_iteration' | 'max_iterations' | 'no_tool_call' | 'user_request';\n lastIteration: number;\n lastToolCall?: string;\n synthesisPrompt: string;\n synthesisResponse: {\n content: string;\n tokens: number;\n durationMs: number;\n };\n}): Omit<SynthesisForcedTraceEvent, 'seq' | 'timestamp'> {\n return {\n type: 'synthesis:forced',\n iteration: params.iteration,\n trigger: {\n reason: params.reason,\n lastIteration: params.lastIteration,\n lastToolCall: params.lastToolCall,\n },\n synthesisPrompt: params.synthesisPrompt,\n synthesisResponse: params.synthesisResponse,\n };\n}\n\n/**\n * Create error:captured event\n */\nexport function createErrorCapturedEvent(params: {\n iteration: number;\n error: Error;\n lastLLMCall?: {\n request: unknown;\n response: unknown;\n durationMs: number;\n };\n lastToolCall?: {\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n };\n currentMessages: LLMMessage[];\n memoryState: {\n filesRead: string[];\n searchesMade: number;\n };\n availableTools: string[];\n agentStack: {\n currentPhase?: string;\n currentStep?: string;\n iterationHistory: number[];\n };\n}): Omit<ErrorCapturedEvent, 'seq' | 'timestamp'> {\n return {\n type: 'error:captured',\n iteration: params.iteration,\n error: {\n message: params.error.message,\n stack: params.error.stack || '',\n code: (params.error as unknown as { code?: string }).code,\n name: params.error.name,\n },\n context: {\n lastLLMCall: params.lastLLMCall,\n lastToolCall: params.lastToolCall,\n currentMessages: params.currentMessages.slice(-5).map((m) => ({\n role: (m.role === 'tool' ? 'assistant' : m.role) as 'system' | 'user' | 'assistant',\n contentPreview: m.content?.substring(0, 100) || '',\n })),\n memoryState: params.memoryState,\n availableTools: params.availableTools,\n },\n agentStack: params.agentStack,\n };\n}\n\n/**\n * Create prompt:diff event\n */\nexport function createPromptDiffEvent(params: {\n iteration: number;\n messagesAdded: number;\n messagesRemoved: number;\n totalMessages: number;\n changes: Array<{\n type: 'added' | 'removed' | 'modified';\n role: 'system' | 'user' | 'assistant';\n contentPreview: string;\n index: number;\n }>;\n tokensBefore: number;\n tokensAfter: number;\n}): Omit<import('@kb-labs/agent-contracts').PromptDiffEvent, 'seq' | 'timestamp'> {\n return {\n type: 'prompt:diff',\n iteration: params.iteration,\n diff: {\n messagesAdded: params.messagesAdded,\n messagesRemoved: params.messagesRemoved,\n totalMessages: params.totalMessages,\n changes: params.changes,\n contextGrowth: {\n tokensBefore: params.tokensBefore,\n tokensAfter: params.tokensAfter,\n delta: params.tokensAfter - params.tokensBefore,\n },\n },\n };\n}\n\n/**\n * Create tool:filter event\n */\nexport function createToolFilterEvent(params: {\n iteration: number;\n beforeTools: string[];\n afterTools: string[];\n filtered: Array<{\n name: string;\n reason: 'last_iteration' | 'mode_restriction' | 'tier_restriction' | 'custom';\n explanation: string;\n }>;\n}): Omit<import('@kb-labs/agent-contracts').ToolFilterEvent, 'seq' | 'timestamp'> {\n return {\n type: 'tool:filter',\n iteration: params.iteration,\n filtering: {\n before: {\n totalTools: params.beforeTools.length,\n tools: params.beforeTools,\n },\n after: {\n totalTools: params.afterTools.length,\n tools: params.afterTools,\n },\n filtered: params.filtered,\n },\n };\n}\n\n/**\n * Create context:trim event\n */\nexport function createContextTrimEvent(params: {\n iteration: number;\n trigger: 'max_tokens' | 'max_messages' | 'manual';\n messageCountBefore: number;\n messageCountAfter: number;\n tokensBefore: number;\n tokensAfter: number;\n messagesRemoved: number;\n tokensRemoved: number;\n contentPreview: string;\n strategy: 'sliding_window' | 'summarization' | 'importance_based';\n}): Omit<import('@kb-labs/agent-contracts').ContextTrimEvent, 'seq' | 'timestamp'> {\n return {\n type: 'context:trim',\n iteration: params.iteration,\n trimming: {\n trigger: params.trigger,\n before: {\n messageCount: params.messageCountBefore,\n estimatedTokens: params.tokensBefore,\n },\n after: {\n messageCount: params.messageCountAfter,\n estimatedTokens: params.tokensAfter,\n },\n removed: {\n messageCount: params.messagesRemoved,\n tokensRemoved: params.tokensRemoved,\n contentPreview: params.contentPreview,\n },\n strategy: params.strategy,\n },\n };\n}\n\n/**\n * Create stopping:analysis event\n */\nexport function createStoppingAnalysisEvent(params: {\n iteration: number;\n conditions: {\n maxIterationsReached: boolean;\n timeoutReached: boolean;\n foundTarget: boolean;\n sufficientContext: boolean;\n diminishingReturns: boolean;\n userInterrupt: boolean;\n error: boolean;\n };\n reasoning: string;\n iterationsUsed: number;\n iterationsRemaining: number;\n timeElapsedMs: number;\n timeRemainingMs?: number;\n toolCallsInLast3Iterations: number;\n confidenceScore?: number;\n}): Omit<import('@kb-labs/agent-contracts').StoppingAnalysisEvent, 'seq' | 'timestamp'> {\n return {\n type: 'stopping:analysis',\n iteration: params.iteration,\n conditions: params.conditions,\n reasoning: params.reasoning,\n metrics: {\n iterationsUsed: params.iterationsUsed,\n iterationsRemaining: params.iterationsRemaining,\n timeElapsedMs: params.timeElapsedMs,\n timeRemainingMs: params.timeRemainingMs,\n toolCallsInLast3Iterations: params.toolCallsInLast3Iterations,\n confidenceScore: params.confidenceScore,\n },\n };\n}\n\n/**\n * Create llm:validation event\n */\nexport function createLLMValidationEvent(params: {\n iteration: number;\n stopReason: 'tool_use' | 'end_turn' | 'max_tokens' | 'stop_sequence';\n isValid: boolean;\n hasContent: boolean;\n hasToolCalls: boolean;\n toolCallsValid: boolean;\n jsonParseable: boolean;\n schemaValid: boolean;\n issues: Array<{\n severity: 'error' | 'warning' | 'info';\n check: string;\n message: string;\n recovery?: string;\n }>;\n}): Omit<import('@kb-labs/agent-contracts').LLMValidationEvent, 'seq' | 'timestamp'> {\n return {\n type: 'llm:validation',\n iteration: params.iteration,\n validation: {\n stopReason: params.stopReason,\n isValid: params.isValid,\n checks: {\n hasContent: params.hasContent,\n hasToolCalls: params.hasToolCalls,\n toolCallsValid: params.toolCallsValid,\n jsonParseable: params.jsonParseable,\n schemaValid: params.schemaValid,\n },\n issues: params.issues,\n },\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// Two-Tier Memory Events\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Create memory:fact_added event\n */\nexport function createFactAddedEvent(params: {\n iteration: number;\n fact: {\n id: string;\n category: string;\n fact: string;\n confidence: number;\n source: string;\n merged: boolean;\n superseded?: string;\n };\n factSheetStats: {\n totalFacts: number;\n estimatedTokens: number;\n byCategory: Record<string, number>;\n };\n}): Omit<FactAddedEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:fact_added',\n iteration: params.iteration,\n fact: params.fact,\n factSheetStats: params.factSheetStats,\n };\n}\n\n/**\n * Create memory:archive_store event\n */\nexport function createArchiveStoreEvent(params: {\n iteration: number;\n entry: {\n id: string;\n toolName: string;\n filePath?: string;\n outputLength: number;\n estimatedTokens: number;\n keyFactsExtracted: number;\n };\n archiveStats: {\n totalEntries: number;\n totalChars: number;\n uniqueFiles: number;\n evicted: number;\n };\n}): Omit<ArchiveStoreEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:archive_store',\n iteration: params.iteration,\n entry: params.entry,\n archiveStats: params.archiveStats,\n };\n}\n\n/**\n * Create memory:summarization_llm_call event.\n * Records the raw LLM interaction for fact extraction debugging.\n */\nexport function createSummarizationLLMCallEvent(params: {\n iteration: number;\n prompt: string;\n rawResponse: string;\n parseSuccess: boolean;\n parseError?: string;\n durationMs: number;\n outputTokens: number;\n}): Omit<SummarizationLLMCallEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:summarization_llm_call',\n iteration: params.iteration,\n prompt: params.prompt,\n rawResponse: params.rawResponse,\n parseSuccess: params.parseSuccess,\n parseError: params.parseError,\n timing: {\n durationMs: params.durationMs,\n outputTokens: params.outputTokens,\n },\n };\n}\n\n/**\n * Create memory:summarization_result event\n */\nexport function createSummarizationResultEvent(params: {\n iteration: number;\n input: {\n iterationRange: [number, number];\n messagesCount: number;\n inputChars: number;\n inputTokens: number;\n };\n output: {\n factsExtracted: number;\n factsByCategory: Record<string, number>;\n outputTokens: number;\n llmDurationMs: number;\n };\n delta: {\n factSheetBefore: number;\n factSheetAfter: number;\n tokensBefore: number;\n tokensAfter: number;\n newFacts: number;\n mergedFacts: number;\n evictedFacts: number;\n };\n efficiency: {\n compressionRatio: number;\n factDensity: number;\n newFactRate: number;\n };\n}): Omit<SummarizationResultEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:summarization_result',\n iteration: params.iteration,\n input: params.input,\n output: params.output,\n delta: params.delta,\n efficiency: params.efficiency,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/tracing/src/privacy-redactor.ts","../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/tracing/src/incremental-trace-writer.ts","../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/tracing/src/file-tracer.ts","../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/tracing/src/trace-loader.ts","../../../../../../Users/kirillbaranov/Desktop/kb-labs-workspace/plugins/agents/tracing/src/trace-helpers.ts"],"names":["path","fs","path2"],"mappings":";;;;;;;;AAaA,IAAM,uBAAA,GAA0B;AAAA;AAAA,EAE9B,sBAAA;AAAA;AAAA,EACA,2BAAA;AAAA;AAAA,EACA,sBAAA;AAAA;AAAA;AAAA,EAGA,iCAAA;AAAA,EACA,qCAAA;AAAA;AAAA,EAGA,qCAAA;AAAA,EACA,mCAAA;AAAA,EACA,gCAAA;AAAA;AAAA,EAGA,mCAAA;AAAA,EACA,iCAAA;AAAA,EACA,yBAAA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAKF,CAAA;AAKO,SAAS,uBAAA,CACd,GAAA,EACA,QAAA,GAAqB,uBAAA,EACb;AACR,EAAA,IAAI,MAAA,GAAS,GAAA;AAEb,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,YAAY,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAA,CACd,KACA,YAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,GAAA;AAGb,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/D,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,IAAI,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,EAAG,GAAG,CAAA,EAAG,QAAQ,CAAA;AAAA,EACpG;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,WAAA,CACd,KAAA,EACA,MAAA,EACA,KAAA,GAAQ,CAAA,EACC;AAET,EAAA,IAAI,QAAQ,EAAA,EAAI;AACd,IAAA,OAAO,qBAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,MAAM,QAAA,GAAW,OAAO,cAAA,CAAe,GAAA,CAAI,OAAK,IAAI,MAAA,CAAO,CAAA,EAAG,GAAG,CAAC,CAAA;AAClE,MAAA,MAAA,GAAS,wBAAwB,MAAA,EAAQ,CAAC,GAAG,uBAAA,EAAyB,GAAG,QAAQ,CAAC,CAAA;AAAA,IACpF;AAEA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,MAAA,GAAS,WAAA,CAAY,MAAA,EAAQ,MAAA,CAAO,gBAAgB,CAAA;AAAA,IACtD;AAGA,IAAA,OAAO,MAAA,KAAW,QAAQ,KAAA,GAAQ,MAAA;AAAA,EACpC;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACpD,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,OAAO,UAAU,MAAA,GAAS,KAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,SAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9C,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACnD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA;AACd,MAAA,IAAI,aAAa,GAAA,EAAK;AACpB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF;AAGA,IAAA,OAAO,UAAU,MAAA,GAAS,KAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,gBAAA,CACd,OACA,MAAA,EACoB;AAEpB,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,IAAiB,CAAC,OAAO,WAAA,EAAa;AAChD,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACrC,EAAA,MAAM,eAAA,GAAkB,GAAA;AACxB,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,GAAS,eAAA,GAAkB,SAAS,SAAA,CAAU,CAAA,EAAG,eAAe,CAAA,GAAI,QAAA;AAC7F,EAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,MAAM,QAAA,GAAW,OAAO,cAAA,CAAe,GAAA,CAAI,OAAK,IAAI,MAAA,CAAO,CAAA,EAAG,GAAG,CAAC,CAAA;AAClE,IAAA,cAAA,GAAiB,CAAC,GAAG,uBAAA,EAAyB,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACtF;AAEA,EAAA,IAAI,CAAC,cAAA,IAAkB,MAAA,CAAO,WAAA,EAAa;AACzC,IAAA,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA,CAAE,IAAA,CAAK,CAAAA,KAAAA,KAAQ,OAAA,CAAQ,QAAA,CAASA,KAAI,CAAC,CAAA;AAAA,EAC3F;AAGA,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,WAAA,CAAY,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA;AACrC;AAKO,SAAS,0BAAA,GAAqD;AACnE,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,IAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,gBAAgB,EAAC;AAAA,IACjB,gBAAA,EAAkB;AAAA,MAChB,QAAA,EAAU,GAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,WAAA,EAAa;AAAA;AACf,GACF;AACF;;;ACvFO,IAAM,oBAAA,GAAoC;AAAA,EAC/C,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,UAAA;AAAA,EAEP,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,eAAA,EAAiB,GAAA;AAAA,IACjB,aAAA,EAAe,EAAA;AAAA,IACf,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,eAAA,EAAiB,IAAA;AAAA,IACjB,SAAA,EAAW;AAAA,GACb;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,SAAA,EAAW,EAAA;AAAA,IACX,OAAA,EAAS,EAAA;AAAA,IACT,iBAAA,EAAmB,IAAA;AAAA,IACnB,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,WAAA,EAAa,IAAA;AAAA,IACb,cAAA,EAAgB;AAAA,MACd,qBAAA;AAAA;AAAA,MACA,0BAAA;AAAA;AAAA,MACA,CAAA,0CAAA,CAAA;AAAA;AAAA,MACA,CAAA,0CAAA;AAAA;AAAA,KACF;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU,IAAA;AAAA,MACV,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,wBAAA;AAAA,IACN,SAAA,EAAW;AAAA;AAEf;AAKO,IAAM,yBAAN,MAA+C;AAAA,EAC5C,GAAA,GAAc,CAAA;AAAA,EACd,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CACE,MAAA,EACA,MAAA,GAA+B,IAC/B,SAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AACnD,IAAA,IAAA,CAAK,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAExC,IAAA,MAAM,GAAA,GAAM,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA;AAC7C,IAAA,IAAA,CAAK,WAAWA,cAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA,OAAA,CAAS,CAAA;AACjD,IAAA,IAAA,CAAK,YAAYA,cAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA,WAAA,CAAa,CAAA;AAGtD,IAAA,IAAA,CAAK,sBAAsB,GAAG,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,EAAkB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,GAAA;AACnB,MAAA,MAAM,YAAY,KAAA,CAAM,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAE5D,MAAA,MAAM,SAAA,GAAgC;AAAA,QACpC,GAAG,KAAA;AAAA,QACH,GAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAGtC,MAAA,cAAA,CAAe,KAAK,QAAA,EAAU,IAAA,CAAK,UAAU,QAAQ,CAAA,GAAI,MAAM,OAAO,CAAA;AAAA,IACxE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAAA,IAEhE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,GAAoB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AACnD,MAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAChD,MAAA,OAAO,MAAM,GAAA,CAAI,CAAC,SAAiB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,SAAA,EAAkC;AAAA,EAE7C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,CAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI;AAEF,MAAA,MAAM,KAAK,WAAA,EAAY;AAGvB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,iBAAA,EAAmB;AAC3C,QAAA,MAAM,KAAK,gBAAA,EAAiB;AAAA,MAC9B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8CAA8C,KAAK,CAAA;AAAA,IACnE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAEhC,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,KAAK,8CAA8C,CAAA;AAC3D,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,wBAAA,CAAyB,OAAO,CAAA;AAGnD,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,OAAA,EAAS,OAAA;AAAA,QACT,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAEpC,OAAA,EAAS;AAAA,UACP,aAAa,OAAA,CAAQ,MAAA;AAAA,UACrB,UAAA,EAAY,MAAM,UAAA,CAAW,IAAA;AAAA,UAC7B,MAAA,EAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,SAAA;AAAA,UACtC,aAAa,KAAA,CAAM;AAAA,SACrB;AAAA,QAEA,MAAA,EAAQ;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UACpC,eAAA,EAAiB,KAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA;AAAQ,SACjE;AAAA,QAEA,IAAA,EAAM;AAAA,UACJ,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,QAAA,EAAU;AAAA,SACZ;AAAA,QAEA,QAAQ,KAAA,CAAM,MAAA;AAAA,QAEd,QAAQ,KAAA,CAAM,MAAA;AAAA,QAEd,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,OAAA,EAAS,CAAA,CAC9C,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,SAAS,CAAA,MAAO,EAAE,SAAA,EAAW,GAAG,SAAA,EAAU,CAAE,CAAA,CAC7D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS;AAAA,OAC7C;AAGA,MAAA,MAAM,QAAA,GAAWA,cAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAC5C,MAAA,IAAA,CAAK,sBAAsB,QAAQ,CAAA;AAGnC,MAAA,MAAMC,QAAA,CAAG,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAC5E,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AAAA,IAEtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMD,cAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,MAAMC,QAAA,CAAG,OAAA,CAAQ,GAAG,CAAA;AAGlC,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,SAAS,CAAC,CAAA;AAG5D,MAAA,IAAI,UAAA,CAAW,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,UAAU,SAAA,EAAW;AACxD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,GAAA;AAAA,QACnC,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAS;AAC7B,UAAA,MAAM,QAAA,GAAWD,cAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACpC,UAAA,MAAM,KAAA,GAAQ,MAAMC,QAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AACpC,UAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,IAAW,QAAA,EAAS;AAAA,QACxD,CAAC;AAAA,OACH;AAEA,MAAA,cAAA,CAAe,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAG/C,MAAA,MAAM,WAAW,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAU,SAAS,CAAA;AAGrE,MAAA,MAAM,OAAA,CAAQ,UAAA;AAAA,QACZ,SAAS,GAAA,CAAI,OAAO,EAAE,IAAA,EAAM,UAAS,KAAM;AACzC,UAAA,IAAI;AAEF,YAAA,MAAMA,QAAA,CAAG,OAAO,QAAQ,CAAA;AAGxB,YAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,aAAa,CAAA;AAC3D,YAAA,IAAI;AACF,cAAA,MAAMA,QAAA,CAAG,OAAO,SAAS,CAAA;AAAA,YAC3B,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,0CAAA,EAA6C,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,UAC3E;AAAA,QACF,CAAC;AAAA,OACH;AAEA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,uCAAuC,QAAA,CAAS,MAAM,0BAA0B,IAAA,CAAK,MAAA,CAAO,UAAU,SAAS,CAAA,CAAA;AAAA,SACjH;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AAAA,IAE3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,OAAO,KAAA,EAA+C;AAC5D,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa;AAC1E,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,KAAK,CAAA;AAC9D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,OAAA,EAgB/B;AACA,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAyE;AAChG,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,MAAA,GAAS,CAAA;AAGb,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,IAAI,sBAAA,GAAyB,CAAA;AAE7B,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE3B,MAAA,WAAA,CAAY,MAAM,IAAI,CAAA,GAAA,CAAK,YAAY,KAAA,CAAM,IAAI,KAAK,CAAA,IAAK,CAAA;AAG3D,MAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpC,UAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,EAAE,UAAA,EAAY,GAAG,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,CAAA;AAAA,QAC9E;AACA,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAC3C,QAAA,IAAA,CAAK,UAAA,EAAA;AAEL,QAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,UAAA,IAAA,CAAK,QAAA,EAAA;AACL,UAAA,IAAI,MAAA,IAAU,KAAA,IAAS,KAAA,CAAM,IAAA,EAAM;AACjC,YAAA,SAAA,IAAa,KAAA,CAAM,KAAK,SAAA,IAAa,CAAA;AAAA,UACvC;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,UAAA,IAAA,CAAK,SAAA,EAAA;AAAA,QACP;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,gBAAA,EAAkB;AACnC,QAAA,MAAA,EAAA;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,SAAS,mBAAA,EAAqB;AACtC,QAAA,eAAA,EAAA;AACA,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,iBAAA,GAAoB,KAAA,CAAM,eAAe,UAAA,IAAc,CAAA;AACvD,UAAA,mBAAA,GAAsB,KAAA,CAAM,eAAe,eAAA,IAAmB,CAAA;AAAA,QAChE;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,sBAAA,EAAwB;AACzC,QAAA,kBAAA,EAAA;AACA,QAAA,IAAI,MAAM,YAAA,EAAc;AACtB,UAAA,kBAAA,GAAqB,KAAA,CAAM,aAAa,YAAA,IAAgB,CAAA;AACxD,UAAA,sBAAA,GAAyB,KAAA,CAAM,aAAa,WAAA,IAAe,CAAA;AAAA,QAC7D;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,6BAAA,EAA+B;AAChD,QAAA,iBAAA,EAAA;AACA,QAAA,IAAI,MAAM,UAAA,EAAY;AACpB,UAAA,mBAAA,IAAuB,KAAA,CAAM,WAAW,gBAAA,IAAoB,CAAA;AAC5D,UAAA,cAAA,IAAkB,KAAA,CAAM,WAAW,WAAA,IAAe,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,eAAA,GAAkB,CAAA,IAAK,kBAAA,GAAqB,KAAK,iBAAA,GAAoB,CAAA;AAE7F,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAQ,eAAA,GACJ;AAAA,QACE,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,iBAAA;AAAA,QACA,mBAAA,EAAqB,iBAAA,GAAoB,CAAA,GAAI,mBAAA,GAAsB,iBAAA,GAAoB,CAAA;AAAA,QACvF,cAAA,EAAgB,iBAAA,GAAoB,CAAA,GAAI,cAAA,GAAiB,iBAAA,GAAoB,CAAA;AAAA,QAC7E,kBAAA,EAAoB,iBAAA;AAAA,QACpB,oBAAA,EAAsB,mBAAA;AAAA,QACtB,mBAAA,EAAqB,kBAAA;AAAA,QACrB,uBAAA,EAAyB;AAAA,OAC3B,GACA;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,GAAA,EAAmB;AAC/C,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,IACpC,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,QAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AACxB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,GAAG,CAAA,CAAE,CAAA;AAAA,QAC9D;AAAA,MAEF,CAAA,CAAA,MAAQ;AAEN,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,GAAG,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AACF;ACthBO,IAAM,aAAN,MAAmC;AAAA,EAChC,UAAsB,EAAC;AAAA,EACvB,MAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,QAAgB,SAAA,EAAoB;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAAuB;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,QAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,GAAWC,cAAQ,QAAQ,CAAA;AAGjC,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAEvC,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,YAAA,EAAc,KAAK,OAAA,CAAQ,MAAA;AAAA,MAC3B,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,MAAS,GAAA,CAAA,SAAA,CAAU,UAAU,IAAA,CAAK,SAAA,CAAU,WAAW,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAOE;AACA,IAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AAC/D,IAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,gBAAgB,CAAA;AAEtE,IAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,SAAS,gBAAA,EAAkB;AACxD,QAAA,OAAQ,CAAA,CAA2C,QAAQ,UAAA,IAAc,CAAA;AAAA,MAC3E;AACA,MAAA,OAAO,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAC7E,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AACvE,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AAEzE,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,KAAK,OAAA,CAAQ,MAAA;AAAA,MAC3B,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,WAAW,SAAA,CAAU,MAAA;AAAA,MACrB,aAAA;AAAA,MACA,gBAAgB,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,SAAS,MAAA,GAAS,CAAA;AAAA,MACtE,iBAAiB,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,UAAU,MAAA,GAAS;AAAA,KAC5E;AAAA,EACF;AACF;ACnFO,IAAM,kBAAA,GAAqBF,cAAAA,CAAK,IAAA,CAAK,KAAA,EAAO,UAAU,aAAa;AAC1E,IAAM,eAAA,GAAkB,kBAAA;AACxB,IAAM,mBAAA,GAAsB,MAAM,IAAA,GAAO,IAAA;AAmBzC,eAAsB,SAAA,CACpB,MAAA,EACA,UAAA,GAAqB,OAAA,CAAQ,KAAI,EACP;AAE1B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,4BAAA,EAA6B,EAAE;AAAA,EAChG;AAGA,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,iBAAA;AAAA,QACN,OAAA,EAAS;AAAA;AACX,KACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAWA,cAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,kBAAkB,CAAA;AACzD,EAAA,MAAM,WAAWA,cAAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,OAAA,CAAS,CAAA;AAGvD,EAAA,MAAM,YAAA,GAAeA,cAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAcA,cAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACzC,EAAA,IAAI,CAAC,aAAa,UAAA,CAAW,WAAA,GAAcA,eAAK,GAAG,CAAA,IAAK,iBAAiB,WAAA,EAAa;AACpF,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,OAAA,EAAS,yBAAA,EAA0B,EAAE;AAAA,EAC7F;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAMC,QAAAA,CAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAa,QAAO,EAAE;AAAA,EAC3D;AAEA,EAAA,IAAI,IAAA,CAAK,OAAO,mBAAA,EAAqB;AACnC,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,WAAA,EAAa,SAAA,EAAW,IAAA,CAAK,IAAA,EAAK,EAAE;AAAA,EACzE;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAMA,QAAAA,CAAG,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,EAC/C,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,MAAM,UAAA,EAAY,OAAA,EAAU,CAAA,CAAY,OAAA,EAAQ,EAAE;AAAA,EACjF;AAEA,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAAE,MAAA;AAAA,IAAU;AAC9B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAuB,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAO,EAAE;AAAA,EACvD;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAQ,QAAA,EAAS;AAC9C;AAKO,SAAS,qBAAqB,KAAA,EAA+B;AAClE,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,iBAAA;AAAmB,MAAA,OAAO,CAAA,iBAAA,EAAoB,MAAM,OAAO,CAAA,CAAA;AAAA,IAChE,KAAK,WAAA;AAAa,MAAA,OAAO,CAAA,iBAAA,EAAoB,MAAM,MAAM,CAAA,CAAA;AAAA,IACzD,KAAK,WAAA;AAAa,MAAA,OAAO,yBAAyB,IAAA,CAAK,KAAA,CAAM,MAAM,SAAA,GAAY,IAAA,GAAO,IAAI,CAAC,CAAA,kBAAA,CAAA;AAAA,IAC3F,KAAK,OAAA;AAAS,MAAA,OAAO,CAAA,qBAAA,EAAwB,MAAM,MAAM,CAAA,CAAA;AAAA,IACzD,KAAK,UAAA;AAAY,MAAA,OAAO,CAAA,wBAAA,EAA2B,MAAM,OAAO,CAAA,CAAA;AAAA;AAEpE;;;ACtFO,SAAS,2BAA2B,MAAA,EAQS;AAClD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,MACN,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO;AAAA,KACtB;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,KAAA,EAAO,OAAO,cAAA,CAAe,MAAA;AAAA,MAC7B,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,OAAO,QAAA,CAAS,MAAA;AAAA,MAC/B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,mBAAA,EAAqB,OAAO,QAAA,CACzB,KAAA,CAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAA,EAAS,SAAA,CAAU,CAAA,EAAG,GAAG,KAAK,EAAE,CAAA,CAAE,CAAA,CAC7D,IAAA,CAAK,KAAK;AAAA;AACf,GACF;AACF;AAKO,SAAS,mBAAmB,MAAA,EASS;AAC1C,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,SAAA;AAG3C,EAAA,MAAM,SAAA,GAAA,CAAa,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,gBAAgB,CAAA,IAAK,IAAA;AAC/D,EAAA,MAAM,UAAA,GAAA,CAAc,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,oBAAoB,CAAA,IAAK,KAAA;AAEpE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAA,EAAS;AAAA,MACP,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,OAAA,IAAW,IAAA;AAAA,MACpC,WAAW,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,GAAA,CAAI,CAAC,EAAA,MAAqB;AAAA,QAC9D,IAAI,EAAA,CAAG,EAAA;AAAA,QACP,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAO,EAAA,CAAG;AAAA,OACZ,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,OAAO,QAAA,CAAS,SAAA,IAAa,OAAO,QAAA,CAAS,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,UAAA;AAAA,MAC7F,KAAA,EAAO;AAAA,QACL,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,YAAA;AAAA,QACnC,YAAA,EAAc,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,gBAAA;AAAA,QACpC,aAAa,MAAA,CAAO,QAAA,CAAS,MAAM,YAAA,GAAe,MAAA,CAAO,SAAS,KAAA,CAAM;AAAA;AAC1E,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,WAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,WAAA,EAAY;AAAA,MAClD,aAAa,IAAI,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,WAAA,EAAY;AAAA,MAClD;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAW,SAAA,GAAY,UAAA;AAAA,MACvB,QAAA,EAAU;AAAA;AACZ,GACF;AACF;AAKO,SAAS,yBAAyB,MAAA,EAiBS;AAChD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,SAAA;AAG3C,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,MAAA,CAAO,WAAW,QAAA,GAC9C,MAAA,CAAO,MAAA,CAAO,MAAA,GACd,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAA,CAAO,UAAU,EAAE,CAAA;AAC7C,EAAA,MAAM,kBAAA,GAAqB,GAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,GAAS,kBAAA;AAErC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,IAAA,EAAM;AAAA,MACJ,MAAM,MAAA,CAAO,QAAA;AAAA,MACb,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,IACA,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,OAAO,MAAA,CAAO,OAAA;AAAA,MACvB,QAAQ,SAAA,GAAY,SAAA,CAAU,SAAA,CAAU,CAAA,EAAG,kBAAkB,CAAA,GAAI;AAAA,oBAAA,EAAyB,SAAA,CAAU,MAAM,CAAA,OAAA,CAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,MACpI,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAAA,MACrB,SAAA;AAAA,MACA,gBAAgB,SAAA,CAAU;AAAA,KAC5B;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,WAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,WAAA,EAAY;AAAA,MAClD,aAAa,IAAI,IAAA,CAAK,MAAA,CAAO,OAAO,EAAE,WAAA,EAAY;AAAA,MAClD;AAAA,KACF;AAAA,IACA,UAAU,MAAA,CAAO;AAAA,GACnB;AACF;AAKO,SAAS,0BAA0B,MAAA,EASS;AACjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,aAAA,EAAe;AAAA,MACb,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,iBAAiB,MAAA,CAAO;AAAA,KAC1B;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO;AAAA,KACnB;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,WAAW,MAAA,CAAO;AAAA;AACpB,GACF;AACF;AAKO,SAAS,yBAAyB,MAAA,EAYS;AAChD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,mBAAmB,MAAA,CAAO;AAAA,GAC5B;AACF;AAKO,SAAS,2BAA2B,MAAA,EAWc;AACvD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAA,EAAS;AAAA,MACP,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,cAAc,MAAA,CAAO;AAAA,KACvB;AAAA,IACA,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,mBAAmB,MAAA,CAAO;AAAA,GAC5B;AACF;AAKO,SAAS,yBAAyB,MAAA,EAyBS;AAChD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,OAAO,KAAA,CAAM,OAAA;AAAA,MACtB,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAA;AAAA,MAC7B,IAAA,EAAO,OAAO,KAAA,CAAuC,IAAA;AAAA,MACrD,IAAA,EAAM,OAAO,KAAA,CAAM;AAAA,KACrB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,eAAA,EAAiB,OAAO,eAAA,CAAgB,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC5D,IAAA,EAAO,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,cAAc,CAAA,CAAE,IAAA;AAAA,QAC3C,gBAAgB,CAAA,CAAE,OAAA,EAAS,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,IAAK;AAAA,OAClD,CAAE,CAAA;AAAA,MACF,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,gBAAgB,MAAA,CAAO;AAAA,KACzB;AAAA,IACA,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAKO,SAAS,sBAAsB,MAAA,EAa4C;AAChF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,IAAA,EAAM;AAAA,MACJ,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,aAAA,EAAe;AAAA,QACb,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,KAAA,EAAO,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO;AAAA;AACrC;AACF,GACF;AACF;AAKO,SAAS,sBAAsB,MAAA,EAS4C;AAChF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,OAAO,WAAA,CAAY,MAAA;AAAA,QAC/B,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,OAAO,UAAA,CAAW,MAAA;AAAA,QAC9B,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,MACA,UAAU,MAAA,CAAO;AAAA;AACnB,GACF;AACF;AAKO,SAAS,uBAAuB,MAAA,EAW4C;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,QAAA,EAAU;AAAA,MACR,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN,cAAc,MAAA,CAAO,kBAAA;AAAA,QACrB,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAAA,MACA,KAAA,EAAO;AAAA,QACL,cAAc,MAAA,CAAO,iBAAA;AAAA,QACrB,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAAA,MACA,OAAA,EAAS;AAAA,QACP,cAAc,MAAA,CAAO,eAAA;AAAA,QACrB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,gBAAgB,MAAA,CAAO;AAAA,OACzB;AAAA,MACA,UAAU,MAAA,CAAO;AAAA;AACnB,GACF;AACF;AAKO,SAAS,4BAA4B,MAAA,EAkB4C;AACtF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAA,EAAS;AAAA,MACP,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,4BAA4B,MAAA,CAAO,0BAAA;AAAA,MACnC,iBAAiB,MAAA,CAAO;AAAA;AAC1B,GACF;AACF;AAKO,SAAS,yBAAyB,MAAA,EAe4C;AACnF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,UAAA,EAAY;AAAA,MACV,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,QACN,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,aAAa,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,QAAQ,MAAA,CAAO;AAAA;AACjB,GACF;AACF;AASO,SAAS,qBAAqB,MAAA,EAgBS;AAC5C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,gBAAgB,MAAA,CAAO;AAAA,GACzB;AACF;AAKO,SAAS,wBAAwB,MAAA,EAgBS;AAC/C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,sBAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,cAAc,MAAA,CAAO;AAAA,GACvB;AACF;AAMO,SAAS,gCAAgC,MAAA,EAQS;AACvD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,+BAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAA,EAAQ;AAAA,MACN,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,cAAc,MAAA,CAAO;AAAA;AACvB,GACF;AACF;AAKO,SAAS,+BAA+B,MAAA,EA4BS;AACtD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,6BAAA;AAAA,IACN,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO;AAAA,GACrB;AACF","file":"index.js","sourcesContent":["/**\n * Privacy redaction for trace events\n *\n * Uses shallow clone optimization - only clones objects that need redaction,\n * not the entire trace event tree.\n */\n\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport type { TraceConfig } from './incremental-trace-writer.js';\n\n/**\n * Default secret patterns (regex)\n */\nconst DEFAULT_SECRET_PATTERNS = [\n // API keys\n /sk-[A-Za-z0-9]{20,}/g, // OpenAI API keys\n /sk_live_[A-Za-z0-9]{24,}/g, // Stripe API keys\n /ghp_[A-Za-z0-9]{36}/g, // GitHub personal access tokens\n\n // Authentication tokens\n /Bearer\\s+[A-Za-z0-9\\-._~+/]+=*/g,\n /token[=:]\\s*[A-Za-z0-9\\-._~+/]+=*/gi,\n\n // Passwords\n /password[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n /passwd[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n /pwd[=:]\\s*[\"']?[^\"'\\s]+[\"']?/gi,\n\n // Connection strings\n /mongodb(\\+srv)?:\\/\\/[^@]+@[^\\s]+/g,\n /postgres(ql)?:\\/\\/[^@]+@[^\\s]+/g,\n /mysql:\\/\\/[^@]+@[^\\s]+/g,\n\n // Email addresses (PII)\n /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/g,\n\n // Note: Generic long alphanumeric pattern removed to avoid false positives\n // (would match file hashes, UUIDs, legitimate data)\n // Credit card numbers removed - too many false positives\n];\n\n/**\n * Redact secrets from a string\n */\nexport function redactSecretsFromString(\n str: string,\n patterns: RegExp[] = DEFAULT_SECRET_PATTERNS\n): string {\n let result = str;\n\n for (const pattern of patterns) {\n result = result.replace(pattern, '[REDACTED]');\n }\n\n return result;\n}\n\n/**\n * Redact file paths (replace absolute paths with relative)\n */\nexport function redactPaths(\n str: string,\n replacements: Record<string, string>\n): string {\n let result = str;\n\n // Apply custom replacements\n for (const [absolute, relative] of Object.entries(replacements)) {\n result = result.replace(new RegExp(absolute.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'), relative);\n }\n\n return result;\n}\n\n/**\n * Redact secrets from unknown value (recursive shallow clone)\n *\n * Only clones objects/arrays that contain secrets.\n * Primitives and clean objects are returned as-is (no clone).\n */\nexport function redactValue(\n value: unknown,\n config: TraceConfig['privacy'],\n depth = 0\n): unknown {\n // Prevent infinite recursion\n if (depth > 10) {\n return '[REDACTED:TOO_DEEP]';\n }\n\n // Primitives\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n let result = value;\n\n if (config.redactSecrets) {\n const patterns = config.secretPatterns.map(p => new RegExp(p, 'g'));\n result = redactSecretsFromString(result, [...DEFAULT_SECRET_PATTERNS, ...patterns]);\n }\n\n if (config.redactPaths) {\n result = redactPaths(result, config.pathReplacements);\n }\n\n // Return original if nothing changed (no clone)\n return result === value ? value : result;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n // Arrays - shallow clone only if contains secrets\n if (Array.isArray(value)) {\n let changed = false;\n const result = value.map((item) => {\n const redacted = redactValue(item, config, depth + 1);\n if (redacted !== item) {\n changed = true;\n }\n return redacted;\n });\n\n // Return original if nothing changed (no clone)\n return changed ? result : value;\n }\n\n // Objects - shallow clone only if contains secrets\n if (typeof value === 'object') {\n let changed = false;\n const result: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n const redacted = redactValue(val, config, depth + 1);\n result[key] = redacted;\n if (redacted !== val) {\n changed = true;\n }\n }\n\n // Return original if nothing changed (no clone)\n return changed ? result : value;\n }\n\n return value;\n}\n\n/**\n * Redact secrets from a trace event (shallow clone optimization)\n *\n * Only clones parts of the event that need redaction.\n * Returns original event if no redaction needed.\n */\nexport function redactTraceEvent(\n event: DetailedTraceEntry,\n config: TraceConfig['privacy']\n): DetailedTraceEntry {\n // Skip if redaction disabled\n if (!config.redactSecrets && !config.redactPaths) {\n return event;\n }\n\n // Check if event needs redaction\n // Limit string size to prevent ReDoS (Regular Expression Denial of Service)\n const eventStr = JSON.stringify(event);\n const MAX_STRING_SIZE = 100000; // 100KB limit for regex testing\n const testStr = eventStr.length > MAX_STRING_SIZE ? eventStr.substring(0, MAX_STRING_SIZE) : eventStr;\n let needsRedaction = false;\n\n if (config.redactSecrets) {\n const patterns = config.secretPatterns.map(p => new RegExp(p, 'g'));\n needsRedaction = [...DEFAULT_SECRET_PATTERNS, ...patterns].some(p => p.test(testStr));\n }\n\n if (!needsRedaction && config.redactPaths) {\n needsRedaction = Object.keys(config.pathReplacements).some(path => testStr.includes(path));\n }\n\n // Return original if no secrets found (no clone!)\n if (!needsRedaction) {\n return event;\n }\n\n // Shallow clone and redact recursively\n return redactValue(event, config, 0) as DetailedTraceEntry;\n}\n\n/**\n * Create default privacy config\n */\nexport function createDefaultPrivacyConfig(): TraceConfig['privacy'] {\n return {\n redactSecrets: true,\n redactPaths: true,\n secretPatterns: [],\n pathReplacements: {\n '/Users': '~',\n '/home': '~',\n 'C:\\\\Users': '~',\n },\n };\n}\n","/**\n * Incremental Trace Writer - NDJSON append-only tracer with crash safety\n *\n * Design principle: reliability > speed.\n * Every event is written synchronously to disk immediately.\n * Even if the agent crashes mid-execution, all events up to the crash are on disk.\n *\n * Features:\n * - NDJSON format (newline-delimited JSON) for append-only writes\n * - Synchronous writes — zero event loss, even on crash\n * - Privacy redaction on trace() call\n * - Auto-cleanup (keep last 30 traces)\n * - Index generation for fast CLI queries\n */\n\nimport { promises as fs, mkdirSync, statSync, readFileSync, appendFileSync } from 'fs';\nimport path from 'path';\nimport type { Tracer } from '@kb-labs/agent-contracts';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\nimport { redactTraceEvent } from './privacy-redactor.js';\n\n/**\n * Trace configuration interface\n */\nexport interface TraceConfig {\n version: string;\n enabled: boolean;\n level: 'minimal' | 'standard' | 'detailed' | 'debug';\n\n incremental: {\n enabled: boolean;\n flushIntervalMs: number; // Default: 100ms\n maxBufferSize: number; // Default: 10 events\n format: 'ndjson';\n };\n\n capture: {\n prompts: boolean;\n toolOutputs: boolean;\n memorySnapshots: boolean;\n decisions: boolean;\n };\n\n retention: {\n maxTraces: number; // Default: 30\n maxDays: number; // Default: 30\n cleanupOnFinalize: boolean; // Default: true\n archiveOlderThan: number; // Days, default: 7\n compressArchived: boolean; // Default: true\n };\n\n privacy: {\n redactSecrets: boolean; // Default: true\n redactPaths: boolean; // Default: true\n secretPatterns: string[]; // Regex patterns\n pathReplacements: Record<string, string>;\n };\n\n storage: {\n path: string; // Default: \".kb/traces/incremental\"\n indexPath: string; // Default: \".kb/traces/incremental\"\n };\n}\n\n/**\n * Trace index for fast CLI queries\n */\nexport interface TraceIndex {\n version: string;\n taskId: string;\n createdAt: string;\n finalizedAt: string;\n\n summary: {\n totalEvents: number;\n iterations: number;\n status: 'success' | 'failed' | 'incomplete';\n eventCounts: Record<string, number>;\n };\n\n timing: {\n startedAt: string;\n completedAt: string;\n totalDurationMs: number;\n };\n\n cost: {\n totalCost: number;\n currency: 'USD';\n };\n\n errors: number;\n\n /** Two-tier memory statistics (aggregated from memory:* events) */\n memory?: {\n totalFactsAdded: number;\n totalArchiveStores: number;\n summarizationRuns: number;\n avgCompressionRatio: number;\n avgNewFactRate: number;\n finalFactSheetSize: number;\n finalFactSheetTokens: number;\n finalArchiveEntries: number;\n finalArchiveUniqueFiles: number;\n };\n\n iterations: Array<{\n iteration: number;\n eventCount: number;\n llmCalls: number;\n toolCalls: number;\n }>;\n}\n\n/**\n * Default trace configuration\n */\nexport const DEFAULT_TRACE_CONFIG: TraceConfig = {\n version: '1.0.0',\n enabled: true,\n level: 'detailed',\n\n incremental: {\n enabled: true,\n flushIntervalMs: 100,\n maxBufferSize: 10,\n format: 'ndjson',\n },\n\n capture: {\n prompts: true,\n toolOutputs: true,\n memorySnapshots: true,\n decisions: true,\n },\n\n retention: {\n maxTraces: 30,\n maxDays: 30,\n cleanupOnFinalize: true,\n archiveOlderThan: 7,\n compressArchived: true,\n },\n\n privacy: {\n redactSecrets: true,\n redactPaths: true,\n secretPatterns: [\n 'sk-[a-zA-Z0-9]{20,}', // OpenAI API keys\n 'Bearer\\\\s+[a-zA-Z0-9_-]+', // Bearer tokens\n 'password[\\'\"]?\\\\s*[:=]\\\\s*[\\'\"][^\\'\"]+([\\'\"]})', // Passwords\n 'api[_-]?key[\\'\"]?\\\\s*[:=]\\\\s*[\\'\"][^\\'\"]+[\\'\"]', // Generic API keys\n ],\n pathReplacements: {\n '/Users/': '~/',\n '/home/': '~/',\n '\\\\Users\\\\': '~\\\\',\n },\n },\n\n storage: {\n path: '.kb/traces/incremental',\n indexPath: '.kb/traces/incremental',\n },\n};\n\n/**\n * Incremental Trace Writer - crash-safe NDJSON tracer\n */\nexport class IncrementalTraceWriter implements Tracer {\n private seq: number = 0;\n private filepath: string;\n private indexPath: string;\n private config: TraceConfig;\n private taskId: string;\n private startTime: string;\n\n constructor(\n taskId: string,\n config: Partial<TraceConfig> = {},\n outputDir?: string\n ) {\n this.taskId = taskId;\n this.config = { ...DEFAULT_TRACE_CONFIG, ...config };\n this.startTime = new Date().toISOString();\n\n const dir = outputDir || this.config.storage.path;\n this.filepath = path.join(dir, `${taskId}.ndjson`);\n this.indexPath = path.join(dir, `${taskId}-index.json`);\n\n // Create output directory if not exists\n this.ensureDirectoryExists(dir);\n }\n\n /**\n * Record a trace entry — writes synchronously to disk.\n *\n * Every call = one appendFileSync. No buffering, no async, no lost events.\n * If the agent crashes on iteration 5, you have all events from iterations 1-5.\n */\n trace(entry: any): void {\n try {\n const seq = ++this.seq;\n const timestamp = entry.timestamp || new Date().toISOString();\n\n const fullEntry: DetailedTraceEntry = {\n ...entry,\n seq,\n timestamp,\n };\n\n const redacted = this.redact(fullEntry);\n\n // Sync write — event is on disk before trace() returns\n appendFileSync(this.filepath, JSON.stringify(redacted) + '\\n', 'utf-8');\n } catch (error) {\n console.error('[IncrementalTraceWriter] trace() error:', error);\n // Don't crash agent - tracing failure should not stop execution\n }\n }\n\n /**\n * Get all trace entries (reads from NDJSON file to avoid memory leak)\n * Returns TraceEntry[] for backward compatibility, but actual format is DetailedTraceEntry[]\n */\n getEntries(): any[] {\n try {\n const content = readFileSync(this.filepath, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n return lines.map((line: string) => JSON.parse(line));\n } catch {\n // File doesn't exist yet or is empty\n return [];\n }\n }\n\n /**\n * Save trace to file (backward compat — no-op, already written synchronously)\n */\n async save(_filePath: string): Promise<void> {\n // No-op — all events are already on disk\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.seq = 0;\n }\n\n /**\n * Finalize trace (generate index, cleanup old traces)\n */\n async finalize(): Promise<void> {\n try {\n // Generate index\n await this.createIndex();\n\n // Cleanup old traces\n if (this.config.retention.cleanupOnFinalize) {\n await this.cleanupOldTraces();\n }\n } catch (error) {\n console.error('[IncrementalTraceWriter] finalize() error:', error);\n }\n }\n\n /**\n * Create index file for fast CLI queries\n */\n async createIndex(): Promise<void> {\n try {\n const entries = this.getEntries();\n\n if (entries.length === 0) {\n console.warn('[IncrementalTraceWriter] No entries to index');\n return;\n }\n\n // Calculate summary statistics\n const stats = this.calculateIndexStatistics(entries);\n\n // Build index\n const index: TraceIndex = {\n version: '1.0.0',\n taskId: this.taskId,\n createdAt: this.startTime,\n finalizedAt: new Date().toISOString(),\n\n summary: {\n totalEvents: entries.length,\n iterations: stats.iterations.size,\n status: stats.errors > 0 ? 'failed' : 'success',\n eventCounts: stats.eventCounts,\n },\n\n timing: {\n startedAt: this.startTime,\n completedAt: new Date().toISOString(),\n totalDurationMs: Date.now() - new Date(this.startTime).getTime(),\n },\n\n cost: {\n totalCost: stats.totalCost,\n currency: 'USD',\n },\n\n errors: stats.errors,\n\n memory: stats.memory,\n\n iterations: Array.from(stats.iterations.entries())\n .map(([iteration, iterStats]) => ({ iteration, ...iterStats }))\n .sort((a, b) => a.iteration - b.iteration),\n };\n\n // Ensure index directory exists\n const indexDir = path.dirname(this.indexPath);\n this.ensureDirectoryExists(indexDir);\n\n // Write index file\n await fs.writeFile(this.indexPath, JSON.stringify(index, null, 2), 'utf-8');\n } catch (error) {\n console.error('[IncrementalTraceWriter] createIndex() error:', error);\n // Continue - CLI commands will work but slower (read full NDJSON)\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private Methods\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Cleanup old traces (keep last N traces)\n */\n private async cleanupOldTraces(): Promise<void> {\n try {\n const dir = path.dirname(this.filepath);\n const files = await fs.readdir(dir);\n\n // Filter .ndjson files\n const traceFiles = files.filter((f) => f.endsWith('.ndjson'));\n\n // If <= maxTraces, nothing to clean\n if (traceFiles.length <= this.config.retention.maxTraces) {\n return;\n }\n\n // Get file stats and sort by mtime (newest first)\n const filesWithStats = await Promise.all(\n traceFiles.map(async (file) => {\n const filepath = path.join(dir, file);\n const stats = await fs.stat(filepath);\n return { file, mtime: stats.mtime.getTime(), filepath };\n })\n );\n\n filesWithStats.sort((a, b) => b.mtime - a.mtime);\n\n // Delete oldest traces\n const toDelete = filesWithStats.slice(this.config.retention.maxTraces);\n\n // Delete files in parallel for better performance\n await Promise.allSettled(\n toDelete.map(async ({ file, filepath }) => {\n try {\n // Delete NDJSON file\n await fs.unlink(filepath);\n\n // Delete index file\n const indexFile = filepath.replace('.ndjson', '-index.json');\n try {\n await fs.unlink(indexFile);\n } catch {\n // Index might not exist, ignore\n }\n } catch (error) {\n console.error(`[IncrementalTraceWriter] Failed to delete ${file}:`, error);\n }\n })\n );\n\n if (toDelete.length > 0) {\n console.log(\n `[IncrementalTraceWriter] Cleaned up ${toDelete.length} old traces (kept last ${this.config.retention.maxTraces})`\n );\n }\n } catch (error) {\n console.error('[IncrementalTraceWriter] cleanupOldTraces() error:', error);\n // Continue - disk space grows but agent works\n }\n }\n\n /**\n * Redact sensitive data from entry using optimized privacy-redactor\n *\n * Uses shallow clone optimization - only clones objects that need redaction,\n * not the entire trace event tree. Returns original if no secrets found.\n */\n private redact(entry: DetailedTraceEntry): DetailedTraceEntry {\n if (!this.config.privacy.redactSecrets && !this.config.privacy.redactPaths) {\n return entry;\n }\n\n try {\n return redactTraceEvent(entry, this.config.privacy);\n } catch (error) {\n console.warn('[IncrementalTraceWriter] redact() error:', error);\n return entry; // Return un-redacted (privacy risk, but better than crash)\n }\n }\n\n /**\n * Calculate index statistics from trace entries\n */\n private calculateIndexStatistics(entries: any[]): {\n eventCounts: Record<string, number>;\n iterations: Map<number, { eventCount: number; llmCalls: number; toolCalls: number }>;\n totalCost: number;\n errors: number;\n memory?: {\n totalFactsAdded: number;\n totalArchiveStores: number;\n summarizationRuns: number;\n avgCompressionRatio: number;\n avgNewFactRate: number;\n finalFactSheetSize: number;\n finalFactSheetTokens: number;\n finalArchiveEntries: number;\n finalArchiveUniqueFiles: number;\n };\n } {\n const eventCounts: Record<string, number> = {};\n const iterations = new Map<number, { eventCount: number; llmCalls: number; toolCalls: number }>();\n let totalCost = 0;\n let errors = 0;\n\n // Memory stats accumulators\n let totalFactsAdded = 0;\n let totalArchiveStores = 0;\n let summarizationRuns = 0;\n let compressionRatioSum = 0;\n let newFactRateSum = 0;\n let lastFactSheetSize = 0;\n let lastFactSheetTokens = 0;\n let lastArchiveEntries = 0;\n let lastArchiveUniqueFiles = 0;\n\n for (const entry of entries) {\n // Count by type\n eventCounts[entry.type] = (eventCounts[entry.type] || 0) + 1;\n\n // Count by iteration\n if (entry.iteration !== undefined) {\n if (!iterations.has(entry.iteration)) {\n iterations.set(entry.iteration, { eventCount: 0, llmCalls: 0, toolCalls: 0 });\n }\n const iter = iterations.get(entry.iteration)!;\n iter.eventCount++;\n\n if (entry.type === 'llm:end') {\n iter.llmCalls++;\n if ('cost' in entry && entry.cost) {\n totalCost += entry.cost.totalCost || 0;\n }\n }\n\n if (entry.type === 'tool:end') {\n iter.toolCalls++;\n }\n }\n\n // Count errors\n if (entry.type === 'error:captured') {\n errors++;\n }\n\n // Aggregate memory events\n if (entry.type === 'memory:fact_added') {\n totalFactsAdded++;\n if (entry.factSheetStats) {\n lastFactSheetSize = entry.factSheetStats.totalFacts || 0;\n lastFactSheetTokens = entry.factSheetStats.estimatedTokens || 0;\n }\n }\n\n if (entry.type === 'memory:archive_store') {\n totalArchiveStores++;\n if (entry.archiveStats) {\n lastArchiveEntries = entry.archiveStats.totalEntries || 0;\n lastArchiveUniqueFiles = entry.archiveStats.uniqueFiles || 0;\n }\n }\n\n if (entry.type === 'memory:summarization_result') {\n summarizationRuns++;\n if (entry.efficiency) {\n compressionRatioSum += entry.efficiency.compressionRatio || 0;\n newFactRateSum += entry.efficiency.newFactRate || 0;\n }\n }\n }\n\n const hasMemoryEvents = totalFactsAdded > 0 || totalArchiveStores > 0 || summarizationRuns > 0;\n\n return {\n eventCounts,\n iterations,\n totalCost,\n errors,\n memory: hasMemoryEvents\n ? {\n totalFactsAdded,\n totalArchiveStores,\n summarizationRuns,\n avgCompressionRatio: summarizationRuns > 0 ? compressionRatioSum / summarizationRuns : 0,\n avgNewFactRate: summarizationRuns > 0 ? newFactRateSum / summarizationRuns : 0,\n finalFactSheetSize: lastFactSheetSize,\n finalFactSheetTokens: lastFactSheetTokens,\n finalArchiveEntries: lastArchiveEntries,\n finalArchiveUniqueFiles: lastArchiveUniqueFiles,\n }\n : undefined,\n };\n }\n\n /**\n * Ensure directory exists\n */\n private ensureDirectoryExists(dir: string): void {\n try {\n mkdirSync(dir, { recursive: true });\n } catch (error) {\n // Check if directory already exists\n try {\n const stats = statSync(dir);\n if (!stats.isDirectory()) {\n throw new Error(`Path exists but is not a directory: ${dir}`);\n }\n // Directory exists - all good\n } catch {\n // Directory doesn't exist and couldn't be created\n throw new Error(`Failed to create trace directory: ${dir}. Error: ${error}`);\n }\n }\n }\n}\n","/**\n * File-based tracer that saves execution traces to JSON files\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Tracer, TraceEntry, DetailedTraceEntry } from '@kb-labs/agent-contracts';\ntype AnyEntry = Omit<DetailedTraceEntry, 'seq' | 'timestamp'>;\n\n/**\n * File tracer implementation\n */\nexport class FileTracer implements Tracer {\n private entries: AnyEntry[] = [];\n private taskId: string;\n private sessionId?: string;\n\n constructor(taskId: string, sessionId?: string) {\n this.taskId = taskId;\n this.sessionId = sessionId;\n }\n\n /**\n * Record a trace entry\n */\n trace(entry: AnyEntry): void {\n this.entries.push(entry);\n }\n\n /**\n * Get all trace entries\n */\n getEntries(): TraceEntry[] {\n return this.entries as unknown as TraceEntry[];\n }\n\n /**\n * Save trace to file\n */\n async save(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n\n // Ensure directory exists\n await fs.mkdir(dir, { recursive: true });\n\n const traceData = {\n taskId: this.taskId,\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n totalEntries: this.entries.length,\n entries: this.entries,\n };\n\n await fs.writeFile(filePath, JSON.stringify(traceData, null, 2), 'utf-8');\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n this.entries = [];\n }\n\n /**\n * Get trace summary statistics\n */\n getSummary(): {\n totalEntries: number;\n llmCalls: number;\n toolCalls: number;\n totalDuration: number;\n avgLLMDuration: number;\n avgToolDuration: number;\n } {\n const llmCalls = this.entries.filter(e => e.type === 'llm:call');\n const toolCalls = this.entries.filter(e => e.type === 'tool:execution');\n\n const getDuration = (e: AnyEntry): number => {\n if (e.type === 'llm:call' || e.type === 'tool:execution') {\n return (e as { timing?: { durationMs?: number } }).timing?.durationMs ?? 0;\n }\n return 0;\n };\n\n const totalDuration = this.entries.reduce((sum, e) => sum + getDuration(e), 0);\n const llmDuration = llmCalls.reduce((sum, e) => sum + getDuration(e), 0);\n const toolDuration = toolCalls.reduce((sum, e) => sum + getDuration(e), 0);\n\n return {\n totalEntries: this.entries.length,\n llmCalls: llmCalls.length,\n toolCalls: toolCalls.length,\n totalDuration,\n avgLLMDuration: llmCalls.length > 0 ? llmDuration / llmCalls.length : 0,\n avgToolDuration: toolCalls.length > 0 ? toolDuration / toolCalls.length : 0,\n };\n }\n}\n","/**\n * TraceLoader — loads and validates NDJSON trace files for CLI commands.\n *\n * Centralizes the logic duplicated across all trace commands:\n * - taskId format validation (prevent path traversal)\n * - file existence check\n * - file size guard (prevent memory exhaustion)\n * - NDJSON parsing with graceful line-error handling\n */\n\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport type { DetailedTraceEntry } from '@kb-labs/agent-contracts';\n\nexport const TRACE_DIR_RELATIVE = path.join('.kb', 'traces', 'incremental');\nconst TASK_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;\nconst MAX_FILE_SIZE_BYTES = 100 * 1024 * 1024; // 100 MB\n\nexport type TraceLoadError =\n | { kind: 'invalid_task_id'; message: string }\n | { kind: 'not_found'; taskId: string }\n | { kind: 'too_large'; sizeBytes: number }\n | { kind: 'empty'; taskId: string }\n | { kind: 'io_error'; message: string };\n\nexport type TraceLoadResult =\n | { ok: true; events: DetailedTraceEntry[]; taskId: string; filePath: string }\n | { ok: false; error: TraceLoadError };\n\n/**\n * Load and parse a trace file by taskId.\n *\n * @param taskId - The task ID (validated against alphanumeric + hyphens/underscores)\n * @param workingDir - Base directory to resolve `.kb/traces/incremental/` from (default: process.cwd())\n */\nexport async function loadTrace(\n taskId: string | undefined,\n workingDir: string = process.cwd()\n): Promise<TraceLoadResult> {\n // 1. Presence check\n if (!taskId) {\n return { ok: false, error: { kind: 'invalid_task_id', message: 'Missing required --task-id' } };\n }\n\n // 2. Format validation — prevents path traversal by construction\n if (!TASK_ID_PATTERN.test(taskId)) {\n return {\n ok: false,\n error: {\n kind: 'invalid_task_id',\n message: 'Task ID must contain only alphanumeric characters, hyphens, and underscores',\n },\n };\n }\n\n const traceDir = path.join(workingDir, TRACE_DIR_RELATIVE);\n const filePath = path.join(traceDir, `${taskId}.ndjson`);\n\n // 3. Redundant path traversal check (defence-in-depth)\n const resolvedFile = path.resolve(filePath);\n const resolvedDir = path.resolve(traceDir);\n if (!resolvedFile.startsWith(resolvedDir + path.sep) && resolvedFile !== resolvedDir) {\n return { ok: false, error: { kind: 'invalid_task_id', message: 'Path traversal detected' } };\n }\n\n // 4. Existence + size check\n let stat: Awaited<ReturnType<typeof fs.stat>>;\n try {\n stat = await fs.stat(filePath);\n } catch {\n return { ok: false, error: { kind: 'not_found', taskId } };\n }\n\n if (stat.size > MAX_FILE_SIZE_BYTES) {\n return { ok: false, error: { kind: 'too_large', sizeBytes: stat.size } };\n }\n\n // 5. Read + parse NDJSON — skip malformed lines gracefully\n let content: string;\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (e) {\n return { ok: false, error: { kind: 'io_error', message: (e as Error).message } };\n }\n\n const events: DetailedTraceEntry[] = [];\n for (const line of content.split('\\n')) {\n if (!line.trim()) { continue; }\n try {\n events.push(JSON.parse(line) as DetailedTraceEntry);\n } catch {\n // Malformed line — skip silently (agent may have crashed mid-write)\n }\n }\n\n if (events.length === 0) {\n return { ok: false, error: { kind: 'empty', taskId } };\n }\n\n return { ok: true, events, taskId, filePath };\n}\n\n/**\n * Format a TraceLoadError into a human-readable string for CLI output.\n */\nexport function formatTraceLoadError(error: TraceLoadError): string {\n switch (error.kind) {\n case 'invalid_task_id': return `Invalid task ID: ${error.message}`;\n case 'not_found': return `Trace not found: ${error.taskId}`;\n case 'too_large': return `Trace file too large: ${Math.round(error.sizeBytes / 1024 / 1024)} MB (limit 100 MB)`;\n case 'empty': return `Trace file is empty: ${error.taskId}`;\n case 'io_error': return `IO error reading trace: ${error.message}`;\n }\n}\n","/**\n * Helper functions for creating detailed trace events\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-imports */\n/* eslint-disable sonarjs/no-duplicate-string */\n// Using import() in return types to avoid circular dependencies\n// Dynamic import syntax required for type-only imports in signatures\n\nimport type {\n IterationDetailEvent,\n LLMCallEvent,\n ToolExecutionEvent,\n MemorySnapshotEvent,\n DecisionPointEvent,\n SynthesisForcedTraceEvent,\n ErrorCapturedEvent,\n FactAddedEvent,\n ArchiveStoreEvent,\n SummarizationResultEvent,\n SummarizationLLMCallEvent,\n} from '@kb-labs/agent-contracts';\nimport type { LLMMessage, LLMToolCall, LLMToolCallResponse } from '@kb-labs/sdk';\n\n/**\n * Create iteration:detail event\n */\nexport function createIterationDetailEvent(params: {\n iteration: number;\n maxIterations: number;\n mode: 'instant' | 'auto' | 'thinking';\n temperature: number;\n availableTools: string[];\n messages: LLMMessage[];\n totalTokens: number;\n}): Omit<IterationDetailEvent, 'seq' | 'timestamp'> {\n return {\n type: 'iteration:detail',\n iteration: params.iteration,\n config: {\n maxIterations: params.maxIterations,\n mode: params.mode,\n temperature: params.temperature,\n },\n availableTools: {\n total: params.availableTools.length,\n tools: params.availableTools,\n },\n context: {\n messagesCount: params.messages.length,\n totalTokens: params.totalTokens,\n conversationSummary: params.messages\n .slice(-2)\n .map((m) => `${m.role}: ${m.content?.substring(0, 100) || ''}`)\n .join(' | '),\n },\n };\n}\n\n/**\n * Create llm:call event\n */\nexport function createLLMCallEvent(params: {\n iteration: number;\n model: string;\n temperature: number;\n maxTokens: number;\n tools: string[];\n response: LLMToolCallResponse;\n startTime: number;\n endTime: number;\n}): Omit<LLMCallEvent, 'seq' | 'timestamp'> {\n const durationMs = params.endTime - params.startTime;\n\n // Calculate cost (simple estimation - can be improved with actual pricing)\n const inputCost = (params.response.usage?.promptTokens || 0) * 0.000003; // $3 per 1M tokens\n const outputCost = (params.response.usage?.completionTokens || 0) * 0.000015; // $15 per 1M tokens\n\n return {\n type: 'llm:call',\n iteration: params.iteration,\n request: {\n model: params.model,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n tools: params.tools,\n },\n response: {\n content: params.response.content || null,\n toolCalls: params.response.toolCalls?.map((tc: LLMToolCall) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n })),\n stopReason: params.response.toolCalls && params.response.toolCalls.length > 0 ? 'tool_use' : 'end_turn',\n usage: {\n inputTokens: params.response.usage.promptTokens,\n outputTokens: params.response.usage.completionTokens,\n totalTokens: params.response.usage.promptTokens + params.response.usage.completionTokens,\n },\n },\n timing: {\n startedAt: new Date(params.startTime).toISOString(),\n completedAt: new Date(params.endTime).toISOString(),\n durationMs,\n },\n cost: {\n inputCost,\n outputCost,\n totalCost: inputCost + outputCost,\n currency: 'USD',\n },\n };\n}\n\n/**\n * Create tool:execution event\n */\nexport function createToolExecutionEvent(params: {\n iteration: number;\n toolName: string;\n callId: string;\n input: unknown;\n output: {\n success: boolean;\n result?: unknown;\n error?: {\n message: string;\n code?: string;\n stack?: string;\n };\n };\n startTime: number;\n endTime: number;\n metadata?: Record<string, unknown>;\n}): Omit<ToolExecutionEvent, 'seq' | 'timestamp'> {\n const durationMs = params.endTime - params.startTime;\n\n // Record full output for tracing (up to 50KB), with truncation flag\n const resultStr = typeof params.output.result === 'string'\n ? params.output.result\n : JSON.stringify(params.output.result || '');\n const TRACE_OUTPUT_LIMIT = 50000; // 50KB — generous for debugging\n const truncated = resultStr.length > TRACE_OUTPUT_LIMIT;\n\n return {\n type: 'tool:execution',\n iteration: params.iteration,\n tool: {\n name: params.toolName,\n callId: params.callId,\n },\n input: params.input,\n output: {\n success: params.output.success,\n result: truncated ? resultStr.substring(0, TRACE_OUTPUT_LIMIT) + `\\n... (truncated from ${resultStr.length} chars)` : params.output.result,\n error: params.output.error,\n truncated,\n originalLength: resultStr.length,\n },\n timing: {\n startedAt: new Date(params.startTime).toISOString(),\n completedAt: new Date(params.endTime).toISOString(),\n durationMs,\n },\n metadata: params.metadata,\n };\n}\n\n/**\n * Create memory:snapshot event\n */\nexport function createMemorySnapshotEvent(params: {\n iteration: number;\n conversationHistory: number;\n userPreferences: Record<string, unknown>;\n facts: string[];\n findings: string[];\n filesRead: string[];\n searchesMade: number;\n toolsUsed: Record<string, number>;\n}): Omit<MemorySnapshotEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:snapshot',\n iteration: params.iteration,\n sessionMemory: {\n conversationHistory: params.conversationHistory,\n userPreferences: params.userPreferences,\n },\n sharedMemory: {\n facts: params.facts,\n findings: params.findings,\n },\n executionMemory: {\n filesRead: params.filesRead,\n searchesMade: params.searchesMade,\n toolsUsed: params.toolsUsed,\n },\n };\n}\n\n/**\n * Create decision:point event\n */\nexport function createDecisionPointEvent(params: {\n iteration: number;\n decision: 'tool_selection' | 'stopping_condition' | 'synthesis';\n toolSelection?: {\n chosenTool: string;\n reasoning: string;\n alternatives: Array<{ tool: string; reason: string }>;\n };\n stoppingCondition?: {\n shouldStop: boolean;\n reason: string;\n };\n}): Omit<DecisionPointEvent, 'seq' | 'timestamp'> {\n return {\n type: 'decision:point',\n iteration: params.iteration,\n decision: params.decision,\n toolSelection: params.toolSelection,\n stoppingCondition: params.stoppingCondition,\n };\n}\n\n/**\n * Create synthesis:forced event\n */\nexport function createSynthesisForcedEvent(params: {\n iteration: number;\n reason: 'last_iteration' | 'max_iterations' | 'no_tool_call' | 'user_request';\n lastIteration: number;\n lastToolCall?: string;\n synthesisPrompt: string;\n synthesisResponse: {\n content: string;\n tokens: number;\n durationMs: number;\n };\n}): Omit<SynthesisForcedTraceEvent, 'seq' | 'timestamp'> {\n return {\n type: 'synthesis:forced',\n iteration: params.iteration,\n trigger: {\n reason: params.reason,\n lastIteration: params.lastIteration,\n lastToolCall: params.lastToolCall,\n },\n synthesisPrompt: params.synthesisPrompt,\n synthesisResponse: params.synthesisResponse,\n };\n}\n\n/**\n * Create error:captured event\n */\nexport function createErrorCapturedEvent(params: {\n iteration: number;\n error: Error;\n lastLLMCall?: {\n request: unknown;\n response: unknown;\n durationMs: number;\n };\n lastToolCall?: {\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n };\n currentMessages: LLMMessage[];\n memoryState: {\n filesRead: string[];\n searchesMade: number;\n };\n availableTools: string[];\n agentStack: {\n currentPhase?: string;\n currentStep?: string;\n iterationHistory: number[];\n };\n}): Omit<ErrorCapturedEvent, 'seq' | 'timestamp'> {\n return {\n type: 'error:captured',\n iteration: params.iteration,\n error: {\n message: params.error.message,\n stack: params.error.stack || '',\n code: (params.error as unknown as { code?: string }).code,\n name: params.error.name,\n },\n context: {\n lastLLMCall: params.lastLLMCall,\n lastToolCall: params.lastToolCall,\n currentMessages: params.currentMessages.slice(-5).map((m) => ({\n role: (m.role === 'tool' ? 'assistant' : m.role) as 'system' | 'user' | 'assistant',\n contentPreview: m.content?.substring(0, 100) || '',\n })),\n memoryState: params.memoryState,\n availableTools: params.availableTools,\n },\n agentStack: params.agentStack,\n };\n}\n\n/**\n * Create prompt:diff event\n */\nexport function createPromptDiffEvent(params: {\n iteration: number;\n messagesAdded: number;\n messagesRemoved: number;\n totalMessages: number;\n changes: Array<{\n type: 'added' | 'removed' | 'modified';\n role: 'system' | 'user' | 'assistant';\n contentPreview: string;\n index: number;\n }>;\n tokensBefore: number;\n tokensAfter: number;\n}): Omit<import('@kb-labs/agent-contracts').PromptDiffEvent, 'seq' | 'timestamp'> {\n return {\n type: 'prompt:diff',\n iteration: params.iteration,\n diff: {\n messagesAdded: params.messagesAdded,\n messagesRemoved: params.messagesRemoved,\n totalMessages: params.totalMessages,\n changes: params.changes,\n contextGrowth: {\n tokensBefore: params.tokensBefore,\n tokensAfter: params.tokensAfter,\n delta: params.tokensAfter - params.tokensBefore,\n },\n },\n };\n}\n\n/**\n * Create tool:filter event\n */\nexport function createToolFilterEvent(params: {\n iteration: number;\n beforeTools: string[];\n afterTools: string[];\n filtered: Array<{\n name: string;\n reason: 'last_iteration' | 'mode_restriction' | 'tier_restriction' | 'custom';\n explanation: string;\n }>;\n}): Omit<import('@kb-labs/agent-contracts').ToolFilterEvent, 'seq' | 'timestamp'> {\n return {\n type: 'tool:filter',\n iteration: params.iteration,\n filtering: {\n before: {\n totalTools: params.beforeTools.length,\n tools: params.beforeTools,\n },\n after: {\n totalTools: params.afterTools.length,\n tools: params.afterTools,\n },\n filtered: params.filtered,\n },\n };\n}\n\n/**\n * Create context:trim event\n */\nexport function createContextTrimEvent(params: {\n iteration: number;\n trigger: 'max_tokens' | 'max_messages' | 'manual';\n messageCountBefore: number;\n messageCountAfter: number;\n tokensBefore: number;\n tokensAfter: number;\n messagesRemoved: number;\n tokensRemoved: number;\n contentPreview: string;\n strategy: 'sliding_window' | 'summarization' | 'importance_based';\n}): Omit<import('@kb-labs/agent-contracts').ContextTrimEvent, 'seq' | 'timestamp'> {\n return {\n type: 'context:trim',\n iteration: params.iteration,\n trimming: {\n trigger: params.trigger,\n before: {\n messageCount: params.messageCountBefore,\n estimatedTokens: params.tokensBefore,\n },\n after: {\n messageCount: params.messageCountAfter,\n estimatedTokens: params.tokensAfter,\n },\n removed: {\n messageCount: params.messagesRemoved,\n tokensRemoved: params.tokensRemoved,\n contentPreview: params.contentPreview,\n },\n strategy: params.strategy,\n },\n };\n}\n\n/**\n * Create stopping:analysis event\n */\nexport function createStoppingAnalysisEvent(params: {\n iteration: number;\n conditions: {\n maxIterationsReached: boolean;\n timeoutReached: boolean;\n foundTarget: boolean;\n sufficientContext: boolean;\n diminishingReturns: boolean;\n userInterrupt: boolean;\n error: boolean;\n };\n reasoning: string;\n iterationsUsed: number;\n iterationsRemaining: number;\n timeElapsedMs: number;\n timeRemainingMs?: number;\n toolCallsInLast3Iterations: number;\n confidenceScore?: number;\n}): Omit<import('@kb-labs/agent-contracts').StoppingAnalysisEvent, 'seq' | 'timestamp'> {\n return {\n type: 'stopping:analysis',\n iteration: params.iteration,\n conditions: params.conditions,\n reasoning: params.reasoning,\n metrics: {\n iterationsUsed: params.iterationsUsed,\n iterationsRemaining: params.iterationsRemaining,\n timeElapsedMs: params.timeElapsedMs,\n timeRemainingMs: params.timeRemainingMs,\n toolCallsInLast3Iterations: params.toolCallsInLast3Iterations,\n confidenceScore: params.confidenceScore,\n },\n };\n}\n\n/**\n * Create llm:validation event\n */\nexport function createLLMValidationEvent(params: {\n iteration: number;\n stopReason: 'tool_use' | 'end_turn' | 'max_tokens' | 'stop_sequence';\n isValid: boolean;\n hasContent: boolean;\n hasToolCalls: boolean;\n toolCallsValid: boolean;\n jsonParseable: boolean;\n schemaValid: boolean;\n issues: Array<{\n severity: 'error' | 'warning' | 'info';\n check: string;\n message: string;\n recovery?: string;\n }>;\n}): Omit<import('@kb-labs/agent-contracts').LLMValidationEvent, 'seq' | 'timestamp'> {\n return {\n type: 'llm:validation',\n iteration: params.iteration,\n validation: {\n stopReason: params.stopReason,\n isValid: params.isValid,\n checks: {\n hasContent: params.hasContent,\n hasToolCalls: params.hasToolCalls,\n toolCallsValid: params.toolCallsValid,\n jsonParseable: params.jsonParseable,\n schemaValid: params.schemaValid,\n },\n issues: params.issues,\n },\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════\n// Two-Tier Memory Events\n// ═══════════════════════════════════════════════════════════════════════\n\n/**\n * Create memory:fact_added event\n */\nexport function createFactAddedEvent(params: {\n iteration: number;\n fact: {\n id: string;\n category: string;\n fact: string;\n confidence: number;\n source: string;\n merged: boolean;\n superseded?: string;\n };\n factSheetStats: {\n totalFacts: number;\n estimatedTokens: number;\n byCategory: Record<string, number>;\n };\n}): Omit<FactAddedEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:fact_added',\n iteration: params.iteration,\n fact: params.fact,\n factSheetStats: params.factSheetStats,\n };\n}\n\n/**\n * Create memory:archive_store event\n */\nexport function createArchiveStoreEvent(params: {\n iteration: number;\n entry: {\n id: string;\n toolName: string;\n filePath?: string;\n outputLength: number;\n estimatedTokens: number;\n keyFactsExtracted: number;\n };\n archiveStats: {\n totalEntries: number;\n totalChars: number;\n uniqueFiles: number;\n evicted: number;\n };\n}): Omit<ArchiveStoreEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:archive_store',\n iteration: params.iteration,\n entry: params.entry,\n archiveStats: params.archiveStats,\n };\n}\n\n/**\n * Create memory:summarization_llm_call event.\n * Records the raw LLM interaction for fact extraction debugging.\n */\nexport function createSummarizationLLMCallEvent(params: {\n iteration: number;\n prompt: string;\n rawResponse: string;\n parseSuccess: boolean;\n parseError?: string;\n durationMs: number;\n outputTokens: number;\n}): Omit<SummarizationLLMCallEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:summarization_llm_call',\n iteration: params.iteration,\n prompt: params.prompt,\n rawResponse: params.rawResponse,\n parseSuccess: params.parseSuccess,\n parseError: params.parseError,\n timing: {\n durationMs: params.durationMs,\n outputTokens: params.outputTokens,\n },\n };\n}\n\n/**\n * Create memory:summarization_result event\n */\nexport function createSummarizationResultEvent(params: {\n iteration: number;\n input: {\n iterationRange: [number, number];\n messagesCount: number;\n inputChars: number;\n inputTokens: number;\n };\n output: {\n factsExtracted: number;\n factsByCategory: Record<string, number>;\n outputTokens: number;\n llmDurationMs: number;\n };\n delta: {\n factSheetBefore: number;\n factSheetAfter: number;\n tokensBefore: number;\n tokensAfter: number;\n newFacts: number;\n mergedFacts: number;\n evictedFacts: number;\n };\n efficiency: {\n compressionRatio: number;\n factDensity: number;\n newFactRate: number;\n };\n}): Omit<SummarizationResultEvent, 'seq' | 'timestamp'> {\n return {\n type: 'memory:summarization_result',\n iteration: params.iteration,\n input: params.input,\n output: params.output,\n delta: params.delta,\n efficiency: params.efficiency,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kb-labs/agent-tracing",
3
- "version": "2.15.0",
3
+ "version": "2.16.0",
4
4
  "description": "Tracing infrastructure for KB Labs Agents — NDJSON writer, privacy redaction, trace loading and analysis",
5
5
  "files": [
6
6
  "dist"
@@ -15,8 +15,8 @@
15
15
  }
16
16
  },
17
17
  "dependencies": {
18
- "@kb-labs/agent-contracts": "2.15.0",
19
- "@kb-labs/sdk": "1.6.6"
18
+ "@kb-labs/sdk": "2.16.0",
19
+ "@kb-labs/agent-contracts": "2.16.0"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^24.3.3",
@@ -24,7 +24,7 @@
24
24
  "tsup": "^8.5.0",
25
25
  "typescript": "^5.6.3",
26
26
  "vitest": "^3.2.4",
27
- "@kb-labs/devkit": "2.15.0"
27
+ "@kb-labs/devkit": "2.16.0"
28
28
  },
29
29
  "keywords": [
30
30
  "kb-labs",