make-laten 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/read.ts","../../src/compress/confidence.ts","../../src/compress/file-read.ts","../../src/cli/commands/grep.ts","../../src/compress/grep.ts","../../src/cli/commands/git.ts","../../src/compress/git-diff.ts","../../src/graph/database.ts","../../src/cache/l1-session.ts","../../src/cache/l2-cross.ts","../../src/cache/index.ts","../../src/cli/commands/cache.ts","../../src/web/backends/duckduckgo.ts","../../src/web/backends/index.ts","../../src/web/extractor.ts","../../src/web/compressor.ts","../../src/web/router.ts","../../src/cli/commands/web.ts","../../src/adapter/installer.ts","../../src/cli/commands/install.ts","../../src/cli/commands/init.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { readCommand } from './commands/read.js'\nimport { grepCommand } from './commands/grep.js'\nimport { gitDiffCommand, gitStatusCommand } from './commands/git.js'\nimport { cacheStatsCommand, cacheClearCommand } from './commands/cache.js'\nimport { searchCommand, fetchCommand } from './commands/web.js'\nimport { installCommand } from './commands/install.js'\nimport { initCommand } from './commands/init.js'\n\nconst program = new Command()\n\nprogram\n .name('make-laten')\n .description('Universal efficiency toolkit for AI coding agents')\n .version('1.0.3')\n\nprogram\n .command('read')\n .description('Compressed file read')\n .argument('<file>', 'File path')\n .action(readCommand)\n\nprogram\n .command('grep')\n .description('Compressed grep with file grouping')\n .argument('<pattern>', 'Search pattern')\n .argument('[directory]', 'Directory to search', '.')\n .option('-i, --ignore <ext>', 'File extension to ignore')\n .action(grepCommand)\n\nconst gitCmd = program\n .command('git')\n .description('Git operations')\n\ngitCmd\n .command('diff')\n .description('Compressed git diff')\n .option('-s, --staged', 'Show staged changes')\n .action(gitDiffCommand)\n\ngitCmd\n .command('status')\n .description('Git status summary')\n .action(gitStatusCommand)\n\nconst cacheCmd = program\n .command('cache')\n .description('Cache management')\n\ncacheCmd\n .command('stats')\n .description('Show cache statistics')\n .action(cacheStatsCommand)\n\ncacheCmd\n .command('clear')\n .description('Clear cache')\n .action(cacheClearCommand)\n\nprogram\n .command('search')\n .description('Search the web')\n .argument('<query>', 'Search query')\n .option('-b, --backend <backend>', 'Search backend')\n .option('-m, --max <n>', 'Max results', '5')\n .action(searchCommand)\n\nprogram\n .command('fetch')\n .description('Fetch and compress web content')\n .argument('<url>', 'URL to fetch')\n .option('--no-compress', 'Disable compression')\n .option('--no-extract', 'Disable semantic extraction')\n .action(fetchCommand)\n\nprogram\n .command('install')\n .description('Install make-laten across all detected platforms')\n .option('-u, --uninstall', 'Remove adapters')\n .option('-s, --status', 'Show installation status')\n .action(installCommand)\n\nprogram\n .command('init')\n .description('Interactive setup wizard — detect agents & configure MCP')\n .option('-a, --all', 'Configure all detected agents (no prompts)')\n .option('-p, --project', 'Create .mcp.json in current directory only')\n .action(initCommand)\n\nprogram.parse()\n","import fs from 'fs/promises'\nimport { FileReadCompressor } from '../../compress/file-read.js'\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const langMap: Record<string, string> = {\n ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript',\n py: 'python', rs: 'rust', go: 'go', java: 'java', rb: 'ruby',\n json: 'json', yaml: 'yaml', yml: 'yaml', md: 'markdown'\n }\n return langMap[ext] || 'text'\n}\n\nexport async function readCommand(filePath: string): Promise<void> {\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n const compressor = new FileReadCompressor()\n \n const result = await compressor.compress({\n content,\n filePath,\n language: detectLanguage(filePath)\n })\n\n console.log(JSON.stringify({\n file: filePath,\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error) {\n console.error(`Error reading ${filePath}:`, error)\n process.exit(1)\n }\n}\n","export function calculateConfidence(original: string, compressed: string): number {\n if (!original.length) return 0\n\n let score = 1.0\n\n // Penalize if too much dropped\n const ratio = compressed.length / original.length\n if (ratio < 0.01) score -= 0.5\n else if (ratio < 0.05) score -= 0.3\n\n // Penalize if code blocks were modified\n if (codeBlocksModified(original, compressed)) score -= 0.4\n\n // Bonus for known patterns\n if (isKnownPattern(original)) score += 0.1\n\n return Math.max(0, Math.min(1, score))\n}\n\nfunction codeBlocksModified(original: string, compressed: string): boolean {\n const codeBlockRegex = /```[\\s\\S]*?```/g\n const originalBlocks = original.match(codeBlockRegex) || []\n const compressedBlocks = compressed.match(codeBlockRegex) || []\n\n if (originalBlocks.length !== compressedBlocks.length) return true\n\n for (let i = 0; i < originalBlocks.length; i++) {\n if (originalBlocks[i] !== compressedBlocks[i]) return true\n }\n\n return false\n}\n\nfunction isKnownPattern(content: string): boolean {\n const patterns = [\n /export\\s+(default\\s+)?(function|class|const|let|var)/,\n /import\\s+.*from\\s+['\"]/\n ]\n return patterns.some(p => p.test(content))\n}\n","import type { Compressor, CompressedResult, FileReadInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class FileReadCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { content, filePath, language } = input as FileReadInput\n \n const signatures = this.extractSignatures(content, language)\n const exports = this.extractExports(content)\n \n const lines = [\n `// ${filePath} (${content.split('\\n').length} lines)`,\n '',\n ...signatures,\n '',\n '// Exports:',\n ...exports\n ]\n \n const compressed = lines.join('\\n')\n \n return {\n content: compressed,\n original: content,\n confidence: calculateConfidence(content, compressed),\n metadata: {\n strategy: 'signatures',\n originalLines: content.split('\\n').length,\n compressedLines: lines.length,\n savings: 1 - (compressed.length / content.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private extractSignatures(content: string, language?: string): string[] {\n const signatures: string[] = []\n const lines = content.split('\\n')\n \n for (const line of lines) {\n const trimmed = line.trim()\n \n if (/^(export\\s+)?(async\\s+)?function\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed.replace(/\\{[\\s\\S]*$/, '{ ... }'))\n }\n \n if (/^(export\\s+)?class\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed)\n }\n \n if (/^(export\\s+)?(type|interface)\\s+\\w+/.test(trimmed)) {\n signatures.push(trimmed)\n }\n }\n \n return signatures\n }\n\n private extractExports(content: string): string[] {\n const exports: string[] = []\n const exportRegex = /export\\s+(default\\s+)?(function|class|const|let|var|type|interface)\\s+(\\w+)/g\n let match\n \n while ((match = exportRegex.exec(content)) !== null) {\n exports.push(` - ${match[3]} (${match[2]})`)\n }\n \n return exports\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GrepCompressor } from '../../compress/grep.js'\n\nconst execAsync = promisify(exec)\n\ninterface GrepMatch {\n file: string\n line: number\n content: string\n}\n\nfunction parseGrepOutput(output: string): GrepMatch[] {\n const matches: GrepMatch[] = []\n const lines = output.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n const parts = line.split(':')\n if (parts.length >= 3) {\n matches.push({\n file: parts[0],\n line: parseInt(parts[1], 10) || 0,\n content: parts.slice(2).join(':').trim()\n })\n }\n }\n\n return matches\n}\n\nexport async function grepCommand(pattern: string, directory: string, options: { ignore?: string }): Promise<void> {\n try {\n let cmd = `grep -rn \"${pattern}\" ${directory}`\n if (options.ignore) {\n cmd += ` --include=\"*.${options.ignore}\"`\n }\n\n const { stdout } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024 })\n const matches = parseGrepOutput(stdout)\n\n if (matches.length === 0) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n return\n }\n\n const compressor = new GrepCompressor()\n const result = await compressor.compress({\n results: matches,\n pattern,\n directory\n })\n\n console.log(JSON.stringify({\n pattern,\n directory,\n compressed: result.content,\n confidence: result.confidence,\n total: matches.length,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n if (error.code === 1) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n } else {\n console.error(`Error grep:`, error.message)\n process.exit(1)\n }\n }\n}\n","import type { Compressor, CompressedResult, GrepInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GrepCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { results } = input as GrepInput\n \n // Group by file\n const grouped = this.groupByFile(results)\n \n // Format output\n const lines: string[] = []\n for (const [file, matches] of grouped) {\n lines.push(`${file} (${matches.length} matches)`)\n const unique = this.deduplicate(matches)\n for (const match of unique) {\n lines.push(` L${match.line}: ${match.content}`)\n }\n }\n \n const compressed = lines.join('\\n')\n const original = results.map(r => `${r.file}:${r.line}: ${r.content}`).join('\\n')\n \n return {\n content: compressed,\n original,\n confidence: calculateConfidence(original, compressed),\n metadata: {\n strategy: 'grouped',\n totalMatches: results.length,\n uniqueFiles: grouped.size,\n savings: 1 - (compressed.length / original.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private groupByFile(results: GrepInput['results']): Map<string, GrepInput['results']> {\n const grouped = new Map<string, GrepInput['results']>()\n \n for (const result of results) {\n const existing = grouped.get(result.file) || []\n existing.push(result)\n grouped.set(result.file, existing)\n }\n \n return grouped\n }\n\n private deduplicate(matches: GrepInput['results']): GrepInput['results'] {\n const seen = new Set<string>()\n return matches.filter(match => {\n const key = match.content.trim()\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GitDiffCompressor } from '../../compress/git-diff.js'\n\nconst execAsync = promisify(exec)\n\nexport async function gitDiffCommand(options: { staged?: boolean }): Promise<void> {\n try {\n const flag = options.staged ? '--staged' : ''\n const { stdout } = await execAsync(`git diff ${flag}`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n console.log(JSON.stringify({ diff: '', changes: 0 }))\n return\n }\n\n const compressor = new GitDiffCompressor()\n const result = await compressor.compress({ diff: stdout })\n\n console.log(JSON.stringify({\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git diff:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function gitStatusCommand(): Promise<void> {\n try {\n const { stdout } = await execAsync('git status --porcelain')\n const lines = stdout.split('\\n').filter(Boolean)\n\n const files = lines.map(line => ({\n status: line[0],\n path: line.slice(3)\n }))\n\n console.log(JSON.stringify({\n total: files.length,\n files\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git status:`, error.message)\n process.exit(1)\n }\n}\n","import type { Compressor, CompressedResult, GitDiffInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GitDiffCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { diff } = input as GitDiffInput\n \n // Parse diff into hunks\n const hunks = this.parseDiff(diff)\n \n // Condense each hunk\n const condensed = hunks.map(hunk => ({\n file: hunk.file,\n changes: this.condenseHunk(hunk),\n stats: { additions: hunk.additions, deletions: hunk.deletions }\n }))\n \n // Format output\n const lines: string[] = []\n for (const hunk of condensed) {\n if (hunk.changes.length > 0) {\n lines.push(`${hunk.file} (+${hunk.stats.additions} -${hunk.stats.deletions})`)\n lines.push(...hunk.changes)\n }\n }\n \n const compressed = lines.join('\\n')\n \n return {\n content: compressed,\n original: diff,\n confidence: calculateConfidence(diff, compressed),\n metadata: {\n strategy: 'condensed',\n filesChanged: condensed.length,\n savings: 1 - (compressed.length / diff.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private parseDiff(diff: string): Hunk[] {\n const hunks: Hunk[] = []\n const lines = diff.split('\\n')\n \n let currentHunk: Hunk | null = null\n \n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n if (currentHunk) hunks.push(currentHunk)\n const fileMatch = line.match(/b\\/(.+)/)\n currentHunk = {\n file: fileMatch?.[1] || 'unknown',\n lines: [],\n additions: 0,\n deletions: 0\n }\n } else if (currentHunk) {\n if (line.startsWith('+')) {\n currentHunk.additions++\n currentHunk.lines.push({ type: 'addition', content: line.slice(1) })\n } else if (line.startsWith('-')) {\n currentHunk.deletions++\n currentHunk.lines.push({ type: 'deletion', content: line.slice(1) })\n }\n }\n }\n \n if (currentHunk) hunks.push(currentHunk)\n return hunks\n }\n\n private condenseHunk(hunk: Hunk): string[] {\n return hunk.lines\n .filter(l => l.type === 'addition' || l.type === 'deletion')\n .map(l => `${l.type === 'addition' ? '+' : '-'} ${l.content}`)\n }\n}\n\ninterface Hunk {\n file: string\n lines: { type: string; content: string }[]\n additions: number\n deletions: number\n}\n","import Database from 'better-sqlite3'\n\nexport type Database = Database.Database\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n original TEXT,\n embedding BLOB,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n accessed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n access_count INTEGER DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source TEXT NOT NULL,\n target TEXT NOT NULL,\n type TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n metadata TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n FOREIGN KEY (source) REFERENCES nodes(id),\n FOREIGN KEY (target) REFERENCES nodes(id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);\nCREATE INDEX IF NOT EXISTS idx_nodes_created ON nodes(created_at);\nCREATE INDEX IF NOT EXISTS idx_nodes_accessed ON nodes(accessed_at);\nCREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source);\nCREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target);\nCREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);\n`\n\nexport async function createDatabase(dbPath: string): Promise<Database> {\n const db = new Database(dbPath)\n db.pragma('journal_mode = WAL')\n db.pragma('foreign_keys = ON')\n \n db.exec(SCHEMA)\n \n return db\n}","export interface CacheEntry {\n content: string\n metadata: Record<string, any>\n}\n\nexport interface CacheStats {\n hits: number\n misses: number\n size: number\n hitRate: number\n}\n\nexport class SessionCache {\n private store = new Map<string, CacheEntry>()\n private hits = 0\n private misses = 0\n\n get(key: string): CacheEntry | null {\n const entry = this.store.get(key)\n if (entry) {\n this.hits++\n return entry\n }\n this.misses++\n return null\n }\n\n set(key: string, value: CacheEntry): void {\n this.store.set(key, value)\n }\n\n clear(): void {\n this.store.clear()\n this.hits = 0\n this.misses = 0\n }\n\n stats(): CacheStats {\n const total = this.hits + this.misses\n return {\n hits: this.hits,\n misses: this.misses,\n size: this.store.size,\n hitRate: total > 0 ? this.hits / total : 0\n }\n }\n}\n","import type { Database } from '../graph/database.js'\nimport type { CacheEntry } from './l1-session.js'\n\ninterface CacheOptions {\n ttl?: number\n}\n\nexport class CrossSessionCache {\n constructor(private db: Database) {}\n\n async get(key: string): Promise<CacheEntry | null> {\n const row = this.db.prepare(`\n SELECT content, metadata, created_at \n FROM nodes \n WHERE id = ? AND type = 'cache'\n `).get(key) as { content: string; metadata: string; created_at: number } | undefined\n\n if (!row) return null\n\n const metadata = JSON.parse(row.metadata)\n if (metadata.ttl) {\n const age = Date.now() / 1000 - row.created_at\n if (age > metadata.ttl) {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n return null\n }\n }\n\n this.db.prepare(`\n UPDATE nodes SET accessed_at = unixepoch(), access_count = access_count + 1\n WHERE id = ?\n `).run(key)\n\n return {\n content: row.content,\n metadata: JSON.parse(row.metadata)\n }\n }\n\n async set(key: string, value: CacheEntry, options?: CacheOptions): Promise<void> {\n this.db.prepare(`\n INSERT INTO nodes (id, type, content, metadata, created_at, accessed_at, access_count)\n VALUES (?, 'cache', ?, ?, unixepoch(), unixepoch(), 1)\n ON CONFLICT(id) DO UPDATE SET\n content = excluded.content,\n metadata = excluded.metadata,\n accessed_at = unixepoch(),\n access_count = access_count + 1\n `).run(key, value.content, JSON.stringify({ ...value.metadata, ttl: options?.ttl }))\n }\n\n async delete(key: string): Promise<void> {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n }\n\n async clear(): Promise<void> {\n this.db.prepare(\"DELETE FROM nodes WHERE type = 'cache'\").run()\n }\n}\n","import type { Database } from '../graph/database.js'\nimport { SessionCache, type CacheEntry, type CacheStats } from './l1-session.js'\nimport { CrossSessionCache } from './l2-cross.js'\nimport { SemanticCache } from './semantic.js'\n\nexport interface UnifiedCacheStats {\n l1: CacheStats\n l2: { size: number }\n}\n\nexport function createCacheManager(db?: Database) {\n const session = new SessionCache()\n const crossSession = db ? new CrossSessionCache(db) : (null as any)\n const semantic = new SemanticCache()\n\n return {\n session,\n crossSession,\n semantic\n }\n}\n\nexport function makeLatenCache(db: Database) {\n const l1 = new SessionCache()\n const l2 = new CrossSessionCache(db)\n\n return {\n l1,\n l2,\n\n async get(key: string): Promise<CacheEntry | null> {\n const l1Result = l1.get(key)\n if (l1Result) return l1Result\n\n const l2Result = await l2.get(key)\n if (l2Result) {\n l1.set(key, l2Result)\n return l2Result\n }\n\n return null\n },\n\n async set(key: string, value: CacheEntry, options?: { ttl?: number }): Promise<void> {\n l1.set(key, value)\n await l2.set(key, value, options)\n },\n\n async invalidate(pattern: string): Promise<void> {\n l1.clear()\n await l2.clear()\n },\n\n stats(): UnifiedCacheStats {\n return {\n l1: l1.stats(),\n l2: { size: 0 }\n }\n }\n }\n}\n\nexport { SessionCache, CrossSessionCache, SemanticCache }\nexport type { CacheEntry, CacheStats }\n","import { createDatabase } from '../../graph/database.js'\nimport { makeLatenCache } from '../../cache/index.js'\n\nexport async function cacheStatsCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n const stats = cache.stats()\n\n console.log(JSON.stringify({\n l1: {\n hits: stats.l1.hits,\n misses: stats.l1.misses,\n size: stats.l1.size,\n hitRate: `${(stats.l1.hitRate * 100).toFixed(1)}%`\n },\n l2: {\n size: stats.l2.size\n }\n }, null, 2))\n\n db.close()\n } catch (error: any) {\n console.error(`Error cache stats:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function cacheClearCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n await cache.invalidate('*')\n\n console.log(JSON.stringify({ cleared: true }))\n db.close()\n } catch (error: any) {\n console.error(`Error cache clear:`, error.message)\n process.exit(1)\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\n\nexport class DuckDuckGoBackend implements WebBackend {\n name = 'duckduckgo'\n\n isAvailable(): boolean {\n return true\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const maxResults = options?.maxResults || 5\n\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; make-laten/0.1.0)'\n }\n })\n\n const html = await response.text()\n return this.parseResults(html, maxResults)\n }\n\n private parseResults(html: string, maxResults: number): SearchResult[] {\n const results: SearchResult[] = []\n const resultRegex = /<a[^>]*class=\"result__a\"[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n const snippetRegex = /<a[^>]*class=\"result__snippet\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n let match: RegExpExecArray | null\n\n const urls: string[] = []\n const titles: string[] = []\n\n while ((match = resultRegex.exec(html)) !== null && urls.length < maxResults) {\n const rawUrl = match[1]\n const urlMatch = rawUrl.match(/uddg=([^&]+)/)\n const url = urlMatch ? decodeURIComponent(urlMatch[1]) : rawUrl\n const title = this.stripTags(match[2]).trim()\n\n if (url && title) {\n urls.push(url)\n titles.push(title)\n }\n }\n\n const snippets: string[] = []\n while ((match = snippetRegex.exec(html)) !== null && snippets.length < maxResults) {\n snippets.push(this.stripTags(match[1]).trim())\n }\n\n for (let i = 0; i < urls.length; i++) {\n results.push({\n title: titles[i],\n url: urls[i],\n snippet: snippets[i] || '',\n score: 1 - (i * 0.1)\n })\n }\n\n return results\n }\n\n private stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x27;/g, \"'\").replace(/&quot;/g, '\"')\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\nimport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport function selectBackend(preferred?: string): WebBackend {\n const backends: WebBackend[] = [\n new DuckDuckGoBackend()\n ]\n\n if (preferred) {\n const found = backends.find(b => b.name === preferred)\n if (found) return found\n }\n\n return backends.find(b => b.isAvailable()) || backends[0]\n}\n","import type { SemanticIR, SectionIR, CodeExample } from './types.js'\n\ninterface ParsedNode {\n tag: string\n text: string\n children: ParsedNode[]\n}\n\nfunction parseSimpleHTML(html: string): ParsedNode[] {\n const nodes: ParsedNode[] = []\n const tagRegex = /<(\\w+)([^>]*)>([\\s\\S]*?)<\\/\\1>/g\n let match: RegExpExecArray | null\n\n while ((match = tagRegex.exec(html)) !== null) {\n const tag = match[1]\n const content = match[3]\n\n if (['script', 'style', 'noscript'].includes(tag)) continue\n\n nodes.push({\n tag,\n text: stripTags(content).trim(),\n children: content.includes('<') ? parseSimpleHTML(content) : []\n })\n }\n\n return nodes\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\")\n}\n\nfunction extractTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n if (titleMatch) return stripTags(titleMatch[1]).trim()\n\n const h1Match = html.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i)\n if (h1Match) return stripTags(h1Match[1]).trim()\n\n return 'Untitled'\n}\n\nfunction extractSections(html: string): SectionIR[] {\n const sections: SectionIR[] = []\n const headingRegex = /<h([1-6])[^>]*>([\\s\\S]*?)<\\/h\\1>/gi\n let match: RegExpExecArray | null\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const heading = stripTags(match[2]).trim()\n\n const startPos = match.index + match[0].length\n const nextHeading = html.substring(startPos).match(/<h[1-6]/i)\n const endPos = nextHeading ? startPos + nextHeading.index! : html.length\n const content = stripTags(html.substring(startPos, endPos)).trim()\n\n if (!content) continue\n\n const importance = level <= 2 ? 'primary' : level <= 4 ? 'secondary' : 'tertiary'\n\n sections.push({ heading, level, content, importance })\n }\n\n return sections\n}\n\nfunction extractCodeExamples(html: string): CodeExample[] {\n const examples: CodeExample[] = []\n const codeRegex = /<(?:pre|code)[^>]*>[\\s\\S]*?<(?:code|\\/pre)[^>]*>/gi\n const blockRegex = /<pre[^>]*><code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi\n let match: RegExpExecArray | null\n\n while ((match = blockRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 10) {\n examples.push({ language, code })\n }\n }\n\n const inlineRegex = /<code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code>/gi\n while ((match = inlineRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 20 && !examples.some(e => e.code === code)) {\n examples.push({ language, code })\n }\n }\n\n return examples.slice(0, 10)\n}\n\nfunction extractKeyPoints(sections: SectionIR[]): string[] {\n const keyPoints: string[] = []\n\n for (const section of sections.filter(s => s.importance === 'primary')) {\n const sentences = section.content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10)\n if (sentences.length > 0) {\n keyPoints.push(sentences[0].trim())\n }\n }\n\n return keyPoints.slice(0, 5)\n}\n\nfunction classifyPurpose(html: string, sections: SectionIR[]): SemanticIR['purpose'] {\n const text = (html + ' ' + sections.map(s => s.heading).join(' ')).toLowerCase()\n\n if (text.includes('api reference') || text.includes('endpoint') || text.includes('parameters')) return 'reference'\n if (text.includes('tutorial') || text.includes('step by step') || text.includes('getting started')) return 'tutorial'\n if (text.includes('blog') || text.includes('published') || text.includes('author')) return 'blog'\n if (text.includes('install') || text.includes('quickstart') || text.includes('overview')) return 'documentation'\n\n return 'documentation'\n}\n\nexport function extractSemantic(html: string, url: string): SemanticIR {\n const title = extractTitle(html)\n const sections = extractSections(html)\n const codeExamples = extractCodeExamples(html)\n const keyPoints = extractKeyPoints(sections)\n const purpose = classifyPurpose(html, sections)\n\n return {\n type: 'webpage',\n url,\n title,\n purpose,\n sections,\n keyPoints,\n codeExamples,\n metadata: {\n language: html.match(/lang=\"(\\w+)\"/)?.[1] || 'en',\n author: html.match(/<meta[^>]*name=\"author\"[^>]*content=\"([^\"]+)\"/i)?.[1],\n tags: html.match(/<meta[^>]*name=\"keywords\"[^>]*content=\"([^\"]+)\"/i)?.[1]?.split(',').map(t => t.trim())\n }\n }\n}\n","import type { SemanticIR, SectionIR } from './types.js'\n\nexport interface CompressOptions {\n maxTokens?: number\n includeCode?: boolean\n includeSections?: 'all' | 'primary' | 'none'\n}\n\nexport function compressWebContent(semantic: SemanticIR, options: CompressOptions = {}): string {\n const { maxTokens = 1000, includeCode = true, includeSections = 'all' } = options\n const lines: string[] = []\n\n lines.push(`# ${semantic.title}`)\n lines.push(`URL: ${semantic.url}`)\n lines.push(`Purpose: ${semantic.purpose}`)\n lines.push('')\n\n if (semantic.keyPoints.length > 0) {\n lines.push('## Key Points')\n for (const point of semantic.keyPoints) {\n lines.push(`- ${point}`)\n }\n lines.push('')\n }\n\n const filteredSections = filterSections(semantic.sections, includeSections)\n\n for (const section of filteredSections) {\n const content = truncateContent(section.content, 500)\n lines.push(`## ${section.heading}`)\n lines.push(content)\n lines.push('')\n }\n\n if (includeCode && semantic.codeExamples.length > 0) {\n const topExamples = semantic.codeExamples.slice(0, 3)\n lines.push('## Code Examples')\n for (const example of topExamples) {\n lines.push(`\\`\\`\\`${example.language}`)\n lines.push(truncateContent(example.code, 300))\n lines.push('```')\n lines.push('')\n }\n }\n\n let result = lines.join('\\n')\n\n const estimatedTokens = estimateTokens(result)\n if (estimatedTokens > maxTokens) {\n result = truncateByTokens(result, maxTokens)\n }\n\n return result\n}\n\nfunction filterSections(sections: SectionIR[], mode: 'all' | 'primary' | 'none'): SectionIR[] {\n if (mode === 'none') return []\n if (mode === 'primary') return sections.filter(s => s.importance === 'primary')\n return sections\n}\n\nfunction truncateContent(content: string, maxLength: number): string {\n if (content.length <= maxLength) return content\n return content.slice(0, maxLength) + '...'\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\nfunction truncateByTokens(text: string, maxTokens: number): string {\n const maxChars = maxTokens * 4\n if (text.length <= maxChars) return text\n\n const truncated = text.slice(0, maxChars)\n const lastNewline = truncated.lastIndexOf('\\n')\n\n return truncated.slice(0, lastNewline > 0 ? lastNewline : maxChars) + '\\n\\n... (truncated)'\n}\n","import type { SearchOptions, SearchResult, FetchOptions, FetchResult } from './types.js'\nimport { selectBackend } from './backends/index.js'\nimport { extractSemantic } from './extractor.js'\nimport { compressWebContent } from './compressor.js'\n\nexport class WebRouter {\n private fetchCache: Map<string, FetchResult> = new Map()\n private searchCache: Map<string, SearchResult[]> = new Map()\n private cacheTtl: number\n\n constructor(options?: { cacheTtlMs?: number }) {\n this.cacheTtl = options?.cacheTtlMs || 60 * 60 * 1000\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${JSON.stringify(options || {})}`\n\n const cached = this.searchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n\n const backend = selectBackend(options?.backend)\n const results = await backend.search(query, options)\n\n this.searchCache.set(cacheKey, results)\n this.storeFreshness(cacheKey)\n\n return results\n }\n\n async fetch(url: string, options?: FetchOptions): Promise<FetchResult> {\n const cacheKey = `fetch:${url}:${options?.format || 'text'}`\n\n if (options?.cache !== false) {\n const cached = this.fetchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n }\n\n const startTime = Date.now()\n const response = await fetch(url)\n const html = await response.text()\n const originalSize = html.length\n\n let content: string\n let semantic = undefined\n\n if (options?.extract !== false) {\n semantic = extractSemantic(html, url)\n content = compressWebContent(semantic, {\n includeCode: true,\n includeSections: options?.format === 'html' ? 'all' : 'primary'\n })\n } else {\n content = html\n }\n\n const compressedSize = content.length\n const result: FetchResult = {\n url,\n title: semantic?.title || extractSimpleTitle(html),\n content,\n semantic,\n metadata: {\n fetchTime: Date.now() - startTime,\n originalSize,\n compressedSize,\n savings: 1 - (compressedSize / originalSize)\n }\n }\n\n if (options?.cache !== false) {\n this.fetchCache.set(cacheKey, result)\n this.storeFreshness(cacheKey)\n }\n\n return result\n }\n\n async extract(url: string): Promise<FetchResult> {\n return this.fetch(url, { extract: true, compress: true })\n }\n\n async summarize(content: string, options?: { maxTokens?: number }): Promise<string> {\n const lines = content.split('\\n')\n const summaryLines: string[] = []\n let tokenCount = 0\n const maxTokens = options?.maxTokens || 200\n\n for (const line of lines) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n\n if (line.startsWith('#') || line.startsWith('-') || line.startsWith('*')) {\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n if (summaryLines.length === 0 && lines.length > 0) {\n for (const line of lines.slice(0, 5)) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n return summaryLines.join('\\n')\n }\n\n clearCache(): void {\n this.fetchCache.clear()\n this.searchCache.clear()\n }\n\n getCacheStats(): { fetchSize: number; searchSize: number } {\n return {\n fetchSize: this.fetchCache.size,\n searchSize: this.searchCache.size\n }\n }\n\n private isFresh(key: string): boolean {\n const timestamp = this.freshness.get(key)\n if (!timestamp) return false\n return Date.now() - timestamp < this.cacheTtl\n }\n\n private storeFreshness(key: string): void {\n this.freshness.set(key, Date.now())\n }\n\n private freshness: Map<string, number> = new Map()\n}\n\nfunction extractSimpleTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n return titleMatch ? titleMatch[1].replace(/<[^>]+>/g, '').trim() : 'Untitled'\n}\n","import { WebRouter } from '../../web/router.js'\n\nexport async function searchCommand(query: string, options: { backend?: string; max?: number }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const results = await router.search(query, {\n maxResults: options.max || 5,\n backend: options.backend\n })\n\n console.log(JSON.stringify({\n query,\n total: results.length,\n results: results.map(r => ({\n title: r.title,\n url: r.url,\n snippet: r.snippet,\n score: r.score\n }))\n }, null, 2))\n } catch (error: any) {\n console.error(`Error search:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function fetchCommand(url: string, options: { compress?: boolean; extract?: boolean }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const result = await router.fetch(url, {\n compress: options.compress !== false,\n extract: options.extract !== false,\n cache: true\n })\n\n console.log(JSON.stringify({\n url: result.url,\n title: result.title,\n content: result.content,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error fetch:`, error.message)\n process.exit(1)\n }\n}\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\n\nconst execAsync = promisify(exec)\n\nconst RULES_CONTENT = `\n# make-laten efficiency rules\n\n## Token Optimization\n- When reading files, use \\`make-laten read <file>\\` for compressed output\n- When searching code, use \\`make-laten grep <pattern>\\` for grouped results\n- When checking git, use \\`make-laten git diff\\` for condensed output\n- When fetching web, use \\`make-laten fetch <url>\\` for compressed content\n\n## Quick Commands\n- \\`mread <file>\\` — alias for make-laten read\n- \\`mgrep <pattern>\\` — alias for make-laten grep\n- \\`mdiff\\` — alias for make-laten git diff\n- \\`msearch <query>\\` — alias for make-laten search\n- \\`mfetch <url>\\` — alias for make-laten fetch\n`\n\ninterface AgentSetup {\n name: string\n detected: () => Promise<boolean>\n install: () => Promise<void>\n uninstall: () => Promise<void>\n}\n\nfunction getHome(): string {\n return process.env.HOME || process.env.USERPROFILE || ''\n}\n\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execAsync(`which ${cmd}`, { timeout: 3000 })\n return true\n } catch {\n return false\n }\n}\n\nasync function fileContains(filePath: string, text: string): Promise<boolean> {\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n return content.includes(text)\n } catch {\n return false\n }\n}\n\nconst agents: AgentSetup[] = [\n {\n name: 'terminal (shell aliases)',\n detected: async () => true,\n install: async () => {\n const shellInit = await execAsync('echo $SHELL').then(r => r.stdout.trim())\n const rcFile = shellInit.includes('zsh') ? '.zshrc' : '.bashrc'\n const rcPath = path.join(getHome(), rcFile)\n const marker = 'make-laten shell'\n\n let existing = ''\n try { existing = await fs.readFile(rcPath, 'utf-8') } catch {}\n\n if (!existing.includes(marker)) {\n const npmRoot = await execAsync('npm root -g').then(r => r.stdout.trim())\n const initScript = `\\n# make-laten shell integration\\nsource ${npmRoot}/make-laten/shell/init.sh\\n`\n await fs.appendFile(rcPath, initScript)\n }\n },\n uninstall: async () => {\n const shellInit = await execAsync('echo $SHELL').then(r => r.stdout.trim())\n const rcFile = shellInit.includes('zsh') ? '.zshrc' : '.bashrc'\n const rcPath = path.join(getHome(), rcFile)\n try {\n let content = await fs.readFile(rcPath, 'utf-8')\n content = content.replace(/\\n# make-laten shell integration\\nsource .*\\/make-laten\\/shell\\/init\\.sh\\n/g, '')\n await fs.writeFile(rcPath, content)\n } catch {}\n }\n },\n {\n name: 'claude-code',\n detected: async () => commandExists('claude'),\n install: async () => {\n const hooksDir = path.join(getHome(), '.claude', 'hooks')\n await fs.mkdir(hooksDir, { recursive: true })\n\n const preHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\nif (input.tool === 'Read' || input.tool === 'Bash') {\n process.env.MAKE_LATEN_INTERCEPT = '1';\n}\nprocess.stdout.write(JSON.stringify(input));`\n\n const postHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\nif (input.output && input.output.length > 10000) {\n input.output = input.output.slice(0, 10000) + '\\\\n... (truncated by make-laten)';\n}\nprocess.stdout.write(JSON.stringify(input));`\n\n await fs.writeFile(path.join(hooksDir, 'pre-tool-use.js'), preHook)\n await fs.writeFile(path.join(hooksDir, 'post-tool-use.js'), postHook)\n },\n uninstall: async () => {\n const hooksDir = path.join(getHome(), '.claude', 'hooks')\n try { await fs.rm(path.join(hooksDir, 'pre-tool-use.js'), { force: true }) } catch {}\n try { await fs.rm(path.join(hooksDir, 'post-tool-use.js'), { force: true }) } catch {}\n }\n },\n {\n name: 'cursor',\n detected: async () => {\n try { await fs.access(path.join(getHome(), '.cursor')); return true } catch { return false }\n },\n install: async () => {\n const rulesDir = path.join(getHome(), '.cursor', 'rules')\n await fs.mkdir(rulesDir, { recursive: true })\n const ruleFile = path.join(rulesDir, 'make-laten.mdc')\n const content = `---\\ndescription: make-laten efficiency rules\\nglobs:\\n---\\n${RULES_CONTENT}`\n await fs.writeFile(ruleFile, content)\n },\n uninstall: async () => {\n try { await fs.rm(path.join(getHome(), '.cursor', 'rules', 'make-laten.mdc'), { force: true }) } catch {}\n }\n },\n {\n name: 'codex',\n detected: async () => commandExists('codex'),\n install: async () => {\n const agentsMd = path.join(process.cwd(), 'AGENTS.md')\n let existing = ''\n try { existing = await fs.readFile(agentsMd, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n const content = existing + '\\n\\n## make-laten Integration\\n' + RULES_CONTENT\n await fs.writeFile(agentsMd, content)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), 'AGENTS.md'), 'utf-8')\n content = content.replace(/\\n## make-laten Integration[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), 'AGENTS.md'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'windsurf',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.windsurf')); return true } catch {\n try { await fs.access(path.join(getHome(), '.windsurf')); return true } catch { return false }\n }\n },\n install: async () => {\n const rulesPath = path.join(process.cwd(), '.windsurfrules')\n let existing = ''\n try { existing = await fs.readFile(rulesPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(rulesPath, existing + '\\n\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.windsurfrules'), 'utf-8')\n content = content.replace(/\\n# make-laten efficiency rules[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.windsurfrules'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'cline',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.clinerules')); return true } catch {\n try { await fs.access(path.join(getHome(), '.cline')); return true } catch { return false }\n }\n },\n install: async () => {\n const rulesPath = path.join(process.cwd(), '.clinerules')\n let existing = ''\n try { existing = await fs.readFile(rulesPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(rulesPath, existing + '\\n\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.clinerules'), 'utf-8')\n content = content.replace(/\\n# make-laten efficiency rules[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.clinerules'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'copilot',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.github')); return true } catch { return false }\n },\n install: async () => {\n const dir = path.join(process.cwd(), '.github')\n await fs.mkdir(dir, { recursive: true })\n const instructionsPath = path.join(dir, 'copilot-instructions.md')\n let existing = ''\n try { existing = await fs.readFile(instructionsPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(instructionsPath, existing + '\\n\\n## make-laten Efficiency\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.github', 'copilot-instructions.md'), 'utf-8')\n content = content.replace(/\\n## make-laten Efficiency[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.github', 'copilot-instructions.md'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'opencode',\n detected: async () => {\n try { await fs.access(path.join(getHome(), '.config', 'opencode')); return true } catch { return false }\n },\n install: async () => {\n const skillsDir = path.join(getHome(), '.config', 'opencode', 'skills', 'make-laten')\n await fs.mkdir(skillsDir, { recursive: true })\n\n const npmRoot = await execAsync('npm root -g').then(r => r.stdout.trim())\n const skillSrc = path.join(npmRoot, 'make-laten', 'skills', 'SKILL.md')\n\n try {\n const skillContent = await fs.readFile(skillSrc, 'utf-8')\n await fs.writeFile(path.join(skillsDir, 'SKILL.md'), skillContent)\n } catch {\n await fs.writeFile(path.join(skillsDir, 'SKILL.md'), `---\\nname: make-laten\\ndescription: Token optimization toolkit\\n---\\n\\n# make-laten Skill\\n\\nUse make-laten CLI commands for all file/code/git operations.\\n`)\n }\n },\n uninstall: async () => {\n try { await fs.rm(path.join(getHome(), '.config', 'opencode', 'skills', 'make-laten'), { recursive: true, force: true }) } catch {}\n }\n }\n]\n\nexport class Installer {\n async install(): Promise<{ installed: string[]; skipped: string[] }> {\n const installed: string[] = []\n const skipped: string[] = []\n\n for (const agent of agents) {\n try {\n const detected = await agent.detected()\n if (detected) {\n await agent.install()\n installed.push(agent.name)\n } else {\n skipped.push(agent.name)\n }\n } catch {\n skipped.push(agent.name)\n }\n }\n\n return { installed, skipped }\n }\n\n async uninstall(): Promise<{ removed: string[] }> {\n const removed: string[] = []\n\n for (const agent of agents) {\n try {\n await agent.uninstall()\n removed.push(agent.name)\n } catch {}\n }\n\n return { removed }\n }\n\n async status(): Promise<{ name: string; detected: boolean; installed: boolean }[]> {\n const result: { name: string; detected: boolean; installed: boolean }[] = []\n\n for (const agent of agents) {\n try {\n const detected = await agent.detected()\n result.push({ name: agent.name, detected, installed: false })\n } catch {\n result.push({ name: agent.name, detected: false, installed: false })\n }\n }\n\n return result\n }\n}\n","import { Installer } from '../../adapter/installer.js'\n\nexport async function installCommand(options: { uninstall?: boolean; status?: boolean }): Promise<void> {\n const installer = new Installer()\n\n if (options.status) {\n console.log('Detecting platforms...\\n')\n const status = await installer.status()\n\n for (const s of status) {\n const icon = s.detected ? '✓' : '○'\n const label = s.detected ? 'detected' : 'not found'\n console.log(` ${icon} ${s.name} (${label})`)\n }\n return\n }\n\n if (options.uninstall) {\n console.log('Uninstalling make-laten from all platforms...\\n')\n const { removed } = await installer.uninstall()\n\n if (removed.length === 0) {\n console.log('Nothing to uninstall.')\n return\n }\n\n for (const name of removed) {\n console.log(` ✓ removed from ${name}`)\n }\n console.log(`\\nDone! Removed from ${removed.length} platform(s).`)\n return\n }\n\n console.log('Installing make-laten across all platforms...\\n')\n const { installed, skipped } = await installer.install()\n\n for (const name of installed) {\n console.log(` ✓ ${name}`)\n }\n\n for (const name of skipped) {\n console.log(` ○ ${name} (not detected)`)\n }\n\n console.log(`\\nDone! Configured for ${installed.length} platform(s).`)\n console.log('\\nAvailable commands (terminal):')\n console.log(' mread <file> compressed file read')\n console.log(' mgrep <pattern> grouped grep results')\n console.log(' mdiff compressed git diff')\n console.log(' mstatus git status summary')\n console.log(' msearch <query> web search')\n console.log(' mfetch <url> web fetch + compress')\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport readline from 'readline'\n\nconst execAsync = promisify(exec)\n\ninterface AgentInfo {\n name: string\n detected: boolean\n configPath: string\n mcpConfig: Record<string, any>\n version?: string\n}\n\nfunction getHome(): string {\n return process.env.HOME || process.env.USERPROFILE || ''\n}\n\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execAsync(`which ${cmd}`, { timeout: 3000 })\n return true\n } catch {\n return false\n }\n}\n\nasync function directoryExists(dirPath: string): Promise<boolean> {\n try {\n await fs.access(dirPath)\n return true\n } catch {\n return false\n }\n}\n\nconst MCP_ENTRY = 'npx -y make-laten-mcp'\n\nasync function detectAllAgents(): Promise<AgentInfo[]> {\n const home = getHome()\n const agents: AgentInfo[] = []\n\n // Claude Code\n const claudeConfig = path.join(home, '.claude', 'mcp.json')\n const claudeDir = path.join(home, '.claude')\n agents.push({\n name: 'Claude Code',\n detected: await commandExists('claude') || await directoryExists(claudeDir),\n configPath: claudeConfig,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n },\n version: await commandExists('claude') ? (await execAsync('claude --version', { timeout: 3000 }).then(r => r.stdout.trim().split('\\n')[0]).catch(() => 'unknown')) : undefined\n })\n\n // Cursor\n const cursorMcp = path.join(home, '.cursor', 'mcp.json')\n const cursorDir = path.join(home, '.cursor')\n agents.push({\n name: 'Cursor',\n detected: await directoryExists(cursorDir),\n configPath: cursorMcp,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n // Codex\n const codexMcp = path.join(home, '.codex', 'config.json')\n const codexDir = path.join(home, '.codex')\n agents.push({\n name: 'Codex',\n detected: await commandExists('codex') || await directoryExists(codexDir),\n configPath: codexMcp,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n // Windsurf\n const windsurfMcp = path.join(home, '.codeium', 'windsurf', 'mcp_config.json')\n const windsurfDir = path.join(home, '.codeium', 'windsurf')\n agents.push({\n name: 'Windsurf',\n detected: await directoryExists(windsurfDir),\n configPath: windsurfMcp,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n // OpenCode\n const openCodeConfig = path.join(home, '.config', 'opencode', 'opencode.json')\n const openCodeDir = path.join(home, '.config', 'opencode')\n agents.push({\n name: 'OpenCode',\n detected: await directoryExists(openCodeDir),\n configPath: openCodeConfig,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n // Cline\n const clineDir = path.join(home, '.cline')\n const clineMcp = path.join(home, '.cline', 'mcp_settings.json')\n agents.push({\n name: 'Cline',\n detected: await directoryExists(clineDir),\n configPath: clineMcp,\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n // GitHub Copilot (VS Code)\n const vscodeDir = path.join(home, 'Library', 'Application Support', 'Code', 'User', 'globalStorage')\n agents.push({\n name: 'GitHub Copilot (VS Code)',\n detected: await directoryExists(vscodeDir),\n configPath: '',\n mcpConfig: {}\n })\n\n // Gemini CLI\n const geminiDir = path.join(home, '.gemini')\n agents.push({\n name: 'Gemini CLI',\n detected: await commandExists('gemini') || await directoryExists(geminiDir),\n configPath: path.join(home, '.gemini', 'settings.json'),\n mcpConfig: {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n })\n\n return agents\n}\n\nasync function writeMCPConfig(agent: AgentInfo): Promise<boolean> {\n try {\n const dir = path.dirname(agent.configPath)\n await fs.mkdir(dir, { recursive: true })\n\n let existing: Record<string, any> = {}\n try {\n const raw = await fs.readFile(agent.configPath, 'utf-8')\n existing = JSON.parse(raw)\n } catch {}\n\n const merged = {\n ...existing,\n mcpServers: {\n ...(existing.mcpServers || {}),\n ...agent.mcpConfig.mcpServers\n }\n }\n\n await fs.writeFile(agent.configPath, JSON.stringify(merged, null, 2))\n return true\n } catch {\n return false\n }\n}\n\nfunction askQuestion(rl: readline.Interface, question: string): Promise<string> {\n return new Promise(resolve => rl.question(question, resolve))\n}\n\nexport async function initCommand(options: { all?: boolean; project?: boolean }): Promise<void> {\n console.log('')\n console.log(' make-laten setup wizard')\n console.log(' ======================')\n console.log('')\n\n const agents = await detectAllAgents()\n const detected = agents.filter(a => a.detected)\n const notDetected = agents.filter(a => !a.detected)\n\n console.log(' Detected agents:')\n for (const agent of detected) {\n const ver = agent.version ? ` v${agent.version}` : ''\n console.log(` ✓ ${agent.name}${ver}`)\n }\n\n if (notDetected.length > 0) {\n console.log('')\n console.log(' Not detected (skipped):')\n for (const agent of notDetected) {\n console.log(` ○ ${agent.name}`)\n }\n }\n\n console.log('')\n\n if (options.all) {\n for (const agent of detected) {\n const success = await writeMCPConfig(agent)\n if (success) {\n console.log(` ✓ ${agent.name} → MCP configured`)\n } else {\n console.log(` ✗ ${agent.name} → failed`)\n }\n }\n } else if (options.project) {\n const cwd = process.cwd()\n const mcpConfig = {\n mcpServers: {\n 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] }\n }\n }\n\n const configPath = path.join(cwd, '.mcp.json')\n let existing: Record<string, any> = {}\n try {\n const raw = await fs.readFile(configPath, 'utf-8')\n existing = JSON.parse(raw)\n } catch {}\n\n const merged = {\n ...existing,\n mcpServers: {\n ...(existing.mcpServers || {}),\n ...mcpConfig.mcpServers\n }\n }\n\n await fs.writeFile(configPath, JSON.stringify(merged, null, 2))\n console.log(` ✓ .mcp.json created in ${cwd}`)\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout })\n\n for (const agent of detected) {\n const answer = await askQuestion(rl, ` Configure ${agent.name}? (Y/n) `)\n if (answer.toLowerCase() !== 'n') {\n const success = await writeMCPConfig(agent)\n if (success) {\n console.log(` ✓ ${agent.name} → MCP configured`)\n } else {\n console.log(` ✗ ${agent.name} → failed`)\n }\n } else {\n console.log(` ○ ${agent.name} → skipped`)\n }\n }\n\n rl.close()\n }\n\n console.log('')\n console.log(' Setup complete!')\n console.log('')\n console.log(' make-laten provides:')\n console.log(' • MCP server → auto-compress for all AI agents')\n console.log(' • CLI commands → mread, mgrep, mdiff, msearch, mfetch')\n console.log(' • Shell aliases → auto-load in new terminals')\n console.log('')\n console.log(' Restart your agent to activate MCP tools.')\n console.log('')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uBAAwB;;;ACFxB,sBAAe;;;ACAR,SAAS,oBAAoB,UAAkB,YAA4B;AAChF,MAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,MAAI,QAAQ;AAGZ,QAAM,QAAQ,WAAW,SAAS,SAAS;AAC3C,MAAI,QAAQ,KAAM,UAAS;AAAA,WAClB,QAAQ,KAAM,UAAS;AAGhC,MAAI,mBAAmB,UAAU,UAAU,EAAG,UAAS;AAGvD,MAAI,eAAe,QAAQ,EAAG,UAAS;AAEvC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEA,SAAS,mBAAmB,UAAkB,YAA6B;AACzE,QAAM,iBAAiB;AACvB,QAAM,iBAAiB,SAAS,MAAM,cAAc,KAAK,CAAC;AAC1D,QAAM,mBAAmB,WAAW,MAAM,cAAc,KAAK,CAAC;AAE9D,MAAI,eAAe,WAAW,iBAAiB,OAAQ,QAAO;AAE9D,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,QAAI,eAAe,CAAC,MAAM,iBAAiB,CAAC,EAAG,QAAO;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,SAA0B;AAChD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACA,SAAO,SAAS,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC;AAC3C;;;ACpCO,IAAM,qBAAN,MAA+C;AAAA,EACpD,MAAM,SAAS,OAA2C;AACxD,UAAM,EAAE,SAAS,UAAU,SAAS,IAAI;AAExC,UAAM,aAAa,KAAK,kBAAkB,SAAS,QAAQ;AAC3D,UAAMA,WAAU,KAAK,eAAe,OAAO;AAE3C,UAAM,QAAQ;AAAA,MACZ,MAAM,QAAQ,KAAK,QAAQ,MAAM,IAAI,EAAE,MAAM;AAAA,MAC7C;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAGA;AAAA,IACL;AAEA,UAAM,aAAa,MAAM,KAAK,IAAI;AAElC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY,oBAAoB,SAAS,UAAU;AAAA,MACnD,UAAU;AAAA,QACR,UAAU;AAAA,QACV,eAAe,QAAQ,MAAM,IAAI,EAAE;AAAA,QACnC,iBAAiB,MAAM;AAAA,QACvB,SAAS,IAAK,WAAW,SAAS,QAAQ;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAgD;AAC/D,WAAO,WAAW;AAAA,EACpB;AAAA,EAEQ,kBAAkB,SAAiB,UAA6B;AACtE,UAAM,aAAuB,CAAC;AAC9B,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAE1B,UAAI,yCAAyC,KAAK,OAAO,GAAG;AAC1D,mBAAW,KAAK,QAAQ,QAAQ,cAAc,SAAS,CAAC;AAAA,MAC1D;AAEA,UAAI,2BAA2B,KAAK,OAAO,GAAG;AAC5C,mBAAW,KAAK,OAAO;AAAA,MACzB;AAEA,UAAI,sCAAsC,KAAK,OAAO,GAAG;AACvD,mBAAW,KAAK,OAAO;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,SAA2B;AAChD,UAAMA,WAAoB,CAAC;AAC3B,UAAM,cAAc;AACpB,QAAI;AAEJ,YAAQ,QAAQ,YAAY,KAAK,OAAO,OAAO,MAAM;AACnD,MAAAA,SAAQ,KAAK,OAAO,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG;AAAA,IAC9C;AAEA,WAAOA;AAAA,EACT;AACF;;;AFrEA,SAAS,eAAe,UAA0B;AAChD,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AACxD,QAAM,UAAkC;AAAA,IACtC,IAAI;AAAA,IAAc,KAAK;AAAA,IAAc,IAAI;AAAA,IAAc,KAAK;AAAA,IAC5D,IAAI;AAAA,IAAU,IAAI;AAAA,IAAQ,IAAI;AAAA,IAAM,MAAM;AAAA,IAAQ,IAAI;AAAA,IACtD,MAAM;AAAA,IAAQ,MAAM;AAAA,IAAQ,KAAK;AAAA,IAAQ,IAAI;AAAA,EAC/C;AACA,SAAO,QAAQ,GAAG,KAAK;AACzB;AAEA,eAAsB,YAAY,UAAiC;AACjE,MAAI;AACF,UAAM,UAAU,MAAM,gBAAAC,QAAG,SAAS,UAAU,OAAO;AACnD,UAAM,aAAa,IAAI,mBAAmB;AAE1C,UAAM,SAAS,MAAM,WAAW,SAAS;AAAA,MACvC;AAAA,MACA;AAAA,MACA,UAAU,eAAe,QAAQ;AAAA,IACnC,CAAC;AAED,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,MAAM;AAAA,MACN,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,IACnB,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,KAAK,KAAK;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AGlCA,2BAAqB;AACrB,kBAA0B;;;ACEnB,IAAM,iBAAN,MAA2C;AAAA,EAChD,MAAM,SAAS,OAA2C;AACxD,UAAM,EAAE,QAAQ,IAAI;AAGpB,UAAM,UAAU,KAAK,YAAY,OAAO;AAGxC,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,MAAM,OAAO,KAAK,SAAS;AACrC,YAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,MAAM,WAAW;AAChD,YAAM,SAAS,KAAK,YAAY,OAAO;AACvC,iBAAW,SAAS,QAAQ;AAC1B,cAAM,KAAK,MAAM,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,IAAI;AAClC,UAAM,WAAW,QAAQ,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAEhF,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,YAAY,oBAAoB,UAAU,UAAU;AAAA,MACpD,UAAU;AAAA,QACR,UAAU;AAAA,QACV,cAAc,QAAQ;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,SAAS,IAAK,WAAW,SAAS,SAAS;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAgD;AAC/D,WAAO,WAAW;AAAA,EACpB;AAAA,EAEQ,YAAY,SAAkE;AACpF,UAAM,UAAU,oBAAI,IAAkC;AAEtD,eAAW,UAAU,SAAS;AAC5B,YAAM,WAAW,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC;AAC9C,eAAS,KAAK,MAAM;AACpB,cAAQ,IAAI,OAAO,MAAM,QAAQ;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,SAAqD;AACvE,UAAM,OAAO,oBAAI,IAAY;AAC7B,WAAO,QAAQ,OAAO,WAAS;AAC7B,YAAM,MAAM,MAAM,QAAQ,KAAK;AAC/B,UAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,WAAK,IAAI,GAAG;AACZ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;ADzDA,IAAM,gBAAY,uBAAU,yBAAI;AAQhC,SAAS,gBAAgB,QAA6B;AACpD,QAAM,UAAuB,CAAC;AAC9B,QAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAE/C,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,MAAM,UAAU,GAAG;AACrB,cAAQ,KAAK;AAAA,QACX,MAAM,MAAM,CAAC;AAAA,QACb,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,KAAK;AAAA,QAChC,SAAS,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,YAAY,SAAiB,WAAmB,SAA6C;AACjH,MAAI;AACF,QAAI,MAAM,aAAa,OAAO,KAAK,SAAS;AAC5C,QAAI,QAAQ,QAAQ;AAClB,aAAO,iBAAiB,QAAQ,MAAM;AAAA,IACxC;AAEA,UAAM,EAAE,OAAO,IAAI,MAAM,UAAU,KAAK,EAAE,WAAW,KAAK,OAAO,KAAK,CAAC;AACvE,UAAM,UAAU,gBAAgB,MAAM;AAEtC,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,WAAW,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AACzE;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,eAAe;AACtC,UAAM,SAAS,MAAM,WAAW,SAAS;AAAA,MACvC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAED,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,OAAO,QAAQ;AAAA,MACf,UAAU,OAAO;AAAA,IACnB,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAY;AACnB,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,WAAW,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC;AAAA,IAC3E,OAAO;AACL,cAAQ,MAAM,eAAe,MAAM,OAAO;AAC1C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;;;AEpEA,IAAAC,wBAAqB;AACrB,IAAAC,eAA0B;;;ACEnB,IAAM,oBAAN,MAA8C;AAAA,EACnD,MAAM,SAAS,OAA2C;AACxD,UAAM,EAAE,KAAK,IAAI;AAGjB,UAAM,QAAQ,KAAK,UAAU,IAAI;AAGjC,UAAM,YAAY,MAAM,IAAI,WAAS;AAAA,MACnC,MAAM,KAAK;AAAA,MACX,SAAS,KAAK,aAAa,IAAI;AAAA,MAC/B,OAAO,EAAE,WAAW,KAAK,WAAW,WAAW,KAAK,UAAU;AAAA,IAChE,EAAE;AAGF,UAAM,QAAkB,CAAC;AACzB,eAAW,QAAQ,WAAW;AAC5B,UAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,cAAM,KAAK,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,GAAG;AAC7E,cAAM,KAAK,GAAG,KAAK,OAAO;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,IAAI;AAElC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY,oBAAoB,MAAM,UAAU;AAAA,MAChD,UAAU;AAAA,QACR,UAAU;AAAA,QACV,cAAc,UAAU;AAAA,QACxB,SAAS,IAAK,WAAW,SAAS,KAAK;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,YAAgD;AAC/D,WAAO,WAAW;AAAA,EACpB;AAAA,EAEQ,UAAU,MAAsB;AACtC,UAAM,QAAgB,CAAC;AACvB,UAAM,QAAQ,KAAK,MAAM,IAAI;AAE7B,QAAI,cAA2B;AAE/B,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,YAAY,GAAG;AACjC,YAAI,YAAa,OAAM,KAAK,WAAW;AACvC,cAAM,YAAY,KAAK,MAAM,SAAS;AACtC,sBAAc;AAAA,UACZ,MAAM,YAAY,CAAC,KAAK;AAAA,UACxB,OAAO,CAAC;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AAAA,MACF,WAAW,aAAa;AACtB,YAAI,KAAK,WAAW,GAAG,GAAG;AACxB,sBAAY;AACZ,sBAAY,MAAM,KAAK,EAAE,MAAM,YAAY,SAAS,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,sBAAY;AACZ,sBAAY,MAAM,KAAK,EAAE,MAAM,YAAY,SAAS,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAa,OAAM,KAAK,WAAW;AACvC,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,MAAsB;AACzC,WAAO,KAAK,MACT,OAAO,OAAK,EAAE,SAAS,cAAc,EAAE,SAAS,UAAU,EAC1D,IAAI,OAAK,GAAG,EAAE,SAAS,aAAa,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE;AAAA,EACjE;AACF;;;AD5EA,IAAMC,iBAAY,wBAAU,0BAAI;AAEhC,eAAsB,eAAe,SAA8C;AACjF,MAAI;AACF,UAAM,OAAO,QAAQ,SAAS,aAAa;AAC3C,UAAM,EAAE,OAAO,IAAI,MAAMA,WAAU,YAAY,IAAI,IAAI,EAAE,WAAW,KAAK,OAAO,KAAK,CAAC;AAEtF,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,kBAAkB;AACzC,UAAM,SAAS,MAAM,WAAW,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzD,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,MACnB,UAAU,OAAO;AAAA,IACnB,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAY;AACnB,YAAQ,MAAM,mBAAmB,MAAM,OAAO;AAC9C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAsB,mBAAkC;AACtD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMA,WAAU,wBAAwB;AAC3D,UAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAE/C,UAAM,QAAQ,MAAM,IAAI,WAAS;AAAA,MAC/B,QAAQ,KAAK,CAAC;AAAA,MACd,MAAM,KAAK,MAAM,CAAC;AAAA,IACpB,EAAE;AAEF,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,OAAO,MAAM;AAAA,MACb;AAAA,IACF,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAY;AACnB,YAAQ,MAAM,qBAAqB,MAAM,OAAO;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AEhDA,4BAAqB;AAIrB,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCf,eAAsB,eAAe,QAAmC;AACtE,QAAM,KAAK,IAAI,sBAAAC,QAAS,MAAM;AAC9B,KAAG,OAAO,oBAAoB;AAC9B,KAAG,OAAO,mBAAmB;AAE7B,KAAG,KAAK,MAAM;AAEd,SAAO;AACT;;;ACjCO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAQ,oBAAI,IAAwB;AAAA,EACpC,OAAO;AAAA,EACP,SAAS;AAAA,EAEjB,IAAI,KAAgC;AAClC,UAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;AAChC,QAAI,OAAO;AACT,WAAK;AACL,aAAO;AAAA,IACT;AACA,SAAK;AACL,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAa,OAAyB;AACxC,SAAK,MAAM,IAAI,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AACjB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAoB;AAClB,UAAM,QAAQ,KAAK,OAAO,KAAK;AAC/B,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK,MAAM;AAAA,MACjB,SAAS,QAAQ,IAAI,KAAK,OAAO,QAAQ;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvCO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA,EAAf;AAAA,EAEpB,MAAM,IAAI,KAAyC;AACjD,UAAM,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI3B,EAAE,IAAI,GAAG;AAEV,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,WAAW,KAAK,MAAM,IAAI,QAAQ;AACxC,QAAI,SAAS,KAAK;AAChB,YAAM,MAAM,KAAK,IAAI,IAAI,MAAO,IAAI;AACpC,UAAI,MAAM,SAAS,KAAK;AACtB,aAAK,GAAG,QAAQ,gCAAgC,EAAE,IAAI,GAAG;AACzD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAGf,EAAE,IAAI,GAAG;AAEV,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,KAAK,MAAM,IAAI,QAAQ;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,OAAmB,SAAuC;AAC/E,SAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQf,EAAE,IAAI,KAAK,MAAM,SAAS,KAAK,UAAU,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,OAAO,KAA4B;AACvC,SAAK,GAAG,QAAQ,gCAAgC,EAAE,IAAI,GAAG;AAAA,EAC3D;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,GAAG,QAAQ,wCAAwC,EAAE,IAAI;AAAA,EAChE;AACF;;;ACpCO,SAAS,eAAe,IAAc;AAC3C,QAAM,KAAK,IAAI,aAAa;AAC5B,QAAM,KAAK,IAAI,kBAAkB,EAAE;AAEnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IAEA,MAAM,IAAI,KAAyC;AACjD,YAAM,WAAW,GAAG,IAAI,GAAG;AAC3B,UAAI,SAAU,QAAO;AAErB,YAAM,WAAW,MAAM,GAAG,IAAI,GAAG;AACjC,UAAI,UAAU;AACZ,WAAG,IAAI,KAAK,QAAQ;AACpB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,IAAI,KAAa,OAAmB,SAA2C;AACnF,SAAG,IAAI,KAAK,KAAK;AACjB,YAAM,GAAG,IAAI,KAAK,OAAO,OAAO;AAAA,IAClC;AAAA,IAEA,MAAM,WAAW,SAAgC;AAC/C,SAAG,MAAM;AACT,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,IAEA,QAA2B;AACzB,aAAO;AAAA,QACL,IAAI,GAAG,MAAM;AAAA,QACb,IAAI,EAAE,MAAM,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;;;ACzDA,eAAsB,oBAAmC;AACvD,MAAI;AACF,UAAM,SAAS,QAAQ,IAAI,iBAAiB;AAC5C,UAAM,KAAK,MAAM,eAAe,MAAM;AACtC,UAAM,QAAQ,eAAe,EAAE;AAE/B,UAAM,QAAQ,MAAM,MAAM;AAE1B,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,IAAI;AAAA,QACF,MAAM,MAAM,GAAG;AAAA,QACf,QAAQ,MAAM,GAAG;AAAA,QACjB,MAAM,MAAM,GAAG;AAAA,QACf,SAAS,IAAI,MAAM,GAAG,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA,MACjD;AAAA,MACA,IAAI;AAAA,QACF,MAAM,MAAM,GAAG;AAAA,MACjB;AAAA,IACF,GAAG,MAAM,CAAC,CAAC;AAEX,OAAG,MAAM;AAAA,EACX,SAAS,OAAY;AACnB,YAAQ,MAAM,sBAAsB,MAAM,OAAO;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAsB,oBAAmC;AACvD,MAAI;AACF,UAAM,SAAS,QAAQ,IAAI,iBAAiB;AAC5C,UAAM,KAAK,MAAM,eAAe,MAAM;AACtC,UAAM,QAAQ,eAAe,EAAE;AAE/B,UAAM,MAAM,WAAW,GAAG;AAE1B,YAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC;AAC7C,OAAG,MAAM;AAAA,EACX,SAAS,OAAY;AACnB,YAAQ,MAAM,sBAAsB,MAAM,OAAO;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AC1CO,IAAM,oBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EAEP,cAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAAe,SAAkD;AAC5E,UAAM,aAAa,SAAS,cAAc;AAE1C,UAAM,MAAM,uCAAuC,mBAAmB,KAAK,CAAC;AAC5E,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,SAAS;AAAA,QACP,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK,aAAa,MAAM,UAAU;AAAA,EAC3C;AAAA,EAEQ,aAAa,MAAc,YAAoC;AACrE,UAAM,UAA0B,CAAC;AACjC,UAAM,cAAc;AACpB,UAAM,eAAe;AACrB,QAAI;AAEJ,UAAM,OAAiB,CAAC;AACxB,UAAM,SAAmB,CAAC;AAE1B,YAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,QAAQ,KAAK,SAAS,YAAY;AAC5E,YAAM,SAAS,MAAM,CAAC;AACtB,YAAM,WAAW,OAAO,MAAM,cAAc;AAC5C,YAAM,MAAM,WAAW,mBAAmB,SAAS,CAAC,CAAC,IAAI;AACzD,YAAM,QAAQ,KAAK,UAAU,MAAM,CAAC,CAAC,EAAE,KAAK;AAE5C,UAAI,OAAO,OAAO;AAChB,aAAK,KAAK,GAAG;AACb,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,WAAqB,CAAC;AAC5B,YAAQ,QAAQ,aAAa,KAAK,IAAI,OAAO,QAAQ,SAAS,SAAS,YAAY;AACjF,eAAS,KAAK,KAAK,UAAU,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC;AAAA,IAC/C;AAEA,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAQ,KAAK;AAAA,QACX,OAAO,OAAO,CAAC;AAAA,QACf,KAAK,KAAK,CAAC;AAAA,QACX,SAAS,SAAS,CAAC,KAAK;AAAA,QACxB,OAAO,IAAK,IAAI;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,MAAsB;AACtC,WAAO,KAAK,QAAQ,YAAY,EAAE,EAAE,QAAQ,UAAU,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,WAAW,GAAG;AAAA,EACvJ;AACF;;;AC3DO,SAAS,cAAc,WAAgC;AAC5D,QAAM,WAAyB;AAAA,IAC7B,IAAI,kBAAkB;AAAA,EACxB;AAEA,MAAI,WAAW;AACb,UAAM,QAAQ,SAAS,KAAK,OAAK,EAAE,SAAS,SAAS;AACrD,QAAI,MAAO,QAAO;AAAA,EACpB;AAEA,SAAO,SAAS,KAAK,OAAK,EAAE,YAAY,CAAC,KAAK,SAAS,CAAC;AAC1D;;;ACaA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,YAAY,EAAE,EAAE,QAAQ,UAAU,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,GAAG,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,UAAU,GAAG;AACtJ;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,aAAa,KAAK,MAAM,kCAAkC;AAChE,MAAI,WAAY,QAAO,UAAU,WAAW,CAAC,CAAC,EAAE,KAAK;AAErD,QAAM,UAAU,KAAK,MAAM,4BAA4B;AACvD,MAAI,QAAS,QAAO,UAAU,QAAQ,CAAC,CAAC,EAAE,KAAK;AAE/C,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA2B;AAClD,QAAM,WAAwB,CAAC;AAC/B,QAAM,eAAe;AACrB,MAAI;AAEJ,UAAQ,QAAQ,aAAa,KAAK,IAAI,OAAO,MAAM;AACjD,UAAM,QAAQ,SAAS,MAAM,CAAC,CAAC;AAC/B,UAAM,UAAU,UAAU,MAAM,CAAC,CAAC,EAAE,KAAK;AAEzC,UAAM,WAAW,MAAM,QAAQ,MAAM,CAAC,EAAE;AACxC,UAAM,cAAc,KAAK,UAAU,QAAQ,EAAE,MAAM,UAAU;AAC7D,UAAM,SAAS,cAAc,WAAW,YAAY,QAAS,KAAK;AAClE,UAAM,UAAU,UAAU,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE,KAAK;AAEjE,QAAI,CAAC,QAAS;AAEd,UAAM,aAAa,SAAS,IAAI,YAAY,SAAS,IAAI,cAAc;AAEvE,aAAS,KAAK,EAAE,SAAS,OAAO,SAAS,WAAW,CAAC;AAAA,EACvD;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAA6B;AACxD,QAAM,WAA0B,CAAC;AACjC,QAAM,YAAY;AAClB,QAAM,aAAa;AACnB,MAAI;AAEJ,UAAQ,QAAQ,WAAW,KAAK,IAAI,OAAO,MAAM;AAC/C,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,OAAO,UAAU,MAAM,CAAC,CAAC,EAAE,KAAK;AAEtC,QAAI,KAAK,SAAS,IAAI;AACpB,eAAS,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,cAAc;AACpB,UAAQ,QAAQ,YAAY,KAAK,IAAI,OAAO,MAAM;AAChD,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,OAAO,UAAU,MAAM,CAAC,CAAC,EAAE,KAAK;AAEtC,QAAI,KAAK,SAAS,MAAM,CAAC,SAAS,KAAK,OAAK,EAAE,SAAS,IAAI,GAAG;AAC5D,eAAS,KAAK,EAAE,UAAU,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,GAAG,EAAE;AAC7B;AAEA,SAAS,iBAAiB,UAAiC;AACzD,QAAM,YAAsB,CAAC;AAE7B,aAAW,WAAW,SAAS,OAAO,OAAK,EAAE,eAAe,SAAS,GAAG;AACtE,UAAM,YAAY,QAAQ,QAAQ,MAAM,UAAU,EAAE,OAAO,OAAK,EAAE,KAAK,EAAE,SAAS,EAAE;AACpF,QAAI,UAAU,SAAS,GAAG;AACxB,gBAAU,KAAK,UAAU,CAAC,EAAE,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,SAAO,UAAU,MAAM,GAAG,CAAC;AAC7B;AAEA,SAAS,gBAAgB,MAAc,UAA8C;AACnF,QAAM,QAAQ,OAAO,MAAM,SAAS,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,YAAY;AAE/E,MAAI,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,YAAY,EAAG,QAAO;AACvG,MAAI,KAAK,SAAS,UAAU,KAAK,KAAK,SAAS,cAAc,KAAK,KAAK,SAAS,iBAAiB,EAAG,QAAO;AAC3G,MAAI,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,QAAQ,EAAG,QAAO;AAC3F,MAAI,KAAK,SAAS,SAAS,KAAK,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,UAAU,EAAG,QAAO;AAEjG,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAc,KAAyB;AACrE,QAAM,QAAQ,aAAa,IAAI;AAC/B,QAAM,WAAW,gBAAgB,IAAI;AACrC,QAAM,eAAe,oBAAoB,IAAI;AAC7C,QAAM,YAAY,iBAAiB,QAAQ;AAC3C,QAAM,UAAU,gBAAgB,MAAM,QAAQ;AAE9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,MACR,UAAU,KAAK,MAAM,cAAc,IAAI,CAAC,KAAK;AAAA,MAC7C,QAAQ,KAAK,MAAM,gDAAgD,IAAI,CAAC;AAAA,MACxE,MAAM,KAAK,MAAM,kDAAkD,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAAA,IACzG;AAAA,EACF;AACF;;;ACpIO,SAAS,mBAAmB,UAAsB,UAA2B,CAAC,GAAW;AAC9F,QAAM,EAAE,YAAY,KAAM,cAAc,MAAM,kBAAkB,MAAM,IAAI;AAC1E,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK,SAAS,KAAK,EAAE;AAChC,QAAM,KAAK,QAAQ,SAAS,GAAG,EAAE;AACjC,QAAM,KAAK,YAAY,SAAS,OAAO,EAAE;AACzC,QAAM,KAAK,EAAE;AAEb,MAAI,SAAS,UAAU,SAAS,GAAG;AACjC,UAAM,KAAK,eAAe;AAC1B,eAAW,SAAS,SAAS,WAAW;AACtC,YAAM,KAAK,KAAK,KAAK,EAAE;AAAA,IACzB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,mBAAmB,eAAe,SAAS,UAAU,eAAe;AAE1E,aAAW,WAAW,kBAAkB;AACtC,UAAM,UAAU,gBAAgB,QAAQ,SAAS,GAAG;AACpD,UAAM,KAAK,MAAM,QAAQ,OAAO,EAAE;AAClC,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,eAAe,SAAS,aAAa,SAAS,GAAG;AACnD,UAAM,cAAc,SAAS,aAAa,MAAM,GAAG,CAAC;AACpD,UAAM,KAAK,kBAAkB;AAC7B,eAAW,WAAW,aAAa;AACjC,YAAM,KAAK,SAAS,QAAQ,QAAQ,EAAE;AACtC,YAAM,KAAK,gBAAgB,QAAQ,MAAM,GAAG,CAAC;AAC7C,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,MAAI,SAAS,MAAM,KAAK,IAAI;AAE5B,QAAM,kBAAkB,eAAe,MAAM;AAC7C,MAAI,kBAAkB,WAAW;AAC/B,aAAS,iBAAiB,QAAQ,SAAS;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,UAAuB,MAA+C;AAC5F,MAAI,SAAS,OAAQ,QAAO,CAAC;AAC7B,MAAI,SAAS,UAAW,QAAO,SAAS,OAAO,OAAK,EAAE,eAAe,SAAS;AAC9E,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAiB,WAA2B;AACnE,MAAI,QAAQ,UAAU,UAAW,QAAO;AACxC,SAAO,QAAQ,MAAM,GAAG,SAAS,IAAI;AACvC;AAEA,SAAS,eAAe,MAAsB;AAC5C,SAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAClC;AAEA,SAAS,iBAAiB,MAAc,WAA2B;AACjE,QAAM,WAAW,YAAY;AAC7B,MAAI,KAAK,UAAU,SAAU,QAAO;AAEpC,QAAM,YAAY,KAAK,MAAM,GAAG,QAAQ;AACxC,QAAM,cAAc,UAAU,YAAY,IAAI;AAE9C,SAAO,UAAU,MAAM,GAAG,cAAc,IAAI,cAAc,QAAQ,IAAI;AACxE;;;ACzEO,IAAM,YAAN,MAAgB;AAAA,EACb,aAAuC,oBAAI,IAAI;AAAA,EAC/C,cAA2C,oBAAI,IAAI;AAAA,EACnD;AAAA,EAER,YAAY,SAAmC;AAC7C,SAAK,WAAW,SAAS,cAAc,KAAK,KAAK;AAAA,EACnD;AAAA,EAEA,MAAM,OAAO,OAAe,SAAkD;AAC5E,UAAM,WAAW,UAAU,KAAK,IAAI,KAAK,UAAU,WAAW,CAAC,CAAC,CAAC;AAEjE,UAAM,SAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,QAAI,UAAU,KAAK,QAAQ,QAAQ,GAAG;AACpC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,cAAc,SAAS,OAAO;AAC9C,UAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,OAAO;AAEnD,SAAK,YAAY,IAAI,UAAU,OAAO;AACtC,SAAK,eAAe,QAAQ;AAE5B,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,KAAa,SAA8C;AACrE,UAAM,WAAW,SAAS,GAAG,IAAI,SAAS,UAAU,MAAM;AAE1D,QAAI,SAAS,UAAU,OAAO;AAC5B,YAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,UAAI,UAAU,KAAK,QAAQ,QAAQ,GAAG;AACpC,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,eAAe,KAAK;AAE1B,QAAI;AACJ,QAAI,WAAW;AAEf,QAAI,SAAS,YAAY,OAAO;AAC9B,iBAAW,gBAAgB,MAAM,GAAG;AACpC,gBAAU,mBAAmB,UAAU;AAAA,QACrC,aAAa;AAAA,QACb,iBAAiB,SAAS,WAAW,SAAS,QAAQ;AAAA,MACxD,CAAC;AAAA,IACH,OAAO;AACL,gBAAU;AAAA,IACZ;AAEA,UAAM,iBAAiB,QAAQ;AAC/B,UAAM,SAAsB;AAAA,MAC1B;AAAA,MACA,OAAO,UAAU,SAAS,mBAAmB,IAAI;AAAA,MACjD;AAAA,MACA;AAAA,MACA,UAAU;AAAA,QACR,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB;AAAA,QACA;AAAA,QACA,SAAS,IAAK,iBAAiB;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,SAAS,UAAU,OAAO;AAC5B,WAAK,WAAW,IAAI,UAAU,MAAM;AACpC,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,KAAmC;AAC/C,WAAO,KAAK,MAAM,KAAK,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAU,SAAiB,SAAmD;AAClF,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,eAAyB,CAAC;AAChC,QAAI,aAAa;AACjB,UAAM,YAAY,SAAS,aAAa;AAExC,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,KAAK,KAAK,KAAK,SAAS,CAAC;AAC5C,UAAI,aAAa,aAAa,UAAW;AAEzC,UAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;AACxE,qBAAa,KAAK,IAAI;AACtB,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,aAAa,WAAW,KAAK,MAAM,SAAS,GAAG;AACjD,iBAAW,QAAQ,MAAM,MAAM,GAAG,CAAC,GAAG;AACpC,cAAM,aAAa,KAAK,KAAK,KAAK,SAAS,CAAC;AAC5C,YAAI,aAAa,aAAa,UAAW;AACzC,qBAAa,KAAK,IAAI;AACtB,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,aAAa,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,aAAmB;AACjB,SAAK,WAAW,MAAM;AACtB,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA,EAEA,gBAA2D;AACzD,WAAO;AAAA,MACL,WAAW,KAAK,WAAW;AAAA,MAC3B,YAAY,KAAK,YAAY;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,QAAQ,KAAsB;AACpC,UAAM,YAAY,KAAK,UAAU,IAAI,GAAG;AACxC,QAAI,CAAC,UAAW,QAAO;AACvB,WAAO,KAAK,IAAI,IAAI,YAAY,KAAK;AAAA,EACvC;AAAA,EAEQ,eAAe,KAAmB;AACxC,SAAK,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,EACpC;AAAA,EAEQ,YAAiC,oBAAI,IAAI;AACnD;AAEA,SAAS,mBAAmB,MAAsB;AAChD,QAAM,aAAa,KAAK,MAAM,kCAAkC;AAChE,SAAO,aAAa,WAAW,CAAC,EAAE,QAAQ,YAAY,EAAE,EAAE,KAAK,IAAI;AACrE;;;AC3IA,eAAsB,cAAc,OAAe,SAA4D;AAC7G,MAAI;AACF,UAAM,SAAS,IAAI,UAAU;AAE7B,UAAM,UAAU,MAAM,OAAO,OAAO,OAAO;AAAA,MACzC,YAAY,QAAQ,OAAO;AAAA,MAC3B,SAAS,QAAQ;AAAA,IACnB,CAAC;AAED,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ,IAAI,QAAM;AAAA,QACzB,OAAO,EAAE;AAAA,QACT,KAAK,EAAE;AAAA,QACP,SAAS,EAAE;AAAA,QACX,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAY;AACnB,YAAQ,MAAM,iBAAiB,MAAM,OAAO;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAsB,aAAa,KAAa,SAAmE;AACjH,MAAI;AACF,UAAM,SAAS,IAAI,UAAU;AAE7B,UAAM,SAAS,MAAM,OAAO,MAAM,KAAK;AAAA,MACrC,UAAU,QAAQ,aAAa;AAAA,MAC/B,SAAS,QAAQ,YAAY;AAAA,MAC7B,OAAO;AAAA,IACT,CAAC;AAED,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,IACnB,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,SAAS,OAAY;AACnB,YAAQ,MAAM,gBAAgB,MAAM,OAAO;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AC/CA,IAAAC,mBAAe;AACf,kBAAiB;AACjB,IAAAC,wBAAqB;AACrB,IAAAC,eAA0B;AAE1B,IAAMC,iBAAY,wBAAU,0BAAI;AAEhC,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBtB,SAAS,UAAkB;AACzB,SAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AACxD;AAEA,eAAe,cAAc,KAA+B;AAC1D,MAAI;AACF,UAAMA,WAAU,SAAS,GAAG,IAAI,EAAE,SAAS,IAAK,CAAC;AACjD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWA,IAAM,SAAuB;AAAA,EAC3B;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AAAA,IACtB,SAAS,YAAY;AACnB,YAAM,YAAY,MAAMC,WAAU,aAAa,EAAE,KAAK,OAAK,EAAE,OAAO,KAAK,CAAC;AAC1E,YAAM,SAAS,UAAU,SAAS,KAAK,IAAI,WAAW;AACtD,YAAM,SAAS,YAAAC,QAAK,KAAK,QAAQ,GAAG,MAAM;AAC1C,YAAM,SAAS;AAEf,UAAI,WAAW;AACf,UAAI;AAAE,mBAAW,MAAM,iBAAAC,QAAG,SAAS,QAAQ,OAAO;AAAA,MAAE,QAAQ;AAAA,MAAC;AAE7D,UAAI,CAAC,SAAS,SAAS,MAAM,GAAG;AAC9B,cAAM,UAAU,MAAMF,WAAU,aAAa,EAAE,KAAK,OAAK,EAAE,OAAO,KAAK,CAAC;AACxE,cAAM,aAAa;AAAA;AAAA,SAA4C,OAAO;AAAA;AACtE,cAAM,iBAAAE,QAAG,WAAW,QAAQ,UAAU;AAAA,MACxC;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,YAAM,YAAY,MAAMF,WAAU,aAAa,EAAE,KAAK,OAAK,EAAE,OAAO,KAAK,CAAC;AAC1E,YAAM,SAAS,UAAU,SAAS,KAAK,IAAI,WAAW;AACtD,YAAM,SAAS,YAAAC,QAAK,KAAK,QAAQ,GAAG,MAAM;AAC1C,UAAI;AACF,YAAI,UAAU,MAAM,iBAAAC,QAAG,SAAS,QAAQ,OAAO;AAC/C,kBAAU,QAAQ,QAAQ,+EAA+E,EAAE;AAC3G,cAAM,iBAAAA,QAAG,UAAU,QAAQ,OAAO;AAAA,MACpC,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY,cAAc,QAAQ;AAAA,IAC5C,SAAS,YAAY;AACnB,YAAM,WAAW,YAAAD,QAAK,KAAK,QAAQ,GAAG,WAAW,OAAO;AACxD,YAAM,iBAAAC,QAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAE5C,YAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQhB,YAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQjB,YAAM,iBAAAA,QAAG,UAAU,YAAAD,QAAK,KAAK,UAAU,iBAAiB,GAAG,OAAO;AAClE,YAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,UAAU,kBAAkB,GAAG,QAAQ;AAAA,IACtE;AAAA,IACA,WAAW,YAAY;AACrB,YAAM,WAAW,YAAAA,QAAK,KAAK,QAAQ,GAAG,WAAW,OAAO;AACxD,UAAI;AAAE,cAAM,iBAAAC,QAAG,GAAG,YAAAD,QAAK,KAAK,UAAU,iBAAiB,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AACpF,UAAI;AAAE,cAAM,iBAAAC,QAAG,GAAG,YAAAD,QAAK,KAAK,UAAU,kBAAkB,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AAAA,IACvF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AACpB,UAAI;AAAE,cAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,GAAG,SAAS,CAAC;AAAG,eAAO;AAAA,MAAK,QAAQ;AAAE,eAAO;AAAA,MAAM;AAAA,IAC7F;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,WAAW,YAAAA,QAAK,KAAK,QAAQ,GAAG,WAAW,OAAO;AACxD,YAAM,iBAAAC,QAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,YAAM,WAAW,YAAAD,QAAK,KAAK,UAAU,gBAAgB;AACrD,YAAM,UAAU;AAAA;AAAA;AAAA;AAAA,EAA+D,aAAa;AAC5F,YAAM,iBAAAC,QAAG,UAAU,UAAU,OAAO;AAAA,IACtC;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AAAE,cAAM,iBAAAA,QAAG,GAAG,YAAAD,QAAK,KAAK,QAAQ,GAAG,WAAW,SAAS,gBAAgB,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AAAA,IAC1G;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY,cAAc,OAAO;AAAA,IAC3C,SAAS,YAAY;AACnB,YAAM,WAAW,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW;AACrD,UAAI,WAAW;AACf,UAAI;AAAE,mBAAW,MAAM,iBAAAC,QAAG,SAAS,UAAU,OAAO;AAAA,MAAE,QAAQ;AAAA,MAAC;AAC/D,UAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,cAAM,UAAU,WAAW,oCAAoC;AAC/D,cAAM,iBAAAA,QAAG,UAAU,UAAU,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AACF,YAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,GAAG,OAAO;AAC9E,kBAAU,QAAQ,QAAQ,uCAAuC,EAAE;AACnE,cAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,MACjF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AACpB,UAAI;AAAE,cAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,CAAC;AAAG,eAAO;AAAA,MAAK,QAAQ;AAChF,YAAI;AAAE,gBAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,GAAG,WAAW,CAAC;AAAG,iBAAO;AAAA,QAAK,QAAQ;AAAE,iBAAO;AAAA,QAAM;AAAA,MAC/F;AAAA,IACF;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,YAAY,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB;AAC3D,UAAI,WAAW;AACf,UAAI;AAAE,mBAAW,MAAM,iBAAAC,QAAG,SAAS,WAAW,OAAO;AAAA,MAAE,QAAQ;AAAA,MAAC;AAChE,UAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,cAAM,iBAAAA,QAAG,UAAU,WAAW,WAAW,SAAS,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AACF,YAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB,GAAG,OAAO;AACnF,kBAAU,QAAQ,QAAQ,2CAA2C,EAAE;AACvE,cAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,gBAAgB,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,MACtF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AACpB,UAAI;AAAE,cAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,CAAC;AAAG,eAAO;AAAA,MAAK,QAAQ;AAClF,YAAI;AAAE,gBAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC;AAAG,iBAAO;AAAA,QAAK,QAAQ;AAAE,iBAAO;AAAA,QAAM;AAAA,MAC5F;AAAA,IACF;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,YAAY,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,aAAa;AACxD,UAAI,WAAW;AACf,UAAI;AAAE,mBAAW,MAAM,iBAAAC,QAAG,SAAS,WAAW,OAAO;AAAA,MAAE,QAAQ;AAAA,MAAC;AAChE,UAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,cAAM,iBAAAA,QAAG,UAAU,WAAW,WAAW,SAAS,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AACF,YAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,GAAG,OAAO;AAChF,kBAAU,QAAQ,QAAQ,2CAA2C,EAAE;AACvE,cAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,aAAa,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,MACnF,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AACpB,UAAI;AAAE,cAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,CAAC;AAAG,eAAO;AAAA,MAAK,QAAQ;AAAE,eAAO;AAAA,MAAM;AAAA,IACjG;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,MAAM,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,SAAS;AAC9C,YAAM,iBAAAC,QAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,YAAM,mBAAmB,YAAAD,QAAK,KAAK,KAAK,yBAAyB;AACjE,UAAI,WAAW;AACf,UAAI;AAAE,mBAAW,MAAM,iBAAAC,QAAG,SAAS,kBAAkB,OAAO;AAAA,MAAE,QAAQ;AAAA,MAAC;AACvE,UAAI,CAAC,SAAS,SAAS,YAAY,GAAG;AACpC,cAAM,iBAAAA,QAAG,UAAU,kBAAkB,WAAW,mCAAmC,aAAa;AAAA,MAClG;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AACF,YAAI,UAAU,MAAM,iBAAAA,QAAG,SAAS,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,yBAAyB,GAAG,OAAO;AACvG,kBAAU,QAAQ,QAAQ,sCAAsC,EAAE;AAClE,cAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,yBAAyB,GAAG,QAAQ,KAAK,IAAI,IAAI;AAAA,MAC1G,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU,YAAY;AACpB,UAAI;AAAE,cAAM,iBAAAC,QAAG,OAAO,YAAAD,QAAK,KAAK,QAAQ,GAAG,WAAW,UAAU,CAAC;AAAG,eAAO;AAAA,MAAK,QAAQ;AAAE,eAAO;AAAA,MAAM;AAAA,IACzG;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,YAAY,YAAAA,QAAK,KAAK,QAAQ,GAAG,WAAW,YAAY,UAAU,YAAY;AACpF,YAAM,iBAAAC,QAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE7C,YAAM,UAAU,MAAMF,WAAU,aAAa,EAAE,KAAK,OAAK,EAAE,OAAO,KAAK,CAAC;AACxE,YAAM,WAAW,YAAAC,QAAK,KAAK,SAAS,cAAc,UAAU,UAAU;AAEtE,UAAI;AACF,cAAM,eAAe,MAAM,iBAAAC,QAAG,SAAS,UAAU,OAAO;AACxD,cAAM,iBAAAA,QAAG,UAAU,YAAAD,QAAK,KAAK,WAAW,UAAU,GAAG,YAAY;AAAA,MACnE,QAAQ;AACN,cAAM,iBAAAC,QAAG,UAAU,YAAAD,QAAK,KAAK,WAAW,UAAU,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAA8J;AAAA,MACrN;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI;AAAE,cAAM,iBAAAC,QAAG,GAAG,YAAAD,QAAK,KAAK,QAAQ,GAAG,WAAW,YAAY,UAAU,YAAY,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AAAA,IACpI;AAAA,EACF;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACrB,MAAM,UAA+D;AACnE,UAAM,YAAsB,CAAC;AAC7B,UAAM,UAAoB,CAAC;AAE3B,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,SAAS;AACtC,YAAI,UAAU;AACZ,gBAAM,MAAM,QAAQ;AACpB,oBAAU,KAAK,MAAM,IAAI;AAAA,QAC3B,OAAO;AACL,kBAAQ,KAAK,MAAM,IAAI;AAAA,QACzB;AAAA,MACF,QAAQ;AACN,gBAAQ,KAAK,MAAM,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,YAA4C;AAChD,UAAM,UAAoB,CAAC;AAE3B,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,MAAM,UAAU;AACtB,gBAAQ,KAAK,MAAM,IAAI;AAAA,MACzB,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA,EAEA,MAAM,SAA6E;AACjF,UAAM,SAAoE,CAAC;AAE3E,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,SAAS;AACtC,eAAO,KAAK,EAAE,MAAM,MAAM,MAAM,UAAU,WAAW,MAAM,CAAC;AAAA,MAC9D,QAAQ;AACN,eAAO,KAAK,EAAE,MAAM,MAAM,MAAM,UAAU,OAAO,WAAW,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACpSA,eAAsB,eAAe,SAAmE;AACtG,QAAM,YAAY,IAAI,UAAU;AAEhC,MAAI,QAAQ,QAAQ;AAClB,YAAQ,IAAI,0BAA0B;AACtC,UAAM,SAAS,MAAM,UAAU,OAAO;AAEtC,eAAW,KAAK,QAAQ;AACtB,YAAM,OAAO,EAAE,WAAW,WAAM;AAChC,YAAM,QAAQ,EAAE,WAAW,aAAa;AACxC,cAAQ,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG;AAAA,IAC9C;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,IAAI,iDAAiD;AAC7D,UAAM,EAAE,QAAQ,IAAI,MAAM,UAAU,UAAU;AAE9C,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,IAAI,uBAAuB;AACnC;AAAA,IACF;AAEA,eAAW,QAAQ,SAAS;AAC1B,cAAQ,IAAI,yBAAoB,IAAI,EAAE;AAAA,IACxC;AACA,YAAQ,IAAI;AAAA,qBAAwB,QAAQ,MAAM,eAAe;AACjE;AAAA,EACF;AAEA,UAAQ,IAAI,iDAAiD;AAC7D,QAAM,EAAE,WAAW,QAAQ,IAAI,MAAM,UAAU,QAAQ;AAEvD,aAAW,QAAQ,WAAW;AAC5B,YAAQ,IAAI,YAAO,IAAI,EAAE;AAAA,EAC3B;AAEA,aAAW,QAAQ,SAAS;AAC1B,YAAQ,IAAI,YAAO,IAAI,iBAAiB;AAAA,EAC1C;AAEA,UAAQ,IAAI;AAAA,uBAA0B,UAAU,MAAM,eAAe;AACrE,UAAQ,IAAI,kCAAkC;AAC9C,UAAQ,IAAI,0CAA0C;AACtD,UAAQ,IAAI,0CAA0C;AACtD,UAAQ,IAAI,yCAAyC;AACrD,UAAQ,IAAI,wCAAwC;AACpD,UAAQ,IAAI,gCAAgC;AAC5C,UAAQ,IAAI,0CAA0C;AACxD;;;ACpDA,IAAAE,wBAAqB;AACrB,IAAAC,eAA0B;AAC1B,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AACjB,sBAAqB;AAErB,IAAMC,iBAAY,wBAAU,0BAAI;AAUhC,SAASC,WAAkB;AACzB,SAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI,eAAe;AACxD;AAEA,eAAeC,eAAc,KAA+B;AAC1D,MAAI;AACF,UAAMF,WAAU,SAAS,GAAG,IAAI,EAAE,SAAS,IAAK,CAAC;AACjD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBAAgB,SAAmC;AAChE,MAAI;AACF,UAAM,iBAAAG,QAAG,OAAO,OAAO;AACvB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,eAAe,kBAAwC;AACrD,QAAM,OAAOC,SAAQ;AACrB,QAAMC,UAAsB,CAAC;AAG7B,QAAM,eAAe,aAAAC,QAAK,KAAK,MAAM,WAAW,UAAU;AAC1D,QAAM,YAAY,aAAAA,QAAK,KAAK,MAAM,SAAS;AAC3C,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAME,eAAc,QAAQ,KAAK,MAAM,gBAAgB,SAAS;AAAA,IAC1E,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,SAAS,MAAMA,eAAc,QAAQ,IAAK,MAAMC,WAAU,oBAAoB,EAAE,SAAS,IAAK,CAAC,EAAE,KAAK,OAAK,EAAE,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,MAAM,SAAS,IAAK;AAAA,EACvK,CAAC;AAGD,QAAM,YAAY,aAAAF,QAAK,KAAK,MAAM,WAAW,UAAU;AACvD,QAAM,YAAY,aAAAA,QAAK,KAAK,MAAM,SAAS;AAC3C,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAM,gBAAgB,SAAS;AAAA,IACzC,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,aAAAC,QAAK,KAAK,MAAM,UAAU,aAAa;AACxD,QAAM,WAAW,aAAAA,QAAK,KAAK,MAAM,QAAQ;AACzC,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAME,eAAc,OAAO,KAAK,MAAM,gBAAgB,QAAQ;AAAA,IACxE,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,cAAc,aAAAD,QAAK,KAAK,MAAM,YAAY,YAAY,iBAAiB;AAC7E,QAAM,cAAc,aAAAA,QAAK,KAAK,MAAM,YAAY,UAAU;AAC1D,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAM,gBAAgB,WAAW;AAAA,IAC3C,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,aAAAC,QAAK,KAAK,MAAM,WAAW,YAAY,eAAe;AAC7E,QAAM,cAAc,aAAAA,QAAK,KAAK,MAAM,WAAW,UAAU;AACzD,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAM,gBAAgB,WAAW;AAAA,IAC3C,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,WAAW,aAAAC,QAAK,KAAK,MAAM,QAAQ;AACzC,QAAM,WAAW,aAAAA,QAAK,KAAK,MAAM,UAAU,mBAAmB;AAC9D,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAM,gBAAgB,QAAQ;AAAA,IACxC,YAAY;AAAA,IACZ,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,YAAY,aAAAC,QAAK,KAAK,MAAM,WAAW,uBAAuB,QAAQ,QAAQ,eAAe;AACnG,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAM,gBAAgB,SAAS;AAAA,IACzC,YAAY;AAAA,IACZ,WAAW,CAAC;AAAA,EACd,CAAC;AAGD,QAAM,YAAY,aAAAC,QAAK,KAAK,MAAM,SAAS;AAC3C,EAAAD,QAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,UAAU,MAAME,eAAc,QAAQ,KAAK,MAAM,gBAAgB,SAAS;AAAA,IAC1E,YAAY,aAAAD,QAAK,KAAK,MAAM,WAAW,eAAe;AAAA,IACtD,WAAW;AAAA,MACT,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAOD;AACT;AAEA,eAAe,eAAe,OAAoC;AAChE,MAAI;AACF,UAAM,MAAM,aAAAC,QAAK,QAAQ,MAAM,UAAU;AACzC,UAAM,iBAAAG,QAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAEvC,QAAI,WAAgC,CAAC;AACrC,QAAI;AACF,YAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,MAAM,YAAY,OAAO;AACvD,iBAAW,KAAK,MAAM,GAAG;AAAA,IAC3B,QAAQ;AAAA,IAAC;AAET,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,YAAY;AAAA,QACV,GAAI,SAAS,cAAc,CAAC;AAAA,QAC5B,GAAG,MAAM,UAAU;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,iBAAAA,QAAG,UAAU,MAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACpE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,IAAwB,UAAmC;AAC9E,SAAO,IAAI,QAAQ,aAAW,GAAG,SAAS,UAAU,OAAO,CAAC;AAC9D;AAEA,eAAsB,YAAY,SAA8D;AAC9F,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,0BAA0B;AACtC,UAAQ,IAAI,EAAE;AAEd,QAAMJ,UAAS,MAAM,gBAAgB;AACrC,QAAM,WAAWA,QAAO,OAAO,OAAK,EAAE,QAAQ;AAC9C,QAAM,cAAcA,QAAO,OAAO,OAAK,CAAC,EAAE,QAAQ;AAElD,UAAQ,IAAI,oBAAoB;AAChC,aAAW,SAAS,UAAU;AAC5B,UAAM,MAAM,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK;AACnD,YAAQ,IAAI,cAAS,MAAM,IAAI,GAAG,GAAG,EAAE;AAAA,EACzC;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,2BAA2B;AACvC,eAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,cAAS,MAAM,IAAI,EAAE;AAAA,IACnC;AAAA,EACF;AAEA,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ,KAAK;AACf,eAAW,SAAS,UAAU;AAC5B,YAAM,UAAU,MAAM,eAAe,KAAK;AAC1C,UAAI,SAAS;AACX,gBAAQ,IAAI,cAAS,MAAM,IAAI,wBAAmB;AAAA,MACpD,OAAO;AACL,gBAAQ,IAAI,cAAS,MAAM,IAAI,gBAAW;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,WAAW,QAAQ,SAAS;AAC1B,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,YAAY;AAAA,MAChB,YAAY;AAAA,QACV,cAAc,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,aAAa,aAAAC,QAAK,KAAK,KAAK,WAAW;AAC7C,QAAI,WAAgC,CAAC;AACrC,QAAI;AACF,YAAM,MAAM,MAAM,iBAAAG,QAAG,SAAS,YAAY,OAAO;AACjD,iBAAW,KAAK,MAAM,GAAG;AAAA,IAC3B,QAAQ;AAAA,IAAC;AAET,UAAM,SAAS;AAAA,MACb,GAAG;AAAA,MACH,YAAY;AAAA,QACV,GAAI,SAAS,cAAc,CAAC;AAAA,QAC5B,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAEA,UAAM,iBAAAA,QAAG,UAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC9D,YAAQ,IAAI,mCAA8B,GAAG,EAAE;AAAA,EACjD,OAAO;AACL,UAAM,KAAK,gBAAAC,QAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAEpF,eAAW,SAAS,UAAU;AAC5B,YAAM,SAAS,MAAM,YAAY,IAAI,iBAAiB,MAAM,IAAI,UAAU;AAC1E,UAAI,OAAO,YAAY,MAAM,KAAK;AAChC,cAAM,UAAU,MAAM,eAAe,KAAK;AAC1C,YAAI,SAAS;AACX,kBAAQ,IAAI,gBAAW,MAAM,IAAI,wBAAmB;AAAA,QACtD,OAAO;AACL,kBAAQ,IAAI,gBAAW,MAAM,IAAI,gBAAW;AAAA,QAC9C;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,gBAAW,MAAM,IAAI,iBAAY;AAAA,MAC/C;AAAA,IACF;AAEA,OAAG,MAAM;AAAA,EACX;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,mBAAmB;AAC/B,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,wBAAwB;AACpC,UAAQ,IAAI,8DAAoD;AAChE,UAAQ,IAAI,qEAA2D;AACvE,UAAQ,IAAI,4DAAkD;AAC9D,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,6CAA6C;AACzD,UAAQ,IAAI,EAAE;AAChB;;;ArBvQA,IAAM,UAAU,IAAI,yBAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,mDAAmD,EAC/D,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC,SAAS,UAAU,WAAW,EAC9B,OAAO,WAAW;AAErB,QACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,SAAS,aAAa,gBAAgB,EACtC,SAAS,eAAe,uBAAuB,GAAG,EAClD,OAAO,sBAAsB,0BAA0B,EACvD,OAAO,WAAW;AAErB,IAAM,SAAS,QACZ,QAAQ,KAAK,EACb,YAAY,gBAAgB;AAE/B,OACG,QAAQ,MAAM,EACd,YAAY,qBAAqB,EACjC,OAAO,gBAAgB,qBAAqB,EAC5C,OAAO,cAAc;AAExB,OACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,gBAAgB;AAE1B,IAAM,WAAW,QACd,QAAQ,OAAO,EACf,YAAY,kBAAkB;AAEjC,SACG,QAAQ,OAAO,EACf,YAAY,uBAAuB,EACnC,OAAO,iBAAiB;AAE3B,SACG,QAAQ,OAAO,EACf,YAAY,aAAa,EACzB,OAAO,iBAAiB;AAE3B,QACG,QAAQ,QAAQ,EAChB,YAAY,gBAAgB,EAC5B,SAAS,WAAW,cAAc,EAClC,OAAO,2BAA2B,gBAAgB,EAClD,OAAO,iBAAiB,eAAe,GAAG,EAC1C,OAAO,aAAa;AAEvB,QACG,QAAQ,OAAO,EACf,YAAY,gCAAgC,EAC5C,SAAS,SAAS,cAAc,EAChC,OAAO,iBAAiB,qBAAqB,EAC7C,OAAO,gBAAgB,6BAA6B,EACpD,OAAO,YAAY;AAEtB,QACG,QAAQ,SAAS,EACjB,YAAY,kDAAkD,EAC9D,OAAO,mBAAmB,iBAAiB,EAC3C,OAAO,gBAAgB,0BAA0B,EACjD,OAAO,cAAc;AAExB,QACG,QAAQ,MAAM,EACd,YAAY,+DAA0D,EACtE,OAAO,aAAa,4CAA4C,EAChE,OAAO,iBAAiB,4CAA4C,EACpE,OAAO,WAAW;AAErB,QAAQ,MAAM;","names":["exports","fs","import_child_process","import_util","execAsync","Database","import_promises","import_child_process","import_util","execAsync","execAsync","path","fs","import_child_process","import_util","import_promises","import_path","execAsync","getHome","commandExists","fs","getHome","agents","path","commandExists","execAsync","fs","readline"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/read.ts","../../src/compress/confidence.ts","../../src/compress/strip.ts","../../src/compress/structure.ts","../../src/compress/truncate.ts","../../src/compress/file-read.ts","../../src/cli/commands/grep.ts","../../src/compress/grep.ts","../../src/cli/commands/git.ts","../../src/compress/git-diff.ts","../../src/graph/database.ts","../../src/cache/l1-session.ts","../../src/cache/l2-cross.ts","../../src/cache/index.ts","../../src/cli/commands/cache.ts","../../src/web/backends/duckduckgo.ts","../../src/web/backends/index.ts","../../src/web/extractor.ts","../../src/web/compressor.ts","../../src/web/router.ts","../../src/cli/commands/web.ts","../../src/adapter/installer.ts","../../src/cli/commands/install.ts","../../src/cli/commands/init.ts","../../src/compress/git-status.ts","../../src/cli/commands/benchmark.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { readCommand } from './commands/read.js'\nimport { grepCommand } from './commands/grep.js'\nimport { gitDiffCommand, gitStatusCommand } from './commands/git.js'\nimport { cacheStatsCommand, cacheClearCommand } from './commands/cache.js'\nimport { searchCommand, fetchCommand } from './commands/web.js'\nimport { installCommand } from './commands/install.js'\nimport { initCommand } from './commands/init.js'\nimport { benchmarkCommand } from './commands/benchmark.js'\n\nconst program = new Command()\n\nprogram\n .name('make-laten')\n .description('Universal efficiency toolkit for AI coding agents')\n .version('1.0.3')\n\nprogram\n .command('read')\n .description('Compressed file read')\n .argument('<file>', 'File path')\n .action(readCommand)\n\nprogram\n .command('grep')\n .description('Compressed grep with file grouping')\n .argument('<pattern>', 'Search pattern')\n .argument('[directory]', 'Directory to search', '.')\n .option('-i, --ignore <ext>', 'File extension to ignore')\n .action(grepCommand)\n\nconst gitCmd = program\n .command('git')\n .description('Git operations')\n\ngitCmd\n .command('diff')\n .description('Compressed git diff')\n .option('-s, --staged', 'Show staged changes')\n .action(gitDiffCommand)\n\ngitCmd\n .command('status')\n .description('Git status summary')\n .action(gitStatusCommand)\n\nconst cacheCmd = program\n .command('cache')\n .description('Cache management')\n\ncacheCmd\n .command('stats')\n .description('Show cache statistics')\n .action(cacheStatsCommand)\n\ncacheCmd\n .command('clear')\n .description('Clear cache')\n .action(cacheClearCommand)\n\nprogram\n .command('search')\n .description('Search the web')\n .argument('<query>', 'Search query')\n .option('-b, --backend <backend>', 'Search backend')\n .option('-m, --max <n>', 'Max results', '5')\n .action(searchCommand)\n\nprogram\n .command('fetch')\n .description('Fetch and compress web content')\n .argument('<url>', 'URL to fetch')\n .option('--no-compress', 'Disable compression')\n .option('--no-extract', 'Disable semantic extraction')\n .action(fetchCommand)\n\nprogram\n .command('install')\n .description('Install make-laten across all detected platforms')\n .option('-u, --uninstall', 'Remove adapters')\n .option('-s, --status', 'Show installation status')\n .action(installCommand)\n\nprogram\n .command('init')\n .description('Interactive setup wizard — detect agents & configure MCP')\n .option('-a, --all', 'Configure all detected agents (no prompts)')\n .option('-p, --project', 'Create .mcp.json in current directory only')\n .action(initCommand)\n\nprogram\n .command('benchmark')\n .description('Compare raw vs compressed output')\n .action(benchmarkCommand)\n\nprogram.parse()\n","import fs from 'fs/promises'\nimport { FileReadCompressor } from '../../compress/file-read.js'\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const langMap: Record<string, string> = {\n ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript',\n py: 'python', rs: 'rust', go: 'go', java: 'java', rb: 'ruby',\n json: 'json', yaml: 'yaml', yml: 'yaml', md: 'markdown'\n }\n return langMap[ext] || 'text'\n}\n\nexport async function readCommand(filePath: string): Promise<void> {\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n const compressor = new FileReadCompressor()\n \n const result = await compressor.compress({\n content,\n filePath,\n language: detectLanguage(filePath)\n })\n\n console.log(JSON.stringify({\n file: filePath,\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error) {\n console.error(`Error reading ${filePath}:`, error)\n process.exit(1)\n }\n}\n","export function calculateConfidence(original: string, compressed: string): number {\n if (!original.length) return 0\n\n let score = 1.0\n\n // Penalize if too much dropped\n const ratio = compressed.length / original.length\n if (ratio < 0.01) score -= 0.5\n else if (ratio < 0.05) score -= 0.3\n\n // Penalize if code blocks were modified\n if (codeBlocksModified(original, compressed)) score -= 0.4\n\n // Bonus for known patterns\n if (isKnownPattern(original)) score += 0.1\n\n return Math.max(0, Math.min(1, score))\n}\n\nfunction codeBlocksModified(original: string, compressed: string): boolean {\n const codeBlockRegex = /```[\\s\\S]*?```/g\n const originalBlocks = original.match(codeBlockRegex) || []\n const compressedBlocks = compressed.match(codeBlockRegex) || []\n\n if (originalBlocks.length !== compressedBlocks.length) return true\n\n for (let i = 0; i < originalBlocks.length; i++) {\n if (originalBlocks[i] !== compressedBlocks[i]) return true\n }\n\n return false\n}\n\nfunction isKnownPattern(content: string): boolean {\n const patterns = [\n /export\\s+(default\\s+)?(function|class|const|let|var)/,\n /import\\s+.*from\\s+['\"]/\n ]\n return patterns.some(p => p.test(content))\n}\n","export function stripImports(content: string): string {\n return content\n .replace(/^import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"]\\s*;?\\s*$/gm, '')\n .replace(/^import\\s+['\"][^'\"]+['\"]\\s*;?\\s*$/gm, '')\n .replace(/^import\\s+\\{[^}]*\\}\\s+from\\s+['\"][^'\"]+['\"]\\s*;?\\s*$/gm, '')\n .split('\\n')\n .filter(l => l.trim() !== '')\n .join('\\n')\n}\n\nexport function stripComments(content: string): string {\n let result = content.replace(/(?<![\"'`])\\/\\/.*$/gm, '')\n result = result.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n return result\n .split('\\n')\n .filter(l => l.trim() !== '')\n .join('\\n')\n}\n\nexport function stripBlankLines(content: string): string {\n return content.replace(/\\n{3,}/g, '\\n\\n')\n}\n\nexport function stripWhitespace(content: string): string {\n return content.replace(/[ \\t]+$/gm, '')\n}\n\nexport function stripAll(content: string): string {\n let result = content\n result = stripImports(result)\n result = stripComments(result)\n result = stripBlankLines(result)\n result = stripWhitespace(result)\n return result.trim()\n}\n","export function extractExports(content: string): string {\n const lines = content.split('\\n')\n const exports: string[] = []\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (/^export\\s+(default\\s+)?/.test(trimmed)) {\n if (trimmed.includes('{') && !trimmed.includes('}')) {\n exports.push(trimmed.replace(/\\{[\\s\\S]*$/, '{ ... }'))\n } else {\n exports.push(trimmed)\n }\n }\n }\n\n return exports.join('\\n')\n}\n\nexport function extractClassMethods(content: string): string {\n const classRegex = /class\\s+\\w+[^{]*\\{([\\s\\S]*?)\\n\\}/g\n const methods: string[] = []\n\n let match\n while ((match = classRegex.exec(content)) !== null) {\n const classBody = match[1]\n const methodRegex = /(^\\s*(?:public|private|protected|static|async|abstract|\\s)*\\w+\\s*\\([^)]*\\)(?:\\s*:\\s*[^{]+)?)\\s*\\{/gm\n\n let methodMatch\n while ((methodMatch = methodRegex.exec(classBody)) !== null) {\n methods.push(methodMatch[1].trim())\n }\n }\n\n return methods.join('\\n')\n}\n\nexport function extractFunctionSignatures(content: string): string {\n const funcRegex = /(export\\s+)?(async\\s+)?function\\s+\\w+\\s*\\([^)]*\\)(?:\\s*:\\s*[^{]+)?\\s*\\{/g\n const signatures: string[] = []\n\n let match\n while ((match = funcRegex.exec(content)) !== null) {\n signatures.push(match[0].replace(/\\{$/, ''))\n }\n\n return signatures.join('\\n')\n}\n\nexport function extractTypeDefinitions(content: string): string {\n const typeRegex = /(export\\s+)?(interface|type)\\s+\\w+[^{]*\\{[^}]*\\}|(export\\s+)?type\\s+\\w+\\s*=[^;]+;?/g\n const types: string[] = []\n\n let match\n while ((match = typeRegex.exec(content)) !== null) {\n types.push(match[0].trim())\n }\n\n return types.join('\\n')\n}\n","export function smartTruncate(content: string, maxTokens: number): string {\n const lines = content.split('\\n')\n const estimatedTokens = Math.ceil(content.length / 4)\n\n if (estimatedTokens <= maxTokens) return content\n\n const targetLines = Math.round(maxTokens * 4 / (content.length / lines.length))\n const headerLines = Math.floor(targetLines * 0.3)\n const footerLines = Math.floor(targetLines * 0.3)\n const omitted = lines.length - headerLines - footerLines\n\n const header = lines.slice(0, headerLines)\n const footer = lines.slice(-footerLines)\n\n return [...header, `\\n... [${omitted} lines omitted] ...\\n`, ...footer].join('\\n')\n}\n\nexport function truncateByTokens(text: string, maxTokens: number): string {\n const maxChars = maxTokens * 4\n if (text.length <= maxChars) return text\n\n const truncated = text.slice(0, maxChars)\n const lastNewline = truncated.lastIndexOf('\\n')\n\n return truncated.slice(0, lastNewline > 0 ? lastNewline : maxChars) + '\\n\\n... (truncated)'\n}\n\nexport function preserveContext(lines: string[], targetIndex: number, before: number, after: number): string[] {\n const start = Math.max(0, targetIndex - before)\n const end = Math.min(lines.length, targetIndex + after + 1)\n return lines.slice(start, end)\n}\n","import type { Compressor, CompressedResult, FileReadInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\nimport { stripAll } from './strip.js'\nimport { extractExports, extractClassMethods, extractFunctionSignatures, extractTypeDefinitions } from './structure.js'\nimport { smartTruncate } from './truncate.js'\n\nexport class FileReadCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { content, filePath, language } = input as FileReadInput\n\n const lines = content.split('\\n').length\n const tokens = Math.ceil(content.length / 4)\n\n if (tokens < 200) {\n return {\n content: content,\n original: content,\n confidence: 1.0,\n metadata: {\n strategy: 'passthrough',\n originalLines: lines,\n compressedLines: lines,\n savings: 0\n }\n }\n }\n\n const stripped = stripAll(content)\n\n const exports = extractExports(stripped)\n const classes = extractClassMethods(stripped)\n const functions = extractFunctionSignatures(stripped)\n const types = extractTypeDefinitions(stripped)\n\n const sections = [\n `// ${filePath} (${content.split('\\n').length} lines)`,\n '',\n '// Exports:',\n exports,\n '',\n '// Classes:',\n classes,\n '',\n '// Functions:',\n functions,\n '',\n '// Types:',\n types\n ].filter(l => l !== '' && !l.endsWith(':'))\n\n let compressed = sections.join('\\n')\n\n const maxTokens = 2000\n compressed = smartTruncate(compressed, maxTokens)\n\n return {\n content: compressed,\n original: content,\n confidence: calculateConfidence(content, compressed),\n metadata: {\n strategy: 'hybrid',\n originalLines: content.split('\\n').length,\n compressedLines: compressed.split('\\n').length,\n savings: 1 - (compressed.length / content.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GrepCompressor } from '../../compress/grep.js'\n\nconst execAsync = promisify(exec)\n\ninterface GrepMatch {\n file: string\n line: number\n content: string\n}\n\nfunction parseGrepOutput(output: string): GrepMatch[] {\n const matches: GrepMatch[] = []\n const lines = output.split('\\n').filter(Boolean)\n\n for (const line of lines) {\n const parts = line.split(':')\n if (parts.length >= 3) {\n matches.push({\n file: parts[0],\n line: parseInt(parts[1], 10) || 0,\n content: parts.slice(2).join(':').trim()\n })\n }\n }\n\n return matches\n}\n\nexport async function grepCommand(pattern: string, directory: string, options: { ignore?: string }): Promise<void> {\n try {\n let cmd = `grep -rn \"${pattern}\" ${directory}`\n if (options.ignore) {\n cmd += ` --include=\"*.${options.ignore}\"`\n }\n\n const { stdout } = await execAsync(cmd, { maxBuffer: 10 * 1024 * 1024 })\n const matches = parseGrepOutput(stdout)\n\n if (matches.length === 0) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n return\n }\n\n const compressor = new GrepCompressor()\n const result = await compressor.compress({\n results: matches,\n pattern,\n directory\n })\n\n console.log(JSON.stringify({\n pattern,\n directory,\n compressed: result.content,\n confidence: result.confidence,\n total: matches.length,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n if (error.code === 1) {\n console.log(JSON.stringify({ pattern, directory, matches: [], total: 0 }))\n } else {\n console.error(`Error grep:`, error.message)\n process.exit(1)\n }\n }\n}\n","import type { Compressor, CompressedResult, GrepInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GrepCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { results } = input as GrepInput\n \n // Group by file\n const grouped = this.groupByFile(results)\n \n // Format output\n const lines: string[] = []\n for (const [file, matches] of grouped) {\n lines.push(`${file} (${matches.length} matches)`)\n const unique = this.deduplicate(matches)\n for (const match of unique) {\n lines.push(` L${match.line}: ${match.content}`)\n }\n }\n \n const compressed = lines.join('\\n')\n const original = results.map(r => `${r.file}:${r.line}: ${r.content}`).join('\\n')\n \n return {\n content: compressed,\n original,\n confidence: calculateConfidence(original, compressed),\n metadata: {\n strategy: 'grouped',\n totalMatches: results.length,\n uniqueFiles: grouped.size,\n savings: 1 - (compressed.length / original.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private groupByFile(results: GrepInput['results']): Map<string, GrepInput['results']> {\n const grouped = new Map<string, GrepInput['results']>()\n \n for (const result of results) {\n const existing = grouped.get(result.file) || []\n existing.push(result)\n grouped.set(result.file, existing)\n }\n \n return grouped\n }\n\n private deduplicate(matches: GrepInput['results']): GrepInput['results'] {\n const seen = new Set<string>()\n return matches.filter(match => {\n const key = match.content.trim()\n if (seen.has(key)) return false\n seen.add(key)\n return true\n })\n }\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport { GitDiffCompressor } from '../../compress/git-diff.js'\n\nconst execAsync = promisify(exec)\n\nexport async function gitDiffCommand(options: { staged?: boolean }): Promise<void> {\n try {\n const flag = options.staged ? '--staged' : ''\n const { stdout } = await execAsync(`git diff ${flag}`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n console.log(JSON.stringify({ diff: '', changes: 0 }))\n return\n }\n\n const compressor = new GitDiffCompressor()\n const result = await compressor.compress({ diff: stdout })\n\n console.log(JSON.stringify({\n compressed: result.content,\n confidence: result.confidence,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git diff:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function gitStatusCommand(): Promise<void> {\n try {\n const { stdout } = await execAsync('git status --porcelain')\n const lines = stdout.split('\\n').filter(Boolean)\n\n const files = lines.map(line => ({\n status: line[0],\n path: line.slice(3)\n }))\n\n console.log(JSON.stringify({\n total: files.length,\n files\n }, null, 2))\n } catch (error: any) {\n console.error(`Error git status:`, error.message)\n process.exit(1)\n }\n}\n","import type { Compressor, CompressedResult, GitDiffInput } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GitDiffCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { diff } = input as GitDiffInput\n\n const files = this.parseDiff(diff)\n\n const lines: string[] = []\n\n const totalAdd = files.reduce((s, f) => s + f.additions, 0)\n const totalDel = files.reduce((s, f) => s + f.deletions, 0)\n lines.push(`# ${files.length} files changed: +${totalAdd} -${totalDel}`)\n lines.push('')\n\n for (const file of files) {\n lines.push(`${file.path} (+${file.additions} -${file.deletions})`)\n\n const changes = file.lines\n .filter(l => l.type === 'add' || l.type === 'del')\n .map(l => `${l.type === 'add' ? '+' : '-'}${l.content}`)\n\n const limited = changes.slice(0, 20)\n lines.push(...limited)\n\n if (changes.length > 20) {\n lines.push(`... [${changes.length - 20} more changes]`)\n }\n\n lines.push('')\n }\n\n const compressed = lines.join('\\n')\n\n return {\n content: compressed,\n original: diff,\n confidence: calculateConfidence(diff, compressed),\n metadata: {\n strategy: 'condensed',\n filesChanged: files.length,\n savings: 1 - (compressed.length / diff.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private parseDiff(diff: string): FileDiff[] {\n const files: FileDiff[] = []\n const lines = diff.split('\\n')\n\n let current: FileDiff | null = null\n\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n if (current) files.push(current)\n const match = line.match(/b\\/(.+)/)\n current = {\n path: match?.[1] || 'unknown',\n additions: 0,\n deletions: 0,\n lines: []\n }\n } else if (current) {\n if (line.startsWith('+')) {\n current.additions++\n current.lines.push({ type: 'add', content: line.slice(1) })\n } else if (line.startsWith('-')) {\n current.deletions++\n current.lines.push({ type: 'del', content: line.slice(1) })\n }\n }\n }\n\n if (current) files.push(current)\n return files\n }\n}\n\ninterface FileDiff {\n path: string\n additions: number\n deletions: number\n lines: { type: string; content: string }[]\n}\n","import Database from 'better-sqlite3'\n\nexport type Database = Database.Database\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n content TEXT NOT NULL,\n original TEXT,\n embedding BLOB,\n metadata TEXT NOT NULL DEFAULT '{}',\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n accessed_at INTEGER NOT NULL DEFAULT (unixepoch()),\n access_count INTEGER DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source TEXT NOT NULL,\n target TEXT NOT NULL,\n type TEXT NOT NULL,\n weight REAL DEFAULT 1.0,\n metadata TEXT,\n created_at INTEGER NOT NULL DEFAULT (unixepoch()),\n FOREIGN KEY (source) REFERENCES nodes(id),\n FOREIGN KEY (target) REFERENCES nodes(id)\n);\n\nCREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);\nCREATE INDEX IF NOT EXISTS idx_nodes_created ON nodes(created_at);\nCREATE INDEX IF NOT EXISTS idx_nodes_accessed ON nodes(accessed_at);\nCREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source);\nCREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target);\nCREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);\n`\n\nexport async function createDatabase(dbPath: string): Promise<Database> {\n const db = new Database(dbPath)\n db.pragma('journal_mode = WAL')\n db.pragma('foreign_keys = ON')\n \n db.exec(SCHEMA)\n \n return db\n}","export interface CacheEntry {\n content: string\n metadata: Record<string, any>\n}\n\nexport interface CacheStats {\n hits: number\n misses: number\n size: number\n hitRate: number\n}\n\nexport class SessionCache {\n private store = new Map<string, CacheEntry>()\n private hits = 0\n private misses = 0\n\n get(key: string): CacheEntry | null {\n const entry = this.store.get(key)\n if (entry) {\n this.hits++\n return entry\n }\n this.misses++\n return null\n }\n\n set(key: string, value: CacheEntry): void {\n this.store.set(key, value)\n }\n\n clear(): void {\n this.store.clear()\n this.hits = 0\n this.misses = 0\n }\n\n stats(): CacheStats {\n const total = this.hits + this.misses\n return {\n hits: this.hits,\n misses: this.misses,\n size: this.store.size,\n hitRate: total > 0 ? this.hits / total : 0\n }\n }\n}\n","import type { Database } from '../graph/database.js'\nimport type { CacheEntry } from './l1-session.js'\n\ninterface CacheOptions {\n ttl?: number\n}\n\nexport class CrossSessionCache {\n constructor(private db: Database) {}\n\n async get(key: string): Promise<CacheEntry | null> {\n const row = this.db.prepare(`\n SELECT content, metadata, created_at \n FROM nodes \n WHERE id = ? AND type = 'cache'\n `).get(key) as { content: string; metadata: string; created_at: number } | undefined\n\n if (!row) return null\n\n const metadata = JSON.parse(row.metadata)\n if (metadata.ttl) {\n const age = Date.now() / 1000 - row.created_at\n if (age > metadata.ttl) {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n return null\n }\n }\n\n this.db.prepare(`\n UPDATE nodes SET accessed_at = unixepoch(), access_count = access_count + 1\n WHERE id = ?\n `).run(key)\n\n return {\n content: row.content,\n metadata: JSON.parse(row.metadata)\n }\n }\n\n async set(key: string, value: CacheEntry, options?: CacheOptions): Promise<void> {\n this.db.prepare(`\n INSERT INTO nodes (id, type, content, metadata, created_at, accessed_at, access_count)\n VALUES (?, 'cache', ?, ?, unixepoch(), unixepoch(), 1)\n ON CONFLICT(id) DO UPDATE SET\n content = excluded.content,\n metadata = excluded.metadata,\n accessed_at = unixepoch(),\n access_count = access_count + 1\n `).run(key, value.content, JSON.stringify({ ...value.metadata, ttl: options?.ttl }))\n }\n\n async delete(key: string): Promise<void> {\n this.db.prepare('DELETE FROM nodes WHERE id = ?').run(key)\n }\n\n async clear(): Promise<void> {\n this.db.prepare(\"DELETE FROM nodes WHERE type = 'cache'\").run()\n }\n}\n","import type { Database } from '../graph/database.js'\nimport { SessionCache, type CacheEntry, type CacheStats } from './l1-session.js'\nimport { CrossSessionCache } from './l2-cross.js'\nimport { SemanticCache } from './semantic.js'\n\nexport interface UnifiedCacheStats {\n l1: CacheStats\n l2: { size: number }\n}\n\nexport function createCacheManager(db?: Database) {\n const session = new SessionCache()\n const crossSession = db ? new CrossSessionCache(db) : (null as any)\n const semantic = new SemanticCache()\n\n return {\n session,\n crossSession,\n semantic\n }\n}\n\nexport function makeLatenCache(db: Database) {\n const l1 = new SessionCache()\n const l2 = new CrossSessionCache(db)\n\n return {\n l1,\n l2,\n\n async get(key: string): Promise<CacheEntry | null> {\n const l1Result = l1.get(key)\n if (l1Result) return l1Result\n\n const l2Result = await l2.get(key)\n if (l2Result) {\n l1.set(key, l2Result)\n return l2Result\n }\n\n return null\n },\n\n async set(key: string, value: CacheEntry, options?: { ttl?: number }): Promise<void> {\n l1.set(key, value)\n await l2.set(key, value, options)\n },\n\n async invalidate(pattern: string): Promise<void> {\n l1.clear()\n await l2.clear()\n },\n\n stats(): UnifiedCacheStats {\n return {\n l1: l1.stats(),\n l2: { size: 0 }\n }\n }\n }\n}\n\nexport { SessionCache, CrossSessionCache, SemanticCache }\nexport type { CacheEntry, CacheStats }\n","import { createDatabase } from '../../graph/database.js'\nimport { makeLatenCache } from '../../cache/index.js'\n\nexport async function cacheStatsCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n const stats = cache.stats()\n\n console.log(JSON.stringify({\n l1: {\n hits: stats.l1.hits,\n misses: stats.l1.misses,\n size: stats.l1.size,\n hitRate: `${(stats.l1.hitRate * 100).toFixed(1)}%`\n },\n l2: {\n size: stats.l2.size\n }\n }, null, 2))\n\n db.close()\n } catch (error: any) {\n console.error(`Error cache stats:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function cacheClearCommand(): Promise<void> {\n try {\n const dbPath = process.env.MAKE_LATEN_DB || '.make-laten.db'\n const db = await createDatabase(dbPath)\n const cache = makeLatenCache(db)\n\n await cache.invalidate('*')\n\n console.log(JSON.stringify({ cleared: true }))\n db.close()\n } catch (error: any) {\n console.error(`Error cache clear:`, error.message)\n process.exit(1)\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\n\nexport class DuckDuckGoBackend implements WebBackend {\n name = 'duckduckgo'\n\n isAvailable(): boolean {\n return true\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const maxResults = options?.maxResults || 5\n\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`\n const response = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; make-laten/0.1.0)'\n }\n })\n\n const html = await response.text()\n return this.parseResults(html, maxResults)\n }\n\n private parseResults(html: string, maxResults: number): SearchResult[] {\n const results: SearchResult[] = []\n const resultRegex = /<a[^>]*class=\"result__a\"[^>]*href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n const snippetRegex = /<a[^>]*class=\"result__snippet\"[^>]*>([\\s\\S]*?)<\\/a>/gi\n let match: RegExpExecArray | null\n\n const urls: string[] = []\n const titles: string[] = []\n\n while ((match = resultRegex.exec(html)) !== null && urls.length < maxResults) {\n const rawUrl = match[1]\n const urlMatch = rawUrl.match(/uddg=([^&]+)/)\n const url = urlMatch ? decodeURIComponent(urlMatch[1]) : rawUrl\n const title = this.stripTags(match[2]).trim()\n\n if (url && title) {\n urls.push(url)\n titles.push(title)\n }\n }\n\n const snippets: string[] = []\n while ((match = snippetRegex.exec(html)) !== null && snippets.length < maxResults) {\n snippets.push(this.stripTags(match[1]).trim())\n }\n\n for (let i = 0; i < urls.length; i++) {\n results.push({\n title: titles[i],\n url: urls[i],\n snippet: snippets[i] || '',\n score: 1 - (i * 0.1)\n })\n }\n\n return results\n }\n\n private stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&#x27;/g, \"'\").replace(/&quot;/g, '\"')\n }\n}\n","import type { WebBackend, SearchOptions, SearchResult } from '../types.js'\nimport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport { DuckDuckGoBackend } from './duckduckgo.js'\n\nexport function selectBackend(preferred?: string): WebBackend {\n const backends: WebBackend[] = [\n new DuckDuckGoBackend()\n ]\n\n if (preferred) {\n const found = backends.find(b => b.name === preferred)\n if (found) return found\n }\n\n return backends.find(b => b.isAvailable()) || backends[0]\n}\n","import type { SemanticIR, SectionIR, CodeExample } from './types.js'\n\ninterface ParsedNode {\n tag: string\n text: string\n children: ParsedNode[]\n}\n\nfunction parseSimpleHTML(html: string): ParsedNode[] {\n const nodes: ParsedNode[] = []\n const tagRegex = /<(\\w+)([^>]*)>([\\s\\S]*?)<\\/\\1>/g\n let match: RegExpExecArray | null\n\n while ((match = tagRegex.exec(html)) !== null) {\n const tag = match[1]\n const content = match[3]\n\n if (['script', 'style', 'noscript'].includes(tag)) continue\n\n nodes.push({\n tag,\n text: stripTags(content).trim(),\n children: content.includes('<') ? parseSimpleHTML(content) : []\n })\n }\n\n return nodes\n}\n\nfunction stripTags(html: string): string {\n return html.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\")\n}\n\nfunction extractTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n if (titleMatch) return stripTags(titleMatch[1]).trim()\n\n const h1Match = html.match(/<h1[^>]*>([\\s\\S]*?)<\\/h1>/i)\n if (h1Match) return stripTags(h1Match[1]).trim()\n\n return 'Untitled'\n}\n\nfunction extractSections(html: string): SectionIR[] {\n const sections: SectionIR[] = []\n const headingRegex = /<h([1-6])[^>]*>([\\s\\S]*?)<\\/h\\1>/gi\n let match: RegExpExecArray | null\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const heading = stripTags(match[2]).trim()\n\n const startPos = match.index + match[0].length\n const nextHeading = html.substring(startPos).match(/<h[1-6]/i)\n const endPos = nextHeading ? startPos + nextHeading.index! : html.length\n const content = stripTags(html.substring(startPos, endPos)).trim()\n\n if (!content) continue\n\n const importance = level <= 2 ? 'primary' : level <= 4 ? 'secondary' : 'tertiary'\n\n sections.push({ heading, level, content, importance })\n }\n\n return sections\n}\n\nfunction extractCodeExamples(html: string): CodeExample[] {\n const examples: CodeExample[] = []\n const codeRegex = /<(?:pre|code)[^>]*>[\\s\\S]*?<(?:code|\\/pre)[^>]*>/gi\n const blockRegex = /<pre[^>]*><code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code><\\/pre>/gi\n let match: RegExpExecArray | null\n\n while ((match = blockRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 10) {\n examples.push({ language, code })\n }\n }\n\n const inlineRegex = /<code[^>]*class=\"[^\"]*language-(\\w+)[^\"]*\"[^>]*>([\\s\\S]*?)<\\/code>/gi\n while ((match = inlineRegex.exec(html)) !== null) {\n const language = match[1]\n const code = stripTags(match[2]).trim()\n\n if (code.length > 20 && !examples.some(e => e.code === code)) {\n examples.push({ language, code })\n }\n }\n\n return examples.slice(0, 10)\n}\n\nfunction extractKeyPoints(sections: SectionIR[]): string[] {\n const keyPoints: string[] = []\n\n for (const section of sections.filter(s => s.importance === 'primary')) {\n const sentences = section.content.split(/[.!?\\n]+/).filter(s => s.trim().length > 10)\n if (sentences.length > 0) {\n keyPoints.push(sentences[0].trim())\n }\n }\n\n return keyPoints.slice(0, 5)\n}\n\nfunction classifyPurpose(html: string, sections: SectionIR[]): SemanticIR['purpose'] {\n const text = (html + ' ' + sections.map(s => s.heading).join(' ')).toLowerCase()\n\n if (text.includes('api reference') || text.includes('endpoint') || text.includes('parameters')) return 'reference'\n if (text.includes('tutorial') || text.includes('step by step') || text.includes('getting started')) return 'tutorial'\n if (text.includes('blog') || text.includes('published') || text.includes('author')) return 'blog'\n if (text.includes('install') || text.includes('quickstart') || text.includes('overview')) return 'documentation'\n\n return 'documentation'\n}\n\nexport function extractSemantic(html: string, url: string): SemanticIR {\n const title = extractTitle(html)\n const sections = extractSections(html)\n const codeExamples = extractCodeExamples(html)\n const keyPoints = extractKeyPoints(sections)\n const purpose = classifyPurpose(html, sections)\n\n return {\n type: 'webpage',\n url,\n title,\n purpose,\n sections,\n keyPoints,\n codeExamples,\n metadata: {\n language: html.match(/lang=\"(\\w+)\"/)?.[1] || 'en',\n author: html.match(/<meta[^>]*name=\"author\"[^>]*content=\"([^\"]+)\"/i)?.[1],\n tags: html.match(/<meta[^>]*name=\"keywords\"[^>]*content=\"([^\"]+)\"/i)?.[1]?.split(',').map(t => t.trim())\n }\n }\n}\n","import type { SemanticIR, SectionIR } from './types.js'\n\nexport interface CompressOptions {\n maxTokens?: number\n includeCode?: boolean\n includeSections?: 'all' | 'primary' | 'none'\n}\n\nexport function compressWebContent(semantic: SemanticIR, options: CompressOptions = {}): string {\n const { maxTokens = 1000, includeCode = true, includeSections = 'all' } = options\n const lines: string[] = []\n\n lines.push(`# ${semantic.title}`)\n lines.push(`URL: ${semantic.url}`)\n lines.push(`Purpose: ${semantic.purpose}`)\n lines.push('')\n\n if (semantic.keyPoints.length > 0) {\n lines.push('## Key Points')\n for (const point of semantic.keyPoints) {\n lines.push(`- ${point}`)\n }\n lines.push('')\n }\n\n const filteredSections = filterSections(semantic.sections, includeSections)\n\n for (const section of filteredSections) {\n const content = truncateContent(section.content, 500)\n lines.push(`## ${section.heading}`)\n lines.push(content)\n lines.push('')\n }\n\n if (includeCode && semantic.codeExamples.length > 0) {\n const topExamples = semantic.codeExamples.slice(0, 3)\n lines.push('## Code Examples')\n for (const example of topExamples) {\n lines.push(`\\`\\`\\`${example.language}`)\n lines.push(truncateContent(example.code, 300))\n lines.push('```')\n lines.push('')\n }\n }\n\n let result = lines.join('\\n')\n\n const estimatedTokens = estimateTokens(result)\n if (estimatedTokens > maxTokens) {\n result = truncateByTokens(result, maxTokens)\n }\n\n return result\n}\n\nfunction filterSections(sections: SectionIR[], mode: 'all' | 'primary' | 'none'): SectionIR[] {\n if (mode === 'none') return []\n if (mode === 'primary') return sections.filter(s => s.importance === 'primary')\n return sections\n}\n\nfunction truncateContent(content: string, maxLength: number): string {\n if (content.length <= maxLength) return content\n return content.slice(0, maxLength) + '...'\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\nfunction truncateByTokens(text: string, maxTokens: number): string {\n const maxChars = maxTokens * 4\n if (text.length <= maxChars) return text\n\n const truncated = text.slice(0, maxChars)\n const lastNewline = truncated.lastIndexOf('\\n')\n\n return truncated.slice(0, lastNewline > 0 ? lastNewline : maxChars) + '\\n\\n... (truncated)'\n}\n","import type { SearchOptions, SearchResult, FetchOptions, FetchResult } from './types.js'\nimport { selectBackend } from './backends/index.js'\nimport { extractSemantic } from './extractor.js'\nimport { compressWebContent } from './compressor.js'\n\nexport class WebRouter {\n private fetchCache: Map<string, FetchResult> = new Map()\n private searchCache: Map<string, SearchResult[]> = new Map()\n private cacheTtl: number\n\n constructor(options?: { cacheTtlMs?: number }) {\n this.cacheTtl = options?.cacheTtlMs || 60 * 60 * 1000\n }\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${JSON.stringify(options || {})}`\n\n const cached = this.searchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n\n const backend = selectBackend(options?.backend)\n const results = await backend.search(query, options)\n\n this.searchCache.set(cacheKey, results)\n this.storeFreshness(cacheKey)\n\n return results\n }\n\n async fetch(url: string, options?: FetchOptions): Promise<FetchResult> {\n const cacheKey = `fetch:${url}:${options?.format || 'text'}`\n\n if (options?.cache !== false) {\n const cached = this.fetchCache.get(cacheKey)\n if (cached && this.isFresh(cacheKey)) {\n return cached\n }\n }\n\n const startTime = Date.now()\n const response = await fetch(url)\n const html = await response.text()\n const originalSize = html.length\n\n let content: string\n let semantic = undefined\n\n if (options?.extract !== false) {\n semantic = extractSemantic(html, url)\n content = compressWebContent(semantic, {\n includeCode: true,\n includeSections: options?.format === 'html' ? 'all' : 'primary'\n })\n } else {\n content = html\n }\n\n const compressedSize = content.length\n const result: FetchResult = {\n url,\n title: semantic?.title || extractSimpleTitle(html),\n content,\n semantic,\n metadata: {\n fetchTime: Date.now() - startTime,\n originalSize,\n compressedSize,\n savings: 1 - (compressedSize / originalSize)\n }\n }\n\n if (options?.cache !== false) {\n this.fetchCache.set(cacheKey, result)\n this.storeFreshness(cacheKey)\n }\n\n return result\n }\n\n async extract(url: string): Promise<FetchResult> {\n return this.fetch(url, { extract: true, compress: true })\n }\n\n async summarize(content: string, options?: { maxTokens?: number }): Promise<string> {\n const lines = content.split('\\n')\n const summaryLines: string[] = []\n let tokenCount = 0\n const maxTokens = options?.maxTokens || 200\n\n for (const line of lines) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n\n if (line.startsWith('#') || line.startsWith('-') || line.startsWith('*')) {\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n if (summaryLines.length === 0 && lines.length > 0) {\n for (const line of lines.slice(0, 5)) {\n const lineTokens = Math.ceil(line.length / 4)\n if (tokenCount + lineTokens > maxTokens) break\n summaryLines.push(line)\n tokenCount += lineTokens\n }\n }\n\n return summaryLines.join('\\n')\n }\n\n clearCache(): void {\n this.fetchCache.clear()\n this.searchCache.clear()\n }\n\n getCacheStats(): { fetchSize: number; searchSize: number } {\n return {\n fetchSize: this.fetchCache.size,\n searchSize: this.searchCache.size\n }\n }\n\n private isFresh(key: string): boolean {\n const timestamp = this.freshness.get(key)\n if (!timestamp) return false\n return Date.now() - timestamp < this.cacheTtl\n }\n\n private storeFreshness(key: string): void {\n this.freshness.set(key, Date.now())\n }\n\n private freshness: Map<string, number> = new Map()\n}\n\nfunction extractSimpleTitle(html: string): string {\n const titleMatch = html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)\n return titleMatch ? titleMatch[1].replace(/<[^>]+>/g, '').trim() : 'Untitled'\n}\n","import { WebRouter } from '../../web/router.js'\n\nexport async function searchCommand(query: string, options: { backend?: string; max?: number }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const results = await router.search(query, {\n maxResults: options.max || 5,\n backend: options.backend\n })\n\n console.log(JSON.stringify({\n query,\n total: results.length,\n results: results.map(r => ({\n title: r.title,\n url: r.url,\n snippet: r.snippet,\n score: r.score\n }))\n }, null, 2))\n } catch (error: any) {\n console.error(`Error search:`, error.message)\n process.exit(1)\n }\n}\n\nexport async function fetchCommand(url: string, options: { compress?: boolean; extract?: boolean }): Promise<void> {\n try {\n const router = new WebRouter()\n\n const result = await router.fetch(url, {\n compress: options.compress !== false,\n extract: options.extract !== false,\n cache: true\n })\n\n console.log(JSON.stringify({\n url: result.url,\n title: result.title,\n content: result.content,\n metadata: result.metadata\n }, null, 2))\n } catch (error: any) {\n console.error(`Error fetch:`, error.message)\n process.exit(1)\n }\n}\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\n\nconst execAsync = promisify(exec)\n\nconst RULES_CONTENT = `\n# make-laten efficiency rules\n\n## Token Optimization\n- When reading files, use \\`make-laten read <file>\\` for compressed output\n- When searching code, use \\`make-laten grep <pattern>\\` for grouped results\n- When checking git, use \\`make-laten git diff\\` for condensed output\n- When fetching web, use \\`make-laten fetch <url>\\` for compressed content\n\n## Quick Commands\n- \\`mread <file>\\` — alias for make-laten read\n- \\`mgrep <pattern>\\` — alias for make-laten grep\n- \\`mdiff\\` — alias for make-laten git diff\n- \\`msearch <query>\\` — alias for make-laten search\n- \\`mfetch <url>\\` — alias for make-laten fetch\n`\n\ninterface AgentSetup {\n name: string\n detected: () => Promise<boolean>\n install: () => Promise<void>\n uninstall: () => Promise<void>\n}\n\nfunction getHome(): string {\n return process.env.HOME || process.env.USERPROFILE || ''\n}\n\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execAsync(`which ${cmd}`, { timeout: 3000 })\n return true\n } catch {\n return false\n }\n}\n\nasync function fileContains(filePath: string, text: string): Promise<boolean> {\n try {\n const content = await fs.readFile(filePath, 'utf-8')\n return content.includes(text)\n } catch {\n return false\n }\n}\n\nconst agents: AgentSetup[] = [\n {\n name: 'terminal (shell aliases)',\n detected: async () => true,\n install: async () => {\n const shellInit = await execAsync('echo $SHELL').then(r => r.stdout.trim())\n const rcFile = shellInit.includes('zsh') ? '.zshrc' : '.bashrc'\n const rcPath = path.join(getHome(), rcFile)\n const marker = 'make-laten shell'\n\n let existing = ''\n try { existing = await fs.readFile(rcPath, 'utf-8') } catch {}\n\n if (!existing.includes(marker)) {\n const npmRoot = await execAsync('npm root -g').then(r => r.stdout.trim())\n const initScript = `\\n# make-laten shell integration\\nsource ${npmRoot}/make-laten/shell/init.sh\\n`\n await fs.appendFile(rcPath, initScript)\n }\n },\n uninstall: async () => {\n const shellInit = await execAsync('echo $SHELL').then(r => r.stdout.trim())\n const rcFile = shellInit.includes('zsh') ? '.zshrc' : '.bashrc'\n const rcPath = path.join(getHome(), rcFile)\n try {\n let content = await fs.readFile(rcPath, 'utf-8')\n content = content.replace(/\\n# make-laten shell integration\\nsource .*\\/make-laten\\/shell\\/init\\.sh\\n/g, '')\n await fs.writeFile(rcPath, content)\n } catch {}\n }\n },\n {\n name: 'claude-code',\n detected: async () => commandExists('claude'),\n install: async () => {\n const hooksDir = path.join(getHome(), '.claude', 'hooks')\n await fs.mkdir(hooksDir, { recursive: true })\n\n const preHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\nif (input.tool === 'Read' || input.tool === 'Bash') {\n process.env.MAKE_LATEN_INTERCEPT = '1';\n}\nprocess.stdout.write(JSON.stringify(input));`\n\n const postHook = `#!/usr/bin/env node\nconst { readFileSync } = require('fs');\nconst input = JSON.parse(readFileSync('/dev/stdin', 'utf-8'));\nif (input.output && input.output.length > 10000) {\n input.output = input.output.slice(0, 10000) + '\\\\n... (truncated by make-laten)';\n}\nprocess.stdout.write(JSON.stringify(input));`\n\n await fs.writeFile(path.join(hooksDir, 'pre-tool-use.js'), preHook)\n await fs.writeFile(path.join(hooksDir, 'post-tool-use.js'), postHook)\n },\n uninstall: async () => {\n const hooksDir = path.join(getHome(), '.claude', 'hooks')\n try { await fs.rm(path.join(hooksDir, 'pre-tool-use.js'), { force: true }) } catch {}\n try { await fs.rm(path.join(hooksDir, 'post-tool-use.js'), { force: true }) } catch {}\n }\n },\n {\n name: 'cursor',\n detected: async () => {\n try { await fs.access(path.join(getHome(), '.cursor')); return true } catch { return false }\n },\n install: async () => {\n const rulesDir = path.join(getHome(), '.cursor', 'rules')\n await fs.mkdir(rulesDir, { recursive: true })\n const ruleFile = path.join(rulesDir, 'make-laten.mdc')\n const content = `---\\ndescription: make-laten efficiency rules\\nglobs:\\n---\\n${RULES_CONTENT}`\n await fs.writeFile(ruleFile, content)\n },\n uninstall: async () => {\n try { await fs.rm(path.join(getHome(), '.cursor', 'rules', 'make-laten.mdc'), { force: true }) } catch {}\n }\n },\n {\n name: 'codex',\n detected: async () => commandExists('codex'),\n install: async () => {\n const agentsMd = path.join(process.cwd(), 'AGENTS.md')\n let existing = ''\n try { existing = await fs.readFile(agentsMd, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n const content = existing + '\\n\\n## make-laten Integration\\n' + RULES_CONTENT\n await fs.writeFile(agentsMd, content)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), 'AGENTS.md'), 'utf-8')\n content = content.replace(/\\n## make-laten Integration[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), 'AGENTS.md'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'windsurf',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.windsurf')); return true } catch {\n try { await fs.access(path.join(getHome(), '.windsurf')); return true } catch { return false }\n }\n },\n install: async () => {\n const rulesPath = path.join(process.cwd(), '.windsurfrules')\n let existing = ''\n try { existing = await fs.readFile(rulesPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(rulesPath, existing + '\\n\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.windsurfrules'), 'utf-8')\n content = content.replace(/\\n# make-laten efficiency rules[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.windsurfrules'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'cline',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.clinerules')); return true } catch {\n try { await fs.access(path.join(getHome(), '.cline')); return true } catch { return false }\n }\n },\n install: async () => {\n const rulesPath = path.join(process.cwd(), '.clinerules')\n let existing = ''\n try { existing = await fs.readFile(rulesPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(rulesPath, existing + '\\n\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.clinerules'), 'utf-8')\n content = content.replace(/\\n# make-laten efficiency rules[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.clinerules'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'copilot',\n detected: async () => {\n try { await fs.access(path.join(process.cwd(), '.github')); return true } catch { return false }\n },\n install: async () => {\n const dir = path.join(process.cwd(), '.github')\n await fs.mkdir(dir, { recursive: true })\n const instructionsPath = path.join(dir, 'copilot-instructions.md')\n let existing = ''\n try { existing = await fs.readFile(instructionsPath, 'utf-8') } catch {}\n if (!existing.includes('make-laten')) {\n await fs.writeFile(instructionsPath, existing + '\\n\\n## make-laten Efficiency\\n' + RULES_CONTENT)\n }\n },\n uninstall: async () => {\n try {\n let content = await fs.readFile(path.join(process.cwd(), '.github', 'copilot-instructions.md'), 'utf-8')\n content = content.replace(/\\n## make-laten Efficiency[\\s\\S]*$/, '')\n await fs.writeFile(path.join(process.cwd(), '.github', 'copilot-instructions.md'), content.trim() + '\\n')\n } catch {}\n }\n },\n {\n name: 'opencode',\n detected: async () => {\n try { await fs.access(path.join(getHome(), '.config', 'opencode')); return true } catch { return false }\n },\n install: async () => {\n const skillsDir = path.join(getHome(), '.config', 'opencode', 'skills', 'make-laten')\n await fs.mkdir(skillsDir, { recursive: true })\n\n const npmRoot = await execAsync('npm root -g').then(r => r.stdout.trim())\n const skillSrc = path.join(npmRoot, 'make-laten', 'skills', 'SKILL.md')\n\n try {\n const skillContent = await fs.readFile(skillSrc, 'utf-8')\n await fs.writeFile(path.join(skillsDir, 'SKILL.md'), skillContent)\n } catch {\n await fs.writeFile(path.join(skillsDir, 'SKILL.md'), `---\\nname: make-laten\\ndescription: Token optimization toolkit\\n---\\n\\n# make-laten Skill\\n\\nUse make-laten CLI commands for all file/code/git operations.\\n`)\n }\n },\n uninstall: async () => {\n try { await fs.rm(path.join(getHome(), '.config', 'opencode', 'skills', 'make-laten'), { recursive: true, force: true }) } catch {}\n }\n }\n]\n\nexport class Installer {\n async install(): Promise<{ installed: string[]; skipped: string[] }> {\n const installed: string[] = []\n const skipped: string[] = []\n\n for (const agent of agents) {\n try {\n const detected = await agent.detected()\n if (detected) {\n await agent.install()\n installed.push(agent.name)\n } else {\n skipped.push(agent.name)\n }\n } catch {\n skipped.push(agent.name)\n }\n }\n\n return { installed, skipped }\n }\n\n async uninstall(): Promise<{ removed: string[] }> {\n const removed: string[] = []\n\n for (const agent of agents) {\n try {\n await agent.uninstall()\n removed.push(agent.name)\n } catch {}\n }\n\n return { removed }\n }\n\n async status(): Promise<{ name: string; detected: boolean; installed: boolean }[]> {\n const result: { name: string; detected: boolean; installed: boolean }[] = []\n\n for (const agent of agents) {\n try {\n const detected = await agent.detected()\n result.push({ name: agent.name, detected, installed: false })\n } catch {\n result.push({ name: agent.name, detected: false, installed: false })\n }\n }\n\n return result\n }\n}\n","import { Installer } from '../../adapter/installer.js'\n\nexport async function installCommand(options: { uninstall?: boolean; status?: boolean }): Promise<void> {\n const installer = new Installer()\n\n if (options.status) {\n console.log('Detecting platforms...\\n')\n const status = await installer.status()\n\n for (const s of status) {\n const icon = s.detected ? '✓' : '○'\n const label = s.detected ? 'detected' : 'not found'\n console.log(` ${icon} ${s.name} (${label})`)\n }\n return\n }\n\n if (options.uninstall) {\n console.log('Uninstalling make-laten from all platforms...\\n')\n const { removed } = await installer.uninstall()\n\n if (removed.length === 0) {\n console.log('Nothing to uninstall.')\n return\n }\n\n for (const name of removed) {\n console.log(` ✓ removed from ${name}`)\n }\n console.log(`\\nDone! Removed from ${removed.length} platform(s).`)\n return\n }\n\n console.log('Installing make-laten across all platforms...\\n')\n const { installed, skipped } = await installer.install()\n\n for (const name of installed) {\n console.log(` ✓ ${name}`)\n }\n\n for (const name of skipped) {\n console.log(` ○ ${name} (not detected)`)\n }\n\n console.log(`\\nDone! Configured for ${installed.length} platform(s).`)\n console.log('\\nAvailable commands (terminal):')\n console.log(' mread <file> compressed file read')\n console.log(' mgrep <pattern> grouped grep results')\n console.log(' mdiff compressed git diff')\n console.log(' mstatus git status summary')\n console.log(' msearch <query> web search')\n console.log(' mfetch <url> web fetch + compress')\n}\n","import { exec } from 'child_process'\nimport { promisify } from 'util'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport readline from 'readline'\n\nconst execAsync = promisify(exec)\n\ninterface AgentInfo {\n name: string\n detected: boolean\n configPath: string\n version?: string\n writeConfig: (configPath: string) => Promise<boolean>\n}\n\nfunction getHome(): string {\n return process.env.HOME || process.env.USERPROFILE || ''\n}\n\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execAsync(`which ${cmd}`, { timeout: 3000 })\n return true\n } catch {\n return false\n }\n}\n\nasync function directoryExists(dirPath: string): Promise<boolean> {\n try {\n await fs.access(dirPath)\n return true\n } catch {\n return false\n }\n}\n\nasync function readJSON(filePath: string): Promise<Record<string, any>> {\n try {\n const raw = await fs.readFile(filePath, 'utf-8')\n return JSON.parse(raw)\n } catch {\n return {}\n }\n}\n\nasync function writeJSON(filePath: string, data: Record<string, any>): Promise<boolean> {\n try {\n const dir = path.dirname(filePath)\n await fs.mkdir(dir, { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(data, null, 2))\n return true\n } catch {\n return false\n }\n}\n\nconst MCP_CMD = ['npx', '-y', 'make-laten-mcp', 'server']\n\nasync function detectAllAgents(): Promise<AgentInfo[]> {\n const home = getHome()\n const agents: AgentInfo[] = []\n\n // Claude Code — uses mcpServers format\n agents.push({\n name: 'Claude Code',\n detected: await commandExists('claude') || await directoryExists(path.join(home, '.claude')),\n configPath: path.join(home, '.claude', 'mcp.json'),\n version: await commandExists('claude') ? (await execAsync('claude --version', { timeout: 3000 }).then(r => r.stdout.trim().split('\\n')[0]).catch(() => 'unknown')) : undefined,\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n // Cursor — uses mcpServers format\n agents.push({\n name: 'Cursor',\n detected: await directoryExists(path.join(home, '.cursor')),\n configPath: path.join(home, '.cursor', 'mcp.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n // Codex — uses mcpServers format\n agents.push({\n name: 'Codex',\n detected: await commandExists('codex') || await directoryExists(path.join(home, '.codex')),\n configPath: path.join(home, '.codex', 'config.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n // OpenCode — uses mcp format (type + command array)\n agents.push({\n name: 'OpenCode',\n detected: await directoryExists(path.join(home, '.config', 'opencode')),\n configPath: path.join(home, '.config', 'opencode', 'opencode.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n // OpenCode uses \"mcp\" key, NOT \"mcpServers\"\n // Format: { \"type\": \"local\", \"command\": [...], \"enabled\": true }\n data.mcp = { ...(data.mcp || {}), 'make-laten': { type: 'local', command: MCP_CMD, enabled: true } }\n // Remove wrong mcpServers key if exists\n delete data.mcpServers\n return writeJSON(p, data)\n }\n })\n\n // Windsurf — uses mcpServers format\n agents.push({\n name: 'Windsurf',\n detected: await directoryExists(path.join(home, '.codeium', 'windsurf')),\n configPath: path.join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n // Cline — uses mcpServers format\n agents.push({\n name: 'Cline',\n detected: await directoryExists(path.join(home, '.cline')),\n configPath: path.join(home, '.cline', 'mcp_settings.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n // Gemini CLI\n agents.push({\n name: 'Gemini CLI',\n detected: await commandExists('gemini') || await directoryExists(path.join(home, '.gemini')),\n configPath: path.join(home, '.gemini', 'settings.json'),\n writeConfig: async (p) => {\n const data = await readJSON(p)\n data.mcpServers = { ...(data.mcpServers || {}), 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } }\n return writeJSON(p, data)\n }\n })\n\n return agents\n}\n\nfunction askQuestion(rl: readline.Interface, question: string): Promise<string> {\n return new Promise(resolve => rl.question(question, resolve))\n}\n\nexport async function initCommand(options: { all?: boolean; project?: boolean }): Promise<void> {\n console.log('')\n console.log(' make-laten setup wizard')\n console.log(' ======================')\n console.log('')\n\n const agents = await detectAllAgents()\n const detected = agents.filter(a => a.detected)\n const notDetected = agents.filter(a => !a.detected)\n\n console.log(' Detected agents:')\n for (const agent of detected) {\n const ver = agent.version ? ` v${agent.version}` : ''\n console.log(` ✓ ${agent.name}${ver}`)\n }\n\n if (notDetected.length > 0) {\n console.log('')\n console.log(' Not detected (skipped):')\n for (const agent of notDetected) {\n console.log(` ○ ${agent.name}`)\n }\n }\n\n console.log('')\n\n if (options.all) {\n for (const agent of detected) {\n const success = await agent.writeConfig(agent.configPath)\n if (success) {\n console.log(` ✓ ${agent.name} → MCP configured`)\n } else {\n console.log(` ✗ ${agent.name} → failed to write config`)\n }\n }\n } else if (options.project) {\n const cwd = process.cwd()\n const configPath = path.join(cwd, '.mcp.json')\n const data = { mcpServers: { 'make-laten': { command: 'npx', args: ['-y', 'make-laten-mcp', 'server'] } } }\n await writeJSON(configPath, data)\n console.log(` ✓ .mcp.json created in ${cwd}`)\n } else {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout })\n\n for (const agent of detected) {\n const answer = await askQuestion(rl, ` Configure ${agent.name}? (Y/n) `)\n if (answer.toLowerCase() !== 'n') {\n const success = await agent.writeConfig(agent.configPath)\n if (success) {\n console.log(` ✓ ${agent.name} → MCP configured`)\n } else {\n console.log(` ✗ ${agent.name} → failed`)\n }\n } else {\n console.log(` ○ ${agent.name} → skipped`)\n }\n }\n\n rl.close()\n }\n\n console.log('')\n console.log(' Setup complete!')\n console.log('')\n console.log(' make-laten provides:')\n console.log(' • MCP server → auto-compress for all AI agents')\n console.log(' • CLI commands → mread, mgrep, mdiff, msearch, mfetch')\n console.log(' • Shell aliases → auto-load in new terminals')\n console.log('')\n console.log(' Restart your agent to activate MCP tools.')\n console.log('')\n}\n","import type { Compressor, CompressedResult } from './types.js'\nimport { calculateConfidence } from './confidence.js'\n\nexport class GitStatusCompressor implements Compressor {\n async compress(input: unknown): Promise<CompressedResult> {\n const { status } = input as { status: string }\n\n const statusLines = status.split('\\n').filter(Boolean).length\n const tokens = Math.ceil(status.length / 4)\n\n if (tokens < 10) {\n return {\n content: status,\n original: status,\n confidence: 1.0,\n metadata: {\n strategy: 'passthrough',\n totalFiles: statusLines,\n savings: 0\n }\n }\n }\n\n const files = this.parseStatus(status)\n const grouped = this.groupByStatus(files)\n\n const lines: string[] = []\n\n for (const [statusType, statusFiles] of grouped) {\n const label = this.statusLabel(statusType)\n lines.push(`${label} (${statusFiles.length})`)\n\n const compressed = this.compressPaths(statusFiles.map(f => f.path))\n lines.push(...compressed)\n lines.push('')\n }\n\n const compressed = lines.join('\\n')\n\n return {\n content: compressed,\n original: status,\n confidence: calculateConfidence(status, compressed),\n metadata: {\n strategy: 'grouped',\n totalFiles: files.length,\n savings: 1 - (compressed.length / status.length)\n }\n }\n }\n\n async decompress(compressed: CompressedResult): Promise<unknown> {\n return compressed.original\n }\n\n private parseStatus(status: string): { status: string; path: string }[] {\n return status.split('\\n')\n .filter(Boolean)\n .map(line => {\n const match = line.match(/^(\\?\\?|[MADRC]+\\s+)(.+)$/)\n if (match) {\n return { status: match[1].trim(), path: match[2] }\n }\n return { status: line[0], path: line.slice(3) }\n })\n }\n\n private groupByStatus(files: { status: string; path: string }[]): Map<string, { status: string; path: string }[]> {\n const grouped = new Map<string, { status: string; path: string }[]>()\n\n for (const file of files) {\n const existing = grouped.get(file.status) || []\n existing.push(file)\n grouped.set(file.status, existing)\n }\n\n return grouped\n }\n\n private statusLabel(status: string): string {\n const labels: Record<string, string> = {\n 'M': 'Modified',\n 'A': 'Added',\n 'D': 'Deleted',\n '??': 'Untracked',\n 'R': 'Renamed'\n }\n return labels[status] || `Status ${status}`\n }\n\n private compressPaths(paths: string[]): string[] {\n if (paths.length <= 3) return paths.map(p => ` ${p}`)\n\n const parts = paths.map(p => p.split('/'))\n const minLength = Math.min(...parts.map(p => p.length))\n\n let commonIndex = 0\n for (let i = 0; i < minLength; i++) {\n if (parts.every(p => p[i] === parts[0][i])) {\n commonIndex = i\n } else {\n break\n }\n }\n\n if (commonIndex > 0) {\n const prefix = parts[0].slice(0, commonIndex).join('/')\n const suffixes = paths.map(p => p.slice(prefix.length + 1))\n return [` ${prefix}/`, ...suffixes.map(s => ` ${s}`)]\n }\n\n return paths.map(p => ` ${p}`)\n }\n}\n","#!/usr/bin/env node\n\nimport { FileReadCompressor } from '../../compress/file-read.js'\nimport { GitDiffCompressor } from '../../compress/git-diff.js'\nimport { GitStatusCompressor } from '../../compress/git-status.js'\nimport fs from 'fs'\nimport path from 'path'\nimport { execSync } from 'child_process'\n\nasync function benchmark() {\n const fileCompressor = new FileReadCompressor()\n const diffCompressor = new GitDiffCompressor()\n const statusCompressor = new GitStatusCompressor()\n const projectPath = process.cwd()\n\n console.log('')\n console.log(' make-laten benchmark')\n console.log(' ===================')\n console.log('')\n\n const results: { name: string; raw: number; compressed: number; savings: number }[] = []\n\n // 1. file-read\n const testFiles = ['src/index.ts', 'package.json', 'README.md', 'src/mcp/server.ts']\n for (const file of testFiles) {\n const full = path.join(projectPath, file)\n if (!fs.existsSync(full)) continue\n\n const content = fs.readFileSync(full, 'utf-8')\n const raw = Math.round(content.length / 4)\n const result = await fileCompressor.compress({ content, filePath: file })\n const compressed = Math.round(result.content.length / 4)\n results.push({ name: `read ${file}`, raw, compressed, savings: Math.round((1 - compressed / raw) * 100) })\n }\n\n // 2. git-diff\n try {\n const diff = execSync('git diff HEAD~1 2>/dev/null || echo \"\"', { cwd: projectPath, encoding: 'utf-8' }).trim()\n if (diff) {\n const raw = Math.round(diff.length / 4)\n const result = await diffCompressor.compress({ diff })\n const compressed = Math.round(result.content.length / 4)\n results.push({ name: 'git-diff', raw, compressed, savings: Math.round((1 - compressed / raw) * 100) })\n }\n } catch {}\n\n // 3. git-status\n try {\n const status = execSync('git status --porcelain 2>/dev/null || echo \"\"', { cwd: projectPath, encoding: 'utf-8' }).trim()\n if (status) {\n const raw = Math.round(status.length / 4)\n const result = await statusCompressor.compress({ status })\n const compressed = Math.round(result.content.length / 4)\n results.push({ name: 'git-status', raw, compressed, savings: Math.round((1 - compressed / raw) * 100) })\n }\n } catch {}\n\n // Print\n console.log(' Command'.padEnd(28) + 'Raw'.padEnd(10) + 'Compressed'.padEnd(12) + 'Savings')\n console.log(' ' + '─'.repeat(60))\n for (const r of results) {\n console.log(` ${r.name}`.padEnd(28) + `${r.raw}`.padEnd(10) + `${r.compressed}`.padEnd(12) + `${r.savings}%`)\n }\n\n const totalRaw = results.reduce((s, r) => s + r.raw, 0)\n const totalCompressed = results.reduce((s, r) => s + r.compressed, 0)\n const savings = Math.round((1 - totalCompressed / totalRaw) * 100)\n\n console.log('')\n console.log(` Total: ${totalRaw} → ${totalCompressed} tokens (${savings}% saved)`)\n console.log('')\n}\n\nbenchmark()\n"],"mappings":"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","names":["exports","exports","fs","import_child_process","import_util","execAsync","Database","import_promises","import_child_process","import_util","execAsync","execAsync","path","fs","import_child_process","import_util","import_promises","import_path","execAsync","getHome","commandExists","fs","path","agents","readline","compressed","import_path","import_child_process","path","fs"]}