diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 028c3d0..ad349cd 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -53,7 +53,7 @@ {"id":"bd-3sh","title":"ALERT: Worker claude-code-glm-5-bravo has no work available","description":"# Worker Starvation Alert\n\nWorker **claude-code-glm-5-bravo** has exhausted all priorities and found zero work.\n\nThis is considered an error state - there should always be more work.\n\n## Worker State\n\n- **Executor:** claude-code-glm-5\n- **Model:** glm-5\n- **Workspace:** /home/coder/FABRIC\n- **Root Boundary:** /home/coder/FABRIC\n- **Last completion:** \n- **Beads completed:** 0\n- **Claim success rate:** %\n- **Uptime:** 14608s (h)\n- **Consecutive empty iterations:** 5\n\n## Priorities Exhausted\n\n1. ✗ Local workspace (bottoms-up): No beads in /home/coder/FABRIC or subfolders\n2. ✗ Parent exploration: No suitable workspaces found\n3. ✓ Maintenance: Completed (cleaned orphaned claims/locks)\n4. ✗ Gap analysis: false - No gaps found or created\n5. ✗ HUMAN alternatives: true - No HUMAN beads found to unblock\n\n## Discovered Workspaces\n\nTotal: 1\n\n- /home/coder/FABRIC\n\n## Required Actions\n\n1. Review discovery roots: Are all project folders being scanned?\n2. Check if projects need new features/tasks\n3. Review ROADMAP.md files across projects\n4. Enable gap analysis if disabled: `--enable-gap-analysis`\n5. Enable HUMAN alternatives if disabled\n6. Create manual beads to bootstrap work\n\n---\n*This alert was created automatically by Priority 6*","status":"closed","priority":0,"issue_type":"human","created_at":"2026-03-03T08:27:00.144567748Z","created_by":"coder","updated_at":"2026-03-03T09:04:42.456513465Z","closed_at":"2026-03-03T09:04:42.456310900Z","source_repo":".","compaction_level":0,"original_size":0,"comments":[{"id":6,"issue_id":"bd-3sh","author":"Jed Arden","text":"Alternative analysis: Worker starvation is FALSE POSITIVE. 20 beads available. Use scripts/br-ready-wrapper.sh or .beads/ready-queue.json workaround.","created_at":"2026-03-03T08:37:53Z"},{"id":8,"issue_id":"bd-3sh","author":"Jed Arden","text":"Alternative solutions explored for worker starvation. Root cause: br ready schema bug (created_by column). 22 beads available in ready-queue.json. ALT-006 (bd-9rs) implemented: scripts/br-get-next-bead.sh reads ready-queue.json directly. Workers need fallback logic.","created_at":"2026-03-03T08:40:31Z"},{"id":15,"issue_id":"bd-3sh","author":"Jed Arden","text":"False positive - work available in ready-queue.json (22 beads). Same issue as bd-123.","created_at":"2026-03-03T09:04:42Z"}]} {"id":"bd-3sj","title":"P4-002: File Heatmap","description":"Implement file heatmap visualization - track which files are modified most frequently and by which workers. Helps identify hotspots and potential collision areas.","status":"open","priority":3,"issue_type":"task","created_at":"2026-03-03T11:42:55.763617113Z","created_by":"coder","updated_at":"2026-03-03T11:42:55.763617113Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["intelligence","phase-4","visualization"]} {"id":"bd-3tj","title":"TEST-003: Add TUI component tests","description":"Test Coverage: Add tests for TUI components using blessed testing patterns. Test keyboard input, panel switching, filtering.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-03-03T07:53:40.669404768Z","created_by":"coder","updated_at":"2026-03-03T07:53:40.669404768Z","closed_at":"2026-03-03T07:53:40.669404768Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["testing","tui"]} -{"id":"bd-4jn","title":"P4-004: Smart Error Grouping","description":"Implement smart error grouping - cluster similar errors together to reduce noise and highlight unique issues. Pattern matching on error messages and stack traces.","status":"open","priority":3,"issue_type":"task","created_at":"2026-03-03T11:43:00.067083820Z","created_by":"coder","updated_at":"2026-03-03T11:43:00.067083820Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["error-handling","intelligence","phase-4"]} +{"id":"bd-4jn","title":"P4-004: Smart Error Grouping","description":"Implement smart error grouping - cluster similar errors together to reduce noise and highlight unique issues. Pattern matching on error messages and stack traces.","status":"in_progress","priority":3,"issue_type":"task","assignee":"coder","created_at":"2026-03-03T11:43:00.067083820Z","created_by":"coder","updated_at":"2026-03-03T11:43:51.861144781Z","source_repo":".","compaction_level":0,"original_size":0,"labels":["error-handling","intelligence","phase-4"]} {"id":"bd-5eh","title":"TEST-001: Add comprehensive parser tests","description":"Test Coverage: Add unit tests for edge cases in parser.ts - malformed JSON, partial lines, unicode, very long messages. Target 90% coverage.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-03-03T07:53:40.185664830Z","created_by":"coder","updated_at":"2026-03-03T10:40:00Z","closed_at":"2026-03-03T10:40:00Z","close_reason":"Parser tests complete: 36 tests","source_repo":".","compaction_level":0,"original_size":0,"labels":["parser","testing"]} {"id":"bd-5fh","title":"ALERT: Worker claude-code-glm-5-bravo has no work available","description":"# Worker Starvation Alert\n\nWorker **claude-code-glm-5-bravo** has exhausted all priorities and found zero work.\n\nThis is considered an error state - there should always be more work.\n\n## Worker State\n\n- **Executor:** claude-code-glm-5\n- **Model:** glm-5\n- **Workspace:** /home/coder/FABRIC\n- **Root Boundary:** /home/coder/FABRIC\n- **Last completion:** \n- **Beads completed:** 0\n- **Claim success rate:** %\n- **Uptime:** 18273s (h)\n- **Consecutive empty iterations:** 5\n\n## Priorities Exhausted\n\n1. ✗ Local workspace (bottoms-up): No beads in /home/coder/FABRIC or subfolders\n2. ✗ Parent exploration: No suitable workspaces found\n3. ✓ Maintenance: Completed (cleaned orphaned claims/locks)\n4. ✗ Gap analysis: false - No gaps found or created\n5. ✗ HUMAN alternatives: true - No HUMAN beads found to unblock\n\n## Discovered Workspaces\n\nTotal: 1\n\n- /home/coder/FABRIC\n\n## Required Actions\n\n1. Review discovery roots: Are all project folders being scanned?\n2. Check if projects need new features/tasks\n3. Review ROADMAP.md files across projects\n4. Enable gap analysis if disabled: `--enable-gap-analysis`\n5. Enable HUMAN alternatives if disabled\n6. Create manual beads to bootstrap work\n\n---\n*This alert was created automatically by Priority 6*","status":"closed","priority":0,"issue_type":"human","created_at":"2026-03-03T09:28:06.053300075Z","created_by":"coder","updated_at":"2026-03-03T09:29:55.150572522Z","closed_at":"2026-03-03T09:29:36.921679055Z","source_repo":".","compaction_level":0,"original_size":0,"comments":[{"id":19,"issue_id":"bd-5fh","author":"Jed Arden","text":"FALSE POSITIVE: Work available in ready-queue.json (22 beads)","created_at":"2026-03-03T09:29:55Z"}]} {"id":"bd-6xy","title":"ALERT: Worker claude-code-glm-5-bravo has no work available","description":"# Worker Starvation Alert\n\nWorker **claude-code-glm-5-bravo** has exhausted all priorities and found zero work.\n\nThis is considered an error state - there should always be more work.\n\n## Worker State\n\n- **Executor:** claude-code-glm-5\n- **Model:** glm-5\n- **Workspace:** /home/coder/FABRIC\n- **Root Boundary:** /home/coder/FABRIC\n- **Last completion:** \n- **Beads completed:** 0\n- **Claim success rate:** %\n- **Uptime:** 18748s (h)\n- **Consecutive empty iterations:** 5\n\n## Priorities Exhausted\n\n1. ✗ Local workspace (bottoms-up): No beads in /home/coder/FABRIC or subfolders\n2. ✗ Parent exploration: No suitable workspaces found\n3. ✓ Maintenance: Completed (cleaned orphaned claims/locks)\n4. ✗ Gap analysis: false - No gaps found or created\n5. ✗ HUMAN alternatives: true - No HUMAN beads found to unblock\n\n## Discovered Workspaces\n\nTotal: 1\n\n- /home/coder/FABRIC\n\n## Required Actions\n\n1. Review discovery roots: Are all project folders being scanned?\n2. Check if projects need new features/tasks\n3. Review ROADMAP.md files across projects\n4. Enable gap analysis if disabled: `--enable-gap-analysis`\n5. Enable HUMAN alternatives if disabled\n6. Create manual beads to bootstrap work\n\n---\n*This alert was created automatically by Priority 6*","status":"closed","priority":0,"issue_type":"human","created_at":"2026-03-03T09:36:00.727780827Z","created_by":"coder","updated_at":"2026-03-03T09:37:27.774940828Z","closed_at":"2026-03-03T09:37:27.774712168Z","source_repo":".","compaction_level":0,"original_size":0} diff --git a/src/cli.ts b/src/cli.ts index b3e1be9..f4283cf 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -6,15 +6,18 @@ * fabric tui - Launch terminal UI * fabric web - Launch web dashboard * fabric tail - Raw log tail + * fabric replay - Replay session history */ import { Command } from 'commander'; +import * as blessed from 'blessed'; import { VERSION } from './index.js'; import { LogTailer, tailLogFile } from './tailer.js'; import { formatEvent } from './parser.js'; import { getStore } from './store.js'; import { createTuiApp } from './tui/index.js'; import { createWebServer } from './web/index.js'; +import { SessionReplay } from './tui/components/SessionReplay.js'; const program = new Command(); @@ -211,4 +214,91 @@ program } }); +program + .command('replay') + .description('Replay worker session history chronologically') + .option('-f, --file ', 'Log file to replay', '~/.needle/logs/workers.log') + .option('-w, --worker ', 'Filter by worker ID') + .option('-l, --level ', 'Filter by log level (debug/info/warn/error)') + .option('-s, --speed ', 'Playback speed (0.5/1/2/5/10)', '1') + .option('--auto', 'Start playback automatically') + .action(async (options) => { + const filePath = options.file.replace('~', process.env.HOME || ''); + const speed = parseFloat(options.speed) as 0.5 | 1 | 2 | 5 | 10; + + console.log(`FABRIC Session Replay - Loading: ${filePath}`); + + const validLevels = ['debug', 'info', 'warn', 'error']; + const levelFilter = options.level?.toLowerCase(); + if (levelFilter && !validLevels.includes(levelFilter)) { + console.error(`Invalid level: ${options.level}. Must be one of: ${validLevels.join(', ')}`); + process.exit(1); + } + + try { + // Create blessed screen + const screen = blessed.screen({ + smartCSR: true, + title: 'FABRIC Session Replay', + fullUnicode: true, + }); + + // Create session replay component + const replay = new SessionReplay({ + parent: screen, + top: 0, + left: 0, + width: '100%', + height: '100%', + onEvent: (event, index, total) => { + // Could emit to store if needed + }, + onStateChange: (state) => { + if (state === 'ended') { + // Show ended message + } + }, + }); + + // Set initial speed + if ([0.5, 1, 2, 5, 10].includes(speed)) { + replay.setSpeed(speed); + } + + // Bind global keys + screen.key(['q', 'C-c'], () => { + replay.destroy(); + screen.destroy(); + process.exit(0); + }); + + screen.key(['escape'], () => { + replay.destroy(); + screen.destroy(); + process.exit(0); + }); + + // Build filter + const filter: { worker?: string; level?: string } = {}; + if (options.worker) filter.worker = options.worker; + if (levelFilter) filter.level = levelFilter; + + // Load the log file + await replay.loadFile(filePath, Object.keys(filter).length > 0 ? filter : undefined); + + // Focus and render + replay.focus(); + screen.render(); + + // Auto-start if requested + if (options.auto) { + setTimeout(() => replay.play(), 500); + } + + } catch (err) { + console.error(`Failed to start replay: ${(err as Error).message}`); + process.exit(1); + } + }); + program.parse(); diff --git a/src/errorGrouping.test.ts b/src/errorGrouping.test.ts new file mode 100644 index 0000000..f42def0 --- /dev/null +++ b/src/errorGrouping.test.ts @@ -0,0 +1,435 @@ +/** + * Tests for Error Grouping Module + */ + +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { + categorizeError, + fingerprintError, + fingerprintsMatch, + ErrorGroupManager, + getErrorGroupManager, + resetErrorGroupManager, +} from './errorGrouping.js'; +import { LogEvent, ErrorCategory } from './types.js'; + +describe('categorizeError', () => { + it('should categorize network errors', () => { + expect(categorizeError('ECONNREFUSED')).toBe('network'); + expect(categorizeError('Connection refused to 192.168.1.1:8080')).toBe('network'); + expect(categorizeError('ETIMEDOUT connecting to server')).toBe('network'); + expect(categorizeError('DNS lookup failed')).toBe('network'); + expect(categorizeError('socket hang up')).toBe('network'); + }); + + it('should categorize permission errors', () => { + expect(categorizeError('EACCES: permission denied')).toBe('permission'); + expect(categorizeError('Access denied for user admin')).toBe('permission'); + expect(categorizeError('Unauthorized (401)')).toBe('permission'); + expect(categorizeError('Forbidden: insufficient permissions')).toBe('permission'); + }); + + it('should categorize not found errors', () => { + expect(categorizeError('ENOENT: no such file')).toBe('not_found'); + expect(categorizeError('404 Not Found')).toBe('not_found'); + expect(categorizeError('Resource does not exist')).toBe('not_found'); + }); + + it('should categorize timeout errors', () => { + expect(categorizeError('ETIMEDOUT')).toBe('timeout'); + expect(categorizeError('Request timeout after 30000ms')).toBe('timeout'); + expect(categorizeError('Timeout expired')).toBe('timeout'); + }); + + it('should categorize resource errors', () => { + expect(categorizeError('ENOMEM: out of memory')).toBe('resource'); + expect(categorizeError('Disk full, no space left')).toBe('resource'); + expect(categorizeError('Rate limit exceeded (429)')).toBe('resource'); + expect(categorizeError('Quota exceeded for user')).toBe('resource'); + }); + + it('should categorize validation errors', () => { + expect(categorizeError('Invalid input format')).toBe('validation'); + expect(categorizeError('Cannot read property "x" of undefined')).toBe('validation'); + expect(categorizeError('Expected string but got number')).toBe('validation'); + expect(categorizeError('undefined is not a function')).toBe('validation'); + }); + + it('should categorize syntax errors', () => { + expect(categorizeError('SyntaxError: Unexpected token')).toBe('syntax'); + expect(categorizeError('JSON parse error at line 42')).toBe('syntax'); + expect(categorizeError('YAML parse error')).toBe('syntax'); + expect(categorizeError('invalid format: malformed input')).toBe('syntax'); + }); + + it('should categorize tool errors', () => { + expect(categorizeError('Tool execution failed')).toBe('tool'); + expect(categorizeError('Command failed with exit code 1')).toBe('tool'); + expect(categorizeError('spawn child process error')).toBe('tool'); + }); + + it('should return unknown for unrecognized errors', () => { + expect(categorizeError('Something weird happened')).toBe('unknown'); + expect(categorizeError('Oops')).toBe('unknown'); + }); +}); + +describe('fingerprintError', () => { + const createErrorEvent = (msg: string, error?: string): LogEvent => ({ + ts: Date.now(), + worker: 'w-test', + level: 'error', + msg, + error, + }); + + it('should create consistent fingerprints for similar errors', () => { + const event1 = createErrorEvent('Connection refused', 'ECONNREFUSED 192.168.1.1:8080'); + const event2 = createErrorEvent('Connection refused', 'ECONNREFUSED 10.0.0.1:3000'); + + const fp1 = fingerprintError(event1); + const fp2 = fingerprintError(event2); + + expect(fp1.hash).toBe(fp2.hash); + expect(fp1.category).toBe('network'); + expect(fp2.category).toBe('network'); + }); + + it('should create different fingerprints for different error types', () => { + const event1 = createErrorEvent('Error', 'ECONNREFUSED'); + const event2 = createErrorEvent('Error', 'Permission denied'); + + const fp1 = fingerprintError(event1); + const fp2 = fingerprintError(event2); + + expect(fp1.hash).not.toBe(fp2.hash); + expect(fp1.category).toBe('network'); + expect(fp2.category).toBe('permission'); + }); + + it('should normalize IP addresses', () => { + const event = createErrorEvent('Network error', 'ECONNREFUSED 192.168.1.100:443'); + + const fp = fingerprintError(event); + + // IP addresses should be normalized to wildcards + expect(fp.signature).toMatch(/\*:\*/); + expect(fp.category).toBe('network'); + }); + + it('should normalize file paths', () => { + const event = createErrorEvent('File error', 'ENOENT: no such file "/home/user/data.json"'); + + const fp = fingerprintError(event); + + expect(fp.signature).not.toContain('/home/user/data.json'); + expect(fp.category).toBe('not_found'); + }); + + it('should normalize UUIDs', () => { + const event = createErrorEvent('Error', 'Invalid UUID 123e4567-e89b-12d3-a456-426614174000'); + + const fp = fingerprintError(event); + + expect(fp.signature).not.toContain('123e4567-e89b-12d3-a456-426614174000'); + expect(fp.signature).toContain('*UUID*'); + }); + + it('should use event.msg when event.error is not present', () => { + const event = createErrorEvent('ECONNREFUSED connection failed'); + + const fp = fingerprintError(event); + + expect(fp.sampleMessage).toBe('ECONNREFUSED connection failed'); + expect(fp.category).toBe('network'); + }); + + it('should truncate long signatures', () => { + const longMessage = 'ECONNREFUSED ' + 'x'.repeat(300); + const event = createErrorEvent('Error', longMessage); + + const fp = fingerprintError(event); + + expect(fp.signature.length).toBeLessThanOrEqual(203); // 200 + '...' + }); + + it('should remove stack traces from signature', () => { + const event = createErrorEvent('Error', 'TypeError: Cannot read property "x"\n at Object.foo\n at bar'); + + const fp = fingerprintError(event); + + expect(fp.signature).not.toContain('at Object.foo'); + expect(fp.signature).toContain('TypeError'); + }); +}); + +describe('fingerprintsMatch', () => { + it('should return true for matching fingerprints', () => { + const event: LogEvent = { + ts: Date.now(), + worker: 'w-test', + level: 'error', + msg: 'ECONNREFUSED', + }; + + const fp1 = fingerprintError(event); + const fp2 = fingerprintError(event); + + expect(fingerprintsMatch(fp1, fp2)).toBe(true); + }); + + it('should return false for different fingerprints', () => { + const event1: LogEvent = { + ts: Date.now(), + worker: 'w-test', + level: 'error', + msg: 'ECONNREFUSED', + }; + const event2: LogEvent = { + ts: Date.now(), + worker: 'w-test', + level: 'error', + msg: 'Permission denied', + }; + + const fp1 = fingerprintError(event1); + const fp2 = fingerprintError(event2); + + expect(fingerprintsMatch(fp1, fp2)).toBe(false); + }); +}); + +describe('ErrorGroupManager', () => { + let manager: ErrorGroupManager; + + beforeEach(() => { + manager = new ErrorGroupManager(); + }); + + const createErrorEvent = (msg: string, worker = 'w-test'): LogEvent => ({ + ts: Date.now(), + worker, + level: 'error', + msg, + }); + + describe('addError', () => { + it('should create a new group for first error', () => { + const event = createErrorEvent('ECONNREFUSED'); + const group = manager.addError(event); + + expect(group.count).toBe(1); + expect(group.events).toHaveLength(1); + expect(group.fingerprint.category).toBe('network'); + expect(group.affectedWorkers).toContain('w-test'); + }); + + it('should add to existing group for similar errors', () => { + const event1 = createErrorEvent('ECONNREFUSED 192.168.1.1:8080'); + const event2 = createErrorEvent('ECONNREFUSED 10.0.0.1:3000'); + + const group1 = manager.addError(event1); + const group2 = manager.addError(event2); + + expect(group1.id).toBe(group2.id); + expect(group2.count).toBe(2); + }); + + it('should track multiple workers', () => { + const event1 = createErrorEvent('ECONNREFUSED', 'w-worker1'); + const event2 = createErrorEvent('ECONNREFUSED', 'w-worker2'); + const event3 = createErrorEvent('ECONNREFUSED', 'w-worker1'); + + manager.addError(event1); + manager.addError(event2); + const group = manager.addError(event3); + + expect(group.affectedWorkers).toHaveLength(2); + expect(group.affectedWorkers).toContain('w-worker1'); + expect(group.affectedWorkers).toContain('w-worker2'); + expect(group.count).toBe(3); + }); + + it('should create separate groups for different error types', () => { + const event1 = createErrorEvent('ECONNREFUSED'); + const event2 = createErrorEvent('Permission denied'); + + const group1 = manager.addError(event1); + const group2 = manager.addError(event2); + + expect(group1.id).not.toBe(group2.id); + expect(manager.size).toBe(2); + }); + }); + + describe('getGroups', () => { + it('should return all groups sorted by severity and activity', () => { + // Add multiple errors of different types + for (let i = 0; i < 10; i++) { + manager.addError(createErrorEvent('ECONNREFUSED')); + } + for (let i = 0; i < 5; i++) { + manager.addError(createErrorEvent('Permission denied')); + } + manager.addError(createErrorEvent('Timeout')); + + const groups = manager.getGroups(); + + // First group should be the one with most occurrences (network) + expect(groups[0].count).toBe(10); + expect(groups[0].fingerprint.category).toBe('network'); + }); + }); + + describe('getActiveGroups', () => { + it('should return only active groups', () => { + manager.addError(createErrorEvent('ECONNREFUSED')); + + const activeGroups = manager.getActiveGroups(); + + expect(activeGroups).toHaveLength(1); + }); + + it('should not return inactive groups', () => { + // Create manager with very short active window + const shortManager = new ErrorGroupManager({ activeWindowMs: 1 }); + const event: LogEvent = { + ts: Date.now() - 10000, // 10 seconds ago + worker: 'w-test', + level: 'error', + msg: 'ECONNREFUSED', + }; + + shortManager.addError(event); + const activeGroups = shortManager.getActiveGroups(); + + expect(activeGroups).toHaveLength(0); + }); + }); + + describe('getWorkerGroups', () => { + it('should return groups affecting specific worker', () => { + manager.addError(createErrorEvent('ECONNREFUSED', 'w-worker1')); + manager.addError(createErrorEvent('Permission denied', 'w-worker2')); + + const worker1Groups = manager.getWorkerGroups('w-worker1'); + const worker2Groups = manager.getWorkerGroups('w-worker2'); + + expect(worker1Groups).toHaveLength(1); + expect(worker1Groups[0].fingerprint.category).toBe('network'); + + expect(worker2Groups).toHaveLength(1); + expect(worker2Groups[0].fingerprint.category).toBe('permission'); + }); + }); + + describe('getGroupsByCategory', () => { + it('should return groups by category', () => { + manager.addError(createErrorEvent('ECONNREFUSED connection refused')); + manager.addError(createErrorEvent('Permission denied access error')); + manager.addError(createErrorEvent('File not found')); + + const networkGroups = manager.getGroupsByCategory('network'); + const permissionGroups = manager.getGroupsByCategory('permission'); + const notFoundGroups = manager.getGroupsByCategory('not_found'); + + expect(networkGroups).toHaveLength(1); + expect(permissionGroups).toHaveLength(1); + expect(notFoundGroups).toHaveLength(1); + expect(manager.size).toBe(3); + }); + }); + + describe('getStats', () => { + it('should return correct statistics', () => { + for (let i = 0; i < 5; i++) { + manager.addError(createErrorEvent('ECONNREFUSED')); + } + for (let i = 0; i < 3; i++) { + manager.addError(createErrorEvent('Permission denied')); + } + + const stats = manager.getStats(); + + expect(stats.totalGroups).toBe(2); + expect(stats.totalErrors).toBe(8); + expect(stats.activeGroups).toBe(2); + expect(stats.byCategory.network).toBe(1); + expect(stats.byCategory.permission).toBe(1); + }); + }); + + describe('clear', () => { + it('should clear all groups', () => { + manager.addError(createErrorEvent('ECONNREFUSED')); + manager.addError(createErrorEvent('Permission denied')); + + expect(manager.size).toBe(2); + + manager.clear(); + + expect(manager.size).toBe(0); + }); + }); + + describe('maxGroups option', () => { + it('should trim groups when exceeding maxGroups', () => { + const smallManager = new ErrorGroupManager({ maxGroups: 5 }); + + // Add 10 different error types + for (let i = 0; i < 10; i++) { + smallManager.addError(createErrorEvent(`Unique error ${i}`)); + } + + expect(smallManager.size).toBeLessThanOrEqual(5); + }); + }); + + describe('severity calculation', () => { + it('should increase severity with count', () => { + const manager = new ErrorGroupManager({ + highSeverityThreshold: 3, + criticalSeverityThreshold: 5, + }); + + for (let i = 0; i < 5; i++) { + manager.addError(createErrorEvent('ECONNREFUSED')); + } + + const groups = manager.getGroups(); + expect(groups[0].severity).toBe('critical'); + }); + }); +}); + +describe('Global manager', () => { + beforeEach(() => { + resetErrorGroupManager(); + }); + + afterEach(() => { + resetErrorGroupManager(); + }); + + it('should return singleton instance', () => { + const manager1 = getErrorGroupManager(); + const manager2 = getErrorGroupManager(); + + expect(manager1).toBe(manager2); + }); + + it('should reset singleton', () => { + const manager1 = getErrorGroupManager(); + manager1.addError({ + ts: Date.now(), + worker: 'w-test', + level: 'error', + msg: 'Test error', + }); + + resetErrorGroupManager(); + + const manager2 = getErrorGroupManager(); + expect(manager2.size).toBe(0); + }); +}); diff --git a/src/errorGrouping.ts b/src/errorGrouping.ts new file mode 100644 index 0000000..64d27af --- /dev/null +++ b/src/errorGrouping.ts @@ -0,0 +1,546 @@ +/** + * FABRIC Error Grouping Module + * + * Clusters similar errors together to reduce noise and highlight unique issues. + * Uses pattern matching on error messages and stack traces to group related errors. + */ + +import { LogEvent, ErrorFingerprint, ErrorCategory, ErrorGroup, ErrorGroupingOptions } from './types.js'; + +// Simple hash function for signatures +function simpleHash(str: string): string { + let hash = 0; + for (let i = 0; i < str.length; i++) { + const char = str.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; // Convert to 32bit integer + } + return Math.abs(hash).toString(16).padStart(8, '0'); +} + +// Pattern matchers for error categorization +interface ErrorPattern { + category: ErrorCategory; + patterns: RegExp[]; + normalizers: Array<(msg: string) => string>; +} + +const ERROR_PATTERNS: ErrorPattern[] = [ + { + category: 'network', + patterns: [ + /ECONNREFUSED/i, + /ECONNRESET/i, + /EPIPE/i, + /ENOTFOUND/i, + /EAI_AGAIN/i, + /ETIMEDOUT.*connect/i, + /socket hang up/i, + /network unreachable/i, + /connection refused/i, + /connection reset/i, + /connection closed/i, + /getaddrinfo/i, + /DNS/i, + ], + normalizers: [ + // Normalize host:port patterns + (msg) => msg.replace(/(\d{1,3}\.){3}\d{1,3}(:\d+)?/g, '*:*'), + (msg) => msg.replace(/[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(:\d+)?/g, '*:*'), + // Normalize connection IDs + (msg) => msg.replace(/connection #[\d]+/gi, 'connection #*'), + ], + }, + { + category: 'permission', + patterns: [ + /EACCES/i, + /EPERM/i, + /permission denied/i, + /access denied/i, + /unauthorized/i, + /forbidden/i, + /authentication failed/i, + /invalid.*credentials/i, + /not authorized/i, + /insufficient permissions/i, + /403/i, + /401/i, + ], + normalizers: [ + // Normalize file paths + (msg) => msg.replace(/\/[\w./-]+/g, '/*'), + // Normalize usernames + (msg) => msg.replace(/user ['"][\w@.-]+['"]/gi, 'user "*"'), + ], + }, + { + category: 'not_found', + patterns: [ + /ENOENT/i, + /no such file/i, + /not found/i, + /does not exist/i, + /404/i, + /resource not found/i, + /no matching/i, + ], + normalizers: [ + // Normalize file paths + (msg) => msg.replace(/['"]\/[\w./-]+['"]/g, '"/*"'), + (msg) => msg.replace(/['"][\w-]+\.[\w]+['"]/g, '"*"'), + ], + }, + { + category: 'timeout', + patterns: [ + /ETIMEDOUT/i, + /timed? out/i, + /timeout expired/i, + /deadline exceeded/i, + /request timeout/i, + ], + normalizers: [ + // Normalize durations + (msg) => msg.replace(/\d+\s*(ms|seconds?|minutes?|s|m)/gi, '*ms'), + (msg) => msg.replace(/after \d+/gi, 'after *'), + ], + }, + { + category: 'resource', + patterns: [ + /ENOMEM/i, + /out of memory/i, + /disk full/i, + /no space left/i, + /quota exceeded/i, + /limit exceeded/i, + /rate limit/i, + /too many requests/i, + /429/i, + /resource exhausted/i, + ], + normalizers: [ + // Normalize numbers + (msg) => msg.replace(/\d+(?:\.\d+)?\s*(bytes?|kb|mb|gb|tb)/gi, '*B'), + (msg) => msg.replace(/limit of \d+/gi, 'limit of *'), + ], + }, + // Syntax errors must be checked BEFORE validation errors + // because "SyntaxError: unexpected token" should match syntax, not validation + { + category: 'syntax', + patterns: [ + /SyntaxError/i, + /parse error/i, + /JSON parse/i, + /YAML parse/i, + /invalid format/i, + ], + normalizers: [ + // Normalize line numbers + (msg) => msg.replace(/at line \d+/gi, 'at line *'), + (msg) => msg.replace(/position \d+/gi, 'position *'), + // Normalize quoted strings + (msg) => msg.replace(/['"][^'"]{1,30}['"]/g, '"*"'), + ], + }, + { + category: 'validation', + patterns: [ + /invalid/i, + /malformed/i, + /unexpected token/i, + /expected.*but got/i, + /validation failed/i, + /schema validation/i, + /type error/i, + /cannot read/i, + /cannot set/i, + /undefined is not/i, + /null is not/i, + /is not a function/i, + /is not defined/i, + ], + normalizers: [ + // Normalize property names + (msg) => msg.replace(/property ['"][\w.]+['"]/gi, 'property "*"'), + (msg) => msg.replace(/['"][\w.]+['"] is not/gi, '"*" is not'), + // Normalize types + (msg) => msg.replace(/expected [\w<>[\]]+/gi, 'expected *'), + ], + }, + { + category: 'tool', + patterns: [ + /tool.*failed/i, + /tool.*error/i, + /execution failed/i, + /command failed/i, + /exit code \d+/i, + /non-zero exit/i, + /spawn.*error/i, + /child process/i, + ], + normalizers: [ + // Normalize command arguments + (msg) => msg.replace(/--[\w-]+=\S+/g, '--*=*'), + (msg) => msg.replace(/exit code \d+/gi, 'exit code *'), + ], + }, +]; + +/** + * Default grouping options + */ +const DEFAULT_OPTIONS: Required = { + activeWindowMs: 5 * 60 * 1000, // 5 minutes + highSeverityThreshold: 5, + criticalSeverityThreshold: 10, + maxGroups: 100, +}; + +/** + * Categorize an error message + */ +export function categorizeError(message: string): ErrorCategory { + for (const pattern of ERROR_PATTERNS) { + for (const regex of pattern.patterns) { + if (regex.test(message)) { + return pattern.category; + } + } + } + return 'unknown'; +} + +/** + * Generate a fingerprint for an error event + */ +export function fingerprintError(event: LogEvent): ErrorFingerprint { + const message = event.error || event.msg; + + // Find matching category and normalizers + let category: ErrorCategory = 'unknown'; + let normalizers: Array<(msg: string) => string> = []; + + for (const pattern of ERROR_PATTERNS) { + for (const regex of pattern.patterns) { + if (regex.test(message)) { + category = pattern.category; + normalizers = pattern.normalizers; + break; + } + } + if (category !== 'unknown') break; + } + + // Apply normalizers to create signature + let signature = message; + for (const normalize of normalizers) { + signature = normalize(signature); + } + + // Also normalize common patterns + signature = signature + // UUIDs + .replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, '*UUID*') + // Hex strings (longer than 8 chars) + .replace(/0x[0-9a-f]{8,}/gi, '*HEX*') + // Numbers + .replace(/\b\d{4,}\b/g, '*') + // Timestamps + .replace(/\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/g, '*TIMESTAMP*') + // Stack traces - keep first line only + .split('\n')[0] + .trim(); + + // Truncate very long signatures + if (signature.length > 200) { + signature = signature.substring(0, 200) + '...'; + } + + const hash = simpleHash(signature + ':' + category); + + return { + signature, + category, + sampleMessage: message, + hash, + }; +} + +/** + * Check if two fingerprints represent the same error group + */ +export function fingerprintsMatch(a: ErrorFingerprint, b: ErrorFingerprint): boolean { + return a.hash === b.hash; +} + +/** + * Calculate severity based on count and recency + */ +function calculateSeverity( + count: number, + lastSeen: number, + options: Required +): 'low' | 'medium' | 'high' | 'critical' { + const now = Date.now(); + const isActive = (now - lastSeen) < options.activeWindowMs; + + if (!isActive) { + return 'low'; + } + + if (count >= options.criticalSeverityThreshold) { + return 'critical'; + } + + if (count >= options.highSeverityThreshold) { + return 'high'; + } + + if (count >= 2) { + return 'medium'; + } + + return 'low'; +} + +/** + * Generate a unique group ID + */ +function generateGroupId(): string { + return `eg-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 8)}`; +} + +/** + * Error Group Manager + * + * Manages error groups and provides grouping functionality. + */ +export class ErrorGroupManager { + private groups: Map = new Map(); + private hashToGroup: Map = new Map(); // hash -> groupId + private options: Required; + + constructor(options: ErrorGroupingOptions = {}) { + this.options = { ...DEFAULT_OPTIONS, ...options }; + } + + /** + * Add an error event to the appropriate group + */ + addError(event: LogEvent): ErrorGroup { + const fingerprint = fingerprintError(event); + const existingGroupId = this.hashToGroup.get(fingerprint.hash); + + if (existingGroupId) { + // Add to existing group + const group = this.groups.get(existingGroupId)!; + group.events.push(event); + group.count++; + group.lastSeen = event.ts; + + if (!group.affectedWorkers.includes(event.worker)) { + group.affectedWorkers.push(event.worker); + } + + // Update severity + group.severity = calculateSeverity(group.count, group.lastSeen, this.options); + group.isActive = (Date.now() - group.lastSeen) < this.options.activeWindowMs; + + return group; + } + + // Create new group + const groupId = generateGroupId(); + const group: ErrorGroup = { + id: groupId, + fingerprint, + events: [event], + firstSeen: event.ts, + lastSeen: event.ts, + count: 1, + affectedWorkers: [event.worker], + isActive: true, + severity: 'low', + }; + + this.groups.set(groupId, group); + this.hashToGroup.set(fingerprint.hash, groupId); + + // Trim if over limit + if (this.groups.size > this.options.maxGroups) { + this.trimGroups(); + } + + return group; + } + + /** + * Trim oldest/inactive groups when over limit + */ + private trimGroups(): void { + // Sort groups by lastSeen (oldest first) + const sortedGroups = Array.from(this.groups.entries()) + .sort((a, b) => a[1].lastSeen - b[1].lastSeen); + + // Remove oldest inactive groups first + const toRemove: string[] = []; + for (const [groupId, group] of sortedGroups) { + if (!group.isActive && this.groups.size - toRemove.length > this.options.maxGroups * 0.8) { + toRemove.push(groupId); + } + } + + // If still over limit, remove oldest regardless of status + while (this.groups.size - toRemove.length > this.options.maxGroups) { + const oldest = sortedGroups.find(([id]) => !toRemove.includes(id)); + if (oldest) { + toRemove.push(oldest[0]); + } else { + break; + } + } + + // Remove selected groups + for (const groupId of toRemove) { + const group = this.groups.get(groupId); + if (group) { + this.hashToGroup.delete(group.fingerprint.hash); + this.groups.delete(groupId); + } + } + } + + /** + * Get all error groups + */ + getGroups(): ErrorGroup[] { + // Update active status before returning + const now = Date.now(); + for (const group of this.groups.values()) { + group.isActive = (now - group.lastSeen) < this.options.activeWindowMs; + group.severity = calculateSeverity(group.count, group.lastSeen, this.options); + } + + return Array.from(this.groups.values()) + .sort((a, b) => { + // Sort by: active first, then severity, then count + if (a.isActive !== b.isActive) return a.isActive ? -1 : 1; + const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 }; + if (severityOrder[a.severity] !== severityOrder[b.severity]) { + return severityOrder[a.severity] - severityOrder[b.severity]; + } + return b.count - a.count; + }); + } + + /** + * Get active error groups only + */ + getActiveGroups(): ErrorGroup[] { + return this.getGroups().filter(g => g.isActive); + } + + /** + * Get a specific group by ID + */ + getGroup(groupId: string): ErrorGroup | undefined { + return this.groups.get(groupId); + } + + /** + * Get groups affecting a specific worker + */ + getWorkerGroups(workerId: string): ErrorGroup[] { + return this.getGroups().filter(g => g.affectedWorkers.includes(workerId)); + } + + /** + * Get groups by category + */ + getGroupsByCategory(category: ErrorCategory): ErrorGroup[] { + return this.getGroups().filter(g => g.fingerprint.category === category); + } + + /** + * Get summary statistics + */ + getStats(): { + totalGroups: number; + activeGroups: number; + totalErrors: number; + byCategory: Record; + bySeverity: Record; + } { + const groups = this.getGroups(); + const byCategory: Record = { + network: 0, + permission: 0, + validation: 0, + resource: 0, + not_found: 0, + timeout: 0, + syntax: 0, + tool: 0, + unknown: 0, + }; + const bySeverity: Record = { + critical: 0, + high: 0, + medium: 0, + low: 0, + }; + + let totalErrors = 0; + for (const group of groups) { + byCategory[group.fingerprint.category]++; + bySeverity[group.severity]++; + totalErrors += group.count; + } + + return { + totalGroups: groups.length, + activeGroups: groups.filter(g => g.isActive).length, + totalErrors, + byCategory, + bySeverity, + }; + } + + /** + * Clear all groups + */ + clear(): void { + this.groups.clear(); + this.hashToGroup.clear(); + } + + /** + * Get number of tracked groups + */ + get size(): number { + return this.groups.size; + } +} + +/** + * Create a singleton manager instance + */ +let globalManager: ErrorGroupManager | undefined; + +export function getErrorGroupManager(): ErrorGroupManager { + if (!globalManager) { + globalManager = new ErrorGroupManager(); + } + return globalManager; +} + +export function resetErrorGroupManager(): void { + globalManager = undefined; +} + +// Re-export types +export type { ErrorFingerprint, ErrorCategory, ErrorGroup, ErrorGroupingOptions }; diff --git a/src/store.ts b/src/store.ts index 22a6b3d..2c14b73 100644 --- a/src/store.ts +++ b/src/store.ts @@ -3,9 +3,11 @@ * * Stores and indexes LogEvents for efficient querying. * Includes collision detection for concurrent file modifications. + * Includes error grouping for smart error clustering. */ -import { LogEvent, WorkerInfo, WorkerStatus, EventFilter, EventStore, FileCollision } from './types.js'; +import { LogEvent, WorkerInfo, WorkerStatus, EventFilter, EventStore, FileCollision, ErrorGroup, ErrorCategory } from './types.js'; +import { ErrorGroupManager, getErrorGroupManager } from './errorGrouping.js'; /** Time window (in ms) to consider events as concurrent */ const COLLISION_WINDOW_MS = 5000; @@ -17,10 +19,12 @@ export class InMemoryEventStore implements EventStore { private events: LogEvent[] = []; private workers: Map = new Map(); private collisions: Map = new Map(); + private errorGroupManager: ErrorGroupManager; private maxEvents: number; constructor(maxEvents: number = 10000) { this.maxEvents = maxEvents; + this.errorGroupManager = new ErrorGroupManager(); } /** @@ -31,6 +35,11 @@ export class InMemoryEventStore implements EventStore { this.updateWorkerInfo(event); this.detectCollision(event); + // Track errors in error groups + if (event.level === 'error') { + this.errorGroupManager.addError(event); + } + // Trim if over limit if (this.events.length > this.maxEvents) { this.events.shift(); @@ -93,6 +102,48 @@ export class InMemoryEventStore implements EventStore { this.events = []; this.workers.clear(); this.collisions.clear(); + this.errorGroupManager.clear(); + } + + /** + * Get all error groups + */ + getErrorGroups(): ErrorGroup[] { + return this.errorGroupManager.getGroups(); + } + + /** + * Get active error groups only + */ + getActiveErrorGroups(): ErrorGroup[] { + return this.errorGroupManager.getActiveGroups(); + } + + /** + * Get error groups for a specific worker + */ + getWorkerErrorGroups(workerId: string): ErrorGroup[] { + return this.errorGroupManager.getWorkerGroups(workerId); + } + + /** + * Get error groups by category + */ + getErrorGroupsByCategory(category: ErrorCategory): ErrorGroup[] { + return this.errorGroupManager.getGroupsByCategory(category); + } + + /** + * Get error group statistics + */ + getErrorStats(): { + totalGroups: number; + activeGroups: number; + totalErrors: number; + byCategory: Record; + bySeverity: Record; + } { + return this.errorGroupManager.getStats(); } /** diff --git a/src/tui/components/SessionReplay.ts b/src/tui/components/SessionReplay.ts new file mode 100644 index 0000000..4796fac --- /dev/null +++ b/src/tui/components/SessionReplay.ts @@ -0,0 +1,574 @@ +/** + * SessionReplay Component + * + * Provides session replay functionality - ability to replay worker activity + * history chronologically with playback controls. + */ + +import * as blessed from 'blessed'; +import * as fs from 'fs'; +import { EventEmitter } from 'events'; +import { LogEvent, ReplaySpeed, ReplayState, EventFilter } from '../../types.js'; +import { parseLogLine } from '../../parser.js'; +import { colors, getLevelColor } from '../utils/colors.js'; + +export interface SessionReplayOptions { + /** Parent screen */ + parent: blessed.Widgets.Screen; + + /** Position from top */ + top: number | string; + + /** Position from left */ + left: number | string; + + /** Width of the panel */ + width: number | string; + + /** Height of the panel */ + height: number | string; + + /** Callback when event is emitted during playback */ + onEvent?: (event: LogEvent, index: number, total: number) => void; + + /** Callback when state changes */ + onStateChange?: (state: ReplayState) => void; +} + +export interface ReplaySessionData { + sourcePath: string; + events: LogEvent[]; + startTime: number; + endTime: number; +} + +/** + * SessionReplay handles loading and playing back historical log events + */ +export class SessionReplay extends EventEmitter { + private container: blessed.Widgets.BoxElement; + private timelineBox: blessed.Widgets.BoxElement; + private logBox: blessed.Widgets.Log; + private controlsBox: blessed.Widgets.BoxElement; + private parent: blessed.Widgets.Screen; + + private events: LogEvent[] = []; + private filteredEvents: LogEvent[] = []; + private currentIndex: number = 0; + private state: ReplayState = 'idle'; + private speed: ReplaySpeed = 1; + private filter?: EventFilter; + private playbackTimer?: NodeJS.Timeout; + private sourcePath: string = ''; + + private onEventCallback?: (event: LogEvent, index: number, total: number) => void; + private onStateChangeCallback?: (state: ReplayState) => void; + + constructor(options: SessionReplayOptions) { + super(); + + this.parent = options.parent; + this.onEventCallback = options.onEvent; + this.onStateChangeCallback = options.onStateChange; + + // Main container + this.container = blessed.box({ + parent: options.parent, + top: options.top, + left: options.left, + width: options.width, + height: options.height, + label: ' Session Replay ', + border: { type: 'line' }, + style: { + border: { fg: colors.border }, + label: { fg: colors.header }, + }, + }); + + // Timeline bar at top + this.timelineBox = blessed.box({ + parent: this.container, + top: 0, + left: 0, + right: 0, + height: 1, + content: this.formatTimeline(), + style: { + fg: colors.text, + bg: colors.background, + }, + }); + + // Log display area + this.logBox = blessed.log({ + parent: this.container, + top: 1, + left: 0, + right: 0, + bottom: 2, + scrollable: true, + alwaysScroll: true, + keys: true, + vi: true, + mouse: true, + style: { + fg: colors.text, + }, + }); + + // Controls bar at bottom + this.controlsBox = blessed.box({ + parent: this.container, + bottom: 0, + left: 0, + right: 0, + height: 2, + content: this.formatControls(), + style: { + fg: colors.muted, + }, + }); + + this.bindKeys(); + } + + /** + * Bind keyboard shortcuts + */ + private bindKeys(): void { + this.container.key(['space'], () => this.toggle()); + this.container.key(['p'], () => this.toggle()); + this.container.key(['right'], () => this.stepForward()); + this.container.key(['left'], () => this.stepBackward()); + this.container.key(['n'], () => this.stepForward()); + this.container.key(['b'], () => this.stepBackward()); + this.container.key(['up'], () => this.increaseSpeed()); + this.container.key(['down'], () => this.decreaseSpeed()); + this.container.key(['home'], () => this.seekTo(0)); + this.container.key(['end'], () => this.seekTo(this.filteredEvents.length - 1)); + this.container.key(['r'], () => this.reset()); + this.container.key(['1'], () => this.setSpeed(0.5)); + this.container.key(['2'], () => this.setSpeed(1)); + this.container.key(['3'], () => this.setSpeed(2)); + this.container.key(['4'], () => this.setSpeed(5)); + this.container.key(['5'], () => this.setSpeed(10)); + } + + /** + * Load events from a log file + */ + loadFile(filePath: string, filter?: EventFilter): Promise { + return new Promise((resolve, reject) => { + const expandedPath = filePath.startsWith('~') + ? filePath.replace('~', process.env.HOME || '') + : filePath; + + if (!fs.existsSync(expandedPath)) { + reject(new Error(`Log file not found: ${expandedPath}`)); + return; + } + + this.sourcePath = expandedPath; + this.filter = filter; + + const content = fs.readFileSync(expandedPath, 'utf-8'); + const lines = content.split('\n'); + + this.events = []; + for (const line of lines) { + if (line.trim()) { + const event = parseLogLine(line); + if (event) { + this.events.push(event); + } + } + } + + // Sort by timestamp + this.events.sort((a, b) => a.ts - b.ts); + + // Apply filter + this.applyFilter(); + + // Reset state + this.currentIndex = 0; + this.state = 'idle'; + this.updateDisplay(); + this.emit('loaded', this.events.length); + + resolve(this.events.length); + }); + } + + /** + * Load events from array + */ + loadEvents(events: LogEvent[], filter?: EventFilter): void { + this.events = [...events].sort((a, b) => a.ts - b.ts); + this.filter = filter; + this.applyFilter(); + this.currentIndex = 0; + this.state = 'idle'; + this.updateDisplay(); + this.emit('loaded', this.events.length); + } + + /** + * Apply current filter to events + */ + private applyFilter(): void { + if (!this.filter) { + this.filteredEvents = [...this.events]; + return; + } + + this.filteredEvents = this.events.filter(event => { + if (this.filter!.worker && event.worker !== this.filter!.worker) return false; + if (this.filter!.level && event.level !== this.filter!.level) return false; + if (this.filter!.bead && event.bead !== this.filter!.bead) return false; + if (this.filter!.path && event.path !== this.filter!.path) return false; + if (this.filter!.since && event.ts < this.filter!.since) return false; + if (this.filter!.until && event.ts > this.filter!.until) return false; + return true; + }); + } + + /** + * Set filter and reapply + */ + setFilter(filter?: EventFilter): void { + this.filter = filter; + this.applyFilter(); + this.currentIndex = Math.min(this.currentIndex, Math.max(0, this.filteredEvents.length - 1)); + this.updateDisplay(); + } + + /** + * Start or resume playback + */ + play(): void { + if (this.state === 'ended' || this.filteredEvents.length === 0) return; + + this.state = 'playing'; + this.onStateChangeCallback?.(this.state); + this.updateDisplay(); + this.scheduleNextEvent(); + } + + /** + * Pause playback + */ + pause(): void { + if (this.state !== 'playing') return; + + this.state = 'paused'; + this.onStateChangeCallback?.(this.state); + this.clearTimer(); + this.updateDisplay(); + } + + /** + * Toggle play/pause + */ + toggle(): void { + if (this.state === 'playing') { + this.pause(); + } else { + this.play(); + } + } + + /** + * Step forward one event + */ + stepForward(): void { + if (this.currentIndex >= this.filteredEvents.length - 1) return; + + this.pause(); + this.currentIndex++; + this.displayCurrentEvent(); + this.updateDisplay(); + } + + /** + * Step backward one event + */ + stepBackward(): void { + if (this.currentIndex <= 0) return; + + this.pause(); + this.currentIndex--; + this.displayCurrentEvent(); + this.updateDisplay(); + } + + /** + * Jump to specific index + */ + seekTo(index: number): void { + const safeIndex = Math.max(0, Math.min(index, this.filteredEvents.length - 1)); + if (safeIndex === this.currentIndex) return; + + this.pause(); + this.currentIndex = safeIndex; + this.displayCurrentEvent(); + this.updateDisplay(); + } + + /** + * Seek to percentage (0-100) + */ + seekToPercent(percent: number): void { + const index = Math.floor((percent / 100) * (this.filteredEvents.length - 1)); + this.seekTo(index); + } + + /** + * Set playback speed + */ + setSpeed(speed: ReplaySpeed): void { + this.speed = speed; + this.updateDisplay(); + + // Reschedule if playing + if (this.state === 'playing') { + this.clearTimer(); + this.scheduleNextEvent(); + } + } + + /** + * Increase speed + */ + increaseSpeed(): void { + const speeds: ReplaySpeed[] = [0.5, 1, 2, 5, 10]; + const currentIdx = speeds.indexOf(this.speed); + if (currentIdx < speeds.length - 1) { + this.setSpeed(speeds[currentIdx + 1]); + } + } + + /** + * Decrease speed + */ + decreaseSpeed(): void { + const speeds: ReplaySpeed[] = [0.5, 1, 2, 5, 10]; + const currentIdx = speeds.indexOf(this.speed); + if (currentIdx > 0) { + this.setSpeed(speeds[currentIdx - 1]); + } + } + + /** + * Reset replay to beginning + */ + reset(): void { + this.pause(); + this.currentIndex = 0; + this.state = 'idle'; + this.logBox.setContent(''); + this.updateDisplay(); + this.emit('reset'); + } + + /** + * Get current state + */ + getState(): ReplayState { + return this.state; + } + + /** + * Get current speed + */ + getSpeed(): ReplaySpeed { + return this.speed; + } + + /** + * Get progress info + */ + getProgress(): { current: number; total: number; percent: number } { + const total = this.filteredEvents.length; + const current = this.currentIndex; + const percent = total > 0 ? Math.round((current / total) * 100) : 0; + return { current, total, percent }; + } + + /** + * Get session time range + */ + getTimeRange(): { start: number; end: number } | null { + if (this.filteredEvents.length === 0) return null; + return { + start: this.filteredEvents[0].ts, + end: this.filteredEvents[this.filteredEvents.length - 1].ts, + }; + } + + /** + * Schedule next event playback + */ + private scheduleNextEvent(): void { + if (this.state !== 'playing') return; + if (this.currentIndex >= this.filteredEvents.length) { + this.state = 'ended'; + this.onStateChangeCallback?.(this.state); + this.updateDisplay(); + this.emit('ended'); + return; + } + + // Calculate delay based on time difference and speed + let delay = 100; // Default 100ms between events + + if (this.currentIndex > 0 && this.currentIndex < this.filteredEvents.length) { + const prevEvent = this.filteredEvents[this.currentIndex - 1]; + const currEvent = this.filteredEvents[this.currentIndex]; + const timeDiff = currEvent.ts - prevEvent.ts; + delay = Math.max(10, Math.min(5000, timeDiff / this.speed)); + } + + this.playbackTimer = setTimeout(() => { + this.displayCurrentEvent(); + this.currentIndex++; + this.onEventCallback?.( + this.filteredEvents[this.currentIndex - 1], + this.currentIndex, + this.filteredEvents.length + ); + this.updateDisplay(); + this.scheduleNextEvent(); + }, delay); + } + + /** + * Clear playback timer + */ + private clearTimer(): void { + if (this.playbackTimer) { + clearTimeout(this.playbackTimer); + this.playbackTimer = undefined; + } + } + + /** + * Display current event + */ + private displayCurrentEvent(): void { + if (this.currentIndex >= this.filteredEvents.length) return; + + const event = this.filteredEvents[this.currentIndex]; + const formatted = this.formatEvent(event); + this.logBox.log(formatted); + this.emit('event', event, this.currentIndex, this.filteredEvents.length); + } + + /** + * Format event for display + */ + private formatEvent(event: LogEvent): string { + const time = new Date(event.ts).toLocaleTimeString(); + const levelColor = getLevelColor(event.level as 'debug' | 'info' | 'warn' | 'error'); + const workerShort = event.worker.slice(0, 8); + + let msg = event.msg; + if (event.tool) { + msg = `[{cyan-fg}${event.tool}{/}] ${msg}`; + } + if (event.bead) { + msg = `{blue-fg}${event.bead}{/} ${msg}`; + } + + return `{gray-fg}${time}{/} {bold}${workerShort}{/} {${levelColor}-fg}${event.level.toUpperCase()}{/} ${msg}`; + } + + /** + * Format timeline display + */ + private formatTimeline(): string { + const { current, total, percent } = this.getProgress(); + const timeRange = this.getTimeRange(); + + // Create progress bar + const barWidth = 30; + const filled = Math.round((percent / 100) * barWidth); + const empty = barWidth - filled; + const progressBar = '█'.repeat(filled) + '░'.repeat(empty); + + let timeInfo = ''; + if (timeRange) { + const startTime = new Date(timeRange.start).toLocaleTimeString(); + const endTime = new Date(timeRange.end).toLocaleTimeString(); + timeInfo = `${startTime} - ${endTime}`; + } + + const stateIcon = this.getStateIcon(); + + return ` ${stateIcon} [${progressBar}] ${percent}% (${current}/${total}) ${timeInfo}`; + } + + /** + * Get icon for current state + */ + private getStateIcon(): string { + switch (this.state) { + case 'playing': return '▶'; + case 'paused': return '⏸'; + case 'ended': return '⏹'; + default: return '⏵'; + } + } + + /** + * Format controls display + */ + private formatControls(): string { + const speedDisplay = `${this.speed}x`; + return ` Speed: ${speedDisplay} | [Space] Play/Pause | [←/→] Step | [↑/↓] Speed | [1-5] 0.5x-10x | [Home/End] Jump | [r] Reset`; + } + + /** + * Update display elements + */ + private updateDisplay(): void { + this.timelineBox.setContent(this.formatTimeline()); + this.controlsBox.setContent(this.formatControls()); + this.container.setLabel(` Session Replay ${this.sourcePath ? `- ${this.sourcePath.split('/').pop()} ` : ' '}`); + this.parent.render(); + } + + /** + * Focus this component + */ + focus(): void { + this.container.focus(); + } + + /** + * Show the component + */ + show(): void { + this.container.show(); + this.parent.render(); + } + + /** + * Hide the component + */ + hide(): void { + this.container.hide(); + this.parent.render(); + } + + /** + * Clean up resources + */ + destroy(): void { + this.clearTimer(); + this.container.destroy(); + } +} + +export default SessionReplay; diff --git a/src/tui/components/index.ts b/src/tui/components/index.ts index fce8d9f..8bfe710 100644 --- a/src/tui/components/index.ts +++ b/src/tui/components/index.ts @@ -17,3 +17,6 @@ export type { CommandPaletteOptions, CommandSuggestion } from './CommandPalette. export { DiffView, parseDiff } from './DiffView.js'; export type { DiffViewOptions, DiffLine, DiffHunk } from './DiffView.js'; + +export { SessionReplay } from './SessionReplay.js'; +export type { SessionReplayOptions, ReplaySessionData } from './SessionReplay.js'; diff --git a/src/tui/index.ts b/src/tui/index.ts index 4a22237..2eb0f35 100644 --- a/src/tui/index.ts +++ b/src/tui/index.ts @@ -9,3 +9,4 @@ export * from './utils/colors.js'; export * from './utils/keyboard.js'; export * from './utils/stuckDetection.js'; export * from './utils/costTracking.js'; +export * from './components/index.js'; diff --git a/src/types.ts b/src/types.ts index f63928e..e3e6d66 100644 --- a/src/types.ts +++ b/src/types.ts @@ -128,3 +128,150 @@ export interface EventStore { /** Get collisions for a specific worker */ getWorkerCollisions(workerId: string): FileCollision[]; } + +// ============================================ +// Error Grouping Types +// ============================================ + +/** + * Error fingerprint - used to identify similar errors + */ +export interface ErrorFingerprint { + /** Normalized pattern signature (e.g., "ECONNREFUSED_*:*" for connection errors) */ + signature: string; + + /** Category of error (network, permission, validation, etc.) */ + category: ErrorCategory; + + /** Original error message (first occurrence) */ + sampleMessage: string; + + /** Hash of the signature for quick comparison */ + hash: string; +} + +/** + * Error categories for grouping + */ +export type ErrorCategory = + | 'network' // Connection errors, timeouts, DNS issues + | 'permission' // Auth failures, access denied + | 'validation' // Invalid input, schema errors + | 'resource' // Out of memory, disk full, quota exceeded + | 'not_found' // File not found, 404 errors + | 'timeout' // Operation timed out + | 'syntax' // Parse errors, malformed data + | 'tool' // Tool-specific failures + | 'unknown'; // Uncategorized errors + +/** + * Grouped error - clusters similar errors together + */ +export interface ErrorGroup { + /** Unique group ID */ + id: string; + + /** Fingerprint identifying this group */ + fingerprint: ErrorFingerprint; + + /** All error events in this group */ + events: LogEvent[]; + + /** First occurrence timestamp */ + firstSeen: number; + + /** Most recent occurrence timestamp */ + lastSeen: number; + + /** Number of occurrences */ + count: number; + + /** Workers that have encountered this error */ + affectedWorkers: string[]; + + /** Whether this error group is currently active (seen recently) */ + isActive: boolean; + + /** Severity based on frequency and recency */ + severity: 'low' | 'medium' | 'high' | 'critical'; +} + +/** + * Options for error grouping + */ +export interface ErrorGroupingOptions { + /** Time window to consider errors as active (ms), default 5 minutes */ + activeWindowMs?: number; + + /** Minimum occurrences for high severity */ + highSeverityThreshold?: number; + + /** Minimum occurrences for critical severity */ + criticalSeverityThreshold?: number; + + /** Maximum groups to track */ + maxGroups?: number; +} + +// ============================================ +// Session Replay Types +// ============================================ + +export type ReplaySpeed = 0.5 | 1 | 2 | 5 | 10; + +export type ReplayState = 'idle' | 'playing' | 'paused' | 'ended'; + +export interface ReplaySession { + /** Unique session identifier */ + id: string; + + /** Source log file path */ + sourcePath: string; + + /** Total events in the session */ + totalEvents: number; + + /** Current playback position (event index) */ + currentIndex: number; + + /** Playback state */ + state: ReplayState; + + /** Playback speed multiplier */ + speed: ReplaySpeed; + + /** Start timestamp of session (first event) */ + startTime: number; + + /** End timestamp of session (last event) */ + endTime: number; + + /** Filter applied during replay */ + filter?: EventFilter; +} + +export interface ReplayControls { + /** Start or resume playback */ + play(): void; + + /** Pause playback */ + pause(): void; + + /** Toggle play/pause */ + toggle(): void; + + /** Step to next event */ + stepForward(): void; + + /** Step to previous event */ + stepBackward(): void; + + /** Jump to specific event index */ + seekTo(index: number): void; + + /** Set playback speed */ + setSpeed(speed: ReplaySpeed): void; + + /** Stop and reset replay */ + reset(): void; +} diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index 9178911..bfbf570 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/commander/typings/index.d.ts","./node_modules/commander/typings/esm.d.mts","./src/types.ts","./src/index.ts","./src/parser.ts","./src/tailer.ts","./src/store.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/blessed/index.d.ts","./src/tui/utils/colors.ts","./src/tui/components/WorkerGrid.ts","./src/tui/components/ActivityStream.ts","./src/tui/components/WorkerDetail.ts","./src/tui/components/CommandPalette.ts","./src/tui/app.ts","./src/tui/utils/keyboard.ts","./src/tui/utils/stuckDetection.ts","./src/tui/utils/costTracking.ts","./src/tui/index.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/ws/index.d.mts","./src/web/server.ts","./src/web/index.ts","./src/cli.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/runner/dist/tasks.d-C7UxawJ9.d.ts","./node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/types.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts","./node_modules/vite/types/hmrPayload.d.ts","./node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","./node_modules/vite/types/customEvent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","./node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/config.d.Cy95HiCx.d.ts","./node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","./node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts","./node_modules/vitest/dist/chunks/worker.d.Dyxm8DEL.d.ts","./node_modules/vitest/dist/chunks/browser.d.ChKACdzH.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","./node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts","./node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts","./node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/parser.test.ts","./src/store.test.ts","./src/tailer.test.ts","./src/tui/components/DiffView.ts","./src/tui/components/index.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/ws/index.d.ts"],"fileIdsList":[[70,116,238],[70,116],[70,116,238,239,240,241,242],[70,116,238,240],[70,116,117,127,146,164],[70,116,130,164,182],[70,116,217,218],[70,116,130,164],[70,116,127,130,164,176,177,178],[70,116,179,181,183],[70,113,116],[70,115,116],[116],[70,116,121,149],[70,116,117,122,127,135,146,157],[70,116,117,118,127,135],[65,66,67,70,116],[70,116,119,158],[70,116,120,121,128,136],[70,116,121,146,154],[70,116,122,124,127,135],[70,115,116,123],[70,116,124,125],[70,116,126,127],[70,115,116,127],[70,116,127,128,129,146,157],[70,116,127,128,129,142,146,149],[70,116,124,127,130,135,146,157],[70,116,127,128,130,131,135,146,154,157],[70,116,130,132,146,154,157],[68,69,70,71,72,73,74,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[70,116,127,133],[70,116,134,157,162],[70,116,124,127,135,146],[70,116,136],[70,116,137],[70,115,116,138],[70,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[70,116,140],[70,116,141],[70,116,127,142,143],[70,116,142,144,158,160],[70,116,127,146,147,149],[70,116,148,149],[70,116,146,147],[70,116,149],[70,116,150],[70,113,116,146,151],[70,116,127,152,153],[70,116,152,153],[70,116,121,135,146,154],[70,116,155],[70,116,135,156],[70,116,130,141,157],[70,116,121,158],[70,116,146,159],[70,116,134,160],[70,116,161],[70,111,116],[70,111,116,127,129,138,146,149,157,160,162],[70,116,146,163],[70,116,247],[70,116,245,246],[70,116,128,146,164],[70,116,130,164,180],[70,116,127,130,132,135,146,154,157,163,164],[70,116,190,194,197,199,214,215,216,219,224],[70,116,194,195,197,198],[70,116,194],[70,116,194,195,197],[70,116,194,195],[70,116,189,206,207],[70,116,189,206],[70,116,189,196],[70,116,189],[70,116,191],[70,116,189,190,191,192,193],[58,70,116],[70,116,227,228],[70,116,227,228,229,230],[70,116,227,229],[70,116,227],[70,83,87,116,157],[70,83,116,146,157],[70,78,116],[70,80,83,116,154,157],[70,116,135,154],[70,116,164],[70,78,116,164],[70,80,83,116,135,157],[70,75,76,79,82,116,127,146,157],[70,83,90,116],[70,75,81,116],[70,83,104,105,116],[70,79,83,116,149,157,164],[70,104,116,164],[70,77,78,116,164],[70,83,116],[70,77,78,79,80,81,82,83,84,85,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,105,106,107,108,109,110,116],[70,83,98,116],[70,83,90,91,116],[70,81,83,91,92,116],[70,82,116],[70,75,78,83,116],[70,83,87,91,92,116],[70,87,116],[70,81,83,86,116,157],[70,75,80,83,90,116],[70,116,146],[70,78,83,104,116,162,164],[70,116,201],[70,116,201,202,203,204],[70,116,203],[70,116,199,221,222,224],[70,116,199,200,212,224],[70,116,189,197,199,208,224],[70,116,205],[70,116,189,199,208,211,220,223,224],[70,116,199,200,205,208,224],[70,116,199,221,222,223,224],[70,116,199,205,209,210,211,224],[70,116,189,194,197,199,200,205,208,209,210,211,212,213,214,220,221,222,223,224,225,226,231],[59,61,62,63,64,70,116,175,187],[60,70,116],[60,62,70,116,232],[60,64,70,116,232],[63,70,116,128,136,137,232],[60,62,70,116,127,128,137],[60,64,70,116,165,166,167,168,169,170],[60,70,116,165,166],[70,116,165,166],[70,116,167,168,169,170,236],[70,116,166,171,172,173,174],[70,116,186],[60,64,70,116,127,130,137,157,184,185]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a722a71d8f3cb0028857b12579c7eca55acc76bf34e5db7eaf6fe817b985f9c3","impliedFormat":1},{"version":"b124c0624b15412ace7d54644ade38d7a69db7e25488a1a4d2a8df6e11696538","impliedFormat":99},{"version":"56b5e9bc782583168c38fb4e7b16620ff6a59bfa18351f39de08d6b06aa845a6","signature":"e1b422c4313167916ed55573177c0c16000abc93d14ca930b5ec270b323258b9","impliedFormat":99},{"version":"959d0f843a3d09da1a6290b1187e15a8441369259dbf37513b2ef570e00c524e","signature":"9ccf1e3d9cc52ab2ee6660f6f9ec3311cb3b7a111dad05443550bb759f8ba9ef","impliedFormat":99},{"version":"1b760985af92a64ec5c6754723ba71d34786da6625ca36f98bad73137f0a6885","signature":"31af05629294edff030f985d5b39e4f0e19fdf4eaab606e3b28ad3527822eedc","impliedFormat":99},{"version":"3fda678f063a88d5c3405f323340647b3828b4b41861c3023d1c24badb96d17b","signature":"15553593ae2e339efdd43ea71967213bef1e96f6c9ecdf53e627e82026762931","impliedFormat":99},{"version":"cb67e49ef3d2b084c887f86939afa48d6ab6865d427f855fff1ef2f2740e1357","signature":"93fe7d81bc17322e2fb02ba1ef4e5f8799eaca003827d927cdac5df2c75a2f12","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"4b34bdb6f29a4347b7db9c0f8622686035fe25adb1c9e927acd8d22a2cbb6ccb","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"fad4e3c207fe23922d0b2d06b01acbfb9714c4f2685cf80fd384c8a100c82fd0","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"a4cb76c6f4b8356d14d6cf5c05e1e3fbc74007b160a00f6511a8c39295f08c42","impliedFormat":1},{"version":"3cd26728b687a71031da6de0b109271b0d39c89fd4ecbaa4fa92d3a569a0ec63","signature":"64543367b4c5acca004f85ebf993925f8c5ea84188f7910f4074b45ef14e29e9","impliedFormat":99},{"version":"2766cecc92a4db5e1f8f20599a76329c9da79dba07ca901b6e63f8e21baf5ec2","signature":"f1646c7a0a166019bdbaf35124ae6239ce078b2ca3d5b8e80a8bb8e3bffd185e","impliedFormat":99},{"version":"400ee0a52011f787da785a8bb2f6b07a1225eddf801d47b592235bd61ef54c4c","signature":"5837f59fca875832f436d7575a84c87979a54865c592675b7ef3f455fc156963","impliedFormat":99},{"version":"058d3100b91c92093f8cf372789bd72fc26bab9978426973109140f7e71ce71f","signature":"fc7a0d66560718fabe9e3cfb4e8d86f6de6dbacb92a586a84f7dea338ba4270b","impliedFormat":99},{"version":"ffa7abe20ccf7d851d8e729620b4ca1e2953cf34bea2ecfad27888798e22a58c","signature":"5e6c3416ecd35218a8f71d0ef52b4f5e69f24898eb1858f315f23a78454d8ece","impliedFormat":99},{"version":"d53d180fba52bfb73cb0152e0fea55012d3f8c1e7e51740ba8bf515706a83b76","signature":"14e5b49adb496d7d67a499c1d11f6728a816afd1973bc1b2e579a6826a11092f","impliedFormat":99},{"version":"ce661536c5083f113a4ed963d47acac3ad48cfac5f61da373c2c2a7c1b3234c3","signature":"960a48457fec96e2d1a31970d7898e39141266e8c8dc6ef83ec6d736af574824","impliedFormat":99},{"version":"0437152e468c22840ee9e184a4bcbcd494a9042694def1e0d0e8128fa3c9c76a","signature":"eecf7038a027a976dd44857aaf8441507a25269c5474bcc76c86cba55a9aad24","impliedFormat":99},{"version":"2aa791364e468913f4e5607ffcf874886d901a08560244048fc3653f0e6929c5","signature":"01db02a2c497036345f033c8130570e57bf93d322be8fce4cace4c12c7fdce7f","impliedFormat":99},{"version":"e92cddc0e6562dbca2d8cd5b54bad246968fbda1bf00622f9961ea95b66ed1ab","signature":"4ffd727a370a6f4fa21d8f9c5503176dc74b5387929336d873ea46e95a446824","impliedFormat":99},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"316f1486e15cbf7896425f0a16dfe12d447dd57cfb3244b8b119c77df870858f","impliedFormat":99},{"version":"87ef1212520b37d6a12a7fe8dd7eecb39ba487c0ff299a0ef1e6c97cc2f9b886","signature":"481db2f63d57f4245087aa692c76c8069e3509c841cfd79f95ba25093613aa0c","impliedFormat":99},{"version":"fe0c119587fec41cc1c40c5727cf34b4d42ccece7c5a6d85fb3f117dbd25f3f2","signature":"de0562e1297ae9acf747b4614b60820dd94f4b685802471163840e00e020147f","impliedFormat":99},{"version":"4a77e60a7542b497bc290f7fb2e276be493e2d14b85ed9956bac4a256866f439","signature":"1ff246605270b850c27ac89ab067ddf788724b4e9c3c563c12f142d99345d64c","impliedFormat":99},{"version":"acfb723d81eda39156251aed414c553294870bf53062429ebfcfba8a68cb4753","impliedFormat":99},{"version":"fa69a90381c2f85889722a911a732a5ee3596dc3acecda8a9aa2fa89b9615d8d","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"57e9e1b0911874c62d743af24b5d56032759846533641d550b12a45ff404bf07","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"854cd3a3375ffc4e7a92b2168dd065d7ff2614b43341038a65cca865a44c00c5","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"2f863ee9b873a65d9c3338ea7aaddbdb41a9673f062f06983d712bd01c25dc6b","impliedFormat":99},{"version":"67aa128c2bc170b93794f191feffc65a4b33e878db211cfcb7658c4b72f7a1f5","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"c35b8117804c639c53c87f2c23e0c786df61d552e513bd5179f5b88e29964838","impliedFormat":99},{"version":"c609331c6ed4ad4af54e101088c6a4dcb48f8db7b0b97e44a6efeb130f4331bd","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"67acaedb46832d66c15f1b09fb7b6a0b7f41bdbf8eaa586ec70459b3e8896eb9","impliedFormat":99},{"version":"4535ab977ee871e956eb7bebe2db5de79f5d5ec7dfbbf1d35e08f4a2d6630dac","impliedFormat":99},{"version":"b79b5ed99f26ffb2f8ae4bdcc4b34a9542197dc3fa96cfb425c2a81e618cff28","impliedFormat":99},{"version":"31fd7c12f6e27154efb52a916b872509a771880f3b20f2dfd045785c13aa813f","impliedFormat":99},{"version":"b481de4ab5379bd481ca12fc0b255cdc47341629a22c240a89cdb4e209522be2","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"4e258d11c899cb9ff36b4b5c53df59cf4a5ccae9a9931529686e77431e0a3518","affectsGlobalScope":true,"impliedFormat":99},{"version":"a5ae67a67f786ffe92d34b55467a40fb50fb0093e92388cadce6168fa42690fd","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"a534e61c2f06a147d97aebad720db97dffd8066b7142212e46bcbcdcb640b81a","impliedFormat":99},{"version":"ddf569d04470a4d629090d43a16735185001f3fcf0ae036ead99f2ceab62be48","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"53c448183c7177c83d3eb0b40824cf8952721a6584cf22052adc24f778986732","impliedFormat":99},{"version":"4fba5e6ca8f529a51e18bb1e7d0a816c0e3f0a08470da35859a7bbb6cdeed2ca","signature":"b6831e080e60b84a24614a97a346adc8797198cd60394a0366e72c75e4374913","impliedFormat":99},{"version":"7a467fd688c06ec8abfabe9d7c7766323f643df87473cb3925ec672cb52ab81b","signature":"dd4c9eee30bd732383a408edbacb0e351cde7529dca13c898338e7d20fcaa8f3","impliedFormat":99},{"version":"ebd89e7eff37f9eec8bd34caf300ce002342ed3ff788b534080edfe7b1f7dd67","signature":"a2036e9d5d7d56c883b0503f25a9985b2d98c117bcccf10190d7a24ec672632e","impliedFormat":99},{"version":"713e41cbd86c527a2ac08e91f83a8775d7694830d3df1101d230f6b57d67c1a0","signature":"eac9767f53c827e9bdd8e3f03151f290b1f51b4de497bd097c69c8524c4d70aa","impliedFormat":99},{"version":"e055523b7c1a5d8ec96d0dc11d7a16ed418d82f4471fc8d7d12c154aba08bd07","signature":"d836ddbc08d9456e5a6636ee933f5b82931cd670298aae3c325e2abdcaa2c57d","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[60,64],[166,175],[186,188],[233,237]],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":199,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"referencedMap":[[240,1],[238,2],[216,2],[243,3],[239,1],[241,4],[242,1],[165,5],[183,6],[219,7],[182,8],[217,2],[244,2],[179,9],[184,10],[180,2],[113,11],[114,11],[115,12],[70,13],[116,14],[117,15],[118,16],[65,2],[68,17],[66,2],[67,2],[119,18],[120,19],[121,20],[122,21],[123,22],[124,23],[125,23],[126,24],[127,25],[128,26],[129,27],[71,2],[69,2],[130,28],[131,29],[132,30],[164,31],[133,32],[134,33],[135,34],[136,35],[137,36],[138,37],[139,38],[140,39],[141,40],[142,41],[143,41],[144,42],[145,2],[146,43],[148,44],[147,45],[149,46],[150,47],[151,48],[152,49],[153,50],[154,51],[155,52],[156,53],[157,54],[158,55],[159,56],[160,57],[161,58],[72,2],[73,2],[74,2],[112,59],[162,60],[163,61],[177,2],[178,2],[248,62],[245,2],[247,63],[176,64],[181,65],[185,66],[249,66],[220,67],[189,2],[199,68],[195,69],[198,70],[221,71],[206,2],[208,72],[207,73],[214,2],[197,74],[190,75],[192,76],[194,77],[193,2],[196,75],[191,2],[218,2],[59,78],[58,2],[246,2],[229,79],[231,80],[230,81],[228,82],[227,2],[222,2],[215,2],[56,2],[57,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[55,2],[54,2],[1,2],[90,83],[100,84],[89,83],[110,85],[81,86],[80,87],[109,88],[103,89],[108,90],[83,91],[97,92],[82,93],[106,94],[78,95],[77,88],[107,96],[79,97],[84,98],[85,2],[88,98],[75,2],[111,99],[101,100],[92,101],[93,102],[95,103],[91,104],[94,105],[104,88],[86,106],[87,107],[96,108],[76,109],[99,100],[98,98],[102,2],[105,110],[202,111],[205,112],[203,111],[201,2],[204,113],[223,114],[213,115],[209,116],[210,69],[226,117],[224,118],[211,119],[225,120],[200,2],[212,121],[232,122],[188,123],[61,124],[233,125],[62,124],[234,126],[64,124],[235,127],[63,128],[171,129],[168,130],[170,131],[236,131],[169,130],[167,130],[237,132],[175,133],[166,2],[174,124],[172,2],[173,124],[60,2],[187,134],[186,135]],"version":"5.9.3"} \ No newline at end of file +{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/commander/typings/index.d.ts","./node_modules/commander/typings/esm.d.mts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/blessed/index.d.ts","./src/types.ts","./src/index.ts","./src/parser.ts","./src/tailer.ts","./src/errorGrouping.ts","./src/store.ts","./src/tui/utils/colors.ts","./src/tui/components/WorkerGrid.ts","./src/tui/components/ActivityStream.ts","./src/tui/components/WorkerDetail.ts","./src/tui/components/CommandPalette.ts","./src/tui/app.ts","./src/tui/utils/keyboard.ts","./src/tui/utils/stuckDetection.ts","./src/tui/utils/costTracking.ts","./src/tui/components/DiffView.ts","./src/tui/components/SessionReplay.ts","./src/tui/components/index.ts","./src/tui/index.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/ws/index.d.mts","./src/web/server.ts","./src/web/index.ts","./src/cli.ts","./node_modules/@vitest/pretty-format/dist/index.d.ts","./node_modules/@vitest/utils/dist/display.d.ts","./node_modules/@vitest/utils/dist/types.d.ts","./node_modules/@vitest/utils/dist/helpers.d.ts","./node_modules/@vitest/utils/dist/timers.d.ts","./node_modules/@vitest/utils/dist/index.d.ts","./node_modules/@vitest/runner/dist/tasks.d-C7UxawJ9.d.ts","./node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","./node_modules/@vitest/utils/dist/diff.d.ts","./node_modules/@vitest/runner/dist/types.d.ts","./node_modules/@vitest/runner/dist/index.d.ts","./node_modules/vitest/dist/chunks/traces.d.402V_yFI.d.ts","./node_modules/vite/types/hmrPayload.d.ts","./node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","./node_modules/vite/types/customEvent.d.ts","./node_modules/vite/types/hot.d.ts","./node_modules/vite/dist/node/module-runner.d.ts","./node_modules/@vitest/snapshot/dist/environment.d-DHdQ1Csl.d.ts","./node_modules/@vitest/snapshot/dist/rawSnapshot.d-lFsMJFUd.d.ts","./node_modules/@vitest/snapshot/dist/index.d.ts","./node_modules/vitest/dist/chunks/config.d.Cy95HiCx.d.ts","./node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","./node_modules/vitest/dist/chunks/rpc.d.RH3apGEf.d.ts","./node_modules/vitest/dist/chunks/worker.d.Dyxm8DEL.d.ts","./node_modules/vitest/dist/chunks/browser.d.ChKACdzH.d.ts","./node_modules/@vitest/spy/dist/index.d.ts","./node_modules/tinyrainbow/dist/index.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@vitest/expect/dist/index.d.ts","./node_modules/@vitest/runner/dist/utils.d.ts","./node_modules/tinybench/dist/index.d.ts","./node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","./node_modules/vitest/dist/chunks/global.d.B15mdLcR.d.ts","./node_modules/vitest/dist/chunks/suite.d.BJWk38HB.d.ts","./node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","./node_modules/expect-type/dist/utils.d.ts","./node_modules/expect-type/dist/overloads.d.ts","./node_modules/expect-type/dist/branding.d.ts","./node_modules/expect-type/dist/messages.d.ts","./node_modules/expect-type/dist/index.d.ts","./node_modules/vitest/dist/index.d.ts","./src/errorGrouping.test.ts","./src/parser.test.ts","./src/store.test.ts","./src/tailer.test.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react-dom/index.d.ts","./node_modules/@types/ws/index.d.ts"],"fileIdsList":[[65,111,241],[65,111],[65,111,241,242,243,244,245],[65,111,241,243],[65,111,112,122,141,159],[65,111,125,159,186],[65,111,221,222],[65,111,125,159],[65,111,122,125,159,180,181,182],[65,111,183,185,187],[65,108,111],[65,110,111],[111],[65,111,116,144],[65,111,112,117,122,130,141,152],[65,111,112,113,122,130],[60,61,62,65,111],[65,111,114,153],[65,111,115,116,123,131],[65,111,116,141,149],[65,111,117,119,122,130],[65,110,111,118],[65,111,119,120],[65,111,121,122],[65,110,111,122],[65,111,122,123,124,141,152],[65,111,122,123,124,137,141,144],[65,111,119,122,125,130,141,152],[65,111,122,123,125,126,130,141,149,152],[65,111,125,127,141,149,152],[63,64,65,66,67,68,69,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[65,111,122,128],[65,111,129,152,157],[65,111,119,122,130,141],[65,111,131],[65,111,132],[65,110,111,133],[65,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158],[65,111,135],[65,111,136],[65,111,122,137,138],[65,111,137,139,153,155],[65,111,122,141,142,144],[65,111,143,144],[65,111,141,142],[65,111,144],[65,111,145],[65,108,111,141,146],[65,111,122,147,148],[65,111,147,148],[65,111,116,130,141,149],[65,111,150],[65,111,130,151],[65,111,125,136,152],[65,111,116,153],[65,111,141,154],[65,111,129,155],[65,111,156],[65,106,111],[65,106,111,122,124,133,141,144,152,155,157],[65,111,141,158],[65,111,250],[65,111,248,249],[65,111,123,141,159],[65,111,125,159,184],[65,111,122,125,127,130,141,149,152,158,159],[65,111,194,198,201,203,218,219,220,223,228],[65,111,198,199,201,202],[65,111,198],[65,111,198,199,201],[65,111,198,199],[65,111,193,210,211],[65,111,193,210],[65,111,193,200],[65,111,193],[65,111,195],[65,111,193,194,195,196,197],[58,65,111],[65,111,231,232],[65,111,231,232,233,234],[65,111,231,233],[65,111,231],[65,78,82,111,152],[65,78,111,141,152],[65,73,111],[65,75,78,111,149,152],[65,111,130,149],[65,111,159],[65,73,111,159],[65,75,78,111,130,152],[65,70,71,74,77,111,122,141,152],[65,78,85,111],[65,70,76,111],[65,78,99,100,111],[65,74,78,111,144,152,159],[65,99,111,159],[65,72,73,111,159],[65,78,111],[65,72,73,74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,111],[65,78,93,111],[65,78,85,86,111],[65,76,78,86,87,111],[65,77,111],[65,70,73,78,111],[65,78,82,86,87,111],[65,82,111],[65,76,78,81,111,152],[65,70,75,78,85,111],[65,111,141],[65,73,78,99,111,157,159],[65,111,205],[65,111,205,206,207,208],[65,111,207],[65,111,203,225,226,228],[65,111,203,204,216,228],[65,111,193,201,203,212,228],[65,111,209],[65,111,193,203,212,215,224,227,228],[65,111,203,204,209,212,228],[65,111,203,225,226,227,228],[65,111,203,209,213,214,215,228],[65,111,193,198,201,203,204,209,212,213,214,215,216,217,218,224,225,226,227,228,229,230,235],[59,65,111,160,162,163,164,166,177,179,191],[65,111,161,165,236],[65,111,161],[65,111,161,163,236],[65,111,161,166,236],[65,111,161,165],[65,111,123,131,132,164,236],[65,111,122,123,132,161,163],[65,111,160,161,166,167,168,169,170,171],[65,111,160,161,167],[65,111,160,167],[65,111,122,123,160,161,163,167],[65,111,168,169,170,171,176,177],[65,111,167,172,173,174,175,178],[65,111,190],[65,111,122,125,132,152,161,166,188,189]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a722a71d8f3cb0028857b12579c7eca55acc76bf34e5db7eaf6fe817b985f9c3","impliedFormat":1},{"version":"b124c0624b15412ace7d54644ade38d7a69db7e25488a1a4d2a8df6e11696538","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"ba481bca06f37d3f2c137ce343c7d5937029b2468f8e26111f3c9d9963d6568d","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f","impliedFormat":1},{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true,"impliedFormat":1},{"version":"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","impliedFormat":1},{"version":"3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true,"impliedFormat":1},{"version":"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","impliedFormat":1},{"version":"9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","impliedFormat":1},{"version":"87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","impliedFormat":1},{"version":"4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true,"impliedFormat":1},{"version":"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","impliedFormat":1},{"version":"58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","impliedFormat":1},{"version":"4b34bdb6f29a4347b7db9c0f8622686035fe25adb1c9e927acd8d22a2cbb6ccb","impliedFormat":1},{"version":"714435130b9015fae551788df2a88038471a5a11eb471f27c4ede86552842bc9","impliedFormat":1},{"version":"855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","impliedFormat":1},{"version":"5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86","impliedFormat":1},{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true,"impliedFormat":1},{"version":"27fdb0da0daf3b337c5530c5f266efe046a6ceb606e395b346974e4360c36419","impliedFormat":1},{"version":"2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","impliedFormat":1},{"version":"a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d","impliedFormat":1},{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true,"impliedFormat":1},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"47ab634529c5955b6ad793474ae188fce3e6163e3a3fb5edd7e0e48f14435333","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"fad4e3c207fe23922d0b2d06b01acbfb9714c4f2685cf80fd384c8a100c82fd0","affectsGlobalScope":true,"impliedFormat":1},{"version":"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","impliedFormat":1},{"version":"5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5","impliedFormat":1},{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","impliedFormat":1},{"version":"809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true,"impliedFormat":1},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true,"impliedFormat":1},{"version":"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","impliedFormat":1},{"version":"1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","impliedFormat":1},{"version":"f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e","impliedFormat":1},{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"05db535df8bdc30d9116fe754a3473d1b6479afbc14ae8eb18b605c62677d518","impliedFormat":1},{"version":"b1810689b76fd473bd12cc9ee219f8e62f54a7d08019a235d07424afbf074d25","impliedFormat":1},{"version":"a4cb76c6f4b8356d14d6cf5c05e1e3fbc74007b160a00f6511a8c39295f08c42","impliedFormat":1},{"version":"50c636e9fae5348c66cf6cb6e4b3c597dafe3c40a579f82fd04e712b660c0a66","signature":"ceca8bf51f602dd72a73b1d0ba0d1166fe8341c88507d3a502be6648ef615f83","impliedFormat":99},{"version":"959d0f843a3d09da1a6290b1187e15a8441369259dbf37513b2ef570e00c524e","signature":"9ccf1e3d9cc52ab2ee6660f6f9ec3311cb3b7a111dad05443550bb759f8ba9ef","impliedFormat":99},{"version":"1b760985af92a64ec5c6754723ba71d34786da6625ca36f98bad73137f0a6885","signature":"31af05629294edff030f985d5b39e4f0e19fdf4eaab606e3b28ad3527822eedc","impliedFormat":99},{"version":"3fda678f063a88d5c3405f323340647b3828b4b41861c3023d1c24badb96d17b","signature":"15553593ae2e339efdd43ea71967213bef1e96f6c9ecdf53e627e82026762931","impliedFormat":99},{"version":"34ce5e8cd31f62444bafa60f4b37979b6b9f4069e304b29d2f1f720d76159b0e","signature":"c230c2f34cb2f5e054057e07ec47c5be3f262fbcc0794050b72dfafe03c6e9d4","impliedFormat":99},{"version":"55ac9aca4f9dba23d8dac8b15a7a2aa4241e95ff63c1f556dc3f5749be585e04","signature":"0a2d9338fed486f22eacd6ddc9115c9bcbd6aa7b98a88cc27030d1254cc27f1c","impliedFormat":99},{"version":"3cd26728b687a71031da6de0b109271b0d39c89fd4ecbaa4fa92d3a569a0ec63","signature":"64543367b4c5acca004f85ebf993925f8c5ea84188f7910f4074b45ef14e29e9","impliedFormat":99},{"version":"2766cecc92a4db5e1f8f20599a76329c9da79dba07ca901b6e63f8e21baf5ec2","signature":"f1646c7a0a166019bdbaf35124ae6239ce078b2ca3d5b8e80a8bb8e3bffd185e","impliedFormat":99},{"version":"400ee0a52011f787da785a8bb2f6b07a1225eddf801d47b592235bd61ef54c4c","signature":"5837f59fca875832f436d7575a84c87979a54865c592675b7ef3f455fc156963","impliedFormat":99},{"version":"058d3100b91c92093f8cf372789bd72fc26bab9978426973109140f7e71ce71f","signature":"fc7a0d66560718fabe9e3cfb4e8d86f6de6dbacb92a586a84f7dea338ba4270b","impliedFormat":99},{"version":"ffa7abe20ccf7d851d8e729620b4ca1e2953cf34bea2ecfad27888798e22a58c","signature":"5e6c3416ecd35218a8f71d0ef52b4f5e69f24898eb1858f315f23a78454d8ece","impliedFormat":99},{"version":"d53d180fba52bfb73cb0152e0fea55012d3f8c1e7e51740ba8bf515706a83b76","signature":"14e5b49adb496d7d67a499c1d11f6728a816afd1973bc1b2e579a6826a11092f","impliedFormat":99},{"version":"ce661536c5083f113a4ed963d47acac3ad48cfac5f61da373c2c2a7c1b3234c3","signature":"960a48457fec96e2d1a31970d7898e39141266e8c8dc6ef83ec6d736af574824","impliedFormat":99},{"version":"0437152e468c22840ee9e184a4bcbcd494a9042694def1e0d0e8128fa3c9c76a","signature":"eecf7038a027a976dd44857aaf8441507a25269c5474bcc76c86cba55a9aad24","impliedFormat":99},{"version":"2aa791364e468913f4e5607ffcf874886d901a08560244048fc3653f0e6929c5","signature":"01db02a2c497036345f033c8130570e57bf93d322be8fce4cace4c12c7fdce7f","impliedFormat":99},{"version":"713e41cbd86c527a2ac08e91f83a8775d7694830d3df1101d230f6b57d67c1a0","signature":"eac9767f53c827e9bdd8e3f03151f290b1f51b4de497bd097c69c8524c4d70aa","impliedFormat":99},{"version":"34a402b5f13e4abb81d8a5c2167f32820e1daeeb6b7d02df8bdb7a8c911d1588","signature":"71c29ff4bf6244b082ac553e380e1f576f49bbef97799bb4dc03375af1867586","impliedFormat":99},{"version":"10636484477817ab4b32aadab85f3090348e0c948d3d9204c79a5ce05d2ceddc","signature":"640b0acfcf3f9bf2e8ee495a43ad3865cc0d7e0c23ec53802d0f12ce11f40a88","impliedFormat":99},{"version":"d9ffeccec061cdf206608d148a8ca581ce3d56d224a4e50cadefdbb17db418ba","signature":"cbfbed4895ed6832b3b2e39beefa7513668501b4d40c85150f9d3da583f73909","impliedFormat":99},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"316f1486e15cbf7896425f0a16dfe12d447dd57cfb3244b8b119c77df870858f","impliedFormat":99},{"version":"87ef1212520b37d6a12a7fe8dd7eecb39ba487c0ff299a0ef1e6c97cc2f9b886","signature":"481db2f63d57f4245087aa692c76c8069e3509c841cfd79f95ba25093613aa0c","impliedFormat":99},{"version":"fe0c119587fec41cc1c40c5727cf34b4d42ccece7c5a6d85fb3f117dbd25f3f2","signature":"de0562e1297ae9acf747b4614b60820dd94f4b685802471163840e00e020147f","impliedFormat":99},{"version":"a8e9ff0b8a9f577e4229a2c2df6a41afc6ff34e4001c628071fae25cc445e416","signature":"3fa7a0a99986764a4aa6831ae9c24cd300b43be50b1bf7fd57f1ba70f0f2654d","impliedFormat":99},{"version":"acfb723d81eda39156251aed414c553294870bf53062429ebfcfba8a68cb4753","impliedFormat":99},{"version":"fa69a90381c2f85889722a911a732a5ee3596dc3acecda8a9aa2fa89b9615d8d","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"57e9e1b0911874c62d743af24b5d56032759846533641d550b12a45ff404bf07","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"854cd3a3375ffc4e7a92b2168dd065d7ff2614b43341038a65cca865a44c00c5","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"2f863ee9b873a65d9c3338ea7aaddbdb41a9673f062f06983d712bd01c25dc6b","impliedFormat":99},{"version":"67aa128c2bc170b93794f191feffc65a4b33e878db211cfcb7658c4b72f7a1f5","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"c35b8117804c639c53c87f2c23e0c786df61d552e513bd5179f5b88e29964838","impliedFormat":99},{"version":"c609331c6ed4ad4af54e101088c6a4dcb48f8db7b0b97e44a6efeb130f4331bd","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"67acaedb46832d66c15f1b09fb7b6a0b7f41bdbf8eaa586ec70459b3e8896eb9","impliedFormat":99},{"version":"4535ab977ee871e956eb7bebe2db5de79f5d5ec7dfbbf1d35e08f4a2d6630dac","impliedFormat":99},{"version":"b79b5ed99f26ffb2f8ae4bdcc4b34a9542197dc3fa96cfb425c2a81e618cff28","impliedFormat":99},{"version":"31fd7c12f6e27154efb52a916b872509a771880f3b20f2dfd045785c13aa813f","impliedFormat":99},{"version":"b481de4ab5379bd481ca12fc0b255cdc47341629a22c240a89cdb4e209522be2","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"4e258d11c899cb9ff36b4b5c53df59cf4a5ccae9a9931529686e77431e0a3518","affectsGlobalScope":true,"impliedFormat":99},{"version":"a5ae67a67f786ffe92d34b55467a40fb50fb0093e92388cadce6168fa42690fd","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"a534e61c2f06a147d97aebad720db97dffd8066b7142212e46bcbcdcb640b81a","impliedFormat":99},{"version":"ddf569d04470a4d629090d43a16735185001f3fcf0ae036ead99f2ceab62be48","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"53c448183c7177c83d3eb0b40824cf8952721a6584cf22052adc24f778986732","impliedFormat":99},{"version":"54a4cce05fa67f1c824de6b39d1c6d422608974ffadace4f079a3e3f8be5896d","signature":"403ad65a4002e9aee37f04cdcfec35d962d121426201ecd1d78195d37342deb7","impliedFormat":99},{"version":"4fba5e6ca8f529a51e18bb1e7d0a816c0e3f0a08470da35859a7bbb6cdeed2ca","signature":"b6831e080e60b84a24614a97a346adc8797198cd60394a0366e72c75e4374913","impliedFormat":99},{"version":"db2d671d82182c19252a67f1dd547984825ae60eebdd4838f3f2258b79429c6d","signature":"dd4c9eee30bd732383a408edbacb0e351cde7529dca13c898338e7d20fcaa8f3","impliedFormat":99},{"version":"ebd89e7eff37f9eec8bd34caf300ce002342ed3ff788b534080edfe7b1f7dd67","signature":"a2036e9d5d7d56c883b0503f25a9985b2d98c117bcccf10190d7a24ec672632e","impliedFormat":99},{"version":"556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1},{"version":"1ba59c8bbeed2cb75b239bb12041582fa3e8ef32f8d0bd0ec802e38442d3f317","impliedFormat":1}],"root":[[161,179],[190,192],[237,240]],"options":{"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":199,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":9},"referencedMap":[[243,1],[241,2],[220,2],[246,3],[242,1],[244,4],[245,1],[160,5],[187,6],[223,7],[186,8],[221,2],[247,2],[183,9],[188,10],[184,2],[108,11],[109,11],[110,12],[65,13],[111,14],[112,15],[113,16],[60,2],[63,17],[61,2],[62,2],[114,18],[115,19],[116,20],[117,21],[118,22],[119,23],[120,23],[121,24],[122,25],[123,26],[124,27],[66,2],[64,2],[125,28],[126,29],[127,30],[159,31],[128,32],[129,33],[130,34],[131,35],[132,36],[133,37],[134,38],[135,39],[136,40],[137,41],[138,41],[139,42],[140,2],[141,43],[143,44],[142,45],[144,46],[145,47],[146,48],[147,49],[148,50],[149,51],[150,52],[151,53],[152,54],[153,55],[154,56],[155,57],[156,58],[67,2],[68,2],[69,2],[107,59],[157,60],[158,61],[181,2],[182,2],[251,62],[248,2],[250,63],[180,64],[185,65],[189,66],[252,66],[224,67],[193,2],[203,68],[199,69],[202,70],[225,71],[210,2],[212,72],[211,73],[218,2],[201,74],[194,75],[196,76],[198,77],[197,2],[200,75],[195,2],[222,2],[59,78],[58,2],[249,2],[233,79],[235,80],[234,81],[232,82],[231,2],[226,2],[219,2],[56,2],[57,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[55,2],[54,2],[1,2],[85,83],[95,84],[84,83],[105,85],[76,86],[75,87],[104,88],[98,89],[103,90],[78,91],[92,92],[77,93],[101,94],[73,95],[72,88],[102,96],[74,97],[79,98],[80,2],[83,98],[70,2],[106,99],[96,100],[87,101],[88,102],[90,103],[86,104],[89,105],[99,88],[81,106],[82,107],[91,108],[71,109],[94,100],[93,98],[97,2],[100,110],[206,111],[209,112],[207,111],[205,2],[208,113],[227,114],[217,115],[213,116],[214,69],[230,117],[228,118],[215,119],[229,120],[204,2],[216,121],[236,122],[192,123],[237,124],[165,125],[162,125],[238,126],[163,125],[239,127],[166,128],[240,129],[164,130],[172,131],[169,132],[171,133],[176,133],[177,134],[170,132],[168,132],[178,135],[179,136],[167,2],[175,125],[173,2],[174,125],[161,2],[191,137],[190,138]],"semanticDiagnosticsPerFile":[[177,[{"start":2717,"length":4,"code":2339,"category":1,"messageText":"Property 'text' does not exist on type '{ readonly active: \"green\"; readonly idle: \"yellow\"; readonly error: \"red\"; readonly debug: \"gray\"; readonly info: \"white\"; readonly warn: \"yellow\"; readonly error_level: \"red\"; readonly border: \"blue\"; ... 4 more ...; readonly bgFocus: \"blue\"; }'."},{"start":2742,"length":10,"code":2339,"category":1,"messageText":"Property 'background' does not exist on type '{ readonly active: \"green\"; readonly idle: \"yellow\"; readonly error: \"red\"; readonly debug: \"gray\"; readonly info: \"white\"; readonly warn: \"yellow\"; readonly error_level: \"red\"; readonly border: \"blue\"; ... 4 more ...; readonly bgFocus: \"blue\"; }'."},{"start":3057,"length":4,"code":2339,"category":1,"messageText":"Property 'text' does not exist on type '{ readonly active: \"green\"; readonly idle: \"yellow\"; readonly error: \"red\"; readonly debug: \"gray\"; readonly info: \"white\"; readonly warn: \"yellow\"; readonly error_level: \"red\"; readonly border: \"blue\"; ... 4 more ...; readonly bgFocus: \"blue\"; }'."}]],[192,[{"start":8270,"length":51,"code":2345,"category":1,"messageText":{"messageText":"Argument of type '{ worker?: string | undefined; level?: string | undefined; } | undefined' is not assignable to parameter of type 'EventFilter | undefined'.","category":1,"code":2345,"next":[{"messageText":"Type '{ worker?: string | undefined; level?: string | undefined; }' is not assignable to type 'EventFilter'.","category":1,"code":2322,"next":[{"messageText":"Types of property 'level' are incompatible.","category":1,"code":2326,"next":[{"messageText":"Type 'string | undefined' is not assignable to type 'LogLevel | undefined'.","category":1,"code":2322,"next":[{"messageText":"Type 'string' is not assignable to type 'LogLevel | undefined'.","category":1,"code":2322}],"canonicalHead":{"code":2322,"messageText":"Type '{ worker?: string | undefined; level?: string | undefined; }' is not assignable to type 'EventFilter'."}}]}]}]}}]]],"version":"5.9.3"} \ No newline at end of file