codecortex-ai 0.4.1 → 0.4.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/README.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# CodeCortex
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Persistent codebase knowledge layer for AI agents. Your AI shouldn't re-learn your codebase every session.
|
|
4
|
+
|
|
5
|
+
> **⚠️ If you're on v0.3.x or earlier, update now:** `npm install -g codecortex-ai@latest`
|
|
6
|
+
> v0.4.2 fixes broken installs, adds auto-update notifications, git hooks, and grouped CLI help.
|
|
4
7
|
|
|
5
8
|
[Website](https://codecortex-ai.vercel.app) · [npm](https://www.npmjs.com/package/codecortex-ai) · [GitHub](https://github.com/rushikeshmore/CodeCortex)
|
|
6
9
|
|
|
@@ -13,7 +16,7 @@
|
|
|
13
16
|
Every AI coding session starts from scratch. When context compacts or a new session begins, the AI re-scans the entire codebase. Same files, same tokens, same wasted time. It's like hiring a new developer every session who has to re-learn everything before writing a single line.
|
|
14
17
|
|
|
15
18
|
**The data backs this up:**
|
|
16
|
-
- AI agents increase defect risk by 30% on unfamiliar code ([CodeScene + Lund University, 2025](https://codescene.com/hubfs/whitepapers/AI-
|
|
19
|
+
- AI agents increase defect risk by 30% on unfamiliar code ([CodeScene + Lund University, 2025](https://codescene.com/hubfs/whitepapers/AI-Ready-Code-How-Code-Health-Determines-AI-Performance.pdf))
|
|
17
20
|
- Code churn grew 2.5x in the AI era ([GitClear, 211M lines analyzed](https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality))
|
|
18
21
|
- Nobody combines structural + semantic + temporal + decision knowledge in one portable tool
|
|
19
22
|
|
|
@@ -21,13 +24,15 @@ Every AI coding session starts from scratch. When context compacts or a new sess
|
|
|
21
24
|
|
|
22
25
|
CodeCortex pre-digests codebases into layered knowledge files and serves them to any AI agent via MCP. Instead of re-understanding your codebase every session, the AI starts with knowledge.
|
|
23
26
|
|
|
24
|
-
**Hybrid extraction:** tree-sitter native N-API for structure (symbols, imports, calls across
|
|
27
|
+
**Hybrid extraction:** tree-sitter native N-API for structure (symbols, imports, calls across 27 languages) + host LLM for semantics (what modules do, why they're built that way). Zero extra API keys.
|
|
25
28
|
|
|
26
29
|
## Quick Start
|
|
27
30
|
|
|
31
|
+
> **Requires Node 20 or 22.** Node 24 is not yet supported (tree-sitter native bindings need an upstream update).
|
|
32
|
+
|
|
28
33
|
```bash
|
|
29
|
-
# Install
|
|
30
|
-
npm install -g codecortex-ai
|
|
34
|
+
# Install (--legacy-peer-deps needed for tree-sitter peer dep mismatches)
|
|
35
|
+
npm install -g codecortex-ai --legacy-peer-deps
|
|
31
36
|
|
|
32
37
|
# Initialize knowledge for your project
|
|
33
38
|
cd /path/to/your-project
|
|
@@ -148,11 +153,11 @@ vs. raw scan of entire codebase: ~37,800 tokens
|
|
|
148
153
|
|
|
149
154
|
85-90% token reduction. 7-10x efficiency gain.
|
|
150
155
|
|
|
151
|
-
## Supported Languages (
|
|
156
|
+
## Supported Languages (27)
|
|
152
157
|
|
|
153
158
|
| Category | Languages |
|
|
154
159
|
|----------|-----------|
|
|
155
|
-
| Web | TypeScript, TSX, JavaScript
|
|
160
|
+
| Web | TypeScript, TSX, JavaScript |
|
|
156
161
|
| Systems | C, C++, Objective-C, Rust, Zig, Go |
|
|
157
162
|
| JVM | Java, Kotlin, Scala |
|
|
158
163
|
| .NET | C# |
|
|
@@ -164,7 +169,7 @@ vs. raw scan of entire codebase: ~37,800 tokens
|
|
|
164
169
|
## Tech Stack
|
|
165
170
|
|
|
166
171
|
- TypeScript ESM, Node.js 20+
|
|
167
|
-
- `tree-sitter` (native N-API) +
|
|
172
|
+
- `tree-sitter` (native N-API) + 27 language grammar packages
|
|
168
173
|
- `@modelcontextprotocol/sdk` - MCP server
|
|
169
174
|
- `commander` - CLI
|
|
170
175
|
- `simple-git` - git integration
|
|
@@ -172,4 +177,4 @@ vs. raw scan of entire codebase: ~37,800 tokens
|
|
|
172
177
|
|
|
173
178
|
## License
|
|
174
179
|
|
|
175
|
-
MIT
|
|
180
|
+
MIT
|
|
@@ -916,7 +916,7 @@ function registerWriteTools(server, projectRoot) {
|
|
|
916
916
|
function createServer(projectRoot) {
|
|
917
917
|
const server = new McpServer({
|
|
918
918
|
name: "codecortex",
|
|
919
|
-
version: "0.4.
|
|
919
|
+
version: "0.4.3",
|
|
920
920
|
description: "Persistent codebase knowledge layer. Pre-digested architecture, symbols, coupling, and patterns served to AI agents."
|
|
921
921
|
});
|
|
922
922
|
registerReadTools(server, projectRoot);
|
|
@@ -964,4 +964,4 @@ export {
|
|
|
964
964
|
createServer,
|
|
965
965
|
startServer
|
|
966
966
|
};
|
|
967
|
-
//# sourceMappingURL=chunk-
|
|
967
|
+
//# sourceMappingURL=chunk-CR6LARZ4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp/server.ts","../src/mcp/tools/read.ts","../src/utils/files.ts","../src/utils/yaml.ts","../src/core/manifest.ts","../src/core/graph.ts","../src/utils/markdown.ts","../src/core/modules.ts","../src/core/sessions.ts","../src/core/decisions.ts","../src/core/search.ts","../src/mcp/tools/write.ts","../src/types/schema.ts","../src/core/patterns.ts"],"sourcesContent":["/**\n * CodeCortex MCP Server\n *\n * Serves codebase knowledge to AI agents via Model Context Protocol.\n * 14 tools: 9 read (knowledge retrieval) + 5 write (knowledge creation).\n *\n * Usage:\n * codecortex serve\n *\n * Config for Claude Code / Claude Desktop:\n * {\n * \"mcpServers\": {\n * \"codecortex\": {\n * \"command\": \"codecortex\",\n * \"args\": [\"serve\"],\n * \"cwd\": \"/path/to/your-project\"\n * }\n * }\n * }\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { registerReadTools } from './tools/read.js'\nimport { registerWriteTools } from './tools/write.js'\n\nexport function createServer(projectRoot: string): McpServer {\n const server = new McpServer({\n name: 'codecortex',\n version: '0.4.1',\n description: 'Persistent codebase knowledge layer. Pre-digested architecture, symbols, coupling, and patterns served to AI agents.',\n })\n\n registerReadTools(server, projectRoot)\n registerWriteTools(server, projectRoot)\n\n return server\n}\n\nexport async function startServer(projectRoot: string): Promise<void> {\n const server = createServer(projectRoot)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n console.error(`CodeCortex MCP server running on stdio (root: ${projectRoot})`)\n}\n\n// Direct execution\nif (import.meta.url === `file://${process.argv[1]}`) {\n const root = process.cwd()\n startServer(root).catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n })\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport { readFile, cortexPath } from '../../utils/files.js'\nimport { readManifest } from '../../core/manifest.js'\nimport { readGraph, getModuleDependencies, getMostImportedFiles } from '../../core/graph.js'\nimport { readModuleDoc, listModuleDocs } from '../../core/modules.js'\nimport { listSessions, readSession, getLatestSession } from '../../core/sessions.js'\nimport { listDecisions, readDecision } from '../../core/decisions.js'\nimport { searchKnowledge } from '../../core/search.js'\nimport type { TemporalData, SymbolIndex } from '../../types/index.js'\n\nfunction textResult(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] }\n}\n\nexport function registerReadTools(server: McpServer, projectRoot: string): void {\n // --- Tool 1: get_project_overview ---\n server.registerTool(\n 'get_project_overview',\n {\n description: 'Get the full project overview: constitution (architecture, risk map, available knowledge), overview narrative, and dependency graph summary. This is the starting point for understanding any codebase. Always call this first.',\n inputSchema: {},\n },\n async () => {\n const constitution = await readFile(cortexPath(projectRoot, 'constitution.md'))\n const overview = await readFile(cortexPath(projectRoot, 'overview.md'))\n const manifest = await readManifest(projectRoot)\n\n const graph = await readGraph(projectRoot)\n let graphSummary = null\n if (graph) {\n graphSummary = {\n modules: graph.modules.length,\n imports: graph.imports.length,\n entryPoints: graph.entryPoints,\n mostImported: getMostImportedFiles(graph, 5),\n }\n }\n\n return textResult({\n constitution,\n overview,\n manifest,\n graphSummary,\n })\n }\n )\n\n // --- Tool 2: get_module_context ---\n server.registerTool(\n 'get_module_context',\n {\n description: 'Get deep context for a specific module: purpose, data flow, public API, gotchas, dependencies, and temporal signals (churn, coupling, bug history). Use after get_project_overview when you need to work on a specific module.',\n inputSchema: {\n name: z.string().describe('Module name (e.g., \"scoring\", \"api\", \"indexer\")'),\n },\n },\n async ({ name }) => {\n const doc = await readModuleDoc(projectRoot, name)\n if (!doc) {\n const available = await listModuleDocs(projectRoot)\n return textResult({ found: false, name, available, message: `Module \"${name}\" not found. Available modules: ${available.join(', ')}` })\n }\n\n // Get graph info for this module\n const graph = await readGraph(projectRoot)\n let deps = null\n if (graph) {\n deps = getModuleDependencies(graph, name)\n }\n\n return textResult({ found: true, name, doc, dependencies: deps })\n }\n )\n\n // --- Tool 3: get_session_briefing ---\n server.registerTool(\n 'get_session_briefing',\n {\n description: 'Get a briefing of what changed since the last session. Shows files changed, modules affected, and decisions recorded. Use at the start of a new session to catch up.',\n inputSchema: {},\n },\n async () => {\n const latestId = await getLatestSession(projectRoot)\n if (!latestId) {\n return textResult({ hasSession: false, message: 'No previous sessions recorded.' })\n }\n\n const session = await readSession(projectRoot, latestId)\n const allSessions = await listSessions(projectRoot)\n\n return textResult({\n hasSession: true,\n latest: session,\n totalSessions: allSessions.length,\n recentSessionIds: allSessions.slice(0, 5),\n })\n }\n )\n\n // --- Tool 4: search_knowledge ---\n server.registerTool(\n 'search_knowledge',\n {\n description: 'Search across all CodeCortex knowledge files (modules, decisions, patterns, sessions, constitution) for a keyword or phrase. Returns matching lines with context.',\n inputSchema: {\n query: z.string().describe('Search term or phrase'),\n },\n },\n async ({ query }) => {\n const results = await searchKnowledge(projectRoot, query)\n return textResult({\n query,\n totalResults: results.length,\n results: results.slice(0, 20),\n })\n }\n )\n\n // --- Tool 5: get_decision_history ---\n server.registerTool(\n 'get_decision_history',\n {\n description: 'Get architectural decision records. Shows WHY the codebase is built the way it is. Filter by topic keyword.',\n inputSchema: {\n topic: z.string().optional().describe('Optional keyword to filter decisions'),\n },\n },\n async ({ topic }) => {\n const ids = await listDecisions(projectRoot)\n const decisions: string[] = []\n\n for (const id of ids) {\n const content = await readDecision(projectRoot, id)\n if (content) {\n if (!topic || content.toLowerCase().includes(topic.toLowerCase())) {\n decisions.push(content)\n }\n }\n }\n\n return textResult({\n total: decisions.length,\n topic: topic || 'all',\n decisions,\n })\n }\n )\n\n // --- Tool 6: get_dependency_graph ---\n server.registerTool(\n 'get_dependency_graph',\n {\n description: 'Get the import/export dependency graph. Shows which files import which, external dependencies, and entry points. Optionally filter to a specific file or module.',\n inputSchema: {\n file: z.string().optional().describe('Filter to edges involving this file path'),\n module: z.string().optional().describe('Filter to edges involving this module name'),\n },\n },\n async ({ file, module }) => {\n const graph = await readGraph(projectRoot)\n if (!graph) return textResult({ found: false, message: 'No graph data. Run codecortex init first.' })\n\n if (module) {\n const deps = getModuleDependencies(graph, module)\n return textResult({ module, ...deps })\n }\n\n if (file) {\n const imports = graph.imports.filter(e => e.source.includes(file) || e.target.includes(file))\n const calls = graph.calls.filter(e => e.file.includes(file))\n return textResult({ file, imports, calls })\n }\n\n return textResult(graph)\n }\n )\n\n // --- Tool 7: lookup_symbol ---\n server.registerTool(\n 'lookup_symbol',\n {\n description: 'Look up a symbol (function, class, type, interface, const) by name. Returns file path, line numbers, signature, and whether it\\'s exported. Use to find where something is defined.',\n inputSchema: {\n name: z.string().describe('Symbol name to search for'),\n kind: z.enum(['function', 'class', 'interface', 'type', 'const', 'enum', 'method', 'property', 'variable']).optional().describe('Filter by symbol kind'),\n file: z.string().optional().describe('Filter by file path (partial match)'),\n },\n },\n async ({ name, kind, file }) => {\n const content = await readFile(cortexPath(projectRoot, 'symbols.json'))\n if (!content) return textResult({ found: false, message: 'No symbol index. Run codecortex init first.' })\n\n const index: SymbolIndex = JSON.parse(content)\n let matches = index.symbols.filter(s =>\n s.name.toLowerCase().includes(name.toLowerCase())\n )\n\n if (kind) matches = matches.filter(s => s.kind === kind)\n if (file) matches = matches.filter(s => s.file.includes(file))\n\n return textResult({\n query: { name, kind, file },\n totalMatches: matches.length,\n symbols: matches.slice(0, 30),\n })\n }\n )\n\n // --- Tool 8: get_change_coupling ---\n server.registerTool(\n 'get_change_coupling',\n {\n description: 'CRITICAL: Call this BEFORE editing any file. Shows files that historically change together. If file A is coupled with file B, editing A without B will likely cause a bug. Hidden couplings (no import between files) are especially dangerous.',\n inputSchema: {\n file: z.string().optional().describe('Show coupling for this specific file'),\n minStrength: z.number().min(0).max(1).default(0.3).describe('Minimum coupling strength (0-1). Default 0.3.'),\n },\n },\n async ({ file, minStrength }) => {\n const content = await readFile(cortexPath(projectRoot, 'temporal.json'))\n if (!content) return textResult({ found: false, message: 'No temporal data. Run codecortex init first.' })\n\n const temporal: TemporalData = JSON.parse(content)\n let coupling = temporal.coupling.filter(c => c.strength >= minStrength)\n\n if (file) {\n coupling = coupling.filter(c =>\n c.fileA.includes(file) || c.fileB.includes(file)\n )\n }\n\n return textResult({\n file: file || 'all',\n minStrength,\n couplings: coupling,\n warning: coupling.filter(c => !c.hasImport).length > 0\n ? 'HIDDEN DEPENDENCIES FOUND — some coupled files have NO import between them'\n : null,\n })\n }\n )\n\n // --- Tool 9: get_hotspots ---\n server.registerTool(\n 'get_hotspots',\n {\n description: 'Get files ranked by risk: change frequency (churn), coupling count, and bug history. Volatile files with many couplings need extra care when editing.',\n inputSchema: {\n limit: z.number().int().min(1).max(50).default(10).describe('Number of files to return'),\n },\n },\n async ({ limit }) => {\n const content = await readFile(cortexPath(projectRoot, 'temporal.json'))\n if (!content) return textResult({ found: false, message: 'No temporal data. Run codecortex init first.' })\n\n const temporal: TemporalData = JSON.parse(content)\n\n // Calculate risk score: churn + coupling count + bug count\n const riskMap = new Map<string, { churn: number; couplings: number; bugs: number; risk: number }>()\n\n for (const h of temporal.hotspots) {\n riskMap.set(h.file, { churn: h.changes, couplings: 0, bugs: 0, risk: h.changes })\n }\n\n for (const c of temporal.coupling) {\n for (const f of [c.fileA, c.fileB]) {\n const entry = riskMap.get(f) || { churn: 0, couplings: 0, bugs: 0, risk: 0 }\n entry.couplings++\n entry.risk += c.strength * 2\n riskMap.set(f, entry)\n }\n }\n\n for (const b of temporal.bugHistory) {\n const entry = riskMap.get(b.file) || { churn: 0, couplings: 0, bugs: 0, risk: 0 }\n entry.bugs = b.fixCommits\n entry.risk += b.fixCommits * 3\n riskMap.set(b.file, entry)\n }\n\n const ranked = [...riskMap.entries()]\n .sort((a, b) => b[1].risk - a[1].risk)\n .slice(0, limit)\n .map(([file, data]) => ({ file, ...data, risk: Math.round(data.risk * 100) / 100 }))\n\n return textResult({\n period: `${temporal.periodDays} days`,\n totalCommits: temporal.totalCommits,\n hotspots: ranked,\n })\n }\n )\n}\n","import { readFile as fsRead, writeFile as fsWrite, mkdir, readdir, stat } from 'node:fs/promises'\nimport { existsSync, createWriteStream } from 'node:fs'\nimport { join, dirname } from 'node:path'\n\nexport async function readFile(path: string): Promise<string | null> {\n try {\n return await fsRead(path, 'utf-8')\n } catch {\n return null\n }\n}\n\nexport async function writeFile(path: string, content: string): Promise<void> {\n await ensureDir(dirname(path))\n await fsWrite(path, content, 'utf-8')\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true })\n }\n}\n\nexport async function listFiles(dir: string, extension?: string): Promise<string[]> {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const files: string[] = []\n for (const entry of entries) {\n if (entry.isFile()) {\n if (!extension || entry.name.endsWith(extension)) {\n files.push(join(dir, entry.name))\n }\n }\n }\n return files\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nexport function cortexDir(projectRoot: string): string {\n return join(projectRoot, '.codecortex')\n}\n\nexport function cortexPath(projectRoot: string, ...segments: string[]): string {\n return join(projectRoot, '.codecortex', ...segments)\n}\n\nexport async function countLines(path: string): Promise<number> {\n const content = await readFile(path)\n if (!content) return 0\n return content.split('\\n').length\n}\n\n/** Stream-write a large array-based JSON object to avoid V8 string length limits. */\nexport async function writeJsonStream<T extends object>(path: string, obj: T, arrayKey: string & keyof T): Promise<void> {\n await ensureDir(dirname(path))\n const arr = obj[arrayKey] as unknown[]\n const stream = createWriteStream(path)\n stream.setMaxListeners(0)\n\n // Single error handler for the entire operation\n let streamError: Error | null = null\n stream.on('error', (err) => { streamError = err })\n\n function waitDrain(): Promise<void> {\n return new Promise((resolve) => stream.once('drain', resolve))\n }\n\n // Write non-array fields as header\n const header: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== arrayKey) header[k] = v\n }\n const headerJson = JSON.stringify(header)\n stream.write(headerJson.slice(0, -1) + `,\"${arrayKey}\":[`)\n\n // Write array elements in batches to reduce await overhead\n const BATCH_SIZE = 1000\n for (let i = 0; i < arr.length; i += BATCH_SIZE) {\n if (streamError) throw streamError\n const end = Math.min(i + BATCH_SIZE, arr.length)\n const chunks: string[] = []\n for (let j = i; j < end; j++) {\n chunks.push((j > 0 ? ',' : '') + JSON.stringify(arr[j]))\n }\n if (!stream.write(chunks.join(''))) {\n await waitDrain()\n }\n }\n\n stream.write(']}')\n\n return new Promise((resolve, reject) => {\n if (streamError) { reject(streamError); return }\n stream.on('finish', resolve)\n stream.on('error', reject)\n stream.end()\n })\n}\n\nexport async function fileSize(path: string): Promise<number> {\n try {\n const s = await stat(path)\n return s.size\n } catch {\n return 0\n }\n}\n","import { parse, stringify } from 'yaml'\n\nexport function parseYaml<T = unknown>(content: string): T {\n return parse(content) as T\n}\n\nexport function stringifyYaml(data: unknown): string {\n return stringify(data, { lineWidth: 120 })\n}\n","import type { CortexManifest } from '../types/index.js'\nimport { readFile, writeFile, cortexPath } from '../utils/files.js'\nimport { parseYaml, stringifyYaml } from '../utils/yaml.js'\n\nexport async function readManifest(projectRoot: string): Promise<CortexManifest | null> {\n const content = await readFile(cortexPath(projectRoot, 'cortex.yaml'))\n if (!content) return null\n return parseYaml<CortexManifest>(content)\n}\n\nexport async function writeManifest(projectRoot: string, manifest: CortexManifest): Promise<void> {\n const content = stringifyYaml(manifest)\n await writeFile(cortexPath(projectRoot, 'cortex.yaml'), content)\n}\n\nexport function createManifest(opts: {\n project: string\n root: string\n languages: string[]\n totalFiles: number\n totalSymbols: number\n totalModules: number\n}): CortexManifest {\n const now = new Date().toISOString()\n return {\n version: '1.0.0',\n project: opts.project,\n root: opts.root,\n generated: now,\n lastUpdated: now,\n languages: opts.languages,\n totalFiles: opts.totalFiles,\n totalSymbols: opts.totalSymbols,\n totalModules: opts.totalModules,\n tiers: {\n hot: ['cortex.yaml', 'constitution.md', 'overview.md', 'graph.json', 'symbols.json', 'temporal.json'],\n warm: ['modules/'],\n cold: ['decisions/', 'sessions/', 'patterns.md'],\n },\n }\n}\n\nexport async function updateManifest(\n projectRoot: string,\n updates: Partial<Pick<CortexManifest, 'totalFiles' | 'totalSymbols' | 'totalModules' | 'languages'>>\n): Promise<CortexManifest | null> {\n const manifest = await readManifest(projectRoot)\n if (!manifest) return null\n\n const updated: CortexManifest = {\n ...manifest,\n ...updates,\n lastUpdated: new Date().toISOString(),\n }\n\n await writeManifest(projectRoot, updated)\n return updated\n}\n","import type { DependencyGraph, ImportEdge, CallEdge, ModuleNode } from '../types/index.js'\nimport { readFile, writeFile, ensureDir, cortexPath } from '../utils/files.js'\nimport { createWriteStream } from 'node:fs'\nimport { dirname } from 'node:path'\n\nexport async function readGraph(projectRoot: string): Promise<DependencyGraph | null> {\n const content = await readFile(cortexPath(projectRoot, 'graph.json'))\n if (!content) return null\n return JSON.parse(content) as DependencyGraph\n}\n\nexport async function writeGraph(projectRoot: string, graph: DependencyGraph): Promise<void> {\n const path = cortexPath(projectRoot, 'graph.json')\n await ensureDir(dirname(path))\n const stream = createWriteStream(path)\n stream.setMaxListeners(0)\n\n function waitDrain(): Promise<void> {\n return new Promise((resolve) => stream.once('drain', resolve))\n }\n\n async function writeArray(arr: unknown[]): Promise<void> {\n stream.write('[')\n const BATCH = 1000\n for (let i = 0; i < arr.length; i += BATCH) {\n const end = Math.min(i + BATCH, arr.length)\n const chunks: string[] = []\n for (let j = i; j < end; j++) {\n chunks.push((j > 0 ? ',' : '') + JSON.stringify(arr[j]))\n }\n if (!stream.write(chunks.join(''))) await waitDrain()\n }\n stream.write(']')\n }\n\n // Write scalar fields\n stream.write(`{\"generated\":${JSON.stringify(graph.generated)},\"modules\":`)\n await writeArray(graph.modules)\n stream.write(',\"imports\":')\n await writeArray(graph.imports)\n stream.write(',\"calls\":')\n await writeArray(graph.calls)\n stream.write(`,\"entryPoints\":${JSON.stringify(graph.entryPoints)}`)\n stream.write(`,\"externalDeps\":${JSON.stringify(graph.externalDeps)}`)\n stream.write('}')\n\n return new Promise((resolve, reject) => {\n stream.on('finish', resolve)\n stream.on('error', reject)\n stream.end()\n })\n}\n\nexport function buildGraph(opts: {\n modules: ModuleNode[]\n imports: ImportEdge[]\n calls: CallEdge[]\n entryPoints: string[]\n externalDeps: Record<string, string[]>\n}): DependencyGraph {\n return {\n generated: new Date().toISOString(),\n modules: opts.modules,\n imports: opts.imports,\n calls: opts.calls,\n entryPoints: opts.entryPoints,\n externalDeps: opts.externalDeps,\n }\n}\n\nexport function getModuleDependencies(graph: DependencyGraph, moduleName: string): {\n imports: ImportEdge[]\n importedBy: ImportEdge[]\n calls: CallEdge[]\n} {\n const moduleFiles = new Set(\n graph.modules.find(m => m.name === moduleName)?.files || []\n )\n\n return {\n imports: graph.imports.filter(e => moduleFiles.has(e.source)),\n importedBy: graph.imports.filter(e => moduleFiles.has(e.target)),\n calls: graph.calls.filter(e => moduleFiles.has(e.file)),\n }\n}\n\nexport function getFileImporters(graph: DependencyGraph, file: string): string[] {\n return graph.imports\n .filter(e => e.target.includes(file))\n .map(e => e.source)\n}\n\nexport function getMostImportedFiles(graph: DependencyGraph, limit: number = 10): { file: string; importCount: number }[] {\n const counts = new Map<string, number>()\n for (const edge of graph.imports) {\n counts.set(edge.target, (counts.get(edge.target) || 0) + 1)\n }\n\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, limit)\n .map(([file, importCount]) => ({ file, importCount }))\n}\n\nexport function enrichCouplingWithImports(\n graph: DependencyGraph,\n coupling: { fileA: string; fileB: string; hasImport: boolean }[]\n): void {\n const importPairs = new Set<string>()\n for (const edge of graph.imports) {\n importPairs.add([edge.source, edge.target].sort().join('|'))\n }\n\n for (const pair of coupling) {\n const key = [pair.fileA, pair.fileB].sort().join('|')\n pair.hasImport = importPairs.has(key)\n }\n}\n","import type { ModuleAnalysis, DecisionRecord, CodingPattern } from '../types/index.js'\n\nexport function generateModuleDoc(analysis: ModuleAnalysis): string {\n const lines: string[] = [\n `# Module: ${analysis.name}`,\n '',\n `## Purpose`,\n analysis.purpose,\n '',\n `## Data Flow`,\n analysis.dataFlow,\n '',\n `## Public API`,\n ...analysis.publicApi.map(api => `- \\`${api}\\``),\n '',\n `## Dependencies`,\n ...analysis.dependencies.map(dep => `- ${dep}`),\n ]\n\n if (analysis.gotchas.length > 0) {\n lines.push('', `## Gotchas`, ...analysis.gotchas.map(g => `- ${g}`))\n }\n\n if (analysis.temporalSignals) {\n const t = analysis.temporalSignals\n lines.push(\n '',\n `## Temporal Signals`,\n `- **Churn:** ${t.churn}`,\n `- **Coupled with:** ${t.coupledWith.join(', ') || 'none'}`,\n `- **Stability:** ${t.stability}`,\n )\n if (t.bugHistory.length > 0) {\n lines.push(`- **Bug history:** ${t.bugHistory.join('; ')}`)\n }\n lines.push(`- **Last changed:** ${t.lastChanged}`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function generateDecisionDoc(decision: DecisionRecord): string {\n const lines: string[] = [\n `# Decision: ${decision.title}`,\n '',\n `**Date:** ${decision.date}`,\n `**Status:** ${decision.status}`,\n '',\n `## Context`,\n decision.context,\n '',\n `## Decision`,\n decision.decision,\n ]\n\n if (decision.alternatives.length > 0) {\n lines.push('', `## Alternatives Considered`, ...decision.alternatives.map(a => `- ${a}`))\n }\n\n if (decision.consequences.length > 0) {\n lines.push('', `## Consequences`, ...decision.consequences.map(c => `- ${c}`))\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function generatePatternEntry(pattern: CodingPattern): string {\n const lines: string[] = [\n `### ${pattern.name}`,\n '',\n pattern.description,\n '',\n '```',\n pattern.example,\n '```',\n ]\n\n if (pattern.files.length > 0) {\n lines.push('', `Files: ${pattern.files.map(f => `\\`${f}\\``).join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n","import type { ModuleAnalysis } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\nimport { generateModuleDoc } from '../utils/markdown.js'\n\nexport async function readModuleDoc(projectRoot: string, moduleName: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'modules', `${moduleName}.md`))\n}\n\nexport async function writeModuleDoc(projectRoot: string, analysis: ModuleAnalysis): Promise<void> {\n const dir = cortexPath(projectRoot, 'modules')\n await ensureDir(dir)\n const content = generateModuleDoc(analysis)\n await writeFile(cortexPath(projectRoot, 'modules', `${analysis.name}.md`), content)\n}\n\nexport async function listModuleDocs(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'modules')\n const files = await listFiles(dir, '.md')\n return files.map(f => {\n const name = f.split('/').pop() || ''\n return name.replace('.md', '')\n })\n}\n\nexport function buildAnalysisPrompt(moduleName: string, sourceFiles: { path: string; content: string }[]): string {\n const fileList = sourceFiles.map(f => `### ${f.path}\\n\\`\\`\\`\\n${f.content}\\n\\`\\`\\``).join('\\n\\n')\n\n return `Analyze the \"${moduleName}\" module. Return a JSON object with this exact structure:\n\n{\n \"name\": \"${moduleName}\",\n \"purpose\": \"One paragraph describing what this module does and why it exists\",\n \"dataFlow\": \"How data flows through this module — inputs, transformations, outputs\",\n \"publicApi\": [\"list\", \"of\", \"exported\", \"functions\", \"and\", \"types\"],\n \"gotchas\": [\"Things that are surprising or could cause bugs\"],\n \"dependencies\": [\"What this module depends on and why\"]\n}\n\nSource files:\n\n${fileList}`\n}\n","import type { SessionLog } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\n\nexport async function writeSession(projectRoot: string, session: SessionLog): Promise<void> {\n const dir = cortexPath(projectRoot, 'sessions')\n await ensureDir(dir)\n\n const lines = [\n `# Session: ${session.date}`,\n '',\n `**ID:** ${session.id}`,\n session.previousSession ? `**Previous:** ${session.previousSession}` : null,\n '',\n `## Summary`,\n session.summary,\n '',\n `## Files Changed`,\n ...session.filesChanged.map(f => `- \\`${f}\\``),\n '',\n `## Modules Affected`,\n ...session.modulesAffected.map(m => `- ${m}`),\n ].filter(Boolean) as string[]\n\n if (session.decisionsRecorded.length > 0) {\n lines.push('', `## Decisions Recorded`, ...session.decisionsRecorded.map(d => `- ${d}`))\n }\n\n await writeFile(cortexPath(projectRoot, 'sessions', `${session.id}.md`), lines.join('\\n') + '\\n')\n}\n\nexport async function readSession(projectRoot: string, id: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'sessions', `${id}.md`))\n}\n\nexport async function listSessions(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'sessions')\n const files = await listFiles(dir, '.md')\n return files\n .map(f => (f.split('/').pop() || '').replace('.md', ''))\n .sort()\n .reverse()\n}\n\nexport async function getLatestSession(projectRoot: string): Promise<string | null> {\n const sessions = await listSessions(projectRoot)\n return sessions[0] ?? null\n}\n\nexport function createSession(opts: {\n filesChanged: string[]\n modulesAffected: string[]\n decisionsRecorded?: string[]\n summary: string\n previousSession?: string\n}): SessionLog {\n const now = new Date()\n const id = now.toISOString().replace(/[:.]/g, '-').slice(0, 19)\n\n return {\n id,\n date: now.toISOString(),\n previousSession: opts.previousSession,\n filesChanged: opts.filesChanged,\n modulesAffected: opts.modulesAffected,\n decisionsRecorded: opts.decisionsRecorded || [],\n summary: opts.summary,\n }\n}\n","import type { DecisionRecord } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\nimport { generateDecisionDoc } from '../utils/markdown.js'\n\nexport async function readDecision(projectRoot: string, id: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'decisions', `${id}.md`))\n}\n\nexport async function writeDecision(projectRoot: string, decision: DecisionRecord): Promise<void> {\n const dir = cortexPath(projectRoot, 'decisions')\n await ensureDir(dir)\n const content = generateDecisionDoc(decision)\n await writeFile(cortexPath(projectRoot, 'decisions', `${decision.id}.md`), content)\n}\n\nexport async function listDecisions(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'decisions')\n const files = await listFiles(dir, '.md')\n return files.map(f => {\n const name = f.split('/').pop() || ''\n return name.replace('.md', '')\n })\n}\n\nexport function createDecision(input: {\n title: string\n context: string\n decision: string\n alternatives?: string[]\n consequences?: string[]\n}): DecisionRecord {\n const id = input.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 60)\n\n return {\n id,\n date: new Date().toISOString().split('T')[0] ?? '',\n title: input.title,\n context: input.context,\n decision: input.decision,\n alternatives: input.alternatives || [],\n consequences: input.consequences || [],\n status: 'accepted',\n }\n}\n","import { readFile, listFiles, cortexPath } from '../utils/files.js'\nimport { readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { existsSync } from 'node:fs'\n\nexport interface SearchResult {\n file: string\n line: number\n content: string\n context: string\n}\n\nexport async function searchKnowledge(projectRoot: string, query: string): Promise<SearchResult[]> {\n const cortexRoot = cortexPath(projectRoot)\n if (!existsSync(cortexRoot)) return []\n\n const results: SearchResult[] = []\n const queryLower = query.toLowerCase()\n\n const allFiles = await getAllCortexFiles(cortexRoot)\n\n for (const filePath of allFiles) {\n const content = await readFile(filePath)\n if (!content) continue\n\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (line?.toLowerCase().includes(queryLower)) {\n // Get surrounding context (2 lines before and after)\n const start = Math.max(0, i - 2)\n const end = Math.min(lines.length - 1, i + 2)\n const context = lines.slice(start, end + 1).join('\\n')\n\n results.push({\n file: filePath.replace(cortexRoot + '/', ''),\n line: i + 1,\n content: line.trim(),\n context,\n })\n }\n }\n }\n\n return results\n}\n\nasync function getAllCortexFiles(dir: string): Promise<string[]> {\n const files: string[] = []\n\n if (!existsSync(dir)) return files\n\n const entries = await readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n const subFiles = await getAllCortexFiles(fullPath)\n files.push(...subFiles)\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.json') || entry.name.endsWith('.yaml'))) {\n files.push(fullPath)\n }\n }\n\n return files\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport { readFile as readFileUtil, cortexPath } from '../../utils/files.js'\nimport { ModuleAnalysisSchema, DecisionInputSchema, PatternInputSchema, FeedbackInputSchema } from '../../types/schema.js'\nimport { writeModuleDoc, buildAnalysisPrompt, listModuleDocs } from '../../core/modules.js'\nimport { writeDecision, createDecision } from '../../core/decisions.js'\nimport { addPattern } from '../../core/patterns.js'\nimport { writeFile, ensureDir } from '../../utils/files.js'\nimport { readGraph } from '../../core/graph.js'\nimport type { ModuleAnalysis, TemporalData, Hotspot, ChangeCoupling, BugRecord } from '../../types/index.js'\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nfunction textResult(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] }\n}\n\nexport function registerWriteTools(server: McpServer, projectRoot: string): void {\n // --- Tool 10: analyze_module ---\n server.registerTool(\n 'analyze_module',\n {\n description: 'Prepares a module for analysis. Returns the source files and a structured prompt. You should read the source files, analyze them, then call save_module_analysis with the result.',\n inputSchema: {\n name: z.string().describe('Module name (e.g., \"scoring\", \"api\")'),\n },\n },\n async ({ name }) => {\n const graph = await readGraph(projectRoot)\n if (!graph) {\n return textResult({ error: 'No graph data. Run codecortex init first.' })\n }\n\n const module = graph.modules.find(m => m.name === name)\n if (!module) {\n const available = graph.modules.map(m => m.name)\n return textResult({ error: `Module \"${name}\" not found`, available })\n }\n\n // Read source files for this module\n const sourceFiles: { path: string; content: string }[] = []\n for (const filePath of module.files) {\n try {\n const content = await readFile(join(projectRoot, filePath), 'utf-8')\n sourceFiles.push({ path: filePath, content })\n } catch {\n // Skip files that can't be read\n }\n }\n\n const prompt = buildAnalysisPrompt(name, sourceFiles)\n\n return textResult({\n module: name,\n files: module.files,\n prompt,\n instruction: 'Analyze the source files above and call save_module_analysis with the JSON result.',\n })\n }\n )\n\n // --- Tool 11: save_module_analysis ---\n server.registerTool(\n 'save_module_analysis',\n {\n description: 'Save the result of a module analysis. Provide the structured analysis (purpose, dataFlow, publicApi, gotchas, dependencies) and it will be persisted to modules/*.md.',\n inputSchema: {\n analysis: ModuleAnalysisSchema.describe('The structured module analysis'),\n },\n },\n async ({ analysis }) => {\n const moduleAnalysis: ModuleAnalysis = {\n ...analysis,\n }\n\n // Enrich with temporal data if available\n const temporalContent = await readFileUtil(cortexPath(projectRoot, 'temporal.json'))\n if (temporalContent) {\n const temporal: TemporalData = JSON.parse(temporalContent)\n const hotspot = temporal.hotspots?.find((h: Hotspot) =>\n h.file.includes(`/${analysis.name}/`) || h.file.includes(`${analysis.name}.`)\n )\n const couplings = temporal.coupling?.filter((c: ChangeCoupling) =>\n c.fileA.includes(`/${analysis.name}/`) || c.fileB.includes(`/${analysis.name}/`)\n ) || []\n const bugs = temporal.bugHistory?.filter((b: BugRecord) =>\n b.file.includes(`/${analysis.name}/`)\n ) || []\n\n if (hotspot || couplings.length > 0 || bugs.length > 0) {\n moduleAnalysis.temporalSignals = {\n churn: hotspot ? `${hotspot.changes} changes (${hotspot.stability})` : 'unknown',\n coupledWith: couplings.map((c: ChangeCoupling) => {\n const other = c.fileA.includes(`/${analysis.name}/`) ? c.fileB : c.fileA\n return `${other} (${c.cochanges} co-changes)`\n }),\n stability: hotspot?.stability || 'unknown',\n bugHistory: bugs.flatMap((b: BugRecord) => b.lessons),\n lastChanged: hotspot?.lastChanged || 'unknown',\n }\n }\n }\n\n await writeModuleDoc(projectRoot, moduleAnalysis)\n\n return textResult({\n saved: true,\n module: analysis.name,\n path: `.codecortex/modules/${analysis.name}.md`,\n })\n }\n )\n\n // --- Tool 12: record_decision ---\n server.registerTool(\n 'record_decision',\n {\n description: 'Record an architectural decision. Documents WHY something is built a certain way, what alternatives were considered, and consequences. Use whenever a non-obvious technical choice is made.',\n inputSchema: {\n title: z.string().describe('Decision title (e.g., \"Use tree-sitter for parsing\")'),\n context: z.string().describe('What situation led to this decision'),\n decision: z.string().describe('What was decided'),\n alternatives: z.array(z.string()).default([]).describe('What other options were considered'),\n consequences: z.array(z.string()).default([]).describe('Expected consequences of this decision'),\n },\n },\n async ({ title, context, decision, alternatives, consequences }) => {\n const record = createDecision({ title, context, decision, alternatives, consequences })\n await writeDecision(projectRoot, record)\n\n return textResult({\n recorded: true,\n id: record.id,\n path: `.codecortex/decisions/${record.id}.md`,\n })\n }\n )\n\n // --- Tool 13: update_patterns ---\n server.registerTool(\n 'update_patterns',\n {\n description: 'Add or update a coding pattern. Patterns document HOW code is written in this project (naming conventions, error handling, testing approaches). Returns \"added\", \"updated\", or \"noop\".',\n inputSchema: {\n name: z.string().describe('Pattern name (e.g., \"Error handling in API routes\")'),\n description: z.string().describe('What the pattern is and when to use it'),\n example: z.string().describe('Code example showing the pattern'),\n files: z.array(z.string()).default([]).describe('Files where this pattern is used'),\n },\n },\n async ({ name, description, example, files }) => {\n const result = await addPattern(projectRoot, { name, description, example, files })\n\n return textResult({\n action: result,\n pattern: name,\n path: '.codecortex/patterns.md',\n })\n }\n )\n\n // --- Tool 14: report_feedback ---\n server.registerTool(\n 'report_feedback',\n {\n description: 'Report incorrect or outdated knowledge. If you discover that a module doc, decision, or pattern is wrong, report it here. The feedback will be stored and used in the next analysis cycle.',\n inputSchema: {\n file: z.string().describe('Which knowledge file is incorrect (e.g., \"modules/scoring.md\")'),\n issue: z.string().describe('What is wrong or outdated'),\n reporter: z.string().default('agent').describe('Who is reporting (default: agent)'),\n },\n },\n async ({ file, issue, reporter }) => {\n const dir = cortexPath(projectRoot, 'feedback')\n await ensureDir(dir)\n\n const entry = {\n date: new Date().toISOString(),\n file,\n issue,\n reporter,\n }\n\n // Append to feedback log\n const feedbackPath = cortexPath(projectRoot, 'feedback', 'log.json')\n const existing = await readFileUtil(feedbackPath)\n const entries = existing ? JSON.parse(existing) : []\n entries.push(entry)\n await writeFile(feedbackPath, JSON.stringify(entries, null, 2))\n\n return textResult({\n recorded: true,\n totalFeedback: entries.length,\n message: 'Feedback recorded. Will be addressed in next codecortex update.',\n })\n }\n )\n}\n","import { z } from 'zod'\n\nexport const ModuleAnalysisSchema = z.object({\n name: z.string(),\n purpose: z.string(),\n dataFlow: z.string(),\n publicApi: z.array(z.string()),\n gotchas: z.array(z.string()),\n dependencies: z.array(z.string()),\n})\n\nexport const DecisionInputSchema = z.object({\n title: z.string(),\n context: z.string(),\n decision: z.string(),\n alternatives: z.array(z.string()).default([]),\n consequences: z.array(z.string()).default([]),\n})\n\nexport const PatternInputSchema = z.object({\n name: z.string(),\n description: z.string(),\n example: z.string(),\n files: z.array(z.string()).default([]),\n})\n\nexport const FeedbackInputSchema = z.object({\n file: z.string(),\n issue: z.string(),\n reporter: z.string().default('agent'),\n})\n","import type { CodingPattern } from '../types/index.js'\nimport { readFile, writeFile, cortexPath } from '../utils/files.js'\nimport { generatePatternEntry } from '../utils/markdown.js'\n\nexport async function readPatterns(projectRoot: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'patterns.md'))\n}\n\nexport async function addPattern(projectRoot: string, pattern: CodingPattern): Promise<'added' | 'updated' | 'noop'> {\n const existing = await readPatterns(projectRoot) || '# Coding Patterns\\n'\n\n // Check if pattern with same name already exists\n const nameRegex = new RegExp(`### ${escapeRegex(pattern.name)}`, 'i')\n if (nameRegex.test(existing)) {\n // Update: replace the existing pattern section\n const entry = generatePatternEntry(pattern)\n const sectionRegex = new RegExp(\n `### ${escapeRegex(pattern.name)}[\\\\s\\\\S]*?(?=### |$)`,\n 'i'\n )\n const updated = existing.replace(sectionRegex, entry + '\\n\\n')\n await writeFile(cortexPath(projectRoot, 'patterns.md'), updated)\n return 'updated'\n }\n\n // Add new pattern\n const entry = generatePatternEntry(pattern)\n const content = existing.trimEnd() + '\\n\\n' + entry + '\\n'\n await writeFile(cortexPath(projectRoot, 'patterns.md'), content)\n return 'added'\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n"],"mappings":";AAqBA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;;;ACrBrC,SAAS,SAAS;;;ACDlB,SAAS,YAAY,QAAQ,aAAa,SAAS,OAAO,SAAS,YAAY;AAC/E,SAAS,YAAY,yBAAyB;AAC9C,SAAS,MAAM,eAAe;AAE9B,eAAsB,SAAS,MAAsC;AACnE,MAAI;AACF,WAAO,MAAM,OAAO,MAAM,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,UAAU,MAAc,SAAgC;AAC5E,QAAM,UAAU,QAAQ,IAAI,CAAC;AAC7B,QAAM,QAAQ,MAAM,SAAS,OAAO;AACtC;AAEA,eAAsB,UAAU,KAA4B;AAC1D,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACtC;AACF;AAEA,eAAsB,UAAU,KAAa,WAAuC;AAClF,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,OAAO,GAAG;AAClB,UAAI,CAAC,aAAa,MAAM,KAAK,SAAS,SAAS,GAAG;AAChD,cAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAeO,SAAS,WAAW,gBAAwB,UAA4B;AAC7E,SAAO,KAAK,aAAa,eAAe,GAAG,QAAQ;AACrD;AASA,eAAsB,gBAAkC,MAAc,KAAQ,UAA2C;AACvH,QAAM,UAAU,QAAQ,IAAI,CAAC;AAC7B,QAAM,MAAM,IAAI,QAAQ;AACxB,QAAM,SAAS,kBAAkB,IAAI;AACrC,SAAO,gBAAgB,CAAC;AAGxB,MAAI,cAA4B;AAChC,SAAO,GAAG,SAAS,CAAC,QAAQ;AAAE,kBAAc;AAAA,EAAI,CAAC;AAEjD,WAAS,YAA2B;AAClC,WAAO,IAAI,QAAQ,CAAC,YAAY,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,EAC/D;AAGA,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,QAAI,MAAM,SAAU,QAAO,CAAC,IAAI;AAAA,EAClC;AACA,QAAM,aAAa,KAAK,UAAU,MAAM;AACxC,SAAO,MAAM,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK,QAAQ,KAAK;AAGzD,QAAM,aAAa;AACnB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,YAAY;AAC/C,QAAI,YAAa,OAAM;AACvB,UAAM,MAAM,KAAK,IAAI,IAAI,YAAY,IAAI,MAAM;AAC/C,UAAM,SAAmB,CAAC;AAC1B,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,aAAO,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAAA,IACzD;AACA,QAAI,CAAC,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC,GAAG;AAClC,YAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,MAAM,IAAI;AAEjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,aAAa;AAAE,aAAO,WAAW;AAAG;AAAA,IAAO;AAC/C,WAAO,GAAG,UAAU,OAAO;AAC3B,WAAO,GAAG,SAAS,MAAM;AACzB,WAAO,IAAI;AAAA,EACb,CAAC;AACH;;;ACzGA,SAAS,OAAO,iBAAiB;AAE1B,SAAS,UAAuB,SAAoB;AACzD,SAAO,MAAM,OAAO;AACtB;AAEO,SAAS,cAAc,MAAuB;AACnD,SAAO,UAAU,MAAM,EAAE,WAAW,IAAI,CAAC;AAC3C;;;ACJA,eAAsB,aAAa,aAAqD;AACtF,QAAM,UAAU,MAAM,SAAS,WAAW,aAAa,aAAa,CAAC;AACrE,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,UAA0B,OAAO;AAC1C;AAEA,eAAsB,cAAc,aAAqB,UAAyC;AAChG,QAAM,UAAU,cAAc,QAAQ;AACtC,QAAM,UAAU,WAAW,aAAa,aAAa,GAAG,OAAO;AACjE;AAEO,SAAS,eAAe,MAOZ;AACjB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,KAAK;AAAA,IACd,MAAM,KAAK;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,cAAc,KAAK;AAAA,IACnB,cAAc,KAAK;AAAA,IACnB,OAAO;AAAA,MACL,KAAK,CAAC,eAAe,mBAAmB,eAAe,cAAc,gBAAgB,eAAe;AAAA,MACpG,MAAM,CAAC,UAAU;AAAA,MACjB,MAAM,CAAC,cAAc,aAAa,aAAa;AAAA,IACjD;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,aACA,SACgC;AAChC,QAAM,WAAW,MAAM,aAAa,WAAW;AAC/C,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,UAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AAEA,QAAM,cAAc,aAAa,OAAO;AACxC,SAAO;AACT;;;ACvDA,SAAS,qBAAAA,0BAAyB;AAClC,SAAS,WAAAC,gBAAe;AAExB,eAAsB,UAAU,aAAsD;AACpF,QAAM,UAAU,MAAM,SAAS,WAAW,aAAa,YAAY,CAAC;AACpE,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAsB,WAAW,aAAqB,OAAuC;AAC3F,QAAM,OAAO,WAAW,aAAa,YAAY;AACjD,QAAM,UAAUA,SAAQ,IAAI,CAAC;AAC7B,QAAM,SAASD,mBAAkB,IAAI;AACrC,SAAO,gBAAgB,CAAC;AAExB,WAAS,YAA2B;AAClC,WAAO,IAAI,QAAQ,CAAC,YAAY,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,EAC/D;AAEA,iBAAe,WAAW,KAA+B;AACvD,WAAO,MAAM,GAAG;AAChB,UAAM,QAAQ;AACd,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,OAAO;AAC1C,YAAM,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM;AAC1C,YAAM,SAAmB,CAAC;AAC1B,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,eAAO,MAAM,IAAI,IAAI,MAAM,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAAA,MACzD;AACA,UAAI,CAAC,OAAO,MAAM,OAAO,KAAK,EAAE,CAAC,EAAG,OAAM,UAAU;AAAA,IACtD;AACA,WAAO,MAAM,GAAG;AAAA,EAClB;AAGA,SAAO,MAAM,gBAAgB,KAAK,UAAU,MAAM,SAAS,CAAC,aAAa;AACzE,QAAM,WAAW,MAAM,OAAO;AAC9B,SAAO,MAAM,aAAa;AAC1B,QAAM,WAAW,MAAM,OAAO;AAC9B,SAAO,MAAM,WAAW;AACxB,QAAM,WAAW,MAAM,KAAK;AAC5B,SAAO,MAAM,kBAAkB,KAAK,UAAU,MAAM,WAAW,CAAC,EAAE;AAClE,SAAO,MAAM,mBAAmB,KAAK,UAAU,MAAM,YAAY,CAAC,EAAE;AACpE,SAAO,MAAM,GAAG;AAEhB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO,GAAG,UAAU,OAAO;AAC3B,WAAO,GAAG,SAAS,MAAM;AACzB,WAAO,IAAI;AAAA,EACb,CAAC;AACH;AAEO,SAAS,WAAW,MAMP;AAClB,SAAO;AAAA,IACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,EACrB;AACF;AAEO,SAAS,sBAAsB,OAAwB,YAI5D;AACA,QAAM,cAAc,IAAI;AAAA,IACtB,MAAM,QAAQ,KAAK,OAAK,EAAE,SAAS,UAAU,GAAG,SAAS,CAAC;AAAA,EAC5D;AAEA,SAAO;AAAA,IACL,SAAS,MAAM,QAAQ,OAAO,OAAK,YAAY,IAAI,EAAE,MAAM,CAAC;AAAA,IAC5D,YAAY,MAAM,QAAQ,OAAO,OAAK,YAAY,IAAI,EAAE,MAAM,CAAC;AAAA,IAC/D,OAAO,MAAM,MAAM,OAAO,OAAK,YAAY,IAAI,EAAE,IAAI,CAAC;AAAA,EACxD;AACF;AAQO,SAAS,qBAAqB,OAAwB,QAAgB,IAA6C;AACxH,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,QAAQ,MAAM,SAAS;AAChC,WAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAC5D;AAEA,SAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,EACxB,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,CAAC,MAAM,WAAW,OAAO,EAAE,MAAM,YAAY,EAAE;AACzD;AAEO,SAAS,0BACd,OACA,UACM;AACN,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,QAAQ,MAAM,SAAS;AAChC,gBAAY,IAAI,CAAC,KAAK,QAAQ,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,EAC7D;AAEA,aAAW,QAAQ,UAAU;AAC3B,UAAM,MAAM,CAAC,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG;AACpD,SAAK,YAAY,YAAY,IAAI,GAAG;AAAA,EACtC;AACF;;;ACnHO,SAAS,kBAAkB,UAAkC;AAClE,QAAM,QAAkB;AAAA,IACtB,aAAa,SAAS,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,GAAG,SAAS,UAAU,IAAI,SAAO,OAAO,GAAG,IAAI;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,GAAG,SAAS,aAAa,IAAI,SAAO,KAAK,GAAG,EAAE;AAAA,EAChD;AAEA,MAAI,SAAS,QAAQ,SAAS,GAAG;AAC/B,UAAM,KAAK,IAAI,cAAc,GAAG,SAAS,QAAQ,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACrE;AAEA,MAAI,SAAS,iBAAiB;AAC5B,UAAM,IAAI,SAAS;AACnB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,gBAAgB,EAAE,KAAK;AAAA,MACvB,uBAAuB,EAAE,YAAY,KAAK,IAAI,KAAK,MAAM;AAAA,MACzD,oBAAoB,EAAE,SAAS;AAAA,IACjC;AACA,QAAI,EAAE,WAAW,SAAS,GAAG;AAC3B,YAAM,KAAK,sBAAsB,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,IAC5D;AACA,UAAM,KAAK,uBAAuB,EAAE,WAAW,EAAE;AAAA,EACnD;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEO,SAAS,oBAAoB,UAAkC;AACpE,QAAM,QAAkB;AAAA,IACtB,eAAe,SAAS,KAAK;AAAA,IAC7B;AAAA,IACA,aAAa,SAAS,IAAI;AAAA,IAC1B,eAAe,SAAS,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AAEA,MAAI,SAAS,aAAa,SAAS,GAAG;AACpC,UAAM,KAAK,IAAI,8BAA8B,GAAG,SAAS,aAAa,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EAC1F;AAEA,MAAI,SAAS,aAAa,SAAS,GAAG;AACpC,UAAM,KAAK,IAAI,mBAAmB,GAAG,SAAS,aAAa,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EAC/E;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAEO,SAAS,qBAAqB,SAAgC;AACnE,QAAM,QAAkB;AAAA,IACtB,OAAO,QAAQ,IAAI;AAAA,IACnB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AAEA,MAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,UAAM,KAAK,IAAI,UAAU,QAAQ,MAAM,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EAC1E;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC9EA,eAAsB,cAAc,aAAqB,YAA4C;AACnG,SAAO,SAAS,WAAW,aAAa,WAAW,GAAG,UAAU,KAAK,CAAC;AACxE;AAEA,eAAsB,eAAe,aAAqB,UAAyC;AACjG,QAAM,MAAM,WAAW,aAAa,SAAS;AAC7C,QAAM,UAAU,GAAG;AACnB,QAAM,UAAU,kBAAkB,QAAQ;AAC1C,QAAM,UAAU,WAAW,aAAa,WAAW,GAAG,SAAS,IAAI,KAAK,GAAG,OAAO;AACpF;AAEA,eAAsB,eAAe,aAAwC;AAC3E,QAAM,MAAM,WAAW,aAAa,SAAS;AAC7C,QAAM,QAAQ,MAAM,UAAU,KAAK,KAAK;AACxC,SAAO,MAAM,IAAI,OAAK;AACpB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACnC,WAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,EAC/B,CAAC;AACH;AAEO,SAAS,oBAAoB,YAAoB,aAA0D;AAChH,QAAM,WAAW,YAAY,IAAI,OAAK,OAAO,EAAE,IAAI;AAAA;AAAA,EAAa,EAAE,OAAO;AAAA,OAAU,EAAE,KAAK,MAAM;AAEhG,SAAO,gBAAgB,UAAU;AAAA;AAAA;AAAA,aAGtB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUrB,QAAQ;AACV;;;ACtCA,eAAsB,aAAa,aAAqB,SAAoC;AAC1F,QAAM,MAAM,WAAW,aAAa,UAAU;AAC9C,QAAM,UAAU,GAAG;AAEnB,QAAM,QAAQ;AAAA,IACZ,cAAc,QAAQ,IAAI;AAAA,IAC1B;AAAA,IACA,WAAW,QAAQ,EAAE;AAAA,IACrB,QAAQ,kBAAkB,iBAAiB,QAAQ,eAAe,KAAK;AAAA,IACvE;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,aAAa,IAAI,OAAK,OAAO,CAAC,IAAI;AAAA,IAC7C;AAAA,IACA;AAAA,IACA,GAAG,QAAQ,gBAAgB,IAAI,OAAK,KAAK,CAAC,EAAE;AAAA,EAC9C,EAAE,OAAO,OAAO;AAEhB,MAAI,QAAQ,kBAAkB,SAAS,GAAG;AACxC,UAAM,KAAK,IAAI,yBAAyB,GAAG,QAAQ,kBAAkB,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,EACzF;AAEA,QAAM,UAAU,WAAW,aAAa,YAAY,GAAG,QAAQ,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,IAAI,IAAI;AAClG;AAEA,eAAsB,YAAY,aAAqB,IAAoC;AACzF,SAAO,SAAS,WAAW,aAAa,YAAY,GAAG,EAAE,KAAK,CAAC;AACjE;AAEA,eAAsB,aAAa,aAAwC;AACzE,QAAM,MAAM,WAAW,aAAa,UAAU;AAC9C,QAAM,QAAQ,MAAM,UAAU,KAAK,KAAK;AACxC,SAAO,MACJ,IAAI,QAAM,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK,IAAI,QAAQ,OAAO,EAAE,CAAC,EACtD,KAAK,EACL,QAAQ;AACb;AAEA,eAAsB,iBAAiB,aAA6C;AAClF,QAAM,WAAW,MAAM,aAAa,WAAW;AAC/C,SAAO,SAAS,CAAC,KAAK;AACxB;AAEO,SAAS,cAAc,MAMf;AACb,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,KAAK,IAAI,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAAE;AAE9D,SAAO;AAAA,IACL;AAAA,IACA,MAAM,IAAI,YAAY;AAAA,IACtB,iBAAiB,KAAK;AAAA,IACtB,cAAc,KAAK;AAAA,IACnB,iBAAiB,KAAK;AAAA,IACtB,mBAAmB,KAAK,qBAAqB,CAAC;AAAA,IAC9C,SAAS,KAAK;AAAA,EAChB;AACF;;;AC/DA,eAAsB,aAAa,aAAqB,IAAoC;AAC1F,SAAO,SAAS,WAAW,aAAa,aAAa,GAAG,EAAE,KAAK,CAAC;AAClE;AAEA,eAAsB,cAAc,aAAqB,UAAyC;AAChG,QAAM,MAAM,WAAW,aAAa,WAAW;AAC/C,QAAM,UAAU,GAAG;AACnB,QAAM,UAAU,oBAAoB,QAAQ;AAC5C,QAAM,UAAU,WAAW,aAAa,aAAa,GAAG,SAAS,EAAE,KAAK,GAAG,OAAO;AACpF;AAEA,eAAsB,cAAc,aAAwC;AAC1E,QAAM,MAAM,WAAW,aAAa,WAAW;AAC/C,QAAM,QAAQ,MAAM,UAAU,KAAK,KAAK;AACxC,SAAO,MAAM,IAAI,OAAK;AACpB,UAAM,OAAO,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACnC,WAAO,KAAK,QAAQ,OAAO,EAAE;AAAA,EAC/B,CAAC;AACH;AAEO,SAAS,eAAe,OAMZ;AACjB,QAAM,KAAK,MAAM,MACd,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE,EACpB,MAAM,GAAG,EAAE;AAEd,SAAO;AAAA,IACL;AAAA,IACA,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK;AAAA,IAChD,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM,gBAAgB,CAAC;AAAA,IACrC,cAAc,MAAM,gBAAgB,CAAC;AAAA,IACrC,QAAQ;AAAA,EACV;AACF;;;AC9CA,SAAS,WAAAE,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAAC,mBAAkB;AAS3B,eAAsB,gBAAgB,aAAqB,OAAwC;AACjG,QAAM,aAAa,WAAW,WAAW;AACzC,MAAI,CAACA,YAAW,UAAU,EAAG,QAAO,CAAC;AAErC,QAAM,UAA0B,CAAC;AACjC,QAAM,aAAa,MAAM,YAAY;AAErC,QAAM,WAAW,MAAM,kBAAkB,UAAU;AAEnD,aAAW,YAAY,UAAU;AAC/B,UAAM,UAAU,MAAM,SAAS,QAAQ;AACvC,QAAI,CAAC,QAAS;AAEd,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,MAAM,YAAY,EAAE,SAAS,UAAU,GAAG;AAE5C,cAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC;AAC/B,cAAM,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC;AAC5C,cAAM,UAAU,MAAM,MAAM,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI;AAErD,gBAAQ,KAAK;AAAA,UACX,MAAM,SAAS,QAAQ,aAAa,KAAK,EAAE;AAAA,UAC3C,MAAM,IAAI;AAAA,UACV,SAAS,KAAK,KAAK;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,kBAAkB,KAAgC;AAC/D,QAAM,QAAkB,CAAC;AAEzB,MAAI,CAACA,YAAW,GAAG,EAAG,QAAO;AAE7B,QAAM,UAAU,MAAMF,SAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1D,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,MAAM,IAAI;AACrC,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,kBAAkB,QAAQ;AACjD,YAAM,KAAK,GAAG,QAAQ;AAAA,IACxB,WAAW,MAAM,OAAO,MAAM,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,IAAI;AACzH,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;ATrDA,SAAS,WAAW,MAAe;AACjC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AACrF;AAEO,SAAS,kBAAkB,QAAmB,aAA2B;AAE9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa,CAAC;AAAA,IAChB;AAAA,IACA,YAAY;AACV,YAAM,eAAe,MAAM,SAAS,WAAW,aAAa,iBAAiB,CAAC;AAC9E,YAAM,WAAW,MAAM,SAAS,WAAW,aAAa,aAAa,CAAC;AACtE,YAAM,WAAW,MAAM,aAAa,WAAW;AAE/C,YAAM,QAAQ,MAAM,UAAU,WAAW;AACzC,UAAI,eAAe;AACnB,UAAI,OAAO;AACT,uBAAe;AAAA,UACb,SAAS,MAAM,QAAQ;AAAA,UACvB,SAAS,MAAM,QAAQ;AAAA,UACvB,aAAa,MAAM;AAAA,UACnB,cAAc,qBAAqB,OAAO,CAAC;AAAA,QAC7C;AAAA,MACF;AAEA,aAAO,WAAW;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,iDAAiD;AAAA,MAC7E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAClB,YAAM,MAAM,MAAM,cAAc,aAAa,IAAI;AACjD,UAAI,CAAC,KAAK;AACR,cAAM,YAAY,MAAM,eAAe,WAAW;AAClD,eAAO,WAAW,EAAE,OAAO,OAAO,MAAM,WAAW,SAAS,WAAW,IAAI,mCAAmC,UAAU,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,MACxI;AAGA,YAAM,QAAQ,MAAM,UAAU,WAAW;AACzC,UAAI,OAAO;AACX,UAAI,OAAO;AACT,eAAO,sBAAsB,OAAO,IAAI;AAAA,MAC1C;AAEA,aAAO,WAAW,EAAE,OAAO,MAAM,MAAM,KAAK,cAAc,KAAK,CAAC;AAAA,IAClE;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa,CAAC;AAAA,IAChB;AAAA,IACA,YAAY;AACV,YAAM,WAAW,MAAM,iBAAiB,WAAW;AACnD,UAAI,CAAC,UAAU;AACb,eAAO,WAAW,EAAE,YAAY,OAAO,SAAS,iCAAiC,CAAC;AAAA,MACpF;AAEA,YAAM,UAAU,MAAM,YAAY,aAAa,QAAQ;AACvD,YAAM,cAAc,MAAM,aAAa,WAAW;AAElD,aAAO,WAAW;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,eAAe,YAAY;AAAA,QAC3B,kBAAkB,YAAY,MAAM,GAAG,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,MACpD;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,UAAU,MAAM,gBAAgB,aAAa,KAAK;AACxD,aAAO,WAAW;AAAA,QAChB;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,SAAS,QAAQ,MAAM,GAAG,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,MAAM,MAAM,cAAc,WAAW;AAC3C,YAAM,YAAsB,CAAC;AAE7B,iBAAW,MAAM,KAAK;AACpB,cAAM,UAAU,MAAM,aAAa,aAAa,EAAE;AAClD,YAAI,SAAS;AACX,cAAI,CAAC,SAAS,QAAQ,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,GAAG;AACjE,sBAAU,KAAK,OAAO;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAEA,aAAO,WAAW;AAAA,QAChB,OAAO,UAAU;AAAA,QACjB,OAAO,SAAS;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,QAC/E,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,MACrF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,OAAO,MAAM;AAC1B,YAAM,QAAQ,MAAM,UAAU,WAAW;AACzC,UAAI,CAAC,MAAO,QAAO,WAAW,EAAE,OAAO,OAAO,SAAS,4CAA4C,CAAC;AAEpG,UAAI,QAAQ;AACV,cAAM,OAAO,sBAAsB,OAAO,MAAM;AAChD,eAAO,WAAW,EAAE,QAAQ,GAAG,KAAK,CAAC;AAAA,MACvC;AAEA,UAAI,MAAM;AACR,cAAM,UAAU,MAAM,QAAQ,OAAO,OAAK,EAAE,OAAO,SAAS,IAAI,KAAK,EAAE,OAAO,SAAS,IAAI,CAAC;AAC5F,cAAM,QAAQ,MAAM,MAAM,OAAO,OAAK,EAAE,KAAK,SAAS,IAAI,CAAC;AAC3D,eAAO,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,MAC5C;AAEA,aAAO,WAAW,KAAK;AAAA,IACzB;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,QACrD,MAAM,EAAE,KAAK,CAAC,YAAY,SAAS,aAAa,QAAQ,SAAS,QAAQ,UAAU,YAAY,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,QACvJ,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,MAAM,KAAK,MAAM;AAC9B,YAAM,UAAU,MAAM,SAAS,WAAW,aAAa,cAAc,CAAC;AACtE,UAAI,CAAC,QAAS,QAAO,WAAW,EAAE,OAAO,OAAO,SAAS,8CAA8C,CAAC;AAExG,YAAM,QAAqB,KAAK,MAAM,OAAO;AAC7C,UAAI,UAAU,MAAM,QAAQ;AAAA,QAAO,OACjC,EAAE,KAAK,YAAY,EAAE,SAAS,KAAK,YAAY,CAAC;AAAA,MAClD;AAEA,UAAI,KAAM,WAAU,QAAQ,OAAO,OAAK,EAAE,SAAS,IAAI;AACvD,UAAI,KAAM,WAAU,QAAQ,OAAO,OAAK,EAAE,KAAK,SAAS,IAAI,CAAC;AAE7D,aAAO,WAAW;AAAA,QAChB,OAAO,EAAE,MAAM,MAAM,KAAK;AAAA,QAC1B,cAAc,QAAQ;AAAA,QACtB,SAAS,QAAQ,MAAM,GAAG,EAAE;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,QAC3E,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,EAAE,SAAS,+CAA+C;AAAA,MAC7G;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,YAAY,MAAM;AAC/B,YAAM,UAAU,MAAM,SAAS,WAAW,aAAa,eAAe,CAAC;AACvE,UAAI,CAAC,QAAS,QAAO,WAAW,EAAE,OAAO,OAAO,SAAS,+CAA+C,CAAC;AAEzG,YAAM,WAAyB,KAAK,MAAM,OAAO;AACjD,UAAI,WAAW,SAAS,SAAS,OAAO,OAAK,EAAE,YAAY,WAAW;AAEtE,UAAI,MAAM;AACR,mBAAW,SAAS;AAAA,UAAO,OACzB,EAAE,MAAM,SAAS,IAAI,KAAK,EAAE,MAAM,SAAS,IAAI;AAAA,QACjD;AAAA,MACF;AAEA,aAAO,WAAW;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,WAAW;AAAA,QACX,SAAS,SAAS,OAAO,OAAK,CAAC,EAAE,SAAS,EAAE,SAAS,IACjD,oFACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,2BAA2B;AAAA,MACzF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,UAAU,MAAM,SAAS,WAAW,aAAa,eAAe,CAAC;AACvE,UAAI,CAAC,QAAS,QAAO,WAAW,EAAE,OAAO,OAAO,SAAS,+CAA+C,CAAC;AAEzG,YAAM,WAAyB,KAAK,MAAM,OAAO;AAGjD,YAAM,UAAU,oBAAI,IAA8E;AAElG,iBAAW,KAAK,SAAS,UAAU;AACjC,gBAAQ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC;AAAA,MAClF;AAEA,iBAAW,KAAK,SAAS,UAAU;AACjC,mBAAW,KAAK,CAAC,EAAE,OAAO,EAAE,KAAK,GAAG;AAClC,gBAAM,QAAQ,QAAQ,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE;AAC3E,gBAAM;AACN,gBAAM,QAAQ,EAAE,WAAW;AAC3B,kBAAQ,IAAI,GAAG,KAAK;AAAA,QACtB;AAAA,MACF;AAEA,iBAAW,KAAK,SAAS,YAAY;AACnC,cAAM,QAAQ,QAAQ,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE;AAChF,cAAM,OAAO,EAAE;AACf,cAAM,QAAQ,EAAE,aAAa;AAC7B,gBAAQ,IAAI,EAAE,MAAM,KAAK;AAAA,MAC3B;AAEA,YAAM,SAAS,CAAC,GAAG,QAAQ,QAAQ,CAAC,EACjC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EACpC,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,MAAM,GAAG,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,GAAG,IAAI,IAAI,EAAE;AAErF,aAAO,WAAW;AAAA,QAChB,QAAQ,GAAG,SAAS,UAAU;AAAA,QAC9B,cAAc,SAAS;AAAA,QACvB,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AUpSA,SAAS,KAAAE,UAAS;;;ACDlB,SAAS,KAAAC,UAAS;AAEX,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,OAAO;AAAA,EAClB,UAAUA,GAAE,OAAO;AAAA,EACnB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC7B,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC3B,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAClC,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,OAAOA,GAAE,OAAO;AAAA,EAChB,SAASA,GAAE,OAAO;AAAA,EAClB,UAAUA,GAAE,OAAO;AAAA,EACnB,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5C,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAEM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO;AAAA,EACtB,SAASA,GAAE,OAAO;AAAA,EAClB,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAEM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAAA,EAChB,UAAUA,GAAE,OAAO,EAAE,QAAQ,OAAO;AACtC,CAAC;;;AC1BD,eAAsB,aAAa,aAA6C;AAC9E,SAAO,SAAS,WAAW,aAAa,aAAa,CAAC;AACxD;AAEA,eAAsB,WAAW,aAAqB,SAA+D;AACnH,QAAM,WAAW,MAAM,aAAa,WAAW,KAAK;AAGpD,QAAM,YAAY,IAAI,OAAO,OAAO,YAAY,QAAQ,IAAI,CAAC,IAAI,GAAG;AACpE,MAAI,UAAU,KAAK,QAAQ,GAAG;AAE5B,UAAMC,SAAQ,qBAAqB,OAAO;AAC1C,UAAM,eAAe,IAAI;AAAA,MACvB,OAAO,YAAY,QAAQ,IAAI,CAAC;AAAA,MAChC;AAAA,IACF;AACA,UAAM,UAAU,SAAS,QAAQ,cAAcA,SAAQ,MAAM;AAC7D,UAAM,UAAU,WAAW,aAAa,aAAa,GAAG,OAAO;AAC/D,WAAO;AAAA,EACT;AAGA,QAAM,QAAQ,qBAAqB,OAAO;AAC1C,QAAM,UAAU,SAAS,QAAQ,IAAI,SAAS,QAAQ;AACtD,QAAM,UAAU,WAAW,aAAa,aAAa,GAAG,OAAO;AAC/D,SAAO;AACT;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,IAAI,QAAQ,uBAAuB,MAAM;AAClD;;;AFxBA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,aAAY;AAErB,SAASC,YAAW,MAAe;AACjC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC,EAAE;AACrF;AAEO,SAAS,mBAAmB,QAAmB,aAA2B;AAE/E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAMC,GAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,MAClE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAClB,YAAM,QAAQ,MAAM,UAAU,WAAW;AACzC,UAAI,CAAC,OAAO;AACV,eAAOD,YAAW,EAAE,OAAO,4CAA4C,CAAC;AAAA,MAC1E;AAEA,YAAM,SAAS,MAAM,QAAQ,KAAK,OAAK,EAAE,SAAS,IAAI;AACtD,UAAI,CAAC,QAAQ;AACX,cAAM,YAAY,MAAM,QAAQ,IAAI,OAAK,EAAE,IAAI;AAC/C,eAAOA,YAAW,EAAE,OAAO,WAAW,IAAI,eAAe,UAAU,CAAC;AAAA,MACtE;AAGA,YAAM,cAAmD,CAAC;AAC1D,iBAAW,YAAY,OAAO,OAAO;AACnC,YAAI;AACF,gBAAM,UAAU,MAAMF,UAASC,MAAK,aAAa,QAAQ,GAAG,OAAO;AACnE,sBAAY,KAAK,EAAE,MAAM,UAAU,QAAQ,CAAC;AAAA,QAC9C,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,YAAM,SAAS,oBAAoB,MAAM,WAAW;AAEpD,aAAOC,YAAW;AAAA,QAChB,QAAQ;AAAA,QACR,OAAO,OAAO;AAAA,QACd;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,UAAU,qBAAqB,SAAS,gCAAgC;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,SAAS,MAAM;AACtB,YAAM,iBAAiC;AAAA,QACrC,GAAG;AAAA,MACL;AAGA,YAAM,kBAAkB,MAAM,SAAa,WAAW,aAAa,eAAe,CAAC;AACnF,UAAI,iBAAiB;AACnB,cAAM,WAAyB,KAAK,MAAM,eAAe;AACzD,cAAM,UAAU,SAAS,UAAU;AAAA,UAAK,CAAC,MACvC,EAAE,KAAK,SAAS,IAAI,SAAS,IAAI,GAAG,KAAK,EAAE,KAAK,SAAS,GAAG,SAAS,IAAI,GAAG;AAAA,QAC9E;AACA,cAAM,YAAY,SAAS,UAAU;AAAA,UAAO,CAAC,MAC3C,EAAE,MAAM,SAAS,IAAI,SAAS,IAAI,GAAG,KAAK,EAAE,MAAM,SAAS,IAAI,SAAS,IAAI,GAAG;AAAA,QACjF,KAAK,CAAC;AACN,cAAM,OAAO,SAAS,YAAY;AAAA,UAAO,CAAC,MACxC,EAAE,KAAK,SAAS,IAAI,SAAS,IAAI,GAAG;AAAA,QACtC,KAAK,CAAC;AAEN,YAAI,WAAW,UAAU,SAAS,KAAK,KAAK,SAAS,GAAG;AACtD,yBAAe,kBAAkB;AAAA,YAC/B,OAAO,UAAU,GAAG,QAAQ,OAAO,aAAa,QAAQ,SAAS,MAAM;AAAA,YACvE,aAAa,UAAU,IAAI,CAAC,MAAsB;AAChD,oBAAM,QAAQ,EAAE,MAAM,SAAS,IAAI,SAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE;AACnE,qBAAO,GAAG,KAAK,KAAK,EAAE,SAAS;AAAA,YACjC,CAAC;AAAA,YACD,WAAW,SAAS,aAAa;AAAA,YACjC,YAAY,KAAK,QAAQ,CAAC,MAAiB,EAAE,OAAO;AAAA,YACpD,aAAa,SAAS,eAAe;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAEA,YAAM,eAAe,aAAa,cAAc;AAEhD,aAAOA,YAAW;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ,SAAS;AAAA,QACjB,MAAM,uBAAuB,SAAS,IAAI;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,OAAOC,GAAE,OAAO,EAAE,SAAS,sDAAsD;AAAA,QACjF,SAASA,GAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,QAClE,UAAUA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,QAChD,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,oCAAoC;AAAA,QAC3F,cAAcA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,wCAAwC;AAAA,MACjG;AAAA,IACF;AAAA,IACA,OAAO,EAAE,OAAO,SAAS,UAAU,cAAc,aAAa,MAAM;AAClE,YAAM,SAAS,eAAe,EAAE,OAAO,SAAS,UAAU,cAAc,aAAa,CAAC;AACtF,YAAM,cAAc,aAAa,MAAM;AAEvC,aAAOD,YAAW;AAAA,QAChB,UAAU;AAAA,QACV,IAAI,OAAO;AAAA,QACX,MAAM,yBAAyB,OAAO,EAAE;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAMC,GAAE,OAAO,EAAE,SAAS,qDAAqD;AAAA,QAC/E,aAAaA,GAAE,OAAO,EAAE,SAAS,wCAAwC;AAAA,QACzE,SAASA,GAAE,OAAO,EAAE,SAAS,kCAAkC;AAAA,QAC/D,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,kCAAkC;AAAA,MACpF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,aAAa,SAAS,MAAM,MAAM;AAC/C,YAAM,SAAS,MAAM,WAAW,aAAa,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC;AAElF,aAAOD,YAAW;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAGA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,QACX,MAAMC,GAAE,OAAO,EAAE,SAAS,gEAAgE;AAAA,QAC1F,OAAOA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,QACtD,UAAUA,GAAE,OAAO,EAAE,QAAQ,OAAO,EAAE,SAAS,mCAAmC;AAAA,MACpF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,OAAO,SAAS,MAAM;AACnC,YAAM,MAAM,WAAW,aAAa,UAAU;AAC9C,YAAM,UAAU,GAAG;AAEnB,YAAM,QAAQ;AAAA,QACZ,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,YAAM,eAAe,WAAW,aAAa,YAAY,UAAU;AACnE,YAAM,WAAW,MAAM,SAAa,YAAY;AAChD,YAAM,UAAU,WAAW,KAAK,MAAM,QAAQ,IAAI,CAAC;AACnD,cAAQ,KAAK,KAAK;AAClB,YAAM,UAAU,cAAc,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAE9D,aAAOD,YAAW;AAAA,QAChB,UAAU;AAAA,QACV,eAAe,QAAQ;AAAA,QACvB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AX3KO,SAAS,aAAa,aAAgC;AAC3D,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf,CAAC;AAED,oBAAkB,QAAQ,WAAW;AACrC,qBAAmB,QAAQ,WAAW;AAEtC,SAAO;AACT;AAEA,eAAsB,YAAY,aAAoC;AACpE,QAAM,SAAS,aAAa,WAAW;AACvC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,UAAQ,MAAM,iDAAiD,WAAW,GAAG;AAC/E;AAGA,IAAI,YAAY,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,IAAI;AACnD,QAAM,OAAO,QAAQ,IAAI;AACzB,cAAY,IAAI,EAAE,MAAM,CAAC,QAAQ;AAC/B,YAAQ,MAAM,gBAAgB,GAAG;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACH;","names":["createWriteStream","dirname","readdir","join","existsSync","z","z","entry","readFile","join","textResult","z"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp/server.ts","../src/mcp/tools/read.ts","../src/utils/files.ts","../src/utils/yaml.ts","../src/core/manifest.ts","../src/core/graph.ts","../src/utils/markdown.ts","../src/core/modules.ts","../src/core/sessions.ts","../src/core/decisions.ts","../src/core/search.ts","../src/mcp/tools/write.ts","../src/types/schema.ts","../src/core/patterns.ts"],"sourcesContent":["/**\n * CodeCortex MCP Server\n *\n * Serves codebase knowledge to AI agents via Model Context Protocol.\n * 14 tools: 9 read (knowledge retrieval) + 5 write (knowledge creation).\n *\n * Usage:\n * codecortex serve\n *\n * Config for Claude Code / Claude Desktop:\n * {\n * \"mcpServers\": {\n * \"codecortex\": {\n * \"command\": \"codecortex\",\n * \"args\": [\"serve\"],\n * \"cwd\": \"/path/to/your-project\"\n * }\n * }\n * }\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { registerReadTools } from './tools/read.js'\nimport { registerWriteTools } from './tools/write.js'\n\nexport function createServer(projectRoot: string): McpServer {\n const server = new McpServer({\n name: 'codecortex',\n version: '0.4.3',\n description: 'Persistent codebase knowledge layer. Pre-digested architecture, symbols, coupling, and patterns served to AI agents.',\n })\n\n registerReadTools(server, projectRoot)\n registerWriteTools(server, projectRoot)\n\n return server\n}\n\nexport async function startServer(projectRoot: string): Promise<void> {\n const server = createServer(projectRoot)\n const transport = new StdioServerTransport()\n await server.connect(transport)\n console.error(`CodeCortex MCP server running on stdio (root: ${projectRoot})`)\n}\n\n// Direct execution\nif (import.meta.url === `file://${process.argv[1]}`) {\n const root = process.cwd()\n startServer(root).catch((err) => {\n console.error('Fatal error:', err)\n process.exit(1)\n })\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport { readFile, cortexPath } from '../../utils/files.js'\nimport { readManifest } from '../../core/manifest.js'\nimport { readGraph, getModuleDependencies, getMostImportedFiles } from '../../core/graph.js'\nimport { readModuleDoc, listModuleDocs } from '../../core/modules.js'\nimport { listSessions, readSession, getLatestSession } from '../../core/sessions.js'\nimport { listDecisions, readDecision } from '../../core/decisions.js'\nimport { searchKnowledge } from '../../core/search.js'\nimport type { TemporalData, SymbolIndex } from '../../types/index.js'\n\nfunction textResult(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] }\n}\n\nexport function registerReadTools(server: McpServer, projectRoot: string): void {\n // --- Tool 1: get_project_overview ---\n server.registerTool(\n 'get_project_overview',\n {\n description: 'Get the full project overview: constitution (architecture, risk map, available knowledge), overview narrative, and dependency graph summary. This is the starting point for understanding any codebase. Always call this first.',\n inputSchema: {},\n },\n async () => {\n const constitution = await readFile(cortexPath(projectRoot, 'constitution.md'))\n const overview = await readFile(cortexPath(projectRoot, 'overview.md'))\n const manifest = await readManifest(projectRoot)\n\n const graph = await readGraph(projectRoot)\n let graphSummary = null\n if (graph) {\n graphSummary = {\n modules: graph.modules.length,\n imports: graph.imports.length,\n entryPoints: graph.entryPoints,\n mostImported: getMostImportedFiles(graph, 5),\n }\n }\n\n return textResult({\n constitution,\n overview,\n manifest,\n graphSummary,\n })\n }\n )\n\n // --- Tool 2: get_module_context ---\n server.registerTool(\n 'get_module_context',\n {\n description: 'Get deep context for a specific module: purpose, data flow, public API, gotchas, dependencies, and temporal signals (churn, coupling, bug history). Use after get_project_overview when you need to work on a specific module.',\n inputSchema: {\n name: z.string().describe('Module name (e.g., \"scoring\", \"api\", \"indexer\")'),\n },\n },\n async ({ name }) => {\n const doc = await readModuleDoc(projectRoot, name)\n if (!doc) {\n const available = await listModuleDocs(projectRoot)\n return textResult({ found: false, name, available, message: `Module \"${name}\" not found. Available modules: ${available.join(', ')}` })\n }\n\n // Get graph info for this module\n const graph = await readGraph(projectRoot)\n let deps = null\n if (graph) {\n deps = getModuleDependencies(graph, name)\n }\n\n return textResult({ found: true, name, doc, dependencies: deps })\n }\n )\n\n // --- Tool 3: get_session_briefing ---\n server.registerTool(\n 'get_session_briefing',\n {\n description: 'Get a briefing of what changed since the last session. Shows files changed, modules affected, and decisions recorded. Use at the start of a new session to catch up.',\n inputSchema: {},\n },\n async () => {\n const latestId = await getLatestSession(projectRoot)\n if (!latestId) {\n return textResult({ hasSession: false, message: 'No previous sessions recorded.' })\n }\n\n const session = await readSession(projectRoot, latestId)\n const allSessions = await listSessions(projectRoot)\n\n return textResult({\n hasSession: true,\n latest: session,\n totalSessions: allSessions.length,\n recentSessionIds: allSessions.slice(0, 5),\n })\n }\n )\n\n // --- Tool 4: search_knowledge ---\n server.registerTool(\n 'search_knowledge',\n {\n description: 'Search across all CodeCortex knowledge files (modules, decisions, patterns, sessions, constitution) for a keyword or phrase. Returns matching lines with context.',\n inputSchema: {\n query: z.string().describe('Search term or phrase'),\n },\n },\n async ({ query }) => {\n const results = await searchKnowledge(projectRoot, query)\n return textResult({\n query,\n totalResults: results.length,\n results: results.slice(0, 20),\n })\n }\n )\n\n // --- Tool 5: get_decision_history ---\n server.registerTool(\n 'get_decision_history',\n {\n description: 'Get architectural decision records. Shows WHY the codebase is built the way it is. Filter by topic keyword.',\n inputSchema: {\n topic: z.string().optional().describe('Optional keyword to filter decisions'),\n },\n },\n async ({ topic }) => {\n const ids = await listDecisions(projectRoot)\n const decisions: string[] = []\n\n for (const id of ids) {\n const content = await readDecision(projectRoot, id)\n if (content) {\n if (!topic || content.toLowerCase().includes(topic.toLowerCase())) {\n decisions.push(content)\n }\n }\n }\n\n return textResult({\n total: decisions.length,\n topic: topic || 'all',\n decisions,\n })\n }\n )\n\n // --- Tool 6: get_dependency_graph ---\n server.registerTool(\n 'get_dependency_graph',\n {\n description: 'Get the import/export dependency graph. Shows which files import which, external dependencies, and entry points. Optionally filter to a specific file or module.',\n inputSchema: {\n file: z.string().optional().describe('Filter to edges involving this file path'),\n module: z.string().optional().describe('Filter to edges involving this module name'),\n },\n },\n async ({ file, module }) => {\n const graph = await readGraph(projectRoot)\n if (!graph) return textResult({ found: false, message: 'No graph data. Run codecortex init first.' })\n\n if (module) {\n const deps = getModuleDependencies(graph, module)\n return textResult({ module, ...deps })\n }\n\n if (file) {\n const imports = graph.imports.filter(e => e.source.includes(file) || e.target.includes(file))\n const calls = graph.calls.filter(e => e.file.includes(file))\n return textResult({ file, imports, calls })\n }\n\n return textResult(graph)\n }\n )\n\n // --- Tool 7: lookup_symbol ---\n server.registerTool(\n 'lookup_symbol',\n {\n description: 'Look up a symbol (function, class, type, interface, const) by name. Returns file path, line numbers, signature, and whether it\\'s exported. Use to find where something is defined.',\n inputSchema: {\n name: z.string().describe('Symbol name to search for'),\n kind: z.enum(['function', 'class', 'interface', 'type', 'const', 'enum', 'method', 'property', 'variable']).optional().describe('Filter by symbol kind'),\n file: z.string().optional().describe('Filter by file path (partial match)'),\n },\n },\n async ({ name, kind, file }) => {\n const content = await readFile(cortexPath(projectRoot, 'symbols.json'))\n if (!content) return textResult({ found: false, message: 'No symbol index. Run codecortex init first.' })\n\n const index: SymbolIndex = JSON.parse(content)\n let matches = index.symbols.filter(s =>\n s.name.toLowerCase().includes(name.toLowerCase())\n )\n\n if (kind) matches = matches.filter(s => s.kind === kind)\n if (file) matches = matches.filter(s => s.file.includes(file))\n\n return textResult({\n query: { name, kind, file },\n totalMatches: matches.length,\n symbols: matches.slice(0, 30),\n })\n }\n )\n\n // --- Tool 8: get_change_coupling ---\n server.registerTool(\n 'get_change_coupling',\n {\n description: 'CRITICAL: Call this BEFORE editing any file. Shows files that historically change together. If file A is coupled with file B, editing A without B will likely cause a bug. Hidden couplings (no import between files) are especially dangerous.',\n inputSchema: {\n file: z.string().optional().describe('Show coupling for this specific file'),\n minStrength: z.number().min(0).max(1).default(0.3).describe('Minimum coupling strength (0-1). Default 0.3.'),\n },\n },\n async ({ file, minStrength }) => {\n const content = await readFile(cortexPath(projectRoot, 'temporal.json'))\n if (!content) return textResult({ found: false, message: 'No temporal data. Run codecortex init first.' })\n\n const temporal: TemporalData = JSON.parse(content)\n let coupling = temporal.coupling.filter(c => c.strength >= minStrength)\n\n if (file) {\n coupling = coupling.filter(c =>\n c.fileA.includes(file) || c.fileB.includes(file)\n )\n }\n\n return textResult({\n file: file || 'all',\n minStrength,\n couplings: coupling,\n warning: coupling.filter(c => !c.hasImport).length > 0\n ? 'HIDDEN DEPENDENCIES FOUND — some coupled files have NO import between them'\n : null,\n })\n }\n )\n\n // --- Tool 9: get_hotspots ---\n server.registerTool(\n 'get_hotspots',\n {\n description: 'Get files ranked by risk: change frequency (churn), coupling count, and bug history. Volatile files with many couplings need extra care when editing.',\n inputSchema: {\n limit: z.number().int().min(1).max(50).default(10).describe('Number of files to return'),\n },\n },\n async ({ limit }) => {\n const content = await readFile(cortexPath(projectRoot, 'temporal.json'))\n if (!content) return textResult({ found: false, message: 'No temporal data. Run codecortex init first.' })\n\n const temporal: TemporalData = JSON.parse(content)\n\n // Calculate risk score: churn + coupling count + bug count\n const riskMap = new Map<string, { churn: number; couplings: number; bugs: number; risk: number }>()\n\n for (const h of temporal.hotspots) {\n riskMap.set(h.file, { churn: h.changes, couplings: 0, bugs: 0, risk: h.changes })\n }\n\n for (const c of temporal.coupling) {\n for (const f of [c.fileA, c.fileB]) {\n const entry = riskMap.get(f) || { churn: 0, couplings: 0, bugs: 0, risk: 0 }\n entry.couplings++\n entry.risk += c.strength * 2\n riskMap.set(f, entry)\n }\n }\n\n for (const b of temporal.bugHistory) {\n const entry = riskMap.get(b.file) || { churn: 0, couplings: 0, bugs: 0, risk: 0 }\n entry.bugs = b.fixCommits\n entry.risk += b.fixCommits * 3\n riskMap.set(b.file, entry)\n }\n\n const ranked = [...riskMap.entries()]\n .sort((a, b) => b[1].risk - a[1].risk)\n .slice(0, limit)\n .map(([file, data]) => ({ file, ...data, risk: Math.round(data.risk * 100) / 100 }))\n\n return textResult({\n period: `${temporal.periodDays} days`,\n totalCommits: temporal.totalCommits,\n hotspots: ranked,\n })\n }\n )\n}\n","import { readFile as fsRead, writeFile as fsWrite, mkdir, readdir, stat } from 'node:fs/promises'\nimport { existsSync, createWriteStream } from 'node:fs'\nimport { join, dirname } from 'node:path'\n\nexport async function readFile(path: string): Promise<string | null> {\n try {\n return await fsRead(path, 'utf-8')\n } catch {\n return null\n }\n}\n\nexport async function writeFile(path: string, content: string): Promise<void> {\n await ensureDir(dirname(path))\n await fsWrite(path, content, 'utf-8')\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true })\n }\n}\n\nexport async function listFiles(dir: string, extension?: string): Promise<string[]> {\n if (!existsSync(dir)) return []\n const entries = await readdir(dir, { withFileTypes: true })\n const files: string[] = []\n for (const entry of entries) {\n if (entry.isFile()) {\n if (!extension || entry.name.endsWith(extension)) {\n files.push(join(dir, entry.name))\n }\n }\n }\n return files\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nexport function cortexDir(projectRoot: string): string {\n return join(projectRoot, '.codecortex')\n}\n\nexport function cortexPath(projectRoot: string, ...segments: string[]): string {\n return join(projectRoot, '.codecortex', ...segments)\n}\n\nexport async function countLines(path: string): Promise<number> {\n const content = await readFile(path)\n if (!content) return 0\n return content.split('\\n').length\n}\n\n/** Stream-write a large array-based JSON object to avoid V8 string length limits. */\nexport async function writeJsonStream<T extends object>(path: string, obj: T, arrayKey: string & keyof T): Promise<void> {\n await ensureDir(dirname(path))\n const arr = obj[arrayKey] as unknown[]\n const stream = createWriteStream(path)\n stream.setMaxListeners(0)\n\n // Single error handler for the entire operation\n let streamError: Error | null = null\n stream.on('error', (err) => { streamError = err })\n\n function waitDrain(): Promise<void> {\n return new Promise((resolve) => stream.once('drain', resolve))\n }\n\n // Write non-array fields as header\n const header: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(obj)) {\n if (k !== arrayKey) header[k] = v\n }\n const headerJson = JSON.stringify(header)\n stream.write(headerJson.slice(0, -1) + `,\"${arrayKey}\":[`)\n\n // Write array elements in batches to reduce await overhead\n const BATCH_SIZE = 1000\n for (let i = 0; i < arr.length; i += BATCH_SIZE) {\n if (streamError) throw streamError\n const end = Math.min(i + BATCH_SIZE, arr.length)\n const chunks: string[] = []\n for (let j = i; j < end; j++) {\n chunks.push((j > 0 ? ',' : '') + JSON.stringify(arr[j]))\n }\n if (!stream.write(chunks.join(''))) {\n await waitDrain()\n }\n }\n\n stream.write(']}')\n\n return new Promise((resolve, reject) => {\n if (streamError) { reject(streamError); return }\n stream.on('finish', resolve)\n stream.on('error', reject)\n stream.end()\n })\n}\n\nexport async function fileSize(path: string): Promise<number> {\n try {\n const s = await stat(path)\n return s.size\n } catch {\n return 0\n }\n}\n","import { parse, stringify } from 'yaml'\n\nexport function parseYaml<T = unknown>(content: string): T {\n return parse(content) as T\n}\n\nexport function stringifyYaml(data: unknown): string {\n return stringify(data, { lineWidth: 120 })\n}\n","import type { CortexManifest } from '../types/index.js'\nimport { readFile, writeFile, cortexPath } from '../utils/files.js'\nimport { parseYaml, stringifyYaml } from '../utils/yaml.js'\n\nexport async function readManifest(projectRoot: string): Promise<CortexManifest | null> {\n const content = await readFile(cortexPath(projectRoot, 'cortex.yaml'))\n if (!content) return null\n return parseYaml<CortexManifest>(content)\n}\n\nexport async function writeManifest(projectRoot: string, manifest: CortexManifest): Promise<void> {\n const content = stringifyYaml(manifest)\n await writeFile(cortexPath(projectRoot, 'cortex.yaml'), content)\n}\n\nexport function createManifest(opts: {\n project: string\n root: string\n languages: string[]\n totalFiles: number\n totalSymbols: number\n totalModules: number\n}): CortexManifest {\n const now = new Date().toISOString()\n return {\n version: '1.0.0',\n project: opts.project,\n root: opts.root,\n generated: now,\n lastUpdated: now,\n languages: opts.languages,\n totalFiles: opts.totalFiles,\n totalSymbols: opts.totalSymbols,\n totalModules: opts.totalModules,\n tiers: {\n hot: ['cortex.yaml', 'constitution.md', 'overview.md', 'graph.json', 'symbols.json', 'temporal.json'],\n warm: ['modules/'],\n cold: ['decisions/', 'sessions/', 'patterns.md'],\n },\n }\n}\n\nexport async function updateManifest(\n projectRoot: string,\n updates: Partial<Pick<CortexManifest, 'totalFiles' | 'totalSymbols' | 'totalModules' | 'languages'>>\n): Promise<CortexManifest | null> {\n const manifest = await readManifest(projectRoot)\n if (!manifest) return null\n\n const updated: CortexManifest = {\n ...manifest,\n ...updates,\n lastUpdated: new Date().toISOString(),\n }\n\n await writeManifest(projectRoot, updated)\n return updated\n}\n","import type { DependencyGraph, ImportEdge, CallEdge, ModuleNode } from '../types/index.js'\nimport { readFile, writeFile, ensureDir, cortexPath } from '../utils/files.js'\nimport { createWriteStream } from 'node:fs'\nimport { dirname } from 'node:path'\n\nexport async function readGraph(projectRoot: string): Promise<DependencyGraph | null> {\n const content = await readFile(cortexPath(projectRoot, 'graph.json'))\n if (!content) return null\n return JSON.parse(content) as DependencyGraph\n}\n\nexport async function writeGraph(projectRoot: string, graph: DependencyGraph): Promise<void> {\n const path = cortexPath(projectRoot, 'graph.json')\n await ensureDir(dirname(path))\n const stream = createWriteStream(path)\n stream.setMaxListeners(0)\n\n function waitDrain(): Promise<void> {\n return new Promise((resolve) => stream.once('drain', resolve))\n }\n\n async function writeArray(arr: unknown[]): Promise<void> {\n stream.write('[')\n const BATCH = 1000\n for (let i = 0; i < arr.length; i += BATCH) {\n const end = Math.min(i + BATCH, arr.length)\n const chunks: string[] = []\n for (let j = i; j < end; j++) {\n chunks.push((j > 0 ? ',' : '') + JSON.stringify(arr[j]))\n }\n if (!stream.write(chunks.join(''))) await waitDrain()\n }\n stream.write(']')\n }\n\n // Write scalar fields\n stream.write(`{\"generated\":${JSON.stringify(graph.generated)},\"modules\":`)\n await writeArray(graph.modules)\n stream.write(',\"imports\":')\n await writeArray(graph.imports)\n stream.write(',\"calls\":')\n await writeArray(graph.calls)\n stream.write(`,\"entryPoints\":${JSON.stringify(graph.entryPoints)}`)\n stream.write(`,\"externalDeps\":${JSON.stringify(graph.externalDeps)}`)\n stream.write('}')\n\n return new Promise((resolve, reject) => {\n stream.on('finish', resolve)\n stream.on('error', reject)\n stream.end()\n })\n}\n\nexport function buildGraph(opts: {\n modules: ModuleNode[]\n imports: ImportEdge[]\n calls: CallEdge[]\n entryPoints: string[]\n externalDeps: Record<string, string[]>\n}): DependencyGraph {\n return {\n generated: new Date().toISOString(),\n modules: opts.modules,\n imports: opts.imports,\n calls: opts.calls,\n entryPoints: opts.entryPoints,\n externalDeps: opts.externalDeps,\n }\n}\n\nexport function getModuleDependencies(graph: DependencyGraph, moduleName: string): {\n imports: ImportEdge[]\n importedBy: ImportEdge[]\n calls: CallEdge[]\n} {\n const moduleFiles = new Set(\n graph.modules.find(m => m.name === moduleName)?.files || []\n )\n\n return {\n imports: graph.imports.filter(e => moduleFiles.has(e.source)),\n importedBy: graph.imports.filter(e => moduleFiles.has(e.target)),\n calls: graph.calls.filter(e => moduleFiles.has(e.file)),\n }\n}\n\nexport function getFileImporters(graph: DependencyGraph, file: string): string[] {\n return graph.imports\n .filter(e => e.target.includes(file))\n .map(e => e.source)\n}\n\nexport function getMostImportedFiles(graph: DependencyGraph, limit: number = 10): { file: string; importCount: number }[] {\n const counts = new Map<string, number>()\n for (const edge of graph.imports) {\n counts.set(edge.target, (counts.get(edge.target) || 0) + 1)\n }\n\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, limit)\n .map(([file, importCount]) => ({ file, importCount }))\n}\n\nexport function enrichCouplingWithImports(\n graph: DependencyGraph,\n coupling: { fileA: string; fileB: string; hasImport: boolean }[]\n): void {\n const importPairs = new Set<string>()\n for (const edge of graph.imports) {\n importPairs.add([edge.source, edge.target].sort().join('|'))\n }\n\n for (const pair of coupling) {\n const key = [pair.fileA, pair.fileB].sort().join('|')\n pair.hasImport = importPairs.has(key)\n }\n}\n","import type { ModuleAnalysis, DecisionRecord, CodingPattern } from '../types/index.js'\n\nexport function generateModuleDoc(analysis: ModuleAnalysis): string {\n const lines: string[] = [\n `# Module: ${analysis.name}`,\n '',\n `## Purpose`,\n analysis.purpose,\n '',\n `## Data Flow`,\n analysis.dataFlow,\n '',\n `## Public API`,\n ...analysis.publicApi.map(api => `- \\`${api}\\``),\n '',\n `## Dependencies`,\n ...analysis.dependencies.map(dep => `- ${dep}`),\n ]\n\n if (analysis.gotchas.length > 0) {\n lines.push('', `## Gotchas`, ...analysis.gotchas.map(g => `- ${g}`))\n }\n\n if (analysis.temporalSignals) {\n const t = analysis.temporalSignals\n lines.push(\n '',\n `## Temporal Signals`,\n `- **Churn:** ${t.churn}`,\n `- **Coupled with:** ${t.coupledWith.join(', ') || 'none'}`,\n `- **Stability:** ${t.stability}`,\n )\n if (t.bugHistory.length > 0) {\n lines.push(`- **Bug history:** ${t.bugHistory.join('; ')}`)\n }\n lines.push(`- **Last changed:** ${t.lastChanged}`)\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function generateDecisionDoc(decision: DecisionRecord): string {\n const lines: string[] = [\n `# Decision: ${decision.title}`,\n '',\n `**Date:** ${decision.date}`,\n `**Status:** ${decision.status}`,\n '',\n `## Context`,\n decision.context,\n '',\n `## Decision`,\n decision.decision,\n ]\n\n if (decision.alternatives.length > 0) {\n lines.push('', `## Alternatives Considered`, ...decision.alternatives.map(a => `- ${a}`))\n }\n\n if (decision.consequences.length > 0) {\n lines.push('', `## Consequences`, ...decision.consequences.map(c => `- ${c}`))\n }\n\n return lines.join('\\n') + '\\n'\n}\n\nexport function generatePatternEntry(pattern: CodingPattern): string {\n const lines: string[] = [\n `### ${pattern.name}`,\n '',\n pattern.description,\n '',\n '```',\n pattern.example,\n '```',\n ]\n\n if (pattern.files.length > 0) {\n lines.push('', `Files: ${pattern.files.map(f => `\\`${f}\\``).join(', ')}`)\n }\n\n return lines.join('\\n')\n}\n","import type { ModuleAnalysis } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\nimport { generateModuleDoc } from '../utils/markdown.js'\n\nexport async function readModuleDoc(projectRoot: string, moduleName: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'modules', `${moduleName}.md`))\n}\n\nexport async function writeModuleDoc(projectRoot: string, analysis: ModuleAnalysis): Promise<void> {\n const dir = cortexPath(projectRoot, 'modules')\n await ensureDir(dir)\n const content = generateModuleDoc(analysis)\n await writeFile(cortexPath(projectRoot, 'modules', `${analysis.name}.md`), content)\n}\n\nexport async function listModuleDocs(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'modules')\n const files = await listFiles(dir, '.md')\n return files.map(f => {\n const name = f.split('/').pop() || ''\n return name.replace('.md', '')\n })\n}\n\nexport function buildAnalysisPrompt(moduleName: string, sourceFiles: { path: string; content: string }[]): string {\n const fileList = sourceFiles.map(f => `### ${f.path}\\n\\`\\`\\`\\n${f.content}\\n\\`\\`\\``).join('\\n\\n')\n\n return `Analyze the \"${moduleName}\" module. Return a JSON object with this exact structure:\n\n{\n \"name\": \"${moduleName}\",\n \"purpose\": \"One paragraph describing what this module does and why it exists\",\n \"dataFlow\": \"How data flows through this module — inputs, transformations, outputs\",\n \"publicApi\": [\"list\", \"of\", \"exported\", \"functions\", \"and\", \"types\"],\n \"gotchas\": [\"Things that are surprising or could cause bugs\"],\n \"dependencies\": [\"What this module depends on and why\"]\n}\n\nSource files:\n\n${fileList}`\n}\n","import type { SessionLog } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\n\nexport async function writeSession(projectRoot: string, session: SessionLog): Promise<void> {\n const dir = cortexPath(projectRoot, 'sessions')\n await ensureDir(dir)\n\n const lines = [\n `# Session: ${session.date}`,\n '',\n `**ID:** ${session.id}`,\n session.previousSession ? `**Previous:** ${session.previousSession}` : null,\n '',\n `## Summary`,\n session.summary,\n '',\n `## Files Changed`,\n ...session.filesChanged.map(f => `- \\`${f}\\``),\n '',\n `## Modules Affected`,\n ...session.modulesAffected.map(m => `- ${m}`),\n ].filter(Boolean) as string[]\n\n if (session.decisionsRecorded.length > 0) {\n lines.push('', `## Decisions Recorded`, ...session.decisionsRecorded.map(d => `- ${d}`))\n }\n\n await writeFile(cortexPath(projectRoot, 'sessions', `${session.id}.md`), lines.join('\\n') + '\\n')\n}\n\nexport async function readSession(projectRoot: string, id: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'sessions', `${id}.md`))\n}\n\nexport async function listSessions(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'sessions')\n const files = await listFiles(dir, '.md')\n return files\n .map(f => (f.split('/').pop() || '').replace('.md', ''))\n .sort()\n .reverse()\n}\n\nexport async function getLatestSession(projectRoot: string): Promise<string | null> {\n const sessions = await listSessions(projectRoot)\n return sessions[0] ?? null\n}\n\nexport function createSession(opts: {\n filesChanged: string[]\n modulesAffected: string[]\n decisionsRecorded?: string[]\n summary: string\n previousSession?: string\n}): SessionLog {\n const now = new Date()\n const id = now.toISOString().replace(/[:.]/g, '-').slice(0, 19)\n\n return {\n id,\n date: now.toISOString(),\n previousSession: opts.previousSession,\n filesChanged: opts.filesChanged,\n modulesAffected: opts.modulesAffected,\n decisionsRecorded: opts.decisionsRecorded || [],\n summary: opts.summary,\n }\n}\n","import type { DecisionRecord } from '../types/index.js'\nimport { readFile, writeFile, listFiles, cortexPath, ensureDir } from '../utils/files.js'\nimport { generateDecisionDoc } from '../utils/markdown.js'\n\nexport async function readDecision(projectRoot: string, id: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'decisions', `${id}.md`))\n}\n\nexport async function writeDecision(projectRoot: string, decision: DecisionRecord): Promise<void> {\n const dir = cortexPath(projectRoot, 'decisions')\n await ensureDir(dir)\n const content = generateDecisionDoc(decision)\n await writeFile(cortexPath(projectRoot, 'decisions', `${decision.id}.md`), content)\n}\n\nexport async function listDecisions(projectRoot: string): Promise<string[]> {\n const dir = cortexPath(projectRoot, 'decisions')\n const files = await listFiles(dir, '.md')\n return files.map(f => {\n const name = f.split('/').pop() || ''\n return name.replace('.md', '')\n })\n}\n\nexport function createDecision(input: {\n title: string\n context: string\n decision: string\n alternatives?: string[]\n consequences?: string[]\n}): DecisionRecord {\n const id = input.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 60)\n\n return {\n id,\n date: new Date().toISOString().split('T')[0] ?? '',\n title: input.title,\n context: input.context,\n decision: input.decision,\n alternatives: input.alternatives || [],\n consequences: input.consequences || [],\n status: 'accepted',\n }\n}\n","import { readFile, listFiles, cortexPath } from '../utils/files.js'\nimport { readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { existsSync } from 'node:fs'\n\nexport interface SearchResult {\n file: string\n line: number\n content: string\n context: string\n}\n\nexport async function searchKnowledge(projectRoot: string, query: string): Promise<SearchResult[]> {\n const cortexRoot = cortexPath(projectRoot)\n if (!existsSync(cortexRoot)) return []\n\n const results: SearchResult[] = []\n const queryLower = query.toLowerCase()\n\n const allFiles = await getAllCortexFiles(cortexRoot)\n\n for (const filePath of allFiles) {\n const content = await readFile(filePath)\n if (!content) continue\n\n const lines = content.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (line?.toLowerCase().includes(queryLower)) {\n // Get surrounding context (2 lines before and after)\n const start = Math.max(0, i - 2)\n const end = Math.min(lines.length - 1, i + 2)\n const context = lines.slice(start, end + 1).join('\\n')\n\n results.push({\n file: filePath.replace(cortexRoot + '/', ''),\n line: i + 1,\n content: line.trim(),\n context,\n })\n }\n }\n }\n\n return results\n}\n\nasync function getAllCortexFiles(dir: string): Promise<string[]> {\n const files: string[] = []\n\n if (!existsSync(dir)) return files\n\n const entries = await readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n const subFiles = await getAllCortexFiles(fullPath)\n files.push(...subFiles)\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.json') || entry.name.endsWith('.yaml'))) {\n files.push(fullPath)\n }\n }\n\n return files\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport { readFile as readFileUtil, cortexPath } from '../../utils/files.js'\nimport { ModuleAnalysisSchema, DecisionInputSchema, PatternInputSchema, FeedbackInputSchema } from '../../types/schema.js'\nimport { writeModuleDoc, buildAnalysisPrompt, listModuleDocs } from '../../core/modules.js'\nimport { writeDecision, createDecision } from '../../core/decisions.js'\nimport { addPattern } from '../../core/patterns.js'\nimport { writeFile, ensureDir } from '../../utils/files.js'\nimport { readGraph } from '../../core/graph.js'\nimport type { ModuleAnalysis, TemporalData, Hotspot, ChangeCoupling, BugRecord } from '../../types/index.js'\nimport { readFile } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nfunction textResult(data: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] }\n}\n\nexport function registerWriteTools(server: McpServer, projectRoot: string): void {\n // --- Tool 10: analyze_module ---\n server.registerTool(\n 'analyze_module',\n {\n description: 'Prepares a module for analysis. Returns the source files and a structured prompt. You should read the source files, analyze them, then call save_module_analysis with the result.',\n inputSchema: {\n name: z.string().describe('Module name (e.g., \"scoring\", \"api\")'),\n },\n },\n async ({ name }) => {\n const graph = await readGraph(projectRoot)\n if (!graph) {\n return textResult({ error: 'No graph data. Run codecortex init first.' })\n }\n\n const module = graph.modules.find(m => m.name === name)\n if (!module) {\n const available = graph.modules.map(m => m.name)\n return textResult({ error: `Module \"${name}\" not found`, available })\n }\n\n // Read source files for this module\n const sourceFiles: { path: string; content: string }[] = []\n for (const filePath of module.files) {\n try {\n const content = await readFile(join(projectRoot, filePath), 'utf-8')\n sourceFiles.push({ path: filePath, content })\n } catch {\n // Skip files that can't be read\n }\n }\n\n const prompt = buildAnalysisPrompt(name, sourceFiles)\n\n return textResult({\n module: name,\n files: module.files,\n prompt,\n instruction: 'Analyze the source files above and call save_module_analysis with the JSON result.',\n })\n }\n )\n\n // --- Tool 11: save_module_analysis ---\n server.registerTool(\n 'save_module_analysis',\n {\n description: 'Save the result of a module analysis. Provide the structured analysis (purpose, dataFlow, publicApi, gotchas, dependencies) and it will be persisted to modules/*.md.',\n inputSchema: {\n analysis: ModuleAnalysisSchema.describe('The structured module analysis'),\n },\n },\n async ({ analysis }) => {\n const moduleAnalysis: ModuleAnalysis = {\n ...analysis,\n }\n\n // Enrich with temporal data if available\n const temporalContent = await readFileUtil(cortexPath(projectRoot, 'temporal.json'))\n if (temporalContent) {\n const temporal: TemporalData = JSON.parse(temporalContent)\n const hotspot = temporal.hotspots?.find((h: Hotspot) =>\n h.file.includes(`/${analysis.name}/`) || h.file.includes(`${analysis.name}.`)\n )\n const couplings = temporal.coupling?.filter((c: ChangeCoupling) =>\n c.fileA.includes(`/${analysis.name}/`) || c.fileB.includes(`/${analysis.name}/`)\n ) || []\n const bugs = temporal.bugHistory?.filter((b: BugRecord) =>\n b.file.includes(`/${analysis.name}/`)\n ) || []\n\n if (hotspot || couplings.length > 0 || bugs.length > 0) {\n moduleAnalysis.temporalSignals = {\n churn: hotspot ? `${hotspot.changes} changes (${hotspot.stability})` : 'unknown',\n coupledWith: couplings.map((c: ChangeCoupling) => {\n const other = c.fileA.includes(`/${analysis.name}/`) ? c.fileB : c.fileA\n return `${other} (${c.cochanges} co-changes)`\n }),\n stability: hotspot?.stability || 'unknown',\n bugHistory: bugs.flatMap((b: BugRecord) => b.lessons),\n lastChanged: hotspot?.lastChanged || 'unknown',\n }\n }\n }\n\n await writeModuleDoc(projectRoot, moduleAnalysis)\n\n return textResult({\n saved: true,\n module: analysis.name,\n path: `.codecortex/modules/${analysis.name}.md`,\n })\n }\n )\n\n // --- Tool 12: record_decision ---\n server.registerTool(\n 'record_decision',\n {\n description: 'Record an architectural decision. Documents WHY something is built a certain way, what alternatives were considered, and consequences. Use whenever a non-obvious technical choice is made.',\n inputSchema: {\n title: z.string().describe('Decision title (e.g., \"Use tree-sitter for parsing\")'),\n context: z.string().describe('What situation led to this decision'),\n decision: z.string().describe('What was decided'),\n alternatives: z.array(z.string()).default([]).describe('What other options were considered'),\n consequences: z.array(z.string()).default([]).describe('Expected consequences of this decision'),\n },\n },\n async ({ title, context, decision, alternatives, consequences }) => {\n const record = createDecision({ title, context, decision, alternatives, consequences })\n await writeDecision(projectRoot, record)\n\n return textResult({\n recorded: true,\n id: record.id,\n path: `.codecortex/decisions/${record.id}.md`,\n })\n }\n )\n\n // --- Tool 13: update_patterns ---\n server.registerTool(\n 'update_patterns',\n {\n description: 'Add or update a coding pattern. Patterns document HOW code is written in this project (naming conventions, error handling, testing approaches). Returns \"added\", \"updated\", or \"noop\".',\n inputSchema: {\n name: z.string().describe('Pattern name (e.g., \"Error handling in API routes\")'),\n description: z.string().describe('What the pattern is and when to use it'),\n example: z.string().describe('Code example showing the pattern'),\n files: z.array(z.string()).default([]).describe('Files where this pattern is used'),\n },\n },\n async ({ name, description, example, files }) => {\n const result = await addPattern(projectRoot, { name, description, example, files })\n\n return textResult({\n action: result,\n pattern: name,\n path: '.codecortex/patterns.md',\n })\n }\n )\n\n // --- Tool 14: report_feedback ---\n server.registerTool(\n 'report_feedback',\n {\n description: 'Report incorrect or outdated knowledge. If you discover that a module doc, decision, or pattern is wrong, report it here. The feedback will be stored and used in the next analysis cycle.',\n inputSchema: {\n file: z.string().describe('Which knowledge file is incorrect (e.g., \"modules/scoring.md\")'),\n issue: z.string().describe('What is wrong or outdated'),\n reporter: z.string().default('agent').describe('Who is reporting (default: agent)'),\n },\n },\n async ({ file, issue, reporter }) => {\n const dir = cortexPath(projectRoot, 'feedback')\n await ensureDir(dir)\n\n const entry = {\n date: new Date().toISOString(),\n file,\n issue,\n reporter,\n }\n\n // Append to feedback log\n const feedbackPath = cortexPath(projectRoot, 'feedback', 'log.json')\n const existing = await readFileUtil(feedbackPath)\n const entries = existing ? JSON.parse(existing) : []\n entries.push(entry)\n await writeFile(feedbackPath, JSON.stringify(entries, null, 2))\n\n return textResult({\n recorded: true,\n totalFeedback: entries.length,\n message: 'Feedback recorded. Will be addressed in next codecortex update.',\n })\n }\n )\n}\n","import { z } from 'zod'\n\nexport const ModuleAnalysisSchema = z.object({\n name: z.string(),\n purpose: z.string(),\n dataFlow: z.string(),\n publicApi: z.array(z.string()),\n gotchas: z.array(z.string()),\n dependencies: z.array(z.string()),\n})\n\nexport const DecisionInputSchema = z.object({\n title: z.string(),\n context: z.string(),\n decision: z.string(),\n alternatives: z.array(z.string()).default([]),\n consequences: z.array(z.string()).default([]),\n})\n\nexport const PatternInputSchema = z.object({\n name: z.string(),\n description: z.string(),\n example: z.string(),\n files: z.array(z.string()).default([]),\n})\n\nexport const FeedbackInputSchema = z.object({\n file: z.string(),\n issue: z.string(),\n reporter: z.string().default('agent'),\n})\n","import type { CodingPattern } from '../types/index.js'\nimport { readFile, writeFile, cortexPath } from '../utils/files.js'\nimport { generatePatternEntry } from '../utils/markdown.js'\n\nexport async function readPatterns(projectRoot: string): Promise<string | null> {\n return readFile(cortexPath(projectRoot, 'patterns.md'))\n}\n\nexport async function addPattern(projectRoot: string, pattern: CodingPattern): Promise<'added' | 'updated' | 'noop'> {\n const existing = await readPatterns(projectRoot) || '# Coding Patterns\\n'\n\n // Check if pattern with same name already exists\n const nameRegex = new RegExp(`### ${escapeRegex(pattern.name)}`, 'i')\n if (nameRegex.test(existing)) {\n // Update: replace the existing pattern section\n const entry = generatePatternEntry(pattern)\n const sectionRegex = new RegExp(\n `### ${escapeRegex(pattern.name)}[\\\\s\\\\S]*?(?=### |$)`,\n 'i'\n )\n const updated = existing.replace(sectionRegex, entry + '\\n\\n')\n await writeFile(cortexPath(projectRoot, 'patterns.md'), updated)\n return 'updated'\n }\n\n // Add new pattern\n const entry = generatePatternEntry(pattern)\n const content = existing.trimEnd() + '\\n\\n' + entry + '\\n'\n await writeFile(cortexPath(projectRoot, 'patterns.md'), content)\n return 'added'\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n"],"mappings":"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","names":["createWriteStream","dirname","readdir","join","existsSync","z","z","entry","readFile","join","textResult","z"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
writeManifest,
|
|
25
25
|
writeModuleDoc,
|
|
26
26
|
writeSession
|
|
27
|
-
} from "../chunk-
|
|
27
|
+
} from "../chunk-CR6LARZ4.js";
|
|
28
28
|
|
|
29
29
|
// src/cli/index.ts
|
|
30
30
|
import { createRequire as createRequire2 } from "module";
|
|
@@ -82,7 +82,6 @@ var LANGUAGE_LOADERS = {
|
|
|
82
82
|
elisp: () => require2("tree-sitter-elisp"),
|
|
83
83
|
// Web / Templating
|
|
84
84
|
vue: () => require2("tree-sitter-vue"),
|
|
85
|
-
liquid: () => require2("tree-sitter-liquid"),
|
|
86
85
|
// Web3 / Other
|
|
87
86
|
solidity: () => require2("tree-sitter-solidity"),
|
|
88
87
|
ql: () => require2("tree-sitter-ql")
|
|
@@ -155,8 +154,6 @@ var EXTENSION_MAP = {
|
|
|
155
154
|
".sol": "solidity",
|
|
156
155
|
// Vue
|
|
157
156
|
".vue": "vue",
|
|
158
|
-
// Liquid
|
|
159
|
-
".liquid": "liquid",
|
|
160
157
|
// CodeQL
|
|
161
158
|
".ql": "ql"
|
|
162
159
|
};
|