make-laten 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +499 -26
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +499 -26
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.js +143 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +143 -3
- package/dist/index.mjs.map +1 -1
- package/dist/mcp/server.js +148 -8
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/server.mjs +150 -10
- package/dist/mcp/server.mjs.map +1 -1
- package/package.json +1 -1
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/compress/confidence.ts","../../src/compress/strip.ts","../../src/compress/structure.ts","../../src/compress/truncate.ts","../../src/compress/file-read.ts","../../src/compress/grep.ts","../../src/compress/git-diff.ts","../../src/compress/git-status.ts","../../src/route/tool-router.ts","../../src/route/strategy-router.ts","../../src/learn/pattern-miner.ts","../../src/learn/failure-learner.ts","../../src/correct/auto-correct.ts","../../src/cache/l1-session.ts","../../src/web/backends/duckduckgo.ts","../../src/web/backends/index.ts","../../src/web/extractor.ts","../../src/web/compressor.ts","../../src/web/router.ts","../../src/mcp/server.ts"],"sourcesContent":["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 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 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 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","import type { RouteInput, ToolRoute, CompressorType } from './types.js'\n\nexport class ToolRouter {\n private rules: RouteRule[] = [\n {\n matcher: (input) => input.type === 'file',\n compressor: 'file-read',\n confidence: 0.95,\n reason: 'File read detected'\n },\n {\n matcher: (input) => input.type === 'grep',\n compressor: 'grep',\n confidence: 0.95,\n reason: 'Grep results detected'\n },\n {\n matcher: (input) => input.type === 'git-diff',\n compressor: 'git-diff',\n confidence: 0.95,\n reason: 'Git diff detected'\n }\n ]\n\n route(input: RouteInput): ToolRoute {\n for (const rule of this.rules) {\n if (rule.matcher(input)) {\n return {\n tool: 'compress',\n compressor: rule.compressor,\n confidence: rule.confidence,\n reason: rule.reason\n }\n }\n }\n\n return {\n tool: 'compress',\n confidence: 0.1,\n reason: 'No matching route found'\n }\n }\n\n addRule(rule: RouteRule): void {\n this.rules.push(rule)\n }\n}\n\ninterface RouteRule {\n matcher: (input: RouteInput) => boolean\n compressor: CompressorType\n confidence: number\n reason: string\n}","import type { RouteContext, StrategyRoute, StrategyType } from './types.js'\n\nexport class StrategyRouter {\n private thresholds = {\n small: 500,\n large: 5000\n }\n\n select(context: RouteContext): StrategyRoute {\n if (context.userPreference) {\n return {\n strategy: context.userPreference,\n reason: `User preference: ${context.userPreference}`,\n savings: this.estimateSavings(context.userPreference)\n }\n }\n\n const fileSize = context.fileSize || 0\n\n if (fileSize >= this.thresholds.large) {\n return {\n strategy: 'aggressive',\n reason: `large file (${fileSize} bytes)`,\n savings: 0.6\n }\n }\n\n if (fileSize <= this.thresholds.small) {\n return {\n strategy: 'conservative',\n reason: `small file (${fileSize} bytes)`,\n savings: 0.2\n }\n }\n\n return {\n strategy: 'balanced',\n reason: `Medium file (${fileSize} bytes)`,\n savings: 0.4\n }\n }\n\n private estimateSavings(strategy: StrategyType): number {\n switch (strategy) {\n case 'aggressive': return 0.6\n case 'balanced': return 0.4\n case 'conservative': return 0.2\n }\n }\n}\n","import type { Pattern, PatternType } from './types.js'\n\ninterface Operation {\n type: string\n input: any\n output?: any\n error?: string\n success: boolean\n}\n\nexport class PatternMiner {\n private operations: Operation[] = []\n private patterns: Map<string, Pattern> = new Map()\n\n record(operation: Operation): void {\n this.operations.push(operation)\n \n if (operation.success) {\n this.updatePatterns(operation)\n }\n }\n\n getPatterns(): Pattern[] {\n return Array.from(this.patterns.values())\n }\n\n getPatternsByType(type: PatternType): Pattern[] {\n return this.getPatterns().filter(p => p.type === type)\n }\n\n private updatePatterns(operation: Operation): void {\n const key = operation.type\n const existing = this.patterns.get(key)\n \n if (existing) {\n existing.count++\n existing.confidence = Math.min(0.99, existing.confidence + 0.05)\n } else {\n this.patterns.set(key, {\n id: `p${this.patterns.size + 1}`,\n type: operation.type as PatternType,\n pattern: JSON.stringify(operation.input),\n confidence: 0.5,\n count: 1\n })\n }\n }\n}\n","import type { Failure } from './types.js'\n\ninterface FailureRecord extends Failure {\n count: number\n}\n\nexport class FailureLearner {\n private failures: Map<string, FailureRecord> = new Map()\n\n record(failure: Omit<Failure, 'id' | 'timestamp'>): void {\n const key = `${failure.type}:${failure.error}`\n const existing = this.failures.get(key)\n \n if (existing) {\n existing.count++\n } else {\n this.failures.set(key, {\n id: `f${this.failures.size + 1}`,\n ...failure,\n timestamp: Date.now(),\n count: 1\n })\n }\n }\n\n getFailures(): Failure[] {\n return Array.from(this.failures.values())\n }\n\n getFailuresByType(type: string): Failure[] {\n return this.getFailures().filter(f => f.type === type)\n }\n\n getSuggestions(type: string): string[] {\n const failures = Array.from(this.failures.values()).filter(f => f.type === type)\n const suggestions: string[] = []\n \n for (const failure of failures) {\n if (failure.error.includes('not found')) {\n suggestions.push('check if file exists before processing')\n }\n if (failure.error.includes('permission')) {\n suggestions.push('verify file permissions')\n }\n if (failure.count > 2) {\n suggestions.push(`recurring issue: ${failure.error}`)\n }\n }\n \n return [...new Set(suggestions)]\n }\n}\n","import type { Correction, CorrectionRule } from './types.js'\n\nexport class AutoCorrect {\n private rules: CorrectionRule[] = []\n private corrections: Correction[] = []\n private appliedCount = 0\n\n addRule(rule: CorrectionRule): void {\n this.rules.push(rule)\n }\n\n getRules(): CorrectionRule[] {\n return this.rules\n }\n\n correct(input: string): string {\n let output = input\n\n for (const rule of this.rules) {\n if (typeof rule.pattern === 'string') {\n if (output.includes(rule.pattern)) {\n output = output.split(rule.pattern).join(rule.replacement)\n this.recordCorrection(input, output, rule.name)\n }\n } else {\n const matches = output.match(rule.pattern)\n if (matches) {\n output = output.replace(rule.pattern, rule.replacement)\n this.recordCorrection(input, output, rule.name)\n }\n }\n }\n\n return output\n }\n\n getStats(): { applied: number; corrections: Correction[] } {\n return {\n applied: this.appliedCount,\n corrections: this.corrections\n }\n }\n\n private recordCorrection(original: string, corrected: string, ruleName: string): void {\n this.appliedCount++\n this.corrections.push({\n id: `c${this.corrections.length + 1}`,\n original,\n corrected,\n rule: ruleName,\n confidence: 0.9\n })\n }\n}\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 { 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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/'/g, \"'\").replace(/"/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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/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","#!/usr/bin/env node\n\nimport { FileReadCompressor } from '../compress/file-read.js'\nimport { GrepCompressor } from '../compress/grep.js'\nimport { GitDiffCompressor } from '../compress/git-diff.js'\nimport { GitStatusCompressor } from '../compress/git-status.js'\nimport { ToolRouter } from '../route/tool-router.js'\nimport { StrategyRouter } from '../route/strategy-router.js'\nimport { PatternMiner } from '../learn/pattern-miner.js'\nimport { FailureLearner } from '../learn/failure-learner.js'\nimport { AutoCorrect } from '../correct/auto-correct.js'\nimport { SessionCache } from '../cache/l1-session.js'\nimport { WebRouter } from '../web/router.js'\nimport { SemanticTool } from '../tool/semantic-tool.js'\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport fs from 'fs/promises'\n\nconst execAsync = promisify(exec)\n\n// Singletons\nconst sessionCache = new SessionCache()\nconst toolRouter = new ToolRouter()\nconst strategyRouter = new StrategyRouter()\nconst patternMiner = new PatternMiner()\nconst failureLearner = new FailureLearner()\nconst autoCorrect = new AutoCorrect()\nconst webRouter = new WebRouter()\n\nconst TOOLS = [\n // Compress Layer\n {\n name: 'make-laten-read',\n description: 'Read and compress a file (65-92% token savings)',\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to file' }\n },\n required: ['file_path']\n }\n },\n {\n name: 'make-laten-grep',\n description: 'Search code and return compressed grouped results',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search', default: '.' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'make-laten-git-diff',\n description: 'Compressed git diff output',\n inputSchema: {\n type: 'object',\n properties: {\n staged: { type: 'boolean', description: 'Show staged changes', default: false }\n }\n }\n },\n {\n name: 'make-laten-git-status',\n description: 'Compressed git status',\n inputSchema: { type: 'object', properties: {} }\n },\n\n // Route Layer\n {\n name: 'make-laten-route',\n description: 'Route input to correct compressor',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', enum: ['file', 'grep', 'git-diff', 'unknown'], description: 'Input type' },\n content: { type: 'string', description: 'Input content' }\n },\n required: ['type', 'content']\n }\n },\n {\n name: 'make-laten-strategy',\n description: 'Select compression strategy based on context',\n inputSchema: {\n type: 'object',\n properties: {\n file_size: { type: 'number', description: 'File size in bytes' },\n preference: { type: 'string', enum: ['aggressive', 'balanced', 'conservative'], description: 'Strategy preference' }\n }\n }\n },\n\n // Cache Layer\n {\n name: 'make-laten-cache-stats',\n description: 'Show cache performance stats',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-cache-get',\n description: 'Get value from session cache',\n inputSchema: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'Cache key' }\n },\n required: ['key']\n }\n },\n {\n name: 'make-laten-cache-set',\n description: 'Set value in session cache',\n inputSchema: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'Cache key' },\n value: { type: 'string', description: 'Value to cache' }\n },\n required: ['key', 'value']\n }\n },\n {\n name: 'make-laten-cache-clear',\n description: 'Clear session cache',\n inputSchema: { type: 'object', properties: {} }\n },\n\n // Learn Layer\n {\n name: 'make-laten-patterns',\n description: 'Get learned patterns from usage',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-failures',\n description: 'Get failure records and suggestions',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-suggestions',\n description: 'Get suggestions based on learned patterns',\n inputSchema: {\n type: 'object',\n properties: {\n context: { type: 'string', description: 'Context for suggestions' }\n }\n }\n },\n\n // Correct Layer\n {\n name: 'make-laten-correct',\n description: 'Apply auto-corrections to text',\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to correct' }\n },\n required: ['text']\n }\n },\n\n // Web Layer\n {\n name: 'make-laten-search',\n description: 'Search the web with semantic understanding',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n backend: { type: 'string', description: 'Search backend (duckduckgo, exa, tavily)' }\n },\n required: ['query']\n }\n },\n {\n name: 'make-laten-fetch',\n description: 'Fetch and compress web content',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to fetch' },\n extract: { type: 'boolean', description: 'Extract semantic content', default: true }\n },\n required: ['url']\n }\n },\n\n // Tool Layer\n {\n name: 'make-laten-tools',\n description: 'List available make-laten tools',\n inputSchema: { type: 'object', properties: {} }\n }\n]\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const map: 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 map[ext] || 'text'\n}\n\n// Compress handlers\nasync function handleRead(params: { file_path: string }) {\n const content = await fs.readFile(params.file_path, 'utf-8')\n const compressor = new FileReadCompressor()\n const result = await compressor.compress({\n content,\n filePath: params.file_path,\n language: detectLanguage(params.file_path)\n })\n patternMiner.record({ type: 'file-read', input: { file: params.file_path }, success: true })\n sessionCache.set(`file:${params.file_path}`, { content: result.content, metadata: result.metadata })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings, confidence: result.confidence }) }] }\n}\n\nasync function handleGrep(params: { pattern: string; path?: string }) {\n const dir = params.path || '.'\n const { stdout } = await execAsync(`grep -rn \"${params.pattern}\" ${dir} 2>/dev/null || true`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n return { content: [{ type: 'text', text: JSON.stringify({ matches: [], total: 0 }) }] }\n }\n\n const matches = stdout.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(':')\n return { file: parts[0], line: parseInt(parts[1], 10) || 0, content: parts.slice(2).join(':').trim() }\n })\n\n const compressor = new GrepCompressor()\n const result = await compressor.compress({ results: matches, pattern: params.pattern, directory: dir })\n patternMiner.record({ type: 'grep', input: { pattern: params.pattern, dir }, success: true })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, total: matches.length, savings: result.metadata.savings }) }] }\n}\n\nasync function handleGitDiff(params: { staged?: boolean }) {\n const flag = params.staged ? '--staged' : ''\n const { stdout } = await execAsync(`git diff ${flag}`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n return { content: [{ type: 'text', text: JSON.stringify({ diff: '', changes: 0 }) }] }\n }\n\n const compressor = new GitDiffCompressor()\n const result = await compressor.compress({ diff: stdout })\n patternMiner.record({ type: 'git-diff', input: { staged: params.staged }, success: true })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings }) }] }\n}\n\nasync function handleGitStatus() {\n const { stdout } = await execAsync('git status --porcelain')\n const compressor = new GitStatusCompressor()\n const result = await compressor.compress({ status: stdout })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings }) }] }\n}\n\n// Route handlers\nasync function handleRoute(params: { type: string; content: string }) {\n const route = toolRouter.route({ type: params.type as any, content: params.content })\n return { content: [{ type: 'text', text: JSON.stringify(route) }] }\n}\n\nasync function handleStrategy(params: { file_size?: number; preference?: string }) {\n const strategy = strategyRouter.select({\n fileSize: params.file_size,\n userPreference: params.preference as any\n })\n return { content: [{ type: 'text', text: JSON.stringify(strategy) }] }\n}\n\n// Cache handlers\nasync function handleCacheStats() {\n const stats = sessionCache.stats()\n return { content: [{ type: 'text', text: JSON.stringify(stats) }] }\n}\n\nasync function handleCacheGet(params: { key: string }) {\n const entry = sessionCache.get(params.key)\n return { content: [{ type: 'text', text: JSON.stringify({ found: !!entry, entry }) }] }\n}\n\nasync function handleCacheSet(params: { key: string; value: string }) {\n sessionCache.set(params.key, { content: params.value, metadata: { setAt: Date.now() } })\n return { content: [{ type: 'text', text: JSON.stringify({ success: true }) }] }\n}\n\nasync function handleCacheClear() {\n sessionCache.clear()\n return { content: [{ type: 'text', text: JSON.stringify({ success: true }) }] }\n}\n\n// Learn handlers\nasync function handlePatterns() {\n const patterns = patternMiner.getPatterns()\n return { content: [{ type: 'text', text: JSON.stringify({ patterns, total: patterns.length }) }] }\n}\n\nasync function handleFailures() {\n const failures = failureLearner.getFailures()\n return { content: [{ type: 'text', text: JSON.stringify({ failures, total: failures.length }) }] }\n}\n\nasync function handleSuggestions(params: { context?: string }) {\n const patterns = patternMiner.getPatterns()\n const failures = failureLearner.getFailures()\n const suggestions: string[] = []\n\n for (const pattern of patterns.slice(0, 5)) {\n suggestions.push(`Pattern: ${pattern.type} (confidence: ${pattern.confidence})`)\n }\n\n for (const failure of failures.slice(0, 5)) {\n const failureSuggestions = failureLearner.getSuggestions(failure.type)\n suggestions.push(...failureSuggestions)\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ suggestions: [...new Set(suggestions)] }) }] }\n}\n\n// Correct handler\nasync function handleCorrect(params: { text: string }) {\n const corrected = autoCorrect.correct(params.text)\n const stats = autoCorrect.getStats()\n return { content: [{ type: 'text', text: JSON.stringify({ original: params.text, corrected, corrections: stats.applied }) }] }\n}\n\n// Web handlers\nasync function handleSearch(params: { query: string; backend?: string }) {\n const results = await webRouter.search(params.query, { backend: params.backend as any })\n return { content: [{ type: 'text', text: JSON.stringify({ results, total: results.length }) }] }\n}\n\nasync function handleFetch(params: { url: string; extract?: boolean }) {\n const result = await webRouter.fetch(params.url, { extract: params.extract !== false })\n return { content: [{ type: 'text', text: JSON.stringify({ url: result.url, title: result.title, content: result.content, savings: result.metadata.savings }) }] }\n}\n\n// Tool handler\nasync function handleTools() {\n const tools = TOOLS.map(t => ({ name: t.name, description: t.description }))\n return { content: [{ type: 'text', text: JSON.stringify({ tools, total: tools.length }) }] }\n}\n\nconst handlers: Record<string, (params: any) => Promise<any>> = {\n 'make-laten-read': handleRead,\n 'make-laten-grep': handleGrep,\n 'make-laten-git-diff': handleGitDiff,\n 'make-laten-git-status': handleGitStatus,\n 'make-laten-route': handleRoute,\n 'make-laten-strategy': handleStrategy,\n 'make-laten-cache-stats': handleCacheStats,\n 'make-laten-cache-get': handleCacheGet,\n 'make-laten-cache-set': handleCacheSet,\n 'make-laten-cache-clear': handleCacheClear,\n 'make-laten-patterns': handlePatterns,\n 'make-laten-failures': handleFailures,\n 'make-laten-suggestions': handleSuggestions,\n 'make-laten-correct': handleCorrect,\n 'make-laten-search': handleSearch,\n 'make-laten-fetch': handleFetch,\n 'make-laten-tools': handleTools\n}\n\nlet requestId = 0\n\nfunction sendResponse(id: number, result: any) {\n const response = { jsonrpc: '2.0', id, result }\n process.stdout.write(JSON.stringify(response) + '\\n')\n}\n\nfunction sendError(id: number, code: number, message: string) {\n const response = { jsonrpc: '2.0', id, error: { code, message } }\n process.stdout.write(JSON.stringify(response) + '\\n')\n}\n\nasync function handleLine(line: string) {\n try {\n const request = JSON.parse(line)\n\n if (request.method === 'initialize') {\n sendResponse(request.id, {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: { name: 'make-laten', version: '1.2.0' }\n })\n } else if (request.method === 'notifications/initialized') {\n // no response needed\n } else if (request.method === 'tools/list') {\n sendResponse(request.id, { tools: TOOLS })\n } else if (request.method === 'tools/call') {\n const { name, arguments: params } = request.params\n const handler = handlers[name]\n\n if (!handler) {\n sendError(request.id, -32601, `Unknown tool: ${name}`)\n return\n }\n\n try {\n const result = await handler(params || {})\n sendResponse(request.id, result)\n } catch (error: any) {\n failureLearner.record({ type: name, error: error.message, success: false })\n sendError(request.id, -32000, error.message)\n }\n } else {\n sendError(request.id, -32601, `Method not found: ${request.method}`)\n }\n } catch (error: any) {\n process.stderr.write(`Error: ${error.message}\\n`)\n }\n}\n\nlet buffer = ''\n\nprocess.stdin.setEncoding('utf-8')\nprocess.stdin.on('data', async (chunk: string) => {\n buffer += chunk\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line.trim()) {\n await handleLine(line.trim())\n }\n }\n})\n\nprocess.stderr.write('make-laten MCP server started (17 tools)\\n')\n"],"mappings":"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","names":["exports","exports","compressed","fs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/compress/confidence.ts","../../src/compress/strip.ts","../../src/compress/structure.ts","../../src/compress/truncate.ts","../../src/compress/file-read.ts","../../src/compress/grep.ts","../../src/compress/git-diff.ts","../../src/compress/git-status.ts","../../src/route/tool-router.ts","../../src/route/strategy-router.ts","../../src/learn/pattern-miner.ts","../../src/learn/failure-learner.ts","../../src/correct/auto-correct.ts","../../src/cache/l1-session.ts","../../src/web/backends/duckduckgo.ts","../../src/web/backends/index.ts","../../src/web/extractor.ts","../../src/web/compressor.ts","../../src/web/router.ts","../../src/mcp/server.ts"],"sourcesContent":["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 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 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 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","import type { RouteInput, ToolRoute, CompressorType } from './types.js'\n\nexport class ToolRouter {\n private rules: RouteRule[] = [\n {\n matcher: (input) => input.type === 'file',\n compressor: 'file-read',\n confidence: 0.95,\n reason: 'File read detected'\n },\n {\n matcher: (input) => input.type === 'grep',\n compressor: 'grep',\n confidence: 0.95,\n reason: 'Grep results detected'\n },\n {\n matcher: (input) => input.type === 'git-diff',\n compressor: 'git-diff',\n confidence: 0.95,\n reason: 'Git diff detected'\n }\n ]\n\n route(input: RouteInput): ToolRoute {\n for (const rule of this.rules) {\n if (rule.matcher(input)) {\n return {\n tool: 'compress',\n compressor: rule.compressor,\n confidence: rule.confidence,\n reason: rule.reason\n }\n }\n }\n\n return {\n tool: 'compress',\n confidence: 0.1,\n reason: 'No matching route found'\n }\n }\n\n addRule(rule: RouteRule): void {\n this.rules.push(rule)\n }\n}\n\ninterface RouteRule {\n matcher: (input: RouteInput) => boolean\n compressor: CompressorType\n confidence: number\n reason: string\n}","import type { RouteContext, StrategyRoute, StrategyType } from './types.js'\n\nexport class StrategyRouter {\n private thresholds = {\n small: 500,\n large: 5000\n }\n\n select(context: RouteContext): StrategyRoute {\n if (context.userPreference) {\n return {\n strategy: context.userPreference,\n reason: `User preference: ${context.userPreference}`,\n savings: this.estimateSavings(context.userPreference)\n }\n }\n\n const fileSize = context.fileSize || 0\n\n if (fileSize >= this.thresholds.large) {\n return {\n strategy: 'aggressive',\n reason: `large file (${fileSize} bytes)`,\n savings: 0.6\n }\n }\n\n if (fileSize <= this.thresholds.small) {\n return {\n strategy: 'conservative',\n reason: `small file (${fileSize} bytes)`,\n savings: 0.2\n }\n }\n\n return {\n strategy: 'balanced',\n reason: `Medium file (${fileSize} bytes)`,\n savings: 0.4\n }\n }\n\n private estimateSavings(strategy: StrategyType): number {\n switch (strategy) {\n case 'aggressive': return 0.6\n case 'balanced': return 0.4\n case 'conservative': return 0.2\n }\n }\n}\n","import type { Pattern, PatternType } from './types.js'\nimport fs from 'fs'\nimport path from 'path'\n\ninterface Operation {\n type: string\n input: any\n output?: any\n error?: string\n success: boolean\n}\n\nconst DATA_FILE = path.join(process.env.HOME || '~', '.make-laten', 'patterns.json')\n\nexport class PatternMiner {\n private operations: Operation[] = []\n private patterns: Map<string, Pattern> = new Map()\n private persistencePath: string\n private lastPersist = 0\n\n constructor(options?: { persistencePath?: string }) {\n this.persistencePath = options?.persistencePath || DATA_FILE\n this.loadFromDisk()\n }\n\n private loadFromDisk(): void {\n try {\n if (fs.existsSync(this.persistencePath)) {\n const data = JSON.parse(fs.readFileSync(this.persistencePath, 'utf-8'))\n if (Array.isArray(data.patterns)) {\n for (const p of data.patterns) {\n this.patterns.set(p.type, p)\n }\n }\n if (Array.isArray(data.operations)) {\n this.operations = data.operations.slice(-100) // keep last 100\n }\n }\n } catch {}\n }\n\n private persistToDisk(): void {\n const now = Date.now()\n if (now - this.lastPersist < 5000) return // debounce 5s\n this.lastPersist = now\n\n try {\n const dir = path.dirname(this.persistencePath)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(this.persistencePath, JSON.stringify({\n patterns: Array.from(this.patterns.values()),\n operations: this.operations.slice(-100)\n }, null, 2))\n } catch {}\n }\n\n record(operation: Operation): void {\n this.operations.push(operation)\n if (this.operations.length > 100) this.operations.shift()\n \n if (operation.success) {\n this.updatePatterns(operation)\n }\n this.persistToDisk()\n }\n\n getPatterns(): Pattern[] {\n return Array.from(this.patterns.values())\n }\n\n getPatternsByType(type: PatternType): Pattern[] {\n return this.getPatterns().filter(p => p.type === type)\n }\n\n private updatePatterns(operation: Operation): void {\n const key = operation.type\n const existing = this.patterns.get(key)\n \n if (existing) {\n existing.count++\n existing.confidence = Math.min(0.99, existing.confidence + 0.05)\n } else {\n this.patterns.set(key, {\n id: `p${this.patterns.size + 1}`,\n type: operation.type as PatternType,\n pattern: JSON.stringify(operation.input),\n confidence: 0.5,\n count: 1\n })\n }\n }\n}\n","import type { Failure } from './types.js'\nimport fs from 'fs'\nimport path from 'path'\n\ninterface FailureRecord extends Failure {\n count: number\n}\n\nconst DATA_FILE = path.join(process.env.HOME || '~', '.make-laten', 'failures.json')\n\nexport class FailureLearner {\n private failures: Map<string, FailureRecord> = new Map()\n private persistencePath: string\n private lastPersist = 0\n\n constructor(options?: { persistencePath?: string }) {\n this.persistencePath = options?.persistencePath || DATA_FILE\n this.loadFromDisk()\n }\n\n private loadFromDisk(): void {\n try {\n if (fs.existsSync(this.persistencePath)) {\n const data = JSON.parse(fs.readFileSync(this.persistencePath, 'utf-8'))\n if (Array.isArray(data.failures)) {\n for (const f of data.failures) {\n this.failures.set(`${f.type}:${f.error}`, f)\n }\n }\n }\n } catch {}\n }\n\n private persistToDisk(): void {\n const now = Date.now()\n if (now - this.lastPersist < 5000) return // debounce 5s\n this.lastPersist = now\n\n try {\n const dir = path.dirname(this.persistencePath)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n fs.writeFileSync(this.persistencePath, JSON.stringify({\n failures: Array.from(this.failures.values())\n }, null, 2))\n } catch {}\n }\n\n record(failure: Omit<Failure, 'id' | 'timestamp'>): void {\n const key = `${failure.type}:${failure.error}`\n const existing = this.failures.get(key)\n \n if (existing) {\n existing.count++\n } else {\n this.failures.set(key, {\n id: `f${this.failures.size + 1}`,\n ...failure,\n timestamp: Date.now(),\n count: 1\n })\n }\n this.persistToDisk()\n }\n\n getFailures(): Failure[] {\n return Array.from(this.failures.values())\n }\n\n getFailuresByType(type: string): Failure[] {\n return this.getFailures().filter(f => f.type === type)\n }\n\n getSuggestions(type: string): string[] {\n const failures = Array.from(this.failures.values()).filter(f => f.type === type)\n const suggestions: string[] = []\n \n for (const failure of failures) {\n if (failure.error.includes('not found')) {\n suggestions.push('check if file exists before processing')\n }\n if (failure.error.includes('permission')) {\n suggestions.push('verify file permissions')\n }\n if (failure.count > 2) {\n suggestions.push(`recurring issue: ${failure.error}`)\n }\n }\n \n return [...new Set(suggestions)]\n }\n}\n","import type { Correction, CorrectionRule } from './types.js'\nimport fs from 'fs'\nimport path from 'path'\n\nconst DEFAULT_RULES: CorrectionRule[] = [\n // Common typos\n { name: 'typo-teh', description: 'Common typo', pattern: 'teh', replacement: 'the' },\n { name: 'typo-adn', description: 'Common typo', pattern: 'adn', replacement: 'and' },\n { name: 'typo-fo', description: 'Common typo', pattern: ' fo ', replacement: ' of ' },\n { name: 'typo-ot', description: 'Common typo', pattern: ' ot ', replacement: ' to ' },\n { name: 'typo-isnt', description: 'Common typo', pattern: 'isnt', replacement: \"isn't\" },\n { name: 'typo-dont', description: 'Common typo', pattern: 'dont', replacement: \"don't\" },\n { name: 'typo-cant', description: 'Common typo', pattern: 'cant', replacement: \"can't\" },\n { name: 'typo-wont', description: 'Common typo', pattern: 'wont', replacement: \"won't\" },\n { name: 'typo-youre', description: 'Common typo', pattern: 'youre', replacement: \"you're\" },\n { name: 'typo-its', description: 'Common typo', pattern: 'its a', replacement: \"it's a\" },\n // Code patterns\n { name: 'code-console-log', description: 'Remove console.log', pattern: /console\\.log\\([^)]*\\);?\\n?/g, replacement: '' },\n { name: 'code-debugger', description: 'Remove debugger', pattern: /debugger;?\\n?/g, replacement: '' },\n { name: 'code-var-let', description: 'var to let', pattern: /\\bvar\\b/g, replacement: 'let' },\n // Markdown\n { name: 'md-double-space', description: 'Double space to single', pattern: ' ', replacement: ' ' },\n]\n\nconst DATA_FILE = path.join(process.env.HOME || '~', '.make-laten', 'corrections.json')\n\nexport class AutoCorrect {\n private rules: CorrectionRule[]\n private corrections: Correction[] = []\n private appliedCount = 0\n private persistencePath: string\n\n constructor(options?: { persistencePath?: string }) {\n this.persistencePath = options?.persistencePath || DATA_FILE\n this.rules = [...DEFAULT_RULES]\n this.loadPersistedRules()\n }\n\n private loadPersistedRules(): void {\n try {\n if (fs.existsSync(this.persistencePath)) {\n const data = JSON.parse(fs.readFileSync(this.persistencePath, 'utf-8'))\n if (Array.isArray(data.customRules)) {\n this.rules.push(...data.customRules)\n }\n }\n } catch {}\n }\n\n private persistRules(): void {\n try {\n const dir = path.dirname(this.persistencePath)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n const existing = this.loadExistingData()\n existing.customRules = this.rules.filter(r => !DEFAULT_RULES.includes(r))\n fs.writeFileSync(this.persistencePath, JSON.stringify(existing, null, 2))\n } catch {}\n }\n\n private loadExistingData(): any {\n try {\n if (fs.existsSync(this.persistencePath)) {\n return JSON.parse(fs.readFileSync(this.persistencePath, 'utf-8'))\n }\n } catch {}\n return { customRules: [] }\n }\n\n addRule(rule: CorrectionRule): void {\n this.rules.push(rule)\n this.persistRules()\n }\n\n getRules(): CorrectionRule[] {\n return this.rules\n }\n\n correct(input: string): string {\n let output = input\n let changed = false\n\n for (const rule of this.rules) {\n if (typeof rule.pattern === 'string') {\n if (output.includes(rule.pattern)) {\n output = output.split(rule.pattern).join(rule.replacement)\n changed = true\n }\n } else {\n const matches = output.match(rule.pattern)\n if (matches) {\n output = output.replace(rule.pattern, rule.replacement)\n changed = true\n }\n }\n }\n\n if (changed) {\n this.recordCorrection(input, output, 'auto')\n }\n\n return output\n }\n\n getStats(): { applied: number; corrections: Correction[] } {\n return {\n applied: this.appliedCount,\n corrections: this.corrections\n }\n }\n\n private recordCorrection(original: string, corrected: string, ruleName: string): void {\n this.appliedCount++\n this.corrections.push({\n id: `c${this.corrections.length + 1}`,\n original,\n corrected,\n rule: ruleName,\n confidence: 0.9\n })\n }\n}\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 { 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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/'/g, \"'\").replace(/"/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(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/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","#!/usr/bin/env node\n\nimport { FileReadCompressor } from '../compress/file-read.js'\nimport { GrepCompressor } from '../compress/grep.js'\nimport { GitDiffCompressor } from '../compress/git-diff.js'\nimport { GitStatusCompressor } from '../compress/git-status.js'\nimport { ToolRouter } from '../route/tool-router.js'\nimport { StrategyRouter } from '../route/strategy-router.js'\nimport { PatternMiner } from '../learn/pattern-miner.js'\nimport { FailureLearner } from '../learn/failure-learner.js'\nimport { AutoCorrect } from '../correct/auto-correct.js'\nimport { SessionCache } from '../cache/l1-session.js'\nimport { WebRouter } from '../web/router.js'\nimport { SemanticTool } from '../tool/semantic-tool.js'\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport fs from 'fs/promises'\n\nconst execAsync = promisify(exec)\n\n// Singletons\nconst sessionCache = new SessionCache()\nconst toolRouter = new ToolRouter()\nconst strategyRouter = new StrategyRouter()\nconst patternMiner = new PatternMiner()\nconst failureLearner = new FailureLearner()\nconst autoCorrect = new AutoCorrect()\nconst webRouter = new WebRouter()\n\nconst TOOLS = [\n // Compress Layer\n {\n name: 'make-laten-read',\n description: 'Read and compress a file (65-92% token savings)',\n inputSchema: {\n type: 'object',\n properties: {\n file_path: { type: 'string', description: 'Path to file' }\n },\n required: ['file_path']\n }\n },\n {\n name: 'make-laten-grep',\n description: 'Search code and return compressed grouped results',\n inputSchema: {\n type: 'object',\n properties: {\n pattern: { type: 'string', description: 'Search pattern' },\n path: { type: 'string', description: 'Directory to search', default: '.' }\n },\n required: ['pattern']\n }\n },\n {\n name: 'make-laten-git-diff',\n description: 'Compressed git diff output',\n inputSchema: {\n type: 'object',\n properties: {\n staged: { type: 'boolean', description: 'Show staged changes', default: false }\n }\n }\n },\n {\n name: 'make-laten-git-status',\n description: 'Compressed git status',\n inputSchema: { type: 'object', properties: {} }\n },\n\n // Route Layer\n {\n name: 'make-laten-route',\n description: 'Route input to correct compressor',\n inputSchema: {\n type: 'object',\n properties: {\n type: { type: 'string', enum: ['file', 'grep', 'git-diff', 'unknown'], description: 'Input type' },\n content: { type: 'string', description: 'Input content' }\n },\n required: ['type', 'content']\n }\n },\n {\n name: 'make-laten-strategy',\n description: 'Select compression strategy based on context',\n inputSchema: {\n type: 'object',\n properties: {\n file_size: { type: 'number', description: 'File size in bytes' },\n preference: { type: 'string', enum: ['aggressive', 'balanced', 'conservative'], description: 'Strategy preference' }\n }\n }\n },\n\n // Cache Layer\n {\n name: 'make-laten-cache-stats',\n description: 'Show cache performance stats',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-cache-get',\n description: 'Get value from session cache',\n inputSchema: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'Cache key' }\n },\n required: ['key']\n }\n },\n {\n name: 'make-laten-cache-set',\n description: 'Set value in session cache',\n inputSchema: {\n type: 'object',\n properties: {\n key: { type: 'string', description: 'Cache key' },\n value: { type: 'string', description: 'Value to cache' }\n },\n required: ['key', 'value']\n }\n },\n {\n name: 'make-laten-cache-clear',\n description: 'Clear session cache',\n inputSchema: { type: 'object', properties: {} }\n },\n\n // Learn Layer\n {\n name: 'make-laten-patterns',\n description: 'Get learned patterns from usage (persisted across sessions)',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-failures',\n description: 'Get failure records and suggestions (persisted across sessions)',\n inputSchema: { type: 'object', properties: {} }\n },\n {\n name: 'make-laten-suggestions',\n description: 'Get suggestions based on learned patterns and failures',\n inputSchema: {\n type: 'object',\n properties: {\n context: { type: 'string', description: 'Context for suggestions' }\n }\n }\n },\n\n // Correct Layer\n {\n name: 'make-laten-correct',\n description: 'Apply auto-corrections to text (11 built-in rules + custom rules)',\n inputSchema: {\n type: 'object',\n properties: {\n text: { type: 'string', description: 'Text to correct' }\n },\n required: ['text']\n }\n },\n\n // Web Layer\n {\n name: 'make-laten-search',\n description: 'Search the web with semantic understanding',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n backend: { type: 'string', description: 'Search backend (duckduckgo, exa, tavily)' }\n },\n required: ['query']\n }\n },\n {\n name: 'make-laten-fetch',\n description: 'Fetch and compress web content',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'URL to fetch' },\n extract: { type: 'boolean', description: 'Extract semantic content', default: true }\n },\n required: ['url']\n }\n },\n\n // Tool Layer\n {\n name: 'make-laten-tools',\n description: 'List available make-laten tools',\n inputSchema: { type: 'object', properties: {} }\n }\n]\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop()?.toLowerCase() || ''\n const map: 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 map[ext] || 'text'\n}\n\n// Compress handlers\nasync function handleRead(params: { file_path: string }) {\n const content = await fs.readFile(params.file_path, 'utf-8')\n const compressor = new FileReadCompressor()\n const result = await compressor.compress({\n content,\n filePath: params.file_path,\n language: detectLanguage(params.file_path)\n })\n patternMiner.record({ type: 'file-read', input: { file: params.file_path }, success: true })\n sessionCache.set(`file:${params.file_path}`, { content: result.content, metadata: result.metadata })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings, confidence: result.confidence }) }] }\n}\n\nasync function handleGrep(params: { pattern: string; path?: string }) {\n const dir = params.path || '.'\n const { stdout } = await execAsync(`grep -rn \"${params.pattern}\" ${dir} 2>/dev/null || true`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n return { content: [{ type: 'text', text: JSON.stringify({ matches: [], total: 0 }) }] }\n }\n\n const matches = stdout.split('\\n').filter(Boolean).map(line => {\n const parts = line.split(':')\n return { file: parts[0], line: parseInt(parts[1], 10) || 0, content: parts.slice(2).join(':').trim() }\n })\n\n const compressor = new GrepCompressor()\n const result = await compressor.compress({ results: matches, pattern: params.pattern, directory: dir })\n patternMiner.record({ type: 'grep', input: { pattern: params.pattern, dir }, success: true })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, total: matches.length, savings: result.metadata.savings }) }] }\n}\n\nasync function handleGitDiff(params: { staged?: boolean }) {\n const flag = params.staged ? '--staged' : ''\n const { stdout } = await execAsync(`git diff ${flag}`, { maxBuffer: 10 * 1024 * 1024 })\n\n if (!stdout.trim()) {\n return { content: [{ type: 'text', text: JSON.stringify({ diff: '', changes: 0 }) }] }\n }\n\n const compressor = new GitDiffCompressor()\n const result = await compressor.compress({ diff: stdout })\n patternMiner.record({ type: 'git-diff', input: { staged: params.staged }, success: true })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings }) }] }\n}\n\nasync function handleGitStatus() {\n const { stdout } = await execAsync('git status --porcelain')\n const compressor = new GitStatusCompressor()\n const result = await compressor.compress({ status: stdout })\n return { content: [{ type: 'text', text: JSON.stringify({ compressed: result.content, savings: result.metadata.savings }) }] }\n}\n\n// Route handlers\nasync function handleRoute(params: { type: string; content: string }) {\n const route = toolRouter.route({ type: params.type as any, content: params.content })\n return { content: [{ type: 'text', text: JSON.stringify(route) }] }\n}\n\nasync function handleStrategy(params: { file_size?: number; preference?: string }) {\n const strategy = strategyRouter.select({\n fileSize: params.file_size,\n userPreference: params.preference as any\n })\n return { content: [{ type: 'text', text: JSON.stringify(strategy) }] }\n}\n\n// Cache handlers\nasync function handleCacheStats() {\n const stats = sessionCache.stats()\n return { content: [{ type: 'text', text: JSON.stringify(stats) }] }\n}\n\nasync function handleCacheGet(params: { key: string }) {\n const entry = sessionCache.get(params.key)\n return { content: [{ type: 'text', text: JSON.stringify({ found: !!entry, entry }) }] }\n}\n\nasync function handleCacheSet(params: { key: string; value: string }) {\n sessionCache.set(params.key, { content: params.value, metadata: { setAt: Date.now() } })\n return { content: [{ type: 'text', text: JSON.stringify({ success: true }) }] }\n}\n\nasync function handleCacheClear() {\n sessionCache.clear()\n return { content: [{ type: 'text', text: JSON.stringify({ success: true }) }] }\n}\n\n// Learn handlers\nasync function handlePatterns() {\n const patterns = patternMiner.getPatterns()\n return { content: [{ type: 'text', text: JSON.stringify({ patterns, total: patterns.length }) }] }\n}\n\nasync function handleFailures() {\n const failures = failureLearner.getFailures()\n return { content: [{ type: 'text', text: JSON.stringify({ failures, total: failures.length }) }] }\n}\n\nasync function handleSuggestions(params: { context?: string }) {\n const patterns = patternMiner.getPatterns()\n const failures = failureLearner.getFailures()\n const suggestions: string[] = []\n\n for (const pattern of patterns.slice(0, 5)) {\n suggestions.push(`Pattern: ${pattern.type} (confidence: ${pattern.confidence})`)\n }\n\n for (const failure of failures.slice(0, 5)) {\n const failureSuggestions = failureLearner.getSuggestions(failure.type)\n suggestions.push(...failureSuggestions)\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ suggestions: [...new Set(suggestions)] }) }] }\n}\n\n// Correct handler\nasync function handleCorrect(params: { text: string }) {\n const corrected = autoCorrect.correct(params.text)\n const stats = autoCorrect.getStats()\n return { content: [{ type: 'text', text: JSON.stringify({ original: params.text, corrected, corrections: stats.applied }) }] }\n}\n\n// Web handlers\nasync function handleSearch(params: { query: string; backend?: string }) {\n const results = await webRouter.search(params.query, { backend: params.backend as any })\n return { content: [{ type: 'text', text: JSON.stringify({ results, total: results.length }) }] }\n}\n\nasync function handleFetch(params: { url: string; extract?: boolean }) {\n const result = await webRouter.fetch(params.url, { extract: params.extract !== false })\n return { content: [{ type: 'text', text: JSON.stringify({ url: result.url, title: result.title, content: result.content, savings: result.metadata.savings }) }] }\n}\n\n// Tool handler\nasync function handleTools() {\n const tools = TOOLS.map(t => ({ name: t.name, description: t.description }))\n return { content: [{ type: 'text', text: JSON.stringify({ tools, total: tools.length }) }] }\n}\n\nconst handlers: Record<string, (params: any) => Promise<any>> = {\n 'make-laten-read': handleRead,\n 'make-laten-grep': handleGrep,\n 'make-laten-git-diff': handleGitDiff,\n 'make-laten-git-status': handleGitStatus,\n 'make-laten-route': handleRoute,\n 'make-laten-strategy': handleStrategy,\n 'make-laten-cache-stats': handleCacheStats,\n 'make-laten-cache-get': handleCacheGet,\n 'make-laten-cache-set': handleCacheSet,\n 'make-laten-cache-clear': handleCacheClear,\n 'make-laten-patterns': handlePatterns,\n 'make-laten-failures': handleFailures,\n 'make-laten-suggestions': handleSuggestions,\n 'make-laten-correct': handleCorrect,\n 'make-laten-search': handleSearch,\n 'make-laten-fetch': handleFetch,\n 'make-laten-tools': handleTools\n}\n\nlet requestId = 0\n\nfunction sendResponse(id: number, result: any) {\n const response = { jsonrpc: '2.0', id, result }\n process.stdout.write(JSON.stringify(response) + '\\n')\n}\n\nfunction sendError(id: number, code: number, message: string) {\n const response = { jsonrpc: '2.0', id, error: { code, message } }\n process.stdout.write(JSON.stringify(response) + '\\n')\n}\n\nasync function handleLine(line: string) {\n try {\n const request = JSON.parse(line)\n\n if (request.method === 'initialize') {\n sendResponse(request.id, {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: { name: 'make-laten', version: '1.3.0' }\n })\n } else if (request.method === 'notifications/initialized') {\n // no response needed\n } else if (request.method === 'tools/list') {\n sendResponse(request.id, { tools: TOOLS })\n } else if (request.method === 'tools/call') {\n const { name, arguments: params } = request.params\n const handler = handlers[name]\n\n if (!handler) {\n sendError(request.id, -32601, `Unknown tool: ${name}`)\n return\n }\n\n try {\n const result = await handler(params || {})\n sendResponse(request.id, result)\n } catch (error: any) {\n failureLearner.record({ type: name, error: error.message, success: false })\n sendError(request.id, -32000, error.message)\n }\n } else {\n sendError(request.id, -32601, `Method not found: ${request.method}`)\n }\n } catch (error: any) {\n process.stderr.write(`Error: ${error.message}\\n`)\n }\n}\n\nlet buffer = ''\n\nprocess.stdin.setEncoding('utf-8')\nprocess.stdin.on('data', async (chunk: string) => {\n buffer += chunk\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (line.trim()) {\n await handleLine(line.trim())\n }\n }\n})\n\nprocess.stderr.write('make-laten MCP server started (17 tools)\\n')\n"],"mappings":"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","names":["exports","exports","compressed","path","fs","import_fs","import_path","DATA_FILE","path","fs","import_fs","import_path","DATA_FILE","path","fs","fs"]}
|